LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAogKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAqgKgogKiBDb250cmlidXRvcnM6CiAqICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsOwoKaW1wb3J0IGphdmEudXRpbC5EYXRlOwppbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CgppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7CmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07CmltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLk1vbml0b3I7CmltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLlRyYWNlOwovKioKICogUmVwcmVzZW50cyBhIFRDUC9JUCByZXF1ZXN0IG1hZGUgYmV0d2VlbiB0aGUgY2xpZW50IGFuZCB0aGUgc2VydmVyLgogKiBFYWNoIHJlcXVlc3QgcmVwcmVzZW50cyBhIHJlcXVlc3QtcmVzcG9uc2UgcGFpciwgd2hlcmUgdGhlIHJlcXVlc3QKICogaXMgZnJvbSBjbGllbnQgLT4gc2VydmVyLCBhbmQgdGhlIHJlc3BvbnNlIGlzIGZyb20gc2VydmVyIC0+IGNsaWVudC4KICogPHA+CiAqIFJlcXVlc3RzIGFyZSBjcmVhdGVkIGJ5IGEgcnVubmluZyBtb25pdG9yLiBUaGV5IGRvIG5vdCBoYXZlIGEgcmVmZXJlbmNlCiAqIGJhY2sgdG8gdGhlIG1vbml0b3IgYmVjYXVzZSB0aGUgbW9uaXRvciBtYXkgaGF2ZSBiZWVuIGRlbGV0ZWQgb3IgbW9kaWZpZWQKICogc2luY2UgdGhlIHJlcXVlc3Qgd2FzIGNyZWF0ZWQuCiAqIDwvcD4KICogPHA+CiAqIFRoaXMgaW50ZXJmYWNlIGlzIGludGVuZGVkIHRvIGJlIGV4dGVuZGVkIG9ubHkgYnkgY2xpZW50cwogKiB0byBleHRlbmQgdGhlIDxjb2RlPnByb3RvY29sQWRhcHRlcnM8L2NvZGU+IGV4dGVuc2lvbiBwb2ludC4gCiAqIDwvcD4KICogCiAqIEBwbGFubmVkZm9yIDEuMAogKi8KcHVibGljIGNsYXNzIFJlcXVlc3QgaW1wbGVtZW50cyBJQWRhcHRhYmxlIHsKCXByb3RlY3RlZCBNb25pdG9yIG1vbml0b3I7Cglwcm90ZWN0ZWQgRGF0ZSBkYXRlOwoJcHJvdGVjdGVkIGxvbmcgcmVzcG9uc2VUaW1lID0gLTE7Cglwcm90ZWN0ZWQgaW50IGxvY2FsUG9ydDsKCXByb3RlY3RlZCBTdHJpbmcgcmVtb3RlSG9zdDsKCXByb3RlY3RlZCBpbnQgcmVtb3RlUG9ydDsKCXByb3RlY3RlZCBieXRlW10gcmVxdWVzdDsKCXByb3RlY3RlZCBieXRlW10gcmVzcG9uc2U7CgkKCXByb3RlY3RlZCBTdHJpbmcgbmFtZTsKCXByb3RlY3RlZCBTdHJpbmcgcHJvdG9jb2xJZDsKCglwcm90ZWN0ZWQgUHJvcGVydGllcyBwcm9wZXJ0aWVzOwoJCgkvKioKCSAqIFJlcXVlc3QyIGNvbnRlbnQgdHlwZSAodmFsdWUgMSkgZm9yIHRoZSB0cmFuc3BvcnQgKGhlYWRlcikgb2YgYSByZXF1ZXN0CgkgKiBvciByZXNwb25zZS4KCSAqIAoJICogQHNlZSAjZ2V0UmVxdWVzdChpbnQpCgkgKiBAc2VlICNnZXRSZXNwb25zZShpbnQpCgkgKi8KCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRSQU5TUE9SVCA9IDE7CgoJLyoqCgkgKiBSZXF1ZXN0MiBjb250ZW50IHR5cGUgKHZhbHVlIDIpIGZvciB0aGUgY29udGVudCAoYm9keSkgb2YgYSByZXF1ZXN0CgkgKiBvciByZXNwb25zZS4KCSAqIAoJICogQHNlZSAjZ2V0UmVxdWVzdChpbnQpCgkgKiBAc2VlICNnZXRSZXNwb25zZShpbnQpCgkgKi8KCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTlRFTlQgPSAyOwoKCS8qKgoJICogUmVxdWVzdDIgY29udGVudCB0eXBlICh2YWx1ZSAzKSBmb3IgdGhlIGVudGlyZSBjb250ZW50IG9mIGEgcmVxdWVzdAoJICogb3IgcmVzcG9uc2UuCgkgKiAKCSAqIEBzZWUgI2dldFJlcXVlc3QoaW50KQoJICogQHNlZSAjZ2V0UmVzcG9uc2UoaW50KQoJICovCglwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBTEwgPSAzOwoKCS8qKgoJICogQ3JlYXRlIGEgbmV3IFJlcXVlc3QuCgkgKiAKCSAqIEBwYXJhbSBtb25pdG9yIGEgbW9uaXRvcgoJICogQHBhcmFtIHByb3RvY29sSWQgdGhlIHByb3RvY29sIGlkCgkgKiBAcGFyYW0gbG9jYWxQb3J0IGEgbG9jYWwgcG9ydCBudW1iZXIKCSAqIEBwYXJhbSByZW1vdGVIb3N0IGEgcmVtb3RlIGhvc3RuYW1lCgkgKiBAcGFyYW0gcmVtb3RlUG9ydCBhIHJlbW90ZSBwb3J0IG51bWJlcgoJICovCglwdWJsaWMgUmVxdWVzdChNb25pdG9yIG1vbml0b3IsIFN0cmluZyBwcm90b2NvbElkLCBpbnQgbG9jYWxQb3J0LCBTdHJpbmcgcmVtb3RlSG9zdCwgaW50IHJlbW90ZVBvcnQpIHsKCQlzdXBlcigpOwoJCXRoaXMubW9uaXRvciA9IG1vbml0b3I7CgkJdGhpcy5wcm90b2NvbElkID0gcHJvdG9jb2xJZDsKCQl0aGlzLmxvY2FsUG9ydCA9IGxvY2FsUG9ydDsKCQl0aGlzLnJlbW90ZUhvc3QgPSByZW1vdGVIb3N0OwoJCXRoaXMucmVtb3RlUG9ydCA9IHJlbW90ZVBvcnQ7CgkJZGF0ZSA9IG5ldyBEYXRlKCk7CgkJcHJvcGVydGllcyA9IG5ldyBQcm9wZXJ0aWVzKCk7CgkJaWYgKG1vbml0b3IgIT0gbnVsbCkKCQkJbW9uaXRvci5hZGRSZXF1ZXN0KHRoaXMpOwoJfQoKCS8qKgoJICogUmV0dXJucyB0aGUgcHJvdG9jb2wgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIHRoaXMgcmVxdWVzdC4KCSAqIAoJICogQHJldHVybiB0aGUgcHJvdG9jb2wgaWQKCSAqLwoJcHVibGljIFN0cmluZyBnZXRQcm90b2NvbCgpIHsKCQlyZXR1cm4gcHJvdG9jb2xJZDsKCX0KCgkvKioKCSAqIFJldHVybnMgdGhlIHRpbWUgdGhpcyByZXF1ZXN0IHdhcyBtYWRlLgoJICoKCSAqIEByZXR1cm4gdGhlIHRpbWVzdGFtcAoJICovCglwdWJsaWMgRGF0ZSBnZXREYXRlKCkgewoJCXJldHVybiBkYXRlOwoJfQoKCS8qKgoJICogUmV0dXJucyB0aGUgbG9jYWwgKGNsaWVudCkgcG9ydC4KCSAqCgkgKiBAcmV0dXJuIHRoZSBsb2NhbCBwb3J0IG51bWJlcgoJICovCglwdWJsaWMgaW50IGdldExvY2FsUG9ydCgpIHsKCQlyZXR1cm4gbG9jYWxQb3J0OwoJfQoKCS8qKgoJICogUmV0dXJucyB0aGUgcmVtb3RlIChzZXJ2ZXIpIGhvc3QuCgkgKgoJICogQHJldHVybiB0aGUgcmVtb3RlIGhvc3QKCSAqLwoJcHVibGljIFN0cmluZyBnZXRSZW1vdGVIb3N0KCkgewoJCXJldHVybiByZW1vdGVIb3N0OwoJfQoKCS8qKgoJICogUmV0dXJucyB0aGUgcmVtb3RlIChzZXJ2ZXIpIHBvcnQuCgkgKgoJICogQHJldHVybiB0aGUgcmVtb3RlIHBvcnQgbnVtYmVyCgkgKi8KCXB1YmxpYyBpbnQgZ2V0UmVtb3RlUG9ydCgpIHsKCQlyZXR1cm4gcmVtb3RlUG9ydDsKCX0KCgkvKioKCSAqIFJldHVybnMgdGhlIHNlbGVjdGVkIGNvbnRlbnQgb2YgdGhlIHJlcXVlc3QgcG9ydGlvbiBvZiB0aGlzIHJlcXVlc3QuCgkgKiA8cD4KCSAqIFtpc3N1ZTogSSBkb24ndCBrbm93IGhvdyB0byBleHBsYWluIHRoaXMuIEZvciBiYXNpYyBUQ1AvSVAgcmVxdWVzdHMsCgkgKiBkaXN0aW5jdGlvbiBiZXR3ZWVuIHRyYW5zcG9ydCBhbmQgY29udGVudCBpcyBpZ25vcmVkLgoJICogRm9yIEhUVFAgcmVxdWVzdHMsIHRoaXMgVFJBTlNQT1JUIHJldHVybnMganVzdCB0aGUgSFRUUCBoZWFkZXIgYW5kIAoJICogQ09OVEVOVCByZXR1cm5zIGp1c3QgdGhlIEhUVFAgYm9keSB3aXRob3V0IHRoZSBoZWFkZXJzLiBXaGF0IHdvdWxkCgkgKiBpdCBtZWFuIGZvciBvdGhlciBwcm90b2NvbHM/CgkgKiA8L3A+CgkgKgoJICogQHBhcmFtIHR5cGUgdGhlIGNvbnRlbnQgdHlwZTogb25lIG9mIHtAbGluayAjVFJBTlNQT1JUfSwKCSAqICAgIHtAbGluayAjQ09OVEVOVH0sIG9yIHtAbGluayAjQUxMfQoJICogQHJldHVybiB0aGUgY29udGVudCBieXRlcwoJICovCglwdWJsaWMgYnl0ZVtdIGdldFJlcXVlc3QoaW50IHR5cGUpIHsKCQlyZXR1cm4gcmVxdWVzdDsKCX0KCgkvKioKCSAqIFJldHVybnMgdGhlIHNlbGVjdGVkIGNvbnRlbnQgb2YgdGhlIHJlc3BvbnNlIHBvcnRpb24gb2YgdGhpcyByZXF1ZXN0LgoJICogPHA+CgkgKiBbaXNzdWU6IEkgZG9uJ3Qga25vdyBob3cgdG8gZXhwbGFpbiB0aGlzLiBGb3IgYmFzaWMgVENQL0lQIHJlcXVlc3RzLAoJICogZGlzdGluY3Rpb24gYmV0d2VlbiB0cmFuc3BvcnQgYW5kIGNvbnRlbnQgaXMgaWdub3JlZC4KCSAqIEZvciBIVFRQIHJlcXVlc3RzLCB0aGlzIFRSQU5TUE9SVCByZXR1cm5zIGp1c3QgdGhlIEhUVFAgaGVhZGVyIGFuZCAKCSAqIENPTlRFTlQgcmV0dXJucyBqdXN0IHRoZSBIVFRQIGJvZHkgd2l0aG91dCB0aGUgaGVhZGVycy4gV2hhdCB3b3VsZAoJICogaXQgbWVhbiBmb3Igb3RoZXIgcHJvdG9jb2xzP10KCSAqIDwvcD4KCSAqCgkgKiBAcGFyYW0gdHlwZSB0aGUgY29udGVudCB0eXBlOiBvbmUgb2Yge0BsaW5rICNUUkFOU1BPUlR9LAoJICogICAge0BsaW5rICNDT05URU5UfSwgb3Ige0BsaW5rICNBTEx9CgkgKiBAcmV0dXJuIHRoZSBjb250ZW50IGJ5dGVzCgkgKi8KCXB1YmxpYyBieXRlW10gZ2V0UmVzcG9uc2UoaW50IHR5cGUpIHsKCQlyZXR1cm4gcmVzcG9uc2U7Cgl9CgoJLyoqCgkgKiBSZXR1cm5zIHRoZSBzZXJ2ZXIncyByZXNwb25zZSB0aW1lIGluIG1pbGxpc2Vjb25kcy4gSWYgdGhlIHJlcXVlc3QKCSAqIGhhcyBub3QgYmVlbiBjb21wbGV0ZWQgeWV0LCAtMSBpcyByZXR1cm5lZC4KCSAqCgkgKiBAcmV0dXJuIHRoZSBzZXJ2ZXIncyByZXNwb25zZSB0aW1lLCBvciAtMSBpZiB0aGVyZSBoYXMgYmVlbiBubwoJICogICAgcmVzcG9uc2UgeWV0CgkgKi8KCXB1YmxpYyBsb25nIGdldFJlc3BvbnNlVGltZSgpIHsKCQlyZXR1cm4gcmVzcG9uc2VUaW1lOwoJfQoKCS8qKgoJICogUmV0dXJucyBhIG5hbWUgZm9yIHRoaXMgcmVxdWVzdC4KCSAqCgkgKiBAcmV0dXJuIHRoZSBuYW1lCgkgKi8KCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKCQlpZiAobmFtZSA9PSBudWxsKQoJCQlyZXR1cm4gZ2V0UmVtb3RlSG9zdCgpICsgIjoiICsgZ2V0UmVtb3RlUG9ydCgpOwoJCQoJCXJldHVybiBuYW1lOwoJfQoJCgkvKioKCSAqIFNldHMgdGhlIG5hbWUgb2YgdGhpcyByZXF1ZXN0LgoJICoKCSAqIEBwYXJhbSBuIHRoZSBuYW1lCgkgKi8KCXByb3RlY3RlZCB2b2lkIHNldE5hbWUoU3RyaW5nIG4pIHsKCQluYW1lID0gbjsKCX0KCgkvKioKCSAqIFNldHMgdGhlIGdpdmVuIGtleS12YWx1ZSBwcm9wZXJ0eSBvbiB0aGlzIHJlcXVlc3QuIFRvIHJlbW92ZSBhIHByb3BlcnR5LAoJICogc2V0IHRoZSB2YWx1ZSB0byBudWxsLgoJICogPHA+CgkgKiBUaGlzIG1ldGhvZCBpcyB0eXBpY2FsbHkgY2FsbGVkIGJ5IHByb3RvY29sIGFkYXB0ZXJzIHRvIGF0dGFjaCBwcm90b2NvbC0KCSAqIHNwZWNpZmljIGZpZWxkcyB0byB0aGUgcmVxdWVzdCwgYnV0IGl0IG1heSBiZSBjYWxsZWQgYnkgYW55IGNsaWVudC4KCSAqIDwvcD4KCSAqIAoJICogQHBhcmFtIGtleSB0aGUga2V5CgkgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlCgkgKi8KCXB1YmxpYyB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBrZXksIE9iamVjdCB2YWx1ZSkgewoJCXRyeSB7CgkJCWlmIChwcm9wZXJ0aWVzLmNvbnRhaW5zS2V5KGtleSkpCgkJCQlwcm9wZXJ0aWVzLnJlbW92ZShrZXkpOwoJCQlpZiAodmFsdWUgIT0gbnVsbCkKCQkJCXByb3BlcnRpZXMucHV0KGtleSwgdmFsdWUpOwoJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CgkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkNvdWxkIG5vdCBhZGQgcHJvcGVydHkiLCBlKTsKCQl9Cgl9CgoJLyoqCgkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgd2l0aCB0aGUgZ2l2ZW4ga2V5IGZyb20gdGhpcyByZXF1ZXN0LgoJICogSWYgdGhlIGtleSBkb2VzIG5vdCBleGlzdCwgPGNvZGU+bnVsbDwvY29kZT4gaXMgcmV0dXJuZWQuCgkgKiAKCSAqIEBwYXJhbSBrZXkgdGhlIHByb3BlcnR5IGtleSAKCSAqIEByZXR1cm4gdGhlIHByb3BlcnR5IHZhbHVlCgkgKi8KCXB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIGtleSkgewoJCXRyeSB7CgkJCXJldHVybiBwcm9wZXJ0aWVzLmdldChrZXkpOwoJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KCgkvKioKCSAqIEFkZCB0byB0aGUgcmVxdWVzdC4KCSAqCgkgKiBAcGFyYW0gYWRkUmVxdWVzdCBieXRlW10KCSAqLwoJcHVibGljIHZvaWQgYWRkVG9SZXF1ZXN0KGJ5dGVbXSBhZGRSZXF1ZXN0KSB7CgkJaWYgKGFkZFJlcXVlc3QgPT0gbnVsbCB8fCBhZGRSZXF1ZXN0Lmxlbmd0aCA9PSAwKQoJCQlyZXR1cm47CgkKCQlpZiAocmVxdWVzdCA9PSBudWxsIHx8IHJlcXVlc3QubGVuZ3RoID09IDApIHsKCQkJc2V0UmVxdWVzdChhZGRSZXF1ZXN0KTsKCQkJcmV0dXJuOwoJCX0KCQoJCWludCBzaXplID0gcmVxdWVzdC5sZW5ndGggKyBhZGRSZXF1ZXN0Lmxlbmd0aDsKCQlieXRlW10gYiA9IG5ldyBieXRlW3NpemVdOwoJCVN5c3RlbS5hcnJheWNvcHkocmVxdWVzdCwgMCwgYiwgMCwgcmVxdWVzdC5sZW5ndGgpOwoJCVN5c3RlbS5hcnJheWNvcHkoYWRkUmVxdWVzdCwgMCwgYiwgcmVxdWVzdC5sZW5ndGgsIGFkZFJlcXVlc3QubGVuZ3RoKTsKCQlyZXF1ZXN0ID0gYjsKCQlmaXJlQ2hhbmdlZEV2ZW50KCk7Cgl9CgoJLyoqCgkgKiBBZGQgdG8gdGhlIHJlc3BvbnNlLgoJICoKCSAqIEBwYXJhbSBhZGRSZXNwb25zZSBieXRlW10KCSAqLwoJcHVibGljIHZvaWQgYWRkVG9SZXNwb25zZShieXRlW10gYWRkUmVzcG9uc2UpIHsKCQlpZiAoYWRkUmVzcG9uc2UgPT0gbnVsbCB8fCBhZGRSZXNwb25zZS5sZW5ndGggPT0gMCkKCQkJcmV0dXJuOwoJCgkJaWYgKHJlc3BvbnNlID09IG51bGwgfHwgcmVzcG9uc2UubGVuZ3RoID09IDApIHsKCQkJc2V0UmVzcG9uc2UoYWRkUmVzcG9uc2UpOwoJCQlyZXR1cm47CgkJfQoJCgkJaW50IHNpemUgPSByZXNwb25zZS5sZW5ndGggKyBhZGRSZXNwb25zZS5sZW5ndGg7CgkJYnl0ZVtdIGIgPSBuZXcgYnl0ZVtzaXplXTsKCQlTeXN0ZW0uYXJyYXljb3B5KHJlc3BvbnNlLCAwLCBiLCAwLCByZXNwb25zZS5sZW5ndGgpOwoJCVN5c3RlbS5hcnJheWNvcHkoYWRkUmVzcG9uc2UsIDAsIGIsIHJlc3BvbnNlLmxlbmd0aCwgYWRkUmVzcG9uc2UubGVuZ3RoKTsKCQlyZXNwb25zZSA9IGI7CgkJZmlyZUNoYW5nZWRFdmVudCgpOwoJfQoKCS8qKgoJICogU2V0IHRoZSByZXF1ZXN0LgoJICoKCSAqIEBwYXJhbSByZXF1ZXN0IGJ5dGVbXQoJICovCglwcm90ZWN0ZWQgdm9pZCBzZXRSZXF1ZXN0KGJ5dGVbXSByZXF1ZXN0KSB7CgkJaWYgKHJlcXVlc3QgPT0gbnVsbCB8fCByZXF1ZXN0Lmxlbmd0aCA9PSAwKQoJCQlyZXR1cm47CgkKCQl0aGlzLnJlcXVlc3QgPSByZXF1ZXN0OwoJCW1vbml0b3IucmVxdWVzdENoYW5nZWQodGhpcyk7Cgl9CgoJLyoqCgkgKiBTZXQgdGhlIHJlc3BvbnNlLgoJICoKCSAqIEBwYXJhbSByZXNwb25zZSBieXRlW10KCSAqLwoJcHJvdGVjdGVkIHZvaWQgc2V0UmVzcG9uc2UoYnl0ZVtdIHJlc3BvbnNlKSB7CgkJaWYgKHJlc3BvbnNlID09IG51bGwgfHwgcmVzcG9uc2UubGVuZ3RoID09IDApCgkJCXJldHVybjsKCQoJCXRoaXMucmVzcG9uc2UgPSByZXNwb25zZTsKCQlyZXNwb25zZVRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIGRhdGUuZ2V0VGltZSgpOwoJCW1vbml0b3IucmVxdWVzdENoYW5nZWQodGhpcyk7Cgl9CgoJLyoqCgkgKiBSZXR1cm5zIHRoZSBtb25pdG9yIHRoYXQgY3JlYXRlZCB0aGlzIHJlcXVlc3QuCgkgKiBDaGFuZ2UgZXZlbnRzIHdpbGwgYmUgZmlyZWQgZnJvbSB0aGlzIG1vbml0b3IuCgkgKiA8cD4KCSAqIE5vdGUgdGhhdCB0aGUgbW9uaXRvciBtYXkgaGF2ZSBiZWVuIGVkaXR0ZWQgc2luY2UgdGhpcwoJICogcmVxdWVzdCB3YXMgY3JlYXRlZCwgc28geW91IGNhbm5vdCByZWx5IG9uIHRoZSBtb25pdG9yJ3MKCSAqIGhvc3RuYW1lIG9yIHBvcnQgdmFsdWVzLgoJICogPC9wPgoJICogCgkgKiBAcmV0dXJuIHRoZSBtb25pdG9yIHRoYXQgY3JlYXRlZCB0aGlzIHJlcXVlc3QKCSAqLwoJcHVibGljIElNb25pdG9yIGdldE1vbml0b3IoKSB7CgkJcmV0dXJuIG1vbml0b3I7Cgl9CgoJLyoqCgkgKiBGaXJlIGEgY2hhbmdlIGV2ZW50IHRvIG5vdGlmeSBtb25pdG9yIGxpc3RlbmVycyB0aGF0IHRoZSByZXF1ZXN0IGhhcyBjaGFuZ2VkLgoJICovCglwcm90ZWN0ZWQgdm9pZCBmaXJlQ2hhbmdlZEV2ZW50KCkgewoJCWlmIChtb25pdG9yICE9IG51bGwpCgkJCW1vbml0b3IucmVxdWVzdENoYW5nZWQodGhpcyk7Cgl9CgoJLyoqIChub24tSmF2YWRvYykKCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGUjZ2V0QWRhcHRlcihqYXZhLmxhbmcuQ2xhc3MpCgkgKi8KCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7CgkJcmV0dXJuIFBsYXRmb3JtLmdldEFkYXB0ZXJNYW5hZ2VyKCkuZ2V0QWRhcHRlcih0aGlzLCBhZGFwdGVyKTsKCX0KfQ==