LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIENvcHlyaWdodCAoQykgMjAxNiBieSBTYXZvaXItZmFpcmUgTGludXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCiogQXV0aG9yOiBK5GdlciBOaWNvbGFzIDxuaWNvbGFzLmphZ2VyQHNhdm9pcmZhaXJlbGludXguY29tPiAgICAgICAgICAgICAgKg0KKiBBdXRob3I6IFRyYWN6eWsgQW5kcmVhcyA8dHJhY3p5ay5hbmRyZWFzQHNhdm9pcmZhaXJlbGludXguY29tPiAgICAgICAgICAqDQoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCiogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICAgKg0KKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgICAqDQoqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAgICoNCiogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQoqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAgICoNCiogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICAgKg0KKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgICAqDQoqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgICAqDQoqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgICoNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KI2luY2x1ZGUgInBjaC5oIg0KDQojaW5jbHVkZSAiQ29udGFjdC5oIg0KDQojaW5jbHVkZSAiT2JqQmFzZS5oIiAvLyBmb3IgQ29DcmVhdGVHdWlkDQoNCiNpbmNsdWRlICJmaWxldXRpbHMuaCINCg0KdXNpbmcgbmFtZXNwYWNlIFdpbmRvd3M6OkFwcGxpY2F0aW9uTW9kZWw6OkNvcmU7DQp1c2luZyBuYW1lc3BhY2UgUGxhdGZvcm07DQp1c2luZyBuYW1lc3BhY2UgV2luZG93czo6RGF0YTo6SnNvbjsNCnVzaW5nIG5hbWVzcGFjZSBXaW5kb3dzOjpVSTo6Q29yZTsNCg0KdXNpbmcgbmFtZXNwYWNlIFJpbmdDbGllbnRVV1A7DQp1c2luZyBuYW1lc3BhY2UgVmlld01vZGVsOw0KDQpDb250YWN0OjpDb250YWN0KFN0cmluZ14gbmFtZSwNCiAgICAgICAgICAgICAgICAgU3RyaW5nXiByaW5nSUQsDQogICAgICAgICAgICAgICAgIFN0cmluZ14gR1VJRCwNCiAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHVucmVhZG1lc3NhZ2VzKQ0Kew0KICAgIG5hbWVfICAgPSBuYW1lOw0KICAgIHJpbmdJRF8gPSByaW5nSUQ7DQogICAgR1VJRF8gICA9IEdVSUQ7DQoNCiAgICBpZiAoR1VJRF8gPT0gbnVsbHB0cikNCiAgICAgICAgR1VJRF8gPSBVdGlsczo6R2V0TmV3R1VJRCgpOw0KDQogICAgY29udmVyc2F0aW9uXyA9IHJlZiBuZXcgQ29udmVyc2F0aW9uKCk7DQoNCiAgICAvLyBsb2FkIGNvbnZlcnNhdGlvbiBmcm9tIGRpc2sNCiAgICBTdG9yYWdlRm9sZGVyXiBsb2NhbGZvbGRlciA9IEFwcGxpY2F0aW9uRGF0YTo6Q3VycmVudC0+TG9jYWxGb2xkZXI7DQogICAgU3RyaW5nXiBtZXNzYWdlc0ZpbGUgPSBsb2NhbGZvbGRlci0+UGF0aCArICJcXCIgKyAiLm1lc3NhZ2VzXFwiICsgR1VJRF8gKyAiLmpzb24iOw0KDQogICAgU3RyaW5nXiBmaWxlQ29udGVudHMgPSBVdGlsczo6dG9QbGF0Zm9ybVN0cmluZyhVdGlsczo6Z2V0U3RyaW5nRnJvbUZpbGUoVXRpbHM6OnRvU3RyaW5nKG1lc3NhZ2VzRmlsZSkpKTsNCg0KICAgIENvcmVBcHBsaWNhdGlvbjo6TWFpblZpZXctPkNvcmVXaW5kb3ctPkRpc3BhdGNoZXItPlJ1bkFzeW5jKENvcmVEaXNwYXRjaGVyUHJpb3JpdHk6OkhpZ2gsDQogICAgcmVmIG5ldyBEaXNwYXRjaGVkSGFuZGxlcihbPV0oKSB7DQogICAgICAgIGlmIChmaWxlQ29udGVudHMgIT0gbnVsbHB0cikNCiAgICAgICAgICAgIERlc3RyaW5naWZ5Q29udmVyc2F0aW9uKGZpbGVDb250ZW50cyk7DQogICAgfSkpOw0KDQogICAgbm90aWZpY2F0aW9uTmV3TWVzc2FnZV8gPSBXaW5kb3dzOjpVSTo6WGFtbDo6VmlzaWJpbGl0eTo6Q29sbGFwc2VkOw0KICAgIHVucmVhZE1lc3NhZ2VzXyA9IHVucmVhZG1lc3NhZ2VzOw0KDQogICAgaWYodW5yZWFkTWVzc2FnZXNfKSB7DQogICAgICAgIG5vdGlmaWNhdGlvbk5ld01lc3NhZ2UgPSBXaW5kb3dzOjpVSTo6WGFtbDo6VmlzaWJpbGl0eTo6VmlzaWJsZTsNCiAgICAgICAgUHJvcGVydHlDaGFuZ2VkKHRoaXMsIHJlZiBuZXcgUHJvcGVydHlDaGFuZ2VkRXZlbnRBcmdzKCJ1bnJlYWRNZXNzYWdlcyIpKTsNCiAgICB9DQp9DQoNCnZvaWQNCkNvbnRhY3Q6Ok5vdGlmeVByb3BlcnR5Q2hhbmdlZChTdHJpbmdeIHByb3BlcnR5TmFtZSkNCnsNCiAgICBDb3JlQXBwbGljYXRpb25WaWV3XiB2aWV3ID0gQ29yZUFwcGxpY2F0aW9uOjpNYWluVmlldzsNCiAgICB2aWV3LT5Db3JlV2luZG93LT5EaXNwYXRjaGVyLT5SdW5Bc3luYygNCiAgICAgICAgQ29yZURpc3BhdGNoZXJQcmlvcml0eTo6SGlnaCwNCiAgICAgICAgcmVmIG5ldyBEaXNwYXRjaGVkSGFuZGxlcihbdGhpcywgcHJvcGVydHlOYW1lXSgpDQogICAgew0KICAgICAgICBQcm9wZXJ0eUNoYW5nZWQodGhpcywgcmVmIG5ldyBQcm9wZXJ0eUNoYW5nZWRFdmVudEFyZ3MocHJvcGVydHlOYW1lKSk7DQogICAgfSkpOw0KfQ0KDQpKc29uT2JqZWN0Xg0KQ29udGFjdDo6VG9Kc29uT2JqZWN0KCkNCnsNCiAgICBKc29uT2JqZWN0XiBjb250YWN0T2JqZWN0ID0gcmVmIG5ldyBKc29uT2JqZWN0KCk7DQogICAgY29udGFjdE9iamVjdC0+U2V0TmFtZWRWYWx1ZShuYW1lS2V5LCBKc29uVmFsdWU6OkNyZWF0ZVN0cmluZ1ZhbHVlKG5hbWVfKSk7DQogICAgY29udGFjdE9iamVjdC0+U2V0TmFtZWRWYWx1ZShyaW5nSURLZXksIEpzb25WYWx1ZTo6Q3JlYXRlU3RyaW5nVmFsdWUocmluZ0lEXykpOw0KICAgIGNvbnRhY3RPYmplY3QtPlNldE5hbWVkVmFsdWUoR1VJREtleSwgSnNvblZhbHVlOjpDcmVhdGVTdHJpbmdWYWx1ZShHVUlEXykpOw0KICAgIGNvbnRhY3RPYmplY3QtPlNldE5hbWVkVmFsdWUodW5yZWFkTWVzc2FnZXNLZXksIEpzb25WYWx1ZTo6Q3JlYXRlTnVtYmVyVmFsdWUodW5yZWFkTWVzc2FnZXNfKSk7DQoNCiAgICBKc29uT2JqZWN0XiBqc29uT2JqZWN0ID0gcmVmIG5ldyBKc29uT2JqZWN0KCk7DQogICAganNvbk9iamVjdC0+U2V0TmFtZWRWYWx1ZShjb250YWN0S2V5LCBjb250YWN0T2JqZWN0KTsNCg0KICAgIHJldHVybiBqc29uT2JqZWN0Ow0KfQ0KDQpTdHJpbmdeDQpDb250YWN0OjpTdHJpbmdpZnlDb252ZXJzYXRpb24oKQ0Kew0KICAgIEpzb25BcnJheV4ganNvbkFycmF5ID0gcmVmIG5ldyBKc29uQXJyYXkoKTsNCg0KICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgY29udmVyc2F0aW9uXy0+X21lc3NhZ2VzLT5TaXplOyBpKyspIHsNCiAgICAgICAganNvbkFycmF5LT5BcHBlbmQoY29udmVyc2F0aW9uXy0+X21lc3NhZ2VzLT5HZXRBdChpKS0+VG9Kc29uT2JqZWN0KCkpOw0KICAgIH0NCg0KICAgIEpzb25PYmplY3ReIGpzb25PYmplY3QgPSByZWYgbmV3IEpzb25PYmplY3QoKTsNCiAgICBqc29uT2JqZWN0LT5TZXROYW1lZFZhbHVlKGNvbnZlcnNhdGlvbktleSwganNvbkFycmF5KTsNCg0KICAgIHJldHVybiBqc29uT2JqZWN0LT5TdHJpbmdpZnkoKTsNCn0NCg0Kdm9pZA0KQ29udGFjdDo6RGVzdHJpbmdpZnlDb252ZXJzYXRpb24oU3RyaW5nXiBkYXRhKQ0Kew0KICAgIEpzb25PYmplY3ReIGpzb25PYmplY3QgPSBKc29uT2JqZWN0OjpQYXJzZShkYXRhKTsNCiAgICBTdHJpbmdeICAgICBkYXRlOw0KICAgIGJvb2wgICAgICAgIGZyb21Db250YWN0Ow0KICAgIFN0cmluZ14gICAgIHBheWxvYWQ7DQoNCiAgICBKc29uQXJyYXleIG1lc3NhZ2VMaXN0ID0ganNvbk9iamVjdC0+R2V0TmFtZWRBcnJheShjb252ZXJzYXRpb25LZXksIHJlZiBuZXcgSnNvbkFycmF5KCkpOw0KICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgbWVzc2FnZUxpc3QtPlNpemU7IGkrKykgew0KICAgICAgICBJSnNvblZhbHVlXiBtZXNzYWdlID0gbWVzc2FnZUxpc3QtPkdldEF0KGkpOw0KICAgICAgICBpZiAobWVzc2FnZS0+VmFsdWVUeXBlID09IEpzb25WYWx1ZVR5cGU6Ok9iamVjdCkgew0KICAgICAgICAgICAgSnNvbk9iamVjdF4ganNvbk1lc3NhZ2VPYmplY3QgPSBtZXNzYWdlLT5HZXRPYmplY3QoKTsNCiAgICAgICAgICAgIEpzb25PYmplY3ReIG1lc3NhZ2VPYmplY3QgPSBqc29uTWVzc2FnZU9iamVjdC0+R2V0TmFtZWRPYmplY3QobWVzc2FnZUtleSwgbnVsbHB0cik7DQogICAgICAgICAgICBpZiAobWVzc2FnZU9iamVjdCAhPSBudWxscHRyKSB7DQogICAgICAgICAgICAgICAgZGF0ZSA9IG1lc3NhZ2VPYmplY3QtPkdldE5hbWVkU3RyaW5nKGRhdGVLZXksICIiKTsNCiAgICAgICAgICAgICAgICBmcm9tQ29udGFjdCA9IG1lc3NhZ2VPYmplY3QtPkdldE5hbWVkQm9vbGVhbihmcm9tQ29udGFjdEtleSwgIiIpOw0KICAgICAgICAgICAgICAgIHBheWxvYWQgPSBtZXNzYWdlT2JqZWN0LT5HZXROYW1lZFN0cmluZyhwYXlsb2FkS2V5LCAiIik7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBjb252ZXJzYXRpb25fLT5hZGRNZXNzYWdlKGRhdGUsIGZyb21Db250YWN0LCBwYXlsb2FkKTsNCiAgICAgICAgfQ0KICAgIH0NCn0NCg0Kdm9pZA0KQ29udGFjdDo6c2F2ZUNvbnZlcnNhdGlvblRvRmlsZSgpDQp7DQogICAgU3RvcmFnZUZvbGRlcl4gbG9jYWxmb2xkZXIgPSBBcHBsaWNhdGlvbkRhdGE6OkN1cnJlbnQtPkxvY2FsRm9sZGVyOw0KICAgIFN0cmluZ14gbWVzc2FnZXNGaWxlID0gbG9jYWxmb2xkZXItPlBhdGggKyAiXFwiICsgIi5tZXNzYWdlc1xcIiArIEdVSURfICsgIi5qc29uIjsNCg0KICAgIGlmIChyaW5nOjpmaWxldXRpbHM6OnJlY3Vyc2l2ZV9ta2RpcihVdGlsczo6dG9TdHJpbmcobG9jYWxmb2xkZXItPlBhdGggKyAiXFwiICsgIi5tZXNzYWdlc1xcIikuY19zdHIoKSkpIHsNCiAgICAgICAgc3RkOjpvZnN0cmVhbSBmaWxlKFV0aWxzOjp0b1N0cmluZyhtZXNzYWdlc0ZpbGUpLmNfc3RyKCkpOw0KICAgICAgICBpZiAoZmlsZS5pc19vcGVuKCkpDQogICAgICAgIHsNCiAgICAgICAgICAgIGZpbGUgPDwgVXRpbHM6OnRvU3RyaW5nKFN0cmluZ2lmeUNvbnZlcnNhdGlvbigpKTsNCiAgICAgICAgICAgIGZpbGUuY2xvc2UoKTsNCiAgICAgICAgfQ0KICAgIH0NCn0NCg0KDQoNCg0K