LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDA0IEV0ZXJhdGlvbiBCaWxpc2ltIEEuUy4KICogQWxsIHJpZ2h0cyByZXNlcnZlZC4goCBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAqIAogKiBDb250cmlidXRvcnM6CiAqICAgICBOYWNpIE0uIERhaSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogKiAKICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAogKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwogKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQogKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgRVRFUkFUSU9OIEEuUy4gT1IKICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAogKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCiAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAogKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCiAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgogKiBTVUNIIERBTUFHRS4KICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICoKICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBFdGVyYXRpb24gQmlsaXNpbSBBLlMuICBGb3IgbW9yZQogKiBpbmZvcm1hdGlvbiBvbiBldGVyYXRpb24sIHBsZWFzZSBzZWUKICogPGh0dHA6Ly93d3cuZXRlcmF0aW9uLmNvbS8+LgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5jb3JlLmludGVybmFsOwoKaW1wb3J0IGphdmEuaW8uRmlsZTsKaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CmltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKaW1wb3J0IGphdmEudXRpbC5NYXA7CmltcG9ydCBvcmcuZWNsaXBzZS5hbnQuY29yZS5BbnRSdW5uZXI7CmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07CmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwppbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLmludGVybmFsLmNvcmUudXRpbC5GaWxlVXRpbDsKaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uTW9kdWxlOwppbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5QdWJsaXNoZXJEYXRhOwppbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlLklFSkJNb2R1bGU7CmltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUuSVdlYk1vZHVsZTsKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlQXJ0aWZhY3Q7CmltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwovKioKICogQW50IGJhc2VkIHB1Ymxpc2hlci4KICogQWxsIHRoZSBwcm9wZXJ0aWVzIGRlZmluZWQgaW4gdGhlIHNlcnZlciBkZWZpbml0aW9uIGZpbGUgYXJlCiAqIHBhc3NlZCBpbnRvIHRoZSBBTlQgYnVpbGQgZmlsZSBhcyBwcm9wZXJ0aWVzLgogKiBJbiBhZGRpdGlvbiB0byB0aGUgcHJvcGVydGllcyBkZWZpbmVkIGluIHRoZSBzZXJ2ZXIgZGVmaW5pdGlvbgogKiA8ST5tb2R1bGUuZGlyPC9JPiwgPEk+bW9kdWxlLm5hbWUsPC9JPiBhbmQgPEk+c2VydmVyLnB1Ymxpc2guZGlyPC9JPiBhcmUgY29tcHV0ZWQgYW5kIHBhc3NlZCB0byB0aGUgCiAqIGRlZmluaXRpb24gZmlsZS4KICogPHVsPgogKiA8bGk+bW9kdWxlLmRpcjogaW5jbHVkZXMgdGhlIHJvb3Qgb2YgdGhlIG1vZHVsZSBwcm9qZWN0IGZpbGU8L2xpPgogKiA8bGk+bW9kdWxlLm5hbWU6IHRoZSBuYW1lIG9mIHRoZSBtb2R1bGU8L2xpPgogKiA8bGk+c2VydmVyLnB1Ymxpc2guZGlyOiB0aGUgZGlyZWN0b3J5IHRvIHB1dCB0aGUgZGVwbG95bWVudCB1bml0czwvbGk+CiAqIDwvdWw+CiAqCiAqIEBhdXRob3IgR29ya2VtIEVyY2FuCiAqLwoKcHVibGljIGNsYXNzIEFudFB1Ymxpc2hlciBleHRlbmRzIEdlbmVyaWNQdWJsaXNoZXJ7CgogICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1PRFVMRV9QVUJMSVNIX1RBUkdFVF9QUkVGSVggPSAidGFyZ2V0LnB1Ymxpc2guIjsKICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RVTEVfVU5QVUJMSVNIX1RBUkdFVF9QUkVGSVggPSAidGFyZ2V0LnVucHVibGlzaC4iOwogICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVCTElTSEVSX0lEPSJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuYW50cHVibGlzaGVyIjsgCiAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFUQV9OQU1FX0JVSUxEX0ZJTEU9ImJ1aWxkLmZpbGUiOwoKICAgIC8qIChub24tSmF2YWRvYykKCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3RwLnNlcnZlci5jb3JlLm1vZGVsLklQdWJsaXNoZXIjcHVibGlzaChvcmcuZWNsaXBzZS53dHAuc2VydmVyLmNvcmUucmVzb3VyY2VzLklNb2R1bGVSZXNvdXJjZVtdLCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKCSAqLwoJcHVibGljIElTdGF0dXNbXSBwdWJsaXNoKElNb2R1bGVBcnRpZmFjdFtdIHJlc291cmNlLAoJCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpewogICAgICAgIAogICAgICAgIEZpbGUgZmlsZSA9IGNvbXB1dGVCdWlsZEZpbGUoKTsKICAgICAgICB0cnl7CiAgICAgICAgICAgIHJ1bkFudChmaWxlLnRvU3RyaW5nKCksZ2V0UHVibGlzaFRhcmdldHNGb3JNb2R1bGUoKSxnZXRQdWJsaXNoUHJvcGVydGllcygpLG1vbml0b3IpOwogICAgICAgIH0KICAgICAgICBjYXRjaChDb3JlRXhjZXB0aW9uIGUpewogICAgICAgICAgICBJU3RhdHVzIHMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsQ29yZVBsdWdpbi5QTFVHSU5fSUQsMCwiUHVibGlzaCBmYWlsZWQgdXNpbmcgQW50IHB1Ymxpc2hlciIsZSk7CiAgICAgICAgICAgIENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZygpLmxvZyhzKTsKICAgICAgICAgICAgcmV0dXJuIG5ldyBJU3RhdHVzW10ge3N9OwogICAgICAgIH0KCQlyZXR1cm4gbnVsbDsKCX0KCgogICAgLyoqCiAgICAgKiBAcmV0dXJuCiAgICAgKi8KICAgIHByaXZhdGUgRmlsZSBjb21wdXRlQnVpbGRGaWxlKCkgewogICAgICAgIEJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoZ2V0U2VydmVyUnVudGltZSgpLmdldENvbmZpZ3VyYXRpb25FbGVtZW50TmFtZXNwYWNlKCkpOwogICAgICAgIEZpbGUgZmlsZSA9IEZpbGVVdGlsLnJlc29sdmVGaWxlRnJvbShidW5kbGUsZ2V0QnVpbGRGaWxlKCkpOwogICAgICAgIHJldHVybiBmaWxlOwogICAgfQogICAgCiAgIAogICAgLyoqCiAgICAgKiBAcmV0dXJuCiAgICAgKi8KICAgIHByaXZhdGUgU3RyaW5nW10gZ2V0UHVibGlzaFRhcmdldHNGb3JNb2R1bGUoKSB7CiAgICAgICAgU3RyaW5nIGRhdGFuYW1lID0gTU9EVUxFX1BVQkxJU0hfVEFSR0VUX1BSRUZJWCtnZXRNb2R1bGVUeXBlSWQoKTsKICAgICAgICByZXR1cm4gZG9HZXRUYXJnZXRzKGRhdGFuYW1lKTsKICAgIH0KCgogICAgLyoqCiAgICAgKiBAcGFyYW0gZGF0YW5hbWUKICAgICAqIEByZXR1cm4KICAgICAqLwogICAgcHJpdmF0ZSBTdHJpbmdbXSBkb0dldFRhcmdldHMoU3RyaW5nIGRhdGFuYW1lKSB7CiAgICAgICAgQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7CiAgICAgICAgSXRlcmF0b3IgaXRlcmF0b3IgPSBnZXRTZXJ2ZXJSdW50aW1lKCkuZ2V0UHVibGlzaGVyKFBVQkxJU0hFUl9JRCkuZ2V0UHVibGlzaGVyZGF0YSgpLml0ZXJhdG9yKCk7CiAgICAgICAgd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKXsKICAgICAgICAgICAgUHVibGlzaGVyRGF0YSBkYXRhID0gKFB1Ymxpc2hlckRhdGEpaXRlcmF0b3IubmV4dCgpOwogICAgICAgICAgICBpZihkYXRhbmFtZS5lcXVhbHMoZGF0YS5nZXREYXRhbmFtZSgpKSkgewogICAgICAgICAgICAgICAgbGlzdC5hZGQoZGF0YS5nZXREYXRhdmFsdWUoKSk7CiAgICAgICAgICAgIH0gICAKICAgICAgICB9CiAgICAgICAgcmV0dXJuIChTdHJpbmdbXSlsaXN0LnRvQXJyYXkobmV3IFN0cmluZ1tsaXN0LnNpemUoKV0pOwogICAgfQoKICAgIC8qKgogICAgICogQHJldHVybgogICAgICovCiAgICBwcml2YXRlIFN0cmluZ1tdIGdldFVucHVibGlzaFRhcmdldHNGb3JNb2R1bGUoKSB7CiAgICAgICAgCiAgICAgICAgcmV0dXJuIGRvR2V0VGFyZ2V0cyhNT0RVTEVfVU5QVUJMSVNIX1RBUkdFVF9QUkVGSVgrZ2V0TW9kdWxlVHlwZUlkKCkpOwogICAgfQogICAgCiAgICAKICAgIHByaXZhdGUgU3RyaW5nIGdldE1vZHVsZVR5cGVJZCgpCiAgICB7CiAgICAgICAgcmV0dXJuIGdldE1vZHVsZSgpWzBdLmdldE1vZHVsZVR5cGUoKS5nZXRJZCgpOwogICAgfQogICAgCglwcml2YXRlIFN0cmluZyBnZXRCdWlsZEZpbGUoKQogICAgewogICAgICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gZ2V0U2VydmVyUnVudGltZSgpLmdldFB1Ymxpc2hlcihQVUJMSVNIRVJfSUQpLmdldFB1Ymxpc2hlcmRhdGEoKS5pdGVyYXRvcigpOwogICAgICAgIHdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkKICAgICAgICB7CiAgICAgICAgICAgIFB1Ymxpc2hlckRhdGEgZGF0YSA9IChQdWJsaXNoZXJEYXRhKWl0ZXJhdG9yLm5leHQoKTsKICAgICAgICAgICAgaWYoREFUQV9OQU1FX0JVSUxEX0ZJTEUuZXF1YWxzKGRhdGEuZ2V0RGF0YW5hbWUoKSkpCiAgICAgICAgICAgICAgICByZXR1cm4gZ2V0U2VydmVyUnVudGltZSgpLmdldFJlc29sdmVyKCkucmVzb2x2ZVByb3BlcnRpZXMoZGF0YS5nZXREYXRhdmFsdWUoKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBudWxsOwogICAgfQoJcHJpdmF0ZSBNYXAgZ2V0UHVibGlzaFByb3BlcnRpZXMoKQoJewogICAgICAgIE1hcCBwcm9wcyA9IG5ldyBIYXNoTWFwKCk7CiAgICAgICAgCiAgICAgICAgLy8gcGFzcyBhbGwgcHJvcGVydGllcyB0byBidWlsZCBmaWxlLgogICAgICAgIE1hcCBwcm9wZXJ0aWVzID0gZ2V0U2VydmVyUnVudGltZSgpLmdldFJlc29sdmVyKCkuZ2V0UHJvcGVydHlWYWx1ZXMoKTsKICAgICAgICBJdGVyYXRvciBwcm9wZXJ0eUl0ZXJhdG9yID0gcHJvcGVydGllcy5rZXlTZXQoKS5pdGVyYXRvcigpOwogICAgICAgIHdoaWxlKHByb3BlcnR5SXRlcmF0b3IuaGFzTmV4dCgpKQogICAgICAgIHsKICAgICAgICAgICAgU3RyaW5nIHByb3BlcnR5ID0gKFN0cmluZylwcm9wZXJ0eUl0ZXJhdG9yLm5leHQoKTsKICAgICAgICAgICAgcHJvcHMucHV0KHByb3BlcnR5LHByb3BlcnRpZXMuZ2V0KHByb3BlcnR5KSk7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIE1vZHVsZSBtb2R1bGUgPSAgZ2V0U2VydmVyUnVudGltZSgpLmdldE1vZHVsZShnZXRNb2R1bGVUeXBlSWQoKSk7CgkJU3RyaW5nIG1vZERpciA9IG1vZHVsZS5nZXRQdWJsaXNoRGlyKCk7CgkJbW9kRGlyID0gZ2V0U2VydmVyUnVudGltZSgpLmdldFJlc29sdmVyKCkucmVzb2x2ZVByb3BlcnRpZXMobW9kRGlyKTsKCgkJSVdlYk1vZHVsZSB3ZWJNb2R1bGUgPSAoSVdlYk1vZHVsZSlnZXRNb2R1bGUoKVswXS5nZXRBZGFwdGVyKElXZWJNb2R1bGUuY2xhc3MpOwogICAgICAgIElFSkJNb2R1bGUgZWpiTW9kdWxlID0gKElFSkJNb2R1bGUpZ2V0TW9kdWxlKClbMF0uZ2V0QWRhcHRlcihJRUpCTW9kdWxlLmNsYXNzKTsKCQlTdHJpbmcgbW9kdWxlTmFtZT0idW5rbm93bm1vZHVsZSI7CiAgICAgICAgU3RyaW5nIG1vZHVsZURpcj0iIjsKICAgICAgICBpZih3ZWJNb2R1bGUhPW51bGwpeyAgICAKICAgICAgICAgICAgbW9kdWxlTmFtZSA9IHRoaXMuZ3Vlc3NNb2R1bGVOYW1lKHdlYk1vZHVsZSk7CiAgICAgICAgICAgIG1vZHVsZURpciA9IHdlYk1vZHVsZS5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCk7CiAgICAgICAgfQogICAgICAgIGlmKGVqYk1vZHVsZSE9bnVsbCl7ICAKICAgICAgICAgICAgbW9kdWxlTmFtZSA9IGdldE1vZHVsZSgpWzBdLmdldE5hbWUoKTsKICAgICAgICAgICAgbW9kdWxlRGlyPSBlamJNb2R1bGUuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpOwogICAgICAgIH0KCQlwcm9wcy5wdXQoIm1vZHVsZS5uYW1lIixtb2R1bGVOYW1lKTsKCQlwcm9wcy5wdXQoIm1vZHVsZS5kaXIiLG1vZHVsZURpcik7CgkJcHJvcHMucHV0KCJzZXJ2ZXIucHVibGlzaC5kaXIiLG1vZERpcik7CgkJcmV0dXJuIHByb3BzOwoJfQoJLyoqCgkgKiBAcGFyYW0gbW9kdWxlMgoJICogQHBhcmFtIHdlYk1vZHVsZQoJICogQHJldHVybgoJICovCglwcml2YXRlIFN0cmluZyBndWVzc01vZHVsZU5hbWUoSVdlYk1vZHVsZSB3ZWJNb2R1bGUpIHsKCQlTdHJpbmcgbW9kdWxlTmFtZSA9IGdldE1vZHVsZSgpWzBdLmdldE5hbWUoKTsgCgkJLy9EZWZhdWx0IHRvIHByb2plY3QgbmFtZSBidXQgbm90IGEgZ29vZCBndWVzcwoJCS8vbWF5IGhhdmUgYmxhbmtzIGV0Yy4KCQkKCQkvLyBBIGJldHRlciBjaG9pY2UgaXMgdG8gdXNlIHRoZSBjb250ZXh0IHJvb3QKCQkvLyBGb3Igd2FycyBtb3N0IGFwcHNlcnZlcnMgdXNlIHRoZSBtb2R1bGUgbmFtZQoJCS8vIGFzIHRoZSBjb250ZXh0IHJvb3QKCQlTdHJpbmcgY29udGV4dFJvb3QgPSB3ZWJNb2R1bGUuZ2V0Q29udGV4dFJvb3QoKTsKCQlpZihjb250ZXh0Um9vdC5jaGFyQXQoMCkgPT0gJy8nKQoJCQltb2R1bGVOYW1lID0gY29udGV4dFJvb3Quc3Vic3RyaW5nKDEpOwoJCXJldHVybiBtb2R1bGVOYW1lOwoJfQoJcHJpdmF0ZSB2b2lkIHJ1bkFudChTdHJpbmcgYnVpbGRGaWxlLFN0cmluZ1tdIHRhcmdldHMsTWFwIHByb3BlcnRpZXMgLElQcm9ncmVzc01vbml0b3IgbW9uaXRvcil0aHJvd3MgQ29yZUV4Y2VwdGlvbgoJewoJCUFudFJ1bm5lciBydW5uZXIgPSBuZXcgQW50UnVubmVyKCk7CgkJcnVubmVyLnNldEJ1aWxkRmlsZUxvY2F0aW9uKGJ1aWxkRmlsZSk7CgkJcnVubmVyLnNldEV4ZWN1dGlvblRhcmdldHModGFyZ2V0cyk7CgkJcnVubmVyLmFkZFVzZXJQcm9wZXJ0aWVzKHByb3BlcnRpZXMpOwoJCXJ1bm5lci5ydW4obW9uaXRvcik7Cgl9CgogICAgLyogKG5vbi1KYXZhZG9jKQogICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuaW50ZXJuYWwuY29yZS5HZW5lcmljUHVibGlzaGVyI3VucHVibGlzaChvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSU1vZHVsZSwgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCiAgICAgKi8KICAgIHB1YmxpYyBJU3RhdHVzW10gdW5wdWJsaXNoKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewogICAgICAgIEZpbGUgZmlsZSA9IGNvbXB1dGVCdWlsZEZpbGUoKTsKICAgICAgICB0cnkgewogICAgICAgICAgICBydW5BbnQoZmlsZS50b1N0cmluZygpLGdldFVucHVibGlzaFRhcmdldHNGb3JNb2R1bGUoKSxnZXRQdWJsaXNoUHJvcGVydGllcygpLG1vbml0b3IpOwogICAgICAgIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewogICAgICAgICAgICBJU3RhdHVzIHMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsQ29yZVBsdWdpbi5QTFVHSU5fSUQsMCwiUmVtb3ZlIG1vZHVsZSBmYWlsZWQgdXNpbmcgQW50IHB1Ymxpc2hlciIsZSk7CiAgICAgICAgICAgIHJldHVybiBuZXcgSVN0YXR1c1tdIHtzfTsKIAogICAgICAgIH0KICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KCgoKfQo=