ZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci8uY2xhc3NwYXRoIGIvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yLy5jbGFzc3BhdGgKaW5kZXggY2U3MzkzMy4uNWYwMzY0MCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yLy5jbGFzc3BhdGgKKysrIGIvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yLy5jbGFzc3BhdGgKQEAgLTMsNSArMyw2IEBACiAJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+CiAJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNCIvPgogCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InRlc3RzIi8+CiAJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+CiA8L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9NRVRBLUlORi9NQU5JRkVTVC5NRgppbmRleCA5ZjNiMGFhLi41MjJhODJjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIGIvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL01FVEEtSU5GL01BTklGRVNULk1GCkBAIC0xLDE5ICsxLDIzIEBACiBNYW5pZmVzdC1WZXJzaW9uOiAxLjAKIEJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiBNZXNzYWdlcyBFZGl0b3IgUGx1Zy1pbgorQnVuZGxlLU5hbWU6ICVwbHVnaW4ubmFtZQogQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC4wCitCdW5kbGUtVmVyc2lvbjogMS4wLjEKIEJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci5wbHVnaW4uTWVzc2FnZXNFZGl0b3JQbHVnaW4KIFJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS51aSwKICBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCiAgb3JnLmVjbGlwc2UuamZhY2UudGV4dCwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcywKICBvcmcuZWNsaXBzZS51aS5lZGl0b3JzLAogIG9yZy5lY2xpcHNlLnVpLmlkZSwKICBvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gudGV4dGVkaXRvciwKICBvcmcuZWNsaXBzZS51aS52aWV3cywKKyBvcmcuZWNsaXBzZS51aS5mb3JtcztidW5kbGUtdmVyc2lvbj0iMy4yLjAiLAorIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSIzLjIuMCIsCisgb3JnLmVjbGlwc2UuamR0LmNvcmU7YnVuZGxlLXZlcnNpb249IjMuMi4wIiwKKyBvcmcuZWNsaXBzZS5wZGUuY29yZTtidW5kbGUtdmVyc2lvbj0iMy4yLjAiLAorIG9yZy5qdW5pdDtyZXNvbHV0aW9uOj1vcHRpb25hbCwKICBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotQnVuZGxlLVZlbmRvcjogRWNsaXBzZQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS40CitCdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQorQnVuZGxlLVZlbmRvcjogJXBsdWdpbi5wcm92aWRlcgorQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CiBCdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9pY29ucy9lbGNsMTYvY2xlYXJfY28uZ2lmIGIvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL2ljb25zL2VsY2wxNi9jbGVhcl9jby5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWYzMGE0MgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9pY29ucy9lbGNsMTYvY2xlYXJfY28uZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9pY29ucy9lbGNsMTYvY29uZl9jb2x1bW5zLmdpZiBiL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9pY29ucy9lbGNsMTYvY29uZl9jb2x1bW5zLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZWYwZWQ3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL2ljb25zL2VsY2wxNi9jb25mX2NvbHVtbnMuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9pY29ucy9lbGNsMTYvZXhwb3J0LmdpZiBiL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9pY29ucy9lbGNsMTYvZXhwb3J0LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDY1Njk5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL2ljb25zL2VsY2wxNi9leHBvcnQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9pY29ucy9lbGNsMTYvZmlsdGVyX29iai5naWYgYi9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IvaWNvbnMvZWxjbDE2L2ZpbHRlcl9vYmouZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmNTFiZDUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IvaWNvbnMvZWxjbDE2L2ZpbHRlcl9vYmouZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9pY29ucy9lbGNsMTYvcmVmcmVzaC5naWYgYi9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IvaWNvbnMvZWxjbDE2L3JlZnJlc2guZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjYTA0ZDAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IvaWNvbnMvZWxjbDE2L3JlZnJlc2guZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9pY29ucy9vYmoxNi9ubHNfZWRpdG9yLmdpZiBiL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9pY29ucy9vYmoxNi9ubHNfZWRpdG9yLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjkxM2QwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL2ljb25zL29iajE2L25sc19lZGl0b3IuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9wbHVnaW4ucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9wbHVnaW4ucHJvcGVydGllcwppbmRleCAxNjFiN2Q1Li45ODA5NDZlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IvcGx1Z2luLnByb3BlcnRpZXMKKysrIGIvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3BsdWdpbi5wcm9wZXJ0aWVzCkBAIC0xLDcgKzEsNyBAQAogZWRpdG9yLnRpdGxlID0gTWVzc2FnZXMgRWRpdG9yCiAKIHBsdWdpbi5uYW1lICAgICA9IE1lc3NhZ2VzIEVkaXRvciBQbHVnLWluCi1wbHVnaW4ucHJvdmlkZXIgPSBFY2xpcHNlCitwbHVnaW4ucHJvdmlkZXIgPSBFY2xpcHNlLm9yZwogCiBwcmVmcy5mb3JtYXR0aW5nICA9IEZvcm1hdHRpbmcKIHByZWZzLnBlcmZvcm1hbmNlID0gUmVwb3J0cwpAQCAtMTYsMyArMTYsNyBAQAogCiByZW1vdmVOYXR1cmVBY3Rpb24ubGFiZWwgPSBEaXNhYmxlICZsb2NhbGl6YXRpb24gcHJvcGVydGllcyB2YWxpZGF0b3IKIHJlbW92ZU5hdHVyZUFjdGlvbi50b29sdGlwID0gUmVtb3ZlIHRoZSBsb2NhbGl6YXRpb24gdmFsaWRhdG9yIGJ1aWxkZXIKKworbG9jYWxpemF0aW9uRWRpdG9yTmFtZSA9IExvY2FsaXphdGlvbiBFZGl0b3IKK2NvbW1hbmRfb3BlbkxvY2FsaXphdGlvbkVkaXRvcl9uYW1lID0gT3BlbiBMb2NhbGl6YXRpb24gRWRpdG9yCitjb21tYW5kX29wZW5Mb2NhbGl6YXRpb25FZGl0b3JfbW5lbW9uaWMgPSBMClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3BsdWdpbi54bWwgYi9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IvcGx1Z2luLnhtbAppbmRleCBhOTRmNzExLi4wMTNmOWEzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IvcGx1Z2luLnhtbAorKysgYi9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IvcGx1Z2luLnhtbApAQCAtMTYxLDQgKzE2MSw0NCBAQAogICAgICAgIDwvZGVzY3JpcHRpb24+CiAgICAgPC93aXphcmQ+CiAgPC9leHRlbnNpb24+CisKKworCisgICA8ZXh0ZW5zaW9uCisgICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuZWxlbWVudEZhY3RvcmllcyI+CisgICAgICA8ZmFjdG9yeQorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnBkZS5ubHMuaW50ZXJuYWwudWkuZWRpdG9yLkxvY2FsaXphdGlvbkVkaXRvcklucHV0RmFjdG9yeSIKKyAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5wZGUubmxzLnVpLkxvY2FsaXphdGlvbkVkaXRvcklucHV0RmFjdG9yeSIvPgorICAgPC9leHRlbnNpb24+CisKKyAgIDxleHRlbnNpb24KKyAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzIj4KKyAgICAgIDxlZGl0b3IKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5wZGUubmxzLmludGVybmFsLnVpLmVkaXRvci5Mb2NhbGl6YXRpb25FZGl0b3IiCisgICAgICAgICAgICBpY29uPSJpY29ucy9vYmoxNi9ubHNfZWRpdG9yLmdpZiIKKyAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5wZGUubmxzLnVpLkxvY2FsaXphdGlvbkVkaXRvciIKKyAgICAgICAgICAgIG5hbWU9IiVsb2NhbGl6YXRpb25FZGl0b3JOYW1lIi8+CisgICA8L2V4dGVuc2lvbj4KKworICAgPGV4dGVuc2lvbgorICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmNvbW1hbmRzIj4KKyAgICAgIDxjb21tYW5kCisgICAgICAgICAgICBkZWZhdWx0SGFuZGxlcj0ib3JnLmVjbGlwc2UucGRlLm5scy5pbnRlcm5hbC51aS5PcGVuTG9jYWxpemF0aW9uRWRpdG9ySGFuZGxlciIKKyAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5wZGUubmxzLnVpLk9wZW5Mb2NhbGl6YXRpb25FZGl0b3IiCisgICAgICAgICAgICBuYW1lPSIlY29tbWFuZF9vcGVuTG9jYWxpemF0aW9uRWRpdG9yX25hbWUiPgorICAgICAgPC9jb21tYW5kPgorICAgPC9leHRlbnNpb24+CisgICAKKyAgIDxleHRlbnNpb24KKyAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5tZW51cyI+CisgICAgICA8bWVudUNvbnRyaWJ1dGlvbgorICAgICAgICAgICAgbG9jYXRpb25VUkk9Im1lbnU6ZWRpdD9hZnRlcj1hZGRpdGlvbnMiPgorICAgICAgICAgPGNvbW1hbmQKKyAgICAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2UucGRlLm5scy51aS5PcGVuTG9jYWxpemF0aW9uRWRpdG9yIgorICAgICAgICAgICAgICAgbW5lbW9uaWM9IiVjb21tYW5kX29wZW5Mb2NhbGl6YXRpb25FZGl0b3JfbW5lbW9uaWMiCisgICAgICAgICAgICAgICBzdHlsZT0icHVzaCI+CisgICAgICAgICA8L2NvbW1hbmQ+CisgICAgICA8L21lbnVDb250cmlidXRpb24+CisgICA8L2V4dGVuc2lvbj4KKwogPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL2JhYmVsL2VkaXRvci9NZXNzYWdlc0VkaXRvci5qYXZhIGIvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9lZGl0b3IvTWVzc2FnZXNFZGl0b3IuamF2YQppbmRleCA3ZjM4NjZkLi42NzU3MWVkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL2JhYmVsL2VkaXRvci9NZXNzYWdlc0VkaXRvci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvZWRpdG9yL01lc3NhZ2VzRWRpdG9yLmphdmEKQEAgLTM4LDcgKzM4LDYgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkVycm9yRGlhbG9nOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CiBpbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwogaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9lZGl0b3IvYnVpbGRlci9CdWlsZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL2JhYmVsL2VkaXRvci9idWlsZGVyL0J1aWxkZXIuamF2YQppbmRleCBiMDU0ZTk0Li5iN2NlODVjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL2JhYmVsL2VkaXRvci9idWlsZGVyL0J1aWxkZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL2JhYmVsL2VkaXRvci9idWlsZGVyL0J1aWxkZXIuamF2YQpAQCAtMTcsMTAgKzE3LDggQEAKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKLS8vaW1wb3J0IG9yZy5hcGFjaGUubHVjZW5lLmluZGV4LkNvcnJ1cHRJbmRleEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UuTWVzc2FnZXNCdW5kbGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLk1lc3NhZ2VzQnVuZGxlR3JvdXA7Ci0vL2ltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IuYnVpbGRlci5pbmRleGVyLkluZGV4ZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yLmJ1bmRsZS5NZXNzYWdlc0J1bmRsZUdyb3VwRmFjdG9yeTsKIGltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IucGx1Z2luLk1lc3NhZ2VzRWRpdG9yUGx1Z2luOwogaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci5yZXNvdXJjZS52YWxpZGF0b3IuRmlsZU1hcmtlclN0cmF0ZWd5OwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9lZGl0b3IvaTE4bi9JMThOUGFnZS5qYXZhIGIvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9lZGl0b3IvaTE4bi9JMThOUGFnZS5qYXZhCmluZGV4IDgwM2NhZTcuLmU4N2I2YTcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvZWRpdG9yL2kxOG4vSTE4TlBhZ2UuamF2YQorKysgYi9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL2JhYmVsL2VkaXRvci9pMThuL0kxOE5QYWdlLmphdmEKQEAgLTIwLDcgKzIwLDYgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IuTWVzc2FnZXNFZGl0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yLk1lc3NhZ2VzRWRpdG9yQ2hhbmdlQWRhcHRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IudXRpbC5VSVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JVG9vbEJhck1hbmFnZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKIGltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlNhc2hGb3JtOwogaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU2Nyb2xsZWRDb21wb3NpdGU7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL2JhYmVsL2VkaXRvci9pMThuL1NpZGVOYXZUZXh0Qm94Q29tcG9zaXRlLmphdmEgYi9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL2JhYmVsL2VkaXRvci9pMThuL1NpZGVOYXZUZXh0Qm94Q29tcG9zaXRlLmphdmEKaW5kZXggOWQxYTk0Ni4uZjk3YWNlMiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9lZGl0b3IvaTE4bi9TaWRlTmF2VGV4dEJveENvbXBvc2l0ZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvZWRpdG9yL2kxOG4vU2lkZU5hdlRleHRCb3hDb21wb3NpdGUuamF2YQpAQCAtMTAsNiArMTAsMTEgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci5pMThuOwogCitpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLnRyZWUuS2V5VHJlZU5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLnRyZWUudmlzaXRvci5Ob2RlUGF0aFJlZ2V4VmlzaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IuTWVzc2FnZXNFZGl0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yLk1lc3NhZ2VzRWRpdG9yQ2hhbmdlQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IucGx1Z2luLk1lc3NhZ2VzRWRpdG9yUGx1Z2luOwogaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CiBpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlBZGFwdGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5RXZlbnQ7CkBAIC0yMywxMyArMjgsNiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwogCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UudHJlZS5LZXlUcmVlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UudHJlZS52aXNpdG9yLk5vZGVQYXRoUmVnZXhWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci5NZXNzYWdlc0VkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IuTWVzc2FnZXNFZGl0b3JDaGFuZ2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci5wbHVnaW4uTWVzc2FnZXNFZGl0b3JQbHVnaW47Ci0KIC8qKgogICogVHJlZSBmb3IgZGlzcGxheWluZyBhbmQgbmF2aWdhdGluZyB0aHJvdWdoIHJlc291cmNlIGJ1bmRsZSBrZXlzLgogICogQGF1dGhvciBQYXNjYWwgRXNzaWVtYnJlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL2JhYmVsL2VkaXRvci9pMThuL2FjdGlvbnMvU2hvd0R1cGxpY2F0ZUFjdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9lZGl0b3IvaTE4bi9hY3Rpb25zL1Nob3dEdXBsaWNhdGVBY3Rpb24uamF2YQppbmRleCA1YmRiYWY4Li5hOTU4NmQ3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL2JhYmVsL2VkaXRvci9pMThuL2FjdGlvbnMvU2hvd0R1cGxpY2F0ZUFjdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvZWRpdG9yL2kxOG4vYWN0aW9ucy9TaG93RHVwbGljYXRlQWN0aW9uLmphdmEKQEAgLTEyLDggKzEyLDYgQEAKIAogaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CiAKLWltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UuTWVzc2FnZXNCdW5kbGVHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UuY2hlY2tzLkR1cGxpY2F0ZVZhbHVlQ2hlY2s7CiBpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yLnV0aWwuVUlVdGlsczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvZWRpdG9yL2kxOG4vYWN0aW9ucy9TaG93U2ltaWxhckFjdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9lZGl0b3IvaTE4bi9hY3Rpb25zL1Nob3dTaW1pbGFyQWN0aW9uLmphdmEKaW5kZXggMGViZmQwMy4uYzQ5MTBiZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9lZGl0b3IvaTE4bi9hY3Rpb25zL1Nob3dTaW1pbGFyQWN0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9lZGl0b3IvaTE4bi9hY3Rpb25zL1Nob3dTaW1pbGFyQWN0aW9uLmphdmEKQEAgLTEyLDcgKzEyLDYgQEAKIAogaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CiAKLWltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UuTWVzc2FnZXNCdW5kbGVHcm91cDsKIGltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IudXRpbC5VSVV0aWxzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9lZGl0b3IvcGx1Z2luL01lc3NhZ2VzRWRpdG9yUGx1Z2luLmphdmEgYi9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL2JhYmVsL2VkaXRvci9wbHVnaW4vTWVzc2FnZXNFZGl0b3JQbHVnaW4uamF2YQppbmRleCBkY2U4MjgzLi5iNWI0NTFkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL2JhYmVsL2VkaXRvci9wbHVnaW4vTWVzc2FnZXNFZGl0b3JQbHVnaW4uamF2YQorKysgYi9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL2JhYmVsL2VkaXRvci9wbHVnaW4vTWVzc2FnZXNFZGl0b3JQbHVnaW4uamF2YQpAQCAtMzAsNyArMzAsMTIgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkZpbGVMb2NhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnBkZS5ubHMuaW50ZXJuYWwudWkubW9kZWwuUmVzb3VyY2VCdW5kbGVNb2RlbDsKIGltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKIGltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKIApAQCAtNjQsNiArNjksOCBAQAogCS8vcHJpdmF0ZSBNYXA8U3RyaW5nLFNldDxTaW1wbGVSZXNvdXJjZUNoYW5nZUxpc3RuZXJzPj4gcmVzb3VyY2VDaGFuZ2VTdWJzY3JpYmVyczsKIAlwcml2YXRlIE1hcCByZXNvdXJjZUNoYW5nZVN1YnNjcmliZXJzOwogCQorCXByaXZhdGUgUmVzb3VyY2VCdW5kbGVNb2RlbCBtb2RlbDsKKwogCS8qKgogCSAqIFRoZSBjb25zdHJ1Y3RvcgogCSAqLwpAQCAtMjI4LDQgKzIzNSw2NSBAQAogCXByb3RlY3RlZCBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZSgpIHsKIAkJcmV0dXJuIHJlc291cmNlQnVuZGxlOwogCX0KKwkKKwkvLyBTdGVmYW4ncyBhY3RpdmF0b3IgbWV0aG9kczoKKwkKKwkvKioKKwkgKiBSZXR1cm5zIGFuIGltYWdlIGRlc2NyaXB0b3IgZm9yIHRoZSBnaXZlbiBpY29uIGZpbGVuYW1lLgorCSAqIAorCSAqIEBwYXJhbSBmaWxlbmFtZSB0aGUgaWNvbiBmaWxlbmFtZSByZWxhdGl2ZSB0byB0aGUgaWNvbnMgcGF0aAorCSAqIEByZXR1cm4gdGhlIGltYWdlIGRlc2NyaXB0b3IKKwkgKi8KKwlwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIGZpbGVuYW1lKSB7CisJCVN0cmluZyBpY29uUGF0aCA9ICJpY29ucy8iOyAvLyROT04tTkxTLTEkCisJCXJldHVybiBpbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKFBMVUdJTl9JRCwgaWNvblBhdGggKyBmaWxlbmFtZSk7CisJfQorCisJcHVibGljIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZU1vZGVsIGdldE1vZGVsKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgeworCQlpZiAocGx1Z2luLm1vZGVsID09IG51bGwpIHsKKwkJCXBsdWdpbi5tb2RlbCA9IG5ldyBSZXNvdXJjZUJ1bmRsZU1vZGVsKG1vbml0b3IpOworCQl9CisJCXJldHVybiBwbHVnaW4ubW9kZWw7CisJfQorCisJcHVibGljIHN0YXRpYyB2b2lkIGRpc3Bvc2VNb2RlbCgpIHsKKwkJaWYgKHBsdWdpbiAhPSBudWxsKSB7CisJCQlwbHVnaW4ubW9kZWwgPSBudWxsOworCQl9CisJfQorCisJLy8gTG9nZ2luZworCisJLyoqCisJICogQWRkcyB0aGUgZ2l2ZW4gZXhjZXB0aW9uIHRvIHRoZSBsb2cuCisJICogCisJICogQHBhcmFtIGUgdGhlIGV4Y2VwdGlvbiB0byBsb2cKKwkgKiBAcmV0dXJuIHRoZSBsb2dnZWQgc3RhdHVzCisJICovCisJcHVibGljIHN0YXRpYyBJU3RhdHVzIGxvZyhUaHJvd2FibGUgZSkgeworCQlyZXR1cm4gbG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUExVR0lOX0lELCAwLCAiSW50ZXJuYWwgZXJyb3IuIiwgZSkpOworCX0KKworCS8qKgorCSAqIEFkZHMgdGhlIGdpdmVuIGV4Y2VwdGlvbiB0byB0aGUgbG9nLgorCSAqIAorCSAqIEBwYXJhbSBleGNlcHRpb24gdGhlIGV4Y2VwdGlvbiB0byBsb2cKKwkgKiBAcmV0dXJuIHRoZSBsb2dnZWQgc3RhdHVzCisJICovCisJcHVibGljIHN0YXRpYyBJU3RhdHVzIGxvZyhTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgeworCQlyZXR1cm4gbG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUExVR0lOX0lELCAtMSwgbWVzc2FnZSwgZXhjZXB0aW9uKSk7CisJfQorCisJLyoqCisJICogQWRkcyB0aGUgZ2l2ZW4gPGNvZGU+SVN0YXR1czwvY29kZT4gdG8gdGhlIGxvZy4KKwkgKiAKKwkgKiBAcGFyYW0gc3RhdHVzIHRoZSBzdGF0dXMgdG8gbG9nCisJICogQHJldHVybiB0aGUgbG9nZ2VkIHN0YXR1cworCSAqLworCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBsb2coSVN0YXR1cyBzdGF0dXMpIHsKKwkJZ2V0RGVmYXVsdCgpLmdldExvZygpLmxvZyhzdGF0dXMpOworCQlyZXR1cm4gc3RhdHVzOworCX0KKworCQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9lZGl0b3IvcmVzb3VyY2UvRWNsaXBzZVByb3BlcnRpZXNFZGl0b3JSZXNvdXJjZS5qYXZhIGIvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9lZGl0b3IvcmVzb3VyY2UvRWNsaXBzZVByb3BlcnRpZXNFZGl0b3JSZXNvdXJjZS5qYXZhCmluZGV4IGVlZjQyZTcuLjkyOGRlYzIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvZWRpdG9yL3Jlc291cmNlL0VjbGlwc2VQcm9wZXJ0aWVzRWRpdG9yUmVzb3VyY2UuamF2YQorKysgYi9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL2JhYmVsL2VkaXRvci9yZXNvdXJjZS9FY2xpcHNlUHJvcGVydGllc0VkaXRvclJlc291cmNlLmphdmEKQEAgLTEyLDE0ICsxMiwxMCBAQAogCiBpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKIAotaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5BYnN0cmFjdElGaWxlQ2hhbmdlTGlzdGVuZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLnJlc291cmNlLkFic3RyYWN0UHJvcGVydGllc1Jlc291cmNlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5yZXNvdXJjZS5zZXIuUHJvcGVydGllc0Rlc2VyaWFsaXplcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UucmVzb3VyY2Uuc2VyLlByb3BlcnRpZXNTZXJpYWxpemVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47CiBpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudEV2ZW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50TGlzdGVuZXI7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL2JhYmVsL2VkaXRvci9yZXNvdXJjZS92YWxpZGF0b3IvRmlsZU1hcmtlclN0cmF0ZWd5LmphdmEgYi9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL2JhYmVsL2VkaXRvci9yZXNvdXJjZS92YWxpZGF0b3IvRmlsZU1hcmtlclN0cmF0ZWd5LmphdmEKaW5kZXggOThmMzI1OC4uMzE3YzhhNyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9lZGl0b3IvcmVzb3VyY2UvdmFsaWRhdG9yL0ZpbGVNYXJrZXJTdHJhdGVneS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvZWRpdG9yL3Jlc291cmNlL3ZhbGlkYXRvci9GaWxlTWFya2VyU3RyYXRlZ3kuamF2YQpAQCAtMTAsMTYgKzEwLDE0IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IucmVzb3VyY2UudmFsaWRhdG9yOwogCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci0KLQogaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5jaGVja3MuRHVwbGljYXRlVmFsdWVDaGVjazsKIGltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5jb3JlLm1lc3NhZ2UuY2hlY2tzLk1pc3NpbmdWYWx1ZUNoZWNrOwogaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUudXRpbC5CYWJlbFV0aWxzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci5wbHVnaW4uTWVzc2FnZXNFZGl0b3JQbHVnaW47CiBpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yLnByZWZlcmVuY2VzLk1zZ0VkaXRvclByZWZlcmVuY2VzOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwogCiAvKioKICAqIEBhdXRob3IgUGFzY2FsIEVzc2llbWJyZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9lZGl0b3IvdHJlZS9LZXlUcmVlTGFiZWxQcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9iYWJlbC9lZGl0b3IvdHJlZS9LZXlUcmVlTGFiZWxQcm92aWRlci5qYXZhCmluZGV4IDhkMWQ3ODcuLjg4ZjMxYzggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvYmFiZWwvZWRpdG9yL3RyZWUvS2V5VHJlZUxhYmVsUHJvdmlkZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL2JhYmVsL2VkaXRvci90cmVlL0tleVRyZWVMYWJlbFByb3ZpZGVyLmphdmEKQEAgLTExLDI1ICsxMSwxOCBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IudHJlZTsKIAogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS5NZXNzYWdlc0J1bmRsZUdyb3VwOwogaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmNvcmUubWVzc2FnZS50cmVlLklLZXlUcmVlTW9kZWw7CiBpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuY29yZS5tZXNzYWdlLnRyZWUuS2V5VHJlZU5vZGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yLk1lc3NhZ2VzRWRpdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci5NZXNzYWdlc0VkaXRvck1hcmtlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yLnBsdWdpbi5NZXNzYWdlc0VkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IucmVzb3VyY2UudmFsaWRhdG9yLlZhbGlkYXRpb25GYWlsdXJlRXZlbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yLnV0aWwuT3ZlcmxheUltYWdlSWNvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IudXRpbC5VSVV0aWxzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlUmVnaXN0cnk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29sb3JQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklEZWNvcmF0aW9uQ29udGV4dDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklGb250UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxEZWNvcmF0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbERlY29yYXRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9wZGUvbmxzL2ludGVybmFsL3VpL09wZW5Mb2NhbGl6YXRpb25FZGl0b3JIYW5kbGVyLmphdmEgYi9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL3BkZS9ubHMvaW50ZXJuYWwvdWkvT3BlbkxvY2FsaXphdGlvbkVkaXRvckhhbmRsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODNiNWI0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9wZGUvbmxzL2ludGVybmFsL3VpL09wZW5Mb2NhbGl6YXRpb25FZGl0b3JIYW5kbGVyLmphdmEKQEAgLTAsMCArMSw0MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBTdGVmYW4gTfxja2UgYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIFN0ZWZhbiBN/GNrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnBkZS5ubHMuaW50ZXJuYWwudWk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkFic3RyYWN0SGFuZGxlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnBkZS5ubHMuaW50ZXJuYWwudWkuZWRpdG9yLkxvY2FsaXphdGlvbkVkaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5wZGUubmxzLmludGVybmFsLnVpLmVkaXRvci5Mb2NhbGl6YXRpb25FZGl0b3JJbnB1dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7CisKK3B1YmxpYyBjbGFzcyBPcGVuTG9jYWxpemF0aW9uRWRpdG9ySGFuZGxlciBleHRlbmRzIEFic3RyYWN0SGFuZGxlciB7CisKKwlwdWJsaWMgT3BlbkxvY2FsaXphdGlvbkVkaXRvckhhbmRsZXIoKSB7CisJfQorCisJLyoKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuSUhhbmRsZXIjZXhlY3V0ZShvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV2ZW50KQorCSAqLworCXB1YmxpYyBPYmplY3QgZXhlY3V0ZShFeGVjdXRpb25FdmVudCBldmVudCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7CisJCXRyeSB7CisJCQlJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7CisJCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gd2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKKwkJCXBhZ2Uub3BlbkVkaXRvcihuZXcgTG9jYWxpemF0aW9uRWRpdG9ySW5wdXQoKSwgTG9jYWxpemF0aW9uRWRpdG9yLklEKTsKKwkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgeworCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL3BkZS9ubHMvaW50ZXJuYWwvdWkvZGlhbG9ncy9Db25maWd1cmVDb2x1bW5zRGlhbG9nLmphdmEgYi9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL3BkZS9ubHMvaW50ZXJuYWwvdWkvZGlhbG9ncy9Db25maWd1cmVDb2x1bW5zRGlhbG9nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjMxOGM2YQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvcGRlL25scy9pbnRlcm5hbC91aS9kaWFsb2dzL0NvbmZpZ3VyZUNvbHVtbnNEaWFsb2cuamF2YQpAQCAtMCwwICsxLDE5NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBTdGVmYW4gTfxja2UgYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIFN0ZWZhbiBN/GNrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnBkZS5ubHMuaW50ZXJuYWwudWkuZGlhbG9nczsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IucGx1Z2luLk1lc3NhZ2VzRWRpdG9yUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5sYXlvdXQuR3JpZERhdGFGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnBkZS5ubHMuaW50ZXJuYWwudWkucGFyc2VyLkxvY2FsZVV0aWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRvb2xCYXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVG9vbEl0ZW07CisKK3B1YmxpYyBjbGFzcyBDb25maWd1cmVDb2x1bW5zRGlhbG9nIGV4dGVuZHMgRGlhbG9nIHsKKworCXByaXZhdGUgY2xhc3MgQ29sdW1uRmllbGQgeworCQlUZXh0IHRleHQ7CisJCVRvb2xJdGVtIGNsZWFyQnV0dG9uOworCX0KKworCXByaXZhdGUgQXJyYXlMaXN0PENvbHVtbkZpZWxkPiBmaWVsZHMgPSBuZXcgQXJyYXlMaXN0PENvbHVtbkZpZWxkPigpOworCisJcHJpdmF0ZSBBcnJheUxpc3Q8U3RyaW5nPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwlwcml2YXRlIFN0cmluZ1tdIGluaXRpYWxWYWx1ZXM7CisJcHJpdmF0ZSBDb2xvciBlcnJvckNvbG9yOworCisJcHJpdmF0ZSBJbWFnZSBjbGVhckltYWdlOworCisJcHVibGljIENvbmZpZ3VyZUNvbHVtbnNEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIFN0cmluZ1tdIGluaXRpYWxWYWx1ZXMpIHsKKwkJc3VwZXIocGFyZW50U2hlbGwpOworCQlzZXRTaGVsbFN0eWxlKGdldFNoZWxsU3R5bGUoKSB8IFNXVC5SRVNJWkUpOworCQl0aGlzLmluaXRpYWxWYWx1ZXMgPSBpbml0aWFsVmFsdWVzOworCX0KKworCS8qCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93I29wZW4oKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBpbnQgb3BlbigpIHsKKwkJcmV0dXJuIHN1cGVyLm9wZW4oKTsKKwl9CisKKwkvKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdyNjb25maWd1cmVTaGVsbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTaGVsbChTaGVsbCBuZXdTaGVsbCkgeworCQlzdXBlci5jb25maWd1cmVTaGVsbChuZXdTaGVsbCk7CisJCW5ld1NoZWxsLnNldFRleHQoIkNvbmZpZ3VyZSBDb2x1bW5zIik7CisJfQorCisJLyoKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nI2NyZWF0ZURpYWxvZ0FyZWEob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgeworCQlDb21wb3NpdGUgY29tcG9zaXRlID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOworCQlHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSAoR3JpZExheW91dCkgY29tcG9zaXRlLmdldExheW91dCgpOworCQlncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAzOworCisJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOworCQlsYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuQkVHSU5OSU5HLCBTV1QuQ0VOVEVSLCBmYWxzZSwgZmFsc2UpKTsKKwkJbGFiZWwuc2V0VGV4dCgiRW50ZXIgXCJrZXlcIiwgXCJkZWZhdWx0XCIgb3IgbG9jYWxlIChlLmcuIFwiZGVcIiBvciBcInpoX1RXXCIpOiIpOworCQlsYWJlbC5zZXRMYXlvdXREYXRhKEdyaWREYXRhRmFjdG9yeS5maWxsRGVmYXVsdHMoKS5oaW50KDMwMCwgU1dULkRFRkFVTFQpLnNwYW4oMywgMSkuY3JlYXRlKCkpOworCisJCWZpZWxkcy5hZGQoY3JlYXRlTGFuZ3VhZ2VGaWVsZChjb21wb3NpdGUsICJDb2x1bW4gJjE6IikpOworCQlmaWVsZHMuYWRkKGNyZWF0ZUxhbmd1YWdlRmllbGQoY29tcG9zaXRlLCAiQ29sdW1uICYyOiIpKTsKKwkJZmllbGRzLmFkZChjcmVhdGVMYW5ndWFnZUZpZWxkKGNvbXBvc2l0ZSwgIkNvbHVtbiAmMzoiKSk7CisJCWZpZWxkcy5hZGQoY3JlYXRlTGFuZ3VhZ2VGaWVsZChjb21wb3NpdGUsICJDb2x1bW4gJjQ6IikpOworCisJCWlmIChpbml0aWFsVmFsdWVzICE9IG51bGwpIHsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgNCAmJiBpIDwgaW5pdGlhbFZhbHVlcy5sZW5ndGg7IGkrKykgeworCQkJCWZpZWxkcy5nZXQoaSkudGV4dC5zZXRUZXh0KGluaXRpYWxWYWx1ZXNbaV0pOworCQkJfQorCQl9CisJCQorCQlNb2RpZnlMaXN0ZW5lciBtb2RpZnlMaXN0ZW5lciA9IG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKKwkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgeworCQkJCXZhbGlkYXRlKCk7CisJCQl9CisJCX07CisJCWZvciAoQ29sdW1uRmllbGQgZmllbGQgOiBmaWVsZHMpIHsKKwkJCWZpZWxkLnRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobW9kaWZ5TGlzdGVuZXIpOworCQl9CisJCWVycm9yQ29sb3IgPSBuZXcgQ29sb3IoRGlzcGxheS5nZXRDdXJyZW50KCksIDB4ZmYsIDB4N2YsIDB4N2YpOworCisJCXJldHVybiBjb21wb3NpdGU7CisJfQorCQorCS8qCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZyNjcmVhdGVDb250ZW50cyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgeworCQlDb250cm9sIGNvbnRlbnRzID0gc3VwZXIuY3JlYXRlQ29udGVudHMocGFyZW50KTsKKwkJdmFsaWRhdGUoKTsKKwkJcmV0dXJuIGNvbnRlbnRzOworCX0KKworCXByaXZhdGUgQ29sdW1uRmllbGQgY3JlYXRlTGFuZ3VhZ2VGaWVsZChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgbGFiZWxUZXh0KSB7CisJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOworCQlsYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuQkVHSU5OSU5HLCBTV1QuQ0VOVEVSLCBmYWxzZSwgZmFsc2UpKTsKKwkJbGFiZWwuc2V0VGV4dChsYWJlbFRleHQpOworCisJCVRleHQgdGV4dCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULlNJTkdMRSB8IFNXVC5MRUFEIHwgU1dULkJPUkRFUik7CisJCXRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlKSk7CisKKwkJaWYgKGNsZWFySW1hZ2UgPT0gbnVsbCkKKwkJCWNsZWFySW1hZ2UgPSBNZXNzYWdlc0VkaXRvclBsdWdpbi5nZXRJbWFnZURlc2NyaXB0b3IoImVsY2wxNi9jbGVhcl9jby5naWYiKS5jcmVhdGVJbWFnZSgpOyAvLyROT04tTkxTLTEkCisJCQorCQlUb29sQmFyIHRvb2xiYXIgPSBuZXcgVG9vbEJhcihwYXJlbnQsIFNXVC5GTEFUKTsKKwkJVG9vbEl0ZW0gaXRlbSA9IG5ldyBUb29sSXRlbSh0b29sYmFyLCBTV1QuUFVTSCk7CisJCWl0ZW0uc2V0SW1hZ2UoY2xlYXJJbWFnZSk7CisJCWl0ZW0uc2V0VG9vbFRpcFRleHQoIkNsZWFyIik7CisJCWl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKKwkJCQlmb3IgKENvbHVtbkZpZWxkIGZpZWxkIDogZmllbGRzKSB7CisJCQkJCWlmIChmaWVsZC5jbGVhckJ1dHRvbiA9PSBlLndpZGdldCkgeworCQkJCQkJZmllbGQudGV4dC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQl9CisJCQkJfQorCQkJfQorCQl9KTsKKwkJCisJCUNvbHVtbkZpZWxkIGZpZWxkID0gbmV3IENvbHVtbkZpZWxkKCk7CisJCWZpZWxkLnRleHQgPSB0ZXh0OworCQlmaWVsZC5jbGVhckJ1dHRvbiA9IGl0ZW07CisJCXJldHVybiBmaWVsZDsKKwl9CisKKwkvKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2cjb2tQcmVzc2VkKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBva1ByZXNzZWQoKSB7CisJCWZvciAoQ29sdW1uRmllbGQgZmllbGQgOiBmaWVsZHMpIHsKKwkJCVN0cmluZyB0ZXh0ID0gZmllbGQudGV4dC5nZXRUZXh0KCkudHJpbSgpOworCQkJaWYgKHRleHQubGVuZ3RoKCkgPiAwKSB7CisJCQkJcmVzdWx0LmFkZCh0ZXh0KTsKKwkJCX0KKwkJfQorCQlzdXBlci5va1ByZXNzZWQoKTsKKwkJZXJyb3JDb2xvci5kaXNwb3NlKCk7CisJCWNsZWFySW1hZ2UuZGlzcG9zZSgpOworCX0KKworCXB1YmxpYyBTdHJpbmdbXSBnZXRSZXN1bHQoKSB7CisJCXJldHVybiByZXN1bHQudG9BcnJheShuZXcgU3RyaW5nW3Jlc3VsdC5zaXplKCldKTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGUoKSB7CisJCWJvb2xlYW4gaXNWYWxpZCA9IHRydWU7CisJCWZvciAoQ29sdW1uRmllbGQgZmllbGQgOiBmaWVsZHMpIHsKKwkJCVN0cmluZyB0ZXh0ID0gZmllbGQudGV4dC5nZXRUZXh0KCk7CisJCQlpZiAodGV4dC5lcXVhbHMoIiIpIHx8IHRleHQuZXF1YWxzKCJrZXkiKSB8fCB0ZXh0LmVxdWFscygiZGVmYXVsdCIpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCisJCQkJZmllbGQudGV4dC5zZXRCYWNrZ3JvdW5kKG51bGwpOworCQkJfSBlbHNlIHsKKwkJCQl0cnkgeworCQkJCQlMb2NhbGVVdGlsLnBhcnNlTG9jYWxlKHRleHQpOworCQkJCQlmaWVsZC50ZXh0LnNldEJhY2tncm91bmQobnVsbCk7CisJCQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKwkJCQkJZmllbGQudGV4dC5zZXRCYWNrZ3JvdW5kKGVycm9yQ29sb3IpOworCQkJCQlpc1ZhbGlkID0gZmFsc2U7CisJCQkJfQorCQkJfQorCQl9CisJCUJ1dHRvbiBva0J1dHRvbiA9IGdldEJ1dHRvbihJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKTsKKwkJb2tCdXR0b24uc2V0RW5hYmxlZChpc1ZhbGlkKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvcGRlL25scy9pbnRlcm5hbC91aS9kaWFsb2dzL0VkaXRNdWx0aUxpbmVFbnRyeURpYWxvZy5qYXZhIGIvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9wZGUvbmxzL2ludGVybmFsL3VpL2RpYWxvZ3MvRWRpdE11bHRpTGluZUVudHJ5RGlhbG9nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI5NDdkZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvcGRlL25scy9pbnRlcm5hbC91aS9kaWFsb2dzL0VkaXRNdWx0aUxpbmVFbnRyeURpYWxvZy5qYXZhCkBAIC0wLDAgKzEsNzMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggU3RlZmFuIE38Y2tlIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBTdGVmYW4gTfxja2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5wZGUubmxzLmludGVybmFsLnVpLmRpYWxvZ3M7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5sYXlvdXQuR3JpZERhdGFGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKKworcHVibGljIGNsYXNzIEVkaXRNdWx0aUxpbmVFbnRyeURpYWxvZyBleHRlbmRzIERpYWxvZyB7CisKKwlwcml2YXRlIFRleHQgdGV4dFdpZGdldDsKKwlwcml2YXRlIFN0cmluZyB0ZXh0OworCXByaXZhdGUgYm9vbGVhbiByZWFkT25seTsKKwkKKwlwcm90ZWN0ZWQgRWRpdE11bHRpTGluZUVudHJ5RGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBTdHJpbmcgaW5pdGlhbElucHV0LCBib29sZWFuIHJlYWRPbmx5KSB7CisJCXN1cGVyKHBhcmVudFNoZWxsKTsKKwkJdGhpcy5yZWFkT25seSA9IHJlYWRPbmx5OworCQlzZXRTaGVsbFN0eWxlKGdldFNoZWxsU3R5bGUoKSB8IFNXVC5SRVNJWkUpOworCQl0ZXh0ID0gaW5pdGlhbElucHV0OworCX0KKwkKKwkvKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdyNjb25maWd1cmVTaGVsbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTaGVsbChTaGVsbCBuZXdTaGVsbCkgeworCQlzdXBlci5jb25maWd1cmVTaGVsbChuZXdTaGVsbCk7CisJCW5ld1NoZWxsLnNldFRleHQoIkVkaXQgUmVzb3VyY2UgQnVuZGxlIEVudHJ5Iik7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKKwkJcmV0dXJuIHRleHQ7CisJfQorCQorCS8qCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZyNjcmVhdGVEaWFsb2dBcmVhKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKKwkJCisJCWludCByZWFkT25seSA9IHRoaXMucmVhZE9ubHkgPyBTV1QuUkVBRF9PTkxZIDogMDsKKwkJVGV4dCB0ZXh0ID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuTVVMVEkgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuQk9SREVSIHwgcmVhZE9ubHkpOworCQl0ZXh0LnNldExheW91dERhdGEoR3JpZERhdGFGYWN0b3J5LmZpbGxEZWZhdWx0cygpLmdyYWIodHJ1ZSwgdHJ1ZSkuaGludCgzNTAsIDE1MCkuY3JlYXRlKCkpOworCQl0ZXh0LnNldFRleHQodGV4dCA9PSBudWxsID8gIiIgOiB0aGlzLnRleHQpOworCQkKKwkJdGV4dFdpZGdldCA9IHRleHQ7CisJCQorCQlyZXR1cm4gY29tcG9zaXRlOworCX0KKwkKKwkvKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2cjb2tQcmVzc2VkKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBva1ByZXNzZWQoKSB7CisJCXRleHQgPSB0ZXh0V2lkZ2V0LmdldFRleHQoKTsKKwkJc3VwZXIub2tQcmVzc2VkKCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL3BkZS9ubHMvaW50ZXJuYWwvdWkvZGlhbG9ncy9FZGl0UmVzb3VyY2VCdW5kbGVFbnRyaWVzRGlhbG9nLmphdmEgYi9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL3BkZS9ubHMvaW50ZXJuYWwvdWkvZGlhbG9ncy9FZGl0UmVzb3VyY2VCdW5kbGVFbnRyaWVzRGlhbG9nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2VjMWUwNQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvcGRlL25scy9pbnRlcm5hbC91aS9kaWFsb2dzL0VkaXRSZXNvdXJjZUJ1bmRsZUVudHJpZXNEaWFsb2cuamF2YQpAQCAtMCwwICsxLDM5MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBTdGVmYW4gTfxja2UgYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIFN0ZWZhbiBN/GNrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnBkZS5ubHMuaW50ZXJuYWwudWkuZGlhbG9nczsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IucGx1Z2luLk1lc3NhZ2VzRWRpdG9yUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5FcnJvckRpYWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nU2V0dGluZ3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UubGF5b3V0LkdyaWREYXRhRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OworaW1wb3J0IG9yZy5lY2xpcHNlLnBkZS5ubHMuaW50ZXJuYWwudWkubW9kZWwuUmVzb3VyY2VCdW5kbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UucGRlLm5scy5pbnRlcm5hbC51aS5tb2RlbC5SZXNvdXJjZUJ1bmRsZUtleTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5wZGUubmxzLmludGVybmFsLnVpLnBhcnNlci5SYXdCdW5kbGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OworCitwdWJsaWMgY2xhc3MgRWRpdFJlc291cmNlQnVuZGxlRW50cmllc0RpYWxvZyBleHRlbmRzIERpYWxvZyB7CisKKwlwcml2YXRlIGNsYXNzIExvY2FsZUZpZWxkIHsKKwkJUmVzb3VyY2VCdW5kbGUgYnVuZGxlOworCQlMYWJlbCBsYWJlbDsKKwkJVGV4dCB0ZXh0OworCQlMb2NhbGUgbG9jYWxlOworCQlTdHJpbmcgb2xkVmFsdWU7CisJCWJvb2xlYW4gaXNSZWFkT25seTsKKwkJQnV0dG9uIGJ1dHRvbjsKKwl9CisKKwlwcml2YXRlIFJlc291cmNlQnVuZGxlS2V5IHJlc291cmNlQnVuZGxlS2V5OworCXByb3RlY3RlZCBBcnJheUxpc3Q8TG9jYWxlRmllbGQ+IGZpZWxkcyA9IG5ldyBBcnJheUxpc3Q8TG9jYWxlRmllbGQ+KCk7CisJcHJpdmF0ZSBmaW5hbCBMb2NhbGVbXSBsb2NhbGVzOworCXByaXZhdGUgQ29sb3IgZXJyb3JDb2xvcjsKKworCS8qKgorCSAqIEBwYXJhbSBsb2NhbGVzIHRoZSBsb2NhbGVzIHRvIGVkaXQgCisJICovCisJcHVibGljIEVkaXRSZXNvdXJjZUJ1bmRsZUVudHJpZXNEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIExvY2FsZVtdIGxvY2FsZXMpIHsKKwkJc3VwZXIocGFyZW50U2hlbGwpOworCQl0aGlzLmxvY2FsZXMgPSBsb2NhbGVzOworCQlzZXRTaGVsbFN0eWxlKGdldFNoZWxsU3R5bGUoKSB8IFNXVC5SRVNJWkUpOworCX0KKworCXB1YmxpYyB2b2lkIHNldFJlc291cmNlQnVuZGxlS2V5KFJlc291cmNlQnVuZGxlS2V5IHJlc291cmNlQnVuZGxlS2V5KSB7CisJCXRoaXMucmVzb3VyY2VCdW5kbGVLZXkgPSByZXNvdXJjZUJ1bmRsZUtleTsKKwl9CisKKwkvKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdyNvcGVuKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgaW50IG9wZW4oKSB7CisJCWlmIChyZXNvdXJjZUJ1bmRsZUtleSA9PSBudWxsKQorCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlJlc291cmNlIGJ1bmRsZSBrZXkgbm90IHNldC4iKTsKKwkJcmV0dXJuIHN1cGVyLm9wZW4oKTsKKwl9CisKKwkvKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdyNjb25maWd1cmVTaGVsbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTaGVsbChTaGVsbCBuZXdTaGVsbCkgeworCQlzdXBlci5jb25maWd1cmVTaGVsbChuZXdTaGVsbCk7CisJCW5ld1NoZWxsLnNldFRleHQoIkVkaXQgUmVzb3VyY2UgQnVuZGxlIEVudHJpZXMiKTsKKwl9CisKKwkvKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2cjY3JlYXRlRGlhbG9nQXJlYShvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7CisJCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7CisJCUdyaWRMYXlvdXQgZ3JpZExheW91dCA9IChHcmlkTGF5b3V0KSBjb21wb3NpdGUuZ2V0TGF5b3V0KCk7CisJCWdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDM7CisKKwkJTGFiZWwga2V5TGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7CisJCWtleUxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5CRUdJTk5JTkcsIFNXVC5DRU5URVIsIGZhbHNlLCBmYWxzZSkpOworCQlrZXlMYWJlbC5zZXRUZXh0KCImS2V5OiIpOworCisJCWludCBzdHlsZSA9IFNXVC5TSU5HTEUgfCBTV1QuTEVBRCB8IFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZOworCQlUZXh0IGtleVRleHQgPSBuZXcgVGV4dChjb21wb3NpdGUsIHN0eWxlKTsKKwkJa2V5VGV4dC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkNFTlRFUiwgdHJ1ZSwgZmFsc2UpKTsKKwkJa2V5VGV4dC5zZXRUZXh0KHJlc291cmNlQnVuZGxlS2V5LmdldE5hbWUoKSk7CisKKwkJbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOyAvLyBzcGFjZXIKKworCQlmb3IgKExvY2FsZSBsb2NhbGUgOiBsb2NhbGVzKSB7CisJCQlpZiAobG9jYWxlLmdldExhbmd1YWdlKCkuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJZmllbGRzLmFkZChjcmVhdGVMb2NhbGVGaWVsZChjb21wb3NpdGUsIGxvY2FsZSwgIiZEZWZhdWx0IEJ1bmRsZToiKSk7CisJCQl9IGVsc2UgeworCQkJCWZpZWxkcy5hZGQoY3JlYXRlTG9jYWxlRmllbGQoY29tcG9zaXRlLCBsb2NhbGUsICImIiArIGxvY2FsZS5nZXREaXNwbGF5TmFtZSgpICsgIjoiKSk7CisJCQl9CisJCX0KKworCQkvLyBTZXQgZm9jdXMgb24gZmlyc3QgZWRpdGFibGUgZmllbGQKKwkJaWYgKGZpZWxkcy5zaXplKCkgPiAwKSB7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkcy5zaXplKCk7IGkrKykgeworCQkJCWlmIChmaWVsZHMuZ2V0KGkpLnRleHQuZ2V0RWRpdGFibGUoKSkgeworCQkJCQlmaWVsZHMuZ2V0KGkpLnRleHQuc2V0Rm9jdXMoKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisKKwkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7CisJCWxhYmVsLnNldExheW91dERhdGEoR3JpZERhdGFGYWN0b3J5LmZpbGxEZWZhdWx0cygpLnNwYW4oMywgMSkuY3JlYXRlKCkpOworCQlsYWJlbC5zZXRUZXh0KCJOb3RlOiBUaGUgZm9sbG93aW5nIGVzY2FwZSBzZXF1ZW5jZXMgYXJlIGFsbG93ZWQ6IFxcciwgXFxuLCBcXHQsIFxcXFwiKTsKKworCQlNb2RpZnlMaXN0ZW5lciBtb2RpZnlMaXN0ZW5lciA9IG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKKwkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgeworCQkJCXZhbGlkYXRlKCk7CisJCQl9CisJCX07CisJCWZvciAoTG9jYWxlRmllbGQgZmllbGQgOiBmaWVsZHMpIHsKKwkJCWZpZWxkLnRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobW9kaWZ5TGlzdGVuZXIpOworCQl9CisJCWVycm9yQ29sb3IgPSBuZXcgQ29sb3IoRGlzcGxheS5nZXRDdXJyZW50KCksIDB4ZmYsIDB4N2YsIDB4N2YpOworCQkKKwkJcmV0dXJuIGNvbXBvc2l0ZTsKKwl9CisKKwlwcml2YXRlIExvY2FsZUZpZWxkIGNyZWF0ZUxvY2FsZUZpZWxkKENvbXBvc2l0ZSBwYXJlbnQsIExvY2FsZSBsb2NhbGUsIFN0cmluZyBsb2NhbGVMYWJlbCkgeworCQlSZXNvdXJjZUJ1bmRsZSBidW5kbGUgPSByZXNvdXJjZUJ1bmRsZUtleS5nZXRGYW1pbHkoKS5nZXRCdW5kbGUobG9jYWxlKTsKKworCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKKwkJbGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkJFR0lOTklORywgU1dULkNFTlRFUiwgZmFsc2UsIGZhbHNlKSk7CisJCWxhYmVsLnNldFRleHQobG9jYWxlTGFiZWwpOworCisJCWJvb2xlYW4gcmVhZE9ubHkgPSBidW5kbGUgPT0gbnVsbCB8fCBidW5kbGUuaXNSZWFkT25seSgpOworCQlpbnQgc3R5bGUgPSBTV1QuU0lOR0xFIHwgU1dULkxFQUQgfCBTV1QuQk9SREVSIHwgKHJlYWRPbmx5ID8gU1dULlJFQURfT05MWSA6IDApOworCQlUZXh0IHRleHQgPSBuZXcgVGV4dChwYXJlbnQsIHN0eWxlKTsKKwkJdGV4dC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkNFTlRFUiwgdHJ1ZSwgZmFsc2UpKTsKKworCQlTdHJpbmcgdmFsdWUgPSBudWxsOworCQlpZiAoYnVuZGxlICE9IG51bGwpIHsKKwkJCXRyeSB7CisJCQkJdmFsdWUgPSBidW5kbGUuZ2V0U3RyaW5nKHJlc291cmNlQnVuZGxlS2V5LmdldE5hbWUoKSk7CisJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCQlNZXNzYWdlc0VkaXRvclBsdWdpbi5sb2coZSk7CisJCQl9CisJCQlpZiAodmFsdWUgPT0gbnVsbCkgeworCQkJCWlmIChyZWFkT25seSkgeworCQkJCQl2YWx1ZSA9ICIoS2V5IGRvZXMgbm90IGV4aXN0KSI7CisJCQkJfSBlbHNlIHsKKwkJCQkJdmFsdWUgPSAiIjsgLy8gVE9ETyBJbmRpY2F0ZSB0aGF0IHRoZSBlbnRyeSBpcyBtaXNzaW5nOiBwZXJoYXBzIHJlZCBiYWNrZ3JvdW5kCisJCQkJfQorCQkJfQorCQkJdGV4dC5zZXRUZXh0KGVzY2FwZSh2YWx1ZSkpOworCQl9IGVsc2UgeworCQkJdGV4dC5zZXRUZXh0KCIoUmVzb3VyY2UgYnVuZGxlIG5vdCBmb3VuZCkiKTsKKwkJfQorCisJCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULlBVU0gpOworCQlidXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkJFR0lOTklORywgU1dULkNFTlRFUiwgZmFsc2UsIGZhbHNlKSk7CisJCWJ1dHRvbi5zZXRUZXh0KCIuLi4iKTsgLy8kTk9OLU5MUy0xJAorCQlidXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKKwkJCQlmb3IgKExvY2FsZUZpZWxkIGZpZWxkIDogZmllbGRzKSB7CisJCQkJCWlmIChlLndpZGdldCA9PSBmaWVsZC5idXR0b24pIHsKKwkJCQkJCUVkaXRNdWx0aUxpbmVFbnRyeURpYWxvZyBkaWFsb2cgPSBuZXcgRWRpdE11bHRpTGluZUVudHJ5RGlhbG9nKAorCQkJCQkJCWdldFNoZWxsKCksCisJCQkJCQkJdW5lc2NhcGUoZmllbGQudGV4dC5nZXRUZXh0KCkpLAorCQkJCQkJCWZpZWxkLmlzUmVhZE9ubHkpOworCQkJCQkJaWYgKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7CisJCQkJCQkJZmllbGQudGV4dC5zZXRUZXh0KGVzY2FwZShkaWFsb2cuZ2V0VmFsdWUoKSkpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQl9KTsKKworCQlMb2NhbGVGaWVsZCBmaWVsZCA9IG5ldyBMb2NhbGVGaWVsZCgpOworCQlmaWVsZC5idW5kbGUgPSBidW5kbGU7CisJCWZpZWxkLmxhYmVsID0gbGFiZWw7CisJCWZpZWxkLnRleHQgPSB0ZXh0OworCQlmaWVsZC5sb2NhbGUgPSBsb2NhbGU7CisJCWZpZWxkLm9sZFZhbHVlID0gdmFsdWU7CisJCWZpZWxkLmlzUmVhZE9ubHkgPSByZWFkT25seTsKKwkJZmllbGQuYnV0dG9uID0gYnV0dG9uOworCQlyZXR1cm4gZmllbGQ7CisJfQorCisJLyoKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nI29rUHJlc3NlZCgpCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIHZvaWQgb2tQcmVzc2VkKCkgeworCQlmb3IgKExvY2FsZUZpZWxkIGZpZWxkIDogZmllbGRzKSB7CisJCQlpZiAoZmllbGQuaXNSZWFkT25seSkKKwkJCQljb250aW51ZTsKKwkJCVN0cmluZyBrZXkgPSByZXNvdXJjZUJ1bmRsZUtleS5nZXROYW1lKCk7CisJCQlTdHJpbmcgdmFsdWUgPSB1bmVzY2FwZShmaWVsZC50ZXh0LmdldFRleHQoKSk7CisJCQlib29sZWFuIGhhc0NoYW5nZWQgPSAoZmllbGQub2xkVmFsdWUgPT0gbnVsbCAmJiAhdmFsdWUuZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJAorCQkJCQl8fCAoZmllbGQub2xkVmFsdWUgIT0gbnVsbCAmJiAhZmllbGQub2xkVmFsdWUuZXF1YWxzKHZhbHVlKSk7CisJCQlpZiAoaGFzQ2hhbmdlZCkgeworCQkJCXRyeSB7CisJCQkJCU9iamVjdCByZXNvdXJjZSA9IGZpZWxkLmJ1bmRsZS5nZXRVbmRlcmx5aW5nUmVzb3VyY2UoKTsKKwkJCQkJSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW07CisJCQkJCWlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElGaWxlKSB7CisJCQkJCQlJRmlsZSBmaWxlID0gKElGaWxlKSByZXNvdXJjZTsKKwkJCQkJCWlucHV0U3RyZWFtID0gZmlsZS5nZXRDb250ZW50cygpOworCQkJCQkJUmF3QnVuZGxlIHJhd0J1bmRsZTsKKwkJCQkJCXRyeSB7CisJCQkJCQkJcmF3QnVuZGxlID0gUmF3QnVuZGxlLmNyZWF0ZUZyb20oaW5wdXRTdHJlYW0pOworCQkJCQkJCXJhd0J1bmRsZS5wdXQoa2V5LCB2YWx1ZSk7CisJCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCQkJCW9wZW5FcnJvcigiVmFsdWUgY291bGQgbm90IGJlIHNhdmVkOiAiICsgdmFsdWUsIGUpOworCQkJCQkJCXJldHVybjsKKwkJCQkJCX0KKwkJCQkJCVN0cmluZ1dyaXRlciBzdHJpbmdXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisJCQkJCQlyYXdCdW5kbGUud3JpdGVUbyhzdHJpbmdXcml0ZXIpOworCQkJCQkJYnl0ZVtdIGJ5dGVzID0gc3RyaW5nV3JpdGVyLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoIklTTy04ODU5LTEiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJQnl0ZUFycmF5SW5wdXRTdHJlYW0gbmV3Q29udGVudHMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnl0ZXMpOworCQkJCQkJZmlsZS5zZXRDb250ZW50cyhuZXdDb250ZW50cywgZmFsc2UsIGZhbHNlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCS8vIFVuZXhwZWN0ZWQgdHlwZSBvZiByZXNvdXJjZQorCQkJCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIk5vdCB5ZXQgaW1wbGVtZW50ZWQuIik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJfQorCQkJCQlmaWVsZC5idW5kbGUucHV0KGtleSwgdmFsdWUpOworCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkJCW9wZW5FcnJvcigiVmFsdWUgY291bGQgbm90IGJlIHNhdmVkOiAiICsgdmFsdWUsIGUpOworCQkJCQlyZXR1cm47CisJCQkJfQorCQkJfQorCQl9CisJCXN1cGVyLm9rUHJlc3NlZCgpOworCQllcnJvckNvbG9yLmRpc3Bvc2UoKTsKKwl9CisKKwkvKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2cjZ2V0RGlhbG9nQm91bmRzU3RyYXRlZ3koKQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBpbnQgZ2V0RGlhbG9nQm91bmRzU3RyYXRlZ3koKSB7CisJCXJldHVybiBESUFMT0dfUEVSU0lTVExPQ0FUSU9OIHwgRElBTE9HX1BFUlNJU1RTSVpFOworCX0KKworCS8qCisJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZyNnZXREaWFsb2dCb3VuZHNTZXR0aW5ncygpCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIElEaWFsb2dTZXR0aW5ncyBnZXREaWFsb2dCb3VuZHNTZXR0aW5ncygpIHsKKwkJSURpYWxvZ1NldHRpbmdzIHNldHRpbmdzID0gTWVzc2FnZXNFZGl0b3JQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldERpYWxvZ1NldHRpbmdzKCk7CisJCVN0cmluZyBzZWN0aW9uTmFtZSA9ICJFZGl0UmVzb3VyY2VCdW5kbGVFbnRyaWVzRGlhbG9nIjsgLy8kTk9OLU5MUy0xJAorCQlJRGlhbG9nU2V0dGluZ3Mgc2VjdGlvbiA9IHNldHRpbmdzLmdldFNlY3Rpb24oc2VjdGlvbk5hbWUpOworCQlpZiAoc2VjdGlvbiA9PSBudWxsKQorCQkJc2VjdGlvbiA9IHNldHRpbmdzLmFkZE5ld1NlY3Rpb24oc2VjdGlvbk5hbWUpOworCQlyZXR1cm4gc2VjdGlvbjsKKwl9CisJCisJLyoKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nI2dldEluaXRpYWxTaXplKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgUG9pbnQgZ2V0SW5pdGlhbFNpemUoKSB7CisJCVBvaW50IGluaXRpYWxTaXplID0gc3VwZXIuZ2V0SW5pdGlhbFNpemUoKTsKKwkJLy8gTWFrZSBzdXJlIHRoYXQgYWxsIGxvY2FsZXMgYXJlIHZpc2libGUKKwkJUG9pbnQgc2l6ZSA9IGdldFNoZWxsKCkuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULCB0cnVlKTsKKwkJaWYgKGluaXRpYWxTaXplLnkgPCBzaXplLnkpCisJCQlpbml0aWFsU2l6ZS55ID0gc2l6ZS55OworCQlyZXR1cm4gaW5pdGlhbFNpemU7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGUoKSB7CisJCWJvb2xlYW4gaXNWYWxpZCA9IHRydWU7CisJCWZvciAoTG9jYWxlRmllbGQgZmllbGQgOiBmaWVsZHMpIHsKKwkJCXRyeSB7CisJCQkJdW5lc2NhcGUoZmllbGQudGV4dC5nZXRUZXh0KCkpOworCQkJCWZpZWxkLnRleHQuc2V0QmFja2dyb3VuZChudWxsKTsKKwkJCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisJCQkJZmllbGQudGV4dC5zZXRCYWNrZ3JvdW5kKGVycm9yQ29sb3IpOworCQkJCWlzVmFsaWQgPSBmYWxzZTsKKwkJCX0KKwkJfQorCQlCdXR0b24gb2tCdXR0b24gPSBnZXRCdXR0b24oSURpYWxvZ0NvbnN0YW50cy5PS19JRCk7CisJCW9rQnV0dG9uLnNldEVuYWJsZWQoaXNWYWxpZCk7CisJfQorCQorCXByaXZhdGUgdm9pZCBvcGVuRXJyb3IoU3RyaW5nIG1lc3NhZ2UsIEV4Y2VwdGlvbiBlKSB7CisJCUlTdGF0dXMgc3RhdHVzOworCQlpZiAoZSBpbnN0YW5jZW9mIENvcmVFeGNlcHRpb24pIHsKKwkJCUNvcmVFeGNlcHRpb24gY29yZUV4Y2VwdGlvbiA9IChDb3JlRXhjZXB0aW9uKSBlOworCQkJc3RhdHVzID0gY29yZUV4Y2VwdGlvbi5nZXRTdGF0dXMoKTsKKwkJfSBlbHNlIHsKKwkJCXN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgIjxkdW1teT4iLCBlLmdldE1lc3NhZ2UoKSwgZSk7IC8vJE5PTi1OTFMtMSQKKwkJfQorCQllLnByaW50U3RhY2tUcmFjZSgpOworCQlFcnJvckRpYWxvZy5vcGVuRXJyb3IoZ2V0UGFyZW50U2hlbGwoKSwgIkVycm9yIiwgbWVzc2FnZSwgc3RhdHVzKTsKKwl9CisKKwkvKioKKwkgKiBFc2NhcGVzIGxpbmUgc2VwYXJhdG9ycywgdGFidWxhdG9ycyBhbmQgZG91YmxlIGJhY2tzbGFzaGVzLiAKKwkgKiAKKwkgKiBAcGFyYW0gc3RyCisJICogQHJldHVybiB0aGUgZXNjYXBlZCBzdHJpbmcKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBlc2NhcGUoU3RyaW5nIHN0cikgeworCQlTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcihzdHIubGVuZ3RoKCkgKyAxMCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgc3RyLmxlbmd0aCgpOyBpKyspIHsKKwkJCWNoYXIgYyA9IHN0ci5jaGFyQXQoaSk7CisJCQlzd2l0Y2ggKGMpIHsKKwkJCQljYXNlICdccicgOgorCQkJCQlidWlsZGVyLmFwcGVuZCgiXFxyIik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAnXG4nIDoKKwkJCQkJYnVpbGRlci5hcHBlbmQoIlxcbiIpOyAvLyROT04tTkxTLTEkCisJCQkJCWJyZWFrOworCQkJCWNhc2UgJ1x0JyA6CisJCQkJCWJ1aWxkZXIuYXBwZW5kKCJcXHQiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQlicmVhazsKKwkJCQljYXNlICdcXCcgOgorCQkJCQlidWlsZGVyLmFwcGVuZCgiXFxcXCIpOyAvLyROT04tTkxTLTEkCisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQgOgorCQkJCQlidWlsZGVyLmFwcGVuZChjKTsKKwkJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKKwl9CisKKwkvKioKKwkgKiBVbmVzY2FwZXMgbGluZSBzZXBhcmF0b3JzLCB0YWJ1bGF0b3JzIGFuZCBkb3VibGUgYmFja3NsYXNoZXMuIAorCSAqIAorCSAqIEBwYXJhbSBzdHIKKwkgKiBAcmV0dXJuIHRoZSB1bmVzY2FwZWQgc3RyaW5nCisJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gd2hlbiBhbiBpbnZhbGlkIG9yIHVuZXhwZWN0ZWQgZXNjYXBlIGlzIGVuY291bnRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBTdHJpbmcgdW5lc2NhcGUoU3RyaW5nIHN0cikgeworCQlTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcihzdHIubGVuZ3RoKCkgKyAxMCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgc3RyLmxlbmd0aCgpOyBpKyspIHsKKwkJCWNoYXIgYyA9IHN0ci5jaGFyQXQoaSk7CisJCQlpZiAoYyA9PSAnXFwnKSB7CisJCQkJc3dpdGNoIChzdHIuY2hhckF0KGkgKyAxKSkgeworCQkJCQljYXNlICdyJyA6CisJCQkJCQlidWlsZGVyLmFwcGVuZCgnXHInKTsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlICduJyA6CisJCQkJCQlidWlsZGVyLmFwcGVuZCgnXG4nKTsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlICd0JyA6CisJCQkJCQlidWlsZGVyLmFwcGVuZCgnXHQnKTsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlICdcXCcgOgorCQkJCQkJYnVpbGRlci5hcHBlbmQoJ1xcJyk7CisJCQkJCQlicmVhazsKKwkJCQkJZGVmYXVsdCA6CisJCQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIGVzY2FwZSBzZXF1ZW5jZS4iKTsKKwkJCQl9CisJCQkJaSsrOworCQkJfSBlbHNlIHsKKwkJCQlidWlsZGVyLmFwcGVuZChjKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gYnVpbGRlci50b1N0cmluZygpOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvcGRlL25scy9pbnRlcm5hbC91aS9kaWFsb2dzL0ZpbHRlck9wdGlvbnMuamF2YSBiL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvcGRlL25scy9pbnRlcm5hbC91aS9kaWFsb2dzL0ZpbHRlck9wdGlvbnMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjZmZjViCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9wZGUvbmxzL2ludGVybmFsL3VpL2RpYWxvZ3MvRmlsdGVyT3B0aW9ucy5qYXZhCkBAIC0wLDAgKzEsMTkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggU3RlZmFuIE38Y2tlIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBTdGVmYW4gTfxja2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5wZGUubmxzLmludGVybmFsLnVpLmRpYWxvZ3M7CisKK3B1YmxpYyBjbGFzcyBGaWx0ZXJPcHRpb25zIHsKKworCXB1YmxpYyBib29sZWFuIGZpbHRlclBsdWdpbnM7IAorCXB1YmxpYyBTdHJpbmdbXSBwbHVnaW5QYXR0ZXJuczsgCisJcHVibGljIGJvb2xlYW4ga2V5c1dpdGhNaXNzaW5nRW50cmllc09ubHk7IAorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL3BkZS9ubHMvaW50ZXJuYWwvdWkvZGlhbG9ncy9GaWx0ZXJPcHRpb25zRGlhbG9nLmphdmEgYi9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL3BkZS9ubHMvaW50ZXJuYWwvdWkvZGlhbG9ncy9GaWx0ZXJPcHRpb25zRGlhbG9nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU0ZTAzOAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvcGRlL25scy9pbnRlcm5hbC91aS9kaWFsb2dzL0ZpbHRlck9wdGlvbnNEaWFsb2cuamF2YQpAQCAtMCwwICsxLDExMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBTdGVmYW4gTfxja2UgYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIFN0ZWZhbiBN/GNrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnBkZS5ubHMuaW50ZXJuYWwudWkuZGlhbG9nczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKKworcHVibGljIGNsYXNzIEZpbHRlck9wdGlvbnNEaWFsb2cgZXh0ZW5kcyBEaWFsb2cgeworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUEFSQVRPUiA9ICIsIjsgLy8kTk9OLU5MUy0xJAorCisJcHJpdmF0ZSBCdXR0b24gZW5hYmxlUGx1Z2luUGF0dGVybnM7CisJcHJpdmF0ZSBCdXR0b24ga2V5c1dpdGhNaXNzaW5nRW50cmllc09ubHk7CisJcHJpdmF0ZSBUZXh0IHBsdWdpblBhdHRlcm5zOworCQorCXByaXZhdGUgRmlsdGVyT3B0aW9ucyBpbml0aWFsT3B0aW9uczsKKwlwcml2YXRlIEZpbHRlck9wdGlvbnMgcmVzdWx0OworCisJcHVibGljIEZpbHRlck9wdGlvbnNEaWFsb2coU2hlbGwgc2hlbGwpIHsKKwkJc3VwZXIoc2hlbGwpOworCX0KKworCXB1YmxpYyB2b2lkIHNldEluaXRpYWxGaWx0ZXJPcHRpb25zKEZpbHRlck9wdGlvbnMgaW5pdGlhbGZpbHRlck9wdGlvbnMpIHsKKwkJdGhpcy5pbml0aWFsT3B0aW9ucyA9IGluaXRpYWxmaWx0ZXJPcHRpb25zOworCX0KKworCS8qCisJICogQHNlZSBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlNlbGVjdGlvbkRpYWxvZyNjb25maWd1cmVTaGVsbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbCkKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTaGVsbChTaGVsbCBzaGVsbCkgeworCQlzdXBlci5jb25maWd1cmVTaGVsbChzaGVsbCk7CisJCXNoZWxsLnNldFRleHQoIkZpbHRlcnMiKTsKKwl9CisKKwkvKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2cjY3JlYXRlRGlhbG9nQXJlYShvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCisJICovCisJcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7CisJCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7CisKKwkJLy8gQ2hlY2tib3gKKwkJZW5hYmxlUGx1Z2luUGF0dGVybnMgPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULkNIRUNLKTsKKwkJZW5hYmxlUGx1Z2luUGF0dGVybnMuc2V0Rm9jdXMoKTsKKwkJZW5hYmxlUGx1Z2luUGF0dGVybnMuc2V0VGV4dCgiRmlsdGVyIGJ5IHBsdWctaW4gaWQgcGF0dGVybnMgKHNlcGFyYXRlZCBieSBjb21tYSk6Iik7CisJCWVuYWJsZVBsdWdpblBhdHRlcm5zLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgeworCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgeworCQkJCXBsdWdpblBhdHRlcm5zLnNldEVuYWJsZWQoZW5hYmxlUGx1Z2luUGF0dGVybnMuZ2V0U2VsZWN0aW9uKCkpOworCQkJfQorCQl9KTsKKwkJZW5hYmxlUGx1Z2luUGF0dGVybnMuc2V0U2VsZWN0aW9uKGluaXRpYWxPcHRpb25zLmZpbHRlclBsdWdpbnMpOworCisJCS8vIFBhdHRlcm4JZmllbGQKKwkJcGx1Z2luUGF0dGVybnMgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKKwkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpOworCQlkYXRhLndpZHRoSGludCA9IGNvbnZlcnRXaWR0aEluQ2hhcnNUb1BpeGVscyg1OSk7CisJCXBsdWdpblBhdHRlcm5zLnNldExheW91dERhdGEoZGF0YSk7CisJCXBsdWdpblBhdHRlcm5zLnNldEVuYWJsZWQoaW5pdGlhbE9wdGlvbnMuZmlsdGVyUGx1Z2lucyk7CisJCWlmIChpbml0aWFsT3B0aW9ucy5wbHVnaW5QYXR0ZXJucyAhPSBudWxsKSB7CisJCQlTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCQkJU3RyaW5nW10gcGF0dGVybnMgPSBpbml0aWFsT3B0aW9ucy5wbHVnaW5QYXR0ZXJuczsKKwkJCWZvciAoU3RyaW5nIHBhdHRlcm4gOiBwYXR0ZXJucykgeworCQkJCWlmIChidWlsZGVyLmxlbmd0aCgpID4gMCkgeworCQkJCQlidWlsZGVyLmFwcGVuZChTRVBBUkFUT1IpOworCQkJCQlidWlsZGVyLmFwcGVuZCgiICIpOworCQkJCX0KKwkJCQlidWlsZGVyLmFwcGVuZChwYXR0ZXJuKTsKKwkJCX0KKwkJCXBsdWdpblBhdHRlcm5zLnNldFRleHQoYnVpbGRlci50b1N0cmluZygpKTsKKwkJfQorCQkKKwkJa2V5c1dpdGhNaXNzaW5nRW50cmllc09ubHkgPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULkNIRUNLKTsKKwkJa2V5c1dpdGhNaXNzaW5nRW50cmllc09ubHkuc2V0VGV4dCgiS2V5cyB3aXRoIG1pc3NpbmcgZW50cmllcyBvbmx5Iik7CisJCWtleXNXaXRoTWlzc2luZ0VudHJpZXNPbmx5LnNldFNlbGVjdGlvbihpbml0aWFsT3B0aW9ucy5rZXlzV2l0aE1pc3NpbmdFbnRyaWVzT25seSk7CisKKwkJYXBwbHlEaWFsb2dGb250KHBhcmVudCk7CisJCXJldHVybiBwYXJlbnQ7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgb2tQcmVzc2VkKCkgeworCQlTdHJpbmcgcGF0dGVybnMgPSBwbHVnaW5QYXR0ZXJucy5nZXRUZXh0KCk7CisJCXJlc3VsdCA9IG5ldyBGaWx0ZXJPcHRpb25zKCk7CisJCXJlc3VsdC5maWx0ZXJQbHVnaW5zID0gZW5hYmxlUGx1Z2luUGF0dGVybnMuZ2V0U2VsZWN0aW9uKCk7CisJCVN0cmluZ1tdIHNwbGl0ID0gcGF0dGVybnMuc3BsaXQoU0VQQVJBVE9SKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBzcGxpdC5sZW5ndGg7IGkrKykgeworCQkJc3BsaXRbaV0gPSBzcGxpdFtpXS50cmltKCk7CisJCX0KKwkJcmVzdWx0LnBsdWdpblBhdHRlcm5zID0gc3BsaXQ7CisJCXJlc3VsdC5rZXlzV2l0aE1pc3NpbmdFbnRyaWVzT25seSA9IGtleXNXaXRoTWlzc2luZ0VudHJpZXNPbmx5LmdldFNlbGVjdGlvbigpOworCQlzdXBlci5va1ByZXNzZWQoKTsKKwl9CisJCisJcHVibGljIEZpbHRlck9wdGlvbnMgZ2V0UmVzdWx0KCkgeworCQlyZXR1cm4gcmVzdWx0OworCX0KKwkKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvcGRlL25scy9pbnRlcm5hbC91aS9lZGl0b3IvTG9jYWxpemF0aW9uRWRpdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL3BkZS9ubHMvaW50ZXJuYWwvdWkvZWRpdG9yL0xvY2FsaXphdGlvbkVkaXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwZjVlZjYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL3BkZS9ubHMvaW50ZXJuYWwvdWkvZWRpdG9yL0xvY2FsaXphdGlvbkVkaXRvci5qYXZhCkBAIC0wLDAgKzEsMTA4OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBTdGVmYW4gTfxja2UgYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIFN0ZWZhbiBN/GNrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnBkZS5ubHMuaW50ZXJuYWwudWkuZWRpdG9yOworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IucGx1Z2luLk1lc3NhZ2VzRWRpdG9yUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSVNjaGVkdWxpbmdSdWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQ29udHJpYnV0aW9uSXRlbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JVG9vbEJhck1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TZXBhcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlRvb2xCYXJNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRXJyb3JEaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nU2V0dGluZ3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmxheW91dC5UYWJsZUNvbHVtbkxheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbHVtbkxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db2x1bW5XZWlnaHREYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuRG91YmxlQ2xpY2tFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklEb3VibGVDbGlja0xpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhenlDb250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyQ29sdW1uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7CitpbXBvcnQgb3JnLmVjbGlwc2UucGRlLm5scy5pbnRlcm5hbC51aS5kaWFsb2dzLkNvbmZpZ3VyZUNvbHVtbnNEaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2UucGRlLm5scy5pbnRlcm5hbC51aS5kaWFsb2dzLkVkaXRSZXNvdXJjZUJ1bmRsZUVudHJpZXNEaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2UucGRlLm5scy5pbnRlcm5hbC51aS5kaWFsb2dzLkZpbHRlck9wdGlvbnM7CitpbXBvcnQgb3JnLmVjbGlwc2UucGRlLm5scy5pbnRlcm5hbC51aS5kaWFsb2dzLkZpbHRlck9wdGlvbnNEaWFsb2c7CitpbXBvcnQgb3JnLmVjbGlwc2UucGRlLm5scy5pbnRlcm5hbC51aS5tb2RlbC5SZXNvdXJjZUJ1bmRsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5wZGUubmxzLmludGVybmFsLnVpLm1vZGVsLlJlc291cmNlQnVuZGxlRmFtaWx5OworaW1wb3J0IG9yZy5lY2xpcHNlLnBkZS5ubHMuaW50ZXJuYWwudWkubW9kZWwuUmVzb3VyY2VCdW5kbGVLZXk7CitpbXBvcnQgb3JnLmVjbGlwc2UucGRlLm5scy5pbnRlcm5hbC51aS5tb2RlbC5SZXNvdXJjZUJ1bmRsZUtleUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UucGRlLm5scy5pbnRlcm5hbC51aS5tb2RlbC5SZXNvdXJjZUJ1bmRsZU1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnBkZS5ubHMuaW50ZXJuYWwudWkucGFyc2VyLkxvY2FsZVV0aWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJ1c3lJbmRpY2F0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlBZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5RXZlbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5GaWxlRGlhbG9nOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVDb2x1bW47CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Ub29sQmFyOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JUHJvcGVydHlMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5Db250cmlidXRpb25JdGVtRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkV4cGFuZGFibGVDb21wb3NpdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRm9ybVRvb2xraXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5TZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLm1pc2MuU3RyaW5nTWF0Y2hlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkVkaXRvclBhcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5JU2hvd0luU291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuU2hvd0luQ29udGV4dDsKKworLy8gVE9ETyBGaXggcmVzdHJpY3Rpb24gYW5kIHJlbW92ZSB3YXJuaW5nIAorQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKK3B1YmxpYyBjbGFzcyBMb2NhbGl6YXRpb25FZGl0b3IgZXh0ZW5kcyBFZGl0b3JQYXJ0IHsKKworCXByaXZhdGUgZmluYWwgY2xhc3MgTG9jYWxpemF0aW9uTGFiZWxQcm92aWRlciBleHRlbmRzIENvbHVtbkxhYmVsUHJvdmlkZXIgeworCisJCXByaXZhdGUgZmluYWwgT2JqZWN0IGNvbHVtbkNvbmZpZzsKKworCQlwdWJsaWMgTG9jYWxpemF0aW9uTGFiZWxQcm92aWRlcihPYmplY3QgY29sdW1uQ29uZmlnKSB7CisJCQl0aGlzLmNvbHVtbkNvbmZpZyA9IGNvbHVtbkNvbmZpZzsKKwkJfQorCisJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgeworCQkJUmVzb3VyY2VCdW5kbGVLZXkga2V5ID0gKFJlc291cmNlQnVuZGxlS2V5KSBlbGVtZW50OworCQkJaWYgKGNvbHVtbkNvbmZpZyA9PSBLRVkpCisJCQkJcmV0dXJuIGtleS5nZXROYW1lKCk7CisJCQlMb2NhbGUgbG9jYWxlID0gKExvY2FsZSkgY29sdW1uQ29uZmlnOworCQkJU3RyaW5nIHZhbHVlOworCQkJdHJ5IHsKKwkJCQl2YWx1ZSA9IGtleS5nZXRWYWx1ZShsb2NhbGUpOworCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQkJdmFsdWUgPSBudWxsOworCQkJCU1lc3NhZ2VzRWRpdG9yUGx1Z2luLmxvZyhlKTsKKwkJCX0KKwkJCWlmICh2YWx1ZSA9PSBudWxsKQorCQkJCXZhbHVlID0gIiI7CisJCQlyZXR1cm4gdmFsdWU7CisJCX0KKwl9CisKKwlwcml2YXRlIGNsYXNzIEVkaXRFbnRyeUFjdGlvbiBleHRlbmRzIEFjdGlvbiB7CisJCXB1YmxpYyBFZGl0RW50cnlBY3Rpb24oKSB7CisJCQlzdXBlcigiJkVkaXQiLCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKTsKKwkJfQorCisJCS8qCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbiNydW4oKQorCQkgKi8KKwkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJUmVzb3VyY2VCdW5kbGVLZXkga2V5ID0gZ2V0U2VsZWN0ZWRFbnRyeSgpOworCQkJaWYgKGtleSA9PSBudWxsKSB7CisJCQkJcmV0dXJuOworCQkJfQorCQkJU2hlbGwgc2hlbGwgPSBEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpOworCQkJTG9jYWxlW10gbG9jYWxlcyA9IGdldExvY2FsZXMoKTsKKwkJCUVkaXRSZXNvdXJjZUJ1bmRsZUVudHJpZXNEaWFsb2cgZGlhbG9nID0gbmV3IEVkaXRSZXNvdXJjZUJ1bmRsZUVudHJpZXNEaWFsb2coc2hlbGwsIGxvY2FsZXMpOworCQkJZGlhbG9nLnNldFJlc291cmNlQnVuZGxlS2V5KGtleSk7CisJCQlpZiAoZGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spIHsKKwkJCQl1cGRhdGVMYWJlbHMoKTsKKwkJCX0KKwkJfQorCX0KKworCXByaXZhdGUgY2xhc3MgQ29uZmlndXJlQ29sdW1uc0FjdGlvbiBleHRlbmRzIEFjdGlvbiB7CisJCXB1YmxpYyBDb25maWd1cmVDb2x1bW5zQWN0aW9uKCkgeworCQkJc3VwZXIobnVsbCwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTik7IC8vJE5PTi1OTFMtMSQKKwkJCXNldEltYWdlRGVzY3JpcHRvcihNZXNzYWdlc0VkaXRvclBsdWdpbi5nZXRJbWFnZURlc2NyaXB0b3IoImVsY2wxNi9jb25mX2NvbHVtbnMuZ2lmIikpOworCQkJc2V0VG9vbFRpcFRleHQoIkNvbmZpZ3VyZSBDb2x1bW5zIik7CisJCX0KKworCQkvKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb24jcnVuKCkKKwkJICovCisJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCVNoZWxsIHNoZWxsID0gRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKTsKKwkJCVN0cmluZ1tdIHZhbHVlcyA9IG5ldyBTdHJpbmdbY29sdW1uQ29uZmlncy5sZW5ndGhdOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb2x1bW5Db25maWdzLmxlbmd0aDsgaSsrKSB7CisJCQkJU3RyaW5nIGNvbmZpZyA9IGNvbHVtbkNvbmZpZ3NbaV0udG9TdHJpbmcoKTsKKwkJCQlpZiAoY29uZmlnLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQKKwkJCQkJY29uZmlnID0gImRlZmF1bHQiOyAvLyROT04tTkxTLTEkCisJCQkJdmFsdWVzW2ldID0gY29uZmlnOworCQkJfQorCQkJQ29uZmlndXJlQ29sdW1uc0RpYWxvZyBkaWFsb2cgPSBuZXcgQ29uZmlndXJlQ29sdW1uc0RpYWxvZyhzaGVsbCwgdmFsdWVzKTsKKwkJCWlmIChkaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykgeworCQkJCVN0cmluZ1tdIHJlc3VsdCA9IGRpYWxvZy5nZXRSZXN1bHQoKTsKKwkJCQlPYmplY3RbXSBuZXdDb25maWdzID0gbmV3IE9iamVjdFtyZXN1bHQubGVuZ3RoXTsKKwkJCQlmb3IgKGludCBpID0gMDsgaSA8IG5ld0NvbmZpZ3MubGVuZ3RoOyBpKyspIHsKKwkJCQkJaWYgKHJlc3VsdFtpXS5lcXVhbHMoImtleSIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCW5ld0NvbmZpZ3NbaV0gPSBLRVk7CisJCQkJCX0gZWxzZSBpZiAocmVzdWx0W2ldLmVxdWFscygiZGVmYXVsdCIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCW5ld0NvbmZpZ3NbaV0gPSBuZXcgTG9jYWxlKCIiKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCW5ld0NvbmZpZ3NbaV0gPSBMb2NhbGVVdGlsLnBhcnNlTG9jYWxlKHJlc3VsdFtpXSk7CisJCQkJCX0KKwkJCQl9CisJCQkJc2V0Q29sdW1ucyhuZXdDb25maWdzKTsKKwkJCX0KKwkJfQorCX0KKworCXByaXZhdGUgY2xhc3MgRWRpdEZpbHRlck9wdGlvbnNBY3Rpb24gZXh0ZW5kcyBBY3Rpb24geworCQlwdWJsaWMgRWRpdEZpbHRlck9wdGlvbnNBY3Rpb24oKSB7CisJCQlzdXBlcihudWxsLCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKTsgLy8kTk9OLU5MUy0xJAorCQkJc2V0SW1hZ2VEZXNjcmlwdG9yKE1lc3NhZ2VzRWRpdG9yUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcigiZWxjbDE2L2ZpbHRlcl9vYmouZ2lmIikpOworCQkJc2V0VG9vbFRpcFRleHQoIkVkaXQgRmlsdGVyIE9wdGlvbnMiKTsKKwkJfQorCisJCS8qCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbiNydW4oKQorCQkgKi8KKwkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJU2hlbGwgc2hlbGwgPSBEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpOworCQkJRmlsdGVyT3B0aW9uc0RpYWxvZyBkaWFsb2cgPSBuZXcgRmlsdGVyT3B0aW9uc0RpYWxvZyhzaGVsbCk7CisJCQlkaWFsb2cuc2V0SW5pdGlhbEZpbHRlck9wdGlvbnMoZmlsdGVyT3B0aW9ucyk7CisJCQlpZiAoZGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spIHsKKwkJCQlmaWx0ZXJPcHRpb25zID0gZGlhbG9nLmdldFJlc3VsdCgpOworCQkJCXJlZnJlc2goKTsKKwkJCQl1cGRhdGVGaWx0ZXJMYWJlbCgpOworCQkJfQorCQl9CisJfQorCisJcHJpdmF0ZSBjbGFzcyBSZWZyZXNoQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKKwkJcHVibGljIFJlZnJlc2hBY3Rpb24oKSB7CisJCQlzdXBlcihudWxsLCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKTsgLy8kTk9OLU5MUy0xJAorCQkJc2V0SW1hZ2VEZXNjcmlwdG9yKE1lc3NhZ2VzRWRpdG9yUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcigiZWxjbDE2L3JlZnJlc2guZ2lmIikpOworCQkJc2V0VG9vbFRpcFRleHQoIlJlZnJlc2giKTsKKwkJfQorCisJCS8qCisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbiNydW4oKQorCQkgKi8KKwkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJTWVzc2FnZXNFZGl0b3JQbHVnaW4uZGlzcG9zZU1vZGVsKCk7CisJCQllbnRyeUxpc3QgPSBuZXcgUmVzb3VyY2VCdW5kbGVLZXlMaXN0KG5ldyBSZXNvdXJjZUJ1bmRsZUtleVswXSk7CisJCQl0YWJsZVZpZXdlci5nZXRUYWJsZSgpLnNldEl0ZW1Db3VudCgwKTsKKwkJCXVwZGF0ZUxhYmVscygpOworCQkJcmVmcmVzaCgpOworCQl9CisJfQorCisJcHJpdmF0ZSBjbGFzcyBCdW5kbGVTdHJpbmdDb21wYXJhdG9yIGltcGxlbWVudHMgQ29tcGFyYXRvcjxSZXNvdXJjZUJ1bmRsZUtleT4geworCQlwcml2YXRlIGZpbmFsIExvY2FsZSBsb2NhbGU7CisJCXB1YmxpYyBCdW5kbGVTdHJpbmdDb21wYXJhdG9yKExvY2FsZSBsb2NhbGUpIHsKKwkJCXRoaXMubG9jYWxlID0gbG9jYWxlOworCQl9CisJCXB1YmxpYyBpbnQgY29tcGFyZShSZXNvdXJjZUJ1bmRsZUtleSBvMSwgUmVzb3VyY2VCdW5kbGVLZXkgbzIpIHsKKwkJCVN0cmluZyB2YWx1ZTEgPSBudWxsOworCQkJU3RyaW5nIHZhbHVlMiA9IG51bGw7CisJCQl0cnkgeworCQkJCXZhbHVlMSA9IG8xLmdldFZhbHVlKGxvY2FsZSk7CisJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCQlNZXNzYWdlc0VkaXRvclBsdWdpbi5sb2coZSk7CisJCQl9CisJCQl0cnkgeworCQkJCXZhbHVlMiA9IG8yLmdldFZhbHVlKGxvY2FsZSk7CisJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCQlNZXNzYWdlc0VkaXRvclBsdWdpbi5sb2coZSk7CisJCQl9CisJCQlpZiAodmFsdWUxID09IG51bGwpCisJCQkJdmFsdWUxID0gIiI7IC8vJE5PTi1OTFMtMSQKKwkJCWlmICh2YWx1ZTIgPT0gbnVsbCkKKwkJCQl2YWx1ZTIgPSAiIjsgLy8kTk9OLU5MUy0xJAorCQkJcmV0dXJuIHZhbHVlMS5jb21wYXJlVG9JZ25vcmVDYXNlKHZhbHVlMik7CisJCX0KKwl9CisKKwlwcml2YXRlIGNsYXNzIEV4cG9ydEFjdGlvbiBleHRlbmRzIEFjdGlvbiB7CisJCXB1YmxpYyBFeHBvcnRBY3Rpb24oKSB7CisJCQlzdXBlcihudWxsLCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKTsgLy8kTk9OLU5MUy0xJAorCQkJc2V0SW1hZ2VEZXNjcmlwdG9yKE1lc3NhZ2VzRWRpdG9yUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcigiZWxjbDE2L2V4cG9ydC5naWYiKSk7CisJCQlzZXRUb29sVGlwVGV4dCgiRXhwb3J0IEN1cnJlbnQgVmlldyB0byBDU1Ygb3IgSFRNTCBGaWxlIik7CisJCX0KKworCQkvKgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb24jcnVuKCkKKwkJICovCisJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCVNoZWxsIHNoZWxsID0gRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKTsKKwkJCUZpbGVEaWFsb2cgZGlhbG9nID0gbmV3IEZpbGVEaWFsb2coc2hlbGwpOworCQkJZGlhbG9nLnNldFRleHQoIkV4cG9ydCBGaWxlIik7CisJCQlkaWFsb2cuc2V0RmlsdGVyRXh0ZW5zaW9ucyhuZXcgU3RyaW5nW10geyIqLioiLCAiKi5odG07ICouaHRtbCIsICIqLnR4dDsgKi5jc3YifSk7CisJCQlkaWFsb2cuc2V0RmlsdGVyTmFtZXMobmV3IFN0cmluZ1tdIHsiQWxsIEZpbGVzICgqLiopIiwgIkhUTUwgRmlsZSAoKi5odG07ICouaHRtbCkiLAorCQkJCQkiVGFidWxhdG9yIFNlcGFyYXRlZCBGaWxlICgqLnR4dDsgKi5jc3YpIn0pOworCQkJZmluYWwgU3RyaW5nIGZpbGVuYW1lID0gZGlhbG9nLm9wZW4oKTsKKwkJCWlmIChmaWxlbmFtZSAhPSBudWxsKSB7CisJCQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoRGlzcGxheS5nZXRDdXJyZW50KCksIG5ldyBSdW5uYWJsZSgpIHsKKwkJCQkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoZmlsZW5hbWUpOworCQkJCQkJdHJ5IHsKKwkJCQkJCQlCdWZmZXJlZFdyaXRlciB3cml0ZXIgPSBuZXcgQnVmZmVyZWRXcml0ZXIobmV3IE91dHB1dFN0cmVhbVdyaXRlcigKKwkJCQkJCQkJbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZSksCisJCQkJCQkJCSJVVEY4IikpOyAvLyROT04tTkxTLTEkCisJCQkJCQkJYm9vbGVhbiBpc0h0bWwgPSBmaWxlbmFtZS5lbmRzV2l0aCgiLmh0bSIpIHx8IGZpbGVuYW1lLmVuZHNXaXRoKCIuaHRtbCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQkJCQlpZiAoaXNIdG1sKSB7CisJCQkJCQkJCXdyaXRlci53cml0ZSgiIiAvLyROT04tTkxTLTEkCisJCQkJCQkJCQkJKyAiPGh0bWw+XHJcbiIgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQkJCSsgIjxoZWFkPlxyXG4iIC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJCQkrICI8bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PVwidGV4dC9odG1sOyBjaGFyc2V0PVVURi04XCI+XHJcbiIgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQkJCSsgIjxzdHlsZT5cclxuIiAvLyROT04tTkxTLTEkCisJCQkJCQkJCQkJKyAidGFibGUge3dpZHRoOjEwMCU7fVxyXG4iIC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJCQkrICJ0ZC5zZXAge2hlaWdodDoxMHB4O2JhY2tncm91bmQ6I0MwQzBDMDt9XHJcbiIgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQkJCSsgIjwvc3R5bGU+XHJcbiIgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQkJCSsgIjwvaGVhZD5cclxuIiAvLyROT04tTkxTLTEkCisJCQkJCQkJCQkJKyAiPGJvZHk+XHJcbiIgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQkJCSsgIjx0YWJsZSB3aWR0aD1cIjEwMCVcIiBib3JkZXI9XCIxXCI+XHJcbiIpOyAvLyROT04tTkxTLTEkCisJCQkJCQkJfQorCisJCQkJCQkJaW50IHNpemUgPSBlbnRyeUxpc3QuZ2V0U2l6ZSgpOworCQkJCQkJCU9iamVjdFtdIGNvbmZpZ3MgPSBMb2NhbGl6YXRpb25FZGl0b3IudGhpcy5jb2x1bW5Db25maWdzOworCQkJCQkJCWludCB2YWx1ZUNvdW50ID0gMDsKKwkJCQkJCQlpbnQgbWlzc2luZ0NvdW50ID0gMDsKKwkJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworCQkJCQkJCQlSZXNvdXJjZUJ1bmRsZUtleSBrZXkgPSBlbnRyeUxpc3QuZ2V0S2V5KGkpOworCQkJCQkJCQlpZiAoaXNIdG1sKSB7CisJCQkJCQkJCQl3cml0ZXIud3JpdGUoIjx0YWJsZSBib3JkZXI9XCIxXCI+XHJcbiIpOyAvLyROT04tTkxTLTEkCisJCQkJCQkJCX0KKwkJCQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjb25maWdzLmxlbmd0aDsgaisrKSB7CisJCQkJCQkJCQlpZiAoaXNIdG1sKSB7CisJCQkJCQkJCQkJd3JpdGVyLndyaXRlKCI8dHI+PHRkPiIpOyAvLyROT04tTkxTLTEkCisJCQkJCQkJCQl9CisJCQkJCQkJCQlPYmplY3QgY29uZmlnID0gY29uZmlnc1tqXTsKKwkJCQkJCQkJCWlmICghaXNIdG1sICYmIGogPiAwKQorCQkJCQkJCQkJCXdyaXRlci53cml0ZSgiXHQiKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQkJaWYgKGNvbmZpZyA9PSBLRVkpIHsKKwkJCQkJCQkJCQl3cml0ZXIud3JpdGUoa2V5LmdldE5hbWUoKSk7CisJCQkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQkJCUxvY2FsZSBsb2NhbGUgPSAoTG9jYWxlKSBjb25maWc7CisJCQkJCQkJCQkJU3RyaW5nIHZhbHVlOworCQkJCQkJCQkJCXRyeSB7CisJCQkJCQkJCQkJCXZhbHVlID0ga2V5LmdldFZhbHVlKGxvY2FsZSk7CisJCQkJCQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQkJCQkJCQkJCXZhbHVlID0gbnVsbDsKKwkJCQkJCQkJCQkJTWVzc2FnZXNFZGl0b3JQbHVnaW4ubG9nKGUpOworCQkJCQkJCQkJCX0KKwkJCQkJCQkJCQlpZiAodmFsdWUgPT0gbnVsbCkgeworCQkJCQkJCQkJCQl2YWx1ZSA9ICIiOyAvLyROT04tTkxTLTEkCisJCQkJCQkJCQkJCW1pc3NpbmdDb3VudCsrOworCQkJCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCQkJCXZhbHVlQ291bnQrKzsKKwkJCQkJCQkJCQl9CisJCQkJCQkJCQkJd3JpdGVyLndyaXRlKEVkaXRSZXNvdXJjZUJ1bmRsZUVudHJpZXNEaWFsb2cuZXNjYXBlKHZhbHVlKSk7CisJCQkJCQkJCQl9CisJCQkJCQkJCQlpZiAoaXNIdG1sKSB7CisJCQkJCQkJCQkJd3JpdGVyLndyaXRlKCI8L3RkPjwvdHI+XHJcbiIpOyAvLyROT04tTkxTLTEkCisJCQkJCQkJCQl9CisJCQkJCQkJCX0KKwkJCQkJCQkJaWYgKGlzSHRtbCkgeworCQkJCQkJCQkJd3JpdGVyLndyaXRlKCI8dHI+PHRkIGNsYXNzPVwic2VwXCI+Jm5ic3A7PC90ZD48L3RyPlxyXG4iKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQkJd3JpdGVyLndyaXRlKCI8L3RhYmxlPlxyXG4iKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQkJd3JpdGVyLndyaXRlKCJcclxuIik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCQlpZiAoaXNIdG1sKSB7CisJCQkJCQkJCXdyaXRlci53cml0ZSgiPC9ib2R5PlxyXG4iICsgIjwvaHRtbD5cclxuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJCQkJCX0KKwkJCQkJCQl3cml0ZXIuY2xvc2UoKTsKKwkJCQkJCQlTaGVsbCBzaGVsbCA9IERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCk7CisJCQkJCQkJTWVzc2FnZURpYWxvZy5vcGVuSW5mb3JtYXRpb24oCisJCQkJCQkJCQlzaGVsbCwKKwkJCQkJCQkJCSJGaW5pc2hlZCIsCisJCQkJCQkJCQkiRmlsZSB3cml0dGVuIHN1Y2Nlc3NmdWxseS5cblxuTnVtYmVyIG9mIGVudHJpZXMgd3JpdHRlbjogIgorCQkJCQkJCQkJCQkrIGVudHJ5TGlzdC5nZXRTaXplKCkKKwkJCQkJCQkJCQkJKyAiXG5OdW1iZXIgb2YgdHJhbnNsYXRpb25zOiAiCisJCQkJCQkJCQkJCSsgdmFsdWVDb3VudAorCQkJCQkJCQkJCQkrICIgKCIKKwkJCQkJCQkJCQkJKyBtaXNzaW5nQ291bnQKKwkJCQkJCQkJCQkJKyAiIG1pc3NpbmcpIik7CisJCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkJCQkJU2hlbGwgc2hlbGwgPSBEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpOworCQkJCQkJCUVycm9yRGlhbG9nLm9wZW5FcnJvcihzaGVsbCwgIkVycm9yIiwgIkVycm9yIHNhdmluZyBmaWxlLiIsIG5ldyBTdGF0dXMoCisJCQkJCQkJCUlTdGF0dXMuRVJST1IsCisJCQkJCQkJCU1lc3NhZ2VzRWRpdG9yUGx1Z2luLlBMVUdJTl9JRCwKKwkJCQkJCQkJZS5nZXRNZXNzYWdlKCksCisJCQkJCQkJCWUpKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0pOworCQkJfQorCQl9CisJfQorCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAib3JnLmVjbGlwc2UucGRlLm5scy51aS5Mb2NhbGl6YXRpb25FZGl0b3IiOyAvLyROT04tTkxTLTEkCisKKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdCBLRVkgPSAia2V5IjsgLy8gdXNlZCB0byBpbmRpY2F0ZSB0aGUga2V5IGNvbHVtbgorCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfU0VDVElPTl9OQU1FID0gIm9yZy5lY2xpcHNlLnBkZS5ubHMudWkuTG9jYWxpemF0aW9uRWRpdG9yIjsgLy8kTk9OLU5MUy0xJAorCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX1NPUlRfT1JERVIgPSAic29ydE9yZGVyIjsgLy8kTk9OLU5MUy0xJAorCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX0NPTFVNTlMgPSAiY29sdW1ucyI7IC8vJE5PTi1OTFMtMSQKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9GSUxURVJfT1BUSU9OU19GSUxURVJfUExVR0lOUyA9ICJmaWx0ZXJPcHRpb25zX2ZpbHRlclBsdWdpbnMiOyAvLyROT04tTkxTLTEkCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfRklMVEVSX09QVElPTlNfUExVR0lOX1BBVFRFUk5TID0gImZpbHRlck9wdGlvbnNfcGx1Z2luUGF0dGVybnMiOyAvLyROT04tTkxTLTEkCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfRklMVEVSX09QVElPTlNfTUlTU0lOR19PTkxZID0gImZpbHRlck9wdGlvbnNfbWlzc2luZ09ubHkiOyAvLyROT04tTkxTLTEkCisKKwkvLyBBY3Rpb25zCisJcHJpdmF0ZSBFZGl0RmlsdGVyT3B0aW9uc0FjdGlvbiBlZGl0RmlsdGVyc0FjdGlvbjsKKwlwcml2YXRlIENvbmZpZ3VyZUNvbHVtbnNBY3Rpb24gc2VsZWN0TGFuZ3VhZ2VzQWN0aW9uOworCXByaXZhdGUgUmVmcmVzaEFjdGlvbiByZWZyZXNoQWN0aW9uOworCXByaXZhdGUgRXhwb3J0QWN0aW9uIGV4cG9ydEFjdGlvbjsKKworCS8vIEZvcm0KKwlwcm90ZWN0ZWQgRm9ybVRvb2xraXQgdG9vbGtpdCA9IG5ldyBGb3JtVG9vbGtpdChEaXNwbGF5LmdldEN1cnJlbnQoKSk7CisJcHJpdmF0ZSBGb3JtIGZvcm07CisJcHJpdmF0ZSBJbWFnZSBmb3JtSW1hZ2U7CisKKwkvLyBRdWVyeQorCXByb3RlY3RlZCBDb21wb3NpdGUgcXVlcnlDb21wb3NpdGU7CisJcHJvdGVjdGVkIFRleHQgcXVlcnlUZXh0OworCisJLy8gUmVzdWx0cyAKKwlwcml2YXRlIFNlY3Rpb24gcmVzdWx0c1NlY3Rpb247CisJcHJpdmF0ZSBDb21wb3NpdGUgdGFibGVDb21wb3NpdGU7CisJcHJvdGVjdGVkIFRhYmxlVmlld2VyIHRhYmxlVmlld2VyOworCXByb3RlY3RlZCBUYWJsZSB0YWJsZTsKKwlwcm90ZWN0ZWQgQXJyYXlMaXN0PFRhYmxlQ29sdW1uPiBjb2x1bW5zID0gbmV3IEFycmF5TGlzdDxUYWJsZUNvbHVtbj4oKTsKKworCS8vIERhdGEgYW5kIGNvbmZpZ3VyYXRpb24KKwlwcm90ZWN0ZWQgTG9jYWxpemF0aW9uRWRpdG9ySW5wdXQgaW5wdXQ7CisJcHJvdGVjdGVkIFJlc291cmNlQnVuZGxlS2V5TGlzdCBlbnRyeUxpc3Q7CisJcHJvdGVjdGVkIEZpbHRlck9wdGlvbnMgZmlsdGVyT3B0aW9uczsKKworCS8qKgorCSAqIENvbHVtbiBjb25maWd1cmF0aW9uLiBWYWx1ZXMgbWF5IGJlIGVpdGhlciA8Y29kZT5LRVk8L2NvZGU+IG9yIGEge0BsaW5rIExvY2FsZX0uCisJICovCisJcHJvdGVjdGVkIE9iamVjdFtdIGNvbHVtbkNvbmZpZ3M7CisJLyoqCisJICogRWl0aGVyIDxjb2RlPktFWTwvY29kZT4gb3IgYSB7QGxpbmsgTG9jYWxlfS4KKwkgKi8KKwlwcm90ZWN0ZWQgT2JqZWN0IHNvcnRPcmRlcjsKKworCXByaXZhdGUgU3RyaW5nIGxhc3RRdWVyeSA9ICIiOworCXByb3RlY3RlZCBKb2Igc2VhcmNoSm9iOworCisJcHJpdmF0ZSBJU2NoZWR1bGluZ1J1bGUgbXV0ZXhSdWxlID0gbmV3IElTY2hlZHVsaW5nUnVsZSgpIHsKKwkJcHVibGljIGJvb2xlYW4gY29udGFpbnMoSVNjaGVkdWxpbmdSdWxlIHJ1bGUpIHsKKwkJCXJldHVybiBydWxlID09IHRoaXM7CisJCX0KKwkJcHVibGljIGJvb2xlYW4gaXNDb25mbGljdGluZyhJU2NoZWR1bGluZ1J1bGUgcnVsZSkgeworCQkJcmV0dXJuIHJ1bGUgPT0gdGhpczsKKwkJfQorCX07CisKKwlwcml2YXRlIExhYmVsIGZpbHRlcmVkTGFiZWw7CisKKwlwdWJsaWMgTG9jYWxpemF0aW9uRWRpdG9yKCkgeworCX0KKworCXB1YmxpYyBSZXNvdXJjZUJ1bmRsZUtleSBnZXRTZWxlY3RlZEVudHJ5KCkgeworCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHRhYmxlVmlld2VyLmdldFNlbGVjdGlvbigpOworCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA9PSAxKSB7CisJCQlyZXR1cm4gKFJlc291cmNlQnVuZGxlS2V5KSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRRdWVyeVRleHQoKSB7CisJCXJldHVybiBxdWVyeVRleHQuZ2V0VGV4dCgpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGNyZWF0ZVBhcnRDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKKwkJR3JpZERhdGEgZ2Q7CisJCUdyaWRMYXlvdXQgZ3JpZExheW91dDsKKworCQlmb3JtID0gdG9vbGtpdC5jcmVhdGVGb3JtKHBhcmVudCk7CisJCWZvcm0uc2V0U2VwYXJhdG9yVmlzaWJsZSh0cnVlKTsKKwkJZm9ybS5zZXRUZXh0KCJMb2NhbGl6YXRpb24iKTsKKworCQlmb3JtLnNldEltYWdlKGZvcm1JbWFnZSA9IE1lc3NhZ2VzRWRpdG9yUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcigib2JqMTYvbmxzX2VkaXRvci5naWYiKS5jcmVhdGVJbWFnZSgpKTsgLy8kTk9OLU5MUy0xJAorCQl0b29sa2l0LmFkYXB0KGZvcm0pOworCQl0b29sa2l0LnBhaW50Qm9yZGVyc0Zvcihmb3JtKTsKKwkJZmluYWwgQ29tcG9zaXRlIGJvZHkgPSBmb3JtLmdldEJvZHkoKTsKKwkJZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7CisJCWdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDE7CisJCWJvZHkuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOworCQl0b29sa2l0LnBhaW50Qm9yZGVyc0Zvcihib2R5KTsKKwkJdG9vbGtpdC5kZWNvcmF0ZUZvcm1IZWFkaW5nKGZvcm0pOworCisJCXF1ZXJ5Q29tcG9zaXRlID0gdG9vbGtpdC5jcmVhdGVDb21wb3NpdGUoYm9keSk7CisJCWdkID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCB0cnVlLCBmYWxzZSk7CisJCXF1ZXJ5Q29tcG9zaXRlLnNldExheW91dERhdGEoZ2QpOworCQlncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoNSwgZmFsc2UpOworCQlncmlkTGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7CisJCXF1ZXJ5Q29tcG9zaXRlLnNldExheW91dChncmlkTGF5b3V0KTsKKwkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IocXVlcnlDb21wb3NpdGUpOworCisJCS8vIEZvcm0gdG9vbGJhcgorCQllZGl0RmlsdGVyc0FjdGlvbiA9IG5ldyBFZGl0RmlsdGVyT3B0aW9uc0FjdGlvbigpOworCQlzZWxlY3RMYW5ndWFnZXNBY3Rpb24gPSBuZXcgQ29uZmlndXJlQ29sdW1uc0FjdGlvbigpOworCQlyZWZyZXNoQWN0aW9uID0gbmV3IFJlZnJlc2hBY3Rpb24oKTsKKwkJZXhwb3J0QWN0aW9uID0gbmV3IEV4cG9ydEFjdGlvbigpOworCQlJVG9vbEJhck1hbmFnZXIgdG9vbEJhck1hbmFnZXIgPSBmb3JtLmdldFRvb2xCYXJNYW5hZ2VyKCk7CisJCXRvb2xCYXJNYW5hZ2VyLmFkZChyZWZyZXNoQWN0aW9uKTsKKwkJdG9vbEJhck1hbmFnZXIuYWRkKGVkaXRGaWx0ZXJzQWN0aW9uKTsKKwkJdG9vbEJhck1hbmFnZXIuYWRkKHNlbGVjdExhbmd1YWdlc0FjdGlvbik7CisJCXRvb2xCYXJNYW5hZ2VyLmFkZChleHBvcnRBY3Rpb24pOworCQlmb3JtLnVwZGF0ZVRvb2xCYXIoKTsKKworCQl0b29sa2l0LmNyZWF0ZUxhYmVsKHF1ZXJ5Q29tcG9zaXRlLCAiU2VhcmNoOiIpOworCisJCS8vIFF1ZXJ5IHRleHQKKwkJcXVlcnlUZXh0ID0gdG9vbGtpdC5jcmVhdGVUZXh0KHF1ZXJ5Q29tcG9zaXRlLCAiIiwgU1dULldSQVAgfCBTV1QuU0lOR0xFKTsgLy8kTk9OLU5MUy0xJAorCQlxdWVyeVRleHQuYWRkS2V5TGlzdGVuZXIobmV3IEtleUFkYXB0ZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBrZXlQcmVzc2VkKEtleUV2ZW50IGUpIHsKKwkJCQlpZiAoZS5rZXlDb2RlID09IFNXVC5BUlJPV19ET1dOKSB7CisJCQkJCXRhYmxlLnNldEZvY3VzKCk7CisJCQkJfSBlbHNlIGlmIChlLmtleUNvZGUgPT0gU1dULkVTQykgeworCQkJCQlxdWVyeVRleHQuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKKwkJCQl9CisJCQl9CisJCX0pOworCQlxdWVyeVRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7CisJCQkJZXhlY3V0ZVF1ZXJ5KCk7CisKKwkJCQlPYmplY3RbXSBsaXN0ZW5lcnMgPSBnZXRMaXN0ZW5lcnMoKTsKKwkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykgeworCQkJCQlJUHJvcGVydHlMaXN0ZW5lciBsaXN0ZW5lciA9IChJUHJvcGVydHlMaXN0ZW5lcikgbGlzdGVuZXJzW2ldOworCQkJCQlsaXN0ZW5lci5wcm9wZXJ0eUNoYW5nZWQodGhpcywgUFJPUF9USVRMRSk7CisJCQkJfQorCQkJfQorCQl9KTsKKwkJZ2QgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlKTsKKwkJcXVlcnlUZXh0LnNldExheW91dERhdGEoZ2QpOworCQl0b29sa2l0LmFkYXB0KHF1ZXJ5VGV4dCwgdHJ1ZSwgdHJ1ZSk7CisKKwkJVG9vbEJhck1hbmFnZXIgdG9vbEJhck1hbmFnZXIyID0gbmV3IFRvb2xCYXJNYW5hZ2VyKFNXVC5GTEFUKTsKKwkJdG9vbEJhck1hbmFnZXIyLmNyZWF0ZUNvbnRyb2wocXVlcnlDb21wb3NpdGUpOworCQlUb29sQmFyIGNvbnRyb2wgPSB0b29sQmFyTWFuYWdlcjIuZ2V0Q29udHJvbCgpOworCQl0b29sa2l0LmFkYXB0KGNvbnRyb2wpOworCisJCS8vIFJlc3VsdHMgc2VjdGlvbgorCQlyZXN1bHRzU2VjdGlvbiA9IHRvb2xraXQuY3JlYXRlU2VjdGlvbihib2R5LCBFeHBhbmRhYmxlQ29tcG9zaXRlLlRJVExFX0JBUgorCQkJCXwgRXhwYW5kYWJsZUNvbXBvc2l0ZS5MRUZUX1RFWFRfQ0xJRU5UX0FMSUdOTUVOVCk7CisJCXJlc3VsdHNTZWN0aW9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSwgMiwgMSkpOworCQlyZXN1bHRzU2VjdGlvbi5zZXRUZXh0KCJMb2NhbGl6YXRpb24gU3RyaW5ncyIpOworCQl0b29sa2l0LmFkYXB0KHJlc3VsdHNTZWN0aW9uKTsKKworCQlmaW5hbCBDb21wb3NpdGUgcmVzdWx0c0NvbXBvc2l0ZSA9IHRvb2xraXQuY3JlYXRlQ29tcG9zaXRlKHJlc3VsdHNTZWN0aW9uLCBTV1QuTk9ORSk7CisJCXRvb2xraXQuYWRhcHQocmVzdWx0c0NvbXBvc2l0ZSk7CisJCWZpbmFsIEdyaWRMYXlvdXQgZ3JpZExheW91dDIgPSBuZXcgR3JpZExheW91dCgpOworCQlncmlkTGF5b3V0Mi5tYXJnaW5Ub3AgPSAxOworCQlncmlkTGF5b3V0Mi5tYXJnaW5XaWR0aCA9IDE7CisJCWdyaWRMYXlvdXQyLm1hcmdpbkhlaWdodCA9IDE7CisJCWdyaWRMYXlvdXQyLmhvcml6b250YWxTcGFjaW5nID0gMDsKKwkJcmVzdWx0c0NvbXBvc2l0ZS5zZXRMYXlvdXQoZ3JpZExheW91dDIpOworCisJCWZpbHRlcmVkTGFiZWwgPSBuZXcgTGFiZWwocmVzdWx0c1NlY3Rpb24sIFNXVC5OT05FKTsKKwkJZmlsdGVyZWRMYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuQkVHSU5OSU5HLCBTV1QuQ0VOVEVSLCBmYWxzZSwgZmFsc2UpKTsKKwkJZmlsdGVyZWRMYWJlbC5zZXRGb3JlZ3JvdW5kKERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9SRUQpKTsKKwkJZmlsdGVyZWRMYWJlbC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAorCisJCXRvb2xraXQucGFpbnRCb3JkZXJzRm9yKHJlc3VsdHNDb21wb3NpdGUpOworCQlyZXN1bHRzU2VjdGlvbi5zZXRDbGllbnQocmVzdWx0c0NvbXBvc2l0ZSk7CisJCXJlc3VsdHNTZWN0aW9uLnNldFRleHRDbGllbnQoZmlsdGVyZWRMYWJlbCk7CisKKwkJdGFibGVDb21wb3NpdGUgPSB0b29sa2l0LmNyZWF0ZUNvbXBvc2l0ZShyZXN1bHRzQ29tcG9zaXRlLCBTV1QuTk9ORSk7CisJCXRhYmxlQ29tcG9zaXRlLnNldERhdGEoRm9ybVRvb2xraXQuS0VZX0RSQVdfQk9SREVSLCBGb3JtVG9vbGtpdC5UUkVFX0JPUkRFUik7CisJCXRvb2xraXQuYWRhcHQodGFibGVDb21wb3NpdGUpOworCQl0YWJsZUNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpKTsKKworCQkvLyBUYWJsZQorCQljcmVhdGVUYWJsZVZpZXdlcigpOworCisJCXJlZ2lzdGVyQ29udGV4dE1lbnUoKTsKKworCQkvLyBTZXQgZGVmYXVsdCBjb25maWd1cmF0aW9uCisJCWZpbHRlck9wdGlvbnMgPSBuZXcgRmlsdGVyT3B0aW9ucygpOworCQlmaWx0ZXJPcHRpb25zLmZpbHRlclBsdWdpbnMgPSBmYWxzZTsKKwkJZmlsdGVyT3B0aW9ucy5wbHVnaW5QYXR0ZXJucyA9IG5ldyBTdHJpbmdbMF07CisJCWZpbHRlck9wdGlvbnMua2V5c1dpdGhNaXNzaW5nRW50cmllc09ubHkgPSBmYWxzZTsKKwkJc29ydE9yZGVyID0gS0VZOworCQljb2x1bW5Db25maWdzID0gbmV3IE9iamVjdFtdIHtLRVksIG5ldyBMb2NhbGUoIiIpLCBuZXcgTG9jYWxlKCJkZSIpfTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisKKwkJLy8gTG9hZCBjb25maWd1cmF0aW9uCisJCXRyeSB7CisJCQlsb2FkU2V0dGluZ3MoKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCS8vIElnbm9yZQorCQl9CisKKwkJdXBkYXRlQ29sdW1ucygpOworCQl1cGRhdGVGaWx0ZXJMYWJlbCgpOworCQl0YWJsZS5zZXRTb3J0RGlyZWN0aW9uKFNXVC5VUCk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgdXBkYXRlRmlsdGVyTGFiZWwoKSB7CisJCWlmIChmaWx0ZXJPcHRpb25zLmZpbHRlclBsdWdpbnMgfHwgZmlsdGVyT3B0aW9ucy5rZXlzV2l0aE1pc3NpbmdFbnRyaWVzT25seSkgeworCQkJZmlsdGVyZWRMYWJlbC5zZXRUZXh0KCIoZmlsdGVyZWQpIik7CisJCX0gZWxzZSB7CisJCQlmaWx0ZXJlZExhYmVsLnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCisJCX0KKwkJZmlsdGVyZWRMYWJlbC5nZXRQYXJlbnQoKS5sYXlvdXQodHJ1ZSk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGxvYWRTZXR0aW5ncygpIHsKKwkJLy8gVE9ETyBNb3ZlIHRoaXMgdG8gdGhlIHByZWZlcmVuY2VzPworCQlJRGlhbG9nU2V0dGluZ3MgZGlhbG9nU2V0dGluZ3MgPSBNZXNzYWdlc0VkaXRvclBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0RGlhbG9nU2V0dGluZ3MoKTsKKwkJSURpYWxvZ1NldHRpbmdzIHNlY3Rpb24gPSBkaWFsb2dTZXR0aW5ncy5nZXRTZWN0aW9uKFBSRUZfU0VDVElPTl9OQU1FKTsKKwkJaWYgKHNlY3Rpb24gPT0gbnVsbCkKKwkJCXJldHVybjsKKworCQkvLyBTb3J0IG9yZGVyCisJCVN0cmluZyBzb3J0T3JkZXJTdHJpbmcgPSBzZWN0aW9uLmdldChQUkVGX1NPUlRfT1JERVIpOworCQlpZiAoc29ydE9yZGVyU3RyaW5nICE9IG51bGwpIHsKKwkJCWlmIChzb3J0T3JkZXJTdHJpbmcuZXF1YWxzKEtFWSkpIHsKKwkJCQlzb3J0T3JkZXIgPSBLRVk7CisJCQl9IGVsc2UgeworCQkJCXRyeSB7CisJCQkJCXNvcnRPcmRlciA9IExvY2FsZVV0aWwucGFyc2VMb2NhbGUoc29ydE9yZGVyU3RyaW5nKTsKKwkJCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworCQkJCQkvLyBTaG91bGQgbmV2ZXIgaGFwcGVuCisJCQkJfQorCQkJfQorCQl9CisKKwkJLy8gQ29sdW1ucworCQlTdHJpbmcgY29sdW1ucyA9IHNlY3Rpb24uZ2V0KFBSRUZfQ09MVU1OUyk7CisJCWlmIChjb2x1bW5zICE9IG51bGwpIHsKKwkJCVN0cmluZ1tdIGNvbHMgPSBjb2x1bW5zLnN1YnN0cmluZygxLCBjb2x1bW5zLmxlbmd0aCgpIC0gMSkuc3BsaXQoIiwiKTsgLy8kTk9OLU5MUy0xJAorCQkJY29sdW1uQ29uZmlncyA9IG5ldyBPYmplY3RbY29scy5sZW5ndGhdOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb2xzLmxlbmd0aDsgaSsrKSB7CisJCQkJU3RyaW5nIHZhbHVlID0gY29sc1tpXS50cmltKCk7CisJCQkJaWYgKHZhbHVlLmVxdWFscyhLRVkpKSB7CisJCQkJCWNvbHVtbkNvbmZpZ3NbaV0gPSBLRVk7CisJCQkJfSBlbHNlIGlmICh2YWx1ZS5lcXVhbHMoImRlZmF1bHQiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJCWNvbHVtbkNvbmZpZ3NbaV0gPSBuZXcgTG9jYWxlKCIiKTsgLy8kTk9OLU5MUy0xJAorCQkJCX0gZWxzZSB7CisJCQkJCXRyeSB7CisJCQkJCQljb2x1bW5Db25maWdzW2ldID0gTG9jYWxlVXRpbC5wYXJzZUxvY2FsZSh2YWx1ZSk7CisJCQkJCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisJCQkJCQljb2x1bW5Db25maWdzW2ldID0gbnVsbDsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCisJCS8vIEZpbHRlciBvcHRpb25zCisJCVN0cmluZyBmaWx0ZXJPcHRpb25zID0gc2VjdGlvbi5nZXQoUFJFRl9GSUxURVJfT1BUSU9OU19GSUxURVJfUExVR0lOUyk7CisJCXRoaXMuZmlsdGVyT3B0aW9ucy5maWx0ZXJQbHVnaW5zID0gInRydWUiLmVxdWFscyhmaWx0ZXJPcHRpb25zKTsgLy8kTk9OLU5MUy0xJAorCQlTdHJpbmcgcGF0dGVybnMgPSBzZWN0aW9uLmdldChQUkVGX0ZJTFRFUl9PUFRJT05TX1BMVUdJTl9QQVRURVJOUyk7CisJCWlmIChwYXR0ZXJucyAhPSBudWxsKSB7CisJCQlTdHJpbmdbXSBzcGxpdCA9IHBhdHRlcm5zLnN1YnN0cmluZygxLCBwYXR0ZXJucy5sZW5ndGgoKSAtIDEpLnNwbGl0KCIsIik7IC8vJE5PTi1OTFMtMSQKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgc3BsaXQubGVuZ3RoOyBpKyspIHsKKwkJCQlzcGxpdFtpXSA9IHNwbGl0W2ldLnRyaW0oKTsKKwkJCX0KKwkJCXRoaXMuZmlsdGVyT3B0aW9ucy5wbHVnaW5QYXR0ZXJucyA9IHNwbGl0OworCQl9CisJCXRoaXMuZmlsdGVyT3B0aW9ucy5rZXlzV2l0aE1pc3NpbmdFbnRyaWVzT25seSA9ICJ0cnVlIi5lcXVhbHMoc2VjdGlvbi5nZXQoUFJFRl9GSUxURVJfT1BUSU9OU19NSVNTSU5HX09OTFkpKTsgLy8kTk9OLU5MUy0xJAorCisJCS8vIFRPRE8gU2F2ZSBjb2x1bW4gd2lkdGhzIAorCX0KKworCXByaXZhdGUgdm9pZCBzYXZlU2V0dGluZ3MoKSB7CisJCUlEaWFsb2dTZXR0aW5ncyBkaWFsb2dTZXR0aW5ncyA9IE1lc3NhZ2VzRWRpdG9yUGx1Z2luLmdldERlZmF1bHQoKS5nZXREaWFsb2dTZXR0aW5ncygpOworCQlJRGlhbG9nU2V0dGluZ3Mgc2VjdGlvbiA9IGRpYWxvZ1NldHRpbmdzLmdldFNlY3Rpb24oUFJFRl9TRUNUSU9OX05BTUUpOworCQlpZiAoc2VjdGlvbiA9PSBudWxsKSB7CisJCQlzZWN0aW9uID0gZGlhbG9nU2V0dGluZ3MuYWRkTmV3U2VjdGlvbihQUkVGX1NFQ1RJT05fTkFNRSk7CisJCX0KKwkJLy8gU29ydCBvcmRlcgorCQlzZWN0aW9uLnB1dChQUkVGX1NPUlRfT1JERVIsIHNvcnRPcmRlci50b1N0cmluZygpKTsKKworCQkvLyBDb2x1bW5zCisJCXNlY3Rpb24ucHV0KFBSRUZfQ09MVU1OUywgQXJyYXlzLnRvU3RyaW5nKGNvbHVtbkNvbmZpZ3MpKTsKKworCQkvLyBGaWx0ZXIgb3B0aW9ucworCQlzZWN0aW9uLnB1dChQUkVGX0ZJTFRFUl9PUFRJT05TX0ZJTFRFUl9QTFVHSU5TLCBmaWx0ZXJPcHRpb25zLmZpbHRlclBsdWdpbnMpOworCQlzZWN0aW9uLnB1dChQUkVGX0ZJTFRFUl9PUFRJT05TX1BMVUdJTl9QQVRURVJOUywgQXJyYXlzLnRvU3RyaW5nKGZpbHRlck9wdGlvbnMucGx1Z2luUGF0dGVybnMpKTsKKwkJc2VjdGlvbi5wdXQoUFJFRl9GSUxURVJfT1BUSU9OU19NSVNTSU5HX09OTFksIGZpbHRlck9wdGlvbnMua2V5c1dpdGhNaXNzaW5nRW50cmllc09ubHkpOworCX0KKworCXByaXZhdGUgdm9pZCBjcmVhdGVUYWJsZVZpZXdlcigpIHsKKwkJdGFibGUgPSBuZXcgVGFibGUodGFibGVDb21wb3NpdGUsIFNXVC5WSVJUVUFMIHwgU1dULkZVTExfU0VMRUNUSU9OIHwgU1dULk1VTFRJKTsKKwkJdGFibGVWaWV3ZXIgPSBuZXcgVGFibGVWaWV3ZXIodGFibGUpOworCQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOworCQl0b29sa2l0LmFkYXB0KHRhYmxlKTsKKwkJdG9vbGtpdC5wYWludEJvcmRlcnNGb3IodGFibGUpOworCQl0b29sa2l0LmFkYXB0KHRhYmxlLCB0cnVlLCB0cnVlKTsKKworCQl0YWJsZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IElMYXp5Q29udGVudFByb3ZpZGVyKCkgeworCQkJcHVibGljIHZvaWQgdXBkYXRlRWxlbWVudChpbnQgaW5kZXgpIHsKKwkJCQl0YWJsZVZpZXdlci5yZXBsYWNlKGVudHJ5TGlzdC5nZXRLZXkoaW5kZXgpLCBpbmRleCk7CisJCQl9CisJCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCQkJfQorCQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7CisJCQl9CisJCX0pOworCQl0YWJsZVZpZXdlci5hZGREb3VibGVDbGlja0xpc3RlbmVyKG5ldyBJRG91YmxlQ2xpY2tMaXN0ZW5lcigpIHsKKwkJCXB1YmxpYyB2b2lkIGRvdWJsZUNsaWNrKERvdWJsZUNsaWNrRXZlbnQgZXZlbnQpIHsKKwkJCQluZXcgRWRpdEVudHJ5QWN0aW9uKCkucnVuKCk7CisJCQl9CisJCX0pOworCX0KKworCXByaXZhdGUgdm9pZCByZWdpc3RlckNvbnRleHRNZW51KCkgeworCQlNZW51TWFuYWdlciBtZW51TWFuYWdlciA9IG5ldyBNZW51TWFuYWdlcigiI1BvcHVwTWVudSIpOyAvLyROT04tTkxTLTEkCisJCW1lbnVNYW5hZ2VyLnNldFJlbW92ZUFsbFdoZW5TaG93bih0cnVlKTsKKwkJbWVudU1hbmFnZXIuYWRkTWVudUxpc3RlbmVyKG5ldyBJTWVudUxpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgbWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtZW51KSB7CisJCQkJZmlsbENvbnRleHRNZW51KG1lbnUpOworCQkJfQorCQl9KTsKKwkJTWVudSBjb250ZXh0TWVudSA9IG1lbnVNYW5hZ2VyLmNyZWF0ZUNvbnRleHRNZW51KHRhYmxlKTsKKwkJdGFibGUuc2V0TWVudShjb250ZXh0TWVudSk7CisJCWdldFNpdGUoKS5yZWdpc3RlckNvbnRleHRNZW51KG1lbnVNYW5hZ2VyLCBnZXRTaXRlKCkuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKSk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgZmlsbENvbnRleHRNZW51KElNZW51TWFuYWdlciBtZW51KSB7CisJCWludCBzZWxlY3Rpb25Db3VudCA9IHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCk7CisJCWlmIChzZWxlY3Rpb25Db3VudCA9PSAxKSB7CisJCQltZW51LmFkZChuZXcgRWRpdEVudHJ5QWN0aW9uKCkpOworCQkJbWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsKKwkJfQorCQlNZW51TWFuYWdlciBzaG93SW5TdWJNZW51ID0gbmV3IE1lbnVNYW5hZ2VyKCImU2hvdyBJbiIpOworCQlJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7CisJCUlDb250cmlidXRpb25JdGVtIGl0ZW0gPSBDb250cmlidXRpb25JdGVtRmFjdG9yeS5WSUVXU19TSE9XX0lOLmNyZWF0ZSh3aW5kb3cpOworCQlzaG93SW5TdWJNZW51LmFkZChpdGVtKTsKKwkJbWVudS5hZGQoc2hvd0luU3ViTWVudSk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7CisJCXF1ZXJ5VGV4dC5zZXRGb2N1cygpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGRvU2F2ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBkb1NhdmVBcygpIHsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBpbnB1dCkgdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uIHsKKwkJc2V0U2l0ZShzaXRlKTsKKwkJc2V0SW5wdXQoaW5wdXQpOworCQl0aGlzLmlucHV0ID0gKExvY2FsaXphdGlvbkVkaXRvcklucHV0KSBpbnB1dDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBpc0RpcnR5KCkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gaXNTYXZlQXNBbGxvd2VkKCkgeworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuV29ya2JlbmNoUGFydCNkaXNwb3NlKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworCQlzYXZlU2V0dGluZ3MoKTsKKwkJaWYgKGZvcm1JbWFnZSAhPSBudWxsKSB7CisJCQlmb3JtSW1hZ2UuZGlzcG9zZSgpOworCQkJZm9ybUltYWdlID0gbnVsbDsKKwkJfQorCQlNZXNzYWdlc0VkaXRvclBsdWdpbi5kaXNwb3NlTW9kZWwoKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBleGVjdXRlUXVlcnkoKSB7CisJCVN0cmluZyBwYXR0ZXJuID0gcXVlcnlUZXh0LmdldFRleHQoKTsKKwkJbGFzdFF1ZXJ5ID0gcGF0dGVybjsKKwkJZXhlY3V0ZVF1ZXJ5KHBhdHRlcm4pOworCX0KKworCXByb3RlY3RlZCB2b2lkIGV4ZWN1dGVRdWVyeShmaW5hbCBTdHJpbmcgcGF0dGVybikgeworCQlpZiAoc2VhcmNoSm9iICE9IG51bGwpIHsKKwkJCXNlYXJjaEpvYi5jYW5jZWwoKTsKKwkJfQorCQlzZWFyY2hKb2IgPSBuZXcgSm9iKCJMb2NhbGl6YXRpb24gRWRpdG9yIFNlYXJjaC4uLiIpIHsKKworCQkJQE92ZXJyaWRlCisJCQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CisJCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgeworCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7CisJCQkJCQlmb3JtLnNldEJ1c3kodHJ1ZSk7CisJCQkJCX0KKwkJCQl9KTsKKworCQkJCVN0cmluZyBrZXlQYXR0ZXJuID0gcGF0dGVybjsKKwkJCQlpZiAoIXBhdHRlcm4uZW5kc1dpdGgoIioiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJCWtleVBhdHRlcm4gPSBwYXR0ZXJuLmNvbmNhdCgiKiIpOyAvLyROT04tTkxTLTEkCisJCQkJfQorCQkJCVN0cmluZyBzdHJQYXR0ZXJuID0ga2V5UGF0dGVybjsKKwkJCQlpZiAoc3RyUGF0dGVybi5sZW5ndGgoKSA+IDAgJiYgIXN0clBhdHRlcm4uc3RhcnRzV2l0aCgiKiIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQkJc3RyUGF0dGVybiA9ICIqIi5jb25jYXQoc3RyUGF0dGVybik7IC8vJE5PTi1OTFMtMSQKKwkJCQl9CisKKwkJCQlSZXNvdXJjZUJ1bmRsZU1vZGVsIG1vZGVsID0gTWVzc2FnZXNFZGl0b3JQbHVnaW4uZ2V0TW9kZWwobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7CisJCQkJTG9jYWxlW10gbG9jYWxlcyA9IGdldExvY2FsZXMoKTsKKworCQkJCS8vIENvbGxlY3Qga2V5cworCQkJCVJlc291cmNlQnVuZGxlS2V5W10ga2V5czsKKwkJCQlpZiAoIWZpbHRlck9wdGlvbnMuZmlsdGVyUGx1Z2lucworCQkJCQkJfHwgZmlsdGVyT3B0aW9ucy5wbHVnaW5QYXR0ZXJucyA9PSBudWxsCisJCQkJCQl8fCBmaWx0ZXJPcHRpb25zLnBsdWdpblBhdHRlcm5zLmxlbmd0aCA9PSAwKSB7CisKKwkJCQkJLy8gRW5zdXJlIHRoZSBidW5kbGVzIGFyZSBsb2FkZWQKKwkJCQkJZm9yIChMb2NhbGUgbG9jYWxlIDogbG9jYWxlcykgeworCQkJCQkJdHJ5IHsKKwkJCQkJCQltb2RlbC5sb2FkQnVuZGxlcyhsb2NhbGUpOworCQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQkJCQkJTWVzc2FnZXNFZGl0b3JQbHVnaW4ubG9nKGUpOworCQkJCQkJfQorCQkJCQl9CisKKwkJCQkJdHJ5IHsKKwkJCQkJCWtleXMgPSBtb2RlbC5nZXRBbGxLZXlzKCk7CisJCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgeworCQkJCQkJTWVzc2FnZXNFZGl0b3JQbHVnaW4ubG9nKGUpOworCQkJCQkJa2V5cyA9IG5ldyBSZXNvdXJjZUJ1bmRsZUtleVswXTsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCVN0cmluZ1tdIHBhdHRlcm5zID0gZmlsdGVyT3B0aW9ucy5wbHVnaW5QYXR0ZXJuczsKKwkJCQkJU3RyaW5nTWF0Y2hlcltdIG1hdGNoZXJzID0gbmV3IFN0cmluZ01hdGNoZXJbcGF0dGVybnMubGVuZ3RoXTsKKwkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXRjaGVycy5sZW5ndGg7IGkrKykgeworCQkJCQkJbWF0Y2hlcnNbaV0gPSBuZXcgU3RyaW5nTWF0Y2hlcihwYXR0ZXJuc1tpXSwgdHJ1ZSwgZmFsc2UpOworCQkJCQl9CisKKwkJCQkJaW50IHNpemUgPSAwOworCQkJCQlSZXNvdXJjZUJ1bmRsZUZhbWlseVtdIGFsbEZhbWlsaWVzID0gbW9kZWwuZ2V0RmFtaWxpZXMoKTsKKwkJCQkJQXJyYXlMaXN0PFJlc291cmNlQnVuZGxlRmFtaWx5PiBmYW1pbGllcyA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2VCdW5kbGVGYW1pbHk+KCk7CisJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYWxsRmFtaWxpZXMubGVuZ3RoOyBpKyspIHsKKwkJCQkJCVJlc291cmNlQnVuZGxlRmFtaWx5IGZhbWlseSA9IGFsbEZhbWlsaWVzW2ldOworCQkJCQkJU3RyaW5nIHBsdWdpbklkID0gZmFtaWx5LmdldFBsdWdpbklkKCk7CisJCQkJCQlmb3IgKFN0cmluZ01hdGNoZXIgbWF0Y2hlciA6IG1hdGNoZXJzKSB7CisJCQkJCQkJaWYgKG1hdGNoZXIubWF0Y2gocGx1Z2luSWQpKSB7CisJCQkJCQkJCWZhbWlsaWVzLmFkZChmYW1pbHkpOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQl9CisJCQkJCQl9CisKKwkJCQkJfQorCQkJCQlmb3IgKFJlc291cmNlQnVuZGxlRmFtaWx5IGZhbWlseSA6IGZhbWlsaWVzKSB7CisJCQkJCQlzaXplICs9IGZhbWlseS5nZXRLZXlDb3VudCgpOworCQkJCQl9CisKKwkJCQkJQXJyYXlMaXN0PFJlc291cmNlQnVuZGxlS2V5PiBmaWx0ZXJlZEtleXMgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlQnVuZGxlS2V5PihzaXplKTsKKwkJCQkJZm9yIChSZXNvdXJjZUJ1bmRsZUZhbWlseSBmYW1pbHkgOiBmYW1pbGllcykgeworCQkJCQkJLy8gRW5zdXJlIHRoZSBidW5kbGVzIGFyZSBsb2FkZWQKKwkJCQkJCWZvciAoTG9jYWxlIGxvY2FsZSA6IGxvY2FsZXMpIHsKKwkJCQkJCQl0cnkgeworCQkJCQkJCQlSZXNvdXJjZUJ1bmRsZSBidW5kbGUgPSBmYW1pbHkuZ2V0QnVuZGxlKGxvY2FsZSk7CisJCQkJCQkJCWlmIChidW5kbGUgIT0gbnVsbCkKKwkJCQkJCQkJCWJ1bmRsZS5sb2FkKCk7CisJCQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQkJCQkJCU1lc3NhZ2VzRWRpdG9yUGx1Z2luLmxvZyhlKTsKKwkJCQkJCQl9CisJCQkJCQl9CisKKwkJCQkJCVJlc291cmNlQnVuZGxlS2V5W10gZmFtaWx5S2V5cyA9IGZhbWlseS5nZXRLZXlzKCk7CisJCQkJCQlmb3IgKFJlc291cmNlQnVuZGxlS2V5IGtleSA6IGZhbWlseUtleXMpIHsKKwkJCQkJCQlmaWx0ZXJlZEtleXMuYWRkKGtleSk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJa2V5cyA9IGZpbHRlcmVkS2V5cy50b0FycmF5KG5ldyBSZXNvdXJjZUJ1bmRsZUtleVtmaWx0ZXJlZEtleXMuc2l6ZSgpXSk7CisJCQkJfQorCisJCQkJLy8gRmlsdGVyIGtleXMKKwkJCQlBcnJheUxpc3Q8UmVzb3VyY2VCdW5kbGVLZXk+IGZpbHRlcmVkID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZUJ1bmRsZUtleT4oKTsKKworCQkJCVN0cmluZ01hdGNoZXIga2V5TWF0Y2hlciA9IG5ldyBTdHJpbmdNYXRjaGVyKGtleVBhdHRlcm4sIHRydWUsIGZhbHNlKTsKKwkJCQlTdHJpbmdNYXRjaGVyIHN0ck1hdGNoZXIgPSBuZXcgU3RyaW5nTWF0Y2hlcihzdHJQYXR0ZXJuLCB0cnVlLCBmYWxzZSk7CisJCQkJZm9yIChSZXNvdXJjZUJ1bmRsZUtleSBrZXkgOiBrZXlzKSB7CisJCQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKKwkJCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOworCisJCQkJCS8vIE1pc3NpbmcgZW50cmllcworCQkJCQlpZiAoZmlsdGVyT3B0aW9ucy5rZXlzV2l0aE1pc3NpbmdFbnRyaWVzT25seSkgeworCQkJCQkJYm9vbGVhbiBoYXNNaXNzaW5nRW50cnkgPSBmYWxzZTsKKwkJCQkJCS8vIENoZWNrIGFsbCBjb2x1bW5zIGZvciBtaXNzaW5nIHZhbHVlcworCQkJCQkJZm9yIChPYmplY3QgY29uZmlnIDogY29sdW1uQ29uZmlncykgeworCQkJCQkJCWlmIChjb25maWcgPT0gS0VZKQorCQkJCQkJCQljb250aW51ZTsKKwkJCQkJCQlMb2NhbGUgbG9jYWxlID0gKExvY2FsZSkgY29uZmlnOworCQkJCQkJCVN0cmluZyB2YWx1ZSA9IG51bGw7CisJCQkJCQkJdHJ5IHsKKwkJCQkJCQkJdmFsdWUgPSBrZXkuZ2V0VmFsdWUobG9jYWxlKTsKKwkJCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCQkJCQkJTWVzc2FnZXNFZGl0b3JQbHVnaW4ubG9nKGUpOworCQkJCQkJCX0KKwkJCQkJCQlpZiAodmFsdWUgPT0gbnVsbCB8fCB2YWx1ZS5sZW5ndGgoKSA9PSAwKSB7CisJCQkJCQkJCWhhc01pc3NpbmdFbnRyeSA9IHRydWU7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJCWlmICghaGFzTWlzc2luZ0VudHJ5KQorCQkJCQkJCWNvbnRpbnVlOworCQkJCQl9CisKKwkJCQkJLy8gTWF0Y2gga2V5CisJCQkJCWlmIChrZXlNYXRjaGVyLm1hdGNoKGtleS5nZXROYW1lKCkpKSB7CisJCQkJCQlmaWx0ZXJlZC5hZGQoa2V5KTsKKwkJCQkJCWNvbnRpbnVlOworCQkJCQl9CisKKwkJCQkJLy8gTWF0Y2ggZW50cmllcworCQkJCQlmb3IgKE9iamVjdCBjb25maWcgOiBjb2x1bW5Db25maWdzKSB7CisJCQkJCQlpZiAoY29uZmlnID09IEtFWSkKKwkJCQkJCQljb250aW51ZTsKKwkJCQkJCUxvY2FsZSBsb2NhbGUgPSAoTG9jYWxlKSBjb25maWc7CisJCQkJCQlTdHJpbmcgdmFsdWUgPSBudWxsOworCQkJCQkJdHJ5IHsKKwkJCQkJCQl2YWx1ZSA9IGtleS5nZXRWYWx1ZShsb2NhbGUpOworCQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7CisJCQkJCQkJTWVzc2FnZXNFZGl0b3JQbHVnaW4ubG9nKGUpOworCQkJCQkJfQorCQkJCQkJaWYgKHN0ck1hdGNoZXIubWF0Y2godmFsdWUpKSB7CisJCQkJCQkJZmlsdGVyZWQuYWRkKGtleSk7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisKKwkJCQlSZXNvdXJjZUJ1bmRsZUtleVtdIGFycmF5ID0gZmlsdGVyZWQudG9BcnJheShuZXcgUmVzb3VyY2VCdW5kbGVLZXlbZmlsdGVyZWQuc2l6ZSgpXSk7CisJCQkJaWYgKHNvcnRPcmRlciA9PSBLRVkpIHsKKwkJCQkJQXJyYXlzLnNvcnQoYXJyYXksIG5ldyBDb21wYXJhdG9yPFJlc291cmNlQnVuZGxlS2V5PigpIHsKKwkJCQkJCXB1YmxpYyBpbnQgY29tcGFyZShSZXNvdXJjZUJ1bmRsZUtleSBvMSwgUmVzb3VyY2VCdW5kbGVLZXkgbzIpIHsKKwkJCQkJCQlyZXR1cm4gbzEuZ2V0TmFtZSgpLmNvbXBhcmVUb0lnbm9yZUNhc2UobzIuZ2V0TmFtZSgpKTsKKwkJCQkJCX0KKwkJCQkJfSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJTG9jYWxlIGxvY2FsZSA9IChMb2NhbGUpIHNvcnRPcmRlcjsKKwkJCQkJQXJyYXlzLnNvcnQoYXJyYXksIG5ldyBCdW5kbGVTdHJpbmdDb21wYXJhdG9yKGxvY2FsZSkpOworCQkJCX0KKwkJCQllbnRyeUxpc3QgPSBuZXcgUmVzb3VyY2VCdW5kbGVLZXlMaXN0KGFycmF5KTsKKworCQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKKwkJCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7CisKKwkJCQlmaW5hbCBSZXNvdXJjZUJ1bmRsZUtleUxpc3QgZW50cnlMaXN0MiA9IGVudHJ5TGlzdDsKKwkJCQlEaXNwbGF5LmdldERlZmF1bHQoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7CisJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKKwkJCQkJCWZvcm0uc2V0QnVzeShmYWxzZSk7CisJCQkJCQlpZiAoZW50cnlMaXN0MiAhPSBudWxsKSB7CisJCQkJCQkJZW50cnlMaXN0ID0gZW50cnlMaXN0MjsKKwkJCQkJCX0KKwkJCQkJCXNldFNlYXJjaFJlc3VsdChlbnRyeUxpc3QpOworCQkJCQl9CisJCQkJfSk7CisJCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7CisJCQl9CisJCX07CisJCXNlYXJjaEpvYi5zZXRTeXN0ZW0odHJ1ZSk7CisJCXNlYXJjaEpvYi5zZXRSdWxlKG11dGV4UnVsZSk7CisJCXNlYXJjaEpvYi5zY2hlZHVsZSgpOworCX0KKworCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVRhYmxlTGF5b3V0KCkgeworCQl0YWJsZS5nZXRQYXJlbnQoKS5sYXlvdXQodHJ1ZSwgdHJ1ZSk7CisJfQorCisJcHJvdGVjdGVkIHZvaWQgc2V0U2VhcmNoUmVzdWx0KFJlc291cmNlQnVuZGxlS2V5TGlzdCBlbnRyeUxpc3QpIHsKKwkJdGFibGUucmVtb3ZlQWxsKCk7CisJCWlmIChlbnRyeUxpc3QgIT0gbnVsbCkgeworCQkJdGFibGUuc2V0SXRlbUNvdW50KGVudHJ5TGlzdC5nZXRTaXplKCkpOworCQl9IGVsc2UgeworCQkJdGFibGUuc2V0SXRlbUNvdW50KDApOworCQl9CisJCXVwZGF0ZVRhYmxlTGF5b3V0KCk7CisJfQorCisJcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKKwkJZXhlY3V0ZVF1ZXJ5KGxhc3RRdWVyeSk7CisJfQorCisJcHVibGljIHZvaWQgdXBkYXRlTGFiZWxzKCkgeworCQl0YWJsZS5yZWRyYXcoKTsKKwkJdGFibGUudXBkYXRlKCk7CisJfQorCisJLyoqCisJICogQHBhcmFtIGNvbHVtbkNvbmZpZ3MgYW4gYXJyYXkgY29udGFpbmluZyA8Y29kZT5LRVk8L2NvZGU+IGFuZCB7QGxpbmsgTG9jYWxlfSB2YWx1ZXMgCisJICovCisJcHVibGljIHZvaWQgc2V0Q29sdW1ucyhPYmplY3RbXSBjb2x1bW5Db25maWdzKSB7CisJCXRoaXMuY29sdW1uQ29uZmlncyA9IGNvbHVtbkNvbmZpZ3M7CisJCXVwZGF0ZUNvbHVtbnMoKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB1cGRhdGVDb2x1bW5zKCkgeworCQlmb3IgKFRhYmxlQ29sdW1uIGNvbHVtbiA6IGNvbHVtbnMpIHsKKwkJCWNvbHVtbi5kaXNwb3NlKCk7CisJCX0KKwkJY29sdW1ucy5jbGVhcigpOworCisJCVRhYmxlQ29sdW1uTGF5b3V0IHRhYmxlQ29sdW1uTGF5b3V0ID0gbmV3IFRhYmxlQ29sdW1uTGF5b3V0KCk7CisJCXRhYmxlQ29tcG9zaXRlLnNldExheW91dCh0YWJsZUNvbHVtbkxheW91dCk7CisKKwkJSGFzaFNldDxMb2NhbGU+IGxvY2FsZXNUb1VubG9hZCA9IG5ldyBIYXNoU2V0PExvY2FsZT4oNCk7CisJCUxvY2FsZVtdIGN1cnJlbnRMb2NhbGVzID0gZ2V0TG9jYWxlcygpOworCQlmb3IgKExvY2FsZSBsb2NhbGUgOiBjdXJyZW50TG9jYWxlcykgeworCQkJbG9jYWxlc1RvVW5sb2FkLmFkZChsb2NhbGUpOworCQl9CisKKwkJLy8gQ3JlYXRlIGNvbHVtbnMKKwkJZm9yIChPYmplY3QgY29uZmlnIDogY29sdW1uQ29uZmlncykgeworCQkJaWYgKGNvbmZpZyA9PSBudWxsKQorCQkJCWNvbnRpbnVlOworCisJCQlmaW5hbCBUYWJsZVZpZXdlckNvbHVtbiB2aWV3ZXJDb2x1bW4gPSBuZXcgVGFibGVWaWV3ZXJDb2x1bW4odGFibGVWaWV3ZXIsIFNXVC5OT05FKTsKKwkJCVRhYmxlQ29sdW1uIGNvbHVtbiA9IHZpZXdlckNvbHVtbi5nZXRDb2x1bW4oKTsKKwkJCWlmIChjb25maWcgPT0gS0VZKSB7CisJCQkJY29sdW1uLnNldFRleHQoIktleSIpOworCQkJfSBlbHNlIHsKKwkJCQlMb2NhbGUgbG9jYWxlID0gKExvY2FsZSkgY29uZmlnOworCQkJCWlmIChsb2NhbGUuZ2V0TGFuZ3VhZ2UoKS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQkJY29sdW1uLnNldFRleHQoIkRlZmF1bHQgQnVuZGxlIik7CisJCQkJfSBlbHNlIHsKKwkJCQkJU3RyaW5nIGRpc3BsYXlOYW1lID0gbG9jYWxlLmdldERpc3BsYXlOYW1lKCk7CisJCQkJCWlmIChkaXNwbGF5TmFtZS5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTEkCisJCQkJCQlkaXNwbGF5TmFtZSA9IGxvY2FsZS50b1N0cmluZygpOworCQkJCQljb2x1bW4uc2V0VGV4dChkaXNwbGF5TmFtZSk7CisJCQkJCWxvY2FsZXNUb1VubG9hZC5yZW1vdmUobG9jYWxlKTsKKwkJCQl9CisJCQl9CisKKwkJCXZpZXdlckNvbHVtbi5zZXRMYWJlbFByb3ZpZGVyKG5ldyBMb2NhbGl6YXRpb25MYWJlbFByb3ZpZGVyKGNvbmZpZykpOworCQkJdGFibGVDb2x1bW5MYXlvdXQuc2V0Q29sdW1uRGF0YShjb2x1bW4sIG5ldyBDb2x1bW5XZWlnaHREYXRhKDMzKSk7CisJCQljb2x1bW5zLmFkZChjb2x1bW4pOworCQkJY29sdW1uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgeworCQkJCUBPdmVycmlkZQorCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKKwkJCQkJaW50IHNpemUgPSBjb2x1bW5zLnNpemUoKTsKKwkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJCQkJCVRhYmxlQ29sdW1uIGNvbHVtbiA9IGNvbHVtbnMuZ2V0KGkpOworCQkJCQkJaWYgKGNvbHVtbiA9PSBlLndpZGdldCkgeworCQkJCQkJCU9iamVjdCBjb25maWcgPSBjb2x1bW5Db25maWdzW2ldOworCQkJCQkJCXNvcnRPcmRlciA9IGNvbmZpZzsKKwkJCQkJCQl0YWJsZS5zZXRTb3J0Q29sdW1uKGNvbHVtbik7CisJCQkJCQkJdGFibGUuc2V0U29ydERpcmVjdGlvbihTV1QuVVApOworCQkJCQkJCXJlZnJlc2goKTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0pOworCQl9CisKKwkJLy8gVXBkYXRlIHNvcnQgb3JkZXIKKwkJTGlzdDxPYmplY3Q+IGNvbmZpZ3MgPSBBcnJheXMuYXNMaXN0KGNvbHVtbkNvbmZpZ3MpOworCQlpZiAoIWNvbmZpZ3MuY29udGFpbnMoc29ydE9yZGVyKSkgeworCQkJc29ydE9yZGVyID0gS0VZOyAvLyBmYWxsIGJhY2sgdG8gZGVmYXVsdCBzb3J0IG9yZGVyCisJCX0KKwkJaW50IGluZGV4ID0gY29uZmlncy5pbmRleE9mKHNvcnRPcmRlcik7CisJCWlmIChpbmRleCAhPSAtMSkKKwkJCXRhYmxlLnNldFNvcnRDb2x1bW4oY29sdW1ucy5nZXQoaW5kZXgpKTsKKworCQlyZWZyZXNoKCk7CisJfQorCisJLyoKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuV29ya2JlbmNoUGFydCNnZXRBZGFwdGVyKGphdmEubGFuZy5DbGFzcykKKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgeworCQlpZiAoSVNob3dJblNvdXJjZS5jbGFzcyA9PSBhZGFwdGVyKSB7CisJCQlyZXR1cm4gbmV3IElTaG93SW5Tb3VyY2UoKSB7CisJCQkJcHVibGljIFNob3dJbkNvbnRleHQgZ2V0U2hvd0luQ29udGV4dCgpIHsKKwkJCQkJUmVzb3VyY2VCdW5kbGVLZXkgZW50cnkgPSBnZXRTZWxlY3RlZEVudHJ5KCk7CisJCQkJCWlmIChlbnRyeSA9PSBudWxsKQorCQkJCQkJcmV0dXJuIG51bGw7CisJCQkJCVJlc291cmNlQnVuZGxlIGJ1bmRsZSA9IGVudHJ5LmdldFBhcmVudCgpLmdldEJ1bmRsZShuZXcgTG9jYWxlKCIiKSk7CisJCQkJCWlmIChidW5kbGUgPT0gbnVsbCkKKwkJCQkJCXJldHVybiBudWxsOworCQkJCQlPYmplY3QgcmVzb3VyY2UgPSBidW5kbGUuZ2V0VW5kZXJseWluZ1Jlc291cmNlKCk7CisJCQkJCXJldHVybiBuZXcgU2hvd0luQ29udGV4dChyZXNvdXJjZSwgbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24ocmVzb3VyY2UpKTsKKwkJCQl9CisJCQl9OworCQl9CisJCXJldHVybiBzdXBlci5nZXRBZGFwdGVyKGFkYXB0ZXIpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGN1cnJlbnRseSBkaXNwbGF5ZWQgbG9jYWxlcy4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBjdXJyZW50bHkgZGlzcGxheWVkIGxvY2FsZXMKKwkgKi8KKwlwdWJsaWMgTG9jYWxlW10gZ2V0TG9jYWxlcygpIHsKKwkJQXJyYXlMaXN0PExvY2FsZT4gbG9jYWxlcyA9IG5ldyBBcnJheUxpc3Q8TG9jYWxlPihjb2x1bW5Db25maWdzLmxlbmd0aCk7CisJCWZvciAoT2JqZWN0IGNvbmZpZyA6IGNvbHVtbkNvbmZpZ3MpIHsKKwkJCWlmIChjb25maWcgaW5zdGFuY2VvZiBMb2NhbGUpIHsKKwkJCQlMb2NhbGUgbG9jYWxlID0gKExvY2FsZSkgY29uZmlnOworCQkJCWxvY2FsZXMuYWRkKGxvY2FsZSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIGxvY2FsZXMudG9BcnJheShuZXcgTG9jYWxlW2xvY2FsZXMuc2l6ZSgpXSk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL3BkZS9ubHMvaW50ZXJuYWwvdWkvZWRpdG9yL0xvY2FsaXphdGlvbkVkaXRvcklucHV0LmphdmEgYi9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL3BkZS9ubHMvaW50ZXJuYWwvdWkvZWRpdG9yL0xvY2FsaXphdGlvbkVkaXRvcklucHV0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFkOGM3ZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvcGRlL25scy9pbnRlcm5hbC91aS9lZGl0b3IvTG9jYWxpemF0aW9uRWRpdG9ySW5wdXQuamF2YQpAQCAtMCwwICsxLDc5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IFN0ZWZhbiBN/GNrZSBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgU3RlZmFuIE38Y2tlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UucGRlLm5scy5pbnRlcm5hbC51aS5lZGl0b3I7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklNZW1lbnRvOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQZXJzaXN0YWJsZUVsZW1lbnQ7CisKK3B1YmxpYyBjbGFzcyBMb2NhbGl6YXRpb25FZGl0b3JJbnB1dCBpbXBsZW1lbnRzIElFZGl0b3JJbnB1dCwgSVBlcnNpc3RhYmxlRWxlbWVudCB7CisKKwlwdWJsaWMgTG9jYWxpemF0aW9uRWRpdG9ySW5wdXQoKSB7CisJfQorCisJLyoKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCNleGlzdHMoKQorCSAqLworCXB1YmxpYyBib29sZWFuIGV4aXN0cygpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCisJLyoKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCNnZXRJbWFnZURlc2NyaXB0b3IoKQorCSAqLworCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKCkgeworCQlyZXR1cm4gSW1hZ2VEZXNjcmlwdG9yLmdldE1pc3NpbmdJbWFnZURlc2NyaXB0b3IoKTsKKwl9CisKKwkvKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0I2dldE5hbWUoKQorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkJcmV0dXJuICJMb2NhbGl6YXRpb24gRWRpdG9yIjsKKwl9CisKKwkvKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0I2dldFBlcnNpc3RhYmxlKCkKKwkgKi8KKwlwdWJsaWMgSVBlcnNpc3RhYmxlRWxlbWVudCBnZXRQZXJzaXN0YWJsZSgpIHsKKwkJcmV0dXJuIHRoaXM7CisJfQorCisJLyoKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCNnZXRUb29sVGlwVGV4dCgpCisJICovCisJcHVibGljIFN0cmluZyBnZXRUb29sVGlwVGV4dCgpIHsKKwkJcmV0dXJuIGdldE5hbWUoKTsKKwl9CisKKwkvKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGUjZ2V0QWRhcHRlcihqYXZhLmxhbmcuQ2xhc3MpCisJICovCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklQZXJzaXN0YWJsZUVsZW1lbnQjZ2V0RmFjdG9yeUlkKCkKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldEZhY3RvcnlJZCgpIHsKKwkJcmV0dXJuIExvY2FsaXphdGlvbkVkaXRvcklucHV0RmFjdG9yeS5GQUNUT1JZX0lEOworCX0KKwkKKwkvKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVBlcnNpc3RhYmxlI3NhdmVTdGF0ZShvcmcuZWNsaXBzZS51aS5JTWVtZW50bykKKwkgKi8KKwlwdWJsaWMgdm9pZCBzYXZlU3RhdGUoSU1lbWVudG8gbWVtZW50bykgeworCX0KKwkKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvcGRlL25scy9pbnRlcm5hbC91aS9lZGl0b3IvTG9jYWxpemF0aW9uRWRpdG9ySW5wdXRGYWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL3BkZS9ubHMvaW50ZXJuYWwvdWkvZWRpdG9yL0xvY2FsaXphdGlvbkVkaXRvcklucHV0RmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5OGMyMTgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL3BkZS9ubHMvaW50ZXJuYWwvdWkvZWRpdG9yL0xvY2FsaXphdGlvbkVkaXRvcklucHV0RmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMzEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggU3RlZmFuIE38Y2tlIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBTdGVmYW4gTfxja2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5wZGUubmxzLmludGVybmFsLnVpLmVkaXRvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFbGVtZW50RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5JTWVtZW50bzsKKworcHVibGljIGNsYXNzIExvY2FsaXphdGlvbkVkaXRvcklucHV0RmFjdG9yeSBpbXBsZW1lbnRzIElFbGVtZW50RmFjdG9yeSB7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGQUNUT1JZX0lEID0gIm9yZy5lY2xpcHNlLnBkZS5ubHMudWkuTG9jYWxpemF0aW9uRWRpdG9ySW5wdXRGYWN0b3J5IjsgLy8kTk9OLU5MUy0xJAorCisJcHVibGljIExvY2FsaXphdGlvbkVkaXRvcklucHV0RmFjdG9yeSgpIHsKKwl9CisKKwkvKgorCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUVsZW1lbnRGYWN0b3J5I2NyZWF0ZUVsZW1lbnQob3JnLmVjbGlwc2UudWkuSU1lbWVudG8pCisJICovCisJcHVibGljIElBZGFwdGFibGUgY3JlYXRlRWxlbWVudChJTWVtZW50byBtZW1lbnRvKSB7CisJCXJldHVybiBuZXcgTG9jYWxpemF0aW9uRWRpdG9ySW5wdXQoKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvcGRlL25scy9pbnRlcm5hbC91aS9tb2RlbC9SZXNvdXJjZUJ1bmRsZS5qYXZhIGIvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9wZGUvbmxzL2ludGVybmFsL3VpL21vZGVsL1Jlc291cmNlQnVuZGxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjNmODcxOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvcGRlL25scy9pbnRlcm5hbC91aS9tb2RlbC9SZXNvdXJjZUJ1bmRsZS5qYXZhCkBAIC0wLDAgKzEsMTcxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IFN0ZWZhbiBN/GNrZSBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgU3RlZmFuIE38Y2tlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UucGRlLm5scy5pbnRlcm5hbC51aS5tb2RlbDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IucGx1Z2luLk1lc3NhZ2VzRWRpdG9yUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXJFbnRyeVJlc291cmNlOworCisvKioKKyAqIEEgPGNvZGU+UmVzb3VyY2VCdW5kbGU8L2NvZGU+IHJlcHJlc2VudHMgYSBzaW5nbGUgPGNvZGU+LnByb3BlcnRpZXM8L2NvZGU+IGZpbGUuCisgKiA8cD4KKyAqIDxjb2RlPlJlc291cmNlQnVuZGxlPC9jb2RlPiBpbXBsZW1lbnRzIGxhenkgbG9hZGluZy4gQSBidW5kbGUgd2lsbCBiZSBsb2FkZWQKKyAqIGF1dG9tYXRpY2FsbHkgd2hlbiBpdHMgZW50cmllcyBhcmUgYWNjZXNzZWQuIEl0IGNhbiB0aHJvdWdoIHRoZSBwYXJlbnQgbW9kZWwgYnkKKyAqIGNhbGxpbmcge0BsaW5rIFJlc291cmNlQnVuZGxlTW9kZWwjdW5sb2FkQnVuZGxlcyhMb2NhbGUpfSB3aXRoIHRoZSBwcm9wZXIgbG9jYWxlLgorICogPC9wPgorICovCitwdWJsaWMgY2xhc3MgUmVzb3VyY2VCdW5kbGUgZXh0ZW5kcyBSZXNvdXJjZUJ1bmRsZUVsZW1lbnQgeworCisJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBkZWJ1ZyA9IGZhbHNlOworCQorCS8qKgorCSAqIFRoZSBidW5kbGUncyBsb2NhbGUuCisJICovCisJcHJpdmF0ZSBMb2NhbGUgbG9jYWxlOworCS8qKgorCSAqIFRoZSB1bmRlcmx5aW5nIHJlc291cmNlLiBFaXRoZXIgYW4ge0BsaW5rIElGaWxlfSBvciBhbiB7QGxpbmsgSUphckVudHJ5UmVzb3VyY2V9LgorCSAqLworCXByaXZhdGUgT2JqZWN0IHJlc291cmNlOworCisJcHJpdmF0ZSBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBlbnRyaWVzOworCisJcHVibGljIFJlc291cmNlQnVuZGxlKFJlc291cmNlQnVuZGxlRmFtaWx5IHBhcmVudCwgT2JqZWN0IHJlc291cmNlLCBMb2NhbGUgbG9jYWxlKSB7CisJCXN1cGVyKHBhcmVudCk7CisJCXRoaXMucmVzb3VyY2UgPSByZXNvdXJjZTsKKwkJdGhpcy5sb2NhbGUgPSBsb2NhbGU7CisJCWlmIChsb2NhbGUgPT0gbnVsbCkKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkxvY2FsZSBtYXkgbm90IGJlIG51bGwuIik7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgZmFtaWx5IHRvIHdoaWNoIHRoaXMgYnVuZGxlIGJlbG9uZ3MuCisJICogCisJICogQHJldHVybiB0aGUgZmFtaWx5IHRvIHdoaWNoIHRoaXMgYnVuZGxlIGJlbG9uZ3MKKwkgKi8KKwlwdWJsaWMgUmVzb3VyY2VCdW5kbGVGYW1pbHkgZ2V0RmFtaWx5KCkgeworCQlyZXR1cm4gKFJlc291cmNlQnVuZGxlRmFtaWx5KSBzdXBlci5nZXRQYXJlbnQoKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBsb2NhbGUuCisJICogCisJICogQHJldHVybiB0aGUgbG9jYWxlCisJICovCisJcHVibGljIExvY2FsZSBnZXRMb2NhbGUoKSB7CisJCXJldHVybiBsb2NhbGU7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlsb2FkKCk7CisJCXJldHVybiBlbnRyaWVzLmdldChrZXkpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHVuZGVybHlpbmcgcmVzb3VyY2UuIFRoaXMgbWF5IGJlIGFuIHtAbGluayBJRmlsZX0KKwkgKiBvciBhbiB7QGxpbmsgSUphckVudHJ5UmVzb3VyY2V9LgorCSAqIAorCSAqIEByZXR1cm4gdGhlIHVuZGVybHlpbmcgcmVzb3VyY2UgKGFuIHtAbGluayBJRmlsZX0gb3IgYW4ge0BsaW5rIElKYXJFbnRyeVJlc291cmNlfSkKKwkgKi8KKwlwdWJsaWMgT2JqZWN0IGdldFVuZGVybHlpbmdSZXNvdXJjZSgpIHsKKwkJcmV0dXJuIHJlc291cmNlOworCX0KKworCXByb3RlY3RlZCBib29sZWFuIGlzTG9hZGVkKCkgeworCQlyZXR1cm4gZW50cmllcyAhPSBudWxsOworCX0KKworCXB1YmxpYyB2b2lkIGxvYWQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCWlmIChpc0xvYWRlZCgpKQorCQkJcmV0dXJuOworCQllbnRyaWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisKKwkJaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSUZpbGUpIHsKKwkJCWlmIChkZWJ1ZykgeworCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTG9hZGluZyAiICsgcmVzb3VyY2UgKyAiLi4uIik7CisJCQl9CisJCQlJRmlsZSBmaWxlID0gKElGaWxlKSByZXNvdXJjZTsKKwkJCUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gZmlsZS5nZXRDb250ZW50cygpOworCQkJUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFByb3BlcnRpZXMoKTsKKwkJCXRyeSB7CisJCQkJcHJvcGVydGllcy5sb2FkKGlucHV0U3RyZWFtKTsKKwkJCQlwdXRBbGwocHJvcGVydGllcyk7CisJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkJTWVzc2FnZXNFZGl0b3JQbHVnaW4ubG9nKCJFcnJvciByZWFkaW5nIHByb3BlcnR5IGZpbGUuIiwgZSk7CisJCQl9CisJCX0gZWxzZSBpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJSmFyRW50cnlSZXNvdXJjZSkgeworCQkJSUphckVudHJ5UmVzb3VyY2UgamFyRW50cnlSZXNvdXJjZSA9IChJSmFyRW50cnlSZXNvdXJjZSkgcmVzb3VyY2U7CisJCQlJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IGphckVudHJ5UmVzb3VyY2UuZ2V0Q29udGVudHMoKTsKKwkJCVByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBQcm9wZXJ0aWVzKCk7CisJCQl0cnkgeworCQkJCXByb3BlcnRpZXMubG9hZChpbnB1dFN0cmVhbSk7CisJCQkJcHV0QWxsKHByb3BlcnRpZXMpOworCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJCU1lc3NhZ2VzRWRpdG9yUGx1Z2luLmxvZygiRXJyb3IgcmVhZGluZyBwcm9wZXJ0eSBmaWxlLiIsIGUpOworCQkJfQorCQl9IGVsc2UgeworCQkJTWVzc2FnZXNFZGl0b3JQbHVnaW4ubG9nKCJVbmtub3duIHJlc291cmNlIHR5cGUuIiwgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKSk7CisJCX0KKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCB1bmxvYWQoKSB7CisJCWVudHJpZXMgPSBudWxsOworCX0KKworCXB1YmxpYyBib29sZWFuIGlzUmVhZE9ubHkoKSB7CisJCWlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElKYXJFbnRyeVJlc291cmNlKQorCQkJcmV0dXJuIHRydWU7CisJCWlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElGaWxlKSB7CisJCQlJRmlsZSBmaWxlID0gKElGaWxlKSByZXNvdXJjZTsKKwkJCXJldHVybiBmaWxlLmlzUmVhZE9ubHkoKSB8fCBmaWxlLmlzTGlua2VkKCk7CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXByb3RlY3RlZCB2b2lkIHB1dEFsbChQcm9wZXJ0aWVzIHByb3BlcnRpZXMpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJU2V0PEVudHJ5PE9iamVjdCwgT2JqZWN0Pj4gZW50cnlTZXQgPSBwcm9wZXJ0aWVzLmVudHJ5U2V0KCk7CisJCUl0ZXJhdG9yPEVudHJ5PE9iamVjdCwgT2JqZWN0Pj4gaXRlciA9IGVudHJ5U2V0Lml0ZXJhdG9yKCk7CisJCVJlc291cmNlQnVuZGxlRmFtaWx5IGZhbWlseSA9IGdldEZhbWlseSgpOworCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKKwkJCUVudHJ5PE9iamVjdCwgT2JqZWN0PiBuZXh0ID0gaXRlci5uZXh0KCk7CisJCQlPYmplY3Qga2V5ID0gbmV4dC5nZXRLZXkoKTsKKwkJCU9iamVjdCB2YWx1ZSA9IG5leHQuZ2V0VmFsdWUoKTsKKwkJCWlmIChrZXkgaW5zdGFuY2VvZiBTdHJpbmcgJiYgdmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKKwkJCQlTdHJpbmcgc3RyaW5nS2V5ID0gKFN0cmluZykga2V5OworCQkJCWVudHJpZXMucHV0KHN0cmluZ0tleSwgKFN0cmluZykgdmFsdWUpOworCQkJCWZhbWlseS5hZGRLZXkoc3RyaW5nS2V5KTsKKwkJCX0KKwkJfQorCX0KKworCXB1YmxpYyB2b2lkIHB1dChTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJbG9hZCgpOworCQlSZXNvdXJjZUJ1bmRsZUZhbWlseSBmYW1pbHkgPSBnZXRGYW1pbHkoKTsKKwkJZW50cmllcy5wdXQoa2V5LCB2YWx1ZSk7CisJCWZhbWlseS5hZGRLZXkoa2V5KTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nW10gZ2V0S2V5cygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJbG9hZCgpOworCQlTZXQ8U3RyaW5nPiBrZXlTZXQgPSBlbnRyaWVzLmtleVNldCgpOworCQlyZXR1cm4ga2V5U2V0LnRvQXJyYXkobmV3IFN0cmluZ1trZXlTZXQuc2l6ZSgpXSk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL3BkZS9ubHMvaW50ZXJuYWwvdWkvbW9kZWwvUmVzb3VyY2VCdW5kbGVFbGVtZW50LmphdmEgYi9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL3BkZS9ubHMvaW50ZXJuYWwvdWkvbW9kZWwvUmVzb3VyY2VCdW5kbGVFbGVtZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDAyNWJkYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvcGRlL25scy9pbnRlcm5hbC91aS9tb2RlbC9SZXNvdXJjZUJ1bmRsZUVsZW1lbnQuamF2YQpAQCAtMCwwICsxLDI1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IFN0ZWZhbiBN/GNrZSBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgU3RlZmFuIE38Y2tlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UucGRlLm5scy5pbnRlcm5hbC51aS5tb2RlbDsKKworcHVibGljIGFic3RyYWN0IGNsYXNzIFJlc291cmNlQnVuZGxlRWxlbWVudCB7CisKKwlwcml2YXRlIGZpbmFsIFJlc291cmNlQnVuZGxlRWxlbWVudCBwYXJlbnQ7CisKKwlwdWJsaWMgUmVzb3VyY2VCdW5kbGVFbGVtZW50KFJlc291cmNlQnVuZGxlRWxlbWVudCBwYXJlbnQpIHsKKwkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7CisJfQorCQorCXB1YmxpYyBSZXNvdXJjZUJ1bmRsZUVsZW1lbnQgZ2V0UGFyZW50KCkgeworCQlyZXR1cm4gcGFyZW50OworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9wZGUvbmxzL2ludGVybmFsL3VpL21vZGVsL1Jlc291cmNlQnVuZGxlRmFtaWx5LmphdmEgYi9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL3BkZS9ubHMvaW50ZXJuYWwvdWkvbW9kZWwvUmVzb3VyY2VCdW5kbGVGYW1pbHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWRiOTM3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9wZGUvbmxzL2ludGVybmFsL3VpL21vZGVsL1Jlc291cmNlQnVuZGxlRmFtaWx5LmphdmEKQEAgLTAsMCArMSwxMzIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggU3RlZmFuIE38Y2tlIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBTdGVmYW4gTfxja2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5wZGUubmxzLmludGVybmFsLnVpLm1vZGVsOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkFzc2VydDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKKworLyoqCisgKiBBIDxjb2RlPlJlc291cmNlQnVuZGxlR3JvdXA8L2NvZGU+IHJlcHJlc2VudHMgYSBncm91cCBvZiByZXNvdXJjZSBidW5kbGVzCisgKiB0aGF0IGJlbG9uZyB0b2dldGhlci4gTWVtYmVyIHJlc291cmNlIGJ1bmRsZXMgbWF5IHJlc2lkZSBpbiB0aGUgc2FtZSBwcm9qZWN0IGFzIHRoZQorICogZGVmYXVsdCByZXNvdXJjZSBidW5kbGUsIG9yIGluIGNhc2Ugb2YgYSBwbHVnaW4gcHJvamVjdCwgaW4gYSBzZXBhcmF0ZSBmcmFnbWVudAorICogcHJvamVjdC4KKyAqLworcHVibGljIGNsYXNzIFJlc291cmNlQnVuZGxlRmFtaWx5IGV4dGVuZHMgUmVzb3VyY2VCdW5kbGVFbGVtZW50IHsKKworCS8qKgorCSAqIFRoZSBwcm9qZWN0IG5hbWUgb2YgdGhlIGRlZmF1bHQgYnVuZGxlLgorCSAqLworCXByaXZhdGUgU3RyaW5nIHByb2plY3ROYW1lOworCS8qKgorCSAqIFRoZSBwbHVnaW4gaWQgb2YgdGhlIGRlZmF1bHQgYnVuZGxlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3QgYSBwbHVnaW4gb3IgZnJhZ21lbnQgcHJvamVjdC4KKwkgKi8KKwlwcml2YXRlIFN0cmluZyBwbHVnaW5JZDsKKwkvKioKKwkgKiBUaGUgcGFja2FnZSBuYW1lIG9yIHBhdGguCisJICovCisJcHJpdmF0ZSBTdHJpbmcgcGFja2FnZU5hbWU7CisJLyoqCisJICogVGhlIGJhc2UgbmFtZSB0aGF0IGFsbCBmYW1pbHkgbWVtYmVycyBoYXZlIGluIGNvbW1vbi4KKwkgKi8KKwlwcml2YXRlIFN0cmluZyBiYXNlTmFtZTsKKwkvKioKKwkgKiBUaGUgbWVtYmVycyB0aGF0IGJlbG9uZyB0byB0aGlzIHJlc291cmNlIGJ1bmRsZSBmYW1pbHkgKGV4Y2x1ZGluZyB0aGUgZGVmYXVsdCBidW5kbGUpLgorCSAqLworCXByaXZhdGUgQXJyYXlMaXN0PFJlc291cmNlQnVuZGxlPiBtZW1iZXJzID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZUJ1bmRsZT4oKTsKKwkvKioKKwkgKiBBIGNvbGxlY3Rpb24gb2Yga25vd24ga2V5cy4KKwkgKi8KKwlwcml2YXRlIEhhc2hNYXA8U3RyaW5nLCBSZXNvdXJjZUJ1bmRsZUtleT4ga2V5cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgUmVzb3VyY2VCdW5kbGVLZXk+KCk7CisKKwlwdWJsaWMgUmVzb3VyY2VCdW5kbGVGYW1pbHkoUmVzb3VyY2VCdW5kbGVNb2RlbCBwYXJlbnQsIFN0cmluZyBwcm9qZWN0TmFtZSwgU3RyaW5nIHBsdWdpbklkLAorCQkJU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgYmFzZU5hbWUpIHsKKwkJc3VwZXIocGFyZW50KTsKKwkJdGhpcy5wcm9qZWN0TmFtZSA9IHByb2plY3ROYW1lOworCQl0aGlzLnBsdWdpbklkID0gcGx1Z2luSWQ7CisJCXRoaXMucGFja2FnZU5hbWUgPSBwYWNrYWdlTmFtZTsKKwkJdGhpcy5iYXNlTmFtZSA9IGJhc2VOYW1lOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0UHJvamVjdE5hbWUoKSB7CisJCXJldHVybiBwcm9qZWN0TmFtZTsKKwl9CisKKwlwdWJsaWMgU3RyaW5nIGdldFBsdWdpbklkKCkgeworCQlyZXR1cm4gcGx1Z2luSWQ7CisJfQorCisJcHVibGljIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpIHsKKwkJcmV0dXJuIHBhY2thZ2VOYW1lOworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0QmFzZU5hbWUoKSB7CisJCXJldHVybiBiYXNlTmFtZTsKKwl9CisKKwlwdWJsaWMgUmVzb3VyY2VCdW5kbGVbXSBnZXRCdW5kbGVzKCkgeworCQlyZXR1cm4gbWVtYmVycy50b0FycmF5KG5ldyBSZXNvdXJjZUJ1bmRsZVttZW1iZXJzLnNpemUoKV0pOworCX0KKworCXB1YmxpYyBSZXNvdXJjZUJ1bmRsZSBnZXRCdW5kbGUoTG9jYWxlIGxvY2FsZSkgeworCQlmb3IgKFJlc291cmNlQnVuZGxlIGJ1bmRsZSA6IG1lbWJlcnMpIHsKKwkJCWlmIChidW5kbGUuZ2V0TG9jYWxlKCkuZXF1YWxzKGxvY2FsZSkpIHsKKwkJCQlyZXR1cm4gYnVuZGxlOworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCS8qCisJICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2hhc2hDb2RlKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworCQlpZiAocGx1Z2luSWQgIT0gbnVsbCkgeworCQkJcmV0dXJuIGJhc2VOYW1lLmhhc2hDb2RlKCkgXiBwbHVnaW5JZC5oYXNoQ29kZSgpOworCQl9IGVsc2UgeworCQkJcmV0dXJuIGJhc2VOYW1lLmhhc2hDb2RlKCkgXiBwcm9qZWN0TmFtZS5oYXNoQ29kZSgpOworCQl9CisJfQorCisJcHJvdGVjdGVkIHZvaWQgYWRkQnVuZGxlKFJlc291cmNlQnVuZGxlIGJ1bmRsZSkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlBc3NlcnQuaXNUcnVlKGJ1bmRsZS5nZXRQYXJlbnQoKSA9PSB0aGlzKTsKKwkJbWVtYmVycy5hZGQoYnVuZGxlKTsKKwl9CisKKwlwcm90ZWN0ZWQgdm9pZCBhZGRLZXkoU3RyaW5nIGtleSkgeworCQlpZiAoa2V5cy5nZXQoa2V5KSA9PSBudWxsKSB7CisJCQlrZXlzLnB1dChrZXksIG5ldyBSZXNvdXJjZUJ1bmRsZUtleSh0aGlzLCBrZXkpKTsKKwkJfQorCX0KKworCXB1YmxpYyBSZXNvdXJjZUJ1bmRsZUtleVtdIGdldEtleXMoKSB7CisJCUNvbGxlY3Rpb248UmVzb3VyY2VCdW5kbGVLZXk+IHZhbHVlcyA9IGtleXMudmFsdWVzKCk7CisJCXJldHVybiB2YWx1ZXMudG9BcnJheShuZXcgUmVzb3VyY2VCdW5kbGVLZXlbdmFsdWVzLnNpemUoKV0pOworCX0KKworCXB1YmxpYyBpbnQgZ2V0S2V5Q291bnQoKSB7CisJCXJldHVybiBrZXlzLnNpemUoKTsKKwl9CisKKwkvKgorCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCN0b1N0cmluZygpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuICJwcm9qZWN0TmFtZT0iICsgcHJvamVjdE5hbWUgKyAiLCBwYWNrYWdlTmFtZT0iICsgcGFja2FnZU5hbWUgKyAiLCBiYXNlTmFtZT0iICsgYmFzZU5hbWU7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL3BkZS9ubHMvaW50ZXJuYWwvdWkvbW9kZWwvUmVzb3VyY2VCdW5kbGVLZXkuamF2YSBiL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvcGRlL25scy9pbnRlcm5hbC91aS9tb2RlbC9SZXNvdXJjZUJ1bmRsZUtleS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0Y2ZmOTgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL3BkZS9ubHMvaW50ZXJuYWwvdWkvbW9kZWwvUmVzb3VyY2VCdW5kbGVLZXkuamF2YQpAQCAtMCwwICsxLDY0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IFN0ZWZhbiBN/GNrZSBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgU3RlZmFuIE38Y2tlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UucGRlLm5scy5pbnRlcm5hbC51aS5tb2RlbDsKKworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKKworLyoqCisgKiBBIDxjb2RlPlJlc291cmNlQnVuZGxlS2V5PC9jb2RlPiByZXByZXNlbnRzIGEga2V5IHVzZWQgaW4gb25lIG9yIG1vcmUgYnVuZGxlcyBvZgorICogYSB7QGxpbmsgUmVzb3VyY2VCdW5kbGVGYW1pbHl9LgorICovCitwdWJsaWMgY2xhc3MgUmVzb3VyY2VCdW5kbGVLZXkgZXh0ZW5kcyBSZXNvdXJjZUJ1bmRsZUVsZW1lbnQgeworCisJcHJpdmF0ZSBTdHJpbmcga2V5OworCisJcHVibGljIFJlc291cmNlQnVuZGxlS2V5KFJlc291cmNlQnVuZGxlRmFtaWx5IHBhcmVudCwgU3RyaW5nIGtleSkgeworCQlzdXBlcihwYXJlbnQpOworCQl0aGlzLmtleSA9IGtleTsKKwl9CisJCisJLyoKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm5scy51aS5tb2RlbC5SZXNvdXJjZUJ1bmRsZUVsZW1lbnQjZ2V0UGFyZW50KCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUmVzb3VyY2VCdW5kbGVGYW1pbHkgZ2V0UGFyZW50KCkgeworCQlyZXR1cm4gKFJlc291cmNlQnVuZGxlRmFtaWx5KSBzdXBlci5nZXRQYXJlbnQoKTsKKwl9CisKKwlwdWJsaWMgUmVzb3VyY2VCdW5kbGVGYW1pbHkgZ2V0RmFtaWx5KCkgeworCQlyZXR1cm4gZ2V0UGFyZW50KCk7CisJfQorCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQlyZXR1cm4ga2V5OworCX0KKworCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoTG9jYWxlIGxvY2FsZSkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlSZXNvdXJjZUJ1bmRsZSBidW5kbGUgPSBnZXRGYW1pbHkoKS5nZXRCdW5kbGUobG9jYWxlKTsKKwkJaWYgKGJ1bmRsZSA9PSBudWxsKQorCQkJcmV0dXJuIG51bGw7CisJCXJldHVybiBidW5kbGUuZ2V0U3RyaW5nKGtleSk7CisJfQorCisJcHVibGljIGJvb2xlYW4gaGFzVmFsdWUoTG9jYWxlIGxvY2FsZSkgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlyZXR1cm4gZ2V0VmFsdWUobG9jYWxlKSAhPSBudWxsOworCX0KKworCS8qCisJICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I3RvU3RyaW5nKCkKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gIlJlc291cmNlQnVuZGxlS2V5IHsiICsga2V5ICsgIn0iOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9wZGUvbmxzL2ludGVybmFsL3VpL21vZGVsL1Jlc291cmNlQnVuZGxlS2V5TGlzdC5qYXZhIGIvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9wZGUvbmxzL2ludGVybmFsL3VpL21vZGVsL1Jlc291cmNlQnVuZGxlS2V5TGlzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2ODM2MzgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL3BkZS9ubHMvaW50ZXJuYWwvdWkvbW9kZWwvUmVzb3VyY2VCdW5kbGVLZXlMaXN0LmphdmEKQEAgLTAsMCArMSwyOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBTdGVmYW4gTfxja2UgYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIFN0ZWZhbiBN/GNrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnBkZS5ubHMuaW50ZXJuYWwudWkubW9kZWw7CisKK3B1YmxpYyBjbGFzcyBSZXNvdXJjZUJ1bmRsZUtleUxpc3QgeworCisJcHJpdmF0ZSBmaW5hbCBSZXNvdXJjZUJ1bmRsZUtleVtdIGtleXM7CisKKwlwdWJsaWMgUmVzb3VyY2VCdW5kbGVLZXlMaXN0KFJlc291cmNlQnVuZGxlS2V5W10ga2V5cykgeworCQl0aGlzLmtleXMgPSBrZXlzOworCX0KKworCXB1YmxpYyBSZXNvdXJjZUJ1bmRsZUtleSBnZXRLZXkoaW50IGluZGV4KSB7CisJCXJldHVybiBrZXlzW2luZGV4XTsKKwl9CisKKwlwdWJsaWMgaW50IGdldFNpemUoKSB7CisJCXJldHVybiBrZXlzLmxlbmd0aDsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvcGRlL25scy9pbnRlcm5hbC91aS9tb2RlbC9SZXNvdXJjZUJ1bmRsZU1vZGVsLmphdmEgYi9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL3BkZS9ubHMvaW50ZXJuYWwvdWkvbW9kZWwvUmVzb3VyY2VCdW5kbGVNb2RlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwMGNlNmEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL3BkZS9ubHMvaW50ZXJuYWwvdWkvbW9kZWwvUmVzb3VyY2VCdW5kbGVNb2RlbC5qYXZhCkBAIC0wLDAgKzEsNTIwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IFN0ZWZhbiBN/GNrZSBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgU3RlZmFuIE38Y2tlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UucGRlLm5scy5pbnRlcm5hbC51aS5tb2RlbDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci5wbHVnaW4uTWVzc2FnZXNFZGl0b3JQbHVnaW47CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OworaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXJFbnRyeVJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5wZGUuY29yZS5wbHVnaW4uSUZyYWdtZW50TW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UucGRlLmNvcmUucGx1Z2luLklQbHVnaW5Nb2RlbEJhc2U7CitpbXBvcnQgb3JnLmVjbGlwc2UucGRlLmNvcmUucGx1Z2luLlBsdWdpblJlZ2lzdHJ5OworCisvKioKKyAqIEEgPGNvZGU+UmVzb3VyY2VCdW5kbGVNb2RlbDwvY29kZT4gaXMgdGhlIGhvc3QgZm9yIGFsbCB7QGxpbmsgUmVzb3VyY2VCdW5kbGVGYW1pbHl9IGVsZW1lbnRzLiAKKyAqLworcHVibGljIGNsYXNzIFJlc291cmNlQnVuZGxlTW9kZWwgZXh0ZW5kcyBSZXNvdXJjZUJ1bmRsZUVsZW1lbnQgeworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRJRVNfU1VGRklYID0gIi5wcm9wZXJ0aWVzIjsgLy8kTk9OLU5MUy0xJAorCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFfTkFUVVJFID0gIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmUiOyAvLyROT04tTkxTLTEkCisKKwlwcml2YXRlIEFycmF5TGlzdDxSZXNvdXJjZUJ1bmRsZUZhbWlseT4gYnVuZGxlRmFtaWxpZXMgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlQnVuZGxlRmFtaWx5PigpOworCisJLyoqCisJICogVGhlIGxvY2FsZXMgZm9yIHdoaWNoIGFsbCBidW5kbGVzIGhhdmUgYmVlbiBsb2FkZWQuCisJICovCisJLy8gVE9ETyBQZXJoYXBzIHdlIHNob3VsZCBhZGQgcmVmZXJlbmNlIGNvdW50aW5nIHRvIHByZXZlbnQgdW5leHBlY3RlZCB1bmxvYWRpbmcgb2YgYnVuZGxlcyAKKwlwcml2YXRlIEhhc2hTZXQ8TG9jYWxlPiBsb2FkZWRMb2NhbGVzID0gbmV3IEhhc2hTZXQ8TG9jYWxlPigpOworCisJcHVibGljIFJlc291cmNlQnVuZGxlTW9kZWwoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CisJCXN1cGVyKG51bGwpOworCQl0cnkgeworCQkJcG9wdWxhdGVGcm9tV29ya3NwYWNlKG1vbml0b3IpOworCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKKwkJCU1lc3NhZ2VzRWRpdG9yUGx1Z2luLmxvZyhlKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFJldHVybnMgYWxsIHJlc291cmNlIGJ1bmRsZSBmYW1pbGllcyBjb250YWluZWQgaW4gdGhpcyBtb2RlbC4KKwkgKiAKKwkgKiBAcmV0dXJuIGFsbCByZXNvdXJjZSBidW5kbGUgZmFtaWxpZXMgY29udGFpbmVkIGluIHRoaXMgbW9kZWwKKwkgKi8KKwlwdWJsaWMgUmVzb3VyY2VCdW5kbGVGYW1pbHlbXSBnZXRGYW1pbGllcygpIHsKKwkJcmV0dXJuIGJ1bmRsZUZhbWlsaWVzLnRvQXJyYXkobmV3IFJlc291cmNlQnVuZGxlRmFtaWx5W2J1bmRsZUZhbWlsaWVzLnNpemUoKV0pOworCX0KKworCXB1YmxpYyBSZXNvdXJjZUJ1bmRsZUZhbWlseVtdIGdldEZhbWlsaWVzRm9yUGx1Z2luSWQoU3RyaW5nIHBsdWdpbklkKSB7CisJCUFycmF5TGlzdDxSZXNvdXJjZUJ1bmRsZUZhbWlseT4gZm91bmQgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlQnVuZGxlRmFtaWx5PigpOworCQlmb3IgKFJlc291cmNlQnVuZGxlRmFtaWx5IGZhbWlseSA6IGJ1bmRsZUZhbWlsaWVzKSB7CisJCQlpZiAoZmFtaWx5LmdldFBsdWdpbklkKCkuZXF1YWxzKHBsdWdpbklkKSkgeworCQkJCWZvdW5kLmFkZChmYW1pbHkpOworCQkJfQorCQl9CisJCXJldHVybiBmb3VuZC50b0FycmF5KG5ldyBSZXNvdXJjZUJ1bmRsZUZhbWlseVtmb3VuZC5zaXplKCldKTsKKwl9CisKKwlwdWJsaWMgUmVzb3VyY2VCdW5kbGVGYW1pbHlbXSBnZXRGYW1pbGllc0ZvclByb2plY3ROYW1lKFN0cmluZyBwcm9qZWN0TmFtZSkgeworCQlBcnJheUxpc3Q8UmVzb3VyY2VCdW5kbGVGYW1pbHk+IGZvdW5kID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZUJ1bmRsZUZhbWlseT4oKTsKKwkJZm9yIChSZXNvdXJjZUJ1bmRsZUZhbWlseSBmYW1pbHkgOiBidW5kbGVGYW1pbGllcykgeworCQkJaWYgKGZhbWlseS5nZXRQcm9qZWN0TmFtZSgpLmVxdWFscyhwcm9qZWN0TmFtZSkpIHsKKwkJCQlmb3VuZC5hZGQoZmFtaWx5KTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gZm91bmQudG9BcnJheShuZXcgUmVzb3VyY2VCdW5kbGVGYW1pbHlbZm91bmQuc2l6ZSgpXSk7CisJfQorCisJcHVibGljIFJlc291cmNlQnVuZGxlRmFtaWx5W10gZ2V0RmFtaWxpZXNGb3JQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHsKKwkJcmV0dXJuIGdldEZhbWlsaWVzRm9yUHJvamVjdE5hbWUocHJvamVjdC5nZXROYW1lKCkpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgYW4gYXJyYXkgb2YgYWxsIGN1cnJlbnRseSBrbm93biBidW5kbGUga2V5cy4gVGhpcyBhbHdheXMgaW5jbHVkZXMKKwkgKiB0aGUga2V5cyBmcm9tIHRoZSBkZWZhdWx0IGJ1bmRsZXMgYW5kIG1heSBpbmNsdWRlIHNvbWUgYWRkaXRpb25hbCBrZXlzCisJICogZnJvbSBidW5kbGVzIHRoYXQgaGF2ZSBiZWVuIGxvYWRlZCBzb21ldGltZSBhbmQgdGhhdCBjb250YWluIGtleXMgbm90IGZvdW5kIGluCisJICogYSBidW5kbGUncyBkZWZhdWx0IGJ1bmRsZS4gV2hlbiBhIGJ1bmRsZSBpcyB1bmxvYWRlZCwgdGhlc2UgYWRkaXRpb25hbCBrZXlzCisJICogd2lsbCBub3QgYmUgcmVtb3ZlZCBmcm9tIHRoZSBtb2RlbC4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBhcnJheSBvZiBidW5kbGVzIGtleXMKKwkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gCisJICovCisJcHVibGljIFJlc291cmNlQnVuZGxlS2V5W10gZ2V0QWxsS2V5cygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJTG9jYWxlIHJvb3QgPSBuZXcgTG9jYWxlKCIiLCAiIiwgIiIpOworCQkKKwkJLy8gRW5zdXJlIGRlZmF1bHQgYnVuZGxlIGlzIGxvYWRlZCBhbmQgY291bnQga2V5cyAgCisJCWludCBzaXplID0gMDsKKwkJZm9yIChSZXNvdXJjZUJ1bmRsZUZhbWlseSBmYW1pbHkgOiBidW5kbGVGYW1pbGllcykgeworCQkJUmVzb3VyY2VCdW5kbGUgYnVuZGxlID0gZmFtaWx5LmdldEJ1bmRsZShyb290KTsKKwkJCWlmIChidW5kbGUgIT0gbnVsbCkKKwkJCQlidW5kbGUubG9hZCgpOworCQkJc2l6ZSArPSBmYW1pbHkuZ2V0S2V5Q291bnQoKTsKKwkJfQorCisJCUFycmF5TGlzdDxSZXNvdXJjZUJ1bmRsZUtleT4gYWxsS2V5cyA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2VCdW5kbGVLZXk+KHNpemUpOworCQlmb3IgKFJlc291cmNlQnVuZGxlRmFtaWx5IGZhbWlseSA6IGJ1bmRsZUZhbWlsaWVzKSB7CisJCQlSZXNvdXJjZUJ1bmRsZUtleVtdIGtleXMgPSBmYW1pbHkuZ2V0S2V5cygpOworCQkJZm9yIChSZXNvdXJjZUJ1bmRsZUtleSBrZXkgOiBrZXlzKSB7CisJCQkJYWxsS2V5cy5hZGQoa2V5KTsKKwkJCX0KKwkJfQorCisJCXJldHVybiBhbGxLZXlzLnRvQXJyYXkobmV3IFJlc291cmNlQnVuZGxlS2V5W2FsbEtleXMuc2l6ZSgpXSk7CisJfQorCisJLyoqCisJICogTG9hZHMgYWxsIHRoZSBidW5kbGVzIGZvciB0aGUgZ2l2ZW4gbG9jYWxlIGludG8gbWVtb3J5LgorCSAqIAorCSAqIEBwYXJhbSBsb2NhbGUgdGhlIGxvY2FsZSBvZiB0aGUgYnVuZGxlcyB0byBsb2FkCisJICogQHRocm93cyBDb3JlRXhjZXB0aW9uIAorCSAqLworCXB1YmxpYyB2b2lkIGxvYWRCdW5kbGVzKExvY2FsZSBsb2NhbGUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJUmVzb3VyY2VCdW5kbGVGYW1pbHlbXSBmYW1pbGllcyA9IGdldEZhbWlsaWVzKCk7CisJCWZvciAoUmVzb3VyY2VCdW5kbGVGYW1pbHkgZmFtaWx5IDogZmFtaWxpZXMpIHsKKwkJCVJlc291cmNlQnVuZGxlIGJ1bmRsZSA9IGZhbWlseS5nZXRCdW5kbGUobG9jYWxlKTsKKwkJCWlmIChidW5kbGUgIT0gbnVsbCkKKwkJCQlidW5kbGUubG9hZCgpOworCQl9CisJCWxvYWRlZExvY2FsZXMuYWRkKGxvY2FsZSk7CisJfQorCisJLyoqCisJICogVW5sb2FkcyBhbGwgdGhlIGJ1bmRsZXMgZm9yIHRoZSBnaXZlbiBsb2NhbGUgZnJvbSB0aGlzIG1vZGVsLiBUaGUgZGVmYXVsdAorCSAqIGJ1bmRsZSBjYW5ub3QgYmUgdW5sb2FkZWQuIFN1Y2ggYSByZXF1ZXN0IHdpbGwgYmUgaWdub3JlZC4KKwkgKiAKKwkgKiBAcGFyYW0gbG9jYWxlIHRoZSBsb2NhbGUgb2YgdGhlIGJ1bmRsZXMgdG8gdW5sb2FkCisJICovCisJcHVibGljIHZvaWQgdW5sb2FkQnVuZGxlcyhMb2NhbGUgbG9jYWxlKSB7CisJCWlmICgiIi5lcXVhbHMobG9jYWxlLmdldExhbmd1YWdlKCkpKQorCQkJcmV0dXJuOyAvLyBuZXZlciB1bmxvYWQgdGhlIGRlZmF1bHQgYnVuZGxlcworCisJCVJlc291cmNlQnVuZGxlRmFtaWx5W10gZmFtaWxpZXMgPSBnZXRGYW1pbGllcygpOworCQlmb3IgKFJlc291cmNlQnVuZGxlRmFtaWx5IGZhbWlseSA6IGZhbWlsaWVzKSB7CisJCQlSZXNvdXJjZUJ1bmRsZSBidW5kbGUgPSBmYW1pbHkuZ2V0QnVuZGxlKGxvY2FsZSk7CisJCQlpZiAoYnVuZGxlICE9IG51bGwpCisJCQkJYnVuZGxlLnVubG9hZCgpOworCQl9CisJCWxvYWRlZExvY2FsZXMucmVtb3ZlKGxvY2FsZSk7CisJfQorCisJcHJpdmF0ZSB2b2lkIHBvcHVsYXRlRnJvbVdvcmtzcGFjZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7CisJCUlXb3Jrc3BhY2VSb290IHJvb3QgPSB3b3Jrc3BhY2UuZ2V0Um9vdCgpOworCQlJUHJvamVjdFtdIHByb2plY3RzID0gcm9vdC5nZXRQcm9qZWN0cygpOworCQlmb3IgKElQcm9qZWN0IHByb2plY3QgOiBwcm9qZWN0cykgeworCQkJdHJ5IHsKKwkJCQlpZiAoIXByb2plY3QuaXNPcGVuKCkpCisJCQkJCWNvbnRpbnVlOworCisJCQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gKElKYXZhUHJvamVjdCkgcHJvamVjdC5nZXROYXR1cmUoSkFWQV9OQVRVUkUpOworCisJCQkJLy8gUGx1Z2luIGFuZCBmcmFnbWVudCBwcm9qZWN0cworCQkJCUlQbHVnaW5Nb2RlbEJhc2UgcGx1Z2luTW9kZWwgPSBQbHVnaW5SZWdpc3RyeS5maW5kTW9kZWwocHJvamVjdCk7CisJCQkJU3RyaW5nIHBsdWdpbklkID0gbnVsbDsKKwkJCQlpZiAocGx1Z2luTW9kZWwgIT0gbnVsbCkgeworCQkJCQkvLyBHZXQgcGx1Z2luIGlkCisJCQkJCXBsdWdpbklkID0gcGx1Z2luTW9kZWwuZ2V0QnVuZGxlRGVzY3JpcHRpb24oKS5nZXROYW1lKCk7IC8vIE9TR2kgYnVuZGxlIG5hbWUKKwkJCQkJaWYgKHBsdWdpbklkID09IG51bGwpIHsKKwkJCQkJCXBsdWdpbklkID0gcGx1Z2luTW9kZWwuZ2V0UGx1Z2luQmFzZSgpLmdldElkKCk7IC8vIG5vbi1PU0dpIHBsdWctaW4gaWQKKwkJCQkJfQorCQkJCQlib29sZWFuIGlzRnJhZ21lbnQgPSBwbHVnaW5Nb2RlbCBpbnN0YW5jZW9mIElGcmFnbWVudE1vZGVsOworCQkJCQlpZiAoaXNGcmFnbWVudCkgeworCQkJCQkJSUZyYWdtZW50TW9kZWwgZnJhZ21lbnRNb2RlbCA9IChJRnJhZ21lbnRNb2RlbCkgcGx1Z2luTW9kZWw7CisJCQkJCQlwbHVnaW5JZCA9IGZyYWdtZW50TW9kZWwuZ2V0RnJhZ21lbnQoKS5nZXRQbHVnaW5JZCgpOworCQkJCQl9CisKKwkJCQkJLy8gTG9vayBmb3IgYWRkaXRpb25hbCAnbmwnIHJlc291cmNlcworCQkJCQlJRm9sZGVyIG5sID0gcHJvamVjdC5nZXRGb2xkZXIoIm5sIik7IC8vJE5PTi1OTFMtMSQKKwkJCQkJaWYgKGlzRnJhZ21lbnQgJiYgbmwuZXhpc3RzKCkpIHsKKwkJCQkJCUlSZXNvdXJjZVtdIG1lbWJlcnMgPSBubC5tZW1iZXJzKCk7CisJCQkJCQlmb3IgKElSZXNvdXJjZSBtZW1iZXIgOiBtZW1iZXJzKSB7CisJCQkJCQkJaWYgKG1lbWJlciBpbnN0YW5jZW9mIElGb2xkZXIpIHsKKwkJCQkJCQkJSUZvbGRlciBsYW5nRm9sZGVyID0gKElGb2xkZXIpIG1lbWJlcjsKKwkJCQkJCQkJU3RyaW5nIGxhbmd1YWdlID0gbGFuZ0ZvbGRlci5nZXROYW1lKCk7CisKKwkJCQkJCQkJLy8gQ29sbGVjdCBwcm9wZXJ0eSBmaWxlcworCQkJCQkJCQlJRmlsZVtdIHByb3BlcnR5RmlsZXMgPSBjb2xsZWN0UHJvcGVydHlGaWxlcyhsYW5nRm9sZGVyKTsKKwkJCQkJCQkJZm9yIChJRmlsZSBmaWxlIDogcHJvcGVydHlGaWxlcykgeworCQkJCQkJCQkJLy8gQ29tcHV0ZSBwYXRoIG5hbWUKKwkJCQkJCQkJCUlQYXRoIHBhdGggPSBmaWxlLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKTsKKwkJCQkJCQkJCVN0cmluZyBjb3VudHJ5ID0gIiI7IC8vJE5PTi1OTFMtMSQKKwkJCQkJCQkJCVN0cmluZyBwYWNrYWdlTmFtZSA9IG51bGw7CisJCQkJCQkJCQlpbnQgc2VnbWVudENvdW50ID0gcGF0aC5zZWdtZW50Q291bnQoKTsKKwkJCQkJCQkJCWlmIChzZWdtZW50Q291bnQgPiAxKSB7CisJCQkJCQkJCQkJU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKworCQkJCQkJCQkJCS8vIFNlZ21lbnQgMDogJ25sJworCQkJCQkJCQkJCS8vIFNlZ21lbnQgMTogbGFuZ3VhZ2UgY29kZQorCQkJCQkJCQkJCS8vIFNlZ21lbnQgMjogKGNvdW50cnkgY29kZSkKKwkJCQkJCQkJCQlpbnQgYmVnaW4gPSAyOworCQkJCQkJCQkJCWlmIChzZWdtZW50Q291bnQgPiAyICYmIGlzQ291bnRyeShwYXRoLnNlZ21lbnQoMikpKSB7CisJCQkJCQkJCQkJCWJlZ2luID0gMzsKKwkJCQkJCQkJCQkJY291bnRyeSA9IHBhdGguc2VnbWVudCgyKTsKKwkJCQkJCQkJCQl9CisKKwkJCQkJCQkJCQlmb3IgKGludCBpID0gYmVnaW47IGkgPCBzZWdtZW50Q291bnQgLSAxOyBpKyspIHsKKwkJCQkJCQkJCQkJaWYgKGkgPiBiZWdpbikKKwkJCQkJCQkJCQkJCWJ1aWxkZXIuYXBwZW5kKCcuJyk7CisJCQkJCQkJCQkJCWJ1aWxkZXIuYXBwZW5kKHBhdGguc2VnbWVudChpKSk7CisJCQkJCQkJCQkJfQorCQkJCQkJCQkJCXBhY2thZ2VOYW1lID0gYnVpbGRlci50b1N0cmluZygpOworCQkJCQkJCQkJfQorCisJCQkJCQkJCQlTdHJpbmcgYmFzZU5hbWUgPSBnZXRCYXNlTmFtZShmaWxlLmdldE5hbWUoKSk7CisKKwkJCQkJCQkJCVJlc291cmNlQnVuZGxlRmFtaWx5IGZhbWlseSA9IGdldE9yQ3JlYXRlRmFtaWx5KAorCQkJCQkJCQkJCQlwcm9qZWN0LmdldE5hbWUoKSwKKwkJCQkJCQkJCQkJcGx1Z2luSWQsCisJCQkJCQkJCQkJCXBhY2thZ2VOYW1lLAorCQkJCQkJCQkJCQliYXNlTmFtZSk7CisJCQkJCQkJCQlhZGRCdW5kbGUoZmFtaWx5LCBnZXRMb2NhbGUobGFuZ3VhZ2UsIGNvdW50cnkpLCBmaWxlKTsKKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCisJCQkJCS8vIENvbGxlY3QgcHJvcGVydHkgZmlsZXMKKwkJCQkJaWYgKGlzRnJhZ21lbnQgfHwgamF2YVByb2plY3QgPT0gbnVsbCkgeworCQkJCQkJSUZpbGVbXSBwcm9wZXJ0eUZpbGVzID0gY29sbGVjdFByb3BlcnR5RmlsZXMocHJvamVjdCk7CisJCQkJCQlmb3IgKElGaWxlIGZpbGUgOiBwcm9wZXJ0eUZpbGVzKSB7CisJCQkJCQkJSVBhdGggcGF0aCA9IGZpbGUuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpOworCQkJCQkJCWludCBzZWdtZW50Q291bnQgPSBwYXRoLnNlZ21lbnRDb3VudCgpOworCisJCQkJCQkJaWYgKHNlZ21lbnRDb3VudCA+IDAgJiYgcGF0aC5zZWdtZW50KDApLmVxdWFscygibmwiKSkgLy8kTk9OLU5MUy0xJAorCQkJCQkJCQljb250aW51ZTsgLy8gJ25sJyByZXNvdXJjZSBoYXZlIGJlZW4gcHJvY2Vzc2VkIGFib3ZlCisKKwkJCQkJCQkvLyBHdWVzcyBwYWNrYWdlIG5hbWUKKwkJCQkJCQlTdHJpbmcgcGFja2FnZU5hbWUgPSBudWxsOworCQkJCQkJCWlmIChzZWdtZW50Q291bnQgPiAxKSB7CisJCQkJCQkJCVN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisJCQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2VnbWVudENvdW50IC0gMTsgaSsrKSB7CisJCQkJCQkJCQlpZiAoaSA+IDApCisJCQkJCQkJCQkJYnVpbGRlci5hcHBlbmQoJy4nKTsKKwkJCQkJCQkJCWJ1aWxkZXIuYXBwZW5kKHBhdGguc2VnbWVudChpKSk7CisJCQkJCQkJCX0KKwkJCQkJCQkJcGFja2FnZU5hbWUgPSBidWlsZGVyLnRvU3RyaW5nKCk7CisJCQkJCQkJfQorCisJCQkJCQkJU3RyaW5nIGJhc2VOYW1lID0gZ2V0QmFzZU5hbWUoZmlsZS5nZXROYW1lKCkpOworCQkJCQkJCVN0cmluZyBsYW5ndWFnZSA9IGdldExhbmd1YWdlKGZpbGUuZ2V0TmFtZSgpKTsKKwkJCQkJCQlTdHJpbmcgY291bnRyeSA9IGdldENvdW50cnkoZmlsZS5nZXROYW1lKCkpOworCisJCQkJCQkJUmVzb3VyY2VCdW5kbGVGYW1pbHkgZmFtaWx5ID0gZ2V0T3JDcmVhdGVGYW1pbHkoCisJCQkJCQkJCQlwcm9qZWN0LmdldE5hbWUoKSwKKwkJCQkJCQkJCXBsdWdpbklkLAorCQkJCQkJCQkJcGFja2FnZU5hbWUsCisJCQkJCQkJCQliYXNlTmFtZSk7CisJCQkJCQkJYWRkQnVuZGxlKGZhbWlseSwgZ2V0TG9jYWxlKGxhbmd1YWdlLCBjb3VudHJ5KSwgZmlsZSk7CisJCQkJCQl9CisJCQkJCX0KKworCQkJCX0KKworCQkJCS8vIExvb2sgZm9yIHJlc291cmNlIGJ1bmRsZXMgaW4gSmF2YSBwYWNrYWdlcyAob3V0cHV0IGZvbGRlcnMsIGUuZy4gJ2JpbicsIHdpbGwgYmUgaWdub3JlZCkKKwkJCQlpZiAoamF2YVByb2plY3QgIT0gbnVsbCkgeworCQkJCQlJQ2xhc3NwYXRoRW50cnlbXSBjbGFzc3BhdGhFbnRyaWVzID0gamF2YVByb2plY3QuZ2V0UmVzb2x2ZWRDbGFzc3BhdGgodHJ1ZSk7CisJCQkJCWZvciAoSUNsYXNzcGF0aEVudHJ5IGVudHJ5IDogY2xhc3NwYXRoRW50cmllcykgeworCQkJCQkJaWYgKGVudHJ5LmdldEVudHJ5S2luZCgpID09IElDbGFzc3BhdGhFbnRyeS5DUEVfU09VUkNFKSB7CisJCQkJCQkJSVBhdGggcGF0aCA9IGVudHJ5LmdldFBhdGgoKTsKKwkJCQkJCQlJRm9sZGVyIGZvbGRlciA9IHdvcmtzcGFjZS5nZXRSb290KCkuZ2V0Rm9sZGVyKHBhdGgpOworCQkJCQkJCUlGaWxlW10gcHJvcGVydHlGaWxlcyA9IGNvbGxlY3RQcm9wZXJ0eUZpbGVzKGZvbGRlcik7CisKKwkJCQkJCQlmb3IgKElGaWxlIGZpbGUgOiBwcm9wZXJ0eUZpbGVzKSB7CisJCQkJCQkJCVN0cmluZyBuYW1lID0gZmlsZS5nZXROYW1lKCk7CisJCQkJCQkJCVN0cmluZyBiYXNlTmFtZSA9IGdldEJhc2VOYW1lKG5hbWUpOworCQkJCQkJCQlTdHJpbmcgbGFuZ3VhZ2UgPSBnZXRMYW5ndWFnZShuYW1lKTsKKwkJCQkJCQkJU3RyaW5nIGNvdW50cnkgPSBnZXRDb3VudHJ5KG5hbWUpOworCQkJCQkJCQlJUGFja2FnZUZyYWdtZW50IHBmID0gamF2YVByb2plY3QuZmluZFBhY2thZ2VGcmFnbWVudChmaWxlLmdldFBhcmVudCgpCisJCQkJCQkJCQkJLmdldEZ1bGxQYXRoKCkpOworCQkJCQkJCQlTdHJpbmcgcGFja2FnZU5hbWUgPSBwZi5nZXRFbGVtZW50TmFtZSgpOworCisJCQkJCQkJCVJlc291cmNlQnVuZGxlRmFtaWx5IGZhbWlseSA9IGdldE9yQ3JlYXRlRmFtaWx5KAorCQkJCQkJCQkJCXByb2plY3QuZ2V0TmFtZSgpLAorCQkJCQkJCQkJCXBsdWdpbklkLAorCQkJCQkJCQkJCXBhY2thZ2VOYW1lLAorCQkJCQkJCQkJCWJhc2VOYW1lKTsKKworCQkJCQkJCQlhZGRCdW5kbGUoZmFtaWx5LCBnZXRMb2NhbGUobGFuZ3VhZ2UsIGNvdW50cnkpLCBmaWxlKTsKKwkJCQkJCQl9CisJCQkJCQl9IGVsc2UgaWYgKGVudHJ5LmdldEVudHJ5S2luZCgpID09IElDbGFzc3BhdGhFbnRyeS5DUEVfTElCUkFSWSkgeworCQkJCQkJCUlQYWNrYWdlRnJhZ21lbnRSb290W10gZmluZFBhY2thZ2VGcmFnbWVudFJvb3RzID0gamF2YVByb2plY3QuZmluZFBhY2thZ2VGcmFnbWVudFJvb3RzKGVudHJ5KTsKKwkJCQkJCQlmb3IgKElQYWNrYWdlRnJhZ21lbnRSb290IHBhY2thZ2VGcmFnbWVudFJvb3QgOiBmaW5kUGFja2FnZUZyYWdtZW50Um9vdHMpIHsKKwkJCQkJCQkJSUphdmFFbGVtZW50W10gY2hpbGRyZW4gPSBwYWNrYWdlRnJhZ21lbnRSb290LmdldENoaWxkcmVuKCk7CisJCQkJCQkJCWZvciAoSUphdmFFbGVtZW50IGNoaWxkIDogY2hpbGRyZW4pIHsKKwkJCQkJCQkJCUlQYWNrYWdlRnJhZ21lbnQgcGYgPSAoSVBhY2thZ2VGcmFnbWVudCkgY2hpbGQ7CisJCQkJCQkJCQlPYmplY3RbXSBub25KYXZhUmVzb3VyY2VzID0gcGYuZ2V0Tm9uSmF2YVJlc291cmNlcygpOworCisJCQkJCQkJCQlmb3IgKE9iamVjdCByZXNvdXJjZSA6IG5vbkphdmFSZXNvdXJjZXMpIHsKKwkJCQkJCQkJCQlpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJSmFyRW50cnlSZXNvdXJjZSkgeworCQkJCQkJCQkJCQlJSmFyRW50cnlSZXNvdXJjZSBqYXJFbnRyeVJlc291cmNlID0gKElKYXJFbnRyeVJlc291cmNlKSByZXNvdXJjZTsKKwkJCQkJCQkJCQkJU3RyaW5nIG5hbWUgPSBqYXJFbnRyeVJlc291cmNlLmdldE5hbWUoKTsKKwkJCQkJCQkJCQkJaWYgKG5hbWUuZW5kc1dpdGgoUFJPUEVSVElFU19TVUZGSVgpKSB7CisJCQkJCQkJCQkJCQlTdHJpbmcgYmFzZU5hbWUgPSBnZXRCYXNlTmFtZShuYW1lKTsKKwkJCQkJCQkJCQkJCVN0cmluZyBsYW5ndWFnZSA9IGdldExhbmd1YWdlKG5hbWUpOworCQkJCQkJCQkJCQkJU3RyaW5nIGNvdW50cnkgPSBnZXRDb3VudHJ5KG5hbWUpOworCQkJCQkJCQkJCQkJU3RyaW5nIHBhY2thZ2VOYW1lID0gcGYuZ2V0RWxlbWVudE5hbWUoKTsKKworCQkJCQkJCQkJCQkJUmVzb3VyY2VCdW5kbGVGYW1pbHkgZmFtaWx5ID0gZ2V0T3JDcmVhdGVGYW1pbHkoCisJCQkJCQkJCQkJCQkJCXByb2plY3QuZ2V0TmFtZSgpLAorCQkJCQkJCQkJCQkJCQlwbHVnaW5JZCwKKwkJCQkJCQkJCQkJCQkJcGFja2FnZU5hbWUsCisJCQkJCQkJCQkJCQkJCWJhc2VOYW1lKTsKKworCQkJCQkJCQkJCQkJYWRkQnVuZGxlKAorCQkJCQkJCQkJCQkJCQlmYW1pbHksCisJCQkJCQkJCQkJCQkJCWdldExvY2FsZShsYW5ndWFnZSwgY291bnRyeSksCisJCQkJCQkJCQkJCQkJCWphckVudHJ5UmVzb3VyY2UpOworCQkJCQkJCQkJCQl9CisJCQkJCQkJCQkJfQorCQkJCQkJCQkJfQorCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisKKwkJCQkJLy8gQ29sbGVjdCBub24tSmF2YSByZXNvdXJjZXMgCisJCQkJCU9iamVjdFtdIG5vbkphdmFSZXNvdXJjZXMgPSBqYXZhUHJvamVjdC5nZXROb25KYXZhUmVzb3VyY2VzKCk7CisJCQkJCUFycmF5TGlzdDxJRmlsZT4gZmlsZXMgPSBuZXcgQXJyYXlMaXN0PElGaWxlPigpOworCQkJCQlmb3IgKE9iamVjdCByZXNvdXJjZSA6IG5vbkphdmFSZXNvdXJjZXMpIHsKKwkJCQkJCWlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElDb250YWluZXIpIHsKKwkJCQkJCQlJQ29udGFpbmVyIGNvbnRhaW5lciA9IChJQ29udGFpbmVyKSByZXNvdXJjZTsKKwkJCQkJCQljb2xsZWN0UHJvcGVydHlGaWxlcyhjb250YWluZXIsIGZpbGVzKTsKKwkJCQkJCX0gZWxzZSBpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJRmlsZSkgeworCQkJCQkJCUlGaWxlIGZpbGUgPSAoSUZpbGUpIHJlc291cmNlOworCQkJCQkJCVN0cmluZyBuYW1lID0gZmlsZS5nZXROYW1lKCk7CisJCQkJCQkJaWYgKGlzSWdub3JlZEZpbGVuYW1lKG5hbWUpKQorCQkJCQkJCQljb250aW51ZTsKKwkJCQkJCQlpZiAobmFtZS5lbmRzV2l0aChQUk9QRVJUSUVTX1NVRkZJWCkpIHsKKwkJCQkJCQkJZmlsZXMuYWRkKGZpbGUpOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlmb3IgKElGaWxlIGZpbGUgOiBmaWxlcykgeworCisJCQkJCQkvLyBDb252ZXJ0IHBhdGggdG8gcGFja2FnZSBuYW1lIGZvcm1hdAorCQkJCQkJSVBhdGggcGF0aCA9IGZpbGUuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpOworCQkJCQkJU3RyaW5nIHBhY2thZ2VOYW1lID0gbnVsbDsKKwkJCQkJCWludCBzZWdtZW50Q291bnQgPSBwYXRoLnNlZ21lbnRDb3VudCgpOworCQkJCQkJaWYgKHNlZ21lbnRDb3VudCA+IDEpIHsKKwkJCQkJCQlTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2VnbWVudENvdW50IC0gMTsgaSsrKSB7CisJCQkJCQkJCWlmIChpID4gMCkKKwkJCQkJCQkJCWJ1aWxkZXIuYXBwZW5kKCcuJyk7CisJCQkJCQkJCWJ1aWxkZXIuYXBwZW5kKHBhdGguc2VnbWVudChpKSk7CisJCQkJCQkJfQorCQkJCQkJCXBhY2thZ2VOYW1lID0gYnVpbGRlci50b1N0cmluZygpOworCQkJCQkJfQorCisJCQkJCQlTdHJpbmcgYmFzZU5hbWUgPSBnZXRCYXNlTmFtZShmaWxlLmdldE5hbWUoKSk7CisJCQkJCQlTdHJpbmcgbGFuZ3VhZ2UgPSBnZXRMYW5ndWFnZShmaWxlLmdldE5hbWUoKSk7CisJCQkJCQlTdHJpbmcgY291bnRyeSA9IGdldENvdW50cnkoZmlsZS5nZXROYW1lKCkpOworCisJCQkJCQlSZXNvdXJjZUJ1bmRsZUZhbWlseSBmYW1pbHkgPSBnZXRPckNyZWF0ZUZhbWlseSgKKwkJCQkJCQkJcHJvamVjdC5nZXROYW1lKCksCisJCQkJCQkJCXBsdWdpbklkLAorCQkJCQkJCQlwYWNrYWdlTmFtZSwKKwkJCQkJCQkJYmFzZU5hbWUpOworCQkJCQkJYWRkQnVuZGxlKGZhbWlseSwgZ2V0TG9jYWxlKGxhbmd1YWdlLCBjb3VudHJ5KSwgZmlsZSk7CisJCQkJCX0KKworCQkJCX0KKwkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkJTWVzc2FnZXNFZGl0b3JQbHVnaW4ubG9nKGUpOworCQkJfQorCQl9CisJfQorCisJcHJpdmF0ZSBJRmlsZVtdIGNvbGxlY3RQcm9wZXJ0eUZpbGVzKElDb250YWluZXIgY29udGFpbmVyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CisJCUFycmF5TGlzdDxJRmlsZT4gZmlsZXMgPSBuZXcgQXJyYXlMaXN0PElGaWxlPigpOworCQljb2xsZWN0UHJvcGVydHlGaWxlcyhjb250YWluZXIsIGZpbGVzKTsKKwkJcmV0dXJuIGZpbGVzLnRvQXJyYXkobmV3IElGaWxlW2ZpbGVzLnNpemUoKV0pOworCX0KKworCXByaXZhdGUgdm9pZCBjb2xsZWN0UHJvcGVydHlGaWxlcyhJQ29udGFpbmVyIGNvbnRhaW5lciwgQXJyYXlMaXN0PElGaWxlPiBmaWxlcykgdGhyb3dzIENvcmVFeGNlcHRpb24geworCQlJUmVzb3VyY2VbXSBtZW1iZXJzID0gY29udGFpbmVyLm1lbWJlcnMoKTsKKwkJZm9yIChJUmVzb3VyY2UgcmVzb3VyY2UgOiBtZW1iZXJzKSB7CisJCQlpZiAoIXJlc291cmNlLmV4aXN0cygpKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSUNvbnRhaW5lcikgeworCQkJCUlDb250YWluZXIgY2hpbGRDb250YWluZXIgPSAoSUNvbnRhaW5lcikgcmVzb3VyY2U7CisJCQkJY29sbGVjdFByb3BlcnR5RmlsZXMoY2hpbGRDb250YWluZXIsIGZpbGVzKTsKKwkJCX0gZWxzZSBpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJRmlsZSkgeworCQkJCUlGaWxlIGZpbGUgPSAoSUZpbGUpIHJlc291cmNlOworCQkJCVN0cmluZyBuYW1lID0gZmlsZS5nZXROYW1lKCk7CisJCQkJaWYgKGZpbGUuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpLnNlZ21lbnRDb3VudCgpID09IDAgJiYgaXNJZ25vcmVkRmlsZW5hbWUobmFtZSkpCisJCQkJCWNvbnRpbnVlOworCQkJCWlmIChuYW1lLmVuZHNXaXRoKFBST1BFUlRJRVNfU1VGRklYKSkgeworCQkJCQlmaWxlcy5hZGQoZmlsZSk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJcHJpdmF0ZSBib29sZWFuIGlzQ291bnRyeShTdHJpbmcgbmFtZSkgeworCQlpZiAobmFtZSA9PSBudWxsIHx8IG5hbWUubGVuZ3RoKCkgIT0gMikKKwkJCXJldHVybiBmYWxzZTsKKwkJY2hhciBjMSA9IG5hbWUuY2hhckF0KDApOworCQljaGFyIGMyID0gbmFtZS5jaGFyQXQoMSk7CisJCXJldHVybiAnQScgPD0gYzEgJiYgYzEgPD0gJ1onICYmICdBJyA8PSBjMiAmJiBjMiA8PSAnWic7CisJfQorCisJcHJpdmF0ZSBMb2NhbGUgZ2V0TG9jYWxlKFN0cmluZyBsYW5ndWFnZSwgU3RyaW5nIGNvdW50cnkpIHsKKwkJaWYgKGxhbmd1YWdlID09IG51bGwpCisJCQlsYW5ndWFnZSA9ICIiOyAvLyROT04tTkxTLTEkCisJCWlmIChjb3VudHJ5ID09IG51bGwpCisJCQljb3VudHJ5ID0gIiI7IC8vJE5PTi1OTFMtMSQKKwkJcmV0dXJuIG5ldyBMb2NhbGUobGFuZ3VhZ2UsIGNvdW50cnkpOworCX0KKworCXByaXZhdGUgdm9pZCBhZGRCdW5kbGUoUmVzb3VyY2VCdW5kbGVGYW1pbHkgZmFtaWx5LCBMb2NhbGUgbG9jYWxlLCBPYmplY3QgcmVzb3VyY2UpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKKwkJUmVzb3VyY2VCdW5kbGUgYnVuZGxlID0gbmV3IFJlc291cmNlQnVuZGxlKGZhbWlseSwgcmVzb3VyY2UsIGxvY2FsZSk7CisJCWlmICgiIi5lcXVhbHMobG9jYWxlLmdldExhbmd1YWdlKCkpKQorCQkJYnVuZGxlLmxvYWQoKTsKKwkJZmFtaWx5LmFkZEJ1bmRsZShidW5kbGUpOworCX0KKworCXByaXZhdGUgU3RyaW5nIGdldEJhc2VOYW1lKFN0cmluZyBmaWxlbmFtZSkgeworCQlpZiAoIWZpbGVuYW1lLmVuZHNXaXRoKFBST1BFUlRJRVNfU1VGRklYKSkKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKwkJU3RyaW5nIG5hbWUgPSBmaWxlbmFtZS5zdWJzdHJpbmcoMCwgZmlsZW5hbWUubGVuZ3RoKCkgLSAxMSk7CisJCWludCBsZW4gPSBuYW1lLmxlbmd0aCgpOworCQlpZiAobGVuID4gMyAmJiBuYW1lLmNoYXJBdChsZW4gLSAzKSA9PSAnXycpIHsKKwkJCWlmIChsZW4gPiA2ICYmIG5hbWUuY2hhckF0KGxlbiAtIDYpID09ICdfJykgeworCQkJCXJldHVybiBuYW1lLnN1YnN0cmluZygwLCBsZW4gLSA2KTsKKwkJCX0gZWxzZSB7CisJCQkJcmV0dXJuIG5hbWUuc3Vic3RyaW5nKDAsIGxlbiAtIDMpOworCQkJfQorCQl9CisJCXJldHVybiBuYW1lOworCX0KKworCXByaXZhdGUgU3RyaW5nIGdldExhbmd1YWdlKFN0cmluZyBmaWxlbmFtZSkgeworCQlpZiAoIWZpbGVuYW1lLmVuZHNXaXRoKFBST1BFUlRJRVNfU1VGRklYKSkKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKwkJU3RyaW5nIG5hbWUgPSBmaWxlbmFtZS5zdWJzdHJpbmcoMCwgZmlsZW5hbWUubGVuZ3RoKCkgLSAxMSk7CisJCWludCBsZW4gPSBuYW1lLmxlbmd0aCgpOworCQlpZiAobGVuID4gMyAmJiBuYW1lLmNoYXJBdChsZW4gLSAzKSA9PSAnXycpIHsKKwkJCWlmIChsZW4gPiA2ICYmIG5hbWUuY2hhckF0KGxlbiAtIDYpID09ICdfJykgeworCQkJCXJldHVybiBuYW1lLnN1YnN0cmluZyhsZW4gLSA1LCBsZW4gLSAzKTsKKwkJCX0gZWxzZSB7CisJCQkJcmV0dXJuIG5hbWUuc3Vic3RyaW5nKGxlbiAtIDIpOworCQkJfQorCQl9CisJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAorCX0KKworCXByaXZhdGUgU3RyaW5nIGdldENvdW50cnkoU3RyaW5nIGZpbGVuYW1lKSB7CisJCWlmICghZmlsZW5hbWUuZW5kc1dpdGgoUFJPUEVSVElFU19TVUZGSVgpKQorCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCQlTdHJpbmcgbmFtZSA9IGZpbGVuYW1lLnN1YnN0cmluZygwLCBmaWxlbmFtZS5sZW5ndGgoKSAtIDExKTsKKwkJaW50IGxlbiA9IG5hbWUubGVuZ3RoKCk7CisJCWlmIChsZW4gPiAzICYmIG5hbWUuY2hhckF0KGxlbiAtIDMpID09ICdfJykgeworCQkJaWYgKGxlbiA+IDYgJiYgbmFtZS5jaGFyQXQobGVuIC0gNikgPT0gJ18nKSB7CisJCQkJcmV0dXJuIG5hbWUuc3Vic3RyaW5nKGxlbiAtIDIpOworCQkJfSBlbHNlIHsKKwkJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJfQorCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwlwcml2YXRlIFJlc291cmNlQnVuZGxlRmFtaWx5IGdldE9yQ3JlYXRlRmFtaWx5KFN0cmluZyBwcm9qZWN0TmFtZSwgU3RyaW5nIHBsdWdpbklkLCBTdHJpbmcgcGFja2FnZU5hbWUsCisJCQlTdHJpbmcgYmFzZU5hbWUpIHsKKworCQkvLyBJZ25vcmUgcHJvamVjdCBuYW1lCisJCWlmIChwbHVnaW5JZCAhPSBudWxsKQorCQkJcHJvamVjdE5hbWUgPSBudWxsOworCisJCWZvciAoUmVzb3VyY2VCdW5kbGVGYW1pbHkgZmFtaWx5IDogYnVuZGxlRmFtaWxpZXMpIHsKKwkJCWlmIChhcmVFcXVhbChmYW1pbHkuZ2V0UHJvamVjdE5hbWUoKSwgcHJvamVjdE5hbWUpCisJCQkJCSYmIGFyZUVxdWFsKGZhbWlseS5nZXRQbHVnaW5JZCgpLCBwbHVnaW5JZCkKKwkJCQkJJiYgYXJlRXF1YWwoZmFtaWx5LmdldFBhY2thZ2VOYW1lKCksIHBhY2thZ2VOYW1lKQorCQkJCQkmJiBhcmVFcXVhbChmYW1pbHkuZ2V0QmFzZU5hbWUoKSwgYmFzZU5hbWUpKSB7CisJCQkJcmV0dXJuIGZhbWlseTsKKwkJCX0KKwkJfQorCQlSZXNvdXJjZUJ1bmRsZUZhbWlseSBmYW1pbHkgPSBuZXcgUmVzb3VyY2VCdW5kbGVGYW1pbHkoCisJCQl0aGlzLAorCQkJcHJvamVjdE5hbWUsCisJCQlwbHVnaW5JZCwKKwkJCXBhY2thZ2VOYW1lLAorCQkJYmFzZU5hbWUpOworCQlidW5kbGVGYW1pbGllcy5hZGQoZmFtaWx5KTsKKwkJcmV0dXJuIGZhbWlseTsKKwl9CisKKwlwcml2YXRlIGJvb2xlYW4gaXNJZ25vcmVkRmlsZW5hbWUoU3RyaW5nIGZpbGVuYW1lKSB7CisJCXJldHVybiBmaWxlbmFtZS5lcXVhbHMoImJ1aWxkLnByb3BlcnRpZXMiKSB8fCBmaWxlbmFtZS5lcXVhbHMoImxvZ2dpbmcucHJvcGVydGllcyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwl9CisKKwlwcml2YXRlIGJvb2xlYW4gYXJlRXF1YWwoU3RyaW5nIHN0cjEsIFN0cmluZyBzdHIyKSB7CisJCXJldHVybiBzdHIxID09IG51bGwgJiYgc3RyMiA9PSBudWxsIHx8IHN0cjEgIT0gbnVsbCAmJiBzdHIxLmVxdWFscyhzdHIyKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvcGRlL25scy9pbnRlcm5hbC91aS9wYXJzZXIvQ2hhckFycmF5U291cmNlLmphdmEgYi9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL3BkZS9ubHMvaW50ZXJuYWwvdWkvcGFyc2VyL0NoYXJBcnJheVNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxMTFiNjkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL3BkZS9ubHMvaW50ZXJuYWwvdWkvcGFyc2VyL0NoYXJBcnJheVNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsMjYyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA4IFN0ZWZhbiBN/GNrZSBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqCisgKiBDb250cmlidXRvcnM6CisgKiAgICAgU3RlZmFuIE38Y2tlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UucGRlLm5scy5pbnRlcm5hbC51aS5wYXJzZXI7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUmVhZGVyOworCisvKioKKyAqIEEgc2Nhbm5lciBzb3VyY2UgdGhhdCBpcyBiYWNrZWQgYnkgYSBjaGFyYWN0ZXIgYXJyYXkuCisgKi8KK3B1YmxpYyBjbGFzcyBDaGFyQXJyYXlTb3VyY2UgaW1wbGVtZW50cyBJU2Nhbm5lclNvdXJjZSB7CisKKwlwcml2YXRlIGNoYXJbXSBjYnVmOworCisJLyoqIFRoZSBlbmQgcG9zaXRpb24gb2YgdGhpcyBzb3VyY2UuICovCisJcHJpdmF0ZSBpbnQgZW5kOworCisJcHJpdmF0ZSBpbnRbXSBsaW5lRW5kcyA9IG5ldyBpbnRbMjA0OF07CisKKwkvKioKKwkgKiBUaGUgY3VycmVudCBwb3NpdGlvbiBhdCB3aGljaCB0aGUgbmV4dCBjaGFyYWN0ZXIgd2lsbCBiZSByZWFkLgorCSAqIFRoZSB2YWx1ZSA8Y29kZT5JbnRlZ2VyLk1BWF9WQUxVRTwvY29kZT4gaW5kaWNhdGVzLCB0aGF0IHRoZSBlbmQKKwkgKiBvZiB0aGUgc291cmNlIGhhcyBiZWVuIHJlYWNoZWQgKHRoZSBFT0YgY2hhcmFjdGVyIGhhcyBiZWVuIHJldHVybmVkKS4KKwkgKi8KKwlpbnQgY3VycmVudFBvc2l0aW9uID0gMDsKKworCS8qKiBUaGUgbnVtYmVyIG9mIHRoZSBjdXJyZW50IGxpbmUuIChMaW5lIG51bWJlcnMgYXJlIG9uZS1iYXNlZC4pICovCisJaW50IGN1cnJlbnRMaW5lTnVtYmVyID0gMTsKKworCXByb3RlY3RlZCBDaGFyQXJyYXlTb3VyY2UoKSB7CisJfQorCisJLyoqCisJICogQ29uc3RydWN0cyBhIHNjYW5uZXIgc291cmNlIGZyb20gYSBjaGFyIGFycmF5LgorCSAqLworCXB1YmxpYyBDaGFyQXJyYXlTb3VyY2UoY2hhcltdIGNidWYpIHsKKwkJdGhpcy5jYnVmID0gY2J1ZjsKKwkJdGhpcy5lbmQgPSBjYnVmLmxlbmd0aDsKKwl9CisKKwkvKioKKwkgKiBSZXNldHMgdGhpcyBzb3VyY2Ugb24gdGhlIGdpdmVuIGFycmF5LgorCSAqIAorCSAqIEBwYXJhbSBjYnVmIHRoZSBhcnJheSB0byByZWFkIGZyb20KKwkgKiBAcGFyYW0gYmVnaW4gd2hlcmUgdG8gYmVnaW4gcmVhZGluZworCSAqIEBwYXJhbSBlbmQgd2hlcmUgdG8gZW5kIHJlYWRpbmcKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCByZXNldChjaGFyW10gY2J1ZiwgaW50IGJlZ2luLCBpbnQgZW5kKSB7CisJCWlmIChjYnVmID09IG51bGwpIHsKKwkJCXRoaXMuY2J1ZiA9IG51bGw7CisJCQl0aGlzLmVuZCA9IC0xOworCQkJY3VycmVudFBvc2l0aW9uID0gLTE7CisJCQljdXJyZW50TGluZU51bWJlciA9IC0xOworCQkJbGluZUVuZHMgPSBudWxsOworCQl9IGVsc2UgeworCQkJdGhpcy5jYnVmID0gY2J1ZjsKKwkJCXRoaXMuZW5kID0gZW5kOworCQkJY3VycmVudFBvc2l0aW9uID0gYmVnaW47CisJCQljdXJyZW50TGluZU51bWJlciA9IDE7CisJCQlsaW5lRW5kcyA9IG5ldyBpbnRbMl07CisJCX0KKwl9CisKKwkvKgorCSAqIEBzZWUgc2Nhbm5lci5JU2Nhbm5lclNvdXJjZSNjaGFyQXQoaW50KQorCSAqLworCXB1YmxpYyBpbnQgY2hhckF0KGludCBpbmRleCkgeworCQlpZiAoaW5kZXggPCBlbmQpIHsKKwkJCXJldHVybiBjYnVmW2luZGV4XTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKworCS8qCisJICogQHNlZSBzY2FubmVyLklTY2FubmVyU291cmNlI2N1cnJlbnRDaGFyKCkKKwkgKi8KKwlwdWJsaWMgaW50IGxvb2thaGVhZCgpIHsKKwkJaWYgKGN1cnJlbnRQb3NpdGlvbiA8IGVuZCkgeworCQkJcmV0dXJuIGNidWZbY3VycmVudFBvc2l0aW9uXTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKworCS8qCisJICogQHNlZSBzY2FubmVyLklTY2FubmVyU291cmNlI2xvb2thaGVhZChpbnQpCisJICovCisJcHVibGljIGludCBsb29rYWhlYWQoaW50IG4pIHsKKwkJaW50IHBvcyA9IGN1cnJlbnRQb3NpdGlvbiArIG4gLSAxOworCQlpZiAocG9zIDwgZW5kKSB7CisJCQlyZXR1cm4gY2J1Zltwb3NdOworCQl9IGVsc2UgeworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCisJLyoKKwkgKiBAc2VlIGNvcmUuSVNjYW5uZXJTb3VyY2UjcmVhZENoYXIoKQorCSAqLworCXB1YmxpYyBpbnQgcmVhZENoYXIoKSB7CisJCWlmIChjdXJyZW50UG9zaXRpb24gPCBlbmQpIHsKKwkJCXJldHVybiBjYnVmW2N1cnJlbnRQb3NpdGlvbisrXTsKKwkJfSBlbHNlIHsKKwkJCWN1cnJlbnRQb3NpdGlvbisrOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCisJLyoKKwkgKiBAc2VlIGNvcmUuSVNjYW5uZXJTb3VyY2UjcmVhZENoYXIoaW50KQorCSAqLworCXB1YmxpYyBpbnQgcmVhZENoYXIoaW50IGV4cGVjdGVkKSB7CisJCWludCBjID0gcmVhZENoYXIoKTsKKwkJaWYgKGMgPT0gZXhwZWN0ZWQpIHsKKwkJCXJldHVybiBjOworCQl9IGVsc2UgeworCQkJU3RyaW5nIG1lc3NhZ2UgPSAiRXhwZWN0ZWQgY2hhciAnIgorCQkJCQkrIChjaGFyKSBleHBlY3RlZAorCQkJCQkrICInICgweCIKKwkJCQkJKyBoZXhEaWdpdCgoZXhwZWN0ZWQgPj4gNCkgJiAweGYpCisJCQkJCSsgaGV4RGlnaXQoZXhwZWN0ZWQgJiAweGYpCisJCQkJCSsgIikgYnV0IGdvdCAnIiArIChjaGFyKSBjICsgIicgKDB4IiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorCQkJCQkrIGhleERpZ2l0KChjID4+IDQpICYgMHhmKQorCQkJCQkrIGhleERpZ2l0KGMgJiAweGYpCisJCQkJCSsgIikiOyAvLyROT04tTkxTLTEkCisJCQl0aHJvdyBuZXcgTGV4aWNhbEVycm9yRXhjZXB0aW9uKHRoaXMsIG1lc3NhZ2UpOworCQl9CisJfQorCisJLyoKKwkgKiBAc2VlIHNjYW5uZXIuSVNjYW5uZXJTb3VyY2UjdW5yZWFkQ2hhcigpCisJICovCisJcHVibGljIHZvaWQgdW5yZWFkQ2hhcigpIHsKKwkJY3VycmVudFBvc2l0aW9uLS07CisJfQorCisJLyoKKwkgKiBAc2VlIGNvcmUuSVNjYW5uZXJTb3VyY2UjaGFzTW9yZUNoYXJzKCkKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBoYXNNb3JlQ2hhcnMoKSB7CisJCXJldHVybiBjdXJyZW50UG9zaXRpb24gPCBlbmQ7CisJfQorCisJLyoKKwkgKiBAc2VlIHNjYW5uZXIuSVNjYW5uZXJTb3VyY2UjZ2V0UG9zaXRpb24oKQorCSAqLworCXB1YmxpYyBpbnQgZ2V0UG9zaXRpb24oKSB7CisJCWlmIChjdXJyZW50UG9zaXRpb24gPCBlbmQpCisJCQlyZXR1cm4gY3VycmVudFBvc2l0aW9uOworCQllbHNlCisJCQlyZXR1cm4gZW5kOworCX0KKworCS8qCisJICogQHNlZSBjb3JlLklTY2FubmVyU291cmNlI2lzQXRMaW5lQmVnaW4oKQorCSAqLworCXB1YmxpYyBib29sZWFuIGlzQXRMaW5lQmVnaW4oKSB7CisJCXJldHVybiBjdXJyZW50UG9zaXRpb24gPT0gbGluZUVuZHNbY3VycmVudExpbmVOdW1iZXIgLSAxXTsKKwl9CisKKwkvKgorCSAqIEBzZWUgc2Nhbm5lci5JU2Nhbm5lclNvdXJjZSNnZXRDdXJyZW50TGluZU51bWJlcigpCisJICovCisJcHVibGljIGludCBnZXRDdXJyZW50TGluZU51bWJlcigpIHsKKwkJcmV0dXJuIGN1cnJlbnRMaW5lTnVtYmVyOworCX0KKworCS8qCisJICogQHNlZSBzY2FubmVyLklTY2FubmVyU291cmNlI2dldEN1cnJlbnRDb2x1bW5OdW1iZXIoKQorCSAqLworCXB1YmxpYyBpbnQgZ2V0Q3VycmVudENvbHVtbk51bWJlcigpIHsKKwkJcmV0dXJuIGN1cnJlbnRQb3NpdGlvbiAtIGxpbmVFbmRzW2N1cnJlbnRMaW5lTnVtYmVyIC0gMV0gKyAxOworCX0KKworCS8qCisJICogQHNlZSBzY2FubmVyLklTY2FubmVyU291cmNlI2dldExpbmVFbmRzKCkKKwkgKi8KKwlwdWJsaWMgaW50W10gZ2V0TGluZUVuZHMoKSB7CisJCXJldHVybiBsaW5lRW5kczsKKwl9CisJLyoKKwkgKiBAc2VlIHNjYW5uZXIuSVNjYW5uZXJTb3VyY2UjcHVzaExpbmVTZXBhcmF0b3IoKQorCSAqLworCXB1YmxpYyB2b2lkIHB1c2hMaW5lU2VwYXJhdG9yKCkgeworCQlpZiAoY3VycmVudExpbmVOdW1iZXIgPj0gbGluZUVuZHMubGVuZ3RoKSB7CisJCQlpbnRbXSBuZXdMaW5lRW5kcyA9IG5ldyBpbnRbbGluZUVuZHMubGVuZ3RoICogMl07CisJCQlTeXN0ZW0uYXJyYXljb3B5KGxpbmVFbmRzLCAwLCBuZXdMaW5lRW5kcywgMCwgbGluZUVuZHMubGVuZ3RoKTsKKwkJCWxpbmVFbmRzID0gbmV3TGluZUVuZHM7CisJCX0KKwkJbGluZUVuZHNbY3VycmVudExpbmVOdW1iZXIrK10gPSBjdXJyZW50UG9zaXRpb247CisJfQorCisJLyoKKwkgKiBAc2VlIHNjYW5uZXIuSVNjYW5uZXJTb3VyY2UjbGVuZ3RoKCkKKwkgKi8KKwlwdWJsaWMgaW50IGxlbmd0aCgpIHsKKwkJcmV0dXJuIGNidWYubGVuZ3RoOworCX0KKworCS8qKgorCSAqIFJldHVybnMgYSBzdHJpbmcgdGhhdCBjb250YWlucyB0aGUgY2hhcmFjdGVycyBvZiB0aGUgc291cmNlIHNwZWNpZmllZAorCSAqIGJ5IHRoZSByYW5nZSA8Y29kZT5iZWdpbkluZGV4PC9jb2RlPiBhbmQgdGhlIGN1cnJlbnQgcG9zaXRpb24gYXMgdGhlCisJICogZW5kIGluZGV4LgorCSAqIAorCSAqIEBwYXJhbSBiZWdpbkluZGV4CisJICogQHJldHVybiB0aGUgU3RyaW5nCisJICovCisJcHVibGljIFN0cmluZyB0b1N0cmluZyhpbnQgYmVnaW5JbmRleCkgeworCQlyZXR1cm4gdG9TdHJpbmcoYmVnaW5JbmRleCwgY3VycmVudFBvc2l0aW9uKTsKKwl9CisKKwkvKgorCSAqIEBzZWUgc2Nhbm5lci5JU2Nhbm5lclNvdXJjZSN0b1N0cmluZyhpbnQsIGludCkKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKGludCBiZWdpbkluZGV4LCBpbnQgZW5kSW5kZXgpIHsKKwkJcmV0dXJuIG5ldyBTdHJpbmcoY2J1ZiwgYmVnaW5JbmRleCwgZW5kSW5kZXggLSBiZWdpbkluZGV4KTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBvcmlnaW5hbCBjaGFyYWN0ZXIgYXJyYXkgdGhhdCBiYWNrcyB0aGUgc2Nhbm5lciBzb3VyY2UuCisJICogQWxsIHN1YnNlcXVlbnQgY2hhbmdlcyB0byB0aGUgcmV0dXJuZWQgYXJyYXkgd2lsbCBhZmZlY3QgdGhlIHNjYW5uZXIKKwkgKiBzb3VyY2UuCisJICogCisJICogQHJldHVybiB0aGUgYXJyYXkKKwkgKi8KKwlwdWJsaWMgY2hhcltdIGdldEFycmF5KCkgeworCQlyZXR1cm4gY2J1ZjsKKwl9CisKKwkvKgorCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCN0b1N0cmluZygpCisJICovCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuICJMaW5lPSIgKyBnZXRDdXJyZW50TGluZU51bWJlcigpICsgIiwgQ29sdW1uPSIgKyBnZXRDdXJyZW50Q29sdW1uTnVtYmVyKCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCX0KKworCXByaXZhdGUgc3RhdGljIGNoYXIgaGV4RGlnaXQoaW50IGRpZ2l0KSB7CisJCXJldHVybiAiMDEyMzQ1Njc4OWFiY2RlZiIuY2hhckF0KGRpZ2l0KTsgLy8kTk9OLU5MUy0xJAorCX0KKworCXB1YmxpYyBzdGF0aWMgQ2hhckFycmF5U291cmNlIGNyZWF0ZUZyb20oUmVhZGVyIHJlYWRlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKwkJaW50IEJVRl9TSVpFID0gNDA5NjsKKwkJY2hhcltdIGFycmF5ID0gbmV3IGNoYXJbQlVGX1NJWkVdOworCQlmb3IgKGludCByZWFkID0gMDsgKHJlYWQgPSByZWFkZXIucmVhZChhcnJheSwgMCwgQlVGX1NJWkUpKSA+IDA7KSB7CisJCQlidWZmZXIuYXBwZW5kKGFycmF5LCAwLCByZWFkKTsKKwkJfQorCQljaGFyW10gcmVzdWx0ID0gbmV3IGNoYXJbYnVmZmVyLmxlbmd0aCgpXTsKKwkJYnVmZmVyLmdldENoYXJzKDAsIGJ1ZmZlci5sZW5ndGgoKSwgcmVzdWx0LCAwKTsKKwkJcmV0dXJuIG5ldyBDaGFyQXJyYXlTb3VyY2UocmVzdWx0KTsKKwl9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL3BkZS9ubHMvaW50ZXJuYWwvdWkvcGFyc2VyL0lTY2FubmVyU291cmNlLmphdmEgYi9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL3BkZS9ubHMvaW50ZXJuYWwvdWkvcGFyc2VyL0lTY2FubmVyU291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFlNmRjZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvcGRlL25scy9pbnRlcm5hbC91aS9wYXJzZXIvSVNjYW5uZXJTb3VyY2UuamF2YQpAQCAtMCwwICsxLDEzOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBTdGVmYW4gTfxja2UgYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIFN0ZWZhbiBN/GNrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnBkZS5ubHMuaW50ZXJuYWwudWkucGFyc2VyOworCitwdWJsaWMgaW50ZXJmYWNlIElTY2FubmVyU291cmNlIHsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIGNoYXJhY3RlciBhdCB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uLgorCSAqIAorCSAqIEBwYXJhbSBwb3NpdGlvbiB0aGUgaW5kZXggb2YgdGhlIGNoYXJhY3RlciB0byBiZSByZXR1cm5lZAorCSAqIEByZXR1cm4gdGhlIGNoYXJhY3RlciBhdCB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uICgwLWJhc2VkKQorCSAqLworCXB1YmxpYyBpbnQgY2hhckF0KGludCBwb3NpdGlvbik7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBjaGFyYWN0ZXIgdGhhdCB3aWxsIGJlIHJldHVybmVkIGJ5IHRoZSBuZXh0IGNhbGwKKwkgKiB0byA8Y29kZT5yZWFkQ2hhcigpPC9jb2RlPi4gQ2FsbGluZyB0aGlzIG1ldGhvZCBpcyBlcXVhbCB0byB0aGUKKwkgKiBmb2xsb3dpbmcgY2FsbHM6CisJICogPHByZT4KKwkgKiAgICAgbG9va2FoZWFkKDEpCisJICogICAgIGNoYXJBdChnZXRQb3NpdGlvbigpKQorCSAqIDwvcHJlPgorCSAqIAorCSAqIEByZXR1cm4gdGhlIGNoYXJhY3RlciBhdCB0aGUgY3VycmVudCBwb3NpdGlvbgorCSAqLworCXB1YmxpYyBpbnQgbG9va2FoZWFkKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBjaGFyYWN0ZXIgYXQgdGhlIGdpdmVuIGxvb2thaGVhZCBwb3NpdGlvbi4gQ2FsbGluZyB0aGlzCisJICogbWV0aG9kIGlzIGVxdWFsIHRvIHRoZSBmb2xsb3dpbmcgY2FsbDoKKwkgKiA8cHJlPgorCSAqICAgICBjaGFyQXQoY3VycmVudFBvc2l0aW9uICsgbiAtIDEpCisJICogPC9wcmU+CisJICogCisJICogQHBhcmFtIG4gdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGxvb2sgYWhlYWQKKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBjaGFyYWN0ZXIKKwkgKi8KKwlwdWJsaWMgaW50IGxvb2thaGVhZChpbnQgbik7CisKKwkvKioKKwkgKiBSZWFkcyBhIHNpbmdsZSBjaGFyYWN0ZXIuCisJICogCisJICogQHJldHVybiB0aGUgY2hhcmFjdGVyIHJlYWQsIG9yIC0xIGlmIHRoZSBlbmQgb2YgdGhlIHNvdXJjZQorCSAqICAgICBoYXMgYmVlbiByZWFjaGVkIAorCSAqLworCXB1YmxpYyBpbnQgcmVhZENoYXIoKTsKKwkKKwkvKioKKwkgKiBSZWFkcyBhIHNpbmdsZSBjaGFyYWN0ZXIuCisJICogCisJICogQHBhcmFtIGV4cGVjdGVkIHRoZSBleHBlY3RlZCBjaGFyYWN0ZXI7IGlmIHRoZSBjaGFyYWN0ZXIgcmVhZCBkb2VzIG5vdAorCSAqICAgICBtYXRjaCB0aGlzIGNoYXJhY3RlciwgYSA8Y29kZT5MZXhjaWFsRXJyb3JFeGNlcHRpb248L2NvZGU+IHdpbGwgYmUgdGhyb3duCisJICogQHJldHVybiB0aGUgY2hhcmFjdGVyIHJlYWQsIG9yIC0xIGlmIHRoZSBlbmQgb2YgdGhlIHNvdXJjZQorCSAqICAgICBoYXMgYmVlbiByZWFjaGVkIAorCSAqLworCXB1YmxpYyBpbnQgcmVhZENoYXIoaW50IGV4cGVjdGVkKTsKKwkKKwkvKioKKwkgKiBVbnJlYWRzIGEgc2luZ2xlIGNoYXJhY3Rlci4gVGhlIGN1cnJlbnQgcG9zaXRpb24gd2lsbCBiZSBkZWNyZWFzZWQKKwkgKiBieSAxLiBJZiAtMSBoYXMgYmVlbiByZWFkIG11bHRpcGxlIHRpbWVzLCBpdCB3aWxsIGJlIHVucmVhZCBtdWx0aXBsZQorCSAqIHRpbWVzLgorCSAqLworCXB1YmxpYyB2b2lkIHVucmVhZENoYXIoKTsKKworCS8qKgorCSAqIFJldHJ1bnMgdGhlIGN1cnJlbnQgcG9zaXRpb24gb2YgdGhlIHNvdXJjZS4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBwb3NpdGlvbiAoMC1iYXNlZCkKKwkgKi8KKwlwdWJsaWMgaW50IGdldFBvc2l0aW9uKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjdXJyZW50IHBvc2l0aW9uIGlzIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lLgorCSAqIAorCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGN1cnJlbnQgcG9zaXRpb24gaXMgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0F0TGluZUJlZ2luKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGxpbmUgbnVtYmVyLiAKKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBjdXJyZW50IGxpbmUgbnVtYmVyICgxLWJhc2VkKQorCSAqLworCXB1YmxpYyBpbnQgZ2V0Q3VycmVudExpbmVOdW1iZXIoKTsKKwkKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGNvbHVtbiBudW1iZXIuIAorCSAqIAorCSAqIEByZXR1cm4gdGhlIGN1cnJlbnQgY29sdW1uIG51bWJlciAoMS1iYXNlZCkKKwkgKi8KKwlwdWJsaWMgaW50IGdldEN1cnJlbnRDb2x1bW5OdW1iZXIoKTsgCisKKwkvKioKKwkgKiBSZWNvcmRzIHRoZSBuZXh0IGxpbmUgZW5kIHBvc2l0aW9uLiBUaGlzIG1ldGhvZCBoYXMgdG8gYmUgY2FsbGVkCisJICoganVzdCBhZnRlciB0aGUgbGluZSBzZXBhcmF0b3IgaGFzIGJlZW4gcmVhZC4KKwkgKiAKKwkgKiBAc2VlIElTY2FubmVyU291cmNlI2dldExpbmVFbmRzKCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBwdXNoTGluZVNlcGFyYXRvcigpOworCisJLyoqCisJICogUmV0dXJucyBhbiBhcnJheSBvZiB0aGUgbGluZSBlbmQgcG9zaXRpb25zIHJlY29yZGVkIHNvIGZhci4gRWFjaCB2YWx1ZSBwb2ludHMKKwkgKiB0byBmaXJzdCBjaGFyYWN0ZXIgZm9sbG93aW5nIHRoZSBsaW5lIGVuZCAoYW5kIGlzIHRodXMgYW4gZXhjbHVzaXZlIGluZGV4CisJICogdG8gdGhlIGxpbmUgZW5kKS4gQnkgZGVmaW5pdGlvbiB0aGUgdmFsdWUgPGNvZGU+bGluZUVuZHNbMF08L2NvZGU+IGlzIDAuCisJICogPGNvZGU+bGluZUVuZHNbMV08L2NvZGU+IGNvbnRhaW5zIHRoZSBsaW5lIGVuZCBwb3NpdGlvbiBvZiB0aGUgZmlyc3QgbGluZS4KKwkgKiAKKwkgKiBAcmV0dXJuIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGxpbmUgZW5kIHBvc2l0aW9ucworCSAqIAorCSAqIEBzZWUgSVNjYW5uZXJTb3VyY2UjcHVzaExpbmVTZXBhcmF0b3IoKQorCSAqLworCXB1YmxpYyBpbnRbXSBnZXRMaW5lRW5kcygpOworCisJLyoqCisJICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiBtb3JlIGNoYXJhY3RlcnMgYXJlIGF2YWlsYWJsZS4KKwkgKiAKKwkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIG1vcmUgY2hhcmFjdGVycyBhcmUgYXZhaWxhYmxlCisJICovCisJcHVibGljIGJvb2xlYW4gaGFzTW9yZUNoYXJzKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgU3RyaW5nIHRoYXQgY29udGFpbnMgdGhlIGNoYXJhY3RlcnMgaW4gdGhlIHNwZWNpZmllZCByYW5nZQorCSAqIG9mIHRoZSBzb3VyY2UuCisJICogCisJICogQHBhcmFtIGJlZ2luSW5kZXggdGhlIGJlZ2lubmluZyBpbmRleCwgaW5jbHVzaXZlCisJICogQHBhcmFtIGVuZEluZGV4IHRoZSBlbmRpbmcgaW5kZXgsIGV4Y2x1c2l2ZQorCSAqIEByZXR1cm4gdGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+U3RyaW5nPC9jb2RlPgorCSAqLworCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoaW50IGJlZ2luSW5kZXgsIGludCBlbmRJbmRleCk7CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci9zcmMvb3JnL2VjbGlwc2UvcGRlL25scy9pbnRlcm5hbC91aS9wYXJzZXIvTGV4aWNhbEVycm9yRXhjZXB0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL3BkZS9ubHMvaW50ZXJuYWwvdWkvcGFyc2VyL0xleGljYWxFcnJvckV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiNTQzOWEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL3BkZS9ubHMvaW50ZXJuYWwvdWkvcGFyc2VyL0xleGljYWxFcnJvckV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsODAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggU3RlZmFuIE38Y2tlIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBTdGVmYW4gTfxja2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5wZGUubmxzLmludGVybmFsLnVpLnBhcnNlcjsKKworLyoqCisgKiBFeGNlcHRpb24gdGhyb3duIGJ5IGEgc2Nhbm5lciB3aGVuIGVuY291bnRlcmluZyBsZXhpY2FsIGVycm9ycy4KKyAqLworcHVibGljIGNsYXNzIExleGljYWxFcnJvckV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24geworCisJcHJpdmF0ZSBpbnQgbGluZU51bWJlcjsKKwlwcml2YXRlIGludCBjb2x1bW5OdW1iZXI7CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgPGNvZGU+TGV4aWNhbEVycm9yRXhjZXB0aW9uPC9jb2RlPiB3aXRob3V0IGEgZGV0YWlsZWQgbWVzc2FnZS4gCisJICogCisJICogQHBhcmFtIHNvdXJjZSB0aGUgc2Nhbm5lciBzb3VyY2UgdGhlIGVycm9yIG9jY3VyZWQgb24gIAorCSAqLworCXB1YmxpYyBMZXhpY2FsRXJyb3JFeGNlcHRpb24oSVNjYW5uZXJTb3VyY2Ugc291cmNlKSB7CisJCXRoaXMoc291cmNlLmdldEN1cnJlbnRMaW5lTnVtYmVyKCksIHNvdXJjZS5nZXRDdXJyZW50Q29sdW1uTnVtYmVyKCksIG51bGwpOworCX0KKworCS8qKgorCSAqIEBwYXJhbSBzb3VyY2UgdGhlIHNjYW5uZXIgc291cmNlIHRoZSBlcnJvciBvY2N1cmVkIG9uICAKKwkgKiBAcGFyYW0gbWVzc2FnZSB0aGUgZXJyb3IgbWVzc2FnZSAKKwkgKi8KKwlwdWJsaWMgTGV4aWNhbEVycm9yRXhjZXB0aW9uKElTY2FubmVyU291cmNlIHNvdXJjZSwgU3RyaW5nIG1lc3NhZ2UpIHsKKwkJdGhpcyhzb3VyY2UuZ2V0Q3VycmVudExpbmVOdW1iZXIoKSwgc291cmNlLmdldEN1cnJlbnRDb2x1bW5OdW1iZXIoKSwgbWVzc2FnZSk7CisJfQorCisJLyoqCisJICogQHBhcmFtIGxpbmUgdGhlIG51bWJlciBvZiB0aGUgbGluZSB3aGVyZSB0aGUgZXJyb3Igb2NjdXJlZCAgCisJICogQHBhcmFtIGNvbHVtbiB0aGUgbnVtZXIgb2YgdGhlIGNvbHVtbiB3aGVyZSB0aGUgZXJyb3Igb2NjdXJlZCAgCisJICogQHBhcmFtIG1lc3NhZ2UgdGhlIGVycm9yIG1lc3NhZ2UgCisJICovCisJcHVibGljIExleGljYWxFcnJvckV4Y2VwdGlvbihpbnQgbGluZSwgaW50IGNvbHVtbiwgU3RyaW5nIG1lc3NhZ2UpIHsKKwkJc3VwZXIoIkxleGljYWwgZXJyb3IgKCIgKyBsaW5lICsgIiwgIiArIGNvbHVtbiArIChtZXNzYWdlID09IG51bGwgPyAiKSIgOiAiKTogIiArIG1lc3NhZ2UpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAorCQl0aGlzLmxpbmVOdW1iZXIgPSBsaW5lOworCQl0aGlzLmNvbHVtbk51bWJlciA9IGNvbHVtbjsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBsaW5lIG51bWJlciB3aGVyZSB0aGUgZXJyb3Igb2NjdXJlZC4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBsaW5lIG51bWJlciB3aGVyZSB0aGUgZXJyb3Igb2NjdXJlZAorCSAqLworCXB1YmxpYyBpbnQgZ2V0TGluZU51bWJlcigpIHsKKwkJcmV0dXJuIGxpbmVOdW1iZXI7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgY29sdW1uIG51bWJlciB3aGVyZSB0aGUgZXJyb3Igb2NjdXJlZC4KKwkgKiAKKwkgKiBAcmV0dXJuIHRoZSBjb2x1bW4gbnVtYmVyIHdoZXJlIHRoZSBlcnJvciBvY2N1cmVkCisJICovCisJcHVibGljIGludCBnZXRDb2x1bW5OdW1iZXIoKSB7CisJCXJldHVybiBjb2x1bW5OdW1iZXI7CisJfQorCisJcHVibGljIHN0YXRpYyBMZXhpY2FsRXJyb3JFeGNlcHRpb24gdW5leHBlY3RlZENoYXJhY3RlcihJU2Nhbm5lclNvdXJjZSBzb3VyY2UsIGludCBjKSB7CisJCXJldHVybiBuZXcgTGV4aWNhbEVycm9yRXhjZXB0aW9uKHNvdXJjZSwgIlVuZXhwZWN0ZWQgY2hhcmFjdGVyOiAnIiAvLyROT04tTkxTLTEkCisJCQkrIChjaGFyKSBjCisJCQkrICInICgweCIgLy8kTk9OLU5MUy0xJAorCQkJKyBoZXhEaWdpdCgoYyA+PiA0KSAmIDB4ZikKKwkJCSsgaGV4RGlnaXQoYyAmIDB4ZikKKwkJCSsgIikiKTsgLy8kTk9OLU5MUy0xJAorCX0KKworCXByaXZhdGUgc3RhdGljIGNoYXIgaGV4RGlnaXQoaW50IGRpZ2l0KSB7CisJCXJldHVybiAiMDEyMzQ1Njc4OWFiY2RlZiIuY2hhckF0KGRpZ2l0KTsgLy8kTk9OLU5MUy0xJAorCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9wZGUvbmxzL2ludGVybmFsL3VpL3BhcnNlci9Mb2NhbGVVdGlsLmphdmEgYi9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL3BkZS9ubHMvaW50ZXJuYWwvdWkvcGFyc2VyL0xvY2FsZVV0aWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNWVjYmEzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9wZGUvbmxzL2ludGVybmFsL3VpL3BhcnNlci9Mb2NhbGVVdGlsLmphdmEKQEAgLTAsMCArMSw1NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBTdGVmYW4gTfxja2UgYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIFN0ZWZhbiBN/GNrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnBkZS5ubHMuaW50ZXJuYWwudWkucGFyc2VyOworCitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOworCitwdWJsaWMgY2xhc3MgTG9jYWxlVXRpbCB7CisKKwlwcml2YXRlIExvY2FsZVV0aWwoKSB7CisJfQorCisJcHVibGljIHN0YXRpYyBMb2NhbGUgcGFyc2VMb2NhbGUoU3RyaW5nIG5hbWUpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24geworCQlTdHJpbmcgbGFuZ3VhZ2UgPSAiIjsgLy8kTk9OLU5MUy0xJAorCQlTdHJpbmcgY291bnRyeSA9ICIiOyAvLyROT04tTkxTLTEkCisJCVN0cmluZyB2YXJpYW50ID0gIiI7IC8vJE5PTi1OTFMtMSQKKworCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihuYW1lLCAiXyIpOyAvLyROT04tTkxTLTEkCisJCWlmICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKQorCQkJbGFuZ3VhZ2UgPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7CisJCWlmICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKQorCQkJY291bnRyeSA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKKwkJaWYgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpCisJCQl2YXJpYW50ID0gdG9rZW5pemVyLm5leHRUb2tlbigpOworCisJCWlmICghbGFuZ3VhZ2UuZXF1YWxzKCIiKSAmJiBsYW5ndWFnZS5sZW5ndGgoKSAhPSAyKSAvLyROT04tTkxTLTEkCisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisJCWlmICghY291bnRyeS5lcXVhbHMoIiIpICYmIGNvdW50cnkubGVuZ3RoKCkgIT0gMikgLy8kTk9OLU5MUy0xJAorCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCisJCWlmICghbGFuZ3VhZ2UuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCisJCQljaGFyIGwxID0gbGFuZ3VhZ2UuY2hhckF0KDApOworCQkJY2hhciBsMiA9IGxhbmd1YWdlLmNoYXJBdCgxKTsKKwkJCWlmICghKCdhJyA8PSBsMSAmJiBsMSA8PSAneicgJiYgJ2EnIDw9IGwyICYmIGwyIDw9ICd6JykpCisJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCQl9CisKKwkJaWYgKCFjb3VudHJ5LmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJY2hhciBjMSA9IGNvdW50cnkuY2hhckF0KDApOworCQkJY2hhciBjMiA9IGNvdW50cnkuY2hhckF0KDEpOworCQkJaWYgKCEoJ0EnIDw9IGMxICYmIGMxIDw9ICdaJyAmJiAnQScgPD0gYzIgJiYgYzIgPD0gJ1onKSkKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisJCX0KKworCQlyZXR1cm4gbmV3IExvY2FsZShsYW5ndWFnZSwgY291bnRyeSwgdmFyaWFudCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3Ivc3JjL29yZy9lY2xpcHNlL3BkZS9ubHMvaW50ZXJuYWwvdWkvcGFyc2VyL1Jhd0J1bmRsZS5qYXZhIGIvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9wZGUvbmxzL2ludGVybmFsL3VpL3BhcnNlci9SYXdCdW5kbGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTU4NzcyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3NyYy9vcmcvZWNsaXBzZS9wZGUvbmxzL2ludGVybmFsL3VpL3BhcnNlci9SYXdCdW5kbGUuamF2YQpAQCAtMCwwICsxLDMyMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBTdGVmYW4gTfxja2UgYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIFN0ZWZhbiBN/GNrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLnBkZS5ubHMuaW50ZXJuYWwudWkucGFyc2VyOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7CitpbXBvcnQgamF2YS5pby5SZWFkZXI7CitpbXBvcnQgamF2YS5pby5Xcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworLyoqCisgKiBBIGNsYXNzIHVzZWQgdG8gbWFuaXB1bGF0ZSByZXNvdXJjZSBidW5kbGUgZmlsZXMuCisgKi8KK3B1YmxpYyBjbGFzcyBSYXdCdW5kbGUgeworCisJcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBSYXdMaW5lIHsKKwkJU3RyaW5nIHJhd0RhdGE7CisJCXB1YmxpYyBSYXdMaW5lKFN0cmluZyByYXdEYXRhKSB7CisJCQl0aGlzLnJhd0RhdGEgPSByYXdEYXRhOworCQl9CisJCXB1YmxpYyBTdHJpbmcgZ2V0UmF3RGF0YSgpIHsKKwkJCXJldHVybiByYXdEYXRhOworCQl9CisJfQorCXB1YmxpYyBzdGF0aWMgY2xhc3MgQ29tbWVudExpbmUgZXh0ZW5kcyBSYXdMaW5lIHsKKwkJcHVibGljIENvbW1lbnRMaW5lKFN0cmluZyBsaW5lKSB7CisJCQlzdXBlcihsaW5lKTsKKwkJfQorCX0KKwlwdWJsaWMgc3RhdGljIGNsYXNzIEVtcHR5TGluZSBleHRlbmRzIFJhd0xpbmUgeworCQlwdWJsaWMgRW1wdHlMaW5lKFN0cmluZyBsaW5lKSB7CisJCQlzdXBlcihsaW5lKTsKKwkJfQorCX0KKwlwdWJsaWMgc3RhdGljIGNsYXNzIEVudHJ5TGluZSBleHRlbmRzIFJhd0xpbmUgeworCQlTdHJpbmcga2V5OworCQlwdWJsaWMgRW50cnlMaW5lKFN0cmluZyBrZXksIFN0cmluZyBsaW5lRGF0YSkgeworCQkJc3VwZXIobGluZURhdGEpOworCQkJdGhpcy5rZXkgPSBrZXk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBUaGUgbG9naWNhbCBsaW5lcyBvZiB0aGUgcmVzb3VyY2UgYnVuZGxlLgorCSAqLworCXByaXZhdGUgQXJyYXlMaXN0PFJhd0xpbmU+IGxpbmVzID0gbmV3IEFycmF5TGlzdDxSYXdMaW5lPigpOworCisJcHVibGljIFJhd0J1bmRsZSgpIHsKKwl9CisKKwlwdWJsaWMgRW50cnlMaW5lIGdldEVudHJ5TGluZShTdHJpbmcga2V5KSB7CisJCWZvciAoUmF3TGluZSBsaW5lIDogbGluZXMpIHsKKwkJCWlmIChsaW5lIGluc3RhbmNlb2YgRW50cnlMaW5lKSB7CisJCQkJRW50cnlMaW5lIGVudHJ5TGluZSA9IChFbnRyeUxpbmUpIGxpbmU7CisJCQkJaWYgKGVudHJ5TGluZS5rZXkuZXF1YWxzKGtleSkpCisJCQkJCXJldHVybiBlbnRyeUxpbmU7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJcHVibGljIHZvaWQgcHV0KFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSkgeworCisJCS8vIEZpbmQgaW5zZXJ0aW9uIHBvc2l0aW9uCisJCWludCBzaXplID0gbGluZXMuc2l6ZSgpOworCQlpbnQgcG9zID0gLTE7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisJCQlSYXdMaW5lIGxpbmUgPSBsaW5lcy5nZXQoaSk7CisJCQlpZiAobGluZSBpbnN0YW5jZW9mIEVudHJ5TGluZSkgeworCQkJCUVudHJ5TGluZSBlbnRyeUxpbmUgPSAoRW50cnlMaW5lKSBsaW5lOworCQkJCWludCBjb21wYXJlID0ga2V5LmNvbXBhcmVUb0lnbm9yZUNhc2UoZW50cnlMaW5lLmtleSk7CisJCQkJaWYgKGNvbXBhcmUgPCAwKSB7CisJCQkJCWlmIChwb3MgPT0gLTEpIHsKKwkJCQkJCXBvcyA9IGk7IC8vIHBvc3NpYmxlIGluc2VydGlvbiBwb3NpdGlvbgorCQkJCQl9CisJCQkJfSBlbHNlIGlmIChjb21wYXJlID4gMCkgeworCQkJCQljb250aW51ZTsKKwkJCQl9IGVsc2UgaWYgKGtleS5lcXVhbHMoZW50cnlMaW5lLmtleSkpIHsKKwkJCQkJZW50cnlMaW5lLnJhd0RhdGEgPSBrZXkgKyAiPSIgKyBlc2NhcGUodmFsdWUpICsgIlxyXG4iOworCQkJCQlyZXR1cm47CisJCQkJfSBlbHNlIHsKKwkJCQkJcG9zID0gaTsgLy8gcG9zc2libGUgaW5zZXJ0aW9uIHBvc2l0aW9uCisJCQkJfQorCQkJfQorCQl9CisJCWlmIChwb3MgPT0gLTEpCisJCQlwb3MgPSBsaW5lcy5zaXplKCk7CisKKwkJLy8gQXBwZW5kIG5ldyBlbnRyeQorCQlsaW5lcy5hZGQocG9zLCBuZXcgRW50cnlMaW5lKGtleSwga2V5ICsgIj0iICsgZXNjYXBlKHZhbHVlKSArICJcclxuIikpOworCX0KKworCXByaXZhdGUgU3RyaW5nIGVzY2FwZShTdHJpbmcgc3RyKSB7CisJCVN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisJCWludCBsZW4gPSBzdHIubGVuZ3RoKCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKwkJCWNoYXIgYyA9IHN0ci5jaGFyQXQoaSk7CisJCQlzd2l0Y2ggKGMpIHsKKwkJCQljYXNlICcgJyA6CisJCQkJCWlmIChpID09IDApIHsKKwkJCQkJCWJ1aWxkZXIuYXBwZW5kKCJcXCAiKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWJ1aWxkZXIuYXBwZW5kKGMpOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJ1x0JyA6CisJCQkJCWJ1aWxkZXIuYXBwZW5kKCJcXHQiKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAnPScgOgorCQkJCWNhc2UgJzonIDoKKwkJCQljYXNlICcjJyA6CisJCQkJY2FzZSAnIScgOgorCQkJCWNhc2UgJ1xcJyA6CisJCQkJCWJ1aWxkZXIuYXBwZW5kKCdcXCcpLmFwcGVuZChjKTsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdCA6CisJCQkJCWlmICgzMSA8PSBjICYmIGMgPD0gMjU1KSB7CisJCQkJCQlidWlsZGVyLmFwcGVuZChjKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWJ1aWxkZXIuYXBwZW5kKCJcXHUiKTsKKwkJCQkJCWJ1aWxkZXIuYXBwZW5kKGhleERpZ2l0KChjID4+IDEyKSAmIDB4MGYpKTsKKwkJCQkJCWJ1aWxkZXIuYXBwZW5kKGhleERpZ2l0KChjID4+IDgpICYgMHgwZikpOworCQkJCQkJYnVpbGRlci5hcHBlbmQoaGV4RGlnaXQoKGMgPj4gNCkgJiAweDBmKSk7CisJCQkJCQlidWlsZGVyLmFwcGVuZChoZXhEaWdpdChjICYgMHgwZikpOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJfQorCQl9CisJCXJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgY2hhciBoZXhEaWdpdChpbnQgZGlnaXQpIHsKKwkJcmV0dXJuICIwMTIzNDU2Nzg5QUJDREVGIi5jaGFyQXQoZGlnaXQpOyAvLyROT04tTkxTLTEkCisJfQorCisJcHVibGljIHZvaWQgd3JpdGVUbyhPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlPdXRwdXRTdHJlYW1Xcml0ZXIgd3JpdGVyID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihvdXQsICJJU08tODg1OS0xIik7CisJCXdyaXRlVG8od3JpdGVyKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB3cml0ZVRvKFdyaXRlciB3cml0ZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCWZvciAoUmF3TGluZSBsaW5lIDogbGluZXMpIHsKKwkJCXdyaXRlci53cml0ZShsaW5lLnJhd0RhdGEpOworCQl9CisJfQorCisJcHVibGljIHN0YXRpYyBSYXdCdW5kbGUgY3JlYXRlRnJvbShJbnB1dFN0cmVhbSBpbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJSVNjYW5uZXJTb3VyY2Ugc291cmNlID0gQ2hhckFycmF5U291cmNlLmNyZWF0ZUZyb20obmV3IElucHV0U3RyZWFtUmVhZGVyKGluLCAiSVNPLTg4NTktMSIpKTsKKwkJcmV0dXJuIFJhd0J1bmRsZS5jcmVhdGVGcm9tKHNvdXJjZSk7CisJfQorCisJcHVibGljIHN0YXRpYyBSYXdCdW5kbGUgY3JlYXRlRnJvbShSZWFkZXIgcmVhZGVyKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlJU2Nhbm5lclNvdXJjZSBzb3VyY2UgPSBDaGFyQXJyYXlTb3VyY2UuY3JlYXRlRnJvbShyZWFkZXIpOworCQlyZXR1cm4gUmF3QnVuZGxlLmNyZWF0ZUZyb20oc291cmNlKTsKKwl9CisKKwlwdWJsaWMgc3RhdGljIFJhd0J1bmRsZSBjcmVhdGVGcm9tKElTY2FubmVyU291cmNlIHNvdXJjZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJUmF3QnVuZGxlIHJhd0J1bmRsZSA9IG5ldyBSYXdCdW5kbGUoKTsKKwkJU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKworCQl3aGlsZSAoc291cmNlLmhhc01vcmVDaGFycygpKSB7CisJCQlpbnQgYmVnaW4gPSBzb3VyY2UuZ2V0UG9zaXRpb24oKTsKKwkJCXNraXBBbGxPZigiIFx0XHUwMDBjIiwgc291cmNlKTsKKworCQkJLy8gQ29tbWVudCBsaW5lCisJCQlpZiAoc291cmNlLmxvb2thaGVhZCgpID09ICcjJyB8fCBzb3VyY2UubG9va2FoZWFkKCkgPT0gJyEnKSB7CisJCQkJc2tpcFRvT25lT2YoIlxyXG4iLCBmYWxzZSwgc291cmNlKTsKKwkJCQljb25zdW1lTGluZVNlcGFyYXRvcihzb3VyY2UpOworCQkJCWludCBlbmQgPSBzb3VyY2UuZ2V0UG9zaXRpb24oKTsKKwkJCQlTdHJpbmcgbGluZSA9IHNvdXJjZS50b1N0cmluZyhiZWdpbiwgZW5kKTsKKwkJCQlyYXdCdW5kbGUubGluZXMuYWRkKG5ldyBDb21tZW50TGluZShsaW5lKSk7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCS8vIEVtcHR5IGxpbmUKKwkJCWlmIChpc0F0TGluZUVuZChzb3VyY2UpKSB7CisJCQkJY29uc3VtZUxpbmVTZXBhcmF0b3Ioc291cmNlKTsKKwkJCQlpbnQgZW5kID0gc291cmNlLmdldFBvc2l0aW9uKCk7CisJCQkJU3RyaW5nIGxpbmUgPSBzb3VyY2UudG9TdHJpbmcoYmVnaW4sIGVuZCk7CisJCQkJcmF3QnVuZGxlLmxpbmVzLmFkZChuZXcgRW1wdHlMaW5lKGxpbmUpKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJLy8gRW50cnkgbGluZQorCQkJeworCQkJCS8vIEtleQorCQkJCWJ1aWxkZXIuc2V0TGVuZ3RoKDApOworCQkJCWxvb3AgOiB3aGlsZSAoc291cmNlLmhhc01vcmVDaGFycygpKSB7CisJCQkJCWNoYXIgYyA9IChjaGFyKSBzb3VyY2UucmVhZENoYXIoKTsKKwkJCQkJc3dpdGNoIChjKSB7CisJCQkJCQljYXNlICcgJyA6CisJCQkJCQljYXNlICdcdCcgOgorCQkJCQkJY2FzZSAnXHUwMDBjJyA6CisJCQkJCQljYXNlICc9JyA6CisJCQkJCQljYXNlICdccicgOgorCQkJCQkJY2FzZSAnXG4nIDoKKwkJCQkJCQlicmVhayBsb29wOworCQkJCQkJY2FzZSAnXFwnIDoKKwkJCQkJCQlzb3VyY2UudW5yZWFkQ2hhcigpOworCQkJCQkJCWJ1aWxkZXIuYXBwZW5kKHJlYWRFc2NhcGVkQ2hhcihzb3VyY2UpKTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWRlZmF1bHQgOgorCQkJCQkJCWJ1aWxkZXIuYXBwZW5kKGMpOworCQkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJCVN0cmluZyBrZXkgPSBidWlsZGVyLnRvU3RyaW5nKCk7CisKKwkJCQkvLyBWYWx1ZQorCQkJCWludCBlbmQgPSAwOworCQkJCWxvb3AgOiB3aGlsZSAoc291cmNlLmhhc01vcmVDaGFycygpKSB7CisJCQkJCWNoYXIgYyA9IChjaGFyKSBzb3VyY2UucmVhZENoYXIoKTsKKwkJCQkJc3dpdGNoIChjKSB7CisJCQkJCQljYXNlICdccicgOgorCQkJCQkJY2FzZSAnXG4nIDoKKwkJCQkJCQljb25zdW1lTGluZVNlcGFyYXRvcihzb3VyY2UpOworCQkJCQkJCWVuZCA9IHNvdXJjZS5nZXRQb3NpdGlvbigpOworCQkJCQkJCWJyZWFrIGxvb3A7CisJCQkJCQljYXNlICdcXCcgOgorCQkJCQkJCWlmIChpc0F0TGluZUVuZChzb3VyY2UpKSB7CisJCQkJCQkJCWNvbnN1bWVMaW5lU2VwYXJhdG9yKHNvdXJjZSk7CisJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJc291cmNlLnVucmVhZENoYXIoKTsKKwkJCQkJCQkJcmVhZEVzY2FwZWRDaGFyKHNvdXJjZSk7CisJCQkJCQkJfQorCQkJCQkJCWJyZWFrOworCQkJCQkJZGVmYXVsdCA6CisJCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQkJaWYgKGVuZCA9PSAwKQorCQkJCQllbmQgPSBzb3VyY2UuZ2V0UG9zaXRpb24oKTsKKworCQkJCVN0cmluZyBsaW5lRGF0YSA9IHNvdXJjZS50b1N0cmluZyhiZWdpbiwgZW5kKTsKKwkJCQlFbnRyeUxpbmUgZW50cnlMaW5lID0gbmV3IEVudHJ5TGluZShrZXksIGxpbmVEYXRhKTsKKwkJCQlyYXdCdW5kbGUubGluZXMuYWRkKGVudHJ5TGluZSk7CisJCQl9CisJCX0KKworCQlyZXR1cm4gcmF3QnVuZGxlOworCX0KKworCXByaXZhdGUgc3RhdGljIGNoYXIgcmVhZEVzY2FwZWRDaGFyKElTY2FubmVyU291cmNlIHNvdXJjZSkgeworCQlzb3VyY2UucmVhZENoYXIoJ1xcJyk7CisJCWNoYXIgYyA9IChjaGFyKSBzb3VyY2UucmVhZENoYXIoKTsKKwkJc3dpdGNoIChjKSB7CisJCQljYXNlICcgJyA6CisJCQljYXNlICc9JyA6CisJCQljYXNlICc6JyA6CisJCQljYXNlICcjJyA6CisJCQljYXNlICchJyA6CisJCQljYXNlICdcXCcgOgorCQkJCXJldHVybiBjOworCQkJY2FzZSAndCcgOgorCQkJCXJldHVybiAnXHQnOworCQkJY2FzZSAnbicgOgorCQkJCXJldHVybiAnXG4nOworCQkJY2FzZSAndScgOgorCQkJCWludCBkMSA9IENoYXJhY3Rlci5kaWdpdChzb3VyY2UucmVhZENoYXIoKSwgMTYpOworCQkJCWludCBkMiA9IENoYXJhY3Rlci5kaWdpdChzb3VyY2UucmVhZENoYXIoKSwgMTYpOworCQkJCWludCBkMyA9IENoYXJhY3Rlci5kaWdpdChzb3VyY2UucmVhZENoYXIoKSwgMTYpOworCQkJCWludCBkNCA9IENoYXJhY3Rlci5kaWdpdChzb3VyY2UucmVhZENoYXIoKSwgMTYpOworCQkJCWlmIChkMSA9PSAtMSB8fCBkMiA9PSAtMSB8fCBkMyA9PSAtMSB8fCBkNCA9PSAtMSkKKwkJCQkJdGhyb3cgbmV3IExleGljYWxFcnJvckV4Y2VwdGlvbihzb3VyY2UsICJJbGxlZ2FsIGVzY2FwZSBzZXF1ZW5jZSIpOworCQkJCXJldHVybiAoY2hhcikgKGQxIDw8IDEyIHwgZDIgPDwgOCB8IGQzIDw8IDQgfCBkNCk7CisJCQlkZWZhdWx0IDoKKwkJCQl0aHJvdyBuZXcgTGV4aWNhbEVycm9yRXhjZXB0aW9uKHNvdXJjZSwgIlVua25vd24gZXNjYXBlIHNlcXVlbmNlIik7CisJCX0KKwl9CisKKwlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzQXRMaW5lRW5kKElTY2FubmVyU291cmNlIHNvdXJjZSkgeworCQlyZXR1cm4gc291cmNlLmxvb2thaGVhZCgpID09ICdccicgfHwgc291cmNlLmxvb2thaGVhZCgpID09ICdcbic7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBjb25zdW1lTGluZVNlcGFyYXRvcihJU2Nhbm5lclNvdXJjZSBzb3VyY2UpIHsKKwkJaWYgKHNvdXJjZS5sb29rYWhlYWQoKSA9PSAnXG4nKSB7CisJCQlzb3VyY2UucmVhZENoYXIoKTsKKwkJCXNvdXJjZS5wdXNoTGluZVNlcGFyYXRvcigpOworCQl9IGVsc2UgaWYgKHNvdXJjZS5sb29rYWhlYWQoKSA9PSAnXHInKSB7CisJCQlzb3VyY2UucmVhZENoYXIoKTsKKwkJCWlmIChzb3VyY2UubG9va2FoZWFkKCkgPT0gJ1xuJykgeworCQkJCXNvdXJjZS5yZWFkQ2hhcigpOworCQkJfQorCQkJc291cmNlLnB1c2hMaW5lU2VwYXJhdG9yKCk7CisJCX0KKwl9CisJCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBza2lwVG9PbmVPZihTdHJpbmcgZGVsaW1pdGVycywgYm9vbGVhbiByZWFkRGVsaW1pdGVyLCBJU2Nhbm5lclNvdXJjZSBzb3VyY2UpIHsKKwkJbG9vcCA6IHdoaWxlIChzb3VyY2UuaGFzTW9yZUNoYXJzKCkpIHsKKwkJCWludCBjID0gc291cmNlLnJlYWRDaGFyKCk7CisJCQlpZiAoZGVsaW1pdGVycy5pbmRleE9mKGMpICE9IC0xKSB7CisJCQkJaWYgKCFyZWFkRGVsaW1pdGVyKSB7CisJCQkJCXNvdXJjZS51bnJlYWRDaGFyKCk7CisJCQkJfQorCQkJCWJyZWFrIGxvb3A7CisJCQl9CisJCQlpZiAoYyA9PSAnXHInKSB7CisJCQkJc291cmNlLnJlYWRDaGFyKCdcbicpOworCQkJCXNvdXJjZS5wdXNoTGluZVNlcGFyYXRvcigpOworCQkJfQorCQl9CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBza2lwQWxsT2YoU3RyaW5nIHN0cmluZywgSVNjYW5uZXJTb3VyY2Ugc291cmNlKSB7CisJCXdoaWxlIChzb3VyY2UuaGFzTW9yZUNoYXJzKCkgJiYgc3RyaW5nLmluZGV4T2Yoc291cmNlLmxvb2thaGVhZCgpKSAhPSAtMSkgeworCQkJc291cmNlLnJlYWRDaGFyKCk7CisJCX0KKwl9CisJCisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci90ZXN0cy9vcmcvZWNsaXBzZS9ubHMvdWkvdGVzdHMvUHJvcGVydGllc1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci90ZXN0cy9vcmcvZWNsaXBzZS9ubHMvdWkvdGVzdHMvUHJvcGVydGllc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTMzMTQzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3Rlc3RzL29yZy9lY2xpcHNlL25scy91aS90ZXN0cy9Qcm9wZXJ0aWVzVGVzdC5qYXZhCkBAIC0wLDAgKzEsNjUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggU3RlZmFuIE38Y2tlIGFuZCBvdGhlcnMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICoKKyAqIENvbnRyaWJ1dG9yczoKKyAqICAgICBTdGVmYW4gTfxja2UgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5ubHMudWkudGVzdHM7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitwdWJsaWMgY2xhc3MgUHJvcGVydGllc1Rlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKwlwcml2YXRlIFByb3BlcnRpZXMgcHJvcGVydGllczsKKworCXB1YmxpYyB2b2lkIHRlc3QoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlTdHJpbmcgaW5wdXQgPSAiICAgIyBhIGNvbW1lbnQgbGluZVxyXG4iCisJCQkJKyAia2V5MT12YWx1ZTFcclxuIgorCQkJCSsgImtleTI9YSB2YWx1ZSBcXFxyXG4iCisJCQkJKyAiICAgICBvbiB0d28gbGluZXNcclxuIgorCQkJCSsgImtleTM9YSB2YWx1ZSBcXFxyXG4iCisJCQkJKyAiICAgICAiCisJCQkJKyAiICAgICB3aXRoIGFuIGVtcHR5IGxpbmUgaW4gYmV0d2VlblxyXG4iOworCQlwcm9wZXJ0aWVzID0gcmVhZFByb3BlcnRpZXMoaW5wdXQpOworCQlhc3NlcnRWYWx1ZSgidmFsdWUxIiwgImtleTEiKTsKKwkJYXNzZXJ0VmFsdWUoImEgdmFsdWUgb24gdHdvIGxpbmVzIiwgImtleTIiKTsKKwkJYXNzZXJ0VmFsdWUoImEgdmFsdWUgd2l0aCBhbiBlbXB0eSBsaW5lIGluIGJldHdlZW4iLCAia2V5MyIpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RLZXlzV2l0aFdoaXRlc3BhY2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlTdHJpbmcgaW5wdXQgPSAiIgorCQkJCSsgImtleTFcdD1rZXkgd2l0aCB0YWJcclxuIgorCQkJCSsgImtleVxcIDIgPWtleSB3aXRoIGVzY2FwZWQgc3BhY2VcclxuIgorCQkJCSsgImtleSAzID1rZXkgd2l0aCBzcGFjZVxyXG4iOworCQlwcm9wZXJ0aWVzID0gcmVhZFByb3BlcnRpZXMoaW5wdXQpOworCQlhc3NlcnRWYWx1ZSgia2V5IHdpdGggdGFiIiwgImtleTEiKTsKKwkJYXNzZXJ0VmFsdWUoImtleSB3aXRoIGVzY2FwZWQgc3BhY2UiLCAia2V5IDIiKTsKKwkJYXNzZXJ0VmFsdWUoIjMgPWtleSB3aXRoIHNwYWNlIiwgImtleSIpOworCX0KKworCXB1YmxpYyB2b2lkIHRlc3RLZXlzV2l0aE1pc3NpbmdWYWx1ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCVN0cmluZyBpbnB1dCA9ICIiICsgImtleVdpdGhvdXRWYWx1ZVxyXG4iICsgImtleT12YWx1ZVxyXG4iOworCQlwcm9wZXJ0aWVzID0gcmVhZFByb3BlcnRpZXMoaW5wdXQpOworCQlhc3NlcnRWYWx1ZSgiIiwgImtleVdpdGhvdXRWYWx1ZSIpOworCQlhc3NlcnRWYWx1ZSgidmFsdWUiLCAia2V5Iik7CisJfQorCisJcHJpdmF0ZSB2b2lkIGFzc2VydFZhbHVlKFN0cmluZyBleHBlY3RlZCwgU3RyaW5nIGtleSkgeworCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHByb3BlcnRpZXMuZ2V0KGtleSkpOworCX0KKworCXByaXZhdGUgUHJvcGVydGllcyByZWFkUHJvcGVydGllcyhTdHJpbmcgaW5wdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCVByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBQcm9wZXJ0aWVzKCk7CisJCXByb3BlcnRpZXMubG9hZChuZXcgU3RyaW5nUmVhZGVyKGlucHV0KSk7CisJCXJldHVybiBwcm9wZXJ0aWVzOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3Rlc3RzL29yZy9lY2xpcHNlL25scy91aS90ZXN0cy9SYXdCdW5kbGVUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IvdGVzdHMvb3JnL2VjbGlwc2UvbmxzL3VpL3Rlc3RzL1Jhd0J1bmRsZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzllZTRkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yL3Rlc3RzL29yZy9lY2xpcHNlL25scy91aS90ZXN0cy9SYXdCdW5kbGVUZXN0LmphdmEKQEAgLTAsMCArMSw4NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBTdGVmYW4gTfxja2UgYW5kIG90aGVycy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKgorICogQ29udHJpYnV0b3JzOgorICogICAgIFN0ZWZhbiBN/GNrZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm5scy51aS50ZXN0czsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7CitpbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5wZGUubmxzLmludGVybmFsLnVpLnBhcnNlci5SYXdCdW5kbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UucGRlLm5scy5pbnRlcm5hbC51aS5wYXJzZXIuUmF3QnVuZGxlLkVudHJ5TGluZTsKKworcHVibGljIGNsYXNzIFJhd0J1bmRsZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKwlwcml2YXRlIFJhd0J1bmRsZSByYXdCdW5kbGU7CisKKwlwdWJsaWMgdm9pZCB0ZXN0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGlucHV0ID0gIiAgICMgYSBjb21tZW50IGxpbmVcclxuIgorCQkJCSsgImtleTE9dmFsdWUxXHJcbiIKKwkJCQkrICJrZXkyPWEgdmFsdWUgXFxcclxuIgorCQkJCSsgIiAgICAgb24gdHdvIGxpbmVzXHJcbiIKKwkJCQkrICJrZXkzPWEgdmFsdWUgXFxcclxuIgorCQkJCSsgIiAgICAgIgorCQkJCSsgIiAgICAgd2l0aCBhbiBlbXB0eSBsaW5lIGluIGJldHdlZW5cclxuIjsKKwkJcmF3QnVuZGxlID0gcmVhZFJhd0J1bmRsZShpbnB1dCk7CisJCWFzc2VydFJhd0RhdGEoImtleTE9dmFsdWUxXHJcbiIsICJrZXkxIik7CisJCWFzc2VydFJhd0RhdGEoImtleTI9YSB2YWx1ZSBcXFxyXG4iICsgIiAgICAgb24gdHdvIGxpbmVzXHJcbiIsICJrZXkyIik7CisJCWFzc2VydFJhd0RhdGEoImtleTM9YSB2YWx1ZSBcXFxyXG4iICsgIiAgICAgIiArICIgICAgIHdpdGggYW4gZW1wdHkgbGluZSBpbiBiZXR3ZWVuXHJcbiIsICJrZXkzIik7CisJfQorCisJcHVibGljIHZvaWQgdGVzdEtleXNXaXRoV2hpdGVzcGFjZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCVN0cmluZyBpbnB1dCA9ICIiCisJCQkJKyAia2V5MVx0PWtleSB3aXRoIHRhYlxyXG4iCisJCQkJKyAia2V5XFwgMiA9a2V5IHdpdGggZXNjYXBlZCBzcGFjZVxyXG4iCisJCQkJKyAia2V5IDMgPWtleSB3aXRoIHNwYWNlXHJcbiI7CisJCXJhd0J1bmRsZSA9IHJlYWRSYXdCdW5kbGUoaW5wdXQpOworCQlhc3NlcnRSYXdEYXRhKCJrZXkxXHQ9a2V5IHdpdGggdGFiXHJcbiIsICJrZXkxIik7CisJCWFzc2VydFJhd0RhdGEoImtleVxcIDIgPWtleSB3aXRoIGVzY2FwZWQgc3BhY2VcclxuIiwgImtleSAyIik7CisJCWFzc2VydFJhd0RhdGEoImtleSAzID1rZXkgd2l0aCBzcGFjZVxyXG4iLCAia2V5Iik7CisJfQorCisJcHVibGljIHZvaWQgdGVzdEtleXNXaXRoTWlzc2luZ1ZhbHVlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGlucHV0ID0gImtleVdpdGhvdXRWYWx1ZVxyXG4iICsgImtleT12YWx1ZVxyXG4iOworCQlyYXdCdW5kbGUgPSByZWFkUmF3QnVuZGxlKGlucHV0KTsKKwkJYXNzZXJ0UmF3RGF0YSgia2V5V2l0aG91dFZhbHVlXHJcbiIsICJrZXlXaXRob3V0VmFsdWUiKTsKKwkJYXNzZXJ0UmF3RGF0YSgia2V5PXZhbHVlXHJcbiIsICJrZXkiKTsKKwl9CisKKwlwdWJsaWMgdm9pZCB0ZXN0UHV0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGlucHV0ID0gIiIgKyAia2V5MT12YWx1ZTFcclxuIiArICJrZXkzPXZhbHVlM1xyXG4iOworCQlyYXdCdW5kbGUgPSByZWFkUmF3QnVuZGxlKGlucHV0KTsKKwkJcmF3QnVuZGxlLnB1dCgia2V5MiIsICJ2YWx1ZTIiKTsKKwkJcmF3QnVuZGxlLnB1dCgia2V5NCIsICJ2YWx1ZTQiKTsKKwkJcmF3QnVuZGxlLnB1dCgia2V5MCIsICJ2YWx1ZTBcXFx0Iik7CisJCVN0cmluZ1dyaXRlciBzdHJpbmdXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisJCXJhd0J1bmRsZS53cml0ZVRvKHN0cmluZ1dyaXRlcik7CisJCWFzc2VydEVxdWFscygiIgorCQkJCSsgImtleTA9dmFsdWUwXFxcXFxcdFxyXG4iCisJCQkJKyAia2V5MT12YWx1ZTFcclxuIgorCQkJCSsgImtleTI9dmFsdWUyXHJcbiIKKwkJCQkrICJrZXkzPXZhbHVlM1xyXG4iCisJCQkJKyAia2V5ND12YWx1ZTRcclxuIiwgc3RyaW5nV3JpdGVyLnRvU3RyaW5nKCkpOworCisJfQorCQorCXByaXZhdGUgdm9pZCBhc3NlcnRSYXdEYXRhKFN0cmluZyBleHBlY3RlZCwgU3RyaW5nIGtleSkgeworCQlFbnRyeUxpbmUgZW50cnlMaW5lID0gcmF3QnVuZGxlLmdldEVudHJ5TGluZShrZXkpOworCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIGVudHJ5TGluZS5nZXRSYXdEYXRhKCkpOworCX0KKworCXByaXZhdGUgUmF3QnVuZGxlIHJlYWRSYXdCdW5kbGUoU3RyaW5nIGlucHV0KSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlyZXR1cm4gUmF3QnVuZGxlLmNyZWF0ZUZyb20obmV3IFN0cmluZ1JlYWRlcihpbnB1dCkpOworCX0KKworfQo=