LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIENvcHlyaWdodCAoYykgMjAxNiBGdW5kYWNp824gVGVjbmFsaWEgUmVzZWFyY2ggJiBJbm5vdmF0aW9uLg0KICoNCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjIuMA0KICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCiAqIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLTIuMC9FUEwtMi4wLmh0bWwNCiAqDQogKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMA0KICoNCiAqIENvbnRyaWJ1dG9yczoNCiAqICAgSHVhc2NhciBFc3Bpbm96YSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KICogICBBbGVqYW5kcmEgUnXteiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KICogICBJZG95YSBEZWwgUu1vIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQogKiAgIE1hcmkgQ2FybWVuIFBhbGFjaW9zIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQogKiAgIEFuZ2VsIEzzcGV6IC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi8qKg0KICovDQpwYWNrYWdlIG9yZy5lY2xpcHNlLm9wZW5jZXJ0LnNhbS5hcmcuYXJnLmltcGw7DQoNCmltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCg0KaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsNCg0KaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7DQoNCmltcG9ydCBvcmcuZWNsaXBzZS5vcGVuY2VydC5zYW0uYXJnLmFyZy5BcmdQYWNrYWdlOw0KaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5jZXJ0LnNhbS5hcmcuYXJnLkFyZ3VtZW50YXRpb25FbGVtZW50Ow0KaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5jZXJ0LnNhbS5hcmcuYXJnLkFzc2VydGVkQnlNdWx0aXBsaWNpdHlFeHRlbnNpb247DQppbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmNlcnQuc2FtLmFyZy5hcmcuQXNzZXJ0ZWRDb250ZXh0Ow0KDQovKioNCiAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQogKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QXNzZXJ0ZWQgQ29udGV4dDwvYj48L2VtPicuDQogKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCiAqIDxwPg0KICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6DQogKiA8dWw+DQogKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3BlbmNlcnQuc2FtLmFyZy5hcmcuaW1wbC5Bc3NlcnRlZENvbnRleHRJbXBsI2dldE11bHRpZXh0ZW5zaW9uIDxlbT5NdWx0aWV4dGVuc2lvbjwvZW0+fTwvbGk+DQogKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3BlbmNlcnQuc2FtLmFyZy5hcmcuaW1wbC5Bc3NlcnRlZENvbnRleHRJbXBsI2dldENhcmRpbmFsaXR5IDxlbT5DYXJkaW5hbGl0eTwvZW0+fTwvbGk+DQogKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3BlbmNlcnQuc2FtLmFyZy5hcmcuaW1wbC5Bc3NlcnRlZENvbnRleHRJbXBsI2dldFNvdXJjZSA8ZW0+U291cmNlPC9lbT59PC9saT4NCiAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vcGVuY2VydC5zYW0uYXJnLmFyZy5pbXBsLkFzc2VydGVkQ29udGV4dEltcGwjZ2V0VGFyZ2V0IDxlbT5UYXJnZXQ8L2VtPn08L2xpPg0KICogPC91bD4NCiAqIDwvcD4NCiAqDQogKiBAZ2VuZXJhdGVkDQogKi8NCnB1YmxpYyBjbGFzcyBBc3NlcnRlZENvbnRleHRJbXBsIGV4dGVuZHMgQXNzZXJ0ZWRSZWxhdGlvbnNoaXBJbXBsIGltcGxlbWVudHMgQXNzZXJ0ZWRDb250ZXh0IHsNCgkvKioNCgkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TXVsdGlleHRlbnNpb24oKSA8ZW0+TXVsdGlleHRlbnNpb248L2VtPn0nIGF0dHJpYnV0ZS4NCgkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KCSAqIEBzZWUgI2dldE11bHRpZXh0ZW5zaW9uKCkNCgkgKiBAZ2VuZXJhdGVkDQoJICogQG9yZGVyZWQNCgkgKi8NCglwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEFzc2VydGVkQnlNdWx0aXBsaWNpdHlFeHRlbnNpb24gTVVMVElFWFRFTlNJT05fRURFRkFVTFQgPSBBc3NlcnRlZEJ5TXVsdGlwbGljaXR5RXh0ZW5zaW9uLk5PUk1BTDsNCg0KCS8qKg0KCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDYXJkaW5hbGl0eSgpIDxlbT5DYXJkaW5hbGl0eTwvZW0+fScgYXR0cmlidXRlLg0KCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQoJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQoJICogQHNlZSAjZ2V0Q2FyZGluYWxpdHkoKQ0KCSAqIEBnZW5lcmF0ZWQNCgkgKiBAb3JkZXJlZA0KCSAqLw0KCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENBUkRJTkFMSVRZX0VERUZBVUxUID0gIiI7DQoNCgkvKioNCgkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KCSAqIEBnZW5lcmF0ZWQNCgkgKi8NCglwcm90ZWN0ZWQgQXNzZXJ0ZWRDb250ZXh0SW1wbCgpIHsNCgkJc3VwZXIoKTsNCgl9DQoNCgkvKioNCgkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KCSAqIEBnZW5lcmF0ZWQNCgkgKi8NCglAT3ZlcnJpZGUNCglwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsNCgkJcmV0dXJuIEFyZ1BhY2thZ2UuTGl0ZXJhbHMuQVNTRVJURURfQ09OVEVYVDsNCgl9DQoNCgkvKioNCgkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KCSAqIEBnZW5lcmF0ZWQNCgkgKi8NCglwdWJsaWMgQXNzZXJ0ZWRCeU11bHRpcGxpY2l0eUV4dGVuc2lvbiBnZXRNdWx0aWV4dGVuc2lvbigpIHsNCgkJcmV0dXJuIChBc3NlcnRlZEJ5TXVsdGlwbGljaXR5RXh0ZW5zaW9uKWVEeW5hbWljR2V0KEFyZ1BhY2thZ2UuQVNTRVJURURfQ09OVEVYVF9fTVVMVElFWFRFTlNJT04sIEFyZ1BhY2thZ2UuTGl0ZXJhbHMuQVNTRVJURURfQ09OVEVYVF9fTVVMVElFWFRFTlNJT04sIHRydWUsIHRydWUpOw0KCX0NCg0KCS8qKg0KCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQoJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQoJICogQGdlbmVyYXRlZA0KCSAqLw0KCXB1YmxpYyB2b2lkIHNldE11bHRpZXh0ZW5zaW9uKEFzc2VydGVkQnlNdWx0aXBsaWNpdHlFeHRlbnNpb24gbmV3TXVsdGlleHRlbnNpb24pIHsNCgkJZUR5bmFtaWNTZXQoQXJnUGFja2FnZS5BU1NFUlRFRF9DT05URVhUX19NVUxUSUVYVEVOU0lPTiwgQXJnUGFja2FnZS5MaXRlcmFscy5BU1NFUlRFRF9DT05URVhUX19NVUxUSUVYVEVOU0lPTiwgbmV3TXVsdGlleHRlbnNpb24pOw0KCX0NCg0KCS8qKg0KCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQoJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQoJICogQGdlbmVyYXRlZA0KCSAqLw0KCXB1YmxpYyBTdHJpbmcgZ2V0Q2FyZGluYWxpdHkoKSB7DQoJCXJldHVybiAoU3RyaW5nKWVEeW5hbWljR2V0KEFyZ1BhY2thZ2UuQVNTRVJURURfQ09OVEVYVF9fQ0FSRElOQUxJVFksIEFyZ1BhY2thZ2UuTGl0ZXJhbHMuQVNTRVJURURfQ09OVEVYVF9fQ0FSRElOQUxJVFksIHRydWUsIHRydWUpOw0KCX0NCg0KCS8qKg0KCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQoJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQoJICogQGdlbmVyYXRlZA0KCSAqLw0KCXB1YmxpYyB2b2lkIHNldENhcmRpbmFsaXR5KFN0cmluZyBuZXdDYXJkaW5hbGl0eSkgew0KCQllRHluYW1pY1NldChBcmdQYWNrYWdlLkFTU0VSVEVEX0NPTlRFWFRfX0NBUkRJTkFMSVRZLCBBcmdQYWNrYWdlLkxpdGVyYWxzLkFTU0VSVEVEX0NPTlRFWFRfX0NBUkRJTkFMSVRZLCBuZXdDYXJkaW5hbGl0eSk7DQoJfQ0KDQoJLyoqDQoJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCgkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCgkgKiBAZ2VuZXJhdGVkDQoJICovDQoJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQoJcHVibGljIEVMaXN0PEFyZ3VtZW50YXRpb25FbGVtZW50PiBnZXRTb3VyY2UoKSB7DQoJCXJldHVybiAoRUxpc3Q8QXJndW1lbnRhdGlvbkVsZW1lbnQ+KWVEeW5hbWljR2V0KEFyZ1BhY2thZ2UuQVNTRVJURURfQ09OVEVYVF9fU09VUkNFLCBBcmdQYWNrYWdlLkxpdGVyYWxzLkFTU0VSVEVEX0NPTlRFWFRfX1NPVVJDRSwgdHJ1ZSwgdHJ1ZSk7DQoJfQ0KDQoJLyoqDQoJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCgkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCgkgKiBAZ2VuZXJhdGVkDQoJICovDQoJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQoJcHVibGljIEVMaXN0PEFyZ3VtZW50YXRpb25FbGVtZW50PiBnZXRUYXJnZXQoKSB7DQoJCXJldHVybiAoRUxpc3Q8QXJndW1lbnRhdGlvbkVsZW1lbnQ+KWVEeW5hbWljR2V0KEFyZ1BhY2thZ2UuQVNTRVJURURfQ09OVEVYVF9fVEFSR0VULCBBcmdQYWNrYWdlLkxpdGVyYWxzLkFTU0VSVEVEX0NPTlRFWFRfX1RBUkdFVCwgdHJ1ZSwgdHJ1ZSk7DQoJfQ0KDQoJLyoqDQoJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCgkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCgkgKiBAZ2VuZXJhdGVkDQoJICovDQoJQE92ZXJyaWRlDQoJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgew0KCQlzd2l0Y2ggKGZlYXR1cmVJRCkgew0KCQkJY2FzZSBBcmdQYWNrYWdlLkFTU0VSVEVEX0NPTlRFWFRfX01VTFRJRVhURU5TSU9OOg0KCQkJCXJldHVybiBnZXRNdWx0aWV4dGVuc2lvbigpOw0KCQkJY2FzZSBBcmdQYWNrYWdlLkFTU0VSVEVEX0NPTlRFWFRfX0NBUkRJTkFMSVRZOg0KCQkJCXJldHVybiBnZXRDYXJkaW5hbGl0eSgpOw0KCQkJY2FzZSBBcmdQYWNrYWdlLkFTU0VSVEVEX0NPTlRFWFRfX1NPVVJDRToNCgkJCQlyZXR1cm4gZ2V0U291cmNlKCk7DQoJCQljYXNlIEFyZ1BhY2thZ2UuQVNTRVJURURfQ09OVEVYVF9fVEFSR0VUOg0KCQkJCXJldHVybiBnZXRUYXJnZXQoKTsNCgkJfQ0KCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsNCgl9DQoNCgkvKioNCgkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPg0KCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPg0KCSAqIEBnZW5lcmF0ZWQNCgkgKi8NCglAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCglAT3ZlcnJpZGUNCglwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgew0KCQlzd2l0Y2ggKGZlYXR1cmVJRCkgew0KCQkJY2FzZSBBcmdQYWNrYWdlLkFTU0VSVEVEX0NPTlRFWFRfX01VTFRJRVhURU5TSU9OOg0KCQkJCXNldE11bHRpZXh0ZW5zaW9uKChBc3NlcnRlZEJ5TXVsdGlwbGljaXR5RXh0ZW5zaW9uKW5ld1ZhbHVlKTsNCgkJCQlyZXR1cm47DQoJCQljYXNlIEFyZ1BhY2thZ2UuQVNTRVJURURfQ09OVEVYVF9fQ0FSRElOQUxJVFk6DQoJCQkJc2V0Q2FyZGluYWxpdHkoKFN0cmluZyluZXdWYWx1ZSk7DQoJCQkJcmV0dXJuOw0KCQkJY2FzZSBBcmdQYWNrYWdlLkFTU0VSVEVEX0NPTlRFWFRfX1NPVVJDRToNCgkJCQlnZXRTb3VyY2UoKS5jbGVhcigpOw0KCQkJCWdldFNvdXJjZSgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgQXJndW1lbnRhdGlvbkVsZW1lbnQ+KW5ld1ZhbHVlKTsNCgkJCQlyZXR1cm47DQoJCQljYXNlIEFyZ1BhY2thZ2UuQVNTRVJURURfQ09OVEVYVF9fVEFSR0VUOg0KCQkJCWdldFRhcmdldCgpLmNsZWFyKCk7DQoJCQkJZ2V0VGFyZ2V0KCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBBcmd1bWVudGF0aW9uRWxlbWVudD4pbmV3VmFsdWUpOw0KCQkJCXJldHVybjsNCgkJfQ0KCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOw0KCX0NCg0KCS8qKg0KCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+DQoJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+DQoJICogQGdlbmVyYXRlZA0KCSAqLw0KCUBPdmVycmlkZQ0KCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7DQoJCXN3aXRjaCAoZmVhdHVyZUlEKSB7DQoJCQljYXNlIEFyZ1BhY2thZ2UuQVNTRVJURURfQ09OVEVYVF9fTVVMVElFWFRFTlNJT046DQoJCQkJc2V0TXVsdGlleHRlbnNpb24oTVVMVElFWFRFTlNJT05fRURFRkFVTFQpOw0KCQkJCXJldHVybjsNCgkJCWNhc2UgQXJnUGFja2FnZS5BU1NFUlRFRF9DT05URVhUX19DQVJESU5BTElUWToNCgkJCQlzZXRDYXJkaW5hbGl0eShDQVJESU5BTElUWV9FREVGQVVMVCk7DQoJCQkJcmV0dXJuOw0KCQkJY2FzZSBBcmdQYWNrYWdlLkFTU0VSVEVEX0NPTlRFWFRfX1NPVVJDRToNCgkJCQlnZXRTb3VyY2UoKS5jbGVhcigpOw0KCQkJCXJldHVybjsNCgkJCWNhc2UgQXJnUGFja2FnZS5BU1NFUlRFRF9DT05URVhUX19UQVJHRVQ6DQoJCQkJZ2V0VGFyZ2V0KCkuY2xlYXIoKTsNCgkJCQlyZXR1cm47DQoJCX0NCgkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7DQoJfQ0KDQoJLyoqDQoJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4NCgkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4NCgkgKiBAZ2VuZXJhdGVkDQoJICovDQoJQE92ZXJyaWRlDQoJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsNCgkJc3dpdGNoIChmZWF0dXJlSUQpIHsNCgkJCWNhc2UgQXJnUGFja2FnZS5BU1NFUlRFRF9DT05URVhUX19NVUxUSUVYVEVOU0lPTjoNCgkJCQlyZXR1cm4gZ2V0TXVsdGlleHRlbnNpb24oKSAhPSBNVUxUSUVYVEVOU0lPTl9FREVGQVVMVDsNCgkJCWNhc2UgQXJnUGFja2FnZS5BU1NFUlRFRF9DT05URVhUX19DQVJESU5BTElUWToNCgkJCQlyZXR1cm4gQ0FSRElOQUxJVFlfRURFRkFVTFQgPT0gbnVsbCA/IGdldENhcmRpbmFsaXR5KCkgIT0gbnVsbCA6ICFDQVJESU5BTElUWV9FREVGQVVMVC5lcXVhbHMoZ2V0Q2FyZGluYWxpdHkoKSk7DQoJCQljYXNlIEFyZ1BhY2thZ2UuQVNTRVJURURfQ09OVEVYVF9fU09VUkNFOg0KCQkJCXJldHVybiAhZ2V0U291cmNlKCkuaXNFbXB0eSgpOw0KCQkJY2FzZSBBcmdQYWNrYWdlLkFTU0VSVEVEX0NPTlRFWFRfX1RBUkdFVDoNCgkJCQlyZXR1cm4gIWdldFRhcmdldCgpLmlzRW1wdHkoKTsNCgkJfQ0KCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7DQoJfQ0KDQp9IC8vQXNzZXJ0ZWRDb250ZXh0SW1wbA0K