LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIENvcHlyaWdodCAoQykgMjAxNiBieSBTYXZvaXItZmFpcmUgTGludXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCiogQXV0aG9yOiBK5GdlciBOaWNvbGFzIDxuaWNvbGFzLmphZ2VyQHNhdm9pcmZhaXJlbGludXguY29tPiAgICAgICAgICAgICAgKg0KKiBBdXRob3I6IFRyYWN6eWsgQW5kcmVhcyA8YW5kcmVhcy50cmFjenlrQHNhdm9pcmZhaXJlbGludXguY29tPiAgICAgICAgICAqDQoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCiogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICAgKg0KKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgICAqDQoqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAgICoNCiogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQoqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAgICoNCiogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICAgKg0KKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgICAqDQoqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgICAqDQoqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgICoNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KI3ByYWdtYSBvbmNlDQoNCiNpbmNsdWRlICJWaWRlb1BhZ2UuZy5oIg0KI2luY2x1ZGUgIk1lc3NhZ2VUZXh0UGFnZS54YW1sLmgiDQoNCnVzaW5nIG5hbWVzcGFjZSBQbGF0Zm9ybTsNCnVzaW5nIG5hbWVzcGFjZSBDb25jdXJyZW5jeTsNCnVzaW5nIG5hbWVzcGFjZSBXaW5kb3dzOjpNZWRpYTsNCnVzaW5nIG5hbWVzcGFjZSBXaW5kb3dzOjpNZWRpYTo6Q2FwdHVyZTsNCnVzaW5nIG5hbWVzcGFjZSBXaW5kb3dzOjpHcmFwaGljczo6SW1hZ2luZzsNCnVzaW5nIG5hbWVzcGFjZSBXaW5kb3dzOjpVSTo6WGFtbDo6TmF2aWdhdGlvbjsNCnVzaW5nIG5hbWVzcGFjZSBXaW5kb3dzOjpVSTo6WGFtbDsNCnVzaW5nIG5hbWVzcGFjZSBXaW5kb3dzOjpVSTo6WGFtbDo6TWVkaWE7DQp1c2luZyBuYW1lc3BhY2UgV2luZG93czo6QXBwbGljYXRpb25Nb2RlbDo6Q29yZTsNCnVzaW5nIG5hbWVzcGFjZSBXaW5kb3dzOjpEZXZpY2VzOjpFbnVtZXJhdGlvbjsNCnVzaW5nIG5hbWVzcGFjZSBXaW5kb3dzOjpVSTo6WGFtbDo6SW5wdXQ7DQoNCm5hbWVzcGFjZSBSaW5nQ2xpZW50VVdQDQp7DQovKiBkZWxlZ2F0ZSAqLw0KZGVsZWdhdGUgdm9pZCBQcmVzc0hhbmdVcENhbGwoKTsNCmRlbGVnYXRlIHZvaWQgUGF1c2VDYWxsKCk7DQpkZWxlZ2F0ZSB2b2lkIENoYXRQYW5lbENhbGwoKTsgLy8gdXNlZCA/DQpkZWxlZ2F0ZSB2b2lkIEFkZENvbnRhY3RDYWxsKCk7DQpkZWxlZ2F0ZSB2b2lkIFRyYW5zZmVyQ2FsbCgpOw0KZGVsZWdhdGUgdm9pZCBTd2l0Y2hNaWNyb3Bob25lU3RhdGVDYWxsKCk7DQpkZWxlZ2F0ZSB2b2lkIFN3aXRjaFZpZGVvU3RhdGVDYWxsKCk7DQpkZWxlZ2F0ZSB2b2lkIFJlY2NvcmRWaWRlb0NhbGwoKTsNCmRlbGVnYXRlIHZvaWQgUXVhbGl0eVZpZGVvTGV2ZWxDYWxsKCk7DQoNCm5hbWVzcGFjZSBWaWV3cw0Kew0KDQpwdWJsaWMgcmVmIGNsYXNzIFZpZGVvUGFnZSBzZWFsZWQNCnsNCnB1YmxpYzoNCiAgICBWaWRlb1BhZ2UoKTsNCg0KICAgIHZvaWQgdXBkYXRlUGFnZUNvbnRlbnQoKTsNCiAgICB2b2lkIFNldEJ1ZmZlcih1aW50OF90KiBidWYsIGludCB3aWR0aCwgaW50IGhlaWdodCk7DQoNCiAgICBwcm9wZXJ0eSBib29sIGJhckZhZGluZyB7DQogICAgICAgIGJvb2wgZ2V0KCl7IHJldHVybiBiYXJGYWRpbmdfOyB9DQogICAgICAgIHZvaWQgc2V0KGJvb2wgdmFsdWUpIHsgYmFyRmFkaW5nXyA9IHZhbHVlOyB9DQogICAgfQ0KDQogICAgdm9pZCBzY3JvbGxEb3duKCk7DQogICAgdm9pZCBzY3JlZW5WaWRlbyhib29sIHN0YXRlKTsNCg0KcHJvdGVjdGVkOg0KICAgIHZpcnR1YWwgdm9pZCBPbk5hdmlnYXRlZFRvKFdpbmRvd3M6OlVJOjpYYW1sOjpOYXZpZ2F0aW9uOjpOYXZpZ2F0aW9uRXZlbnRBcmdzXiBlKSBvdmVycmlkZTsNCg0KaW50ZXJuYWw6DQogICAgLyogZXZlbnRzICovDQogICAgZXZlbnQgUHJlc3NIYW5nVXBDYWxsXiBwcmVzc0hhbmdVcENhbGw7DQogICAgZXZlbnQgUGF1c2VDYWxsXiBwYXVzZUNhbGw7DQogICAgZXZlbnQgQ2hhdFBhbmVsQ2FsbF4gY2hhdFBhbmVsQ2FsbDsNCiAgICBldmVudCBBZGRDb250YWN0Q2FsbF4gYWRkQ29udGFjdENhbGw7DQogICAgZXZlbnQgVHJhbnNmZXJDYWxsXiB0cmFuc2ZlckNhbGw7DQogICAgZXZlbnQgU3dpdGNoTWljcm9waG9uZVN0YXRlQ2FsbF4gc3dpdGNoTWljcm9waG9uZVN0YXRlQ2FsbDsNCiAgICBldmVudCBTd2l0Y2hWaWRlb1N0YXRlQ2FsbF4gc3dpdGNoVmlkZW9TdGF0ZUNhbGw7DQogICAgZXZlbnQgUmVjY29yZFZpZGVvQ2FsbF4gcmVjY29yZFZpZGVvQ2FsbDsNCiAgICBldmVudCBRdWFsaXR5VmlkZW9MZXZlbENhbGxeIHF1YWxpdHlWaWRlb0xldmVsQ2FsbDsNCg0KcHJpdmF0ZToNCiAgICBib29sIGJhckZhZGluZ187DQogICAgU3RyaW5nXiBsYXN0TWVzc2FnZVRleHQ7DQogICAgYm9vbCBzaG93U21hcnRJbmZvOw0KICAgIEV2ZW50UmVnaXN0cmF0aW9uVG9rZW4gdmlkZW9QYWdlX0lucHV0SGFuZGxlclRva2VuOw0KDQogICAgRGlzcGF0Y2hlclRpbWVyXiBjYWxsVGltZXJVcGRhdGVyOw0KDQogICAgVmlkZW9GcmFtZV4gdmlkZW9GcmFtZTsNCiAgICBTb2Z0d2FyZUJpdG1hcF4gc29mdHdhcmVCaXRtYXA7DQogICAgVmlkZW86OlZpZGVvUmVuZGVyZXJXcmFwcGVyXiBjdXJyZW50UmVuZGVyZXJXcmFwcGVyOw0KDQogICAgLy8gRm9yIHRyYW5zZm9ybWluZyB0aGUgcHJldmlldyBpbWFnZQ0KICAgIGRvdWJsZSB1c2VyUHJldmlld0hlaWdodE1vZGlmaWVyID0gMC4wOw0KICAgIGRvdWJsZSBsYXN0VXNlclByZXZpZXdIZWlnaHRNb2RpZmllcjsNCiAgICBib29sIGlzTW92aW5nUHJldmlldyA9IGZhbHNlOw0KICAgIGJvb2wgaXNSZXNpemluZ1ByZXZpZXcgPSBmYWxzZTsNCiAgICBib29sIGlzSG92ZXJpbmdPblJlc2l6ZXIgPSBmYWxzZTsNCiAgICBlbnVtIGNsYXNzIFF1YWRyYW50IHsNCiAgICAgICAgU0UsIFNXLCBOVywgTkUNCiAgICB9IHF1YWRyYW50ID0gUXVhZHJhbnQ6OlNFLCBsYXN0UXVhZHJhbnQgPSBRdWFkcmFudDo6U0U7DQogICAgVHJhbnNmb3JtR3JvdXBeIFByZXZpZXdJbWFnZV90cmFuc2Zvcm1zOw0KICAgIE1hdHJpeFRyYW5zZm9ybV4gUHJldmlld0ltYWdlX3ByZXZpb3VzVHJhbnNmb3JtOw0KICAgIENvbXBvc2l0ZVRyYW5zZm9ybV4gUHJldmlld0ltYWdlX2RlbHRhVHJhbnNmb3JtOw0KDQogICAgLy8gQ2hhdCBwYW5lbCB0cmFuc2Zvcm1hdGlvbnMNCiAgICBib29sIGlzQ2hhdFBhbmVsT3BlbiA9IGZhbHNlOw0KICAgIGJvb2wgaXNSZXNpemluZ0NoYXRQYW5lbCA9IGZhbHNlOw0KICAgIGRvdWJsZSBjaGF0UGFuZWxTaXplID0gMTc2Ow0KICAgIGRvdWJsZSBsYXN0Y2hhdFBhbmVsU2l6ZTsNCiAgICBlbnVtIGNsYXNzIE9yaWVudGF0aW9uIHsNCiAgICAgICAgSG9yaXpvbnRhbCwgVmVydGljYWwNCiAgICB9IGNodEJveE9yaWVudGF0aW9uID0gT3JpZW50YXRpb246OlZlcnRpY2FsOw0KDQogICAgQ29uY3VycmVuY3k6OnRhc2s8dm9pZD4gV3JpdGVGcmFtZUFzU29mdHdhcmVCaXRtYXBBc3luYyhTdHJpbmdeIGlkLCB1aW50OF90KiBidWYsIGludCB3aWR0aCwgaW50IGhlaWdodCk7DQogICAgdm9pZCBfc2VuZEJ0bl9fQ2xpY2soUGxhdGZvcm06Ok9iamVjdF4gc2VuZGVyLCBSb3V0ZWRFdmVudEFyZ3NeIGUpOw0KICAgIHZvaWQgc2VuZE1lc3NhZ2UoKTsNCiAgICB2b2lkIEJ1dHRvbl9DbGljayhPYmplY3ReIHNlbmRlciwgUm91dGVkRXZlbnRBcmdzXiBlKTsNCiAgICB2b2lkIF9idG5DYW5jZWxfX0NsaWNrKE9iamVjdF4gc2VuZGVyLCBSb3V0ZWRFdmVudEFyZ3NeIGUpOw0KICAgIHZvaWQgX2J0bkhhbmdVcF9fVGFwcGVkKE9iamVjdF4gc2VuZGVyLCBUYXBwZWRSb3V0ZWRFdmVudEFyZ3NeIGUpOw0KICAgIHZvaWQgX2J0blBhdXNlX19UYXBwZWQoT2JqZWN0XiBzZW5kZXIsIFRhcHBlZFJvdXRlZEV2ZW50QXJnc14gZSk7DQogICAgdm9pZCBfYnRuQ2hhdF9fVGFwcGVkKE9iamVjdF4gc2VuZGVyLCBUYXBwZWRSb3V0ZWRFdmVudEFyZ3NeIGUpOw0KICAgIHZvaWQgX2J0bkFkZEZyaWVuZF9fVGFwcGVkKE9iamVjdF4gc2VuZGVyLCBUYXBwZWRSb3V0ZWRFdmVudEFyZ3NeIGUpOw0KICAgIHZvaWQgX2J0blN3aXRjaF9fVGFwcGVkKE9iamVjdF4gc2VuZGVyLCBUYXBwZWRSb3V0ZWRFdmVudEFyZ3NeIGUpOw0KICAgIHZvaWQgX2J0bk1pY3JvcGhvbmVfX1RhcHBlZChPYmplY3ReIHNlbmRlciwgVGFwcGVkUm91dGVkRXZlbnRBcmdzXiBlKTsNCiAgICB2b2lkIF9idG5NZW1vX19UYXBwZWQoT2JqZWN0XiBzZW5kZXIsIFRhcHBlZFJvdXRlZEV2ZW50QXJnc14gZSk7DQogICAgdm9pZCBfYnRuSFFfX1RhcHBlZChPYmplY3ReIHNlbmRlciwgVGFwcGVkUm91dGVkRXZlbnRBcmdzXiBlKTsNCiAgICB2b2lkIF9idG5WaWRlb19fVGFwcGVkKE9iamVjdF4gc2VuZGVyLCBUYXBwZWRSb3V0ZWRFdmVudEFyZ3NeIGUpOw0KICAgIHZvaWQgX3ZpZGVvQ29udHJvbF9fUG9pbnRlck1vdmVkKE9iamVjdF4gc2VuZGVyLCBQb2ludGVyUm91dGVkRXZlbnRBcmdzXiBlKTsNCiAgICB2b2lkIGJ0bkFueV9lbnRlcmVkKE9iamVjdF4gc2VuZGVyLCBQb2ludGVyUm91dGVkRXZlbnRBcmdzXiBlKTsNCiAgICB2b2lkIGJ0bkFueV9leGl0ZWQoT2JqZWN0XiBzZW5kZXIsIFBvaW50ZXJSb3V0ZWRFdmVudEFyZ3NeIGUpOw0KICAgIHZvaWQgX2J0blZpZGVvX19DbGljayhPYmplY3ReIHNlbmRlciwgUm91dGVkRXZlbnRBcmdzXiBlKTsNCiAgICB2b2lkIF9idG5NaWNyb3Bob25lX19DbGljayhPYmplY3ReIHNlbmRlciwgUm91dGVkRXZlbnRBcmdzXiBlKTsNCiAgICB2b2lkIEluY29taW5nVmlkZW9JbWFnZV9Eb3VibGVUYXBwZWQoT2JqZWN0XiBzZW5kZXIsIERvdWJsZVRhcHBlZFJvdXRlZEV2ZW50QXJnc14gZSk7DQogICAgdm9pZCBPbmluY29taW5nTWVzc2FnZShTdHJpbmcgXmNhbGxJZCwgU3RyaW5nIF5wYXlsb2FkKTsNCiAgICB2b2lkIE9uaW5jb21pbmdWaWRlb011dGVkKFN0cmluZyBeY2FsbElkLCBib29sIHN0YXRlKTsNCiAgICB2b2lkIE9uc21hcnRJbmZvVXBkYXRlZChjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+JiBpbmZvKTsNCiAgICB2b2lkIE9uc3RhcnRQcmV2aWV3aW5nKCk7DQogICAgdm9pZCBPbnN0b3BQcmV2aWV3aW5nKCk7DQogICAgdm9pZCBPbmF1ZGlvTXV0ZWQoY29uc3Qgc3RkOjpzdHJpbmcgJmNhbGxJZCwgYm9vbCBzdGF0ZSk7DQogICAgdm9pZCBPbnZpZGVvTXV0ZWQoY29uc3Qgc3RkOjpzdHJpbmcgJmNhbGxJZCwgYm9vbCBzdGF0ZSk7DQogICAgdm9pZCBvcGVuQ2hhdFBhbmVsKCk7DQogICAgdm9pZCBjbG9zZUNoYXRQYW5lbCgpOw0KICAgIHZvaWQgcmVzaXplQ2hhdFBhbmVsKCk7DQogICAgdm9pZCBjb21wdXRlUXVhZHJhbnQoKTsNCiAgICB2b2lkIGFycmFuZ2VSZXNpemVyKCk7DQogICAgdm9pZCBhbmNob3JQcmV2aWV3KCk7DQogICAgdm9pZCB1cGRhdGVQcmV2aWV3RnJhbWVEaW1lbnNpb25zKCk7DQogICAgdm9pZCBJbml0TWFuaXB1bGF0aW9uVHJhbnNmb3JtcygpOw0KICAgIHZvaWQgdXBkYXRlQ2FsbFRpbWVyKE9iamVjdF4gc2VuZGVyLCBPYmplY3ReIGUpOw0KICAgIHZvaWQgUHJldmlld0ltYWdlX01hbmlwdWxhdGlvbkRlbHRhKE9iamVjdF4gc2VuZGVyLCBNYW5pcHVsYXRpb25EZWx0YVJvdXRlZEV2ZW50QXJnc14gZSk7DQogICAgdm9pZCBQcmV2aWV3SW1hZ2VfTWFuaXB1bGF0aW9uQ29tcGxldGVkKE9iamVjdF4gc2VuZGVyLCBNYW5pcHVsYXRpb25Db21wbGV0ZWRSb3V0ZWRFdmVudEFyZ3NeIGUpOw0KICAgIHZvaWQgUHJldmlld0ltYWdlUmVzaXplcl9NYW5pcHVsYXRpb25EZWx0YShPYmplY3ReIHNlbmRlciwgTWFuaXB1bGF0aW9uRGVsdGFSb3V0ZWRFdmVudEFyZ3NeIGUpOw0KICAgIHZvaWQgUHJldmlld0ltYWdlUmVzaXplcl9NYW5pcHVsYXRpb25Db21wbGV0ZWQoT2JqZWN0XiBzZW5kZXIsIE1hbmlwdWxhdGlvbkNvbXBsZXRlZFJvdXRlZEV2ZW50QXJnc14gZSk7DQogICAgdm9pZCBfY2hhdFBhbmVsUmVzaXplQmFyR3JpZF9fTWFuaXB1bGF0aW9uRGVsdGEoT2JqZWN0XiBzZW5kZXIsIE1hbmlwdWxhdGlvbkRlbHRhUm91dGVkRXZlbnRBcmdzXiBlKTsNCiAgICB2b2lkIF9jaGF0UGFuZWxSZXNpemVCYXJHcmlkX19NYW5pcHVsYXRpb25Db21wbGV0ZWQoT2JqZWN0XiBzZW5kZXIsIE1hbmlwdWxhdGlvbkNvbXBsZXRlZFJvdXRlZEV2ZW50QXJnc14gZSk7DQogICAgdm9pZCBQcmV2aWV3SW1hZ2VfUG9pbnRlclJlbGVhc2VkKE9iamVjdF4gc2VuZGVyLCBQb2ludGVyUm91dGVkRXZlbnRBcmdzXiBlKTsNCiAgICB2b2lkIFByZXZpZXdJbWFnZVJlc2l6ZXJfUG9pbnRlckVudGVyZWQoT2JqZWN0XiBzZW5kZXIsIFBvaW50ZXJSb3V0ZWRFdmVudEFyZ3NeIGUpOw0KICAgIHZvaWQgUHJldmlld0ltYWdlUmVzaXplcl9Qb2ludGVyRXhpdGVkKE9iamVjdF4gc2VuZGVyLCBQb2ludGVyUm91dGVkRXZlbnRBcmdzXiBlKTsNCiAgICB2b2lkIFByZXZpZXdJbWFnZVJlc2l6ZXJfUHJlc3NlZChPYmplY3ReIHNlbmRlciwgUG9pbnRlclJvdXRlZEV2ZW50QXJnc14gZSk7DQogICAgdm9pZCBfYnRuVG9nZ2xlT3JpZW50YXRpb25fX1RhcHBlZChQbGF0Zm9ybTo6T2JqZWN0XiBzZW5kZXIsIFdpbmRvd3M6OlVJOjpYYW1sOjpJbnB1dDo6VGFwcGVkUm91dGVkRXZlbnRBcmdzXiBlKTsNCiAgICB2b2lkIFByZXZpZXdJbWFnZVJlc2l6ZXJfUG9pbnRlclJlbGVhc2VkKFBsYXRmb3JtOjpPYmplY3ReIHNlbmRlciwgV2luZG93czo6VUk6OlhhbWw6OklucHV0OjpQb2ludGVyUm91dGVkRXZlbnRBcmdzXiBlKTsNCiAgICB2b2lkIF9jaGF0UGFuZWxSZXNpemVCYXJHcmlkX19Qb2ludGVyRW50ZXJlZChQbGF0Zm9ybTo6T2JqZWN0XiBzZW5kZXIsIFdpbmRvd3M6OlVJOjpYYW1sOjpJbnB1dDo6UG9pbnRlclJvdXRlZEV2ZW50QXJnc14gZSk7DQogICAgdm9pZCBfY2hhdFBhbmVsUmVzaXplQmFyR3JpZF9fUG9pbnRlckV4aXRlZChQbGF0Zm9ybTo6T2JqZWN0XiBzZW5kZXIsIFdpbmRvd3M6OlVJOjpYYW1sOjpJbnB1dDo6UG9pbnRlclJvdXRlZEV2ZW50QXJnc14gZSk7DQogICAgdm9pZCBfY2hhdFBhbmVsUmVzaXplQmFyR3JpZF9fUG9pbnRlclByZXNzZWQoUGxhdGZvcm06Ok9iamVjdF4gc2VuZGVyLCBXaW5kb3dzOjpVSTo6WGFtbDo6SW5wdXQ6OlBvaW50ZXJSb3V0ZWRFdmVudEFyZ3NeIGUpOw0KICAgIHZvaWQgX2NoYXRQYW5lbFJlc2l6ZUJhckdyaWRfX1BvaW50ZXJSZWxlYXNlZChQbGF0Zm9ybTo6T2JqZWN0XiBzZW5kZXIsIFdpbmRvd3M6OlVJOjpYYW1sOjpJbnB1dDo6UG9pbnRlclJvdXRlZEV2ZW50QXJnc14gZSk7DQogICAgdm9pZCBfdmlkZW9Db250ZW50X19TaXplQ2hhbmdlZChQbGF0Zm9ybTo6T2JqZWN0XiBzZW5kZXIsIFdpbmRvd3M6OlVJOjpYYW1sOjpTaXplQ2hhbmdlZEV2ZW50QXJnc14gZSk7DQogICAgdm9pZCBfbWVzc2FnZVRleHRCb3hfX1RleHRDaGFuZ2VkKFBsYXRmb3JtOjpPYmplY3ReIHNlbmRlciwgV2luZG93czo6VUk6OlhhbWw6OkNvbnRyb2xzOjpUZXh0Q2hhbmdlZEV2ZW50QXJnc14gZSk7DQogICAgdm9pZCBfY29yZXdpbmRvd19fS2V5RG93bihDb3JlV2luZG93XiBzZW5kZXIsIEtleUV2ZW50QXJnc14gZSk7DQp9Ow0KfQ0KfQ==