ZGlmZiAtLWdpdCBhL3BsdWdpbnMvcmVxL29yZy5lY2xpcHNlLnBhcHlydXMucGRwNGVuZy5yZXEuZ2RwcmFuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3BhcHlydXMvcGRwNGVuZy9yZXEvZ2RwcmFuYW5hbHlzaXMvYXBpL0lSZXF1aXJlbWVudEdlbmVyYXRvci5qYXZhIGIvcGx1Z2lucy9yZXEvb3JnLmVjbGlwc2UucGFweXJ1cy5wZHA0ZW5nLnJlcS5nZHByYW5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcGFweXJ1cy9wZHA0ZW5nL3JlcS9nZHByYW5hbmFseXNpcy9hcGkvSVJlcXVpcmVtZW50R2VuZXJhdG9yLmphdmEKaW5kZXggM2Y2YmI3Zi4uMDMxOGNhNiAxMDA2NDQKLS0tIGEvcGx1Z2lucy9yZXEvb3JnLmVjbGlwc2UucGFweXJ1cy5wZHA0ZW5nLnJlcS5nZHByYW5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcGFweXJ1cy9wZHA0ZW5nL3JlcS9nZHByYW5hbmFseXNpcy9hcGkvSVJlcXVpcmVtZW50R2VuZXJhdG9yLmphdmEKKysrIGIvcGx1Z2lucy9yZXEvb3JnLmVjbGlwc2UucGFweXJ1cy5wZHA0ZW5nLnJlcS5nZHByYW5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcGFweXJ1cy9wZHA0ZW5nL3JlcS9nZHByYW5hbmFseXNpcy9hcGkvSVJlcXVpcmVtZW50R2VuZXJhdG9yLmphdmEKQEAgLTI5LDEwICsyOSwyMSBAQAogICogQHBhcmFtIG93bmVyCiAgKiBAcmV0dXJuCiAgKi8KKwkvL2FydGljbGUgNQogCXB1YmxpYyBDb21tYW5kIGdlbmVyYXRlQXJ0aWNsZTUxYShUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBkb21haW4sIG9yZy5lY2xpcHNlLnVtbDIudW1sLlBhY2thZ2Ugb3duZXIpOwogCXB1YmxpYyBDb21tYW5kIGdlbmVyYXRlQXJ0aWNsZTUxYihUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBkb21haW4sIG9yZy5lY2xpcHNlLnVtbDIudW1sLlBhY2thZ2Ugb3duZXIpOwogCXB1YmxpYyBDb21tYW5kIGdlbmVyYXRlQXJ0aWNsZTUxYyhUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBkb21haW4sIG9yZy5lY2xpcHNlLnVtbDIudW1sLlBhY2thZ2Ugb3duZXIpOwogCXB1YmxpYyBDb21tYW5kIGdlbmVyYXRlQXJ0aWNsZTUxZChUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBkb21haW4sIG9yZy5lY2xpcHNlLnVtbDIudW1sLlBhY2thZ2Ugb3duZXIpOwogCXB1YmxpYyBDb21tYW5kIGdlbmVyYXRlQXJ0aWNsZTUxZShUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBkb21haW4sIG9yZy5lY2xpcHNlLnVtbDIudW1sLlBhY2thZ2Ugb3duZXIpOwogCXB1YmxpYyBDb21tYW5kIGdlbmVyYXRlQXJ0aWNsZTUxZihUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBkb21haW4sIG9yZy5lY2xpcHNlLnVtbDIudW1sLlBhY2thZ2Ugb3duZXIpOworCQorCS8vYXJ0aWNsZSA2CisJcHVibGljIENvbW1hbmQgZ2VuZXJhdGVBcnRpY2xlNjFhKFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGRvbWFpbiwgb3JnLmVjbGlwc2UudW1sMi51bWwuUGFja2FnZSBvd25lcik7CisJcHVibGljIENvbW1hbmQgZ2VuZXJhdGVBcnRpY2xlNjFiKFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGRvbWFpbiwgb3JnLmVjbGlwc2UudW1sMi51bWwuUGFja2FnZSBvd25lcik7CisJcHVibGljIENvbW1hbmQgZ2VuZXJhdGVBcnRpY2xlNjFjKFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGRvbWFpbiwgb3JnLmVjbGlwc2UudW1sMi51bWwuUGFja2FnZSBvd25lcik7CisJcHVibGljIENvbW1hbmQgZ2VuZXJhdGVBcnRpY2xlNjFkKFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGRvbWFpbiwgb3JnLmVjbGlwc2UudW1sMi51bWwuUGFja2FnZSBvd25lcik7CisJcHVibGljIENvbW1hbmQgZ2VuZXJhdGVBcnRpY2xlNjFlKFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGRvbWFpbiwgb3JnLmVjbGlwc2UudW1sMi51bWwuUGFja2FnZSBvd25lcik7CisJcHVibGljIENvbW1hbmQgZ2VuZXJhdGVBcnRpY2xlNjFmKFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGRvbWFpbiwgb3JnLmVjbGlwc2UudW1sMi51bWwuUGFja2FnZSBvd25lcik7CisJcHVibGljIENvbW1hbmQgZ2VuZXJhdGVBcnRpY2xlNjQoVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZG9tYWluLCBvcmcuZWNsaXBzZS51bWwyLnVtbC5QYWNrYWdlIG93bmVyKTsKKwkKIH0KZGlmZiAtLWdpdCBhL3BsdWdpbnMvcmVxL29yZy5lY2xpcHNlLnBhcHlydXMucGRwNGVuZy5yZXEuZ2RwcmFuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3BhcHlydXMvcGRwNGVuZy9yZXEvZ2RwcmFuYW5hbHlzaXMvYXBpL1JlcXVpcmVtZW50R2VuZXJhdG9yLmphdmEgYi9wbHVnaW5zL3JlcS9vcmcuZWNsaXBzZS5wYXB5cnVzLnBkcDRlbmcucmVxLmdkcHJhbmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9wYXB5cnVzL3BkcDRlbmcvcmVxL2dkcHJhbmFuYWx5c2lzL2FwaS9SZXF1aXJlbWVudEdlbmVyYXRvci5qYXZhCmluZGV4IDc1OWQwOGQuLmE1Y2FhNjMgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvcmVxL29yZy5lY2xpcHNlLnBhcHlydXMucGRwNGVuZy5yZXEuZ2RwcmFuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3BhcHlydXMvcGRwNGVuZy9yZXEvZ2RwcmFuYW5hbHlzaXMvYXBpL1JlcXVpcmVtZW50R2VuZXJhdG9yLmphdmEKKysrIGIvcGx1Z2lucy9yZXEvb3JnLmVjbGlwc2UucGFweXJ1cy5wZHA0ZW5nLnJlcS5nZHByYW5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcGFweXJ1cy9wZHA0ZW5nL3JlcS9nZHByYW5hbmFseXNpcy9hcGkvUmVxdWlyZW1lbnRHZW5lcmF0b3IuamF2YQpAQCAtNTQsNiArNTQsNDEgQEAKIAkJcmV0dXJuIGdlbmVyYXRvckltcGwuZ2VuZXJhdGVBcnRpY2xlNTFlKGRvbWFpbiwgb3duZXIpOwogCX0KIAorCUBPdmVycmlkZQorCXB1YmxpYyBDb21tYW5kIGdlbmVyYXRlQXJ0aWNsZTYxYShUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBkb21haW4sIFBhY2thZ2Ugb3duZXIpIHsKKwkJcmV0dXJuIGdlbmVyYXRvckltcGwuZ2VuZXJhdGVBcnRpY2xlNjFhKGRvbWFpbiwgb3duZXIpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBDb21tYW5kIGdlbmVyYXRlQXJ0aWNsZTYxYihUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBkb21haW4sIFBhY2thZ2Ugb3duZXIpIHsKKwkJcmV0dXJuIGdlbmVyYXRvckltcGwuZ2VuZXJhdGVBcnRpY2xlNjFiKGRvbWFpbiwgb3duZXIpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBDb21tYW5kIGdlbmVyYXRlQXJ0aWNsZTYxYyhUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBkb21haW4sIFBhY2thZ2Ugb3duZXIpIHsKKwkJcmV0dXJuIGdlbmVyYXRvckltcGwuZ2VuZXJhdGVBcnRpY2xlNjFjKGRvbWFpbiwgb3duZXIpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBDb21tYW5kIGdlbmVyYXRlQXJ0aWNsZTYxZChUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBkb21haW4sIFBhY2thZ2Ugb3duZXIpIHsKKwkJcmV0dXJuIGdlbmVyYXRvckltcGwuZ2VuZXJhdGVBcnRpY2xlNjFkKGRvbWFpbiwgb3duZXIpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBDb21tYW5kIGdlbmVyYXRlQXJ0aWNsZTYxZShUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBkb21haW4sIFBhY2thZ2Ugb3duZXIpIHsKKwkJcmV0dXJuIGdlbmVyYXRvckltcGwuZ2VuZXJhdGVBcnRpY2xlNjFlKGRvbWFpbiwgb3duZXIpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBDb21tYW5kIGdlbmVyYXRlQXJ0aWNsZTYxZihUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBkb21haW4sIFBhY2thZ2Ugb3duZXIpIHsKKwkJcmV0dXJuIGdlbmVyYXRvckltcGwuZ2VuZXJhdGVBcnRpY2xlNjFmKGRvbWFpbiwgb3duZXIpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBDb21tYW5kIGdlbmVyYXRlQXJ0aWNsZTY0KFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGRvbWFpbiwgUGFja2FnZSBvd25lcikgeworCQlyZXR1cm4gZ2VuZXJhdG9ySW1wbC5nZW5lcmF0ZUFydGljbGU2NChkb21haW4sIG93bmVyKTsKKwl9CisKIAkKIAogfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9yZXEvb3JnLmVjbGlwc2UucGFweXJ1cy5wZHA0ZW5nLnJlcS5nZHByYW5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcGRwNGVuZy9yZXEvZ2RwcmFuYW5hbHlzaXMvaW50ZXJuYWwvTGF3ZnVsUmVxdWlyZW1lbnRCeUNvbnNlbnRDcmVhdGVDb21tYW5kLmphdmEgYi9wbHVnaW5zL3JlcS9vcmcuZWNsaXBzZS5wYXB5cnVzLnBkcDRlbmcucmVxLmdkcHJhbmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9wZHA0ZW5nL3JlcS9nZHByYW5hbmFseXNpcy9pbnRlcm5hbC9MYXdmdWxSZXF1aXJlbWVudEJ5Q29uc2VudENyZWF0ZUNvbW1hbmQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGI3MjQ2Ci0tLSAvZGV2L251bGwKKysrIGIvcGx1Z2lucy9yZXEvb3JnLmVjbGlwc2UucGFweXJ1cy5wZHA0ZW5nLnJlcS5nZHByYW5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcGRwNGVuZy9yZXEvZ2RwcmFuYW5hbHlzaXMvaW50ZXJuYWwvTGF3ZnVsUmVxdWlyZW1lbnRCeUNvbnNlbnRDcmVhdGVDb21tYW5kLmphdmEKQEAgLTAsMCArMSwxNzMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKTIwMjAgQ0VBIExJU1QsIENvbW1pdHRlciBOYW1lLCBhbmQgb3RoZXJzLiAKKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiBDRUEgTElTVCAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICogUGF0cmljayBUZXNzaWVyIChDRUEgTElTVCkgUGF0cmljay50ZXNzaWVyQGNlYS5mciAKKyAqIEdhYnJpZWwgUGVkcm96YSAoQ0VBIExJU1QpIGdhYnJpZWwucGVkcm96YUBjZWEuZnIgCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnBkcDRlbmcucmVxLmdkcHJhbmFuYWx5c2lzLmludGVybmFsOworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlRyZWVJdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE5IENFQSBMSVNULgorICogCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgdGhlIHByb3BlcnR5IG9mIHRoZSBDRUEuIAorICogQW55IHVzZSBpcyBzdWJqZWN0IHRvIHNwZWNpZmljIGFncmVlbWVudCB3aXRoIHRoZSBDRUEuCisgKiBDb250cmlidXRvcnM6CisgKiAKKyAqIAkJUGF0cmljayBUZXNzaWVyIChDRUEgTElTVCkgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqIAorICovCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOworaW1wb3J0IG9yZy5lY2xpcHNlLnBhcHlydXMuc3lzbWwxNC5yZXF1aXJlbWVudHMuUmVxdWlyZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5QYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlVNTEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuVU1MUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC51dGlsLlVNTFV0aWw7CitpbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwudXRpbC5VTUxVdGlsLlN0ZXJlb3R5cGVBcHBsaWNhdGlvbkhlbHBlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnBhcHlydXMucGRwNGVuZy5jb21tb24ucHJvZmlsZS5wZHA0ZW5nQ29tbW9uR0RQUi5Db25zZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnBhcHlydXMucGRwNGVuZy5jb21tb24ucHJvZmlsZS5wZHA0ZW5nQ29tbW9uR0RQUi5EYXRhU3ViamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5wYXB5cnVzLnBkcDRlbmcuY29tbW9uLnByb2ZpbGUucGRwNGVuZ0NvbW1vbkdEUFIuUGVyc29uYWxEYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLnBhcHlydXMucGRwNGVuZy5jb21tb24ucHJvZmlsZS5wZHA0ZW5nQ29tbW9uR0RQUi5QdXJwb3NlOworaW1wb3J0IG9yZy5lY2xpcHNlLnBhcHlydXMucGRwNGVuZy5yZXEubWV0YXJlcS5HRFBSUmVxdWlyZW1lbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLnBhcHlydXMucGRwNGVuZy5yZXEucHJvZmlsZS5wZHA0ZW5nUmVxR0RQUi5wZHA0ZW5nUmVxR0RQUlBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UucGFweXJ1cy5wZHA0ZW5nLnJlcS5wcm9maWxlLnBkcDRlbmdSZXFHRFBSLlBlcnNvbmFsRGF0YVJlcXVpcmVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnBhcHlydXMucGRwNGVuZy5yZXEucHJvZmlsZS5wZHA0ZW5nUmVxR0RQUi5Qcm9jZXNzUmVxdWlyZW1lbnQ7CisKK3B1YmxpYyBjbGFzcyBMYXdmdWxSZXF1aXJlbWVudEJ5Q29uc2VudENyZWF0ZUNvbW1hbmQgZXh0ZW5kcyBCYXNpY0dEUFJSZXF1aXJlbWVudENyZWF0ZUNvbW1hbmQgeworCisJcHJpdmF0ZSBEYXRhU3ViamVjdCBkYXRhU3ViamVjdDsKKwlwdWJsaWMgTGF3ZnVsUmVxdWlyZW1lbnRCeUNvbnNlbnRDcmVhdGVDb21tYW5kKFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGRvbWFpbiwgRWxlbWVudCBvd25lciwgU3RyaW5nIGlkLCBTdHJpbmcgdGV4dCxQcm9jZXNzUmVxdWlyZW1lbnQgcHJvY2Vzc1JlcXVpcmVtZW50LCBEYXRhU3ViamVjdCBkYXRhU3ViamVjdCkgeworCQlzdXBlcihkb21haW4sIG93bmVyLCBpZCwgdGV4dCxwcm9jZXNzUmVxdWlyZW1lbnQpOworCQl0aGlzLmRhdGFTdWJqZWN0PSBkYXRhU3ViamVjdDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVSZXF1aXJlbWVudChQYWNrYWdlIG93bmVyLCBTdHJpbmcgaWQsIFN0cmluZyB0ZXh0KSB7CisJCVN0ZXJlb3R5cGVBcHBsaWNhdGlvbkhlbHBlciBzdGVyZW90eXBlQXBwbGljYXRpb25IZWxwZXIgPSBTdGVyZW90eXBlQXBwbGljYXRpb25IZWxwZXIuZ2V0SW5zdGFuY2UobnVsbCk7CisJCUdEUFJSZXF1aXJlbWVudHMgZ2RwclJyZXF1aWVtZW50PSBuZXcgR0RQUlJlcXVpcmVtZW50cygpOworCisJCUNsYXNzIGxhd2Z1bGxSZXEgPW51bGw7CisJCS8vMS4gbG9vayBmb3IgTGF3ZnVsUmVxdWlyZW1lbnQKKwkJbGF3ZnVsbFJlcSA9IGxvb2tGb3JMYXdGdWxsUmVxdWlyZW1lbnQob3duZXIsIGxhd2Z1bGxSZXEpOworCisKKwkJLy8yLiBjcmVhdGUgdGhlIHN1YiByZXF1aXJlbWVudAorCQlmb3IgKEl0ZXJhdG9yPENvbnNlbnQ+IGl0ZXJhdG9yQ29uc2VudCA9IGRhdGFTdWJqZWN0LmdldEdpdmVuQ29uc2VudCgpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yQ29uc2VudC5oYXNOZXh0KCk7KSB7CisJCQlDb25zZW50IGFDb25zZW50ID0gKENvbnNlbnQpIGl0ZXJhdG9yQ29uc2VudC5uZXh0KCk7CisJCQlmb3IgKEl0ZXJhdG9yPFB1cnBvc2U+IHB1cnBvc2VJdGVyYXRvciA9IGFDb25zZW50LmdldFB1cnBvc2UoKS5pdGVyYXRvcigpOyBwdXJwb3NlSXRlcmF0b3IuaGFzTmV4dCgpOykgeworCQkJCVB1cnBvc2UgYVB1cnBvc2UgPSAoUHVycG9zZSkgcHVycG9zZUl0ZXJhdG9yLm5leHQoKTsKKwkJCQlpZiggYVB1cnBvc2UuZ2V0UHJvY2Vzc2VzKCkuY29udGFpbnModGhpcy5wcm9jZXNzUmVxdWlyZW1lbnQpKSB7CisJCQkJCS8vMS4xIGNyZWF0ZSB0aGUgY2xhc3MKKwkJCQkJQ2xhc3MgcmVxdWlyZW1lbnRDbGFzcyA9VU1MRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ2xhc3MoKTsKKworCQkJCQkvLzIuMSBzZXQgdGhlIG93bmVyCisJCQkJCXNldFRoZU93bmVyKG93bmVyLCBsYXdmdWxsUmVxLCByZXF1aXJlbWVudENsYXNzKTsKKwkJCQkJLy8zLiBhcHBseSB0aGUgc2V0ZXJvdHlwZQorCQkJCQlzdGVyZW90eXBlQXBwbGljYXRpb25IZWxwZXIuYXBwbHlTdGVyZW90eXBlKHJlcXVpcmVtZW50Q2xhc3Msb3JnLmVjbGlwc2UucGFweXJ1cy5zeXNtbDE0LnJlcXVpcmVtZW50cy5SZXF1aXJlbWVudHNQYWNrYWdlLmVJTlNUQU5DRS5nZXRSZXF1aXJlbWVudCgpLG51bGwgKTsKKwkJCQkJUmVxdWlyZW1lbnQgcmVxU3RlcmVvdHlwZT0gKFJlcXVpcmVtZW50KVVNTFV0aWwuZ2V0U3RlcmVvdHlwZUFwcGxpY2F0aW9uKHJlcXVpcmVtZW50Q2xhc3MsIFJlcXVpcmVtZW50LmNsYXNzKTsKKwkJCQkJc3RlcmVvdHlwZUFwcGxpY2F0aW9uSGVscGVyLmFwcGx5U3RlcmVvdHlwZShyZXF1aXJlbWVudENsYXNzLHBkcDRlbmdSZXFHRFBSUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TGF3ZnVsQnlDb25zZW50KCksbnVsbCApOworCQkJCQlvcmcuZWNsaXBzZS5wYXB5cnVzLnBkcDRlbmcucmVxLnByb2ZpbGUucGRwNGVuZ1JlcUdEUFIuTGF3ZnVsQnlDb25zZW50IGxhd2Z1bFJieUNvbnNlbnQ9IChvcmcuZWNsaXBzZS5wYXB5cnVzLnBkcDRlbmcucmVxLnByb2ZpbGUucGRwNGVuZ1JlcUdEUFIuTGF3ZnVsQnlDb25zZW50KVVNTFV0aWwuZ2V0U3RlcmVvdHlwZUFwcGxpY2F0aW9uKHJlcXVpcmVtZW50Q2xhc3MsIG9yZy5lY2xpcHNlLnBhcHlydXMucGRwNGVuZy5yZXEucHJvZmlsZS5wZHA0ZW5nUmVxR0RQUi5MYXdmdWxCeUNvbnNlbnQuY2xhc3MpOworCQkJCQkvLzQuIHNldCBhdHRyaWJ1dGUgb2YgdGhlIGFwcGxpZWQgc3RlcmVvdHlwZQorCQkJCQlzZXRBdHRyaWJ1dGVBcHBsaWVkU3RlcmVvdHlwZShnZHByUnJlcXVpZW1lbnQsIGFDb25zZW50LCByZXFTdGVyZW90eXBlLCBsYXdmdWxSYnlDb25zZW50KTsKKwkJCQkJLy81LnNldCB0aGUgSUQKKwkJCQkJc2V0VGhlSUQoaWQsIGxhd2Z1bGxSZXEsIHJlcXVpcmVtZW50Q2xhc3MsIHJlcVN0ZXJlb3R5cGUpOworCisJCQkJfQorCisJCQl9CisKKwkJfQorCisKKwl9CisKKwlwcml2YXRlIHZvaWQgc2V0QXR0cmlidXRlQXBwbGllZFN0ZXJlb3R5cGUoR0RQUlJlcXVpcmVtZW50cyBnZHByUnJlcXVpZW1lbnQsIENvbnNlbnQgYUNvbnNlbnQsIFJlcXVpcmVtZW50IHJlcVN0ZXJlb3R5cGUsIG9yZy5lY2xpcHNlLnBhcHlydXMucGRwNGVuZy5yZXEucHJvZmlsZS5wZHA0ZW5nUmVxR0RQUi5MYXdmdWxCeUNvbnNlbnQgbGF3ZnVsUmJ5Q29uc2VudCkgeworCQlsYXdmdWxSYnlDb25zZW50LnNldENvbnNlbnQoYUNvbnNlbnQpOworCQlsYXdmdWxSYnlDb25zZW50LnNldERhdGFTdWJqZWN0KGRhdGFTdWJqZWN0KTsKKwkJZm9yIChQZXJzb25hbERhdGEgcGVyc29uYWxEYXRhIDogcHJvY2Vzc1JlcXVpcmVtZW50LmdldFBlcnNvbmFsZGF0YSgpKSB7CisJCQlsYXdmdWxSYnlDb25zZW50LmdldFBlcnNvbmFsRGF0YSgpLmFkZCgoUGVyc29uYWxEYXRhUmVxdWlyZW1lbnQpIHBlcnNvbmFsRGF0YSk7CisJCX0KKwkJbGF3ZnVsUmJ5Q29uc2VudC5zZXRQcm9jZXNzKHRoaXMucHJvY2Vzc1JlcXVpcmVtZW50KTsKKwkJcmVxU3RlcmVvdHlwZS5zZXRUZXh0KCIiK2dkcHJScmVxdWllbWVudC5nZXREZXNjcmlwdGlvbkZvckxhd2Z1bEJ5Q29uc2VudChsYXdmdWxSYnlDb25zZW50KSk7CisJfQorCisJLyoqCisJICogc2V0IHRoZSBpZCBvZiB0aGUgcmVxdWlyZW1lbnQKKwkgKiBAcGFyYW0gaWQKKwkgKiBAcGFyYW0gbGF3ZnVsbFJlcQorCSAqIEBwYXJhbSByZXF1aXJlbWVudENsYXNzCisJICogQHBhcmFtIHJlcVN0ZXJlb3R5cGUKKwkgKi8KKwlwcml2YXRlIHZvaWQgc2V0VGhlSUQoU3RyaW5nIGlkLCBDbGFzcyBsYXdmdWxsUmVxLCBDbGFzcyByZXF1aXJlbWVudENsYXNzLCBSZXF1aXJlbWVudCByZXFTdGVyZW90eXBlKSB7CisJCWlmKGxhd2Z1bGxSZXE9PW51bGwpIHsKKwkJCXJlcVN0ZXJlb3R5cGUuc2V0SWQoaWQpOworCQkJcmVxdWlyZW1lbnRDbGFzcy5zZXROYW1lKGlkKTsKKwkJfQorCQllbHNlIHsKKwkJCXJlcVN0ZXJlb3R5cGUuc2V0SWQobGF3ZnVsbFJlcS5nZXROYW1lKCkrIi4iK2xhd2Z1bGxSZXEuZ2V0TmVzdGVkQ2xhc3NpZmllcnMoKS5zaXplKCkpOworCQkJcmVxdWlyZW1lbnRDbGFzcy5zZXROYW1lKGxhd2Z1bGxSZXEuZ2V0TmFtZSgpKyIuIitsYXdmdWxsUmVxLmdldE5lc3RlZENsYXNzaWZpZXJzKCkuc2l6ZSgpKTsKKwkJfQorCX0KKworCS8qKiB0U2V0IHRoZSBvd25lciB0aGUgb2YgdGhlIHJlcXVpcmVtZW50CisJICogCisJICogQHBhcmFtIG93bmVyCisJICogQHBhcmFtIGxhd2Z1bGxSZXEKKwkgKiBAcGFyYW0gcmVxdWlyZW1lbnRDbGFzcworCSAqLworCXByaXZhdGUgdm9pZCBzZXRUaGVPd25lcihQYWNrYWdlIG93bmVyLCBDbGFzcyBsYXdmdWxsUmVxLCBDbGFzcyByZXF1aXJlbWVudENsYXNzKSB7CisJCWlmKGxhd2Z1bGxSZXE9PW51bGwpIHsKKwkJCW93bmVyLmdldFBhY2thZ2VkRWxlbWVudHMoKS5hZGQocmVxdWlyZW1lbnRDbGFzcyk7CisJCX0KKwkJZWxzZSB7CisJCQlsYXdmdWxsUmVxLmdldE5lc3RlZENsYXNzaWZpZXJzKCkuYWRkKHJlcXVpcmVtZW50Q2xhc3MpOworCisJCX0KKwl9CisKKwkvKioKKwkgKiBsb29rIGZvciBsYXdmdWxsIHJlcXVpcmVtZW50IHRoYXQgY291bGQgYmUgdGhlIG93bmVyCisJICogQHBhcmFtIG93bmVyCisJICogQHBhcmFtIGxhd2Z1bGxSZXEKKwkgKiBAcmV0dXJuCisJICovCisJcHJpdmF0ZSBDbGFzcyBsb29rRm9yTGF3RnVsbFJlcXVpcmVtZW50KFBhY2thZ2Ugb3duZXIsIENsYXNzIGxhd2Z1bGxSZXEpIHsKKwkJVHJlZUl0ZXJhdG9yPEVPYmplY3Q+IGl0ZXJhdG9yPSBvd25lci5lQWxsQ29udGVudHMoKTsKKwkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworCQkJRU9iamVjdCBlT2JqZWN0ID0gKEVPYmplY3QpIGl0ZXJhdG9yLm5leHQoKTsKKwkJCS8vdGVzdCBpZiBpcyBpcyBhIGNsYXNzCisJCQlpZiAoZU9iamVjdCBpbnN0YW5jZW9mIENsYXNzKSB7CisJCQkJQ2xhc3MgYWNsYXNzPShDbGFzcyllT2JqZWN0OworCQkJCW9yZy5lY2xpcHNlLnBhcHlydXMucGRwNGVuZy5yZXEucHJvZmlsZS5wZHA0ZW5nUmVxR0RQUi5MYXdmdWwgbGF3ZnVsPSAob3JnLmVjbGlwc2UucGFweXJ1cy5wZHA0ZW5nLnJlcS5wcm9maWxlLnBkcDRlbmdSZXFHRFBSLkxhd2Z1bClVTUxVdGlsLmdldFN0ZXJlb3R5cGVBcHBsaWNhdGlvbihhY2xhc3MsIG9yZy5lY2xpcHNlLnBhcHlydXMucGRwNGVuZy5yZXEucHJvZmlsZS5wZHA0ZW5nUmVxR0RQUi5MYXdmdWwuY2xhc3MpOworCQkJCS8vIHRlc3QgaWYgdGhpcyBpcyBhIGxhd2Z1bGwgcmVxLgorCQkJCWlmKCBsYXdmdWwhPW51bGwpIHsKKwkJCQkJLy90ZXN0IGF0dHJpYnV0ZXMKKwkJCQkJaWYobGF3ZnVsLmdldFByb2Nlc3MoKS5lcXVhbHModGhpcy5wcm9jZXNzUmVxdWlyZW1lbnQpICYmIGxhd2Z1bC5nZXREYXRhU3ViamVjdCgpLmVxdWFscyh0aGlzLmRhdGFTdWJqZWN0KSkgeworCQkJCQkJbGF3ZnVsbFJlcT0oQ2xhc3MpbGF3ZnVsLmdldEJhc2VfTmFtZWRFbGVtZW50KCk7CisJCQkJCQlyZXR1cm4gbGF3ZnVsbFJlcTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQl9CisJCXJldHVybiBsYXdmdWxsUmVxOworCX0KKworfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9yZXEvb3JnLmVjbGlwc2UucGFweXJ1cy5wZHA0ZW5nLnJlcS5nZHByYW5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcGRwNGVuZy9yZXEvZ2RwcmFuYW5hbHlzaXMvaW50ZXJuYWwvTGF3ZnVsUmVxdWlyZW1lbnRCeUNvbnRyYWN0Q3JlYXRlQ29tbWFuZC5qYXZhIGIvcGx1Z2lucy9yZXEvb3JnLmVjbGlwc2UucGFweXJ1cy5wZHA0ZW5nLnJlcS5nZHByYW5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcGRwNGVuZy9yZXEvZ2RwcmFuYW5hbHlzaXMvaW50ZXJuYWwvTGF3ZnVsUmVxdWlyZW1lbnRCeUNvbnRyYWN0Q3JlYXRlQ29tbWFuZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzNzk2NWIKLS0tIC9kZXYvbnVsbAorKysgYi9wbHVnaW5zL3JlcS9vcmcuZWNsaXBzZS5wYXB5cnVzLnBkcDRlbmcucmVxLmdkcHJhbmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9wZHA0ZW5nL3JlcS9nZHByYW5hbmFseXNpcy9pbnRlcm5hbC9MYXdmdWxSZXF1aXJlbWVudEJ5Q29udHJhY3RDcmVhdGVDb21tYW5kLmphdmEKQEAgLTAsMCArMSwxNjggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKTIwMjAgQ0VBIExJU1QsIENvbW1pdHRlciBOYW1lLCBhbmQgb3RoZXJzLiAKKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiBDRUEgTElTVCAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICogUGF0cmljayBUZXNzaWVyIChDRUEgTElTVCkgUGF0cmljay50ZXNzaWVyQGNlYS5mciAKKyAqIEdhYnJpZWwgUGVkcm96YSAoQ0VBIExJU1QpIGdhYnJpZWwucGVkcm96YUBjZWEuZnIgCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnBkcDRlbmcucmVxLmdkcHJhbmFuYWx5c2lzLmludGVybmFsOworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlRyZWVJdGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE5IENFQSBMSVNULgorICogCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgdGhlIHByb3BlcnR5IG9mIHRoZSBDRUEuIAorICogQW55IHVzZSBpcyBzdWJqZWN0IHRvIHNwZWNpZmljIGFncmVlbWVudCB3aXRoIHRoZSBDRUEuCisgKiBDb250cmlidXRvcnM6CisgKiAKKyAqIAkJUGF0cmljayBUZXNzaWVyIChDRUEgTElTVCkgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqIAorICovCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOworaW1wb3J0IG9yZy5lY2xpcHNlLnBhcHlydXMuc3lzbWwxNC5yZXF1aXJlbWVudHMuUmVxdWlyZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC5QYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLlVNTEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwuVU1MUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51bWwyLnVtbC51dGlsLlVNTFV0aWw7CitpbXBvcnQgb3JnLmVjbGlwc2UudW1sMi51bWwudXRpbC5VTUxVdGlsLlN0ZXJlb3R5cGVBcHBsaWNhdGlvbkhlbHBlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnBhcHlydXMucGRwNGVuZy5jb21tb24ucHJvZmlsZS5wZHA0ZW5nQ29tbW9uR0RQUi5Db25zZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnBhcHlydXMucGRwNGVuZy5jb21tb24ucHJvZmlsZS5wZHA0ZW5nQ29tbW9uR0RQUi5Db250cmFjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5wYXB5cnVzLnBkcDRlbmcuY29tbW9uLnByb2ZpbGUucGRwNGVuZ0NvbW1vbkdEUFIuRGF0YVN1YmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UucGFweXJ1cy5wZHA0ZW5nLmNvbW1vbi5wcm9maWxlLnBkcDRlbmdDb21tb25HRFBSLlBlcnNvbmFsRGF0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5wYXB5cnVzLnBkcDRlbmcuY29tbW9uLnByb2ZpbGUucGRwNGVuZ0NvbW1vbkdEUFIuUHVycG9zZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5wYXB5cnVzLnBkcDRlbmcucmVxLm1ldGFyZXEuR0RQUlJlcXVpcmVtZW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5wYXB5cnVzLnBkcDRlbmcucmVxLnByb2ZpbGUucGRwNGVuZ1JlcUdEUFIucGRwNGVuZ1JlcUdEUFJQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnBhcHlydXMucGRwNGVuZy5yZXEucHJvZmlsZS5wZHA0ZW5nUmVxR0RQUi5QZXJzb25hbERhdGFSZXF1aXJlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5wYXB5cnVzLnBkcDRlbmcucmVxLnByb2ZpbGUucGRwNGVuZ1JlcUdEUFIuUHJvY2Vzc1JlcXVpcmVtZW50OworCitwdWJsaWMgY2xhc3MgTGF3ZnVsUmVxdWlyZW1lbnRCeUNvbnRyYWN0Q3JlYXRlQ29tbWFuZCBleHRlbmRzIEJhc2ljR0RQUlJlcXVpcmVtZW50Q3JlYXRlQ29tbWFuZCB7CisKKwlwcml2YXRlIERhdGFTdWJqZWN0IGRhdGFTdWJqZWN0OworCXB1YmxpYyBMYXdmdWxSZXF1aXJlbWVudEJ5Q29udHJhY3RDcmVhdGVDb21tYW5kKFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGRvbWFpbiwgRWxlbWVudCBvd25lciwgU3RyaW5nIGlkLCBTdHJpbmcgdGV4dCxQcm9jZXNzUmVxdWlyZW1lbnQgcHJvY2Vzc1JlcXVpcmVtZW50LCBEYXRhU3ViamVjdCBkYXRhU3ViamVjdCkgeworCQlzdXBlcihkb21haW4sIG93bmVyLCBpZCwgdGV4dCxwcm9jZXNzUmVxdWlyZW1lbnQpOworCQl0aGlzLmRhdGFTdWJqZWN0PSBkYXRhU3ViamVjdDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVSZXF1aXJlbWVudChQYWNrYWdlIG93bmVyLCBTdHJpbmcgaWQsIFN0cmluZyB0ZXh0KSB7CisJCVN0ZXJlb3R5cGVBcHBsaWNhdGlvbkhlbHBlciBzdGVyZW90eXBlQXBwbGljYXRpb25IZWxwZXIgPSBTdGVyZW90eXBlQXBwbGljYXRpb25IZWxwZXIuZ2V0SW5zdGFuY2UobnVsbCk7CisJCUdEUFJSZXF1aXJlbWVudHMgZ2RwclJyZXF1aWVtZW50PSBuZXcgR0RQUlJlcXVpcmVtZW50cygpOworCisJCUNsYXNzIGxhd2Z1bGxSZXEgPW51bGw7CisJCS8vMS4gbG9vayBmb3IgTGF3ZnVsUmVxdWlyZW1lbnQKKwkJbGF3ZnVsbFJlcSA9IGxvb2tGb3JMYXdGdWxsUmVxdWlyZW1lbnQob3duZXIsIGxhd2Z1bGxSZXEpOworCisKKwkJLy8yLiBjcmVhdGUgdGhlIHN1YiByZXF1aXJlbWVudAorCQlmb3IgKEl0ZXJhdG9yPENvbnNlbnQ+IGl0ZXJhdG9yQ29uc2VudCA9IGRhdGFTdWJqZWN0LmdldEdpdmVuQ29uc2VudCgpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yQ29uc2VudC5oYXNOZXh0KCk7KSB7CisJCQlDb250cmFjdCBhQ29udHJhY3QgPXRoaXMucHJvY2Vzc1JlcXVpcmVtZW50LmdldFBlcmZvcm1BQ29udHJhY3QoKTsKKwkJCWlmKCBhQ29udHJhY3QhPW51bGwpIHsKKworCQkJCS8vMS4xIGNyZWF0ZSB0aGUgY2xhc3MKKwkJCQlDbGFzcyByZXF1aXJlbWVudENsYXNzID1VTUxGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDbGFzcygpOworCisJCQkJLy8yLjEgc2V0IHRoZSBvd25lcgorCQkJCXNldFRoZU93bmVyKG93bmVyLCBsYXdmdWxsUmVxLCByZXF1aXJlbWVudENsYXNzKTsKKwkJCQkvLzMuIGFwcGx5IHRoZSBzdGVyZW90eXBlCisJCQkJc3RlcmVvdHlwZUFwcGxpY2F0aW9uSGVscGVyLmFwcGx5U3RlcmVvdHlwZShyZXF1aXJlbWVudENsYXNzLG9yZy5lY2xpcHNlLnBhcHlydXMuc3lzbWwxNC5yZXF1aXJlbWVudHMuUmVxdWlyZW1lbnRzUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UmVxdWlyZW1lbnQoKSxudWxsICk7CisJCQkJUmVxdWlyZW1lbnQgcmVxU3RlcmVvdHlwZT0gKFJlcXVpcmVtZW50KVVNTFV0aWwuZ2V0U3RlcmVvdHlwZUFwcGxpY2F0aW9uKHJlcXVpcmVtZW50Q2xhc3MsIFJlcXVpcmVtZW50LmNsYXNzKTsKKwkJCQlzdGVyZW90eXBlQXBwbGljYXRpb25IZWxwZXIuYXBwbHlTdGVyZW90eXBlKHJlcXVpcmVtZW50Q2xhc3MscGRwNGVuZ1JlcUdEUFJQYWNrYWdlLmVJTlNUQU5DRS5nZXRMYXdmdWxCeUNvbnNlbnQoKSxudWxsICk7CisJCQkJb3JnLmVjbGlwc2UucGFweXJ1cy5wZHA0ZW5nLnJlcS5wcm9maWxlLnBkcDRlbmdSZXFHRFBSLkxhd2Z1bEJ5Q29udHJhY3QgbGF3ZnVsUmJ5Q29udHJhY3Q9IChvcmcuZWNsaXBzZS5wYXB5cnVzLnBkcDRlbmcucmVxLnByb2ZpbGUucGRwNGVuZ1JlcUdEUFIuTGF3ZnVsQnlDb250cmFjdClVTUxVdGlsLmdldFN0ZXJlb3R5cGVBcHBsaWNhdGlvbihyZXF1aXJlbWVudENsYXNzLCBvcmcuZWNsaXBzZS5wYXB5cnVzLnBkcDRlbmcucmVxLnByb2ZpbGUucGRwNGVuZ1JlcUdEUFIuTGF3ZnVsQnlDb250cmFjdC5jbGFzcyk7CisJCQkJLy80LiBzZXQgYXR0cmlidXRlIG9mIHRoZSBhcHBsaWVkIHN0ZXJlb3R5cGUKKwkJCQlzZXRBdHRyaWJ1dGVBcHBsaWVkU3RlcmVvdHlwZShnZHByUnJlcXVpZW1lbnQsIGFDb250cmFjdCwgcmVxU3RlcmVvdHlwZSwgbGF3ZnVsUmJ5Q29udHJhY3QpOworCQkJCS8vNS5zZXQgdGhlIElECisJCQkJc2V0VGhlSUQoaWQsIGxhd2Z1bGxSZXEsIHJlcXVpcmVtZW50Q2xhc3MsIHJlcVN0ZXJlb3R5cGUpOworCQkJfQorCQl9CisKKwl9CisKKwlwcml2YXRlIHZvaWQgc2V0QXR0cmlidXRlQXBwbGllZFN0ZXJlb3R5cGUoR0RQUlJlcXVpcmVtZW50cyBnZHByUnJlcXVpZW1lbnQsIENvbnRyYWN0IGFDb250cmFjdCwgUmVxdWlyZW1lbnQgcmVxU3RlcmVvdHlwZSwgb3JnLmVjbGlwc2UucGFweXJ1cy5wZHA0ZW5nLnJlcS5wcm9maWxlLnBkcDRlbmdSZXFHRFBSLkxhd2Z1bEJ5Q29udHJhY3QgbGF3ZnVsQnlDb250cmFjdCkgeworCQlsYXdmdWxCeUNvbnRyYWN0LnNldENvbnRyYWN0KGFDb250cmFjdCk7CisJCWxhd2Z1bEJ5Q29udHJhY3Quc2V0RGF0YVN1YmplY3QoZGF0YVN1YmplY3QpOworCQlmb3IgKFBlcnNvbmFsRGF0YSBwZXJzb25hbERhdGEgOiBwcm9jZXNzUmVxdWlyZW1lbnQuZ2V0UGVyc29uYWxkYXRhKCkpIHsKKwkJCWxhd2Z1bEJ5Q29udHJhY3QuZ2V0UGVyc29uYWxEYXRhKCkuYWRkKChQZXJzb25hbERhdGFSZXF1aXJlbWVudCkgcGVyc29uYWxEYXRhKTsKKwkJfQorCQlsYXdmdWxCeUNvbnRyYWN0LnNldFByb2Nlc3ModGhpcy5wcm9jZXNzUmVxdWlyZW1lbnQpOworCQlyZXFTdGVyZW90eXBlLnNldFRleHQoIiIrZ2RwclJyZXF1aWVtZW50LmdldERlc2NyaXB0aW9uRm9yTGF3ZnVsQnlDb25zZW50KGxhd2Z1bEJ5Q29udHJhY3QpKTsKKwl9CisKKwkvKioKKwkgKiBzZXQgdGhlIGlkIG9mIHRoZSByZXF1aXJlbWVudAorCSAqIEBwYXJhbSBpZAorCSAqIEBwYXJhbSBsYXdmdWxsUmVxCisJICogQHBhcmFtIHJlcXVpcmVtZW50Q2xhc3MKKwkgKiBAcGFyYW0gcmVxU3RlcmVvdHlwZQorCSAqLworCXByaXZhdGUgdm9pZCBzZXRUaGVJRChTdHJpbmcgaWQsIENsYXNzIGxhd2Z1bGxSZXEsIENsYXNzIHJlcXVpcmVtZW50Q2xhc3MsIFJlcXVpcmVtZW50IHJlcVN0ZXJlb3R5cGUpIHsKKwkJaWYobGF3ZnVsbFJlcT09bnVsbCkgeworCQkJcmVxU3RlcmVvdHlwZS5zZXRJZChpZCk7CisJCQlyZXF1aXJlbWVudENsYXNzLnNldE5hbWUoaWQpOworCQl9CisJCWVsc2UgeworCQkJcmVxU3RlcmVvdHlwZS5zZXRJZChsYXdmdWxsUmVxLmdldE5hbWUoKSsiLiIrbGF3ZnVsbFJlcS5nZXROZXN0ZWRDbGFzc2lmaWVycygpLnNpemUoKSk7CisJCQlyZXF1aXJlbWVudENsYXNzLnNldE5hbWUobGF3ZnVsbFJlcS5nZXROYW1lKCkrIi4iK2xhd2Z1bGxSZXEuZ2V0TmVzdGVkQ2xhc3NpZmllcnMoKS5zaXplKCkpOworCQl9CisJfQorCisJLyoqIHRTZXQgdGhlIG93bmVyIHRoZSBvZiB0aGUgcmVxdWlyZW1lbnQKKwkgKiAKKwkgKiBAcGFyYW0gb3duZXIKKwkgKiBAcGFyYW0gbGF3ZnVsbFJlcQorCSAqIEBwYXJhbSByZXF1aXJlbWVudENsYXNzCisJICovCisJcHJpdmF0ZSB2b2lkIHNldFRoZU93bmVyKFBhY2thZ2Ugb3duZXIsIENsYXNzIGxhd2Z1bGxSZXEsIENsYXNzIHJlcXVpcmVtZW50Q2xhc3MpIHsKKwkJaWYobGF3ZnVsbFJlcT09bnVsbCkgeworCQkJb3duZXIuZ2V0UGFja2FnZWRFbGVtZW50cygpLmFkZChyZXF1aXJlbWVudENsYXNzKTsKKwkJfQorCQllbHNlIHsKKwkJCWxhd2Z1bGxSZXEuZ2V0TmVzdGVkQ2xhc3NpZmllcnMoKS5hZGQocmVxdWlyZW1lbnRDbGFzcyk7CisKKwkJfQorCX0KKworCS8qKgorCSAqIGxvb2sgZm9yIGxhd2Z1bGwgcmVxdWlyZW1lbnQgdGhhdCBjb3VsZCBiZSB0aGUgb3duZXIKKwkgKiBAcGFyYW0gb3duZXIKKwkgKiBAcGFyYW0gbGF3ZnVsbFJlcQorCSAqIEByZXR1cm4KKwkgKi8KKwlwcml2YXRlIENsYXNzIGxvb2tGb3JMYXdGdWxsUmVxdWlyZW1lbnQoUGFja2FnZSBvd25lciwgQ2xhc3MgbGF3ZnVsbFJlcSkgeworCQlUcmVlSXRlcmF0b3I8RU9iamVjdD4gaXRlcmF0b3I9IG93bmVyLmVBbGxDb250ZW50cygpOworCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CisJCQlFT2JqZWN0IGVPYmplY3QgPSAoRU9iamVjdCkgaXRlcmF0b3IubmV4dCgpOworCQkJLy90ZXN0IGlmIGlzIGlzIGEgY2xhc3MKKwkJCWlmIChlT2JqZWN0IGluc3RhbmNlb2YgQ2xhc3MpIHsKKwkJCQlDbGFzcyBhY2xhc3M9KENsYXNzKWVPYmplY3Q7CisJCQkJb3JnLmVjbGlwc2UucGFweXJ1cy5wZHA0ZW5nLnJlcS5wcm9maWxlLnBkcDRlbmdSZXFHRFBSLkxhd2Z1bCBsYXdmdWw9IChvcmcuZWNsaXBzZS5wYXB5cnVzLnBkcDRlbmcucmVxLnByb2ZpbGUucGRwNGVuZ1JlcUdEUFIuTGF3ZnVsKVVNTFV0aWwuZ2V0U3RlcmVvdHlwZUFwcGxpY2F0aW9uKGFjbGFzcywgb3JnLmVjbGlwc2UucGFweXJ1cy5wZHA0ZW5nLnJlcS5wcm9maWxlLnBkcDRlbmdSZXFHRFBSLkxhd2Z1bC5jbGFzcyk7CisJCQkJLy8gdGVzdCBpZiB0aGlzIGlzIGEgbGF3ZnVsbCByZXEuCisJCQkJaWYoIGxhd2Z1bCE9bnVsbCkgeworCQkJCQkvL3Rlc3QgYXR0cmlidXRlcworCQkJCQlpZihsYXdmdWwuZ2V0UHJvY2VzcygpLmVxdWFscyh0aGlzLnByb2Nlc3NSZXF1aXJlbWVudCkgJiYgbGF3ZnVsLmdldERhdGFTdWJqZWN0KCkuZXF1YWxzKHRoaXMuZGF0YVN1YmplY3QpKSB7CisJCQkJCQlsYXdmdWxsUmVxPShDbGFzcylsYXdmdWwuZ2V0QmFzZV9OYW1lZEVsZW1lbnQoKTsKKwkJCQkJCXJldHVybiBsYXdmdWxsUmVxOworCQkJCQl9CisJCQkJfQorCQkJfQorCisJCX0KKwkJcmV0dXJuIGxhd2Z1bGxSZXE7CisJfQorCit9CmRpZmYgLS1naXQgYS9wbHVnaW5zL3JlcS9vcmcuZWNsaXBzZS5wYXB5cnVzLnBkcDRlbmcucmVxLmdkcHJhbmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9wZHA0ZW5nL3JlcS9nZHByYW5hbmFseXNpcy9pbnRlcm5hbC9MYXdmdWxSZXF1aXJlbWVudENyZWF0ZUNvbW1hbmQuamF2YSBiL3BsdWdpbnMvcmVxL29yZy5lY2xpcHNlLnBhcHlydXMucGRwNGVuZy5yZXEuZ2RwcmFuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3BkcDRlbmcvcmVxL2dkcHJhbmFuYWx5c2lzL2ludGVybmFsL0xhd2Z1bFJlcXVpcmVtZW50Q3JlYXRlQ29tbWFuZC5qYXZhCmluZGV4IDQ2YjBhZWMuLmQwNzVmZmEgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvcmVxL29yZy5lY2xpcHNlLnBhcHlydXMucGRwNGVuZy5yZXEuZ2RwcmFuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3BkcDRlbmcvcmVxL2dkcHJhbmFuYWx5c2lzL2ludGVybmFsL0xhd2Z1bFJlcXVpcmVtZW50Q3JlYXRlQ29tbWFuZC5qYXZhCisrKyBiL3BsdWdpbnMvcmVxL29yZy5lY2xpcHNlLnBhcHlydXMucGRwNGVuZy5yZXEuZ2RwcmFuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3BkcDRlbmcvcmVxL2dkcHJhbmFuYWx5c2lzL2ludGVybmFsL0xhd2Z1bFJlcXVpcmVtZW50Q3JlYXRlQ29tbWFuZC5qYXZhCkBAIC03MywzMyArNzMsNiBAQAogCQkJCiAJCQlDb21tYW5kIHRyYWNlQ29tbWFuZD1QRFA0RW5nVHJhY2VhYmlsaXR5RmFjdG9yeS5hZGRUcmFjZWFiaWxpdHlUb0xGUihkb21haW4sIHByb2Nlc3NSZXF1aXJlbWVudCwgcmVxU3RlcmVvdHlwZUFwcGxpKTsKIAkJCXRyYWNlQ29tbWFuZC5leGVjdXRlKCk7Ci0JCQkKLQkJCWZvciAoSXRlcmF0b3I8Q29uc2VudD4gaXRlcmF0b3IgPSBkYXRhU3ViamVjdC5nZXRHaXZlbkNvbnNlbnQoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJQ29uc2VudCBhQ29uc2VudCA9IChDb25zZW50KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJZm9yIChJdGVyYXRvcjxQdXJwb3NlPiBwdXJwb3NlSXRlcmF0b3IgPSBhQ29uc2VudC5nZXRQdXJwb3NlKCkuaXRlcmF0b3IoKTsgcHVycG9zZUl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQkJUHVycG9zZSBhUHVycG9zZSA9IChQdXJwb3NlKSBwdXJwb3NlSXRlcmF0b3IubmV4dCgpOwotCQkJCQlpZiggYVB1cnBvc2UuZ2V0UHJvY2Vzc2VzKCkuY29udGFpbnModGhpcy5wcm9jZXNzUmVxdWlyZW1lbnQpKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNyZWF0ZSBMYXdmdWxsIEJZIENPTlNFTlQiKTsKLQkJCQkJCUNsYXNzIHJlcXVpcmVtZW50Q2xhc3M9KENsYXNzKXJlcXVpcmVtZW50LmNyZWF0ZU5lc3RlZENsYXNzaWZpZXIocmVxU3RlcmVvdHlwZUFwcGxpLmdldElkKCkrIi4xIiwgVU1MUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q2xhc3NfKCkpOwotCQkJCQkJc3RlcmVvdHlwZUFwcGxpY2F0aW9uSGVscGVyLmFwcGx5U3RlcmVvdHlwZShyZXF1aXJlbWVudENsYXNzLG9yZy5lY2xpcHNlLnBhcHlydXMuc3lzbWwxNC5yZXF1aXJlbWVudHMuUmVxdWlyZW1lbnRzUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UmVxdWlyZW1lbnQoKSxudWxsICk7Ci0JCQkJCQlSZXF1aXJlbWVudCByZXFTdGVyZW90eXBlPSAoUmVxdWlyZW1lbnQpVU1MVXRpbC5nZXRTdGVyZW90eXBlQXBwbGljYXRpb24ocmVxdWlyZW1lbnRDbGFzcywgUmVxdWlyZW1lbnQuY2xhc3MpOwotCQkJCQkJc3RlcmVvdHlwZUFwcGxpY2F0aW9uSGVscGVyLmFwcGx5U3RlcmVvdHlwZShyZXF1aXJlbWVudENsYXNzLHBkcDRlbmdSZXFHRFBSUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TGF3ZnVsQnlDb25zZW50KCksbnVsbCApOwotCQkJCQkJb3JnLmVjbGlwc2UucGFweXJ1cy5wZHA0ZW5nLnJlcS5wcm9maWxlLnBkcDRlbmdSZXFHRFBSLkxhd2Z1bEJ5Q29uc2VudCBsYXdmdWxSYnlDb25zZW50PSAob3JnLmVjbGlwc2UucGFweXJ1cy5wZHA0ZW5nLnJlcS5wcm9maWxlLnBkcDRlbmdSZXFHRFBSLkxhd2Z1bEJ5Q29uc2VudClVTUxVdGlsLmdldFN0ZXJlb3R5cGVBcHBsaWNhdGlvbihyZXF1aXJlbWVudENsYXNzLCBvcmcuZWNsaXBzZS5wYXB5cnVzLnBkcDRlbmcucmVxLnByb2ZpbGUucGRwNGVuZ1JlcUdEUFIuTGF3ZnVsQnlDb25zZW50LmNsYXNzKTsKLQkJCQkJCWxhd2Z1bFJieUNvbnNlbnQuc2V0Q29uc2VudChhQ29uc2VudCk7Ci0JCQkJCQlsYXdmdWxSYnlDb25zZW50LnNldERhdGFTdWJqZWN0KGRhdGFTdWJqZWN0KTsKLQkJCQkJCWxhd2Z1bFJieUNvbnNlbnQuZ2V0UGVyc29uYWxEYXRhKCkuYWRkQWxsKGxhd2Z1bFJlcS5nZXRQZXJzb25hbERhdGEoKSk7Ci0JCQkJCQlsYXdmdWxSYnlDb25zZW50LnNldFByb2Nlc3ModGhpcy5wcm9jZXNzUmVxdWlyZW1lbnQpOwotCQkJCQkJcmVxU3RlcmVvdHlwZS5zZXRUZXh0KCIiK2dkcHJScmVxdWllbWVudC5nZXREZXNjcmlwdGlvbkZvckxhd2Z1bEJ5Q29uc2VudChsYXdmdWxSYnlDb25zZW50KSk7Ci0JCQkJCQlyZXFTdGVyZW90eXBlLnNldElkKHJlcVN0ZXJlb3R5cGVBcHBsaS5nZXRJZCgpKyIuMSIpOwotCQkJCQkJCi0JCQkJCQkKLQkJCQkJfQotCQkJCQkKLQkJCQl9Ci0JCQkJCi0JCQl9Ci0JCQkKLQkJCQogCiAJCX0KIApkaWZmIC0tZ2l0IGEvcGx1Z2lucy9yZXEvb3JnLmVjbGlwc2UucGFweXJ1cy5wZHA0ZW5nLnJlcS5nZHByYW5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcGRwNGVuZy9yZXEvZ2RwcmFuYW5hbHlzaXMvaW50ZXJuYWwvUmVxdWlyZW1lbnRUZXN0R2VuZXJhdG9ySW1wbC5qYXZhIGIvcGx1Z2lucy9yZXEvb3JnLmVjbGlwc2UucGFweXJ1cy5wZHA0ZW5nLnJlcS5nZHByYW5hbmFseXNpcy9zcmMvb3JnL2VjbGlwc2UvcGRwNGVuZy9yZXEvZ2RwcmFuYW5hbHlzaXMvaW50ZXJuYWwvUmVxdWlyZW1lbnRUZXN0R2VuZXJhdG9ySW1wbC5qYXZhCmluZGV4IDBkODA1YWQuLjRiOWNiOGMgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvcmVxL29yZy5lY2xpcHNlLnBhcHlydXMucGRwNGVuZy5yZXEuZ2RwcmFuYW5hbHlzaXMvc3JjL29yZy9lY2xpcHNlL3BkcDRlbmcvcmVxL2dkcHJhbmFuYWx5c2lzL2ludGVybmFsL1JlcXVpcmVtZW50VGVzdEdlbmVyYXRvckltcGwuamF2YQorKysgYi9wbHVnaW5zL3JlcS9vcmcuZWNsaXBzZS5wYXB5cnVzLnBkcDRlbmcucmVxLmdkcHJhbmFuYWx5c2lzL3NyYy9vcmcvZWNsaXBzZS9wZHA0ZW5nL3JlcS9nZHByYW5hbmFseXNpcy9pbnRlcm5hbC9SZXF1aXJlbWVudFRlc3RHZW5lcmF0b3JJbXBsLmphdmEKQEAgLTEsMTggKzEsMTggQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpMjAyMCBDRUEgTElTVCwgQ29tbWl0dGVyIE5hbWUsIGFuZCBvdGhlcnMuCi0qCi0qIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAKLSogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSogaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC8KLSoKLSogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKLSoKLSogQ29udHJpYnV0b3JzOgotKiBDRUEgTElTVCAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKiBQYXRyaWNrIFRlc3NpZXIgKENFQSBMSVNUKSBQYXRyaWNrLnRlc3NpZXJAY2VhLmZyIAotKiBHYWJyaWVsIFBlZHJvemEgKENFQSBMSVNUKSBnYWJyaWVsLnBlZHJvemFAY2VhLmZyIAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKiBDb3B5cmlnaHQgKGMpMjAyMCBDRUEgTElTVCwgQ29tbWl0dGVyIE5hbWUsIGFuZCBvdGhlcnMuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLworICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICogQ29udHJpYnV0b3JzOgorICogQ0VBIExJU1QgLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqIFBhdHJpY2sgVGVzc2llciAoQ0VBIExJU1QpIFBhdHJpY2sudGVzc2llckBjZWEuZnIgCisgKiBHYWJyaWVsIFBlZHJvemEgKENFQSBMSVNUKSBnYWJyaWVsLnBlZHJvemFAY2VhLmZyIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5wZHA0ZW5nLnJlcS5nZHByYW5hbmFseXNpcy5pbnRlcm5hbDsKIAogaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwpAQCAtNDUsNyArNDUsNyBAQAogCXByb3RlY3RlZCBTdHJpbmcgcHJlZml4PSJHRFBSUmVxLSI7CiAJcHJvdGVjdGVkIFBhY2thZ2UgZ2VuZXJhdGVkUmVxdWlyZW1lbnRQYWNrYWdlPW51bGw7CiAKLQkKKwogCiAJQE92ZXJyaWRlCiAJcHVibGljIENvbW1hbmQgZ2VuZXJhdGVBcnRpY2xlNTFhKFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGRvbWFpbiwgUGFja2FnZSBvd25lcikgewpAQCAtMjAxLDcgKzIwMSw3IEBACiAJCQkJCQlTdHJpbmcgaWQgPSBwcmVmaXgraW5kZXg7CiAJCQkJCQlDb21tYW5kIGNtZD1uZXcgU2VjdXJpdHlTYWZldHlSZXF1aXJlbWVudENyZWF0ZUNvbW1hbmQoZG9tYWluLCBsb29rRm9yR2VuZXJhdGVkcmVxdWlyZW1lbnRQYWNrYWdlKG93bmVyKSwgaWQsICIiLHByb2Nlc3NSZXF1aXJlbWVudCwgZGF0YVN1YmplY3QpOwogCQkJCQkJY29tcG91bmRDb21tYW5kLmFwcGVuZChjbWQpOwotCQkJCQkJCisKIAkJCQkJfQogCiAKQEAgLTIxNiw3ICsyMTYsNyBAQAogCXB1YmxpYyBDb21tYW5kIGdlbmVyYXRlQXJ0aWNsZTUxYyhUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBkb21haW4sIFBhY2thZ2Ugb3duZXIpIHsKIAkJLy8gZGF0YSBtaW5pbWlzYXRpb24KIAkJLy8gQ3JlYXRlIDEgcmVxdWlyZW1lbnQgRGF0YU1pbmltaXphdGlvbiBwZXIgUFItUEQgKlBlcnNvbmFsRGF0YS5zaXplKCkKLQkJCisKIAkJQ29tcG91bmRDb21tYW5kIGNvbXBvdW5kQ29tbWFuZD0gbmV3IENvbXBvdW5kQ29tbWFuZCgpOwogCQlJdGVyYXRvcjxFT2JqZWN0PiBpdGVyYXRvcj1vd25lci5lQWxsQ29udGVudHMoKTsKIApAQCAtMjM4LDQgKzIzOCw5NCBAQAogCQl9CiAJCXJldHVybiBjb21wb3VuZENvbW1hbmQ7CiAJfQorCisJQE92ZXJyaWRlCisJcHVibGljIENvbW1hbmQgZ2VuZXJhdGVBcnRpY2xlNjFhKFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGRvbWFpbiwgUGFja2FnZSBvd25lcikgeworCQlDb21wb3VuZENvbW1hbmQgY29tcG91bmRDb21tYW5kPSBuZXcgQ29tcG91bmRDb21tYW5kKCk7CisJCUl0ZXJhdG9yPEVPYmplY3Q+IGl0ZXJhdG9yPW93bmVyLmVBbGxDb250ZW50cygpOworCisJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKKwkJCUVPYmplY3QgZU9iamVjdCA9IChFT2JqZWN0KSBpdGVyYXRvci5uZXh0KCk7CisJCQlpZiggZU9iamVjdCAgaW5zdGFuY2VvZiBOYW1lZEVsZW1lbnQpIHsKKwkJCQlOYW1lZEVsZW1lbnQgbmFtZWRFbGVtZW50PSAoTmFtZWRFbGVtZW50KWVPYmplY3Q7CisJCQkJUHJvY2Vzc1JlcXVpcmVtZW50IHByb2Nlc3NSZXF1aXJlbWVudD0gKFByb2Nlc3NSZXF1aXJlbWVudClVTUxVdGlsLmdldFN0ZXJlb3R5cGVBcHBsaWNhdGlvbihuYW1lZEVsZW1lbnQsIFByb2Nlc3NSZXF1aXJlbWVudC5jbGFzcyk7CisJCQkJaWYgKHByb2Nlc3NSZXF1aXJlbWVudCE9bnVsbCkgeworCQkJCQlIYXNoU2V0PERhdGFTdWJqZWN0PiBkYXRhU3ViamVjdExpc3Q9bmV3IEhhc2hTZXQ8PigpOworCQkJCQlmb3IgKFBlcnNvbmFsRGF0YSBwZXJzb25hbERhdGEgOiBwcm9jZXNzUmVxdWlyZW1lbnQuZ2V0UGVyc29uYWxkYXRhKCkpIHsKKwkJCQkJCWRhdGFTdWJqZWN0TGlzdC5hZGRBbGwocGVyc29uYWxEYXRhLmdldFJlbGF0ZWRUbygpKTsKKwkJCQkJfQorCQkJCQlmb3IgKERhdGFTdWJqZWN0IGRhdGFTdWJqZWN0IDogZGF0YVN1YmplY3RMaXN0KSB7CisJCQkJCQlpbmRleCsrOworCQkJCQkJU3RyaW5nIGlkID0gcHJlZml4K2luZGV4OworCQkJCQkJQ29tbWFuZCBjbWQ9bmV3IExhd2Z1bFJlcXVpcmVtZW50QnlDb25zZW50Q3JlYXRlQ29tbWFuZChkb21haW4sIGxvb2tGb3JHZW5lcmF0ZWRyZXF1aXJlbWVudFBhY2thZ2Uob3duZXIpLCBpZCwgIiIscHJvY2Vzc1JlcXVpcmVtZW50LCBkYXRhU3ViamVjdCk7CisJCQkJCQljb21wb3VuZENvbW1hbmQuYXBwZW5kKGNtZCk7CisJCQkJCX0KKworCisJCQkJfQorCQkJfQorCisJCX0KKwkJcmV0dXJuIGNvbXBvdW5kQ29tbWFuZDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQ29tbWFuZCBnZW5lcmF0ZUFydGljbGU2MWIoVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZG9tYWluLCBQYWNrYWdlIG93bmVyKSB7CisJCUNvbXBvdW5kQ29tbWFuZCBjb21wb3VuZENvbW1hbmQ9IG5ldyBDb21wb3VuZENvbW1hbmQoKTsKKwkJSXRlcmF0b3I8RU9iamVjdD4gaXRlcmF0b3I9b3duZXIuZUFsbENvbnRlbnRzKCk7CisKKwkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworCQkJRU9iamVjdCBlT2JqZWN0ID0gKEVPYmplY3QpIGl0ZXJhdG9yLm5leHQoKTsKKwkJCWlmKCBlT2JqZWN0ICBpbnN0YW5jZW9mIE5hbWVkRWxlbWVudCkgeworCQkJCU5hbWVkRWxlbWVudCBuYW1lZEVsZW1lbnQ9IChOYW1lZEVsZW1lbnQpZU9iamVjdDsKKwkJCQlQcm9jZXNzUmVxdWlyZW1lbnQgcHJvY2Vzc1JlcXVpcmVtZW50PSAoUHJvY2Vzc1JlcXVpcmVtZW50KVVNTFV0aWwuZ2V0U3RlcmVvdHlwZUFwcGxpY2F0aW9uKG5hbWVkRWxlbWVudCwgUHJvY2Vzc1JlcXVpcmVtZW50LmNsYXNzKTsKKwkJCQlpZiAocHJvY2Vzc1JlcXVpcmVtZW50IT1udWxsKSB7CisJCQkJCUhhc2hTZXQ8RGF0YVN1YmplY3Q+IGRhdGFTdWJqZWN0TGlzdD1uZXcgSGFzaFNldDw+KCk7CisJCQkJCWZvciAoUGVyc29uYWxEYXRhIHBlcnNvbmFsRGF0YSA6IHByb2Nlc3NSZXF1aXJlbWVudC5nZXRQZXJzb25hbGRhdGEoKSkgeworCQkJCQkJZGF0YVN1YmplY3RMaXN0LmFkZEFsbChwZXJzb25hbERhdGEuZ2V0UmVsYXRlZFRvKCkpOworCQkJCQl9CisJCQkJCWZvciAoRGF0YVN1YmplY3QgZGF0YVN1YmplY3QgOiBkYXRhU3ViamVjdExpc3QpIHsKKwkJCQkJCWluZGV4Kys7CisJCQkJCQlTdHJpbmcgaWQgPSBwcmVmaXgraW5kZXg7CisJCQkJCQlDb21tYW5kIGNtZD1uZXcgTGF3ZnVsUmVxdWlyZW1lbnRCeUNvbnRyYWN0Q3JlYXRlQ29tbWFuZChkb21haW4sIGxvb2tGb3JHZW5lcmF0ZWRyZXF1aXJlbWVudFBhY2thZ2Uob3duZXIpLCBpZCwgIiIscHJvY2Vzc1JlcXVpcmVtZW50LCBkYXRhU3ViamVjdCk7CisJCQkJCQljb21wb3VuZENvbW1hbmQuYXBwZW5kKGNtZCk7CisJCQkJCX0KKworCisJCQkJfQorCQkJfQorCisJCX0KKwkJcmV0dXJuIGNvbXBvdW5kQ29tbWFuZDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQ29tbWFuZCBnZW5lcmF0ZUFydGljbGU2MWMoVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZG9tYWluLCBQYWNrYWdlIG93bmVyKSB7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJcmV0dXJuIG51bGw7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIENvbW1hbmQgZ2VuZXJhdGVBcnRpY2xlNjFkKFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGRvbWFpbiwgUGFja2FnZSBvd25lcikgeworCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCisJCXJldHVybiBudWxsOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBDb21tYW5kIGdlbmVyYXRlQXJ0aWNsZTYxZShUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBkb21haW4sIFBhY2thZ2Ugb3duZXIpIHsKKwkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQ29tbWFuZCBnZW5lcmF0ZUFydGljbGU2MWYoVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZG9tYWluLCBQYWNrYWdlIG93bmVyKSB7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJcmV0dXJuIG51bGw7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIENvbW1hbmQgZ2VuZXJhdGVBcnRpY2xlNjQoVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZG9tYWluLCBQYWNrYWdlIG93bmVyKSB7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKwkJcmV0dXJuIG51bGw7CisJfQogfQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9yZXEvb3JnLmVjbGlwc2UucGFweXJ1cy5wZHA0ZW5nLnJlcS5tZXRhcmVxL3NyYy9vcmcvZWNsaXBzZS9wYXB5cnVzL3BkcDRlbmcvcmVxL21ldGFyZXEvR0RQUlJlcXVpcmVtZW50cy54dGVuZCBiL3BsdWdpbnMvcmVxL29yZy5lY2xpcHNlLnBhcHlydXMucGRwNGVuZy5yZXEubWV0YXJlcS9zcmMvb3JnL2VjbGlwc2UvcGFweXJ1cy9wZHA0ZW5nL3JlcS9tZXRhcmVxL0dEUFJSZXF1aXJlbWVudHMueHRlbmQKaW5kZXggNTE4ODY2YS4uMzFiNjQ1MyAxMDA2NDQKLS0tIGEvcGx1Z2lucy9yZXEvb3JnLmVjbGlwc2UucGFweXJ1cy5wZHA0ZW5nLnJlcS5tZXRhcmVxL3NyYy9vcmcvZWNsaXBzZS9wYXB5cnVzL3BkcDRlbmcvcmVxL21ldGFyZXEvR0RQUlJlcXVpcmVtZW50cy54dGVuZAorKysgYi9wbHVnaW5zL3JlcS9vcmcuZWNsaXBzZS5wYXB5cnVzLnBkcDRlbmcucmVxLm1ldGFyZXEvc3JjL29yZy9lY2xpcHNlL3BhcHlydXMvcGRwNGVuZy9yZXEvbWV0YXJlcS9HRFBSUmVxdWlyZW1lbnRzLnh0ZW5kCkBAIC0yNSw2ICsyNSw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UucGFweXJ1cy5wZHA0ZW5nLnJlcS5wcm9maWxlLnBkcDRlbmdSZXFHRFBSLlNlY3VyaXR5U2FmZXR5CiBpbXBvcnQgb3JnLmVjbGlwc2UucGFweXJ1cy5wZHA0ZW5nLnJlcS5wcm9maWxlLnBkcDRlbmdSZXFHRFBSLkRhdGFNaW5pbWlzYXRpb24KIGltcG9ydCBvcmcuZWNsaXBzZS5wYXB5cnVzLnBkcDRlbmcucmVxLnByb2ZpbGUucGRwNGVuZ1JlcUdEUFIuTGF3ZnVsQnlDb25zZW50CitpbXBvcnQgb3JnLmVjbGlwc2UucGFweXJ1cy5wZHA0ZW5nLnJlcS5wcm9maWxlLnBkcDRlbmdSZXFHRFBSLkxhd2Z1bEJ5Q29udHJhY3QKIAogY2xhc3MgR0RQUlJlcXVpcmVtZW50cyB7CiAJLyoqCkBAIC0zNSwxMSArMzYsNiBAQAogCSB9CiAJIAogCSAKLQkgZGVmIGdldERlc2NyaXB0aW9uRm9yTGF3ZnVsQnlDb25zZW50KExhd2Z1bEJ5Q29uc2VudCBsYXdmdWxCeUNvbnNlbnQpewotCSAJJycnUHJvY2Vzc2luZyAiq2xhd2Z1bEJ5Q29uc2VudC5wcm9jZXNzLmJhc2VfTmFtZWRFbGVtZW50Lm5hbWW7IiBzaGFsbCBiZSBsYXdmdWwgaWYgdGhlIGRhdGEgc3ViamVjdCAiq2xhd2Z1bEJ5Q29uc2VudC5kYXRhU3ViamVjdC5iYXNlX05hbWVkRWxlbWVudC5uYW1luyIgaGFzIGdpdmVuIGNvbnNlbnQgIqtsYXdmdWxCeUNvbnNlbnQuY29uc2VudC5iYXNlX05hbWVkRWxlbWVudC5uYW1luyIgdG8gdGhlIHByb2Nlc3Npbmcgb2YgaGlzIG9yIGhlciBwZXJzb25hbCBkYXRhICKrZ2V0UGVyc29uYWxEYXRhRnJvbVByb2Nlc3MobGF3ZnVsQnlDb25zZW50KbsiIGZvciBvbmUgb3IgbW9yZSBzcGVjaWZpYyBwdXJwb3NlcyCrbGF3ZnVsQnlDb25zZW50LnByb2Nlc3MuY29udHJpYnV0ZWRUby5iYXNlX05hbWVkRWxlbWVudC5uYW1luycnJwotCX0KLQkgCi0JIAogCSAvKioKIAkgKiBnZXQgRGVzY3JpcHRpb24gZm9yIGZhaXJseSByZXF1aXJlbWVudHMgZnJvbSBhcnRpY2xlNS4xCiAJICovCkBAIC05MCw2ICs4NiwyMCBAQAogCSAJJycnUGVyc29uYWwgRGF0YSCrZ2V0UGVyc29uYWxEYXRhRnJvbVByb2Nlc3Moc2VjdXJpdHlTYWZldHkpuyAgc2hhbGwgYmUgcHJvY2Vzc2VkIGluIGEgbWFubmVyIHRoYXQgZW5zdXJlcyBhcHByb3ByaWF0ZSBzZWN1cml0eS4gJycnCiAJIH0KIAkgCisJIC8qKgorCSAqIGdldCBEZXNjcmlwdGlvbiBmb3IgbGF3ZnVsbEJ5Q29uc2VudCByZXF1aXJlbWVudHMgZnJvbSBhcnRpY2xlNi4xLmEKKwkgKi8KKwkgZGVmIGdldERlc2NyaXB0aW9uRm9yTGF3ZnVsQnlDb25zZW50KExhd2Z1bEJ5Q29uc2VudCBsYXdmdWxCeUNvbnNlbnQpeworCSAJJycnUHJvY2Vzc2luZyAiq2xhd2Z1bEJ5Q29uc2VudC5wcm9jZXNzLmJhc2VfTmFtZWRFbGVtZW50Lm5hbWW7IiBzaGFsbCBiZSBsYXdmdWwgaWYgdGhlIGRhdGEgc3ViamVjdCAiq2xhd2Z1bEJ5Q29uc2VudC5kYXRhU3ViamVjdC5iYXNlX05hbWVkRWxlbWVudC5uYW1luyIgaGFzIGdpdmVuIGNvbnNlbnQgIqtsYXdmdWxCeUNvbnNlbnQuY29uc2VudC5iYXNlX05hbWVkRWxlbWVudC5uYW1luyIgdG8gdGhlIHByb2Nlc3Npbmcgb2YgaGlzIG9yIGhlciBwZXJzb25hbCBkYXRhIDoiq2dldFBlcnNvbmFsRGF0YUZyb21Qcm9jZXNzKGxhd2Z1bEJ5Q29uc2VudCm7IiBmb3Igb25lIG9yIG1vcmUgc3BlY2lmaWMgcHVycG9zZXMgq2xhd2Z1bEJ5Q29uc2VudC5wcm9jZXNzLmNvbnRyaWJ1dGVkVG8uYmFzZV9OYW1lZEVsZW1lbnQubmFtZbsnJycKKwl9CisJCisJIC8qKgorCSAqIGdldCBEZXNjcmlwdGlvbiBmb3IgbGF3ZnVsbEJ5Q29udHJhY3QgcmVxdWlyZW1lbnRzIGZyb20gYXJ0aWNsZTYuMS5iCisJICovCisJIGRlZiBnZXREZXNjcmlwdGlvbkZvckxhd2Z1bEJ5Q29uc2VudChMYXdmdWxCeUNvbnRyYWN0IGxhd2Z1bEJ5Q29udHJhY3QpeworCSAJJycnUHJvY2Vzc2luZyAiq2xhd2Z1bEJ5Q29udHJhY3QucHJvY2Vzcy5iYXNlX05hbWVkRWxlbWVudC5uYW1luyIgc2hhbGwgYmUgbGF3ZnVsIGlmIHByb2Nlc3NpbmcgIqtsYXdmdWxCeUNvbnRyYWN0LnByb2Nlc3MuYmFzZV9OYW1lZEVsZW1lbnQubmFtZbsiIGlzIG5lY2Vzc2FyeSBmb3IgdGhlIHBlcmZvcm1hbmNlIG9mIHRoZSBjb250cmFjdDoiq2xhd2Z1bEJ5Q29udHJhY3QuY29udHJhY3QuYmFzZV9OYW1lZEVsZW1lbnS7IiB0byB3aGljaCB0aGUgZGF0YSBzdWJqZWN0OiKrbGF3ZnVsQnlDb250cmFjdC5kYXRhU3ViamVjdC5iYXNlX05hbWVkRWxlbWVudC5uYW1luyIgaXMgcGFydHkgb3IgaW4gb3JkZXIgdG8gdGFrZSBzdGVwcyBhdCB0aGUgcmVxdWVzdCBvZiB0aGUgZGF0YSBzdWJqZWN0IHByaW9yIHRvIGVudGVyaW5nIGludG8gYSBjb250cmFjdCcnJworCX0KKwkgCiAJIGRlZiBnZXRQZXJzb25hbERhdGFGcm9tUHJvY2VzcyhQcm9jZXNzUHJpbmNpcGxlIFByb2Nlc3NQcmluY2lwbGUpewogCQl2YXIgcmVzdWx0ID0gIiIKIAkgCQpkaWZmIC0tZ2l0IGEvcGx1Z2lucy9yZXEvb3JnLmVjbGlwc2UucGFweXJ1cy5wZHA0ZW5nLnJlcS5tZXRhcmVxL3h0ZW5kLWdlbi9vcmcvZWNsaXBzZS9wYXB5cnVzL3BkcDRlbmcvcmVxL21ldGFyZXEvR0RQUlJlcXVpcmVtZW50cy5qYXZhIGIvcGx1Z2lucy9yZXEvb3JnLmVjbGlwc2UucGFweXJ1cy5wZHA0ZW5nLnJlcS5tZXRhcmVxL3h0ZW5kLWdlbi9vcmcvZWNsaXBzZS9wYXB5cnVzL3BkcDRlbmcvcmVxL21ldGFyZXEvR0RQUlJlcXVpcmVtZW50cy5qYXZhCmluZGV4IDQwN2Q1NDguLmYxODU3ZjUgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvcmVxL29yZy5lY2xpcHNlLnBhcHlydXMucGRwNGVuZy5yZXEubWV0YXJlcS94dGVuZC1nZW4vb3JnL2VjbGlwc2UvcGFweXJ1cy9wZHA0ZW5nL3JlcS9tZXRhcmVxL0dEUFJSZXF1aXJlbWVudHMuamF2YQorKysgYi9wbHVnaW5zL3JlcS9vcmcuZWNsaXBzZS5wYXB5cnVzLnBkcDRlbmcucmVxLm1ldGFyZXEveHRlbmQtZ2VuL29yZy9lY2xpcHNlL3BhcHlydXMvcGRwNGVuZy9yZXEvbWV0YXJlcS9HRFBSUmVxdWlyZW1lbnRzLmphdmEKQEAgLTIxLDEyICsyMSwxNCBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLnBhcHlydXMucGRwNGVuZy5yZXEucHJvZmlsZS5wZHA0ZW5nUmVxR0RQUi5GYWlybHk7CiBpbXBvcnQgb3JnLmVjbGlwc2UucGFweXJ1cy5wZHA0ZW5nLnJlcS5wcm9maWxlLnBkcDRlbmdSZXFHRFBSLkxhd2Z1bDsKIGltcG9ydCBvcmcuZWNsaXBzZS5wYXB5cnVzLnBkcDRlbmcucmVxLnByb2ZpbGUucGRwNGVuZ1JlcUdEUFIuTGF3ZnVsQnlDb25zZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnBhcHlydXMucGRwNGVuZy5yZXEucHJvZmlsZS5wZHA0ZW5nUmVxR0RQUi5MYXdmdWxCeUNvbnRyYWN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLnBhcHlydXMucGRwNGVuZy5yZXEucHJvZmlsZS5wZHA0ZW5nUmVxR0RQUi5QZXJzb25hbERhdGFSZXF1aXJlbWVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS5wYXB5cnVzLnBkcDRlbmcucmVxLnByb2ZpbGUucGRwNGVuZ1JlcUdEUFIuUHJvY2Vzc1ByaW5jaXBsZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5wYXB5cnVzLnBkcDRlbmcucmVxLnByb2ZpbGUucGRwNGVuZ1JlcUdEUFIuUHVycG9zZUxpbWl0YXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UucGFweXJ1cy5wZHA0ZW5nLnJlcS5wcm9maWxlLnBkcDRlbmdSZXFHRFBSLlNlY3VyaXR5U2FmZXR5OwogaW1wb3J0IG9yZy5lY2xpcHNlLnBhcHlydXMucGRwNGVuZy5yZXEucHJvZmlsZS5wZHA0ZW5nUmVxR0RQUi5TdG9yYWdlTGltaXRhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5wYXB5cnVzLnBkcDRlbmcucmVxLnByb2ZpbGUucGRwNGVuZ1JlcUdEUFIuVHJhbnNwYXJlbmN5OworaW1wb3J0IG9yZy5lY2xpcHNlLnVtbDIudW1sLk5hbWVkRWxlbWVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS54dGVuZDIubGliLlN0cmluZ0NvbmNhdGVuYXRpb247CiAKIEBTdXBwcmVzc1dhcm5pbmdzKCJhbGwiKQpAQCAtNTIsMjYgKzU0LDYgQEAKICAgICByZXR1cm4gX2J1aWxkZXI7CiAgIH0KICAgCi0gIHB1YmxpYyBDaGFyU2VxdWVuY2UgZ2V0RGVzY3JpcHRpb25Gb3JMYXdmdWxCeUNvbnNlbnQoZmluYWwgTGF3ZnVsQnlDb25zZW50IGxhd2Z1bEJ5Q29uc2VudCkgewotICAgIFN0cmluZ0NvbmNhdGVuYXRpb24gX2J1aWxkZXIgPSBuZXcgU3RyaW5nQ29uY2F0ZW5hdGlvbigpOwotICAgIF9idWlsZGVyLmFwcGVuZCgiUHJvY2Vzc2luZyBcIiIpOwotICAgIFN0cmluZyBfbmFtZSA9IGxhd2Z1bEJ5Q29uc2VudC5nZXRQcm9jZXNzKCkuZ2V0QmFzZV9OYW1lZEVsZW1lbnQoKS5nZXROYW1lKCk7Ci0gICAgX2J1aWxkZXIuYXBwZW5kKF9uYW1lKTsKLSAgICBfYnVpbGRlci5hcHBlbmQoIlwiIHNoYWxsIGJlIGxhd2Z1bCBpZiB0aGUgZGF0YSBzdWJqZWN0IFwiIik7Ci0gICAgU3RyaW5nIF9uYW1lXzEgPSBsYXdmdWxCeUNvbnNlbnQuZ2V0RGF0YVN1YmplY3QoKS5nZXRCYXNlX05hbWVkRWxlbWVudCgpLmdldE5hbWUoKTsKLSAgICBfYnVpbGRlci5hcHBlbmQoX25hbWVfMSk7Ci0gICAgX2J1aWxkZXIuYXBwZW5kKCJcIiBoYXMgZ2l2ZW4gY29uc2VudCBcIiIpOwotICAgIFN0cmluZyBfbmFtZV8yID0gbGF3ZnVsQnlDb25zZW50LmdldENvbnNlbnQoKS5nZXRCYXNlX05hbWVkRWxlbWVudCgpLmdldE5hbWUoKTsKLSAgICBfYnVpbGRlci5hcHBlbmQoX25hbWVfMik7Ci0gICAgX2J1aWxkZXIuYXBwZW5kKCJcIiB0byB0aGUgcHJvY2Vzc2luZyBvZiBoaXMgb3IgaGVyIHBlcnNvbmFsIGRhdGEgXCIiKTsKLSAgICBTdHJpbmcgX3BlcnNvbmFsRGF0YUZyb21Qcm9jZXNzID0gdGhpcy5nZXRQZXJzb25hbERhdGFGcm9tUHJvY2VzcyhsYXdmdWxCeUNvbnNlbnQpOwotICAgIF9idWlsZGVyLmFwcGVuZChfcGVyc29uYWxEYXRhRnJvbVByb2Nlc3MpOwotICAgIF9idWlsZGVyLmFwcGVuZCgiXCIgZm9yIG9uZSBvciBtb3JlIHNwZWNpZmljIHB1cnBvc2VzICIpOwotICAgIFN0cmluZyBfbmFtZV8zID0gbGF3ZnVsQnlDb25zZW50LmdldFByb2Nlc3MoKS5nZXRDb250cmlidXRlZFRvKCkuZ2V0QmFzZV9OYW1lZEVsZW1lbnQoKS5nZXROYW1lKCk7Ci0gICAgX2J1aWxkZXIuYXBwZW5kKF9uYW1lXzMpOwotICAgIHJldHVybiBfYnVpbGRlcjsKLSAgfQotICAKICAgLyoqCiAgICAqIGdldCBEZXNjcmlwdGlvbiBmb3IgZmFpcmx5IHJlcXVpcmVtZW50cyBmcm9tIGFydGljbGU1LjEKICAgICovCkBAIC0xOTIsNiArMTc0LDUwIEBACiAgICAgcmV0dXJuIF9idWlsZGVyOwogICB9CiAgIAorICAvKioKKyAgICogZ2V0IERlc2NyaXB0aW9uIGZvciBsYXdmdWxsQnlDb25zZW50IHJlcXVpcmVtZW50cyBmcm9tIGFydGljbGU2LjEuYQorICAgKi8KKyAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXREZXNjcmlwdGlvbkZvckxhd2Z1bEJ5Q29uc2VudChmaW5hbCBMYXdmdWxCeUNvbnNlbnQgbGF3ZnVsQnlDb25zZW50KSB7CisgICAgU3RyaW5nQ29uY2F0ZW5hdGlvbiBfYnVpbGRlciA9IG5ldyBTdHJpbmdDb25jYXRlbmF0aW9uKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJQcm9jZXNzaW5nIFwiIik7CisgICAgU3RyaW5nIF9uYW1lID0gbGF3ZnVsQnlDb25zZW50LmdldFByb2Nlc3MoKS5nZXRCYXNlX05hbWVkRWxlbWVudCgpLmdldE5hbWUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoX25hbWUpOworICAgIF9idWlsZGVyLmFwcGVuZCgiXCIgc2hhbGwgYmUgbGF3ZnVsIGlmIHRoZSBkYXRhIHN1YmplY3QgXCIiKTsKKyAgICBTdHJpbmcgX25hbWVfMSA9IGxhd2Z1bEJ5Q29uc2VudC5nZXREYXRhU3ViamVjdCgpLmdldEJhc2VfTmFtZWRFbGVtZW50KCkuZ2V0TmFtZSgpOworICAgIF9idWlsZGVyLmFwcGVuZChfbmFtZV8xKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIlwiIGhhcyBnaXZlbiBjb25zZW50IFwiIik7CisgICAgU3RyaW5nIF9uYW1lXzIgPSBsYXdmdWxCeUNvbnNlbnQuZ2V0Q29uc2VudCgpLmdldEJhc2VfTmFtZWRFbGVtZW50KCkuZ2V0TmFtZSgpOworICAgIF9idWlsZGVyLmFwcGVuZChfbmFtZV8yKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIlwiIHRvIHRoZSBwcm9jZXNzaW5nIG9mIGhpcyBvciBoZXIgcGVyc29uYWwgZGF0YSA6XCIiKTsKKyAgICBTdHJpbmcgX3BlcnNvbmFsRGF0YUZyb21Qcm9jZXNzID0gdGhpcy5nZXRQZXJzb25hbERhdGFGcm9tUHJvY2VzcyhsYXdmdWxCeUNvbnNlbnQpOworICAgIF9idWlsZGVyLmFwcGVuZChfcGVyc29uYWxEYXRhRnJvbVByb2Nlc3MpOworICAgIF9idWlsZGVyLmFwcGVuZCgiXCIgZm9yIG9uZSBvciBtb3JlIHNwZWNpZmljIHB1cnBvc2VzICIpOworICAgIFN0cmluZyBfbmFtZV8zID0gbGF3ZnVsQnlDb25zZW50LmdldFByb2Nlc3MoKS5nZXRDb250cmlidXRlZFRvKCkuZ2V0QmFzZV9OYW1lZEVsZW1lbnQoKS5nZXROYW1lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKF9uYW1lXzMpOworICAgIHJldHVybiBfYnVpbGRlcjsKKyAgfQorICAKKyAgLyoqCisgICAqIGdldCBEZXNjcmlwdGlvbiBmb3IgbGF3ZnVsbEJ5Q29udHJhY3QgcmVxdWlyZW1lbnRzIGZyb20gYXJ0aWNsZTYuMS5iCisgICAqLworICBwdWJsaWMgQ2hhclNlcXVlbmNlIGdldERlc2NyaXB0aW9uRm9yTGF3ZnVsQnlDb25zZW50KGZpbmFsIExhd2Z1bEJ5Q29udHJhY3QgbGF3ZnVsQnlDb250cmFjdCkgeworICAgIFN0cmluZ0NvbmNhdGVuYXRpb24gX2J1aWxkZXIgPSBuZXcgU3RyaW5nQ29uY2F0ZW5hdGlvbigpOworICAgIF9idWlsZGVyLmFwcGVuZCgiUHJvY2Vzc2luZyBcIiIpOworICAgIFN0cmluZyBfbmFtZSA9IGxhd2Z1bEJ5Q29udHJhY3QuZ2V0UHJvY2VzcygpLmdldEJhc2VfTmFtZWRFbGVtZW50KCkuZ2V0TmFtZSgpOworICAgIF9idWlsZGVyLmFwcGVuZChfbmFtZSk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcIiBzaGFsbCBiZSBsYXdmdWwgaWYgcHJvY2Vzc2luZyBcIiIpOworICAgIFN0cmluZyBfbmFtZV8xID0gbGF3ZnVsQnlDb250cmFjdC5nZXRQcm9jZXNzKCkuZ2V0QmFzZV9OYW1lZEVsZW1lbnQoKS5nZXROYW1lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKF9uYW1lXzEpOworICAgIF9idWlsZGVyLmFwcGVuZCgiXCIgaXMgbmVjZXNzYXJ5IGZvciB0aGUgcGVyZm9ybWFuY2Ugb2YgdGhlIGNvbnRyYWN0OlwiIik7CisgICAgTmFtZWRFbGVtZW50IF9iYXNlX05hbWVkRWxlbWVudCA9IGxhd2Z1bEJ5Q29udHJhY3QuZ2V0Q29udHJhY3QoKS5nZXRCYXNlX05hbWVkRWxlbWVudCgpOworICAgIF9idWlsZGVyLmFwcGVuZChfYmFzZV9OYW1lZEVsZW1lbnQpOworICAgIF9idWlsZGVyLmFwcGVuZCgiXCIgdG8gd2hpY2ggdGhlIGRhdGEgc3ViamVjdDpcIiIpOworICAgIFN0cmluZyBfbmFtZV8yID0gbGF3ZnVsQnlDb250cmFjdC5nZXREYXRhU3ViamVjdCgpLmdldEJhc2VfTmFtZWRFbGVtZW50KCkuZ2V0TmFtZSgpOworICAgIF9idWlsZGVyLmFwcGVuZChfbmFtZV8yKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIlwiIGlzIHBhcnR5IG9yIGluIG9yZGVyIHRvIHRha2Ugc3RlcHMgYXQgdGhlIHJlcXVlc3Qgb2YgdGhlIGRhdGEgc3ViamVjdCBwcmlvciB0byBlbnRlcmluZyBpbnRvIGEgY29udHJhY3QiKTsKKyAgICByZXR1cm4gX2J1aWxkZXI7CisgIH0KKyAgCiAgIHB1YmxpYyBTdHJpbmcgZ2V0UGVyc29uYWxEYXRhRnJvbVByb2Nlc3MoZmluYWwgUHJvY2Vzc1ByaW5jaXBsZSBQcm9jZXNzUHJpbmNpcGxlKSB7CiAgICAgU3RyaW5nIHJlc3VsdCA9ICIiOwogICAgIEVMaXN0PFBlcnNvbmFsRGF0YVJlcXVpcmVtZW50PiBfcGVyc29uYWxEYXRhID0gUHJvY2Vzc1ByaW5jaXBsZS5nZXRQZXJzb25hbERhdGEoKTsKZGlmZiAtLWdpdCBhL3BsdWdpbnMvcmVxL29yZy5lY2xpcHNlLnBhcHlydXMucGRwNGVuZy5yZXEudWkvc3JjL29yZy9lY2xpcHNlL3BhcHlydXMvcGRwNGVuZy9yZXEvdWkvR2VuZXJhdGVHRFBSUmVxdWlyZW1lbnRIYW5kbGVyLmphdmEgYi9wbHVnaW5zL3JlcS9vcmcuZWNsaXBzZS5wYXB5cnVzLnBkcDRlbmcucmVxLnVpL3NyYy9vcmcvZWNsaXBzZS9wYXB5cnVzL3BkcDRlbmcvcmVxL3VpL0dlbmVyYXRlR0RQUlJlcXVpcmVtZW50SGFuZGxlci5qYXZhCmluZGV4IDY4ZDZkMmYuLjFkMWJjY2EgMTAwNjQ0Ci0tLSBhL3BsdWdpbnMvcmVxL29yZy5lY2xpcHNlLnBhcHlydXMucGRwNGVuZy5yZXEudWkvc3JjL29yZy9lY2xpcHNlL3BhcHlydXMvcGRwNGVuZy9yZXEvdWkvR2VuZXJhdGVHRFBSUmVxdWlyZW1lbnRIYW5kbGVyLmphdmEKKysrIGIvcGx1Z2lucy9yZXEvb3JnLmVjbGlwc2UucGFweXJ1cy5wZHA0ZW5nLnJlcS51aS9zcmMvb3JnL2VjbGlwc2UvcGFweXJ1cy9wZHA0ZW5nL3JlcS91aS9HZW5lcmF0ZUdEUFJSZXF1aXJlbWVudEhhbmRsZXIuamF2YQpAQCAtNDIsNiArNDIsOCBAQAogCQkJCXRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluLmdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoZ2VuZXJhdG9yLmdlbmVyYXRlQXJ0aWNsZTUxZCh0cmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiwgKFBhY2thZ2Upc2VsZWN0ZWRFbGVtZW50KSk7CiAJCQkJdHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4uZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShnZW5lcmF0b3IuZ2VuZXJhdGVBcnRpY2xlNTFlKHRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluLCAoUGFja2FnZSlzZWxlY3RlZEVsZW1lbnQpKTsKIAkJCQl0cmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbi5nZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKGdlbmVyYXRvci5nZW5lcmF0ZUFydGljbGU1MWYodHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4sIChQYWNrYWdlKXNlbGVjdGVkRWxlbWVudCkpOworCQkJCXRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluLmdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUoZ2VuZXJhdG9yLmdlbmVyYXRlQXJ0aWNsZTYxYSh0cmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiwgKFBhY2thZ2Upc2VsZWN0ZWRFbGVtZW50KSk7CisJCQkJdHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4uZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShnZW5lcmF0b3IuZ2VuZXJhdGVBcnRpY2xlNjFiKHRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluLCAoUGFja2FnZSlzZWxlY3RlZEVsZW1lbnQpKTsKIAkJCQkKIAkJCX0KIAkJCXJldHVybiBudWxsOwo=