LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICogQ29weXJpZ2h0IChDKSAyMDE2IGJ5IFNhdm9pci1mYWlyZSBMaW51eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KICogQXV0aG9yOiBK5GdlciBOaWNvbGFzIDxuaWNvbGFzLmphZ2VyQHNhdm9pcmZhaXJlbGludXguY29tPiAgICAgICAgICAgICAgKg0KICogQXV0aG9yOiBUcmFjenlrIEFuZHJlYXMgPGFuZHJlYXMudHJhY3p5a0BzYXZvaXJmYWlyZWxpbnV4LmNvbT4gICAgICAgICAgKg0KICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICAgKg0KICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICAgKg0KICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgICAgICAgKg0KICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICAgKg0KICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICAgKg0KICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICAgKg0KICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICAgKg0KICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAgKg0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KDQojcHJhZ21hIG9uY2UNCg0KbmFtZXNwYWNlIFJpbmdDbGllbnRVV1ANCnsNCg0KZGVsZWdhdGUgdm9pZCBTZWxlY3RJbmRleChpbnQgaW5kZXgpOw0KDQpuYW1lc3BhY2UgQ29uZmlndXJhdGlvbg0Kew0KDQovKiBkZWxlZ2F0ZXMgKi8NCg0KcHVibGljIHJlZiBjbGFzcyBVc2VyUHJlZmVyZW5jZXMgc2VhbGVkDQp7DQpwdWJsaWM6DQogICAgLyogc2luZ2xldG9uICovDQogICAgc3RhdGljIHByb3BlcnR5IFVzZXJQcmVmZXJlbmNlc14gaW5zdGFuY2UNCiAgICB7DQogICAgICAgIFVzZXJQcmVmZXJlbmNlc14gZ2V0KCkNCiAgICAgICAgew0KICAgICAgICAgICAgc3RhdGljIFVzZXJQcmVmZXJlbmNlc14gaW5zdGFuY2VfID0gcmVmIG5ldyBVc2VyUHJlZmVyZW5jZXMoKTsNCiAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZV87DQogICAgICAgIH0NCiAgICB9DQoNCiAgICAvKiBwcm9wZXJ0aWVzICovDQogICAgcHJvcGVydHkgaW50ICAgICAgICBQUkVGX0FDQ09VTlRfSU5ERVg7DQoNCiAgICAvKiBmdW5jdGlvbnMgKi8NCiAgICB2b2lkICAgICAgICAgICAgICAgIHNhdmUoKTsNCiAgICB2b2lkICAgICAgICAgICAgICAgIGxvYWQoKTsNCiAgICBTdHJpbmdeICAgICAgICAgICAgIFN0cmluZ2lmeSgpOw0KICAgIHZvaWQgICAgICAgICAgICAgICAgRGVzdHJpbmdpZnkoU3RyaW5nXiBkYXRhKTsNCg0KaW50ZXJuYWw6DQoNCiAgICAvKiBldmVudHMgKi8NCiAgICBldmVudCBTZWxlY3RJbmRleF4gc2VsZWN0SW5kZXg7DQoNCnByaXZhdGU6DQogICAgVXNlclByZWZlcmVuY2VzKCkgeyB9Ow0KDQp9Ow0KDQp9DQp9