LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAogKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAqgKgogKiBDb250cmlidXRvcnM6CiAqICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsOwoKaW1wb3J0IGphdmEudXRpbC5EYXRlOwppbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CgppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7CmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07CmltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLk1vbml0b3I7CmltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLmludGVybmFsLlRyYWNlOwovKioKICogUmVwcmVzZW50cyBhIFRDUC9JUCByZXF1ZXN0IG1hZGUgYmV0d2VlbiB0aGUgY2xpZW50IGFuZCB0aGUgc2VydmVyLgogKiBFYWNoIHJlcXVlc3QgcmVwcmVzZW50cyBhIHJlcXVlc3QtcmVzcG9uc2UgcGFpciwgd2hlcmUgdGhlIHJlcXVlc3QKICogaXMgZnJvbSBjbGllbnQgLT4gc2VydmVyLCBhbmQgdGhlIHJlc3BvbnNlIGlzIGZyb20gc2VydmVyIC0+IGNsaWVudC4KICogPHA+CiAqIFJlcXVlc3RzIGFyZSBjcmVhdGVkIGJ5IGEgcnVubmluZyBtb25pdG9yLiBUaGV5IGRvIG5vdCBoYXZlIGEgcmVmZXJlbmNlCiAqIGJhY2sgdG8gdGhlIG1vbml0b3IgYmVjYXVzZSB0aGUgbW9uaXRvciBtYXkgaGF2ZSBiZWVuIGRlbGV0ZWQgb3IgbW9kaWZpZWQKICogc2luY2UgdGhlIHJlcXVlc3Qgd2FzIGNyZWF0ZWQuCiAqIDwvcD4KICogPHA+CiAqIFRoaXMgaW50ZXJmYWNlIGlzIGludGVuZGVkIHRvIGJlIGV4dGVuZGVkIG9ubHkgYnkgY2xpZW50cwogKiB0byBleHRlbmQgdGhlIDxjb2RlPnByb3RvY29sQWRhcHRlcnM8L2NvZGU+IGV4dGVuc2lvbiBwb2ludC4gCiAqIDwvcD4KICogCiAqIEBzaW5jZSAxLjAKICovCnB1YmxpYyBjbGFzcyBSZXF1ZXN0IGltcGxlbWVudHMgSUFkYXB0YWJsZSB7Cglwcm90ZWN0ZWQgTW9uaXRvciBtb25pdG9yOwoJcHJvdGVjdGVkIERhdGUgZGF0ZTsKCXByb3RlY3RlZCBsb25nIHJlc3BvbnNlVGltZSA9IC0xOwoJcHJvdGVjdGVkIGludCBsb2NhbFBvcnQ7Cglwcm90ZWN0ZWQgU3RyaW5nIHJlbW90ZUhvc3Q7Cglwcm90ZWN0ZWQgaW50IHJlbW90ZVBvcnQ7Cglwcm90ZWN0ZWQgYnl0ZVtdIHJlcXVlc3Q7Cglwcm90ZWN0ZWQgYnl0ZVtdIHJlc3BvbnNlOwoJCglwcm90ZWN0ZWQgU3RyaW5nIG5hbWU7Cglwcm90ZWN0ZWQgU3RyaW5nIHByb3RvY29sSWQ7CgoJcHJvdGVjdGVkIFByb3BlcnRpZXMgcHJvcGVydGllczsKCQoJLyoqCgkgKiBSZXF1ZXN0MiBjb250ZW50IHR5cGUgKHZhbHVlIDEpIGZvciB0aGUgdHJhbnNwb3J0IChoZWFkZXIpIG9mIGEgcmVxdWVzdAoJICogb3IgcmVzcG9uc2UuCgkgKiAKCSAqIEBzZWUgI2dldFJlcXVlc3QoaW50KQoJICogQHNlZSAjZ2V0UmVzcG9uc2UoaW50KQoJICovCglwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUUkFOU1BPUlQgPSAxOwoKCS8qKgoJICogUmVxdWVzdDIgY29udGVudCB0eXBlICh2YWx1ZSAyKSBmb3IgdGhlIGNvbnRlbnQgKGJvZHkpIG9mIGEgcmVxdWVzdAoJICogb3IgcmVzcG9uc2UuCgkgKiAKCSAqIEBzZWUgI2dldFJlcXVlc3QoaW50KQoJICogQHNlZSAjZ2V0UmVzcG9uc2UoaW50KQoJICovCglwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05URU5UID0gMjsKCgkvKioKCSAqIFJlcXVlc3QyIGNvbnRlbnQgdHlwZSAodmFsdWUgMykgZm9yIHRoZSBlbnRpcmUgY29udGVudCBvZiBhIHJlcXVlc3QKCSAqIG9yIHJlc3BvbnNlLgoJICogCgkgKiBAc2VlICNnZXRSZXF1ZXN0KGludCkKCSAqIEBzZWUgI2dldFJlc3BvbnNlKGludCkKCSAqLwoJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUxMID0gMzsKCgkvKioKCSAqIENyZWF0ZSBhIG5ldyBSZXF1ZXN0LgoJICogCgkgKiBAcGFyYW0gbW9uaXRvciBhIG1vbml0b3IKCSAqIEBwYXJhbSBwcm90b2NvbElkIHRoZSBwcm90b2NvbCBpZAoJICogQHBhcmFtIGxvY2FsUG9ydCBhIGxvY2FsIHBvcnQgbnVtYmVyCgkgKiBAcGFyYW0gcmVtb3RlSG9zdCBhIHJlbW90ZSBob3N0bmFtZQoJICogQHBhcmFtIHJlbW90ZVBvcnQgYSByZW1vdGUgcG9ydCBudW1iZXIKCSAqLwoJcHVibGljIFJlcXVlc3QoTW9uaXRvciBtb25pdG9yLCBTdHJpbmcgcHJvdG9jb2xJZCwgaW50IGxvY2FsUG9ydCwgU3RyaW5nIHJlbW90ZUhvc3QsIGludCByZW1vdGVQb3J0KSB7CgkJc3VwZXIoKTsKCQl0aGlzLm1vbml0b3IgPSBtb25pdG9yOwoJCXRoaXMucHJvdG9jb2xJZCA9IHByb3RvY29sSWQ7CgkJdGhpcy5sb2NhbFBvcnQgPSBsb2NhbFBvcnQ7CgkJdGhpcy5yZW1vdGVIb3N0ID0gcmVtb3RlSG9zdDsKCQl0aGlzLnJlbW90ZVBvcnQgPSByZW1vdGVQb3J0OwoJCWRhdGUgPSBuZXcgRGF0ZSgpOwoJCXByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllcygpOwoJCWlmIChtb25pdG9yICE9IG51bGwpCgkJCW1vbml0b3IuYWRkUmVxdWVzdCh0aGlzKTsKCX0KCgkvKioKCSAqIFJldHVybnMgdGhlIHByb3RvY29sIHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyB0aGlzIHJlcXVlc3QuCgkgKiAKCSAqIEByZXR1cm4gdGhlIHByb3RvY29sIGlkCgkgKi8KCXB1YmxpYyBTdHJpbmcgZ2V0UHJvdG9jb2woKSB7CgkJcmV0dXJuIHByb3RvY29sSWQ7Cgl9CgoJLyoqCgkgKiBSZXR1cm5zIHRoZSB0aW1lIHRoaXMgcmVxdWVzdCB3YXMgbWFkZS4KCSAqCgkgKiBAcmV0dXJuIHRoZSB0aW1lc3RhbXAKCSAqLwoJcHVibGljIERhdGUgZ2V0RGF0ZSgpIHsKCQlyZXR1cm4gZGF0ZTsKCX0KCgkvKioKCSAqIFJldHVybnMgdGhlIGxvY2FsIChjbGllbnQpIHBvcnQuCgkgKgoJICogQHJldHVybiB0aGUgbG9jYWwgcG9ydCBudW1iZXIKCSAqLwoJcHVibGljIGludCBnZXRMb2NhbFBvcnQoKSB7CgkJcmV0dXJuIGxvY2FsUG9ydDsKCX0KCgkvKioKCSAqIFJldHVybnMgdGhlIHJlbW90ZSAoc2VydmVyKSBob3N0LgoJICoKCSAqIEByZXR1cm4gdGhlIHJlbW90ZSBob3N0CgkgKi8KCXB1YmxpYyBTdHJpbmcgZ2V0UmVtb3RlSG9zdCgpIHsKCQlyZXR1cm4gcmVtb3RlSG9zdDsKCX0KCgkvKioKCSAqIFJldHVybnMgdGhlIHJlbW90ZSAoc2VydmVyKSBwb3J0LgoJICoKCSAqIEByZXR1cm4gdGhlIHJlbW90ZSBwb3J0IG51bWJlcgoJICovCglwdWJsaWMgaW50IGdldFJlbW90ZVBvcnQoKSB7CgkJcmV0dXJuIHJlbW90ZVBvcnQ7Cgl9CgoJLyoqCgkgKiBSZXR1cm5zIHRoZSBzZWxlY3RlZCBjb250ZW50IG9mIHRoZSByZXF1ZXN0IHBvcnRpb24gb2YgdGhpcyByZXF1ZXN0LgoJICogPHA+CgkgKiBbaXNzdWU6IEkgZG9uJ3Qga25vdyBob3cgdG8gZXhwbGFpbiB0aGlzLiBGb3IgYmFzaWMgVENQL0lQIHJlcXVlc3RzLAoJICogZGlzdGluY3Rpb24gYmV0d2VlbiB0cmFuc3BvcnQgYW5kIGNvbnRlbnQgaXMgaWdub3JlZC4KCSAqIEZvciBIVFRQIHJlcXVlc3RzLCB0aGlzIFRSQU5TUE9SVCByZXR1cm5zIGp1c3QgdGhlIEhUVFAgaGVhZGVyIGFuZCAKCSAqIENPTlRFTlQgcmV0dXJucyBqdXN0IHRoZSBIVFRQIGJvZHkgd2l0aG91dCB0aGUgaGVhZGVycy4gV2hhdCB3b3VsZAoJICogaXQgbWVhbiBmb3Igb3RoZXIgcHJvdG9jb2xzPwoJICogPC9wPgoJICoKCSAqIEBwYXJhbSB0eXBlIHRoZSBjb250ZW50IHR5cGU6IG9uZSBvZiB7QGxpbmsgI1RSQU5TUE9SVH0sCgkgKiAgICB7QGxpbmsgI0NPTlRFTlR9LCBvciB7QGxpbmsgI0FMTH0KCSAqIEByZXR1cm4gdGhlIGNvbnRlbnQgYnl0ZXMKCSAqLwoJcHVibGljIGJ5dGVbXSBnZXRSZXF1ZXN0KGludCB0eXBlKSB7CgkJcmV0dXJuIHJlcXVlc3Q7Cgl9CgoJLyoqCgkgKiBSZXR1cm5zIHRoZSBzZWxlY3RlZCBjb250ZW50IG9mIHRoZSByZXNwb25zZSBwb3J0aW9uIG9mIHRoaXMgcmVxdWVzdC4KCSAqIDxwPgoJICogW2lzc3VlOiBJIGRvbid0IGtub3cgaG93IHRvIGV4cGxhaW4gdGhpcy4gRm9yIGJhc2ljIFRDUC9JUCByZXF1ZXN0cywKCSAqIGRpc3RpbmN0aW9uIGJldHdlZW4gdHJhbnNwb3J0IGFuZCBjb250ZW50IGlzIGlnbm9yZWQuCgkgKiBGb3IgSFRUUCByZXF1ZXN0cywgdGhpcyBUUkFOU1BPUlQgcmV0dXJucyBqdXN0IHRoZSBIVFRQIGhlYWRlciBhbmQgCgkgKiBDT05URU5UIHJldHVybnMganVzdCB0aGUgSFRUUCBib2R5IHdpdGhvdXQgdGhlIGhlYWRlcnMuIFdoYXQgd291bGQKCSAqIGl0IG1lYW4gZm9yIG90aGVyIHByb3RvY29scz9dCgkgKiA8L3A+CgkgKgoJICogQHBhcmFtIHR5cGUgdGhlIGNvbnRlbnQgdHlwZTogb25lIG9mIHtAbGluayAjVFJBTlNQT1JUfSwKCSAqICAgIHtAbGluayAjQ09OVEVOVH0sIG9yIHtAbGluayAjQUxMfQoJICogQHJldHVybiB0aGUgY29udGVudCBieXRlcwoJICovCglwdWJsaWMgYnl0ZVtdIGdldFJlc3BvbnNlKGludCB0eXBlKSB7CgkJcmV0dXJuIHJlc3BvbnNlOwoJfQoKCS8qKgoJICogUmV0dXJucyB0aGUgc2VydmVyJ3MgcmVzcG9uc2UgdGltZSBpbiBtaWxsaXNlY29uZHMuIElmIHRoZSByZXF1ZXN0CgkgKiBoYXMgbm90IGJlZW4gY29tcGxldGVkIHlldCwgLTEgaXMgcmV0dXJuZWQuCgkgKgoJICogQHJldHVybiB0aGUgc2VydmVyJ3MgcmVzcG9uc2UgdGltZSwgb3IgLTEgaWYgdGhlcmUgaGFzIGJlZW4gbm8KCSAqICAgIHJlc3BvbnNlIHlldAoJICovCglwdWJsaWMgbG9uZyBnZXRSZXNwb25zZVRpbWUoKSB7CgkJcmV0dXJuIHJlc3BvbnNlVGltZTsKCX0KCgkvKioKCSAqIFJldHVybnMgYSBuYW1lIGZvciB0aGlzIHJlcXVlc3QuCgkgKgoJICogQHJldHVybiB0aGUgbmFtZQoJICovCglwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CgkJaWYgKG5hbWUgPT0gbnVsbCkKCQkJcmV0dXJuIGdldFJlbW90ZUhvc3QoKSArICI6IiArIGdldFJlbW90ZVBvcnQoKTsKCQkKCQlyZXR1cm4gbmFtZTsKCX0KCQoJLyoqCgkgKiBTZXRzIHRoZSBuYW1lIG9mIHRoaXMgcmVxdWVzdC4KCSAqCgkgKiBAcGFyYW0gbiB0aGUgbmFtZQoJICovCglwcm90ZWN0ZWQgdm9pZCBzZXROYW1lKFN0cmluZyBuKSB7CgkJbmFtZSA9IG47Cgl9CgoJLyoqCgkgKiBTZXRzIHRoZSBnaXZlbiBrZXktdmFsdWUgcHJvcGVydHkgb24gdGhpcyByZXF1ZXN0LiBUbyByZW1vdmUgYSBwcm9wZXJ0eSwKCSAqIHNldCB0aGUgdmFsdWUgdG8gbnVsbC4KCSAqIDxwPgoJICogVGhpcyBtZXRob2QgaXMgdHlwaWNhbGx5IGNhbGxlZCBieSBwcm90b2NvbCBhZGFwdGVycyB0byBhdHRhY2ggcHJvdG9jb2wtCgkgKiBzcGVjaWZpYyBmaWVsZHMgdG8gdGhlIHJlcXVlc3QsIGJ1dCBpdCBtYXkgYmUgY2FsbGVkIGJ5IGFueSBjbGllbnQuCgkgKiA8L3A+CgkgKiAKCSAqIEBwYXJhbSBrZXkgdGhlIGtleQoJICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZQoJICovCglwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcga2V5LCBPYmplY3QgdmFsdWUpIHsKCQl0cnkgewoJCQlpZiAocHJvcGVydGllcy5jb250YWluc0tleShrZXkpKQoJCQkJcHJvcGVydGllcy5yZW1vdmUoa2V5KTsKCQkJaWYgKHZhbHVlICE9IG51bGwpCgkJCQlwcm9wZXJ0aWVzLnB1dChrZXksIHZhbHVlKTsKCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewoJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3QgYWRkIHByb3BlcnR5IiwgZSk7CgkJfQoJfQoKCS8qKgoJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5IHdpdGggdGhlIGdpdmVuIGtleSBmcm9tIHRoaXMgcmVxdWVzdC4KCSAqIElmIHRoZSBrZXkgZG9lcyBub3QgZXhpc3QsIDxjb2RlPm51bGw8L2NvZGU+IGlzIHJldHVybmVkLgoJICogCgkgKiBAcGFyYW0ga2V5IHRoZSBwcm9wZXJ0eSBrZXkgCgkgKiBAcmV0dXJuIHRoZSBwcm9wZXJ0eSB2YWx1ZQoJICovCglwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBrZXkpIHsKCQl0cnkgewoJCQlyZXR1cm4gcHJvcGVydGllcy5nZXQoa2V5KTsKCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJLyoqCgkgKiBBZGQgdG8gdGhlIHJlcXVlc3QuCgkgKgoJICogQHBhcmFtIGFkZFJlcXVlc3QgYnl0ZVtdCgkgKi8KCXB1YmxpYyB2b2lkIGFkZFRvUmVxdWVzdChieXRlW10gYWRkUmVxdWVzdCkgewoJCWlmIChhZGRSZXF1ZXN0ID09IG51bGwgfHwgYWRkUmVxdWVzdC5sZW5ndGggPT0gMCkKCQkJcmV0dXJuOwoJCgkJaWYgKHJlcXVlc3QgPT0gbnVsbCB8fCByZXF1ZXN0Lmxlbmd0aCA9PSAwKSB7CgkJCXNldFJlcXVlc3QoYWRkUmVxdWVzdCk7CgkJCXJldHVybjsKCQl9CgkKCQlpbnQgc2l6ZSA9IHJlcXVlc3QubGVuZ3RoICsgYWRkUmVxdWVzdC5sZW5ndGg7CgkJYnl0ZVtdIGIgPSBuZXcgYnl0ZVtzaXplXTsKCQlTeXN0ZW0uYXJyYXljb3B5KHJlcXVlc3QsIDAsIGIsIDAsIHJlcXVlc3QubGVuZ3RoKTsKCQlTeXN0ZW0uYXJyYXljb3B5KGFkZFJlcXVlc3QsIDAsIGIsIHJlcXVlc3QubGVuZ3RoLCBhZGRSZXF1ZXN0Lmxlbmd0aCk7CgkJcmVxdWVzdCA9IGI7CgkJZmlyZUNoYW5nZWRFdmVudCgpOwoJfQoKCS8qKgoJICogQWRkIHRvIHRoZSByZXNwb25zZS4KCSAqCgkgKiBAcGFyYW0gYWRkUmVzcG9uc2UgYnl0ZVtdCgkgKi8KCXB1YmxpYyB2b2lkIGFkZFRvUmVzcG9uc2UoYnl0ZVtdIGFkZFJlc3BvbnNlKSB7CgkJaWYgKGFkZFJlc3BvbnNlID09IG51bGwgfHwgYWRkUmVzcG9uc2UubGVuZ3RoID09IDApCgkJCXJldHVybjsKCQoJCWlmIChyZXNwb25zZSA9PSBudWxsIHx8IHJlc3BvbnNlLmxlbmd0aCA9PSAwKSB7CgkJCXNldFJlc3BvbnNlKGFkZFJlc3BvbnNlKTsKCQkJcmV0dXJuOwoJCX0KCQoJCWludCBzaXplID0gcmVzcG9uc2UubGVuZ3RoICsgYWRkUmVzcG9uc2UubGVuZ3RoOwoJCWJ5dGVbXSBiID0gbmV3IGJ5dGVbc2l6ZV07CgkJU3lzdGVtLmFycmF5Y29weShyZXNwb25zZSwgMCwgYiwgMCwgcmVzcG9uc2UubGVuZ3RoKTsKCQlTeXN0ZW0uYXJyYXljb3B5KGFkZFJlc3BvbnNlLCAwLCBiLCByZXNwb25zZS5sZW5ndGgsIGFkZFJlc3BvbnNlLmxlbmd0aCk7CgkJcmVzcG9uc2UgPSBiOwoJCWZpcmVDaGFuZ2VkRXZlbnQoKTsKCX0KCgkvKioKCSAqIFNldCB0aGUgcmVxdWVzdC4KCSAqCgkgKiBAcGFyYW0gcmVxdWVzdCBieXRlW10KCSAqLwoJcHJvdGVjdGVkIHZvaWQgc2V0UmVxdWVzdChieXRlW10gcmVxdWVzdCkgewoJCWlmIChyZXF1ZXN0ID09IG51bGwgfHwgcmVxdWVzdC5sZW5ndGggPT0gMCkKCQkJcmV0dXJuOwoJCgkJdGhpcy5yZXF1ZXN0ID0gcmVxdWVzdDsKCQltb25pdG9yLnJlcXVlc3RDaGFuZ2VkKHRoaXMpOwoJfQoKCS8qKgoJICogU2V0IHRoZSByZXNwb25zZS4KCSAqCgkgKiBAcGFyYW0gcmVzcG9uc2UgYnl0ZVtdCgkgKi8KCXByb3RlY3RlZCB2b2lkIHNldFJlc3BvbnNlKGJ5dGVbXSByZXNwb25zZSkgewoJCWlmIChyZXNwb25zZSA9PSBudWxsIHx8IHJlc3BvbnNlLmxlbmd0aCA9PSAwKQoJCQlyZXR1cm47CgkKCQl0aGlzLnJlc3BvbnNlID0gcmVzcG9uc2U7CgkJcmVzcG9uc2VUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBkYXRlLmdldFRpbWUoKTsKCQltb25pdG9yLnJlcXVlc3RDaGFuZ2VkKHRoaXMpOwoJfQoKCS8qKgoJICogUmV0dXJucyB0aGUgbW9uaXRvciB0aGF0IGNyZWF0ZWQgdGhpcyByZXF1ZXN0LgoJICogQ2hhbmdlIGV2ZW50cyB3aWxsIGJlIGZpcmVkIGZyb20gdGhpcyBtb25pdG9yLgoJICogPHA+CgkgKiBOb3RlIHRoYXQgdGhlIG1vbml0b3IgbWF5IGhhdmUgYmVlbiBlZGl0dGVkIHNpbmNlIHRoaXMKCSAqIHJlcXVlc3Qgd2FzIGNyZWF0ZWQsIHNvIHlvdSBjYW5ub3QgcmVseSBvbiB0aGUgbW9uaXRvcidzCgkgKiBob3N0bmFtZSBvciBwb3J0IHZhbHVlcy4KCSAqIDwvcD4KCSAqIAoJICogQHJldHVybiB0aGUgbW9uaXRvciB0aGF0IGNyZWF0ZWQgdGhpcyByZXF1ZXN0CgkgKi8KCXB1YmxpYyBJTW9uaXRvciBnZXRNb25pdG9yKCkgewoJCXJldHVybiBtb25pdG9yOwoJfQoKCS8qKgoJICogRmlyZSBhIGNoYW5nZSBldmVudCB0byBub3RpZnkgbW9uaXRvciBsaXN0ZW5lcnMgdGhhdCB0aGUgcmVxdWVzdCBoYXMgY2hhbmdlZC4KCSAqLwoJcHJvdGVjdGVkIHZvaWQgZmlyZUNoYW5nZWRFdmVudCgpIHsKCQlpZiAobW9uaXRvciAhPSBudWxsKQoJCQltb25pdG9yLnJlcXVlc3RDaGFuZ2VkKHRoaXMpOwoJfQoKCS8qKiAobm9uLUphdmFkb2MpCgkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlI2dldEFkYXB0ZXIoamF2YS5sYW5nLkNsYXNzKQoJICovCglwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewoJCXJldHVybiBQbGF0Zm9ybS5nZXRBZGFwdGVyTWFuYWdlcigpLmdldEFkYXB0ZXIodGhpcywgYWRhcHRlcik7Cgl9Cn0=