LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICogQ29weXJpZ2h0IChDKSAyMDE2IGJ5IFNhdm9pci1mYWlyZSBMaW51eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KICogQXV0aG9yOiBK5GdlciBOaWNvbGFzIDxuaWNvbGFzLmphZ2VyQHNhdm9pcmZhaXJlbGludXguY29tPiAgICAgICAgICAgICAgKg0KICogQXV0aG9yOiBUcmFjenlrIEFuZHJlYXMgPGFuZHJlYXMudHJhY3p5a0BzYXZvaXJmYWlyZWxpbnV4LmNvbT4gICAgICAgICAgKg0KICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICAgKg0KICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICAgKg0KICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgICAgICAgKg0KICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICAgKg0KICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICAgKg0KICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICAgKg0KICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICAgKg0KICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAgKg0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KDQojcHJhZ21hIG9uY2UNCg0KdXNpbmcgbmFtZXNwYWNlIFBsYXRmb3JtOw0KdXNpbmcgbmFtZXNwYWNlIFdpbmRvd3M6OlVJOjpYYW1sOjpEYXRhOw0KdXNpbmcgbmFtZXNwYWNlIFBsYXRmb3JtOjpDb2xsZWN0aW9uczsNCg0KbmFtZXNwYWNlIFJpbmdDbGllbnRVV1ANCnsNCnB1YmxpYyByZWYgY2xhc3MgQWNjb3VudCBzZWFsZWQgOiBwdWJsaWMgSU5vdGlmeVByb3BlcnR5Q2hhbmdlZA0Kew0KcHVibGljOg0KICAgIEFjY291bnQoU3RyaW5nXiBuYW1lLCBTdHJpbmdeIHJpbmdJRCwgU3RyaW5nXiBhY2NvdW50VHlwZSwgU3RyaW5nXiBhY2NvdW50SUQsIFN0cmluZ14gZGV2aWNlSWQsIGJvb2wgdXBucFN0YXRlKTsNCg0KICAgIHZpcnR1YWwgZXZlbnQgUHJvcGVydHlDaGFuZ2VkRXZlbnRIYW5kbGVyXiBQcm9wZXJ0eUNoYW5nZWQ7DQoNCiAgICBwcm9wZXJ0eSBTdHJpbmdeIG5hbWVfDQogICAgew0KICAgICAgICBTdHJpbmdeIGdldCgpIHsNCiAgICAgICAgICAgIHJldHVybiBuYW1lX187DQogICAgICAgIH0NCiAgICAgICAgdm9pZCBzZXQoU3RyaW5nXiB2YWx1ZSkgew0KICAgICAgICAgICAgbmFtZV9fID0gdmFsdWU7DQogICAgICAgICAgICBQcm9wZXJ0eUNoYW5nZWQodGhpcywgcmVmIG5ldyBQcm9wZXJ0eUNoYW5nZWRFdmVudEFyZ3MoIm5hbWVfIikpOw0KICAgICAgICB9DQogICAgfQ0KICAgIHByb3BlcnR5IFN0cmluZ14gcmluZ0lEXzsNCiAgICBwcm9wZXJ0eSBTdHJpbmdeIGFjY291bnRUeXBlXzsgLy8gcmVmYWN0byA6IGNyZWF0ZSBhIGVudW0gYWNjb3VudFR5cGUNCiAgICBwcm9wZXJ0eSBTdHJpbmdeIGFjY291bnRJRF87DQogICAgcHJvcGVydHkgU3RyaW5nXiBfZGV2aWNlSWQ7DQogICAgcHJvcGVydHkgV2luZG93czo6Rm91bmRhdGlvbjo6Q29sbGVjdGlvbnM6OklWZWN0b3I8U3RyaW5nXj5eIF9kZXZpY2VzSWRMaXN0IHsNCiAgICAgICAgV2luZG93czo6Rm91bmRhdGlvbjo6Q29sbGVjdGlvbnM6OklWZWN0b3I8U3RyaW5nXj5eIGdldCgpIHsNCiAgICAgICAgICAgIHJldHVybiBkZXZpY2VzSWRMaXN0XzsNCiAgICAgICAgfQ0KICAgICAgICB2b2lkIHNldChXaW5kb3dzOjpGb3VuZGF0aW9uOjpDb2xsZWN0aW9uczo6SVZlY3RvcjxTdHJpbmdePl4gdmFsdWUpIHsNCiAgICAgICAgICAgIGRldmljZXNJZExpc3RfID0gdmFsdWU7DQogICAgICAgIH0NCiAgICB9Ow0KICAgIHByb3BlcnR5IGJvb2wgX3VwbnBTdGF0ZTsNCg0KcHJvdGVjdGVkOg0KICAgIHZvaWQgTm90aWZ5UHJvcGVydHlDaGFuZ2VkKFN0cmluZ14gcHJvcGVydHlOYW1lKTsNCg0KcHJpdmF0ZToNCiAgICBXaW5kb3dzOjpGb3VuZGF0aW9uOjpDb2xsZWN0aW9uczo6SVZlY3RvcjxTdHJpbmdePl4gZGV2aWNlc0lkTGlzdF87DQogICAgU3RyaW5nXiBuYW1lX187DQoNCn07DQp9DQoNCg==