LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIENvcHlyaWdodCAoYykgMjAxNiBGdW5kYWNp824gVGVjbmFsaWEgUmVzZWFyY2ggJiBJbm5vdmF0aW9uLg0KICoNCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjIuMA0KICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCiAqIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLTIuMC9FUEwtMi4wLmh0bWwNCiAqDQogKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMA0KICoNCiAqIENvbnRyaWJ1dG9yczoNCiAqICAgSHVhc2NhciBFc3Bpbm96YSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KICogICBBbGVqYW5kcmEgUnXteiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KICogICBJZG95YSBEZWwgUu1vIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQogKiAgIE1hcmkgQ2FybWVuIFBhbGFjaW9zIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQogKiAgIEFuZ2VsIEzzcGV6IC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnBhY2thZ2Ugb3JnLmVjbGlwc2Uub3BlbmNlcnQuYXBtLmFzc3VycHJvai53aXphcmRzLnVpLndpemFyZHM7DQoNCmltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCmltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQppbXBvcnQgamF2YS51dGlsLkxpc3Q7DQoNCmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsNCmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLm9wZXJhdGlvbnMuT3BlcmF0aW9uSGlzdG9yeUZhY3Rvcnk7DQppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7DQppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOw0KaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7DQppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOw0KaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOw0KaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOw0KaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOw0KaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdWJQcm9ncmVzc01vbml0b3I7DQppbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNkby5kYXduLmNvbW1hbmRzLkNyZWF0ZVNlbWFudGljUmVzb3VyY2VSZWNvcmRpbmdDb21tYW5kOw0KaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jZG8uZGF3bi5wcmVmZXJlbmNlcy5QcmVmZXJlbmNlQ29uc3RhbnRzOw0KaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jZG8uZGF3bi50cmFuc2FjdGlvbi5EYXduR01GRWRpdGluZ0RvbWFpbkZhY3Rvcnk7DQppbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNkby5kYXduLnVpLkRhd25FZGl0b3JJbnB1dDsNCmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY2RvLmRhd24udXRpbC5jb25uZWN0aW9uLkNET0Nvbm5lY3Rpb25VdGlsOw0KaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jZG8uZXJlc291cmNlLkNET1Jlc291cmNlRm9sZGVyOw0KaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jZG8udHJhbnNhY3Rpb24uQ0RPVHJhbnNhY3Rpb247DQppbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsNCmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsNCmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7DQppbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0Ow0KaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsNCmltcG9ydCBvcmcuZWNsaXBzZS5lbWYud29ya3NwYWNlLnV0aWwuV29ya3NwYWNlU3luY2hyb25pemVyOw0KaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmNvbW1vbi5jb3JlLmNvbW1hbmQuQ29tbWFuZFJlc3VsdDsNCmltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLmNvcmUuc2VydmljZXMuVmlld1NlcnZpY2U7DQppbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cGFydHMuRGlhZ3JhbUVkaXRQYXJ0Ow0KaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkuZWRpdHBvbGljaWVzLkNhbm9uaWNhbEVkaXRQb2xpY3k7DQppbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUuZGlhZ3JhbS51aS5lZGl0cG9saWNpZXMuRWRpdFBvbGljeVJvbGVzOw0KaW1wb3J0IG9yZy5lY2xpcHNlLmdtZi5ydW50aW1lLmRpYWdyYW0udWkucGFydHMuRGlhZ3JhbUVkaXRvcjsNCmltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5kaWFncmFtLnVpLnBhcnRzLklEaWFncmFtV29ya2JlbmNoUGFydDsNCmltcG9ydCBvcmcuZWNsaXBzZS5nbWYucnVudGltZS5lbWYuY29tbWFuZHMuY29yZS5jb21tYW5kLkFic3RyYWN0VHJhbnNhY3Rpb25hbENvbW1hbmQ7DQppbXBvcnQgb3JnLmVjbGlwc2UuZ21mLnJ1bnRpbWUubm90YXRpb24uRGlhZ3JhbTsNCmltcG9ydCBvcmcuZWNsaXBzZS5vcGVuY2VydC5hcG0uYXNzdXJwcm9qLmFzc3VyYW5jZXByb2plY3QucHJlc2VudGF0aW9uLkFzc3VyYW5jZXByb2plY3RFZGl0b3JQbHVnaW47DQppbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVEV4Y2VwdGlvbjsNCmltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsNCmltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsNCmltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsNCmltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOw0KaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5jZXJ0LnNhbS5hcmcuYXJnLkFyZ0ZhY3Rvcnk7DQppbXBvcnQgb3JnLmVjbGlwc2Uub3BlbmNlcnQuc2FtLmFyZy5hcmcuZGlhZ3JhbS5lZGl0LnBvbGljaWVzLkNhc2VDYW5vbmljYWxFZGl0UG9saWN5Ow0KaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5jZXJ0LnNhbS5hcmcuYXJnLmRpYWdyYW0uZWRpdC5wb2xpY2llcy5DYXNlUGVyc2lzdGVkQ2Fub25pY2FsRWRpdFBvbGljeTsNCmltcG9ydCBvcmcuZWNsaXBzZS5vcGVuY2VydC5zYW0uYXJnLmFyZy5kaWFncmFtLmVkaXQucG9saWNpZXMuRGF3bkNhc2VQZXJzaXN0ZWRDYW5vbmljYWxFZGl0UG9saWN5Ow0KaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5jZXJ0LnNhbS5hcmcuYXJnLmRpYWdyYW0ucGFydC5BcmdEaWFncmFtRWRpdG9yUGx1Z2luOw0KaW1wb3J0IG9yZy5lY2xpcHNlLm9wZW5jZXJ0LnNhbS5hcmcuYXJnLmRpYWdyYW0ucGFydC5EYXduQXJnRGlhZ3JhbUVkaXRvcjsNCmltcG9ydCBvcmcuZWNsaXBzZS5vcGVuY2VydC5zYW0uYXJnLmFyZy5kaWFncmFtLnBhcnQuTWVzc2FnZXM7DQoNCi8vIFN0YXJ0IE1DUA0KcHVibGljIGNsYXNzIERhd25BcmdEaWFncmFtVXRpbCB7DQoJcHJpdmF0ZSBVUkkgbW9kZWxVUkk7DQoJcHJpdmF0ZSBVUkkgZGlhZ3JhbVVSSTsNCglwcm90ZWN0ZWQgUmVzb3VyY2UgZGlhZ3JhbTsNCglwcml2YXRlIENET1Jlc291cmNlRm9sZGVyIGFzc3VyYW5jZXByb2plY3RGb2xkZXI7DQoJcHJpdmF0ZSBDRE9UcmFuc2FjdGlvbiB0cmFuc2FjdGlvbjsNCg0KCXByaXZhdGUgc3RhdGljIFN0cmluZyBEYXduQXJnRGlhZ3JhbUVkaXRvcl9JRCA9ICJvcmcuZWNsaXBzZS5vcGVuY2VydC5zYW0uYXJnLmFyZy5kaWFncmFtLnBhcnQuRGF3bkFyZ0RpYWdyYW1FZGl0b3IiOw0KCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBEYXduQ2FzZUVkaXRQYXJ0X01PREVMX0lEID0gIkFyZyI7DQoJDQoJLyoqDQoJICogQ29uc3RydWN0b3IgDQoJICovDQoJcHVibGljIERhd25BcmdEaWFncmFtVXRpbChVUkkgbW9kZWwsIFVSSSBkaWFncmFtLCBDRE9SZXNvdXJjZUZvbGRlciBhc3N1cmFuY2Vwcm9qZWN0Rm9sZGVyLCBDRE9UcmFuc2FjdGlvbiB0cmFuc2FjdGlvbikgew0KCQlzdXBlcigpOw0KCQl0aGlzLm1vZGVsVVJJID0gbW9kZWw7DQoJCXRoaXMuZGlhZ3JhbVVSSSA9IGRpYWdyYW07DQoJCXRoaXMuYXNzdXJhbmNlcHJvamVjdEZvbGRlciA9IGFzc3VyYW5jZXByb2plY3RGb2xkZXI7DQoJCXRoaXMudHJhbnNhY3Rpb24gPSB0cmFuc2FjdGlvbjsNCgl9DQoNCglwdWJsaWMgdm9pZCBnZW5lcmF0ZURpYWdyYW0oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7DQoJCXRyeSB7DQoJCQlnZW5lcmF0ZURpYWdyYW0wKG1vbml0b3IpOw0KCQkJLyogTUNQDQoJCQlJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsNCgkJCXdvcmtzcGFjZS5nZXRSb290KCkucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSwgbnVsbCk7DQoJCQkqLw0KCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KCQkJZS5wcmludFN0YWNrVHJhY2UoKTsNCgkJfQ0KCX0NCg0KCQ0KCS8vZ2VuZXJhdGVzIGEgZGlhZ3JhbSBmb3IgdGhlIGdpdmVuIGRvbWFpbiBtb2RlbCBmaWxlIG5hbWUNCglwdWJsaWMgdm9pZCBnZW5lcmF0ZURpYWdyYW0wKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIElPRXhjZXB0aW9uIHsNCgkJLy9kaWFncmFtID0gRGF3bkFyZ0RpYWdyYW1FZGl0b3JVdGlsLmNyZWF0ZURpYWdyYW0oZGlhZ3JhbVVSSSwgbW9kZWxVUkksIG1vbml0b3IpOw0KCQlkaWFncmFtID0gY3JlYXRlRGlhZ3JhbShkaWFncmFtVVJJLCBtb2RlbFVSSSwgbW9uaXRvcik7DQoJCWlmIChkaWFncmFtICE9IG51bGwpIHsNCgkJCXRyeSB7DQoJCQkJLy9EYXduQXJnRGlhZ3JhbUVkaXRvclV0aWwub3BlbkRpYWdyYW0oZGlhZ3JhbSk7DQoJCQkJb3BlbkRpYWdyYW0oZGlhZ3JhbSk7IC8vIHBhcmEgcXVlIGVsIGVkaXRvciBkZSBhcmdfZGlhZ3JhbSBlc3RlIGFjdGl2bw0KCQkJCS8vIFN0YXJ0IE1DUA0KCQkJCUlFZGl0b3JQYXJ0IGVkaXRvclBhcnQgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpDQoJCQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpDQoJCQkJCQkuZ2V0QWN0aXZlRWRpdG9yKCk7DQoJCQkJaWYgKGVkaXRvclBhcnQgaW5zdGFuY2VvZiBJRGlhZ3JhbVdvcmtiZW5jaFBhcnQpIHsNCgkJCQkJRGlhZ3JhbUVkaXRQYXJ0ICBlZGl0cCA9ICgoSURpYWdyYW1Xb3JrYmVuY2hQYXJ0KSBlZGl0b3JQYXJ0KS5nZXREaWFncmFtRWRpdFBhcnQoKTsNCg0KCQkJCQllZGl0cC5yZW1vdmVFZGl0UG9saWN5KEVkaXRQb2xpY3lSb2xlcy5DQU5PTklDQUxfUk9MRSk7DQoJCQkJCS8qIE1DUDogc2UgZWplY3V0YSB0b2RvIDIgdmVjZXMhISEJCQkJCQ0KCQkJCQllZGl0cC5pbnN0YWxsRWRpdFBvbGljeShFZGl0UG9saWN5Um9sZXMuQ0FOT05JQ0FMX1JPTEUsDQoJCQkJCQkJbmV3IENhc2VQZXJzaXN0ZWRDYW5vbmljYWxFZGl0UG9saWN5KCkpOyAvL01DUCBPSk86IHBhcmEgZXZpdGFyIGJ1Y2xlIGluZmluaXRvDQoJCQkJCSovDQoJCQkJCQ0KIAkJCQkJZWRpdHAuaW5zdGFsbEVkaXRQb2xpY3koRWRpdFBvbGljeVJvbGVzLkNBTk9OSUNBTF9ST0xFLA0KCQkJCQkJCW5ldyBEYXduQ2FzZVBlcnNpc3RlZENhbm9uaWNhbEVkaXRQb2xpY3koKSk7DQogCQkJCQkNCgkgICAgICAgIAkJLy8gTm8gcHVlZG8gY2VycmFyIGVsIGRpYWdyYW1hIHBvcnF1ZSBubyBzZSBjcmVhbiBsYXMgdmlld3MhISEgeSBwaWVyZG8gbGEgcGVyc3BlY3RpdmENCgkgICAgICAgIAkJRGF3bkFyZ0RpYWdyYW1FZGl0b3IgZGF3bkVkaXRvclBhcnQgPSAoRGF3bkFyZ0RpYWdyYW1FZGl0b3IpZWRpdG9yUGFydDsNCgkgICAgICAgIAkJZGF3bkVkaXRvclBhcnQuZG9TYXZlKG1vbml0b3IpOw0KDQoJICAgICAgICAJCWlmKGVkaXRvclBhcnQgaW5zdGFuY2VvZiBEaWFncmFtRWRpdG9yKSB7DQoJICAgICAgICAJCQlib29sZWFuIHNhdmUgPSB0cnVlOw0KDQoJICAgICAgICAJICAgICAgICB0cnkgew0KCSAgICAgICAgICAgIAkJCURpYWdyYW1FZGl0b3IgZGVkaXRvciA9IChEaWFncmFtRWRpdG9yKWVkaXRvclBhcnQ7DQoJICAgICAgICAgICAgCQkJZGVkaXRvci5nZXRTaXRlKCkuZ2V0UGFnZSgpLmNsb3NlRWRpdG9yKGRlZGl0b3IsIHNhdmUpOw0KCSAgICAgICAgCSAgICAgICAgfSBjYXRjaCAoU1dURXhjZXB0aW9uIGUpIHsNCgkgICAgICAgIAkgICAgICAgIAlBc3N1cmFuY2Vwcm9qZWN0RWRpdG9yUGx1Z2luLklOU1RBTkNFLmxvZyhlKTsNCgkgICAgICAgIAkgICAgICAgIH0gICAgICAJCQkNCgkgICAgICAgIAkJfQ0KCQkJCX0JCQkJDQoJCQkJLy8gRW5kIE1DUA0KCQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgew0KCQkJCUFzc3VyYW5jZXByb2plY3RFZGl0b3JQbHVnaW4uSU5TVEFOQ0UubG9nKGUpOw0KCQkJfQ0KCQl9DQoJfQ0KCQ0KCXB1YmxpYyBSZXNvdXJjZSBjcmVhdGVEaWFncmFtKFVSSSBkaWFncmFtVVJJLCBVUkkgbW9kZWxVUkksDQoJCQlJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgew0KCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluID0gRGF3bkdNRkVkaXRpbmdEb21haW5GYWN0b3J5DQoJCQkJLmdldEluc3RhbmNlKCkuY3JlYXRlRWRpdGluZ0RvbWFpbigpOw0KDQoJCXByb2dyZXNzTW9uaXRvcg0KCQkJCS5iZWdpblRhc2soDQoJCQkJCQlNZXNzYWdlcy5BcmdEaWFncmFtRWRpdG9yVXRpbF9DcmVhdGVEaWFncmFtUHJvZ3Jlc3NUYXNrLA0KCQkJCQkJMyk7DQoNCgkJLyoNCgkJQ0RPQ29ubmVjdGlvblV0aWwuaW5zdGFuY2UuaW5pdCgNCgkJCQlQcmVmZXJlbmNlQ29uc3RhbnRzLmdldFJlcG9zaXRvcnlOYW1lKCksDQoJCQkJUHJlZmVyZW5jZUNvbnN0YW50cy5nZXRQcm90b2NvbCgpLA0KCQkJCVByZWZlcmVuY2VDb25zdGFudHMuZ2V0U2VydmVyTmFtZSgpKTsNCgkJQ0RPQ29ubmVjdGlvblV0aWwuaW5zdGFuY2UuZ2V0Q3VycmVudFNlc3Npb24oKTsNCgkJUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBlZGl0aW5nRG9tYWluLmdldFJlc291cmNlU2V0KCk7DQoNCgkJQ0RPVHJhbnNhY3Rpb24gdHJhbnNhY3Rpb24gPSBDRE9Db25uZWN0aW9uVXRpbC5pbnN0YW5jZQ0KCQkJCS5vcGVuQ3VycmVudFRyYW5zYWN0aW9uKHJlc291cmNlU2V0LCBkaWFncmFtVVJJLnRvU3RyaW5nKCkpOw0KDQoJCWZpbmFsIFJlc291cmNlIGRpYWdyYW1SZXNvdXJjZSA9IHJlc291cmNlU2V0LmNyZWF0ZVJlc291cmNlKGRpYWdyYW1VUkkpOw0KCQkqLw0KCQlTdHJpbmcgZGlhZ3JhbVJlc291cmNlU3RyID0gZGlhZ3JhbVVSSS50b1N0cmluZygpLnN1YnN0cmluZygiY2RvOi8vb3BlbmNlcnQiLmxlbmd0aCgpLCBkaWFncmFtVVJJLnRvU3RyaW5nKCkubGVuZ3RoKCkpOw0KCQlmaW5hbCBSZXNvdXJjZSBkaWFncmFtUmVzb3VyY2UgPSB0cmFuc2FjdGlvbi5nZXRPckNyZWF0ZVJlc291cmNlKGRpYWdyYW1SZXNvdXJjZVN0cik7DQoNCgkJQ3JlYXRlU2VtYW50aWNSZXNvdXJjZVJlY29yZGluZ0NvbW1hbmQgY3JlYXRlU2VtYW50aWNSZXNvdXJjZUNvbW1hbmQgPSBuZXcgQ3JlYXRlU2VtYW50aWNSZXNvdXJjZVJlY29yZGluZ0NvbW1hbmQoDQoJCQkJZWRpdGluZ0RvbWFpbiwgdHJhbnNhY3Rpb24sIG1vZGVsVVJJLnBhdGgoKSk7DQoNCgkJZWRpdGluZ0RvbWFpbi5nZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGNyZWF0ZVNlbWFudGljUmVzb3VyY2VDb21tYW5kKTsNCgkJZmluYWwgUmVzb3VyY2UgbW9kZWxSZXNvdXJjZSA9IGNyZWF0ZVNlbWFudGljUmVzb3VyY2VDb21tYW5kDQoJCQkJLmdldFJlc291cmNlKCk7DQoNCgkJZmluYWwgU3RyaW5nIGRpYWdyYW1OYW1lID0gZGlhZ3JhbVVSSS5sYXN0U2VnbWVudCgpOw0KCQlBYnN0cmFjdFRyYW5zYWN0aW9uYWxDb21tYW5kIGNvbW1hbmQgPSBuZXcgQWJzdHJhY3RUcmFuc2FjdGlvbmFsQ29tbWFuZCgNCgkJCQllZGl0aW5nRG9tYWluLA0KCQkJCU1lc3NhZ2VzLkFyZ0RpYWdyYW1FZGl0b3JVdGlsX0NyZWF0ZURpYWdyYW1Db21tYW5kTGFiZWwsDQoJCQkJQ29sbGVjdGlvbnMuRU1QVFlfTElTVCkgew0KCQkJQE92ZXJyaWRlDQoJCQlwcm90ZWN0ZWQgQ29tbWFuZFJlc3VsdCBkb0V4ZWN1dGVXaXRoUmVzdWx0KA0KCQkJCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykNCgkJCQkJdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7DQoJCQkJRU9iamVjdCBtb2RlbCA9IG51bGw7DQoJCQkJaWYgKG1vZGVsUmVzb3VyY2UuZ2V0Q29udGVudHMoKS5zaXplKCkgPiAwKSB7DQoJCQkJCW1vZGVsID0gbW9kZWxSZXNvdXJjZS5nZXRDb250ZW50cygpLmdldCgwKTsNCgkJCQl9IGVsc2Ugew0KCQkJCQltb2RlbCA9IGNyZWF0ZUluaXRpYWxNb2RlbCgpOw0KCQkJCQlhdHRhY2hNb2RlbFRvUmVzb3VyY2UobW9kZWwsIG1vZGVsUmVzb3VyY2UpOw0KCQkJCX0NCg0KCQkJCURpYWdyYW0gZGlhZ3JhbSA9IFZpZXdTZXJ2aWNlLmNyZWF0ZURpYWdyYW0obW9kZWwsDQoJCQkJCQlEYXduQ2FzZUVkaXRQYXJ0X01PREVMX0lELA0KCQkJCQkJQXJnRGlhZ3JhbUVkaXRvclBsdWdpbi5ESUFHUkFNX1BSRUZFUkVOQ0VTX0hJTlQpOw0KCQkJCWlmIChkaWFncmFtICE9IG51bGwpIHsNCgkJCQkJZGlhZ3JhbVJlc291cmNlLmdldENvbnRlbnRzKCkuYWRkKGRpYWdyYW0pOw0KCQkJCQlkaWFncmFtLnNldE5hbWUoZGlhZ3JhbU5hbWUpOw0KCQkJCQlkaWFncmFtLnNldEVsZW1lbnQobW9kZWwpOw0KCQkJCX0NCg0KCQkJCXRyeSB7DQoJCQkJCW1vZGVsUmVzb3VyY2Uuc2F2ZShDb2xsZWN0aW9ucy5FTVBUWV9NQVApOw0KCQkJCQlkaWFncmFtUmVzb3VyY2Uuc2F2ZShDb2xsZWN0aW9ucy5FTVBUWV9NQVApOw0KCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsNCgkJCQkJQXJnRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXRJbnN0YW5jZSgpLmxvZ0Vycm9yKA0KCQkJCQkJCSJVbmFibGUgdG8gc3RvcmUgbW9kZWwgYW5kIGRpYWdyYW0gcmVzb3VyY2VzIiwgZSk7IC8vJE5PTi1OTFMtMSQNCgkJCQl9DQoNCgkJCQlyZXR1cm4gQ29tbWFuZFJlc3VsdC5uZXdPS0NvbW1hbmRSZXN1bHQoKTsNCgkJCX0NCgkJfTsNCgkJdHJ5IHsNCgkJCU9wZXJhdGlvbkhpc3RvcnlGYWN0b3J5LmdldE9wZXJhdGlvbkhpc3RvcnkoKS5leGVjdXRlKGNvbW1hbmQsDQoJCQkJCW5ldyBTdWJQcm9ncmVzc01vbml0b3IocHJvZ3Jlc3NNb25pdG9yLCAxKSwgbnVsbCk7DQoJCX0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7DQoJCQlBcmdEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkubG9nRXJyb3IoDQoJCQkJCSJVbmFibGUgdG8gY3JlYXRlIG1vZGVsIGFuZCBkaWFncmFtIiwgZSk7IC8vJE5PTi1OTFMtMSQNCgkJfQ0KCQlzZXRDaGFyc2V0KFdvcmtzcGFjZVN5bmNocm9uaXplci5nZXRGaWxlKG1vZGVsUmVzb3VyY2UpKTsNCgkJc2V0Q2hhcnNldChXb3Jrc3BhY2VTeW5jaHJvbml6ZXIuZ2V0RmlsZShkaWFncmFtUmVzb3VyY2UpKTsNCgkJcmV0dXJuIGRpYWdyYW1SZXNvdXJjZTsNCgl9DQoNCglwcml2YXRlIHN0YXRpYyBFT2JqZWN0IGNyZWF0ZUluaXRpYWxNb2RlbCgpIHsNCgkJcmV0dXJuIEFyZ0ZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNhc2UoKTsNCgl9DQoNCglwcml2YXRlIHN0YXRpYyB2b2lkIGF0dGFjaE1vZGVsVG9SZXNvdXJjZShFT2JqZWN0IG1vZGVsLCBSZXNvdXJjZSByZXNvdXJjZSkgew0KCQlyZXNvdXJjZS5nZXRDb250ZW50cygpLmFkZChtb2RlbCk7DQoJfQ0KCQ0KCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvcGVuRGlhZ3JhbShSZXNvdXJjZSBkaWFncmFtKQ0KCQkJdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uIHsNCgkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkNCgkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOw0KCQlyZXR1cm4gbnVsbCAhPSBwYWdlLm9wZW5FZGl0b3IobmV3IERhd25FZGl0b3JJbnB1dChkaWFncmFtLmdldFVSSSgpKSwNCgkJCQlEYXduQXJnRGlhZ3JhbUVkaXRvcl9JRCk7DQoJfQ0KCQ0KCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRDaGFyc2V0KElGaWxlIGZpbGUpIHsNCgkJaWYgKGZpbGUgPT0gbnVsbCkgew0KCQkJcmV0dXJuOw0KCQl9DQoJCXRyeSB7DQoJCQlmaWxlLnNldENoYXJzZXQoIlVURi04IiwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7IC8vJE5PTi1OTFMtMSQNCgkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7DQoJCQlBcmdEaWFncmFtRWRpdG9yUGx1Z2luLmdldEluc3RhbmNlKCkubG9nRXJyb3IoDQoJCQkJCSJVbmFibGUgdG8gc2V0IGNoYXJzZXQgZm9yIGZpbGUgIiArIGZpbGUuZ2V0RnVsbFBhdGgoKSwgZSk7IC8vJE5PTi1OTFMtMSQNCgkJfQ0KCX0NCn0NCi8vIEVuZCBNQ1A=