LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCqAqCiAqIENvbnRyaWJ1dG9yczoKICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmU7CgppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7CmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLyoqCiAqIEEgd29ya2luZyBjb3B5IHNlcnZlciBvYmplY3QgdXNlZCBmb3IgZm9ybXVsYXRpbmcgY2hhbmdlcwogKiB0byBhIHNlcnZlciBpbnN0YW5jZSAoe0BsaW5rIElTZXJ2ZXJ9KS4KICogPHA+CiAqIFtpc3N1ZTogVGhlIGRlZmF1bHQgdmFsdWUgb2YgcnVudGltZSBzaG91bGQgYmUgc3BlY2lmaWVkCiAqIGhlcmUgKG9yIGluIElTZXJ2ZXJUeXBlLmNyZWF0ZVNlcnZlcikuIElmIHRoZSBpbml0aWFsIHZhbHVlIGlzIG51bGwgKG9yCiAqIHNvbWV0aGluZyBzaW11bGFybHkgdW5zdWl0YWJsZSBmb3IgYWN0dWFsIHVzZSksIHRoZW4gSVNlcnZlci5nZXRSdW50aW1lCiAqIG5lZWRzIHRvIGJlIHNwZWMnZCB0byBhbGxvdyBudWxsIHJldHVybiAoaXQgZG9lcyksIGFuZCBzYXZlIG5lZWRzIHRvIGRlYWwKICogd2l0aCB0aGUgY2FzZSB3aGVyZSB0aGUgY2xpZW50IGZvcmdldHMgdG8gaW5pdGlhbGl6ZSB0aGlzIHByb3BlcnR5Ll0KICogPC9wPgogKiA8cD4KICogW2lzc3VlOiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiBzZXJ2ZXIgY29uZmlndXJhdGlvbiBzaG91bGQgYmUgc3BlY2lmaWVkCiAqIGhlcmUgKG9yIGluIElTZXJ2ZXJUeXBlLmNyZWF0ZVNlcnZlcikuIElmIHRoZSBpbml0aWFsIHZhbHVlIGlzIG51bGwgKG9yCiAqIHNvbWV0aGluZyBzaW11bGFybHkgdW5zdWl0YWJsZSBmb3IgYWN0dWFsIHVzZSksIHRoZW4KICogSVNlcnZlci5nZXRTZXJ2ZXJDb25maWd1cmF0aW9uIG5lZWRzIHRvIGJlIHNwZWMnZCB0byBhbGxvdyBudWxsIHJldHVybgogKiAoaXQgZG9lcyksIGFuZCBzYXZlIG5lZWRzIHRvIGRlYWwgd2l0aCB0aGUgY2FzZSB3aGVyZSB0aGUgY2xpZW50IGZvcmdldHMKICogdG8gaW5pdGlhbGl6ZSB0aGlzIHByb3BlcnR5Ll0KICogPC9wPgogKiA8cD4KICogW2lzc3VlOiBJRWxlbWVudFdvcmtpbmdDb3B5IGFuZCBJRWxlbWVudCBzdXBwb3J0IGFuIG9wZW4tZW5kZWQgc2V0CiAqIG9mIGF0dHJpYnV0ZS12YWx1ZSBwYWlycy4gV2hhdCBpcyByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGVzZQogKiBhdHRyaWJ1dGVzIGFuZCAoYSkgdGhlIGdldC9zZXRYWFggbWV0aG9kcyBmb3VuZCBvbiB0aGlzIGludGVyZmFjZSwKICogYW5kIChiKSBnZXQvc2V0WFhYIG1ldGhvZHMgcHJvdmlkZWQgYnkgc3BlY2lmaWMgc2VydmVyIHR5cGVzPwogKiBJcyBpdCB0aGUgY2FzZSB0aGF0IHRoZXNlIGF0dHJpYnV0ZS12YWx1ZXMgcGFpcnMgYXJlIHRoZSBvbmx5CiAqIGluZm9ybWF0aW9uIGFib3V0IGEgc2VydmVyIGluc3RhbmNlIHRoYXQgY2FuIGJlIHByZXNlcnZlZAogKiBiZXR3ZWVuIHdvcmtiZW5jaCBzZXNzaW9ucz8gVGhhdCBpcywgYW55IGluZm9ybWF0aW9uIHJlY29yZGVkCiAqIGp1c3QgaW4gaW5zdGFuY2UgZmllbGRzIG9mIGFuIFNlcnZlckRlbGVnYXRlIGltcGxlbWVudGF0aW9uCiAqIHdpbGwgYmUgbG9zdCB3aGVuIHRoZSBzZXNzaW9uIGVuZHMuXQogKiA8L3A+CiAqIDxwPgogKiBbaXNzdWU6IEl0IHNlZW1zIHN0cmFuZ2UgdGhhdCBJU2VydmVyV29ya2luZ0NvcHkgZXh0ZW5kcyBJU2VydmVyLCB3aGljaAogKiBoYXMgYWxsIHNvcnRzIG9mIG1ldGhvZCBmb3Igc3RhcnRpbmcgYW5kIHN0b3BwaW5nIHRoZSBzZXJ2ZXIsIG5vbmUgb2YKICogd2hpY2ggYXJlIHJlbGV2YW50IHRvIHdvcmtpbmcgY29waWVzLiBJdCBzaG91bGQgYmUgY2hhbmdlZCBzbwogKiB0aGF0IElTZXJ2ZXJXb3JraW5nQ29weSBkb2VzIG5vdCBleHRlbmQgSVNlcnZlci4gVGhpcyB3aWxsIHJlcXVpcmVzCiAqIGNvcHlpbmcgZ2V0dGVycyBmcm9tIElTZXJ2ZXIgdG8gSVNlcnZlcldvcmtpbmdDb3B5IHRvIG1ha2UgaXQKICogc2VsZi1zdWZmaWNpZW50OiBnZXRIb3N0bmFtZSwgZ2V0U2VydmVyQ29uZmlndXJhdGlvbiwgZ2V0UnVudGltZSwgZ2V0SWQsCiAqIGdldEZpbGUsIGdldFNlcnZlclR5cGUsIGV0Yy5dCiAqIDwvcD4KICogPHA+VGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuPC9wPgogKiA8cD4KICogPGl0PkNhdmVhdDogVGhlIHNlcnZlciBjb3JlIEFQSSBpcyBzdGlsbCBpbiBhbiBlYXJseSBmb3JtLCBhbmQgaXMKICogbGlrZWx5IHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSB0aGUgaW5pdGlhbCByZWxlYXNlLjwvaXQ+CiAqIDwvcD4KICogCiAqIEBzaW5jZSAxLjAKICovCnB1YmxpYyBpbnRlcmZhY2UgSVNlcnZlcldvcmtpbmdDb3B5IGV4dGVuZHMgSVNlcnZlckF0dHJpYnV0ZXMsIElFbGVtZW50V29ya2luZ0NvcHkgewoJLyoqCgkgKiBTZXRzIHRoZSBzZXJ2ZXIgY29uZmlndXJhdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhpcyBzZXJ2ZXIgd29ya2luZyBjb3B5LgoJICogPHA+CgkgKiBOb3RlOiBUaGUgc2VydmVyIGNvbmZpZ3VyYXRpb24gb2YgYSBzZXJ2ZXIgd29ya2luZyBjb3B5IG1heQoJICogb3IgbWF5IG5vdCBiZSBhIHdvcmtpbmcgY29weS4KCSAqIDwvcD4KCSAqIDxwPgoJICogW2lzc3VlOiBBY2NvcmRpbmcgdG8gc2VydmVyVHlwZSBleHRlbnNpb24gcG9pbnQsIAoJICogY29uZmlndXJhdGlvblR5cGVJZCBpcyBhbiBvcHRpb25hbCBhdHRyaWJ1dGUuIFdoYXQgaGFwcGVucyBpZiB0aGUKCSAqIHNlcnZlciBjb25maWd1cmF0aW9uIHBhc3NlZCBpcyBudWxsIGJ1dCB0aGUgc2VydmVyIG11c3QgaGF2ZSBhCgkgKiBzZXJ2ZXIgY29uZmlndXJhdGlvbj8gV2hhdCBoYXBwZW5zIG9mIHRoZSBzZXJ2ZXIgY29uZmlndXJhdGlvbgoJICogaGFzIHRoZSB3cm9uZyB0eXBlPyBEbyB0aGUgZXJyb3JzIGdldCBkZXRlY3RlZCBhbmQgcmVwb3J0ZWQgbm93LCBvcgoJICogdXBvbiBzYXZlKCk/XQoJICogPC9wPgoJICogCgkgKiBAcGFyYW0gY29uZmlndXJhdGlvbiB0aGUgc2VydmVyIGNvbmZpZ3VyYXRpb24sIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKCSAqLwoJcHVibGljIHZvaWQgc2V0U2VydmVyQ29uZmlndXJhdGlvbihJRm9sZGVyIGNvbmZpZ3VyYXRpb24pOwoJCgkvKioKCSAqIFJldHVybnMgdGhlIHNlcnZlciBpbnN0YW5jZSB0aGF0IHRoaXMgd29ya2luZyBjb3B5IGlzCgkgKiBhc3NvY2lhdGVkIHdpdGguCgkgKiA8cD4KCSAqIEZvciBhIHNlcnZlciB3b3JraW5nIGNvcHkgY3JlYXRlZCBieSBhIGNhbGwgdG8KCSAqIHtAbGluayBJU2VydmVyI2NyZWF0ZVdvcmtpbmdDb3B5KCl9LAoJICogPGNvZGU+dGhpcy5nZXRPcmlnaW5hbCgpPC9jb2RlPiByZXR1cm5zIHRoZSBvcmlnaW5hbAoJICogc2VydmVyIG9iamVjdC4gRm9yIGEgc2VydmVyIHdvcmtpbmcgY29weSBqdXN0IGNyZWF0ZWQgYnkKCSAqIGEgY2FsbCB0byB7QGxpbmsgSVNlcnZlclR5cGUjY3JlYXRlU2VydmVyKFN0cmluZywgSUZpbGUsIElQcm9ncmVzc01vbml0b3IpfSwKCSAqIDxjb2RlPnRoaXMuZ2V0T3JpZ2luYWwoKTwvY29kZT4gcmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPi4KCSAqIDwvcD4KCSAqIAoJICogQHJldHVybiB0aGUgYXNzb2NpYXRlZCBzZXJ2ZXIgaW5zdGFuY2UsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKCSAqLwoJcHVibGljIElTZXJ2ZXIgZ2V0T3JpZ2luYWwoKTsKCQoJLyoqCgkgKiBSZXR1cm5zIHRoZSBleHRlbnNpb24gZm9yIHRoaXMgc2VydmVyIHdvcmtpbmcgY29weS4KCSAqIFRoZSBzZXJ2ZXIgd29ya2luZyBjb3B5IGV4dGVuc2lvbiBpcyBhCgkgKiBzZXJ2ZXItdHlwZS1zcGVjaWZpYyBvYmplY3QuIEJ5IGNhc3RpbmcgdGhlIHNlcnZlciB3b3JraW5nIGNvcHkKCSAqIGV4dGVuc2lvbiB0byB0aGUgdHlwZSBwcmVzY3JpYmVkIGluIHRoZSBBUEkgZG9jdW1lbnRhdGlvbiBmb3IgdGhhdAoJICogcGFydGljdWxhciBzZXJ2ZXIgd29ya2luZyBjb3B5IHR5cGUsIHRoZSBjbGllbnQgY2FuIGFjY2VzcwoJICogc2VydmVyLXR5cGUtc3BlY2lmaWMgcHJvcGVydGllcyBhbmQgbWV0aG9kcy4KCSAqIAoJICogQHJldHVybiB0aGUgZXh0ZW5zaW9uIGZvciB0aGUgc2VydmVyIHdvcmtpbmcgY29weQoJICovCgkvL3B1YmxpYyBJU2VydmVyRXh0ZW5zaW9uIGdldFdvcmtpbmdDb3B5RXh0ZW5zaW9uKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcik7CgoJLyoqCgkgKiBDb21taXRzIHRoZSBjaGFuZ2VzIG1hZGUgaW4gdGhpcyB3b3JraW5nIGNvcHkuIElmIHRoZXJlIGlzCgkgKiBubyBleHRhbnQgc2VydmVyIGluc3RhbmNlIHdpdGggYSBtYXRjaGluZyBpZCBhbmQgc2VydmVyCgkgKiB0eXBlLCB0aGlzIHdpbGwgY3JlYXRlIGEgc2VydmVyIGluc3RhbmNlIHdpdGggYXR0cmlidXRlcwoJICogdGFrZW4gZnJvbSB0aGlzIHdvcmtpbmcgY29weS4gSWYgdGhlcmUgYW4gZXhpc3Rpbmcgc2VydmVyCgkgKiBpbnN0YW5jZSB3aXRoIGEgbWF0Y2hpbmcgaWQgYW5kIHNlcnZlciB0eXBlLCB0aGlzIHdpbGwKCSAqIGNoYW5nZSB0aGUgc2VydmVyIGluc3RhbmNlIGFjY29yZGluZ2x5LgoJICogPHA+CgkgKiBbaXNzdWU6IFdoYXQgaXMgcmVsYXRpb25zaGlwIHRvIAoJICogdGhpcy5nZXRPcmlnaW5hbCgpIGFuZCB0aGUgSVNlcnZlciByZXR1cm5lZCBieSB0aGlzLnNhdmUoKT8KCSAqIFRoZSBhbnN3ZXIgc2hvdWxkIGJlOiB0aGV5J3JlIHRoZSBzYW1lIHNlcnZlciwgZm9yIGFuCgkgKiBhcHByb3ByaWF0ZSBub3Rpb24gb2YgInNhbWUiLiBBcyBjdXJyZW50bHkgaW1wbGVtZW50ZWQsIHRoZXkKCSAqIGFyZSBkaWZmZXJlbnQgSVNlcnZlciBpbnN0YW5jZXMgYnV0IGhhdmUgdGhlIHNhbWUgc2VydmVyCgkgKiBpZCBhbmQgc2FtZSBzZXJ2ZXIgdHlwZXMuIENsaWVuc3QgdGhhdCBhcmUgaGFuZ2luZyBvbiB0bwoJICogdGhlIG9sZCBzZXJ2ZXIgaW5zdGFuY2Ugd2lsbCBub3Qgc2VlIHRoZSBjaGFuZ2VzLiAKCSAqIElmIElTZXJ2ZXIgd2VyZSBzb21lIGtpbmQgb2YgaGFuZGxlIG9iamVjdCBhcyBlbHNld2hlcmUgaW4gCgkgKiBFY2xpcHNlIFBsYXRmb3JtLCB0aGlzIGtpbmQgb2YgY2hhbmdlIGNvdWxkIGJlIGRvbmUgbXVjaAoJICogbW9yZSBzbW9vdGhseS5dCgkgKiA8L3A+CgkgKiA8cD4KCSAqIFtpc3N1ZTogV2hhdCBpcyBsaWZlY3ljbGUgZm9yIFNlcnZlcldvcmtpbmdDb3B5RGVsZWdhdGUKCSAqIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdvcmtpbmcgY29weT9dCgkgKiA8L3A+CgkgKiA8cD4KCSAqIFtpc3N1ZTogU2luY2UgaXQgZG9lcyBub3QgbWFrZSBzZW5zZSB0byBjb21taXQgYSBzZXJ2ZXIKCSAqIHdvcmtpbmcgY29weSB3aXRob3V0IGZpcnN0IGNvbW1pdHRpbmcgYW55IGFzc29jaWF0ZWQKCSAqIHJ1bnRpbWUgYW5kIHNlcnZlciBjb25maWcgd29ya2luZyBjb3BpZXMsIHRoZSBzZW1hbnRpY3MKCSAqIG9mIHNhdmVBbGwgc2hvdWxkIGJlIHBhcnQgYW5kIHBhcmNlbCBvZiB0aGUKCSAqIG5vcm1hbCBzYXZlLCBhbmQgdGhlIHNhdmVBbGwgbWV0aG9kIGVsaW1pbmF0ZWQuXQoJICogPC9wPgoJICogCgkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHByb2dyZXNzCgkgKiAgICByZXBvcnRpbmcgYW5kIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQKCSAqIEByZXR1cm4gYSBuZXcgc2VydmVyIGluc3RhbmNlCgkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gW21pc3NpbmddCgkgKi8KCXB1YmxpYyBJU2VydmVyIHNhdmUoYm9vbGVhbiBmb3JjZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKCgkvKioKCSAqIENvbW1pdHMgdGhlIGNoYW5nZXMgbWFkZSBpbiB0aGlzIHNlcnZlciB3b3JraW5nIGNvcHkgYWZ0ZXIKCSAqIGZpcnN0IGNvbW1pdHRpbmcgYW55IGFzc29jaWF0ZWQgc2VydmVyIGNvbmZpZ3VyYXRpb24gb3IKCSAqIHNlcnZlciBydW50aW1lIHdvcmtpbmcgY29waWVzLgoJICogPHA+CgkgKiBUaGlzIGNvbnZlbmllbmNlIG1ldGhvZCBpcyBlcXVpdmFsZW50IHRvOgoJICogPHByZT4KCSAqIElSdW50aW1lIHJ0ID0gdGhpcy5nZXRSdW50aW1lKCk7CgkgKiBpZiAocnQgIT0gbnVsbCAmJiBydC5pc1dvcmtpbmdDb3B5KCkpIHsKCSAqICAgICgoSVJ1bnRpbWVXb3JraW5nQ29weSkgcnQpLnNhdmUobW9uaXRvcik7CgkgKiB9CgkgKiBJU2VydmVyQ29uZmlndXJhdGlvbiBjZiA9IHRoaXMuZ2V0U2VydmVyQ29uZmlndXJhdGlvbigpOwoJICogaWYgKGNmICE9IG51bGwgJiYgY2YuaXNXb3JraW5nQ29weSgpKSB7CgkgKiAgICAoKElTZXJ2ZXJDb25maWd1cmF0aW9uV29ya2luZ0NvcHkpIGNmKS5zYXZlKG1vbml0b3IpOwoJICogfQoJICogcmV0dXJuIHNhdmUobW9uaXRvcik7CgkgKiA8L3ByZT4KCSAqIDwvcD4KCSAqIDxwPgoJICogW2lzc3VlOiBTaW5jZSBpdCBkb2VzIG5vdCBtYWtlIHNlbnNlIHRvIGNvbW1pdCBhIHNlcnZlcgoJICogd29ya2luZyBjb3B5IHdpdGhvdXQgZmlyc3QgY29tbWl0dGluZyBhbnkgYXNzb2NpYXRlZAoJICogcnVudGltZSBhbmQgc2VydmVyIGNvbmZpZyB3b3JraW5nIGNvcGllcywgdGhlIHNlbWFudGljcwoJICogb2YgdGhpcyBvcGVyYXRpb24gc2hvdWxkIGJlIHBhcnQgYW5kIHBhcmNlbCBvZiB0aGUKCSAqIG5vcm1hbCBzYXZlLCBhbmQgdGhlIHNhdmVBbGwgbWV0aG9kIGVsaW1pbmF0ZWQuXQoJICogPC9wPgoJICogCgkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHByb2dyZXNzCgkgKiAgICByZXBvcnRpbmcgYW5kIGNhbmNlbGxhdGlvbiBhcmUgbm90IGRlc2lyZWQKCSAqIEByZXR1cm4gYSBuZXcgc2VydmVyIGluc3RhbmNlCgkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gW21pc3NpbmddCgkgKi8KCXB1YmxpYyBJU2VydmVyIHNhdmVBbGwoYm9vbGVhbiBmb3JjZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKCgkvKioKCSAqIFNldHMgdGhlIGZpbGUgd2hlcmUgdGhpcyBzZXJ2ZXIgaW5zdGFuY2UgaXMgc2VyaWFsaXplZC4KCSAqIAoJICogQHBhcmFtIHRoZSBmaWxlIGluIHRoZSB3b3Jrc3BhY2Ugd2hlcmUgdGhlIHNlcnZlciBpbnN0YW5jZQoJICogaXMgc2VyaWFsaXplZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGluZm9ybWF0aW9uIGlzCgkgKiBpbnN0ZWFkIHRvIGJlIHBlcnNpc3RlZCB3aXRoIHRoZSB3b3Jrc3BhY2UgYnV0IG5vdCB3aXRoIGFueQoJICogcGFydGljdWxhciB3b3Jrc3BhY2UgcmVzb3VyY2UKCSAqLwoJcHVibGljIHZvaWQgc2V0RmlsZShJRmlsZSBmaWxlKTsKCgkvKioKCSAqIFNldHMgdGhlIHJ1bnRpbWUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc2VydmVyIHdvcmtpbmcgY29weS4KCSAqIDxwPgoJICogTm90ZTogVGhlIHJ1bnRpbWUgb2YgYSBzZXJ2ZXIgd29ya2luZyBjb3B5IG1heQoJICogb3IgbWF5IG5vdCBiZSBhIHdvcmtpbmcgY29weS4KCSAqIDwvcD4KCSAqIDxwPgoJICogW2lzc3VlOiBBY2NvcmRpbmcgdG8gc2VydmVyVHlwZSBleHRlbnNpb24gcG9pbnQsIAoJICogcnVudGltZVR5cGVJZCBpcyBhIG1hbmRhdG9yeSBhdHRyaWJ1dGUuIEJ1dCBJU2VydmVyLmdldFJ1bnRpbWUoKQoJICogaXMgYWxsb3dlZCB0byByZXR1cm4gbnVsbCwgc3VnZ2VzdGluZyB0aGF0IGl0IGlzIG9wdGlvbmFsIGZvciBpbnN0YW5jZXMuCgkgKiBXaGF0IGhhcHBlbnMgaWYgdGhlIHJ1bnRpbWUgcGFzc2VkIGlzIG51bGwgYnV0IHRoZSBzZXJ2ZXIgbXVzdAoJICogaGF2ZSBhIHJ1bnRpbWU/IFdoYXQgaGFwcGVucyBpZiB0aGUgcnVudGltZSBoYXMgdGhlIHdyb25nCgkgKiB0eXBlPyBEbyB0aGUgZXJyb3JzIGdldCBkZXRlY3RlZCBhbmQgcmVwb3J0ZWQgbm93LCBvciB1cG9uIHNhdmUoKT9dCgkgKiA8L3A+CgkgKiAKCSAqIEBwYXJhbSBydW50aW1lIHRoZSBydW50aW1lLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCgkgKi8KCXB1YmxpYyB2b2lkIHNldFJ1bnRpbWUoSVJ1bnRpbWUgcnVudGltZSk7CgoJLyoqCgkgKiBDaGFuZ2VzIHRoZSBob3N0IGZvciB0aGUgc2VydmVyLgoJICogVGhlIGZvcm1hdCBvZiB0aGUgaG9zdCBjYW4gYmUgZWl0aGVyIGEgcXVhbGlmaWVkIG9yIHVucXVhbGlmaWVkIGhvc3RuYW1lLAoJICogb3IgYW4gSVAgYWRkcmVzcyBhbmQgbXVzdCBjb25mb3JtIHRvIFJGQyAyNzMyLgoJICogCgkgKiA8cD4KCSAqIFtpc3N1ZTogVGhpcyBpcyBhIHF1ZXN0aW9uYWJsZSBvcGVyYXRpb24gaWYgdGhlcmUgaXMgYSBydW5uaW5nCgkgKiBzZXJ2ZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBvcmlnaW5hbC4gV2hlbiBhIGhvc3QgbmFtZQoJICogY2hhbmdlIGlzIGNvbW1pdHRlZCwgdGhlIHNlcnZlciBpbnN0YW5jZSBsb3NlcyBjb250YWN0IHdpdGgKCSAqIHRoZSBydW5uaW5nIHNlcnZlciBiZWNhdXNlIG9mIHRoZSBob3N0IG5hbWUgY2hhbmdlLl0KCSAqIDwvcD4KCSAqIAoJICogQHBhcmFtIGhvc3QgYSBob3N0IHN0cmluZyBjb25mb3JtaW5nIHRvIFJGQyAyNzMyCgkgKiBAc2VlIElTZXJ2ZXIjZ2V0SG9zdCgpCgkgKiBAc2VlIGphdmEubmV0LlVSTC5nZXRIb3N0KCkKCSAqLwoJcHVibGljIHZvaWQgc2V0SG9zdChTdHJpbmcgaG9zdCk7CgoJLyoqCgkgKiBNb2RpZmllcyB0aGUgbGlzdCBvZiBtb2R1bGVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2VydmVyLgoJICogVGhlIG1vZHVsZXMgaW5jbHVkZWQgaW4gdGhlIDxjb2RlPmFkZDwvY29kZT4gbGlzdAoJICogbXVzdCBleGlzdCBpbiB0aGUgd29ya3NwYWNlIGFuZCBtdXN0IG5vdCBhbHJlYWR5IGJlIGFzc29jaWF0ZWQKCSAqIHdpdGggdGhlIHNlcnZlci4KCSAqIFRoZSBtb2R1bGVzIGluY2x1ZGVkIGluIHRoZSA8Y29kZT5yZW1vdmU8L2NvZGU+IGxpc3QKCSAqIG11c3QgYmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBzZXJ2ZXIsIGJ1dCBtYXkgb3IgbWF5IG5vdCBleGlzdAoJICogaW4gdGhlIHdvcmtzcGFjZS4KCSAqIDxwPgoJICogW2lzc3VlOiBIb3cgdG8gZm9ybXVsYXRlIHdoYXQgaXQgbWVhbnMKCSAqIHRvIHNheSAidGhlIG1vZHVsZSBtdXN0IGV4aXN0IGluIHRoZSB3b3Jrc3BhY2UiP10KCSAqIDwvcD4KCSAqIDxwPgoJICogW2lzc3VlOiBUaGUgc3BlYyBzaG91bGQgYmUgbW9yZSBsYXguIEF0dGVtcHRpbmcgdG8gYWRkCgkgKiBhIG1vZHVsZSB0aGF0J3MgYWxyZWFkeSBpbmNsdWRlIHNob3VsZCBiZSBxdWlldGx5IGlnbm9yZTsKCSAqIGRpdHRvIHJlbW92aW5nIGEgbW9kdWxlIHRoYXQncyBub3Qgb24gdGhpcyBsaXN0LiBUaGlzCgkgKiBzaW1wbGlmaWVzIHRoZSBoYW5kbGluZyBvZiB2YXJpb3VzIG90aGVyIHdhY2tvIGNhc2VzIAoJICogc3VjaCBhcyBkdXBsaWNhdGlvbiB3aXRoaW4gYW5kIGJldHdlZW4gdGhlIGFkZCBhbmQgcmVtb3ZlCgkgKiBsaXN0cy5dCgkgKiA8L3A+CgkgKiA8cD4KCSAqIFtpc3N1ZTogVGhlIHNwZWMgaGFkIGFsc28gc2FpZDogIi4uLmNhbk1vZGlmeU1vZHVsZXMoKQoJICogc2hvdWxkIGhhdmUgcmV0dXJuZWQgdHJ1ZS4gVGhlIGNvbmZpZ3VyYXRpb24gbXVzdCBhc3N1bWUKCSAqIGFueSBkZWZhdWx0IHNldHRpbmdzIGFuZCBhZGQgdGhlIG1vZHVsZSB3aXRob3V0IGFueSBVSS4iXQoJICogPC9wPgoJICogPHA+CgkgKiBbaXNzdWU6IFdoYXQgZXJyb3IgY2hlY2tpbmcgc2hvdWxkIGJlIHBlcmZvcm1lZCBieSB0aGlzCgkgKiBvcGVyYXRpb24sIGFuZCB3aGF0IG5lZWRzIHRvIGJlIHBlcmZvcm1lZCBieSBzYXZlKCkgaWYKCSAqIHRoZSBjbGllbnQgdHJpZXMgdG8gY29tbWl0IHRoZXNlIGh5cG90aGV0aXNpemVkIGNoYW5nZXM/XQoJICogPC9wPgoJICoKCSAqIEBwYXJhbSBhZGQgYSBwb3NzaWJseS1lbXB0eSBsaXN0IG9mIG1vZHVsZXMgdG8gYWRkCgkgKiBAcGFyYW0gcmVtb3ZlIGEgcG9zc2libHktZW1wdHkgbGlzdCBvZiBtb2R1bGVzIHRvIHJlbW92ZQoJICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwoJICogICAgcmVwb3J0aW5nIGFuZCBjYW5jZWxsYXRpb24gYXJlIG5vdCBkZXNpcmVkCgkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gW21pc3NpbmddCgkgKi8KCXB1YmxpYyB2b2lkIG1vZGlmeU1vZHVsZXMoSU1vZHVsZVtdIGFkZCwgSU1vZHVsZVtdIHJlbW92ZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKfQ==