LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIENvcHlyaWdodCAoQykgMjAxNiBieSBTYXZvaXItZmFpcmUgTGludXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCiogQXV0aG9yOiBK5GdlciBOaWNvbGFzIDxuaWNvbGFzLmphZ2VyQHNhdm9pcmZhaXJlbGludXguY29tPiAgICAgICAgICAgICAgKg0KKiBBdXRob3I6IFRyYWN6eWsgQW5kcmVhcyA8YW5kcmVhcy50cmFjenlrQHNhdm9pcmZhaXJlbGludXguY29tPiAgICAgICAgICAqDQoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCiogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICAgKg0KKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgICAqDQoqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAgICoNCiogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQoqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAgICoNCiogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICAgKg0KKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgICAqDQoqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgICAqDQoqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgICoNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KI2luY2x1ZGUgInBjaC5oIg0KDQojaW5jbHVkZSAiVmlkZW9QYWdlLnhhbWwuaCINCg0KdXNpbmcgbmFtZXNwYWNlIFJpbmdDbGllbnRVV1A6OlZpZXdzOw0KDQp1c2luZyBuYW1lc3BhY2UgQ29uY3VycmVuY3k7DQp1c2luZyBuYW1lc3BhY2UgUGxhdGZvcm07DQp1c2luZyBuYW1lc3BhY2UgV2luZG93czo6RGV2aWNlczo6RW51bWVyYXRpb247DQp1c2luZyBuYW1lc3BhY2UgV2luZG93czo6Rm91bmRhdGlvbjsNCnVzaW5nIG5hbWVzcGFjZSBXaW5kb3dzOjpGb3VuZGF0aW9uOjpDb2xsZWN0aW9uczsNCnVzaW5nIG5hbWVzcGFjZSBXaW5kb3dzOjpVSTo6WGFtbDsNCnVzaW5nIG5hbWVzcGFjZSBXaW5kb3dzOjpVSTo6WGFtbDo6Q29udHJvbHM7DQp1c2luZyBuYW1lc3BhY2UgV2luZG93czo6VUk6OlhhbWw6OkNvbnRyb2xzOjpQcmltaXRpdmVzOw0KdXNpbmcgbmFtZXNwYWNlIFdpbmRvd3M6OlVJOjpYYW1sOjpEYXRhOw0KdXNpbmcgbmFtZXNwYWNlIFdpbmRvd3M6OlVJOjpYYW1sOjpJbnB1dDsNCnVzaW5nIG5hbWVzcGFjZSBXaW5kb3dzOjpVSTo6WGFtbDo6TWVkaWE7DQp1c2luZyBuYW1lc3BhY2UgV2luZG93czo6VUk6OlhhbWw6Ok5hdmlnYXRpb247DQp1c2luZyBuYW1lc3BhY2UgV2luZG93czo6TWVkaWE6OkNhcHR1cmU7DQp1c2luZyBuYW1lc3BhY2UgV2luZG93czo6QXBwbGljYXRpb25Nb2RlbDo6Q29yZTsNCnVzaW5nIG5hbWVzcGFjZSBXaW5kb3dzOjpVSTo6Q29yZTsNCg0KVmlkZW9QYWdlOjpWaWRlb1BhZ2UoKQ0Kew0KICAgIEluaXRpYWxpemVDb21wb25lbnQoKTsNCn0NCg0Kdm9pZA0KUmluZ0NsaWVudFVXUDo6Vmlld3M6OlZpZGVvUGFnZTo6T25OYXZpZ2F0ZWRUbyhXaW5kb3dzOjpVSTo6WGFtbDo6TmF2aWdhdGlvbjo6TmF2aWdhdGlvbkV2ZW50QXJnc14gZSkNCnsNCiAgICB1cGRhdGVQYWdlQ29udGVudCgpOw0KfQ0KDQp2b2lkIFJpbmdDbGllbnRVV1A6OlZpZXdzOjpWaWRlb1BhZ2U6OnVwZGF0ZVBhZ2VDb250ZW50KCkNCnsNCiAgICBhdXRvIHNlbGVjdGVkQ29udGFjdCA9IFZpZXdNb2RlbDo6Q29udGFjdHNWaWV3TW9kZWw6Omluc3RhbmNlLT5zZWxlY3RlZENvbnRhY3Q7DQogICAgQ29udGFjdF4gY29udGFjdCA9IHNlbGVjdGVkQ29udGFjdD8NCiAgICAgICAgVmlld01vZGVsOjpTbWFydFBhbmVsSXRlbXNWaWV3TW9kZWw6Omluc3RhbmNlLT5maW5kSXRlbShzZWxlY3RlZENvbnRhY3QpLT5fY29udGFjdDoNCiAgICAgICAgbnVsbHB0cjsNCiAgICBpZiAoIWNvbnRhY3QpDQogICAgICAgIHJldHVybjsNCg0KICAgIF9jYWxsZWVfLT5UZXh0ID0gY29udGFjdC0+bmFtZV87DQp9DQoNCnZvaWQgUmluZ0NsaWVudFVXUDo6Vmlld3M6OlZpZGVvUGFnZTo6QnV0dG9uX0NsaWNrKFBsYXRmb3JtOjpPYmplY3ReIHNlbmRlciwgV2luZG93czo6VUk6OlhhbWw6OlJvdXRlZEV2ZW50QXJnc14gZSkNCnsNCn0NCg0KDQp2b2lkIFJpbmdDbGllbnRVV1A6OlZpZXdzOjpWaWRlb1BhZ2U6Ol9idG5DYW5jZWxfX0NsaWNrKFBsYXRmb3JtOjpPYmplY3ReIHNlbmRlciwgV2luZG93czo6VUk6OlhhbWw6OlJvdXRlZEV2ZW50QXJnc14gZSkNCnsNCg0KfQ0KDQp2b2lkIFJpbmdDbGllbnRVV1A6OlZpZXdzOjpWaWRlb1BhZ2U6Ol9idG5IYW5nVXBfX1RhcHBlZChQbGF0Zm9ybTo6T2JqZWN0XiBzZW5kZXIsIFdpbmRvd3M6OlVJOjpYYW1sOjpJbnB1dDo6VGFwcGVkUm91dGVkRXZlbnRBcmdzXiBlKQ0Kew0KICAgIENvbnRhY3ReIHNlbGVjdGVkQ29udGFjdCA9IFZpZXdNb2RlbDo6Q29udGFjdHNWaWV3TW9kZWw6Omluc3RhbmNlLT5zZWxlY3RlZENvbnRhY3Q7DQogICAgQ2FsbF4gY2FsbCA9IHNlbGVjdGVkQ29udGFjdD8NCiAgICAgICAgVmlld01vZGVsOjpTbWFydFBhbmVsSXRlbXNWaWV3TW9kZWw6Omluc3RhbmNlLT5maW5kSXRlbShzZWxlY3RlZENvbnRhY3QpLT5fY2FsbDoNCiAgICAgICAgbnVsbHB0cjsNCiAgICBpZiAoY2FsbCkNCiAgICAgICAgUmluZ0Q6Omluc3RhbmNlLT5oYW5nVXBDYWxsKGNhbGwpOw0KICAgIHByZXNzSGFuZ1VwQ2FsbCgpOw0KfQ0KDQoNCnZvaWQgUmluZ0NsaWVudFVXUDo6Vmlld3M6OlZpZGVvUGFnZTo6X2J0blBhdXNlX19UYXBwZWQoUGxhdGZvcm06Ok9iamVjdF4gc2VuZGVyLCBXaW5kb3dzOjpVSTo6WGFtbDo6SW5wdXQ6OlRhcHBlZFJvdXRlZEV2ZW50QXJnc14gZSkNCnsNCiAgICBwYXVzZUNhbGwoKTsNCn0NCg0KDQp2b2lkIFJpbmdDbGllbnRVV1A6OlZpZXdzOjpWaWRlb1BhZ2U6Ol9idG5DaGF0X19UYXBwZWQoUGxhdGZvcm06Ok9iamVjdF4gc2VuZGVyLCBXaW5kb3dzOjpVSTo6WGFtbDo6SW5wdXQ6OlRhcHBlZFJvdXRlZEV2ZW50QXJnc14gZSkNCnsNCiAgICBjaGF0UGFuZWxDYWxsKCk7DQp9DQoNCg0Kdm9pZCBSaW5nQ2xpZW50VVdQOjpWaWV3czo6VmlkZW9QYWdlOjpfYnRuQWRkRnJpZW5kX19UYXBwZWQoUGxhdGZvcm06Ok9iamVjdF4gc2VuZGVyLCBXaW5kb3dzOjpVSTo6WGFtbDo6SW5wdXQ6OlRhcHBlZFJvdXRlZEV2ZW50QXJnc14gZSkNCnsNCiAgICBhZGRDb250YWN0Q2FsbCgpOw0KfQ0KDQoNCnZvaWQgUmluZ0NsaWVudFVXUDo6Vmlld3M6OlZpZGVvUGFnZTo6X2J0blN3aXRjaF9fVGFwcGVkKFBsYXRmb3JtOjpPYmplY3ReIHNlbmRlciwgV2luZG93czo6VUk6OlhhbWw6OklucHV0OjpUYXBwZWRSb3V0ZWRFdmVudEFyZ3NeIGUpDQp7DQogICAgdHJhbnNmZXJDYWxsKCk7DQp9DQoNCg0Kdm9pZCBSaW5nQ2xpZW50VVdQOjpWaWV3czo6VmlkZW9QYWdlOjpfYnRuTWljcm9waG9uZV9fVGFwcGVkKFBsYXRmb3JtOjpPYmplY3ReIHNlbmRlciwgV2luZG93czo6VUk6OlhhbWw6OklucHV0OjpUYXBwZWRSb3V0ZWRFdmVudEFyZ3NeIGUpDQp7DQogICAgc3dpdGNoTWljcm9waG9uZVN0YXRlQ2FsbCgpOw0KfQ0KDQoNCnZvaWQgUmluZ0NsaWVudFVXUDo6Vmlld3M6OlZpZGVvUGFnZTo6X2J0bk1lbW9fX1RhcHBlZChQbGF0Zm9ybTo6T2JqZWN0XiBzZW5kZXIsIFdpbmRvd3M6OlVJOjpYYW1sOjpJbnB1dDo6VGFwcGVkUm91dGVkRXZlbnRBcmdzXiBlKQ0Kew0KICAgIHJlY2NvcmRWaWRlb0NhbGwoKTsNCn0NCg0KDQp2b2lkIFJpbmdDbGllbnRVV1A6OlZpZXdzOjpWaWRlb1BhZ2U6Ol9idG5IUV9fVGFwcGVkKFBsYXRmb3JtOjpPYmplY3ReIHNlbmRlciwgV2luZG93czo6VUk6OlhhbWw6OklucHV0OjpUYXBwZWRSb3V0ZWRFdmVudEFyZ3NeIGUpDQp7DQogICAgcXVhbGl0eVZpZGVvTGV2ZWxDYWxsKCk7DQp9DQoNCg0Kdm9pZCBSaW5nQ2xpZW50VVdQOjpWaWV3czo6VmlkZW9QYWdlOjpfYnRuVmlkZW9fX1RhcHBlZChQbGF0Zm9ybTo6T2JqZWN0XiBzZW5kZXIsIFdpbmRvd3M6OlVJOjpYYW1sOjpJbnB1dDo6VGFwcGVkUm91dGVkRXZlbnRBcmdzXiBlKQ0Kew0KICAgIHN3aXRjaFZpZGVvU3RhdGVDYWxsKCk7DQp9DQoNCg0Kdm9pZCBSaW5nQ2xpZW50VVdQOjpWaWV3czo6VmlkZW9QYWdlOjpfdmlkZW9Db250cm9sX19Qb2ludGVyTW92ZWQoUGxhdGZvcm06Ok9iamVjdF4gc2VuZGVyLCBXaW5kb3dzOjpVSTo6WGFtbDo6SW5wdXQ6OlBvaW50ZXJSb3V0ZWRFdmVudEFyZ3NeIGUpDQp7DQogICAgaWYgKGJhckZhZGluZykNCiAgICAgICAgbXlTdG9yeWJvYXJkLT5CZWdpbigpOw0KICAgIGJhckZhZGluZ18gPSB0cnVlOw0KfQ0KDQoNCnZvaWQgUmluZ0NsaWVudFVXUDo6Vmlld3M6OlZpZGVvUGFnZTo6YnRuQW55X2VudGVyZWQoUGxhdGZvcm06Ok9iamVjdF4gc2VuZGVyLCBXaW5kb3dzOjpVSTo6WGFtbDo6SW5wdXQ6OlBvaW50ZXJSb3V0ZWRFdmVudEFyZ3NeIGUpDQp7DQogICAgYmFyRmFkaW5nXyA9IGZhbHNlOw0KICAgIG15U3Rvcnlib2FyZC0+U3RvcCgpOw0KfQ0KDQoNCnZvaWQgUmluZ0NsaWVudFVXUDo6Vmlld3M6OlZpZGVvUGFnZTo6YnRuQW55X2V4aXRlZChQbGF0Zm9ybTo6T2JqZWN0XiBzZW5kZXIsIFdpbmRvd3M6OlVJOjpYYW1sOjpJbnB1dDo6UG9pbnRlclJvdXRlZEV2ZW50QXJnc14gZSkNCnsNCiAgICBiYXJGYWRpbmdfID0gdHJ1ZTsNCn0=