cGFja2FnZSBvcmcuYXBhY2hlLnR1cmJpbmUuc2VydmljZXMuc2VydmxldDsKCi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKICoKICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwogKiByZXNlcnZlZC4KICoKICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwogKiBhcmUgbWV0OgogKgogKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAogKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCiAqCiAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CiAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgogKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCiAqICAgIGRpc3RyaWJ1dGlvbi4KICoKICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCiAqICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CiAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQogKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAogKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgogKgogKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgYW5kCiAqICAgICJBcGFjaGUgVHVyYmluZSIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvcgogKiAgICB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgogKgogKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIiwKICogICAgIkFwYWNoZSBUdXJiaW5lIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dAogKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogKgogKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECiAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCiAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCiAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAogKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCiAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAogKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCiAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgogKiBTVUNIIERBTUFHRS4KICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICoKICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCiAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQogKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCiAqLwoKaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CmltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CmltcG9ydCBqYXZhLm5ldC5VUkw7CmltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb25maWc7CmltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0OwoKaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7CmltcG9ydCBvcmcuYXBhY2hlLnR1cmJpbmUuVHVyYmluZTsKaW1wb3J0IG9yZy5hcGFjaGUudHVyYmluZS5zZXJ2aWNlcy5UdXJiaW5lQmFzZVNlcnZpY2U7CmltcG9ydCBvcmcuYXBhY2hlLnR1cmJpbmUudXRpbC5TZXJ2bGV0VXRpbHM7CgovKioKICogPHA+VGhpcyBjbGFzcyBwcm92aWRlcyBhIGNvbnRleHQgc2VydmljZSB3aGVuIHRoZSBhcHBsaWNhdGlvbgogKiBpcyBydW4gaW4gYSBTZXJ2bGV0Q29udGFpbmVyLiBJdCBpcyBtYWlubHkgYSB3cmFwcGVyIGFyb3VuZAogKiB0aGUgU2VydmxldENvbnRleHQgQVBJLjwvcD4KICogPHA+VGhpcyBjbGFzcyByZXF1aXJlcyBTZXJ2bGV0IEFQSSAyLjEgb3IgYmV0dGVyLjwvcD4KICoKICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86YnVydG9uQGFwYWNoZS5vcmciPktldmluIEEuIEJ1cnRvbjwvYT4KICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86cmFwaGFlbEBhcGFjaGUub3JnIj5SYXBoYetsIEx1dGE8L2E+CiAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmVra2VyYmpAbmV0c2NhcGUubmV0Ij5KZWZmIEJyZWtrZTwvYT4KICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86c2dhbGFAaGlzaXRlY2guY29tIj5TYW50aWFnbyBHYWxhPC9hPgogKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqdmFuenlsQHBlcmlhcHQuY29tLmNvbSI+SmFzb24gdmFuIFp5bDwvYT4KICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86am9uQGxhdGNoa2V5LmNvbSI+Sm9uIFMuIFN0ZXZlbnM8L2E+CiAqIEB2ZXJzaW9uICRJZCQKICovCnB1YmxpYyBjbGFzcyBUdXJiaW5lU2VydmxldFNlcnZpY2UKICAgICAgICBleHRlbmRzIFR1cmJpbmVCYXNlU2VydmljZSBpbXBsZW1lbnRzIFNlcnZsZXRTZXJ2aWNlCnsKICAgIC8qKiBMb2dnaW5nICovCiAgICBwcml2YXRlIHN0YXRpYyBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coVHVyYmluZVNlcnZsZXRTZXJ2aWNlLmNsYXNzKTsKCiAgICAvKiogVGhlIHNlcnZsZXQgY29udGV4dCBmb3IgdGhpcyBzZXJ2bGV0ICovCiAgICBwcml2YXRlIFNlcnZsZXRDb250ZXh0IHNlcnZsZXRDb250ZXh0ID0gbnVsbDsKCiAgICAvKiogVGhlIHNlcnZsZXQgY29uZmlndXJhdGlvbiBmb3IgdGhpcyBzZXJ2bGV0ICovCiAgICBwcml2YXRlIFNlcnZsZXRDb25maWcgc2VydmxldENvbmZpZyA9IG51bGw7CgogICAgLyoqCiAgICAgKiBMb2FkIGFsbCBjb25maWd1cmVkIGNvbXBvbmVudHMgYW5kIGluaXRpYWxpemUgdGhlbS4gVGhpcyBpcwogICAgICogYSB6ZXJvIHBhcmFtZXRlciB2YXJpYW50IHdoaWNoIHF1ZXJpZXMgdGhlIFR1cmJpbmUgU2VydmxldAogICAgICogZm9yIGl0cyBjb25maWcuCiAgICAgKi8KICAgIHB1YmxpYyB2b2lkIGluaXQoKQogICAgewogICAgICAgIHRoaXMuc2VydmxldENvbmZpZyA9IFR1cmJpbmUuZ2V0VHVyYmluZVNlcnZsZXRDb25maWcoKTsKICAgICAgICB0cnkKICAgICAgICB7CiAgICAgICAgICAgIHRoaXMuc2VydmxldENvbnRleHQgPSBzZXJ2bGV0Q29uZmlnLmdldFNlcnZsZXRDb250ZXh0KCk7CgogICAgICAgICAgICBsb2cuZGVidWcoIkluaXRpYWxpemluZyB3aXRoIFNlcnZsZXRDb25maWciKTsKICAgICAgICB9CiAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQogICAgICAgIHsKICAgICAgICAgICAgbG9nLmVycm9yKCJDYW5ub3QgaW5pdGlhbGl6ZSBUdXJiaW5lU2VydmxldFNlcnZpY2UuIiwgZSk7CiAgICAgICAgfQogICAgICAgIHNldEluaXQodHJ1ZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDYWxsZWQgZHVyaW5nIFR1cmJpbmUuaW5pdCgpCiAgICAgKgogICAgICogQHBhcmFtIHNlcnZsZXRDb25maWcgQSBTZXJ2bGV0Q29uZmlnLgogICAgICoKICAgICAqIEBkZXByZWNhdGVkIHVzZSBpbml0KCkgaW5zdGVhZC4KICAgICAqLwogICAgcHVibGljIHZvaWQgaW5pdChTZXJ2bGV0Q29uZmlnIHNlcnZsZXRDb25maWcpCiAgICB7CiAgICAgICAgaW5pdCgpOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyBhbiBVUkwgb2JqZWN0IGZvciBhIGdpdmVuIFVSSSBzdHJpbmcuCiAgICAgKiBUaGlzIFVSSSBpcyBjb25zaWRlcmVkIHJlbGF0aXZlIHRvIHRoZSBjb250ZXh0LgogICAgICoKICAgICAqIEBzZWUgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dCNnZXRSZXNvdXJjZQogICAgICogQHBhcmFtIHVyaSB0aGUgVVJJIHRvIHJlc29sdmUgYXMgYW4gVVJMCiAgICAgKiBAcmV0dXJuIGFuIFVSTCBvYmplY3Qgb3IgbnVsbCBpcyB0aGUgdXJpIGlzIG1hbGZvcm1lZCBvcgogICAgICogY2FuJ3QgYmUgcmVzb2x2ZWQKICAgICAqLwogICAgcHVibGljIFVSTCBnZXRSZXNvdXJjZShTdHJpbmcgdXJpKQogICAgewogICAgICAgIGlmIChzZXJ2bGV0Q29udGV4dCA9PSBudWxsKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgICAgICBVUkwgdXJsID0gbnVsbDsKCiAgICAgICAgdHJ5CiAgICAgICAgewogICAgICAgICAgICB1cmwgPSBnZXRTZXJ2bGV0Q29udGV4dCgpLmdldFJlc291cmNlKHVyaSk7CiAgICAgICAgICAgIC8vIHdvcmstYXJvdW5kIGZvciBXZWJzcGhlcmUgMy41MgogICAgICAgICAgICBpZiAodXJsICE9IG51bGwgJiYgdXJsLnRvU3RyaW5nKCkuc3RhcnRzV2l0aCgiY2xhc3Nsb2FkZXI6IikpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHVybCA9IG5ldyBVUkwoImZpbGU6IiArIHVybC50b1N0cmluZygpLnN1YnN0cmluZygxMikpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHVybCA9PSBudWxsKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB1cmwgPSBuZXcgVVJMKCJmaWxlOiIgKyBnZXRTZXJ2bGV0Q29udGV4dCgpLmdldFJlYWxQYXRoKHVyaSkpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkKICAgICAgICB7CiAgICAgICAgICAgIC8vaWYgdGhlIFVSTCBpcyB3cm9uZywgcmV0dXJuIG51bGwKICAgICAgICB9CgogICAgICAgIHJldHVybiB1cmw7CiAgICB9CgogICAgLyoqCiAgICAgKiBTYW1lIGFzIGdldFJlc291cmNlIGV4Y2VwdCB0aGF0IGl0IHJldHVybnMgYW4gSW5wdXRTdHJlYW0KICAgICAqCiAgICAgKiBAc2VlIGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHQjZ2V0UmVzb3VyY2VBc1N0cmVhbQogICAgICogQHBhcmFtIHVyaSB0aGUgVVJJIHRvIHJlc29sdmUKICAgICAqIEByZXR1cm4gYW4gSW5wdXRTdHJlYW0gb24gdGhlIFVSSSBjb250ZW50IG9yIG51bGwKICAgICAqLwogICAgcHVibGljIElucHV0U3RyZWFtIGdldFJlc291cmNlQXNTdHJlYW0oU3RyaW5nIHVyaSkKICAgIHsKICAgICAgICBpZiAoc2VydmxldENvbnRleHQgPT0gbnVsbCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KCiAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBudWxsOwogICAgICAgIGlzID0gc2VydmxldENvbnRleHQuZ2V0UmVzb3VyY2VBc1N0cmVhbSh1cmkpOwogICAgICAgIHJldHVybiBpczsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGNvbXBsZXRlIGZpbGVzeXN0ZW0gcGF0aCBmb3IgYQogICAgICogZ2l2ZW4gVVJJCiAgICAgKgogICAgICogQHNlZSBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0I2dldFJlYWxQYXRoCiAgICAgKiBAcGFyYW0gdXJpIHRoZSBVUkkgdG8gcmVzb2x2ZQogICAgICogQHJldHVybiB0aGUgZnVsbCBzeXN0ZW0gcGF0aCBvZiB0aGlzIFVSSQogICAgICovCiAgICBwdWJsaWMgU3RyaW5nIGdldFJlYWxQYXRoKFN0cmluZyB1cmkpCiAgICB7CiAgICAgICAgaWYgKGdldFNlcnZsZXRDb250ZXh0KCkgPT0gbnVsbCB8fCB1cmkgPT0gbnVsbCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gZ2V0U2VydmxldENvbnRleHQoKS5nZXRSZWFsUGF0aCh1cmkpOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHNlcnZsZXQgY29uZmlnIHVzZWQgYnkgdGhpcwogICAgICogVHVyYmluZSB3ZWIgYXBwbGljYXRpb24uCiAgICAgKgogICAgICogQHJldHVybiB0dXJiaW5lIHNlcnZsZXQgY29uZmlnCiAgICAgKi8KICAgIHB1YmxpYyBTZXJ2bGV0Q29uZmlnIGdldFNlcnZsZXRDb25maWcoKQogICAgewogICAgICAgIHJldHVybiBzZXJ2bGV0Q29uZmlnOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgc2VydmxldCBjb250ZXh0IHVzZWQgYnkgdGhpcwogICAgICogVHVyYmluZSB3ZWIgYXBwbGljYXRpb24uCiAgICAgKgogICAgICogQHJldHVybiB0dXJiaW5lIHNlcnZsZXQgY29udGV4dAogICAgICovCiAgICBwdWJsaWMgU2VydmxldENvbnRleHQgZ2V0U2VydmxldENvbnRleHQoKQogICAgewogICAgICAgIHJldHVybiBzZXJ2bGV0Q29udGV4dDsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHNlcnZlciBzY2hlbWUgZm9yIHRoaXMKICAgICAqIFR1cmJpbmUgYXBwbGljYXRpb24uIFRoaXMgd2lsbCBlaXRoZXIKICAgICAqIGJlIGh0dHAgb3IgaHR0cHMuCiAgICAgKgogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgcHVibGljIFN0cmluZyBnZXRTZXJ2ZXJTY2hlbWUoKQogICAgewogICAgICAgIHJldHVybiBUdXJiaW5lLmdldFNlcnZlclNjaGVtZSgpOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgc2VydmVyIG5hbWUgdGhhdCB0aGlzCiAgICAgKiBUdXJiaW5lIGFwcGxpY2F0aW9uIGlzIHJ1bm5pbmcKICAgICAqIG9uLgogICAgICoKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmVyTmFtZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIFR1cmJpbmUuZ2V0U2VydmVyTmFtZSgpOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgcG9ydCB0aGF0IHRoaXMgVHVyYmluZQogICAgICogYXBwbGljYXRpb24gaXMgcnVubmluZyB0aHJvdWdoCiAgICAgKiBvbiB0aGUgc2VydmVyLgogICAgICoKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmVyUG9ydCgpCiAgICB7CiAgICAgICAgcmV0dXJuIFR1cmJpbmUuZ2V0U2VydmVyUG9ydCgpOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgY29udGV4dCBwYXRoIGZvciB0aGlzCiAgICAgKiBUdXJiaW5lIGFwcGxpY2F0aW9uLgogICAgICoKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGV4dFBhdGgoKQogICAgewogICAgICAgIHJldHVybiBUdXJiaW5lLmdldENvbnRleHRQYXRoKCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBFeHBhbmRzIGEgc3RyaW5nIHRoYXQgcG9pbnRzIHRvIGEgcmVsYXRpdmUgcGF0aCBvciBwYXRoIGxpc3QsCiAgICAgKiBsZWF2aW5nIGl0IGFzIGFuIGFic29sdXRlIHBhdGggYmFzZWQgb24gdGhlIHNlcnZsZXQgY29udGV4dC4KICAgICAqIEl0IHdpbGwgcmV0dXJuIG51bGwgaWYgdGhlIHRleHQgaXMgZW1wdHkgb3IgdGhlIGNvbmZpZyBvYmplY3QKICAgICAqIGlzIG51bGwuCiAgICAgKgogICAgICogQHBhcmFtIHBhdGggVGhlIFN0cmluZyBjb250YWluaW5nIGEgcGF0aCBvciBwYXRoIGxpc3QuCiAgICAgKiBAcmV0dXJuIEEgU3RyaW5nIHdpdGggdGhlIGV4cGFuZGVkIHBhdGggb3IgcGF0aCBsaXN0LgogICAgICovCiAgICBwdWJsaWMgU3RyaW5nIGV4cGFuZFJlbGF0aXZlKFN0cmluZyBwYXRoKQogICAgewogICAgICAgIHJldHVybiBTZXJ2bGV0VXRpbHMuZXhwYW5kUmVsYXRpdmUoZ2V0U2VydmxldENvbmZpZygpLCBwYXRoKTsKICAgIH0KfQo=