LyoqCiAqIENvcHlyaWdodCAoYykgMjAxNyBDRUEgTElTVC4KICogCiAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAogKiAKICogQ29udHJpYnV0b3JzOgogKiAgIFPpYmFzdGllbiBHZXJhcmQgKENFQSBMSVNUKSA8c2ViYXN0aWVuLmdlcmFyZEBjZWEuZnI+IC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqICAgWXVwYW5xdWkgTXVub3ogSnVsaG8gKENFQSBMSVNUKSA8eXVwYW5xdWkubXVub3pqdWxob0BjZWEuZnI+IC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqIAogKi8KcGFja2FnZSBvcmcuZWNsaXBzZS5wYXB5cnVzLnJlcXVpcmVtZW50cy5zeXNtbDE0LnBhcHlydXNyZS5tb2RlbGxpYnJhcnkucGFweXJ1c3Jlc3RhbmRhcmR1dGlscy5yZXF1aXJlbWVudGFuZHByb2Nlc3Njb25jZXJuczsKCmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUVudW07CmltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7CgovKioKICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KICogVGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGUgbW9kZWwuCiAqIEl0IGNvbnRhaW5zIGFjY2Vzc29ycyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0byByZXByZXNlbnQKICogPHVsPgogKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+CiAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+CiAqICAgPGxpPmVhY2ggb3BlcmF0aW9uIG9mIGVhY2ggY2xhc3MsPC9saT4KICogICA8bGk+ZWFjaCBlbnVtLDwvbGk+CiAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+CiAqIDwvdWw+CiAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogKiBAc2VlIG9yZy5lY2xpcHNlLnBhcHlydXMucmVxdWlyZW1lbnRzLnN5c21sMTQucGFweXJ1c3JlLm1vZGVsbGlicmFyeS5wYXB5cnVzcmVzdGFuZGFyZHV0aWxzLnJlcXVpcmVtZW50YW5kcHJvY2Vzc2NvbmNlcm5zLlJlcXVpcmVtZW50QW5kUHJvY2Vzc0NvbmNlcm5zRmFjdG9yeQogKiBAbW9kZWwga2luZD0icGFja2FnZSIKICogICAgICAgIGFubm90YXRpb249Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdW1sMi8yLjAuMC9VTUwgb3JpZ2luYWxOYW1lPSdSZXF1aXJlbWVudEFuZFByb2Nlc3NDb25jZXJucyciCiAqIEBnZW5lcmF0ZWQKICovCnB1YmxpYyBpbnRlcmZhY2UgUmVxdWlyZW1lbnRBbmRQcm9jZXNzQ29uY2VybnNQYWNrYWdlIGV4dGVuZHMgRVBhY2thZ2UgewoJLyoqCgkgKiBUaGUgcGFja2FnZSBuYW1lLgoJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgoJICogQGdlbmVyYXRlZAoJICovCglTdHJpbmcgZU5BTUUgPSAicmVxdWlyZW1lbnRhbmRwcm9jZXNzY29uY2VybnMiOyAvLyROT04tTkxTLTEkCgoJLyoqCgkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgVVJJLgoJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgoJICogQGdlbmVyYXRlZAoJICovCglTdHJpbmcgZU5TX1VSSSA9ICJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3BhcHlydXMvcmVxdWlyZW1lbnRzL3N5c21sMTQvMC43LjAvUGFweXJ1c1JFL01vZGVsTGlicmFyeS9QYXB5cnVzUkVTdGFuZGFyZFV0aWxzL1JlcXVpcmVtZW50QW5kUHJvY2Vzc0NvbmNlcm5zIjsgLy8kTk9OLU5MUy0xJAoKCS8qKgoJICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIG5hbWUuCgkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgoJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CgkgKiBAZ2VuZXJhdGVkCgkgKi8KCVN0cmluZyBlTlNfUFJFRklYID0gIlJlcXVpcmVtZW50QW5kUHJvY2Vzc0NvbmNlcm5zIjsgLy8kTk9OLU5MUy0xJAoKCS8qKgoJICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgcGFja2FnZS4KCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CgkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KCSAqIEBnZW5lcmF0ZWQKCSAqLwoJUmVxdWlyZW1lbnRBbmRQcm9jZXNzQ29uY2VybnNQYWNrYWdlIGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLnBhcHlydXMucmVxdWlyZW1lbnRzLnN5c21sMTQucGFweXJ1c3JlLm1vZGVsbGlicmFyeS5wYXB5cnVzcmVzdGFuZGFyZHV0aWxzLnJlcXVpcmVtZW50YW5kcHJvY2Vzc2NvbmNlcm5zLmltcGwuUmVxdWlyZW1lbnRBbmRQcm9jZXNzQ29uY2VybnNQYWNrYWdlSW1wbC5pbml0KCk7CgoJLyoqCgkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnBhcHlydXMucmVxdWlyZW1lbnRzLnN5c21sMTQucGFweXJ1c3JlLm1vZGVsbGlicmFyeS5wYXB5cnVzcmVzdGFuZGFyZHV0aWxzLnJlcXVpcmVtZW50YW5kcHJvY2Vzc2NvbmNlcm5zLkFncmVlbWVudFN0YXR1c0tpbmQgPGVtPkFncmVlbWVudCBTdGF0dXMgS2luZDwvZW0+fScgZW51bS4KCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CgkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KCSAqIEBzZWUgb3JnLmVjbGlwc2UucGFweXJ1cy5yZXF1aXJlbWVudHMuc3lzbWwxNC5wYXB5cnVzcmUubW9kZWxsaWJyYXJ5LnBhcHlydXNyZXN0YW5kYXJkdXRpbHMucmVxdWlyZW1lbnRhbmRwcm9jZXNzY29uY2VybnMuQWdyZWVtZW50U3RhdHVzS2luZAoJICogQHNlZSBvcmcuZWNsaXBzZS5wYXB5cnVzLnJlcXVpcmVtZW50cy5zeXNtbDE0LnBhcHlydXNyZS5tb2RlbGxpYnJhcnkucGFweXJ1c3Jlc3RhbmRhcmR1dGlscy5yZXF1aXJlbWVudGFuZHByb2Nlc3Njb25jZXJucy5pbXBsLlJlcXVpcmVtZW50QW5kUHJvY2Vzc0NvbmNlcm5zUGFja2FnZUltcGwjZ2V0QWdyZWVtZW50U3RhdHVzS2luZCgpCgkgKiBAZ2VuZXJhdGVkCgkgKi8KCWludCBBR1JFRU1FTlRfU1RBVFVTX0tJTkQgPSAwOwoKCS8qKgoJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5wYXB5cnVzLnJlcXVpcmVtZW50cy5zeXNtbDE0LnBhcHlydXNyZS5tb2RlbGxpYnJhcnkucGFweXJ1c3Jlc3RhbmRhcmR1dGlscy5yZXF1aXJlbWVudGFuZHByb2Nlc3Njb25jZXJucy5RdWFsaWZpY2F0aW9uU3RhdHVzS2luZCA8ZW0+UXVhbGlmaWNhdGlvbiBTdGF0dXMgS2luZDwvZW0+fScgZW51bS4KCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CgkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KCSAqIEBzZWUgb3JnLmVjbGlwc2UucGFweXJ1cy5yZXF1aXJlbWVudHMuc3lzbWwxNC5wYXB5cnVzcmUubW9kZWxsaWJyYXJ5LnBhcHlydXNyZXN0YW5kYXJkdXRpbHMucmVxdWlyZW1lbnRhbmRwcm9jZXNzY29uY2VybnMuUXVhbGlmaWNhdGlvblN0YXR1c0tpbmQKCSAqIEBzZWUgb3JnLmVjbGlwc2UucGFweXJ1cy5yZXF1aXJlbWVudHMuc3lzbWwxNC5wYXB5cnVzcmUubW9kZWxsaWJyYXJ5LnBhcHlydXNyZXN0YW5kYXJkdXRpbHMucmVxdWlyZW1lbnRhbmRwcm9jZXNzY29uY2VybnMuaW1wbC5SZXF1aXJlbWVudEFuZFByb2Nlc3NDb25jZXJuc1BhY2thZ2VJbXBsI2dldFF1YWxpZmljYXRpb25TdGF0dXNLaW5kKCkKCSAqIEBnZW5lcmF0ZWQKCSAqLwoJaW50IFFVQUxJRklDQVRJT05fU1RBVFVTX0tJTkQgPSAxOwoKCS8qKgoJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5wYXB5cnVzLnJlcXVpcmVtZW50cy5zeXNtbDE0LnBhcHlydXNyZS5tb2RlbGxpYnJhcnkucGFweXJ1c3Jlc3RhbmRhcmR1dGlscy5yZXF1aXJlbWVudGFuZHByb2Nlc3Njb25jZXJucy5TYXRpc2ZhY3Rpb25TdGF0dXNLaW5kIDxlbT5TYXRpc2ZhY3Rpb24gU3RhdHVzIEtpbmQ8L2VtPn0nIGVudW0uCgkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgoJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CgkgKiBAc2VlIG9yZy5lY2xpcHNlLnBhcHlydXMucmVxdWlyZW1lbnRzLnN5c21sMTQucGFweXJ1c3JlLm1vZGVsbGlicmFyeS5wYXB5cnVzcmVzdGFuZGFyZHV0aWxzLnJlcXVpcmVtZW50YW5kcHJvY2Vzc2NvbmNlcm5zLlNhdGlzZmFjdGlvblN0YXR1c0tpbmQKCSAqIEBzZWUgb3JnLmVjbGlwc2UucGFweXJ1cy5yZXF1aXJlbWVudHMuc3lzbWwxNC5wYXB5cnVzcmUubW9kZWxsaWJyYXJ5LnBhcHlydXNyZXN0YW5kYXJkdXRpbHMucmVxdWlyZW1lbnRhbmRwcm9jZXNzY29uY2VybnMuaW1wbC5SZXF1aXJlbWVudEFuZFByb2Nlc3NDb25jZXJuc1BhY2thZ2VJbXBsI2dldFNhdGlzZmFjdGlvblN0YXR1c0tpbmQoKQoJICogQGdlbmVyYXRlZAoJICovCglpbnQgU0FUSVNGQUNUSU9OX1NUQVRVU19LSU5EID0gMjsKCgkvKioKCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UucGFweXJ1cy5yZXF1aXJlbWVudHMuc3lzbWwxNC5wYXB5cnVzcmUubW9kZWxsaWJyYXJ5LnBhcHlydXNyZXN0YW5kYXJkdXRpbHMucmVxdWlyZW1lbnRhbmRwcm9jZXNzY29uY2VybnMuUmV2aWV3U3RhdHVzS2luZCA8ZW0+UmV2aWV3IFN0YXR1cyBLaW5kPC9lbT59JyBlbnVtLgoJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgoJICogQHNlZSBvcmcuZWNsaXBzZS5wYXB5cnVzLnJlcXVpcmVtZW50cy5zeXNtbDE0LnBhcHlydXNyZS5tb2RlbGxpYnJhcnkucGFweXJ1c3Jlc3RhbmRhcmR1dGlscy5yZXF1aXJlbWVudGFuZHByb2Nlc3Njb25jZXJucy5SZXZpZXdTdGF0dXNLaW5kCgkgKiBAc2VlIG9yZy5lY2xpcHNlLnBhcHlydXMucmVxdWlyZW1lbnRzLnN5c21sMTQucGFweXJ1c3JlLm1vZGVsbGlicmFyeS5wYXB5cnVzcmVzdGFuZGFyZHV0aWxzLnJlcXVpcmVtZW50YW5kcHJvY2Vzc2NvbmNlcm5zLmltcGwuUmVxdWlyZW1lbnRBbmRQcm9jZXNzQ29uY2VybnNQYWNrYWdlSW1wbCNnZXRSZXZpZXdTdGF0dXNLaW5kKCkKCSAqIEBnZW5lcmF0ZWQKCSAqLwoJaW50IFJFVklFV19TVEFUVVNfS0lORCA9IDM7CgoKCS8qKgoJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJ3tAbGluayBvcmcuZWNsaXBzZS5wYXB5cnVzLnJlcXVpcmVtZW50cy5zeXNtbDE0LnBhcHlydXNyZS5tb2RlbGxpYnJhcnkucGFweXJ1c3Jlc3RhbmRhcmR1dGlscy5yZXF1aXJlbWVudGFuZHByb2Nlc3Njb25jZXJucy5BZ3JlZW1lbnRTdGF0dXNLaW5kIDxlbT5BZ3JlZW1lbnQgU3RhdHVzIEtpbmQ8L2VtPn0nLgoJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgoJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJzxlbT5BZ3JlZW1lbnQgU3RhdHVzIEtpbmQ8L2VtPicuCgkgKiBAc2VlIG9yZy5lY2xpcHNlLnBhcHlydXMucmVxdWlyZW1lbnRzLnN5c21sMTQucGFweXJ1c3JlLm1vZGVsbGlicmFyeS5wYXB5cnVzcmVzdGFuZGFyZHV0aWxzLnJlcXVpcmVtZW50YW5kcHJvY2Vzc2NvbmNlcm5zLkFncmVlbWVudFN0YXR1c0tpbmQKCSAqIEBnZW5lcmF0ZWQKCSAqLwoJRUVudW0gZ2V0QWdyZWVtZW50U3RhdHVzS2luZCgpOwoKCS8qKgoJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJ3tAbGluayBvcmcuZWNsaXBzZS5wYXB5cnVzLnJlcXVpcmVtZW50cy5zeXNtbDE0LnBhcHlydXNyZS5tb2RlbGxpYnJhcnkucGFweXJ1c3Jlc3RhbmRhcmR1dGlscy5yZXF1aXJlbWVudGFuZHByb2Nlc3Njb25jZXJucy5RdWFsaWZpY2F0aW9uU3RhdHVzS2luZCA8ZW0+UXVhbGlmaWNhdGlvbiBTdGF0dXMgS2luZDwvZW0+fScuCgkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgoJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CgkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAnPGVtPlF1YWxpZmljYXRpb24gU3RhdHVzIEtpbmQ8L2VtPicuCgkgKiBAc2VlIG9yZy5lY2xpcHNlLnBhcHlydXMucmVxdWlyZW1lbnRzLnN5c21sMTQucGFweXJ1c3JlLm1vZGVsbGlicmFyeS5wYXB5cnVzcmVzdGFuZGFyZHV0aWxzLnJlcXVpcmVtZW50YW5kcHJvY2Vzc2NvbmNlcm5zLlF1YWxpZmljYXRpb25TdGF0dXNLaW5kCgkgKiBAZ2VuZXJhdGVkCgkgKi8KCUVFbnVtIGdldFF1YWxpZmljYXRpb25TdGF0dXNLaW5kKCk7CgoJLyoqCgkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAne0BsaW5rIG9yZy5lY2xpcHNlLnBhcHlydXMucmVxdWlyZW1lbnRzLnN5c21sMTQucGFweXJ1c3JlLm1vZGVsbGlicmFyeS5wYXB5cnVzcmVzdGFuZGFyZHV0aWxzLnJlcXVpcmVtZW50YW5kcHJvY2Vzc2NvbmNlcm5zLlNhdGlzZmFjdGlvblN0YXR1c0tpbmQgPGVtPlNhdGlzZmFjdGlvbiBTdGF0dXMgS2luZDwvZW0+fScuCgkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgoJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CgkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAnPGVtPlNhdGlzZmFjdGlvbiBTdGF0dXMgS2luZDwvZW0+Jy4KCSAqIEBzZWUgb3JnLmVjbGlwc2UucGFweXJ1cy5yZXF1aXJlbWVudHMuc3lzbWwxNC5wYXB5cnVzcmUubW9kZWxsaWJyYXJ5LnBhcHlydXNyZXN0YW5kYXJkdXRpbHMucmVxdWlyZW1lbnRhbmRwcm9jZXNzY29uY2VybnMuU2F0aXNmYWN0aW9uU3RhdHVzS2luZAoJICogQGdlbmVyYXRlZAoJICovCglFRW51bSBnZXRTYXRpc2ZhY3Rpb25TdGF0dXNLaW5kKCk7CgoJLyoqCgkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAne0BsaW5rIG9yZy5lY2xpcHNlLnBhcHlydXMucmVxdWlyZW1lbnRzLnN5c21sMTQucGFweXJ1c3JlLm1vZGVsbGlicmFyeS5wYXB5cnVzcmVzdGFuZGFyZHV0aWxzLnJlcXVpcmVtZW50YW5kcHJvY2Vzc2NvbmNlcm5zLlJldmlld1N0YXR1c0tpbmQgPGVtPlJldmlldyBTdGF0dXMgS2luZDwvZW0+fScuCgkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgoJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CgkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAnPGVtPlJldmlldyBTdGF0dXMgS2luZDwvZW0+Jy4KCSAqIEBzZWUgb3JnLmVjbGlwc2UucGFweXJ1cy5yZXF1aXJlbWVudHMuc3lzbWwxNC5wYXB5cnVzcmUubW9kZWxsaWJyYXJ5LnBhcHlydXNyZXN0YW5kYXJkdXRpbHMucmVxdWlyZW1lbnRhbmRwcm9jZXNzY29uY2VybnMuUmV2aWV3U3RhdHVzS2luZAoJICogQGdlbmVyYXRlZAoJICovCglFRW51bSBnZXRSZXZpZXdTdGF0dXNLaW5kKCk7CgoJLyoqCgkgKiBSZXR1cm5zIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CgkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KCSAqIEByZXR1cm4gdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgoJICogQGdlbmVyYXRlZAoJICovCglSZXF1aXJlbWVudEFuZFByb2Nlc3NDb25jZXJuc0ZhY3RvcnkgZ2V0UmVxdWlyZW1lbnRBbmRQcm9jZXNzQ29uY2VybnNGYWN0b3J5KCk7CgoJLyoqCgkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgoJICogRGVmaW5lcyBsaXRlcmFscyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0aGF0IHJlcHJlc2VudAoJICogPHVsPgoJICogICA8bGk+ZWFjaCBjbGFzcyw8L2xpPgoJICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KCSAqICAgPGxpPmVhY2ggb3BlcmF0aW9uIG9mIGVhY2ggY2xhc3MsPC9saT4KCSAqICAgPGxpPmVhY2ggZW51bSw8L2xpPgoJICogICA8bGk+YW5kIGVhY2ggZGF0YSB0eXBlPC9saT4KCSAqIDwvdWw+CgkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KCSAqIEBnZW5lcmF0ZWQKCSAqLwoJaW50ZXJmYWNlIExpdGVyYWxzIHsKCQkvKioKCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UucGFweXJ1cy5yZXF1aXJlbWVudHMuc3lzbWwxNC5wYXB5cnVzcmUubW9kZWxsaWJyYXJ5LnBhcHlydXNyZXN0YW5kYXJkdXRpbHMucmVxdWlyZW1lbnRhbmRwcm9jZXNzY29uY2VybnMuQWdyZWVtZW50U3RhdHVzS2luZCA8ZW0+QWdyZWVtZW50IFN0YXR1cyBLaW5kPC9lbT59JyBlbnVtLgoJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CgkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CgkJICogQHNlZSBvcmcuZWNsaXBzZS5wYXB5cnVzLnJlcXVpcmVtZW50cy5zeXNtbDE0LnBhcHlydXNyZS5tb2RlbGxpYnJhcnkucGFweXJ1c3Jlc3RhbmRhcmR1dGlscy5yZXF1aXJlbWVudGFuZHByb2Nlc3Njb25jZXJucy5BZ3JlZW1lbnRTdGF0dXNLaW5kCgkJICogQHNlZSBvcmcuZWNsaXBzZS5wYXB5cnVzLnJlcXVpcmVtZW50cy5zeXNtbDE0LnBhcHlydXNyZS5tb2RlbGxpYnJhcnkucGFweXJ1c3Jlc3RhbmRhcmR1dGlscy5yZXF1aXJlbWVudGFuZHByb2Nlc3Njb25jZXJucy5pbXBsLlJlcXVpcmVtZW50QW5kUHJvY2Vzc0NvbmNlcm5zUGFja2FnZUltcGwjZ2V0QWdyZWVtZW50U3RhdHVzS2luZCgpCgkJICogQGdlbmVyYXRlZAoJCSAqLwoJCUVFbnVtIEFHUkVFTUVOVF9TVEFUVVNfS0lORCA9IGVJTlNUQU5DRS5nZXRBZ3JlZW1lbnRTdGF0dXNLaW5kKCk7CgoJCS8qKgoJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5wYXB5cnVzLnJlcXVpcmVtZW50cy5zeXNtbDE0LnBhcHlydXNyZS5tb2RlbGxpYnJhcnkucGFweXJ1c3Jlc3RhbmRhcmR1dGlscy5yZXF1aXJlbWVudGFuZHByb2Nlc3Njb25jZXJucy5RdWFsaWZpY2F0aW9uU3RhdHVzS2luZCA8ZW0+UXVhbGlmaWNhdGlvbiBTdGF0dXMgS2luZDwvZW0+fScgZW51bS4KCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgoJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgoJCSAqIEBzZWUgb3JnLmVjbGlwc2UucGFweXJ1cy5yZXF1aXJlbWVudHMuc3lzbWwxNC5wYXB5cnVzcmUubW9kZWxsaWJyYXJ5LnBhcHlydXNyZXN0YW5kYXJkdXRpbHMucmVxdWlyZW1lbnRhbmRwcm9jZXNzY29uY2VybnMuUXVhbGlmaWNhdGlvblN0YXR1c0tpbmQKCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnBhcHlydXMucmVxdWlyZW1lbnRzLnN5c21sMTQucGFweXJ1c3JlLm1vZGVsbGlicmFyeS5wYXB5cnVzcmVzdGFuZGFyZHV0aWxzLnJlcXVpcmVtZW50YW5kcHJvY2Vzc2NvbmNlcm5zLmltcGwuUmVxdWlyZW1lbnRBbmRQcm9jZXNzQ29uY2VybnNQYWNrYWdlSW1wbCNnZXRRdWFsaWZpY2F0aW9uU3RhdHVzS2luZCgpCgkJICogQGdlbmVyYXRlZAoJCSAqLwoJCUVFbnVtIFFVQUxJRklDQVRJT05fU1RBVFVTX0tJTkQgPSBlSU5TVEFOQ0UuZ2V0UXVhbGlmaWNhdGlvblN0YXR1c0tpbmQoKTsKCgkJLyoqCgkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnBhcHlydXMucmVxdWlyZW1lbnRzLnN5c21sMTQucGFweXJ1c3JlLm1vZGVsbGlicmFyeS5wYXB5cnVzcmVzdGFuZGFyZHV0aWxzLnJlcXVpcmVtZW50YW5kcHJvY2Vzc2NvbmNlcm5zLlNhdGlzZmFjdGlvblN0YXR1c0tpbmQgPGVtPlNhdGlzZmFjdGlvbiBTdGF0dXMgS2luZDwvZW0+fScgZW51bS4KCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgoJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgoJCSAqIEBzZWUgb3JnLmVjbGlwc2UucGFweXJ1cy5yZXF1aXJlbWVudHMuc3lzbWwxNC5wYXB5cnVzcmUubW9kZWxsaWJyYXJ5LnBhcHlydXNyZXN0YW5kYXJkdXRpbHMucmVxdWlyZW1lbnRhbmRwcm9jZXNzY29uY2VybnMuU2F0aXNmYWN0aW9uU3RhdHVzS2luZAoJCSAqIEBzZWUgb3JnLmVjbGlwc2UucGFweXJ1cy5yZXF1aXJlbWVudHMuc3lzbWwxNC5wYXB5cnVzcmUubW9kZWxsaWJyYXJ5LnBhcHlydXNyZXN0YW5kYXJkdXRpbHMucmVxdWlyZW1lbnRhbmRwcm9jZXNzY29uY2VybnMuaW1wbC5SZXF1aXJlbWVudEFuZFByb2Nlc3NDb25jZXJuc1BhY2thZ2VJbXBsI2dldFNhdGlzZmFjdGlvblN0YXR1c0tpbmQoKQoJCSAqIEBnZW5lcmF0ZWQKCQkgKi8KCQlFRW51bSBTQVRJU0ZBQ1RJT05fU1RBVFVTX0tJTkQgPSBlSU5TVEFOQ0UuZ2V0U2F0aXNmYWN0aW9uU3RhdHVzS2luZCgpOwoKCQkvKioKCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UucGFweXJ1cy5yZXF1aXJlbWVudHMuc3lzbWwxNC5wYXB5cnVzcmUubW9kZWxsaWJyYXJ5LnBhcHlydXNyZXN0YW5kYXJkdXRpbHMucmVxdWlyZW1lbnRhbmRwcm9jZXNzY29uY2VybnMuUmV2aWV3U3RhdHVzS2luZCA8ZW0+UmV2aWV3IFN0YXR1cyBLaW5kPC9lbT59JyBlbnVtLgoJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CgkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CgkJICogQHNlZSBvcmcuZWNsaXBzZS5wYXB5cnVzLnJlcXVpcmVtZW50cy5zeXNtbDE0LnBhcHlydXNyZS5tb2RlbGxpYnJhcnkucGFweXJ1c3Jlc3RhbmRhcmR1dGlscy5yZXF1aXJlbWVudGFuZHByb2Nlc3Njb25jZXJucy5SZXZpZXdTdGF0dXNLaW5kCgkJICogQHNlZSBvcmcuZWNsaXBzZS5wYXB5cnVzLnJlcXVpcmVtZW50cy5zeXNtbDE0LnBhcHlydXNyZS5tb2RlbGxpYnJhcnkucGFweXJ1c3Jlc3RhbmRhcmR1dGlscy5yZXF1aXJlbWVudGFuZHByb2Nlc3Njb25jZXJucy5pbXBsLlJlcXVpcmVtZW50QW5kUHJvY2Vzc0NvbmNlcm5zUGFja2FnZUltcGwjZ2V0UmV2aWV3U3RhdHVzS2luZCgpCgkJICogQGdlbmVyYXRlZAoJCSAqLwoJCUVFbnVtIFJFVklFV19TVEFUVVNfS0lORCA9IGVJTlNUQU5DRS5nZXRSZXZpZXdTdGF0dXNLaW5kKCk7CgoJfQoKfSAvL1JlcXVpcmVtZW50QW5kUHJvY2Vzc0NvbmNlcm5zUGFja2FnZQo=