LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIENvcHlyaWdodCCpIHsxOTk2LTE5OTl9LCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIENyZWF0ZWQgYnk6ICAgICBNYXJrIERhdmlzLCBIZWxlbmEgU2hpaAoqCiogTW9kaWZpY2F0aW9uIEhpc3Rvcnk6CiogRGF0ZSAgICAgICAgTmFtZSAgICAgICAgRGVzY3JpcHRpb24KKgoqICA4LzE4Lzk3ICAgICBoZWxlbmEgICAgICBBZGRlZCBpbnRlcm5hbCBBUEkgZG9jdW1lbnRhdGlvbi4KKiAgOC8xNC85OCAgICAgZXJtICAgICAgICAgU3luY2hlZCB3aXRoIDEuMiB2ZXJzaW9uIG9mIFBhdHRlcm5FbnRyeS5qYXZhCiogMDQvMjMvOTkgICAgIHN0ZXBoZW4gICAgIFJlbW92ZWQgRURlY29tcG9zaXRpb25Nb2RlLCBtZXJnZWQgd2l0aAoqICAgICAgICAgICAgICAgICAgICAgICAgICBOb3JtYWxpemVyOjpFTW9kZQoqLwoKI2lmbmRlZiBQVE5FTlRSWV9ICiNkZWZpbmUgUFRORU5UUllfSAoKI2luY2x1ZGUgInVuaWNvZGUvdXR5cGVzLmgiCiNpbmNsdWRlICJ1bmljb2RlL3VuaXN0ci5oIgojaW5jbHVkZSAidW5pY29kZS9jb2xsLmgiCiNpbmNsdWRlICJ1bmljb2RlL25vcm1senIuaCIKCi8qIGZvcndhcmQgZGVjbGFyYXRpb25zICovCmNsYXNzIE1lcmdlQ29sbGF0aW9uOwpjbGFzcyBQb2ludGVyVG9QYXR0ZXJuRW50cnk7CmNsYXNzIFZlY3Rvck9mUG9pbnRlcnNUb1BhdHRlcm5FbnRyeTsKCi8qKgogKgogKiBVdGlsaXR5IGNsYXNzIGZvciBub3JtYWxpemluZyBhbmQgbWVyZ2luZyBwYXR0ZXJucyBmb3IgY29sbGF0aW9uLgogKiBUaGlzIGlzIHRvIGJlIHVzZWQgd2l0aCBNZXJnZUNvbGxhdGlvbiBmb3IgYWRkaW5nIHBhdHRlcm5zIHRvIGFuCiAqIGV4aXN0aW5nIHJ1bGUgdGFibGUuCiAqLwpjbGFzcyBQYXR0ZXJuRW50cnkgCnsKCiAgZnJpZW5kIGNsYXNzIE1lcmdlQ29sbGF0aW9uOwogIGZyaWVuZCBjbGFzcyBQb2ludGVyVG9QYXR0ZXJuRW50cnk7CiAgZnJpZW5kIGNsYXNzIFZlY3Rvck9mUG9pbnRlcnNUb1BhdHRlcm5FbnRyeTsKCiBwdWJsaWM6CgogIC8qKgogICAgICogR2V0cyB0aGUgZXh0ZW5zaW9uLCBxdW90ZWQgaWYgbmVjZXNzYXJ5LCBvZiB0aGlzIHBhdHRlcm4gZW50cnkuCiAgICAgKiBAcGFyYW0gdG9BZGRUbyB0aGUgcmVzdWx0IHN0cmluZyBidWZmZXIuCiAgICAgKi8KICB2b2lkIGFwcGVuZFF1b3RlZEV4dGVuc2lvbihVbmljb2RlU3RyaW5nJiB0b0FkZFRvKSBjb25zdDsKCiAgLyoqCiAgICAgKiBHZXRzIHRoZSBjdXJyZW50IGNoYXJzLCBxdW90ZWQgaWYgbmVjZXNzYXJ5LCBvZiB0aGlzIHBhdHRlcm4gZW50cnkuCiAgICAgKi8KICB2b2lkIGFwcGVuZFF1b3RlZENoYXJzKFVuaWNvZGVTdHJpbmcmIHRvQWRkVG8pIGNvbnN0OwoKICAvKioKICAgICAqIENvbXBhcmVzIHR3byBwYXR0ZXJuIGVudHJ5IG9iamVjdHMuCiAgICAgKiBAcGFyYW0gb3RoZXIgdGhlIG90aGVyIHBhdHRlcm4gZW50cnkgb2JqZWN0LgogICAgICogQHJldHVybiBUUlVFIGlmIHRoZSBwYXR0ZXJuIGVudHJ5IG9iamVjdHMgYXJlIHRoZSBzYW1lLCBGQUxTRSBvdGhlcndpc2UuCiAgICAgKi8KICBVQm9vbCBlcXVhbHMoY29uc3QgUGF0dGVybkVudHJ5JiBvdGhlcikgY29uc3Q7CgogIC8qKgogICAgICogR2V0cyB0aGUgc3RyZW5ndGggb2YgdGhpcyBlbnRyeS4KICAgICAqIEByZXR1cm4gdGhlIHN0cmVuZ3RoIG9mIHRoaXMgcGF0dGVybiBlbnRyeS4KICAgICAqLwoKICBpbnQzMl90IGdldFN0cmVuZ3RoKHZvaWQpICAgY29uc3Q7CgogIC8qKgogICAgICogR2V0cyB0aGUgZXh0ZW5zaW9uIGNoYXJhY3RlcnMuCiAgICAgKiBAcGFyYW0gdGhlIGV4dGVuc2lvbiBzdHJpbmcgcmVmZXJlbmNlLgogICAgICogQHJldHVybiB0aGUgZXh0ZW5zaW9uIGNoYXJzIG9mIHRoaXMgcGF0dGVybiBlbnRyeS4KICAgICAqLwogIGNvbnN0ICAgVW5pY29kZVN0cmluZyYgIGdldEV4dGVuc2lvbihVbmljb2RlU3RyaW5nJiBleHQpIGNvbnN0OwoKICAvKioKICAgICAqIEdldHMgdGhlIGNvcmUgY2hhcmFjdGVycy4KICAgICAqIEBwYXJhbSB0aGUgY2hhciBzdHJpbmcgcmVmZXJlbmNlLgogICAgICogQHJldHVybiB0aGUgY2hhciBzdHJpbmcgb2YgdGhpcyBwYXR0ZXJuIGVudHJ5LgogICAgICovCiAgY29uc3QgICBVbmljb2RlU3RyaW5nJiAgZ2V0Q2hhcnMoVW5pY29kZVN0cmluZyYgY2hhcnMpIGNvbnN0OwoKICAvKioKICAgICAqIFVzZWQgdG8gcGFyc2UgYSBwYXR0ZXJuIGludG8gYSBsaXN0CiAgICAgKiBvZiBQYXR0ZXJuRW50cnkncy4KICAgICAqLwoKICBjbGFzcyBQYXJzZXIKICAgIHsKICAgIHB1YmxpYzoKICAgICAgUGFyc2VyKGNvbnN0IFVuaWNvZGVTdHJpbmcgJnBhdHRlcm5TdHIsIE5vcm1hbGl6ZXI6OkVNb2RlIGRlY29tcE1vZGUpOwogICAgICAKICAgICAgUGFyc2VyKGNvbnN0IFBhcnNlciAmdGhhdCk7CiAgICAgIAogICAgICBQYXJzZXIgJm9wZXJhdG9yPShjb25zdCBQYXJzZXIgJnRoYXQpOwogICAgICAKICAgICAgflBhcnNlcigpOwogICAgICAKICAgICAgUGF0dGVybkVudHJ5ICpuZXh0KFVFcnJvckNvZGUgJnN0YXR1cyk7CgogICAgcHJpdmF0ZToKICAgICAgVW5pY29kZVN0cmluZyBwYXR0ZXJuOwogICAgICBpbnQzMl90IGluZGV4OwogICAgICBOb3JtYWxpemVyOjpFTW9kZSBmRGVjb21wTW9kZTsKCiAgICAgIFVuaWNvZGVTdHJpbmcgbmV3Q2hhcnM7CiAgICAgIFVuaWNvZGVTdHJpbmcgbmV3RXh0ZW5zaW9uczsKICAgIH07CgogIGZyaWVuZCBjbGFzcyBQYXJzZXI7CgoKICAgIC8qKgogICAgICogRm9yIGRlYnVnZ2luZyBvbmx5LgogICAgICovCiAgVW5pY29kZVN0cmluZyYgdG9TdHJpbmcoVW5pY29kZVN0cmluZyYpIGNvbnN0OwoKIHByaXZhdGU6CgogICAgLyoqIENvbnN0cnVjdG9yIGFuZCBkZXN0cnVjdG9yCiAgICAgKi8KICBQYXR0ZXJuRW50cnkoKTsKCiAgLyoqCiAgICAgKiBDcmVhdGVzIGEgbmV3IHBhdHRlcm4gZW50cnkgb2JqZWN0LgogICAgICovCiAgUGF0dGVybkVudHJ5KGludDMyX3Qgc3RyZW5ndGgsCiAgICAgICAgICAgY29uc3QgVW5pY29kZVN0cmluZyYgY2hhcnMsCiAgICAgICAgICAgY29uc3QgVW5pY29kZVN0cmluZyYgZXh0ZW5zaW9uLAogICAgICAgICAgIE5vcm1hbGl6ZXI6OkVNb2RlIGRlY29tcE1vZGUpOwogIC8qKgogICAgICogQ29weSBjb25zdHJ1Y3Rvci4KICAgICAqLwogIFBhdHRlcm5FbnRyeShjb25zdCAgUGF0dGVybkVudHJ5JiBvdGhlcik7CiAgLyoqCiAgICAgKiBEZXN0cnVjdG9yLgogICAgICovCiAgflBhdHRlcm5FbnRyeSgpOwoKICAvKiogYXNzaWdubWVudCAKICAgICAqLwogIGNvbnN0ICAgUGF0dGVybkVudHJ5JiAgICAgICBvcGVyYXRvcj0oY29uc3QgUGF0dGVybkVudHJ5JiAgIG90aGVyKTsKCiAgLyoqCiAgICAgKiBUcmFuc2Zvcm1zIHRoZSBwYXR0ZXJuIGVudHJ5IGludG8gZGlzcGxheWFibGUgdGV4dCBhbmQgYWRkcwogICAgICogdGhlIHRleHQgdG8gdGhlIGJ1ZmZlciwgdG9BZGRUby4KICAgICAqIEBwYXJhbSB0b0FkZFRvIHRoZSByZXN1bHQgYnVmZmVyLgogICAgICogQHBhcmFtIHNob3dFeHRlbnNpb24gd2hldGhlciB0byBhZGQgdGhlIGV4dGVuc2lvbiBjaGFycyBvciBub3QuCiAgICAgKiBAcGFyYW0gc2hvd1doaXRlU3BhY2Ugd2hldGhlciB0byBhZGQgdGhlIHdoaXRlIHNwYWNlcyBvciBub3QuCiAgICAgKiBAcGFyYW0gbGFzdEVudHJ5IHRoZSBsYXN0IHBhdHRlcm4gZW50cnkgdGhhdCB3YXMgcmVmZXJlbmNlZC4KICAgICAqLwogIHZvaWQgYWRkVG9CdWZmZXIoVW5pY29kZVN0cmluZyYgdG9BZGRUbywKICAgICAgICAgICBVQm9vbCBzaG93RXh0ZW5zaW9uLAogICAgICAgICAgIFVCb29sIHNob3dXaGl0ZVNwYWNlLAogICAgICAgICAgIGNvbnN0IFBhdHRlcm5FbnRyeSogbGFzdEVudHJ5KSBjb25zdDsKCiAgLyoqCiAgICAgKiBHZXRzIHRoZSBleHRlbnNpb24sIHF1b3RlZCBpZiBuZWNlc3NhcnksIG9mIHRoaXMgcGF0dGVybiBlbnRyeS4KICAgICAqIEBwYXJhbSBjaGFycyB0aGUgY2hhcnMgc3RyaW5nCiAgICAgKiBAcGFyYW0gdG9BZGRUbyB0aGUgcmVzdWx0IHN0cmluZyBidWZmZXIuCiAgICAgKi8KICBzdGF0aWMgdm9pZCBhcHBlbmRRdW90ZWQoY29uc3QgVW5pY29kZVN0cmluZyYgY2hhcnMsIFVuaWNvZGVTdHJpbmcmIHRvQWRkVG8pOwoKICAvKioKICAgICAqIENoZWNrcyBpZiB0aGUgVW5pY29kZSBjaGFyYWN0ZXIgaXMgYSBzcGVjaWFsIGNoYXJhY3RlciwgZm9yIGV4YW1wbGUsICdAJwogICAgICogaXMgY29uc2lkZXJlZCBhIHNwZWNpYWwgY2hhcmFjdGVyLiAgVGhlIHZhbHVlcyBvZiBhIHNwZWNpYWwgY2hhcmFjdGVyIGlzCiAgICAgKiBvZiB0aGUgZm9sbG93aW5nIHJhbmdlLAogICAgICogPHByZT5wdW5jdHVhdGlvbiBzeW1ib2xzIDoKICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMjAgLSAweDAwMkYKICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwM0EgLSAweDAwM0YgCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDVCIC0gMHgwMDYwCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDdCIC0gMHgwMDdFCiAgICAgKiA8L3ByZT4KICAgICAqIEBwYXJhbSB0aGUgVW5pY29kZSBjaGFyYWN0ZXIKICAgICAqIEByZXR1cm4gVFJVRSBpZiB0aGUgY2hhcmFjdGVyIGlzIGEgc3BlY2lhbCBjaGFyYWN0ZXIsIEZBTFNFIG90aGVyd2lzZS4KICAgICAqLwogIHN0YXRpYyBVQm9vbCBpc1NwZWNpYWxDaGFyKFVDaGFyIGNoKTsKCiAgaW50MzJfdCBzdHJlbmd0aDsKICBVbmljb2RlU3RyaW5nIGNoYXJzOwogIFVuaWNvZGVTdHJpbmcgZXh0ZW5zaW9uOwoKICBzdGF0aWMgY29uc3QgaW50MzJfdCBSRVNFVDsKICBzdGF0aWMgY29uc3QgaW50MzJfdCBVTlNFVDsKfTsKCgojZW5kaWYgLy8gX1BUTkVOVFJZCg==