cGFja2FnZSBvcmcub3BlbmZsb3cucHJvdG9jb2wubWF0Y2g7CgppbXBvcnQgb3JnLm9wZW5mbG93LnByb3RvY29sLk9GT2JqZWN0OwppbXBvcnQgb3JnLm9wZW5mbG93LnR5cGVzLk1hc2tlZDsKaW1wb3J0IG9yZy5vcGVuZmxvdy50eXBlcy5PRlZhbHVlVHlwZTsKCnB1YmxpYyBpbnRlcmZhY2UgTWF0Y2ggZXh0ZW5kcyBPRk9iamVjdCB7CiAgICAKICAgIC8qCiAgICAgKiBQcmVjb25kaXRpb25zCiAgICAgKiBPbiBwcmVjb25kaXRpb25zIChmcm9tIHRoZSBPRjEuMSBzcGVjLCBwYWdlIDI4LCB0aGUgT0YxLjAgc3BlYyBmYWlsZWQgdG8gZXhwbGljaXRseSAKICAgICAqIHNwZWNpZnkgdGhpcywgYnV0IGl0IGlzIHRoZSBiZWhhdmlvciBvZiBPZjEuMCBzd2l0Y2hlcyk6CiAgICAgKiBQcm90b2NvbC1zcGVjaWZpYyBmaWVsZHMgd2l0aGluIG9mcF9tYXRjaCB3aWxsIGJlIGlnbm9yZWQgd2l0aGluIGEgc2luZ2xlIHRhYmxlIHdoZW4gCiAgICAgKiB0aGUgY29ycmVzcG9uZGluZyBwcm90b2NvbCBpcyBub3Qgc3BlY2lmaWVkIGluIHRoZSBtYXRjaC4gVGhlIE1QTFMgbWF0Y2ggZmllbGRzIHdpbGwgCiAgICAgKiBiZSBpZ25vcmVkIHVubGVzcyB0aGUgRXRoZXJ0eXBlIGlzIHNwZWNpZmllZCBhcyBNUExTLiBMaWtld2lzZSwgdGhlIElQIGhlYWRlciBhbmQgCiAgICAgKiB0cmFuc3BvcnQgaGVhZGVyIGZpZWxkcyB3aWxsIGJlIGlnbm9yZWQgdW5sZXNzIHRoZSBFdGhlcnR5cGUgaXMgc3BlY2lmaWVkIGFzIGVpdGhlciAKICAgICAqIElQdjQgb3IgQVJQLiBUaGUgdHBfc3JjIGFuZCB0cF9kc3QgZmllbGRzIHdpbGwgYmUgaWdub3JlZCB1bmxlc3MgdGhlIG5ldHdvcmsgcHJvdG9jb2wgCiAgICAgKiBzcGVjaWZpZWQgaXMgYXMgVENQLCBVRFAgb3IgU0NUUC4gRmllbGRzIHRoYXQgYXJlIGlnbm9yZWQgZG9u1XQgbmVlZCB0byBiZSB3aWxkY2FyZGVkIAogICAgICogYW5kIHNob3VsZCBiZSBzZXQgdG8gMC4KICAgICAqLwogICAgCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHZhbHVlIGZvciB0aGUgZ2l2ZW4gZmllbGQgZnJvbSB0aGlzIG1hdGNoLgogICAgICogCiAgICAgKiBAcGFyYW0gZmllbGQgTWF0Y2ggZmllbGQgdG8gcmV0cmlldmUKICAgICAqIEByZXR1cm4gVmFsdWUgb2YgbWF0Y2ggZmllbGQKICAgICAqLwogICAgcHVibGljIDxGIGV4dGVuZHMgT0ZWYWx1ZVR5cGU8Rj4+IEYgZ2V0KE1hdGNoRmllbGQ8Rj4gZmllbGQpIHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbjsKCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIG1hc2tlZCB2YWx1ZSBmb3IgdGhlIGdpdmVuIGZpZWxkIGZyb20gdGhpcyBtYXRjaC4KICAgICAqIFByZWNvbmRpdGlvbjogZmllbGQgaXMgcGFydGlhbGx5IHdpbGRjYXJkZWQuCiAgICAgKiAKICAgICAqIEBwYXJhbSBmaWVsZCBNYXRjaCBmaWVsZCB0byByZXRyaWV2ZQogICAgICogQHJldHVybiBNYXNrZWQgdmFsdWUgb2YgbWF0Y2ggZmllbGQgb3IgbnVsbCBpZiBubyBtYXNrCiAgICAgKi8KICAgIHB1YmxpYyA8RiBleHRlbmRzIE9GVmFsdWVUeXBlPEY+PiBNYXNrZWQ8Rj4gZ2V0TWFza2VkKE1hdGNoRmllbGQ8Rj4gZmllbGQpIHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbjsKCiAgICAvKioKICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIG1hdGNoIG9iamVjdCBzdXBwb3J0cyB0aGUgZ2l2ZW4gbWF0Y2ggZmllbGQuCiAgICAgKiAKICAgICAqIEBwYXJhbSBmaWVsZCBNYXRjaCBmaWVsZAogICAgICogQHJldHVybiAKICAgICAqLwogICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoTWF0Y2hGaWVsZDw/PiBmaWVsZCk7CgogICAgLyoqCiAgICAgKiB0cnVlIGlmZiBmaWVsZCBzdXBwb3J0cyBhIGJpdG1hc2sgbWFzayB0aGF0IHdpbGRjYXJkcyBwYXJ0IG9mIHRoZSBmaWVsZCAKICAgICAqIChub3RlOiBub3QgYWxsIHBvc3NpYmxlIHZhbHVlcyBvZiB0aGlzIGJpdG1hc2sgaGF2ZSB0byBiZSBhY2NlcHRhYmxlKQogICAgICogCiAgICAgKiBAcGFyYW0gZmllbGQgTWF0Y2ggZmllbGQKICAgICAqIEByZXR1cm4gCiAgICAgKi8KICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzTWFza2VkKE1hdGNoRmllbGQ8Pz4gZmllbGQpOwoKICAgIC8qKgogICAgICogVHJ1ZSBpZmYgdGhpcyBmaWVsZCBpcyBjdXJyZW50bHkgZnVsbHkgc3BlY2lmaWVkIGluIHRoZSBtYXRjaCwgaS5lLiwgdGhlIAogICAgICogbWF0Y2ggd2lsbCBvbmx5IHNlbGVjdCBwYWNrZXRzIHRoYXQgbWF0Y2ggdGhlIGV4YWN0IHZhbHVlIG9mIGdldEZpZWxkKGZpZWxkKS4KICAgICAqIAogICAgICogQHBhcmFtIGZpZWxkIE1hdGNoIGZpZWxkCiAgICAgKiBAcmV0dXJuIAogICAgICovCiAgICBwdWJsaWMgYm9vbGVhbiBpc0V4YWN0KE1hdGNoRmllbGQ8Pz4gZmllbGQpOwoKICAgIC8qKgogICAgICogVHJ1ZSBpZiB0aGlzIGZpZWxkIGlzIGN1cnJlbnRseSBsb2dpY2FsbHkgdW5zcGVjaWZpZWQgaW4gdGhlIG1hdGNoLCBpLmUsIHRoZSAKICAgICAqIHZhbHVlIHJldHVybmVkIGJ5IGdldFZhbHVlKGYpIGhhcyBubyBpbXBhY3Qgb24gd2hldGhlciBhIHBhY2tldCB3aWxsIGJlIHNlbGVjdGVkIAogICAgICogYnkgdGhlIG1hdGNoIG9yIG5vdC4KICAgICAqIAogICAgICogQHBhcmFtIGZpZWxkCiAgICAgKiBAcmV0dXJuCiAgICAgKi8KICAgIHB1YmxpYyBib29sZWFuIGlzRnVsbHlXaWxkY2FyZGVkKE1hdGNoRmllbGQ8Pz4gZmllbGQpOwoKICAgIC8qKgogICAgICogVHJ1ZSBpZiB0aGlzIGZpZWxkIGlzIGN1cnJlbnRseSBwYXJ0aWFsbHkgc3BlY2lmaWVkIGluIHRoZSBtYXRjaCwgaS5lLCB0aGUgCiAgICAgKiBtYXRjaCB3aWxsIHNlbGVjdCBwYWNrZXRzIHRoYXQgbWF0Y2ggKHAudmFsdWUgJiBnZXRNYXNrKGZpZWxkKSkgPT0gZ2V0VmFsdWUoZmllbGQpLgogICAgICogCiAgICAgKiBAcGFyYW0gZmllbGQKICAgICAqIEByZXR1cm4KICAgICAqLwogICAgcHVibGljIGJvb2xlYW4gaXNQYXJ0aWFsbHlNYXNrZWQoTWF0Y2hGaWVsZDw/PiBmaWVsZCk7CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgYnVpbGRlciB0byBidWlsZCBuZXcgaW5zdGFuY2VzIG9mIHRoaXMgdHlwZSBvZiBtYXRjaCBvYmplY3QuCiAgICAgKiBAcmV0dXJuIE1hdGNoIGJ1aWxkZXIKICAgICAqLwogICAgcHVibGljIE1hdGNoQnVpbGRlciBnZXRCdWlsZGVyKCk7Cn0K