LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCkNvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBJQk0gQ29ycC4gYW5kIG90aGVycy4NCkFsbCByaWdodHMgcmVzZXJ2ZWQuIKAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYwLjUNCndoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQpodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbA0KoA0KQ29udHJpYnV0b3JzOg0KICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQpwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5jb3JlOw0KDQppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsNCmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsNCg0KLyoqDQogKiBSZXByZXNlbnQgdGhlIHJvb3QgSmF2YSBlbGVtZW50IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHdvcmtzcGFjZS4gDQogKiBTaW5jZSB0aGVyZSBpcyBvbmx5IG9uZSBzdWNoIHJvb3QgZWxlbWVudCwgaXQgaXMgY29tbW9ubHkgcmVmZXJyZWQgdG8gYXMNCiAqIDxlbT50aGU8L2VtPiBKYXZhIG1vZGVsIGVsZW1lbnQuDQogKiBUaGUgSmF2YSBtb2RlbCBlbGVtZW50IG5lZWRzIHRvIGJlIG9wZW5lZCBiZWZvcmUgaXQgY2FuIGJlIG5hdmlnYXRlZCBvciBtYW5pcHVsYXRlZC4NCiAqIFRoZSBKYXZhIG1vZGVsIGVsZW1lbnQgaGFzIG5vIHBhcmVudCAoaXQgaXMgdGhlIHJvb3Qgb2YgdGhlIEphdmEgZWxlbWVudCANCiAqIGhpZXJhcmNoeSkuIEl0cyBjaGlsZHJlbiBhcmUgPGNvZGU+SUphdmFQcm9qZWN0PC9jb2RlPnMuDQogKiA8cD4NCiAqIFRoaXMgaW50ZXJmYWNlIHByb3ZpZGVzIG1ldGhvZHMgZm9yIHBlcmZvcm1pbmcgY29weSwgbW92ZSwgcmVuYW1lLCBhbmQNCiAqIGRlbGV0ZSBvcGVyYXRpb25zIG9uIG11bHRpcGxlIEphdmEgZWxlbWVudHMuDQogKiA8L3A+DQogKiA8cD4NCiAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLiBBbiBpbnN0YW5jZQ0KICogb2Ygb25lIG9mIHRoZXNlIGhhbmRsZXMgY2FuIGJlIGNyZWF0ZWQgdmlhDQogKiA8Y29kZT5KYXZhQ29yZS5jcmVhdGUod29ya3NwYWNlLmdldFJvb3QoKSk8L2NvZGU+Lg0KICogPC9wPg0KICoNCiAqIEBzZWUgSmF2YUNvcmUjY3JlYXRlKG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290KQ0KICovDQpwdWJsaWMgaW50ZXJmYWNlIElKYXZhTW9kZWwgZXh0ZW5kcyBJSmF2YUVsZW1lbnQsIElPcGVuYWJsZSwgSVBhcmVudCB7DQovKioNCiAqIENvcGllcyB0aGUgZ2l2ZW4gZWxlbWVudHMgdG8gdGhlIHNwZWNpZmllZCBjb250YWluZXIocykuDQogKiBJZiBvbmUgY29udGFpbmVyIGlzIHNwZWNpZmllZCwgYWxsIGVsZW1lbnRzIGFyZSBjb3BpZWQgdG8gdGhhdA0KICogY29udGFpbmVyLiBJZiBtb3JlIHRoYW4gb25lIGNvbnRhaW5lciBpcyBzcGVjaWZpZWQsIHRoZSBudW1iZXIgb2YNCiAqIGVsZW1lbnRzIGFuZCBjb250YWluZXJzIG11c3QgbWF0Y2gsIGFuZCBlYWNoIGVsZW1lbnQgaXMgY29waWVkIHRvDQogKiBpdHMgYXNzb2NpYXRlZCBjb250YWluZXIuDQogKiA8cD4NCiAqIE9wdGlvbmFsbHksIGVhY2ggY29weSBjYW4gcG9zaXRpb25lZCBiZWZvcmUgYSBzaWJsaW5nDQogKiBlbGVtZW50LiBJZiA8Y29kZT5udWxsPC9jb2RlPiBpcyBzcGVjaWZpZWQgZm9yIGEgZ2l2ZW4gc2libGluZywgdGhlIGNvcHkNCiAqIGlzIGluc2VydGVkIGFzIHRoZSBsYXN0IGNoaWxkIG9mIGl0cyBhc3NvY2lhdGVkIGNvbnRhaW5lci4NCiAqIDwvcD4NCiAqIDxwPg0KICogT3B0aW9uYWxseSwgZWFjaCBjb3B5IGNhbiBiZSByZW5hbWVkLiBJZiANCiAqIDxjb2RlPm51bGw8L2NvZGU+IGlzIHNwZWNpZmllZCBmb3IgdGhlIG5ldyBuYW1lLCB0aGUgY29weQ0KICogaXMgbm90IHJlbmFtZWQuIA0KICogPC9wPg0KICogPHA+DQogKiBPcHRpb25hbGx5LCBhbnkgZXhpc3RpbmcgY2hpbGQgaW4gdGhlIGRlc3RpbmF0aW9uIGNvbnRhaW5lciB3aXRoDQogKiB0aGUgc2FtZSBuYW1lIGNhbiBiZSByZXBsYWNlZCBieSBzcGVjaWZ5aW5nIDxjb2RlPnRydWU8L2NvZGU+IGZvcg0KICogZm9yY2UuIE90aGVyd2lzZSBhbiBleGNlcHRpb24gaXMgdGhyb3duIGluIHRoZSBldmVudCB0aGF0IGEgbmFtZQ0KICogY29sbGlzaW9uIG9jY3Vycy4NCiAqIDwvcD4NCiAqDQogKiBAcGFyYW0gZWxlbWVudHMgdGhlIGVsZW1lbnRzIHRvIGNvcHkNCiAqIEBwYXJhbSBjb250YWluZXJzIHRoZSBjb250YWluZXIsIG9yIGxpc3Qgb2YgY29udGFpbmVycw0KICogQHBhcmFtIHNpYmxpbmdzIHRoZSBsaXN0IG9mIHNpYmxpbmdzIGVsZW1lbnQgYW55IG9mIHdoaWNoIG1heSBiZQ0KICogICA8Y29kZT5udWxsPC9jb2RlPjsgb3IgPGNvZGU+bnVsbDwvY29kZT4NCiAqIEBwYXJhbSByZW5hbWluZ3MgdGhlIGxpc3Qgb2YgbmV3IG5hbWVzIGFueSBvZiB3aGljaCBtYXkgYmUNCiAqICAgPGNvZGU+bnVsbDwvY29kZT47IG9yIDxjb2RlPm51bGw8L2NvZGU+DQogKiBAcGFyYW0gcmVwbGFjZSA8Y29kZT50cnVlPC9jb2RlPiBpZiBhbnkgZXhpc3RpbmcgY2hpbGQgaW4gYSB0YXJnZXQgY29udGFpbmVyDQogKiAgIHdpdGggdGhlIHRhcmdldCBuYW1lIHNob3VsZCBiZSByZXBsYWNlZCwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiB0byB0aHJvdyBhbg0KICogICBleGNlcHRpb24gaW4gdGhlIGV2ZW50IG9mIGEgbmFtZSBjb2xsaXNpb24NCiAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvcg0KICogQGV4Y2VwdGlvbiBKYXZhTW9kZWxFeGNlcHRpb24gaWYgYW4gZWxlbWVudCBjb3VsZCBub3QgYmUgY29waWVkLiBSZWFzb25zIGluY2x1ZGU6DQogKiA8dWw+DQogKiA8bGk+IEEgc3BlY2lmaWVkIGVsZW1lbnQsIGNvbnRhaW5lciwgb3Igc2libGluZyBkb2VzIG5vdCBleGlzdCAoRUxFTUVOVF9ET0VTX05PVF9FWElTVCk8L2xpPg0KICogPGxpPiBBIDxjb2RlPkNvcmVFeGNlcHRpb248L2NvZGU+IG9jY3VycmVkIHdoaWxlIHVwZGF0aW5nIGFuIHVuZGVybHlpbmcgcmVzb3VyY2UNCiAqIDxsaT4gQSBjb250YWluZXIgaXMgb2YgYW4gaW5jb21wYXRpYmxlIHR5cGUgKDxjb2RlPklOVkFMSURfREVTVElOQVRJT048L2NvZGU+KQ0KICogPGxpPiBBIHNpYmxpbmcgaXMgbm90IGEgY2hpbGQgb2YgaXQgYXNzb2NpYXRlZCBjb250YWluZXIgKDxjb2RlPklOVkFMSURfU0lCTElORzwvY29kZT4pDQogKiA8bGk+IEEgbmV3IG5hbWUgaXMgaW52YWxpZCAoPGNvZGU+SU5WQUxJRF9OQU1FPC9jb2RlPikNCiAqIDxsaT4gQSBjaGlsZCBpbiBpdHMgYXNzb2NpYXRlZCBjb250YWluZXIgYWxyZWFkeSBleGlzdHMgd2l0aCB0aGUgc2FtZQ0KICogCQluYW1lIGFuZCA8Y29kZT5yZXBsYWNlPC9jb2RlPiBoYXMgYmVlbiBzcGVjaWZpZWQgYXMgPGNvZGU+ZmFsc2U8L2NvZGU+ICg8Y29kZT5OQU1FX0NPTExJU0lPTjwvY29kZT4pDQogKiA8bGk+IEEgY29udGFpbmVyIG9yIGVsZW1lbnQgaXMgcmVhZC1vbmx5ICg8Y29kZT5SRUFEX09OTFk8L2NvZGU+KSANCiAqIDwvdWw+DQogKi8NCnZvaWQgY29weShJSmF2YUVsZW1lbnRbXSBlbGVtZW50cywgSUphdmFFbGVtZW50W10gY29udGFpbmVycywgSUphdmFFbGVtZW50W10gc2libGluZ3MsIFN0cmluZ1tdIHJlbmFtaW5ncywgYm9vbGVhbiByZXBsYWNlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247DQovKioNCiAqIERlbGV0ZXMgdGhlIGdpdmVuIGVsZW1lbnRzLCBmb3JjaW5nIHRoZSBvcGVyYXRpb24gaWYgbmVjZXNzYXJ5IGFuZCBzcGVjaWZpZWQuDQogKg0KICogQHBhcmFtIGVsZW1lbnRzIHRoZSBlbGVtZW50cyB0byBkZWxldGUNCiAqIEBwYXJhbSBmb3JjZSBhIGZsYWcgY29udHJvbGxpbmcgd2hldGhlciB1bmRlcmx5aW5nIHJlc291cmNlcyB0aGF0IGFyZSBub3QNCiAqICAgIGluIHN5bmMgd2l0aCB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0gd2lsbCBiZSB0b2xlcmF0ZWQNCiAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvcg0KICogQGV4Y2VwdGlvbiBKYXZhTW9kZWxFeGNlcHRpb24gaWYgYW4gZWxlbWVudCBjb3VsZCBub3QgYmUgZGVsZXRlZC4gUmVhc29ucyBpbmNsdWRlOg0KICogPHVsPg0KICogPGxpPiBBIHNwZWNpZmllZCBlbGVtZW50IGRvZXMgbm90IGV4aXN0IChFTEVNRU5UX0RPRVNfTk9UX0VYSVNUKTwvbGk+DQogKiA8bGk+IEEgPGNvZGU+Q29yZUV4Y2VwdGlvbjwvY29kZT4gb2NjdXJyZWQgd2hpbGUgdXBkYXRpbmcgYW4gdW5kZXJseWluZyByZXNvdXJjZQ0KICogPGxpPiBBbiBlbGVtZW50IGlzIHJlYWQtb25seSAoPGNvZGU+UkVBRF9PTkxZPC9jb2RlPikgDQogKiA8L3VsPg0KICovDQp2b2lkIGRlbGV0ZShJSmF2YUVsZW1lbnRbXSBlbGVtZW50cywgYm9vbGVhbiBmb3JjZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOw0KLyoqDQogKiBSZXR1cm5zIHRoZSBKYXZhIHByb2plY3Qgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4gVGhpcyBpcyBhIGhhbmRsZS1vbmx5IG1ldGhvZC4gDQogKiBUaGUgcHJvamVjdCBtYXkgb3IgbWF5IG5vdCBleGlzdC4NCiAqLw0KSUphdmFQcm9qZWN0IGdldEphdmFQcm9qZWN0KFN0cmluZyBuYW1lKTsNCi8qKg0KICogUmV0dXJucyB0aGUgSmF2YSBwcm9qZWN0cyBpbiB0aGlzIEphdmEgbW9kZWwsIG9yIGFuIGVtcHR5IGFycmF5IGlmIHRoZXJlDQogKiBhcmUgbm9uZS4NCiAqDQogKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiB0aGlzIHJlcXVlc3QgZmFpbHMuDQogKi8NCklKYXZhUHJvamVjdFtdIGdldEphdmFQcm9qZWN0cygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb247DQovKioNCiAqIFJldHVybnMgdGhlIHdvcmtzcGFjZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBKYXZhIG1vZGVsLg0KICovDQpJV29ya3NwYWNlIGdldFdvcmtzcGFjZSgpOw0KLyoqDQogKiBNb3ZlcyB0aGUgZ2l2ZW4gZWxlbWVudHMgdG8gdGhlIHNwZWNpZmllZCBjb250YWluZXIocykuDQogKiBJZiBvbmUgY29udGFpbmVyIGlzIHNwZWNpZmllZCwgYWxsIGVsZW1lbnRzIGFyZSBtb3ZlZCB0byB0aGF0DQogKiBjb250YWluZXIuIElmIG1vcmUgdGhhbiBvbmUgY29udGFpbmVyIGlzIHNwZWNpZmllZCwgdGhlIG51bWJlciBvZg0KICogZWxlbWVudHMgYW5kIGNvbnRhaW5lcnMgbXVzdCBtYXRjaCwgYW5kIGVhY2ggZWxlbWVudCBpcyBtb3ZlZCB0bw0KICogaXRzIGFzc29jaWF0ZWQgY29udGFpbmVyLg0KICogPHA+DQogKiBPcHRpb25hbGx5LCBlYWNoIGVsZW1lbnQgY2FuIHBvc2l0aW9uZWQgYmVmb3JlIGEgc2libGluZw0KICogZWxlbWVudC4gSWYgPGNvZGU+bnVsbDwvY29kZT4gaXMgc3BlY2lmaWVkIGZvciBzaWJsaW5nLCB0aGUgZWxlbWVudA0KICogaXMgaW5zZXJ0ZWQgYXMgdGhlIGxhc3QgY2hpbGQgb2YgaXRzIGFzc29jaWF0ZWQgY29udGFpbmVyLg0KICogPC9wPg0KICogPHA+DQogKiBPcHRpb25hbGx5LCBlYWNoIGVsZW1lbnQgY2FuIGJlIHJlbmFtZWQuIElmIA0KICogPGNvZGU+bnVsbDwvY29kZT4gaXMgc3BlY2lmaWVkIGZvciB0aGUgbmV3IG5hbWUsIHRoZSBlbGVtZW50DQogKiBpcyBub3QgcmVuYW1lZC4gDQogKiA8L3A+DQogKiA8cD4NCiAqIE9wdGlvbmFsbHksIGFueSBleGlzdGluZyBjaGlsZCBpbiB0aGUgZGVzdGluYXRpb24gY29udGFpbmVyIHdpdGgNCiAqIHRoZSBzYW1lIG5hbWUgY2FuIGJlIHJlcGxhY2VkIGJ5IHNwZWNpZnlpbmcgPGNvZGU+dHJ1ZTwvY29kZT4gZm9yDQogKiBmb3JjZS4gT3RoZXJ3aXNlIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gaW4gdGhlIGV2ZW50IHRoYXQgYSBuYW1lDQogKiBjb2xsaXNpb24gb2NjdXJzLg0KICogPC9wPg0KICoNCiAqIEBwYXJhbSBlbGVtZW50cyB0aGUgZWxlbWVudHMgdG8gbW92ZQ0KICogQHBhcmFtIGNvbnRhaW5lcnMgdGhlIGNvbnRhaW5lciwgb3IgbGlzdCBvZiBjb250YWluZXJzDQogKiBAcGFyYW0gc2libGluZ3MgdGhlIGxpc3Qgb2Ygc2libGluZ3MgZWxlbWVudCBhbnkgb2Ygd2hpY2ggbWF5IGJlDQogKiAgIDxjb2RlPm51bGw8L2NvZGU+OyBvciA8Y29kZT5udWxsPC9jb2RlPg0KICogQHBhcmFtIHJlbmFtaW5ncyB0aGUgbGlzdCBvZiBuZXcgbmFtZXMgYW55IG9mIHdoaWNoIG1heSBiZQ0KICogICA8Y29kZT5udWxsPC9jb2RlPjsgb3IgPGNvZGU+bnVsbDwvY29kZT4NCiAqIEBwYXJhbSByZXBsYWNlIDxjb2RlPnRydWU8L2NvZGU+IGlmIGFueSBleGlzdGluZyBjaGlsZCBpbiBhIHRhcmdldCBjb250YWluZXINCiAqICAgd2l0aCB0aGUgdGFyZ2V0IG5hbWUgc2hvdWxkIGJlIHJlcGxhY2VkLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IHRvIHRocm93IGFuDQogKiAgIGV4Y2VwdGlvbiBpbiB0aGUgZXZlbnQgb2YgYSBuYW1lIGNvbGxpc2lvbg0KICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yDQogKiBAZXhjZXB0aW9uIEphdmFNb2RlbEV4Y2VwdGlvbiBpZiBhbiBlbGVtZW50IGNvdWxkIG5vdCBiZSBtb3ZlZC4gUmVhc29ucyBpbmNsdWRlOg0KICogPHVsPg0KICogPGxpPiBBIHNwZWNpZmllZCBlbGVtZW50LCBjb250YWluZXIsIG9yIHNpYmxpbmcgZG9lcyBub3QgZXhpc3QgKEVMRU1FTlRfRE9FU19OT1RfRVhJU1QpPC9saT4NCiAqIDxsaT4gQSA8Y29kZT5Db3JlRXhjZXB0aW9uPC9jb2RlPiBvY2N1cnJlZCB3aGlsZSB1cGRhdGluZyBhbiB1bmRlcmx5aW5nIHJlc291cmNlDQogKiA8bGk+IEEgY29udGFpbmVyIGlzIG9mIGFuIGluY29tcGF0aWJsZSB0eXBlICg8Y29kZT5JTlZBTElEX0RFU1RJTkFUSU9OPC9jb2RlPikNCiAqIDxsaT4gQSBzaWJsaW5nIGlzIG5vdCBhIGNoaWxkIG9mIGl0IGFzc29jaWF0ZWQgY29udGFpbmVyICg8Y29kZT5JTlZBTElEX1NJQkxJTkc8L2NvZGU+KQ0KICogPGxpPiBBIG5ldyBuYW1lIGlzIGludmFsaWQgKDxjb2RlPklOVkFMSURfTkFNRTwvY29kZT4pDQogKiA8bGk+IEEgY2hpbGQgaW4gaXRzIGFzc29jaWF0ZWQgY29udGFpbmVyIGFscmVhZHkgZXhpc3RzIHdpdGggdGhlIHNhbWUNCiAqIAkJbmFtZSBhbmQgPGNvZGU+cmVwbGFjZTwvY29kZT4gaGFzIGJlZW4gc3BlY2lmaWVkIGFzIDxjb2RlPmZhbHNlPC9jb2RlPiAoPGNvZGU+TkFNRV9DT0xMSVNJT048L2NvZGU+KQ0KICogPGxpPiBBIGNvbnRhaW5lciBvciBlbGVtZW50IGlzIHJlYWQtb25seSAoPGNvZGU+UkVBRF9PTkxZPC9jb2RlPikgDQogKiA8L3VsPg0KICoNCiAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGFueSBlbGVtZW50IG9yIGNvbnRhaW5lciBpcyA8Y29kZT5udWxsPC9jb2RlPg0KICovDQp2b2lkIG1vdmUoSUphdmFFbGVtZW50W10gZWxlbWVudHMsIElKYXZhRWxlbWVudFtdIGNvbnRhaW5lcnMsIElKYXZhRWxlbWVudFtdIHNpYmxpbmdzLCBTdHJpbmdbXSByZW5hbWluZ3MsIGJvb2xlYW4gcmVwbGFjZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOw0KLyoqDQogKiBSZW5hbWVzIHRoZSBnaXZlbiBlbGVtZW50cyBhcyBzcGVjaWZpZWQuDQogKiBJZiBvbmUgY29udGFpbmVyIGlzIHNwZWNpZmllZCwgYWxsIGVsZW1lbnRzIGFyZSByZW5hbWVkIHdpdGhpbiB0aGF0DQogKiBjb250YWluZXIuIElmIG1vcmUgdGhhbiBvbmUgY29udGFpbmVyIGlzIHNwZWNpZmllZCwgdGhlIG51bWJlciBvZg0KICogZWxlbWVudHMgYW5kIGNvbnRhaW5lcnMgbXVzdCBtYXRjaCwgYW5kIGVhY2ggZWxlbWVudCBpcyByZW5hbWVkIHdpdGhpbg0KICogaXRzIGFzc29jaWF0ZWQgY29udGFpbmVyLg0KICoNCiAqIEBwYXJhbSBlbGVtZW50cyB0aGUgZWxlbWVudHMgdG8gcmVuYW1lDQogKiBAcGFyYW0gZGVzdGluYXRpb25zIHRoZSBjb250YWluZXIsIG9yIGxpc3Qgb2YgY29udGFpbmVycw0KICogQHBhcmFtIG5hbWVzIHRoZSBsaXN0IG9mIG5ldyBuYW1lcw0KICogQHBhcmFtIHJlcGxhY2UgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYW4gZXhpc3RpbmcgY2hpbGQgaW4gYSB0YXJnZXQgY29udGFpbmVyDQogKiAgIHdpdGggdGhlIHRhcmdldCBuYW1lIHNob3VsZCBiZSByZXBsYWNlZCwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiB0byB0aHJvdyBhbg0KICogICBleGNlcHRpb24gaW4gdGhlIGV2ZW50IG9mIGEgbmFtZSBjb2xsaXNpb24NCiAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvcg0KICogQGV4Y2VwdGlvbiBKYXZhTW9kZWxFeGNlcHRpb24gaWYgYW4gZWxlbWVudCBjb3VsZCBub3QgYmUgcmVuYW1lZC4gUmVhc29ucyBpbmNsdWRlOg0KICogPHVsPg0KICogPGxpPiBBIHNwZWNpZmllZCBlbGVtZW50IGRvZXMgbm90IGV4aXN0IChFTEVNRU5UX0RPRVNfTk9UX0VYSVNUKTwvbGk+DQogKiA8bGk+IEEgPGNvZGU+Q29yZUV4Y2VwdGlvbjwvY29kZT4gb2NjdXJyZWQgd2hpbGUgdXBkYXRpbmcgYW4gdW5kZXJseWluZyByZXNvdXJjZQ0KICogPGxpPiBBIG5ldyBuYW1lIGlzIGludmFsaWQgKDxjb2RlPklOVkFMSURfTkFNRTwvY29kZT4pDQogKiA8bGk+IEEgY2hpbGQgYWxyZWFkeSBleGlzdHMgd2l0aCB0aGUgc2FtZSBuYW1lIGFuZCA8Y29kZT5yZXBsYWNlPC9jb2RlPiBoYXMgYmVlbiBzcGVjaWZpZWQgYXMgPGNvZGU+ZmFsc2U8L2NvZGU+ICg8Y29kZT5OQU1FX0NPTExJU0lPTjwvY29kZT4pDQogKiA8bGk+IEFuIGVsZW1lbnQgaXMgcmVhZC1vbmx5ICg8Y29kZT5SRUFEX09OTFk8L2NvZGU+KSANCiAqIDwvdWw+DQogKi8NCnZvaWQgcmVuYW1lKElKYXZhRWxlbWVudFtdIGVsZW1lbnRzLCBJSmF2YUVsZW1lbnRbXSBkZXN0aW5hdGlvbnMsIFN0cmluZ1tdIG5hbWVzLCBib29sZWFuIHJlcGxhY2UsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsNCn0NCg==