cGFja2FnZSBvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLmludGVybmFsLnVpOw0NLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3JwLiBhbmQgb3RoZXJzLg1BbGwgcmlnaHRzIHJlc2VydmVkLiCgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUNd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjA1Lmh0bWwNoA1Db250cmlidXRvcnM6DSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLio7DWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOw1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7DWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udERhdGE7DWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOw1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOw1pbXBvcnQgb3JnLmVjbGlwc2UudWkuKjsNaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuaW50ZXJuYWwuY29yZS4qOw0NcHVibGljIGNsYXNzIFRvb2xzUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBGaWVsZEVkaXRvclByZWZlcmVuY2VQYWdlIGltcGxlbWVudHMgSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlIHsNDQlwdWJsaWMgVG9vbHNQcmVmZXJlbmNlUGFnZSgpIHsNCQlzdXBlcihHUklEKTsNCQlJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0NCQkJRXh0ZXJuYWxUb29sc1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7DQkJc2V0UHJlZmVyZW5jZVN0b3JlKHN0b3JlKTsNCX0NDQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsNCQlzdXBlci5jcmVhdGVDb250cm9sKHBhcmVudCk7DQkJLy8gc2hvdWxkIGRvIHNvbWV0aGluZyBoZXJlIHdpdGggdGhlIGhlbHAuLgkNCQkvKiBGSVhNRQ0JCVdvcmtiZW5jaEhlbHAuc2V0SGVscCgNCQkJcGFyZW50LA0JCQluZXcgT2JqZWN0W10geyBJQW50SGVscENvbnRleHRJZHMuQU5UX1BSRUZFUkVOQ0VfUEFHRSB9KTsNCQkqLw0JfQ0JLyoqDQkgKiBAc2VlIEZpZWxkRWRpdG9yUHJlZmVyZW5jZVBhZ2UjY3JlYXRlRmllbGRFZGl0b3JzDQkgKi8NCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUZpZWxkRWRpdG9ycygpIHsNCQkJQm9vbGVhbkZpZWxkRWRpdG9yIGF1dG9TYXZlID0NCQkJCW5ldyBCb29sZWFuRmllbGRFZGl0b3IoDQkJCQkJSVByZWZlcmVuY2VDb25zdGFudHMuQVVUT19TQVZFLA0JCQkJCVRvb2xNZXNzYWdlcy5nZXRTdHJpbmcoDQkJCQkJCSJUb29sc1ByZWZlcmVuY2VQYWdlLnNhdmVQcmlvclRvQnVpbGRpbmciKSwgLy8gJE5PTi1OTFMtMSQNCVNXVC5OT05FLCBnZXRGaWVsZEVkaXRvclBhcmVudCgpKTsNCQkJUmFkaW9Hcm91cEZpZWxkRWRpdG9yIG91dHB1dExldmVsID0NCQkJCW5ldyBSYWRpb0dyb3VwRmllbGRFZGl0b3IoDQkJCQkJSVByZWZlcmVuY2VDb25zdGFudHMuT1VQVVRfTEVWRUwsDQkJCQkJVG9vbE1lc3NhZ2VzLmdldFN0cmluZygNCQkJCQkJIlRvb2xzUHJlZmVyZW5jZVBhZ2UucHJlZmVyZWRPdXRwdXRMZXZlbCIpLCAvLyAkTk9OLU5MUy0xJA0JMSwNCQluZXcgU3RyaW5nW11bXSB7DQkJCXsNCQkJCVRvb2xNZXNzYWdlcy5nZXRTdHJpbmcoIlRvb2xzUHJlZmVyZW5jZVBhZ2UuaW5mbyIpLCAvLyAkTk9OLU5MUy0xJA0JCQkJSVByZWZlcmVuY2VDb25zdGFudHMuSU5GT19MRVZFTCB9LA0JCQl7DQkJCQlUb29sTWVzc2FnZXMuZ2V0U3RyaW5nKCJUb29sc1ByZWZlcmVuY2VQYWdlLnZlcmJvc2UiKSwgLy8gJE5PTi1OTFMtMSQNCQkJCQlJUHJlZmVyZW5jZUNvbnN0YW50cy5WRVJCT1NFX0xFVkVMIH0sDQkJCXsNCQkJCVRvb2xNZXNzYWdlcy5nZXRTdHJpbmcoIlRvb2xzUHJlZmVyZW5jZVBhZ2UuZGVidWciKSwgLy8gJE5PTi1OTFMtMSQNCQkJCQlJUHJlZmVyZW5jZUNvbnN0YW50cy5ERUJVR19MRVZFTCB9DQkJfSwgZ2V0RmllbGRFZGl0b3JQYXJlbnQoKSwgdHJ1ZSk7DQkJYWRkRmllbGQoYXV0b1NhdmUpOw0JCWFkZEZpZWxkKG91dHB1dExldmVsKTsNCQlDb2xvckZpZWxkRWRpdG9yIGVyck91dCA9DQkJCW5ldyBDb2xvckZpZWxkRWRpdG9yKA0JCQkJSVByZWZlcmVuY2VDb25zdGFudHMuQ09OU09MRV9FUlJPUl9SR0IsDQkJCQlUb29sTWVzc2FnZXMuZ2V0U3RyaW5nKCJUb29sc1ByZWZlcmVuY2VQYWdlLmVycm9yQ29sb3IiKSwgLy8gJE5PTi1OTFMtMSQNCQkJCWdldEZpZWxkRWRpdG9yUGFyZW50KCkpOw0JCUNvbG9yRmllbGRFZGl0b3Igd2Fybk91dCA9DQkJCW5ldyBDb2xvckZpZWxkRWRpdG9yKA0JCQkJSVByZWZlcmVuY2VDb25zdGFudHMuQ09OU09MRV9XQVJOSU5HX1JHQiwNCQkJCVRvb2xNZXNzYWdlcy5nZXRTdHJpbmcoIlRvb2xzUHJlZmVyZW5jZVBhZ2Uud2FybmluZ0NvbG9yIiksIC8vICROT04tTkxTLTEkDQkJCQlnZXRGaWVsZEVkaXRvclBhcmVudCgpKTsNCQlDb2xvckZpZWxkRWRpdG9yIGluZm9PdXQgPQ0JCQluZXcgQ29sb3JGaWVsZEVkaXRvcigNCQkJCUlQcmVmZXJlbmNlQ29uc3RhbnRzLkNPTlNPTEVfSU5GT19SR0IsDQkJCQlUb29sTWVzc2FnZXMuZ2V0U3RyaW5nKCJUb29sc1ByZWZlcmVuY2VQYWdlLmluZm9Db2xvciIpLCAvLyAkTk9OLU5MUy0xJA0JCQkJZ2V0RmllbGRFZGl0b3JQYXJlbnQoKSk7DQkJQ29sb3JGaWVsZEVkaXRvciB2ZXJiT3V0ID0NCQkJbmV3IENvbG9yRmllbGRFZGl0b3IoDQkJCQlJUHJlZmVyZW5jZUNvbnN0YW50cy5DT05TT0xFX1ZFUkJPU0VfUkdCLA0JCQkJVG9vbE1lc3NhZ2VzLmdldFN0cmluZygiVG9vbHNQcmVmZXJlbmNlUGFnZS52ZXJib3NlQ29sb3IiKSwgLy8gJE5PTi1OTFMtMSQNCQkJCWdldEZpZWxkRWRpdG9yUGFyZW50KCkpOw0JCUNvbG9yRmllbGRFZGl0b3IgZGVidWdPdXQgPQ0JCQluZXcgQ29sb3JGaWVsZEVkaXRvcigNCQkJCUlQcmVmZXJlbmNlQ29uc3RhbnRzLkNPTlNPTEVfREVCVUdfUkdCLA0JCQkJVG9vbE1lc3NhZ2VzLmdldFN0cmluZygiVG9vbHNQcmVmZXJlbmNlUGFnZS5kZWJ1Z0NvbG9yIiksIC8vICROT04tTkxTLTEkDQkJCQlnZXRGaWVsZEVkaXRvclBhcmVudCgpKTsNCQlGb250RmllbGRFZGl0b3IgZm9udCA9DQkJCW5ldyBGb250RmllbGRFZGl0b3IoDQkJCQlJUHJlZmVyZW5jZUNvbnN0YW50cy5DT05TT0xFX0ZPTlQsDQkJCQlUb29sTWVzc2FnZXMuZ2V0U3RyaW5nKCJUb29sc1ByZWZlcmVuY2VQYWdlLmZvbnQiKSwgLy8gJE5PTi1OTFMtMSQNCQkJCWdldEZpZWxkRWRpdG9yUGFyZW50KCkpOw0JCWFkZEZpZWxkKGVyck91dCk7DQkJYWRkRmllbGQod2Fybk91dCk7DQkJYWRkRmllbGQoaW5mb091dCk7DQkJYWRkRmllbGQodmVyYk91dCk7DQkJYWRkRmllbGQoZGVidWdPdXQpOw0JCWFkZEZpZWxkKGZvbnQpOw0JfQ0JLyoqDQkgKiBSZXR1cm5zIHRoZSBmb250IGRhdGEgdGhhdCBkZXNjcmliZXMgdGhlIGZvbnQgdG8gdXNlIGZvciB0aGUgY29uc29sZQ0JICovDQlwcm90ZWN0ZWQgc3RhdGljIEZvbnREYXRhIGdldENvbnNvbGVGb250RGF0YSgpIHsNCQlJUHJlZmVyZW5jZVN0b3JlIHBzdG9yZT0gRXh0ZXJuYWxUb29sc1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7DQkJRm9udERhdGEgZm9udERhdGE9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Rm9udERhdGEocHN0b3JlLCBJUHJlZmVyZW5jZUNvbnN0YW50cy5DT05TT0xFX0ZPTlQpOw0JCXJldHVybiBmb250RGF0YTsNCX0NCS8qKg0JICogUmV0dXJucyB0aGUgYSBjb2xvciBiYXNlZCBvbiB0aGUgdHlwZS4NCSAqLw0JcHJvdGVjdGVkIHN0YXRpYyBDb2xvciBnZXRQcmVmZXJlbmNlQ29sb3IoU3RyaW5nIHR5cGUpIHsNCQlJUHJlZmVyZW5jZVN0b3JlIHBzdG9yZT0gRXh0ZXJuYWxUb29sc1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7DQkJUkdCIG91dFJHQj0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcihwc3RvcmUsIHR5cGUpOw0JCXJldHVybiBuZXcgQ29sb3IoRGlzcGxheS5nZXRDdXJyZW50KCkgLG91dFJHQik7DQl9DQkvKioNCSAqIEBzZWUgSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlI2luaXQNCSAqLw0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCkgew0JfQ19