LyoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogICBDb3B5cmlnaHQgKEMpIDE5OTctMjAwMywgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcwoqICAgQ29ycG9yYXRpb24gYW5kIG90aGVycy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqLwoKLyoqCiogRmlsZSBjb2xlaXRyLmgKKgoqIAoqCiogQ3JlYXRlZCBieTogSGVsZW5hIFNoaWgKKgoqIE1vZGlmaWNhdGlvbiBIaXN0b3J5OgoqCiogIERhdGUgICAgICAgTmFtZSAgICAgICAgRGVzY3JpcHRpb24KKgoqICA4LzE4Lzk3ICAgIGhlbGVuYSAgICAgIEFkZGVkIGludGVybmFsIEFQSSBkb2N1bWVudGF0aW9uLgoqIDA4LzAzLzk4ICAgIGVybSAgICAgICAgIFN5bmNoZWQgd2l0aCAxLjIgdmVyc2lvbiBDb2xsYXRpb25FbGVtZW50SXRlcmF0b3IuamF2YQoqIDEyLzEwLzk5ICAgIGFsaXUgICAgICAgIFBvcnRlZCBUaGFpIGNvbGxhdGlvbiBzdXBwb3J0IGZyb20gSmF2YS4KKiAwMS8yNS8wMSAgICBzd3F1ZWsgICAgICBNb2RpZmllZCBpbnRvIGEgQysrIHdyYXBwZXIgY2FsbGluZyBDIEFQSXMgKHVjb2xpdGVyLmgpCiogMDIvMTkvMDEgICAgc3dxdWVrICAgICAgUmVtb3ZlZCBDb2xsYXRpb25FbGVtZW50c0l0ZXJhdG9yKCkgc2luY2UgaXQgaXMgCiogICAgICAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBjb25zdHJ1Y3RvciBhbmQgbm8gY2FsbHMgYXJlIG1hZGUgdG8gaXQKKi8KCiNpZm5kZWYgQ09MRUlUUl9ICiNkZWZpbmUgQ09MRUlUUl9ICgojaW5jbHVkZSAidW5pY29kZS91dHlwZXMuaCIKCiNpZiAhVUNPTkZJR19OT19DT0xMQVRJT04KCiNpbmNsdWRlICJ1bmljb2RlL3VvYmplY3QuaCIKI2luY2x1ZGUgInVuaWNvZGUvdGJsY29sbC5oIgojaW5jbHVkZSAidW5pY29kZS91Y29sZWl0ci5oIgoKLyoqIAogKiBUaGUgVUNvbGxhdGlvbkVsZW1lbnRzIHN0cnVjdC4KICogRm9yIHVzYWdlIGluIEMgcHJvZ3JhbXMuCiAqIEBzdGFibGUgSUNVIDIuMAogKi8KdHlwZWRlZiBzdHJ1Y3QgVUNvbGxhdGlvbkVsZW1lbnRzIFVDb2xsYXRpb25FbGVtZW50czsKClVfTkFNRVNQQUNFX0JFR0lOCgovKioKKiBUaGUgQ29sbGF0aW9uRWxlbWVudEl0ZXJhdG9yIGNsYXNzIGlzIHVzZWQgYXMgYW4gaXRlcmF0b3IgdG8gd2FsayB0aHJvdWdoICAgICAKKiBlYWNoIGNoYXJhY3RlciBvZiBhbiBpbnRlcm5hdGlvbmFsIHN0cmluZy4gVXNlIHRoZSBpdGVyYXRvciB0byByZXR1cm4gdGhlCiogb3JkZXJpbmcgcHJpb3JpdHkgb2YgdGhlIHBvc2l0aW9uZWQgY2hhcmFjdGVyLiBUaGUgb3JkZXJpbmcgcHJpb3JpdHkgb2YgYSAKKiBjaGFyYWN0ZXIsIHdoaWNoIHdlIHJlZmVyIHRvIGFzIGEga2V5LCBkZWZpbmVzIGhvdyBhIGNoYXJhY3RlciBpcyBjb2xsYXRlZCBpbiAKKiB0aGUgZ2l2ZW4gY29sbGF0aW9uIG9iamVjdC4KKiBGb3IgZXhhbXBsZSwgY29uc2lkZXIgdGhlIGZvbGxvd2luZyBpbiBTcGFuaXNoOgoqIDxwcmU+CiogXGNvZGUKKiAgICAgICAgImNhIiAtPiB0aGUgZmlyc3Qga2V5IGlzIGtleSgnYycpIGFuZCBzZWNvbmQga2V5IGlzIGtleSgnYScpLgoqICAgICAgICAiY2hhIiAtPiB0aGUgZmlyc3Qga2V5IGlzIGtleSgnY2gnKSBhbmQgc2Vjb25kIGtleSBpcyBrZXkoJ2EnKS4KKiBcZW5kY29kZQoqIDwvcHJlPgoqIEFuZCBpbiBHZXJtYW4sCiogPHByZT4KKiBcY29kZQoqICAgICAgICAi5mIiLT4gdGhlIGZpcnN0IGtleSBpcyBrZXkoJ2EnKSwgdGhlIHNlY29uZCBrZXkgaXMga2V5KCdlJyksIGFuZAoqICAgICAgICB0aGUgdGhpcmQga2V5IGlzIGtleSgnYicpLgoqIFxlbmRjb2RlCiogPC9wcmU+CiogVGhlIGtleSBvZiBhIGNoYXJhY3RlciwgaXMgYW4gaW50ZWdlciBjb21wb3NlZCBvZiBwcmltYXJ5IG9yZGVyKHNob3J0KSwKKiBzZWNvbmRhcnkgb3JkZXIoY2hhciksIGFuZCB0ZXJ0aWFyeSBvcmRlcihjaGFyKS4gSmF2YSBzdHJpY3RseSBkZWZpbmVzIHRoZSAKKiBzaXplIGFuZCBzaWduZWRuZXNzIG9mIGl0cyBwcmltaXRpdmUgZGF0YSB0eXBlcy4gVGhlcmVmb3JlLCB0aGUgc3RhdGljCiogZnVuY3Rpb25zIHByaW1hcnlPcmRlcigpLCBzZWNvbmRhcnlPcmRlcigpLCBhbmQgdGVydGlhcnlPcmRlcigpIHJldHVybiAKKiBpbnQzMl90IHRvIGVuc3VyZSB0aGUgY29ycmVjdG5lc3Mgb2YgdGhlIGtleSB2YWx1ZS4KKiA8cD5FeGFtcGxlIG9mIHRoZSBpdGVyYXRvciB1c2FnZTogKHdpdGhvdXQgZXJyb3IgY2hlY2tpbmcpCiogPHByZT4KKiBcY29kZQoqICAgdm9pZCBDb2xsYXRpb25FbGVtZW50SXRlcmF0b3JfRXhhbXBsZSgpCiogICB7CiogICAgICAgVW5pY29kZVN0cmluZyBzdHIgPSAiVGhpcyBpcyBhIHRlc3QiOwoqICAgICAgIFVFcnJvckNvZGUgc3VjY2VzcyA9IFVfWkVST19FUlJPUjsKKiAgICAgICBSdWxlQmFzZWRDb2xsYXRvciogcmJjID0KKiAgICAgICAgICAgKFJ1bGVCYXNlZENvbGxhdG9yKikgUnVsZUJhc2VkQ29sbGF0b3I6OmNyZWF0ZUluc3RhbmNlKHN1Y2Nlc3MpOwoqICAgICAgIENvbGxhdGlvbkVsZW1lbnRJdGVyYXRvciogYyA9CiogICAgICAgICAgIHJiYy0+Y3JlYXRlQ29sbGF0aW9uRWxlbWVudEl0ZXJhdG9yKCBzdHIgKTsKKiAgICAgICBpbnQzMl90IG9yZGVyID0gYy0+bmV4dChzdWNjZXNzKTsKKiAgICAgICBjLT5yZXNldCgpOwoqICAgICAgIG9yZGVyID0gYy0+cHJldmlvdXMoc3VjY2Vzcyk7CiogICAgICAgZGVsZXRlIGM7CiogICAgICAgZGVsZXRlIHJiYzsKKiAgIH0KKiBcZW5kY29kZQoqIDwvcHJlPgoqIDxwPgoqIENvbGxhdGlvbkVsZW1lbnRJdGVyYXRvcjo6bmV4dCByZXR1cm5zIHRoZSBjb2xsYXRpb24gb3JkZXIgb2YgdGhlIG5leHQKKiBjaGFyYWN0ZXIgYmFzZWQgb24gdGhlIGNvbXBhcmlzb24gbGV2ZWwgb2YgdGhlIGNvbGxhdG9yLiAKKiBDb2xsYXRpb25FbGVtZW50SXRlcmF0b3I6OnByZXZpb3VzIHJldHVybnMgdGhlIGNvbGxhdGlvbiBvcmRlciBvZiB0aGUgCiogcHJldmlvdXMgY2hhcmFjdGVyIGJhc2VkIG9uIHRoZSBjb21wYXJpc29uIGxldmVsIG9mIHRoZSBjb2xsYXRvci4gCiogVGhlIENvbGxhdGlvbiBFbGVtZW50IEl0ZXJhdG9yIG1vdmVzIG9ubHkgaW4gb25lIGRpcmVjdGlvbiBiZXR3ZWVuIGNhbGxzIHRvCiogQ29sbGF0aW9uRWxlbWVudEl0ZXJhdG9yOjpyZXNldC4gVGhhdCBpcywgQ29sbGF0aW9uRWxlbWVudEl0ZXJhdG9yOjpuZXh0KCkgCiogYW5kIENvbGxhdGlvbkVsZW1lbnRJdGVyYXRvcjo6cHJldmlvdXMgY2FuIG5vdCBiZSBpbnRlci11c2VkLiBXaGVuZXZlciAKKiBDb2xsYXRpb25FbGVtZW50SXRlcmF0b3I6OnByZXZpb3VzIGlzIHRvIGJlIGNhbGxlZCBhZnRlciAKKiBDb2xsYXRpb25FbGVtZW50SXRlcmF0b3I6Om5leHQoKSBvciB2aWNlIHZlcnNhLCAKKiBDb2xsYXRpb25FbGVtZW50SXRlcmF0b3I6OnJlc2V0IGhhcyB0byBiZSBjYWxsZWQgZmlyc3QgdG8gcmVzZXQgdGhlIHN0YXR1cywgCiogc2hpZnRpbmcgcG9pbnRlcnMgdG8gZWl0aGVyIHRoZSBlbmQgb3IgdGhlIHN0YXJ0IG9mIHRoZSBzdHJpbmcuIEhlbmNlIGF0IHRoZSAKKiBuZXh0IGNhbGwgb2YgQ29sbGF0aW9uRWxlbWVudEl0ZXJhdG9yOjpwcmV2aW91cyBvciAKKiBDb2xsYXRpb25FbGVtZW50SXRlcmF0b3I6Om5leHQoKSwgdGhlIGZpcnN0IG9yIGxhc3QgY29sbGF0aW9uIG9yZGVyIHdpbGwgYmUgCiogcmV0dXJuZWQuIAoqIElmIGEgY2hhbmdlIG9mIGRpcmVjdGlvbiBpcyBkb25lIHdpdGhvdXQgYSBDb2xsYXRpb25FbGVtZW50SXRlcmF0b3I6OnJlc2V0KCksIAoqIHRoZSByZXN1bHQgaXMgdW5kZWZpbmVkLgoqIFRoZSByZXN1bHQgb2YgYSBmb3J3YXJkIGl0ZXJhdGUgKENvbGxhdGlvbkVsZW1lbnRJdGVyYXRvcjo6bmV4dCkgYW5kIAoqIHJldmVyc2VkIHJlc3VsdCBvZiB0aGUgYmFja3dhcmQgaXRlcmF0ZSAoQ29sbGF0aW9uRWxlbWVudEl0ZXJhdG9yOjpwcmV2aW91cykgCiogb24gdGhlIHNhbWUgc3RyaW5nIGFyZSBlcXVpdmFsZW50LCBpZiBjb2xsYXRpb24gb3JkZXJzIHdpdGggdGhlIHZhbHVlIAoqIFVDT0xfSUdOT1JBQkxFIGFyZSBpZ25vcmVkLgoqIENoYXJhY3RlciBiYXNlZCBvbiB0aGUgY29tcGFyaXNvbiBsZXZlbCBvZiB0aGUgY29sbGF0b3IuICBBIGNvbGxhdGlvbiBvcmRlciAKKiBjb25zaXN0cyBvZiBwcmltYXJ5IG9yZGVyLCBzZWNvbmRhcnkgb3JkZXIgYW5kIHRlcnRpYXJ5IG9yZGVyLiAgVGhlIGRhdGEgCiogdHlwZSBvZiB0aGUgY29sbGF0aW9uIG9yZGVyIGlzIDxzdHJvbmc+dF9pbnQzMjwvc3Ryb25nPi4gCioKKiBOb3RlLCBDb2xsYXRpb25FbGVtZW50SXRlcmF0b3Igc2hvdWxkIG5vdCBiZSBzdWJjbGFzc2VkLgoqIEBzZWUgICAgIENvbGxhdG9yCiogQHNlZSAgICAgUnVsZUJhc2VkQ29sbGF0b3IKKiBAdmVyc2lvbiAxLjggSmFuIDE2IDIwMDEKKi8KY2xhc3MgVV9JMThOX0FQSSBDb2xsYXRpb25FbGVtZW50SXRlcmF0b3IgOiBwdWJsaWMgVU9iamVjdCB7CnB1YmxpYzogCgogICAgLy8gQ29sbGF0aW9uRWxlbWVudEl0ZXJhdG9yIHB1YmxpYyBkYXRhIG1lbWJlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICAvKioKICAgICogTlVMTE9SREVSIGluZGljYXRlcyB0aGF0IGFuIGVycm9yIGhhcyBvY2N1cmVkIHdoaWxlIHByb2Nlc3NpbmcKICAgICogQHN0YWJsZSBJQ1UgMi4wCiAgICAqLwogICAgc3RhdGljIGludDMyX3QgY29uc3QgTlVMTE9SREVSOwoKICAgIC8vIENvbGxhdGlvbkVsZW1lbnRJdGVyYXRvciBwdWJsaWMgY29uc3RydWN0b3IvZGVzdHJ1Y3RvciAtLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgLyoqCiAgICAqIENvcHkgY29uc3RydWN0b3IuCiAgICAqCiAgICAqIEBwYXJhbSBvdGhlciAgICB0aGUgb2JqZWN0IHRvIGJlIGNvcGllZCBmcm9tCiAgICAqIEBzdGFibGUgSUNVIDIuMAogICAgKi8KICAgIENvbGxhdGlvbkVsZW1lbnRJdGVyYXRvcihjb25zdCBDb2xsYXRpb25FbGVtZW50SXRlcmF0b3ImIG90aGVyKTsKCiAgICAvKiogCiAgICAqIERlc3RydWN0b3IKICAgICogQHN0YWJsZSBJQ1UgMi4wCiAgICAqLwogICAgfkNvbGxhdGlvbkVsZW1lbnRJdGVyYXRvcigpOwoKICAgIC8vIENvbGxhdGlvbkVsZW1lbnRJdGVyYXRvciBwdWJsaWMgbWV0aG9kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgLyoqCiAgICAqIFJldHVybnMgdHJ1ZSBpZiAib3RoZXIiIGlzIHRoZSBzYW1lIGFzICJ0aGlzIgogICAgKgogICAgKiBAcGFyYW0gb3RoZXIgICAgdGhlIG9iamVjdCB0byBiZSBjb21wYXJlZAogICAgKiBAcmV0dXJuICAgICAgICAgdHJ1ZSBpZiAib3RoZXIiIGlzIHRoZSBzYW1lIGFzICJ0aGlzIgogICAgKiBAc3RhYmxlIElDVSAyLjAKICAgICovCiAgICBVQm9vbCBvcGVyYXRvcj09KGNvbnN0IENvbGxhdGlvbkVsZW1lbnRJdGVyYXRvciYgb3RoZXIpIGNvbnN0OwoKICAgIC8qKgogICAgKiBSZXR1cm5zIHRydWUgaWYgIm90aGVyIiBpcyBub3QgdGhlIHNhbWUgYXMgInRoaXMiLgogICAgKgogICAgKiBAcGFyYW0gb3RoZXIgICAgdGhlIG9iamVjdCB0byBiZSBjb21wYXJlZAogICAgKiBAcmV0dXJuICAgICAgICAgdHJ1ZSBpZiAib3RoZXIiIGlzIG5vdCB0aGUgc2FtZSBhcyAidGhpcyIKICAgICogQHN0YWJsZSBJQ1UgMi4wCiAgICAqLwogICAgVUJvb2wgb3BlcmF0b3IhPShjb25zdCBDb2xsYXRpb25FbGVtZW50SXRlcmF0b3ImIG90aGVyKSBjb25zdDsKCiAgICAvKioKICAgICogUmVzZXRzIHRoZSBjdXJzb3IgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgc3RyaW5nLgogICAgKiBAc3RhYmxlIElDVSAyLjAKICAgICovCiAgICB2b2lkIHJlc2V0KHZvaWQpOwoKICAgIC8qKgogICAgKiBHZXRzIHRoZSBvcmRlcmluZyBwcmlvcml0eSBvZiB0aGUgbmV4dCBjaGFyYWN0ZXIgaW4gdGhlIHN0cmluZy4KICAgICogQHBhcmFtIHN0YXR1cyB0aGUgZXJyb3IgY29kZSBzdGF0dXMuCiAgICAqIEByZXR1cm4gdGhlIG5leHQgY2hhcmFjdGVyJ3Mgb3JkZXJpbmcuIG90aGVyd2lzZSByZXR1cm5zIE5VTExPUkRFUiBpZiBhbiAKICAgICogICAgICAgICBlcnJvciBoYXMgb2NjdXJlZCBvciBpZiB0aGUgZW5kIG9mIHN0cmluZyBoYXMgYmVlbiByZWFjaGVkCiAgICAqIEBzdGFibGUgSUNVIDIuMAogICAgKi8KICAgIGludDMyX3QgbmV4dChVRXJyb3JDb2RlJiBzdGF0dXMpOwoKICAgIC8qKgogICAgKiBHZXQgdGhlIG9yZGVyaW5nIHByaW9yaXR5IG9mIHRoZSBwcmV2aW91cyBjb2xsYXRpb24gZWxlbWVudCBpbiB0aGUgc3RyaW5nLgogICAgKiBAcGFyYW0gc3RhdHVzIHRoZSBlcnJvciBjb2RlIHN0YXR1cy4KICAgICogQHJldHVybiB0aGUgcHJldmlvdXMgZWxlbWVudCdzIG9yZGVyaW5nLiBvdGhlcndpc2UgcmV0dXJucyBOVUxMT1JERVIgaWYgYW4gCiAgICAqICAgICAgICAgZXJyb3IgaGFzIG9jY3VyZWQgb3IgaWYgdGhlIHN0YXJ0IG9mIHN0cmluZyBoYXMgYmVlbiByZWFjaGVkCiAgICAqIEBzdGFibGUgSUNVIDIuMAogICAgKi8KICAgIGludDMyX3QgcHJldmlvdXMoVUVycm9yQ29kZSYgc3RhdHVzKTsKCiAgICAvKioKICAgICogR2V0cyB0aGUgcHJpbWFyeSBvcmRlciBvZiBhIGNvbGxhdGlvbiBvcmRlci4KICAgICogQHBhcmFtIG9yZGVyIHRoZSBjb2xsYXRpb24gb3JkZXIKICAgICogQHJldHVybiB0aGUgcHJpbWFyeSBvcmRlciBvZiBhIGNvbGxhdGlvbiBvcmRlci4KICAgICogQHN0YWJsZSBJQ1UgMi4wCiAgICAqLwogICAgc3RhdGljIGludDMyX3QgcHJpbWFyeU9yZGVyKGludDMyX3Qgb3JkZXIpOwoKICAgIC8qKgogICAgKiBHZXRzIHRoZSBzZWNvbmRhcnkgb3JkZXIgb2YgYSBjb2xsYXRpb24gb3JkZXIuCiAgICAqIEBwYXJhbSBvcmRlciB0aGUgY29sbGF0aW9uIG9yZGVyCiAgICAqIEByZXR1cm4gdGhlIHNlY29uZGFyeSBvcmRlciBvZiBhIGNvbGxhdGlvbiBvcmRlci4KICAgICogQHN0YWJsZSBJQ1UgMi4wCiAgICAqLwogICAgc3RhdGljIGludDMyX3Qgc2Vjb25kYXJ5T3JkZXIoaW50MzJfdCBvcmRlcik7CgogICAgLyoqCiAgICAqIEdldHMgdGhlIHRlcnRpYXJ5IG9yZGVyIG9mIGEgY29sbGF0aW9uIG9yZGVyLgogICAgKiBAcGFyYW0gb3JkZXIgdGhlIGNvbGxhdGlvbiBvcmRlcgogICAgKiBAcmV0dXJuIHRoZSB0ZXJ0aWFyeSBvcmRlciBvZiBhIGNvbGxhdGlvbiBvcmRlci4KICAgICogQHN0YWJsZSBJQ1UgMi4wCiAgICAqLwogICAgc3RhdGljIGludDMyX3QgdGVydGlhcnlPcmRlcihpbnQzMl90IG9yZGVyKTsKCiAgICAvKioKICAgICogUmV0dXJuIHRoZSBtYXhpbXVtIGxlbmd0aCBvZiBhbnkgZXhwYW5zaW9uIHNlcXVlbmNlcyB0aGF0IGVuZCB3aXRoIHRoZSAKICAgICogc3BlY2lmaWVkIGNvbXBhcmlzb24gb3JkZXIuCiAgICAqIEBwYXJhbSBvcmRlciBhIGNvbGxhdGlvbiBvcmRlciByZXR1cm5lZCBieSBwcmV2aW91cyBvciBuZXh0LgogICAgKiBAcmV0dXJuIG1heGltdW0gc2l6ZSBvZiB0aGUgZXhwYW5zaW9uIHNlcXVlbmNlcyBlbmRpbmcgd2l0aCB0aGUgY29sbGF0aW9uIAogICAgKiAgICAgICAgIGVsZW1lbnQgb3IgMSBpZiBjb2xsYXRpb24gZWxlbWVudCBkb2VzIG5vdCBvY2N1ciBhdCB0aGUgZW5kIG9mIGFueSAKICAgICogICAgICAgICBleHBhbnNpb24gc2VxdWVuY2UKICAgICogQHN0YWJsZSBJQ1UgMi4wCiAgICAqLwogICAgaW50MzJfdCBnZXRNYXhFeHBhbnNpb24oaW50MzJfdCBvcmRlcikgY29uc3Q7CgogICAgLyoqCiAgICAqIEdldHMgdGhlIGNvbXBhcmlzb24gb3JkZXIgaW4gdGhlIGRlc2lyZWQgc3RyZW5ndGguIElnbm9yZSB0aGUgb3RoZXIKICAgICogZGlmZmVyZW5jZXMuCiAgICAqIEBwYXJhbSBvcmRlciBUaGUgb3JkZXIgdmFsdWUKICAgICogQHN0YWJsZSBJQ1UgMi4wCiAgICAqLwogICAgaW50MzJfdCBzdHJlbmd0aE9yZGVyKGludDMyX3Qgb3JkZXIpIGNvbnN0OwoKICAgIC8qKgogICAgKiBTZXRzIHRoZSBzb3VyY2Ugc3RyaW5nLgogICAgKiBAcGFyYW0gc3RyIHRoZSBzb3VyY2Ugc3RyaW5nLgogICAgKiBAcGFyYW0gc3RhdHVzIHRoZSBlcnJvciBjb2RlIHN0YXR1cy4KICAgICogQHN0YWJsZSBJQ1UgMi4wCiAgICAqLwogICAgdm9pZCBzZXRUZXh0KGNvbnN0IFVuaWNvZGVTdHJpbmcmIHN0ciwgVUVycm9yQ29kZSYgc3RhdHVzKTsKCiAgICAvKioKICAgICogU2V0cyB0aGUgc291cmNlIHN0cmluZy4KICAgICogQHBhcmFtIHN0ciB0aGUgc291cmNlIGNoYXJhY3RlciBpdGVyYXRvci4KICAgICogQHBhcmFtIHN0YXR1cyB0aGUgZXJyb3IgY29kZSBzdGF0dXMuCiAgICAqIEBzdGFibGUgSUNVIDIuMAogICAgKi8KICAgIHZvaWQgc2V0VGV4dChDaGFyYWN0ZXJJdGVyYXRvciYgc3RyLCBVRXJyb3JDb2RlJiBzdGF0dXMpOwoKICAgIC8qKgogICAgKiBDaGVja3MgaWYgYSBjb21wYXJpc29uIG9yZGVyIGlzIGlnbm9yYWJsZS4KICAgICogQHBhcmFtIG9yZGVyIHRoZSBjb2xsYXRpb24gb3JkZXIuCiAgICAqIEByZXR1cm4gVFJVRSBpZiBhIGNoYXJhY3RlciBpcyBpZ25vcmFibGUsIEZBTFNFIG90aGVyd2lzZS4KICAgICogQHN0YWJsZSBJQ1UgMi4wCiAgICAqLwogICAgc3RhdGljIFVCb29sIGlzSWdub3JhYmxlKGludDMyX3Qgb3JkZXIpOwoKICAgIC8qKgogICAgKiBHZXRzIHRoZSBvZmZzZXQgb2YgdGhlIGN1cnJlbnRseSBwcm9jZXNzZWQgY2hhcmFjdGVyIGluIHRoZSBzb3VyY2Ugc3RyaW5nLgogICAgKiBAcmV0dXJuIHRoZSBvZmZzZXQgb2YgdGhlIGNoYXJhY3Rlci4KICAgICogQHN0YWJsZSBJQ1UgMi4wCiAgICAqLwogICAgaW50MzJfdCBnZXRPZmZzZXQodm9pZCkgY29uc3Q7CgogICAgLyoqCiAgICAqIFNldHMgdGhlIG9mZnNldCBvZiB0aGUgY3VycmVudGx5IHByb2Nlc3NlZCBjaGFyYWN0ZXIgaW4gdGhlIHNvdXJjZSBzdHJpbmcuCiAgICAqIEBwYXJhbSBuZXdPZmZzZXQgdGhlIG5ldyBvZmZzZXQuCiAgICAqIEBwYXJhbSBzdGF0dXMgdGhlIGVycm9yIGNvZGUgc3RhdHVzLgogICAgKiBAcmV0dXJuIHRoZSBvZmZzZXQgb2YgdGhlIGNoYXJhY3Rlci4KICAgICogQHN0YWJsZSBJQ1UgMi4wCiAgICAqLwogICAgdm9pZCBzZXRPZmZzZXQoaW50MzJfdCBuZXdPZmZzZXQsIFVFcnJvckNvZGUmIHN0YXR1cyk7CgogICAgLyoqCiAgICAqIElDVSAicG9vciBtYW4ncyBSVFRJIiwgcmV0dXJucyBhIFVDbGFzc0lEIGZvciB0aGUgYWN0dWFsIGNsYXNzLgogICAgKgogICAgKiBAc3RhYmxlIElDVSAyLjIKICAgICovCiAgICB2aXJ0dWFsIFVDbGFzc0lEIGdldER5bmFtaWNDbGFzc0lEKCkgY29uc3Q7CgogICAgLyoqCiAgICAqIElDVSAicG9vciBtYW4ncyBSVFRJIiwgcmV0dXJucyBhIFVDbGFzc0lEIGZvciB0aGlzIGNsYXNzLgogICAgKgogICAgKiBAc3RhYmxlIElDVSAyLjIKICAgICovCiAgICBzdGF0aWMgVUNsYXNzSUQgZ2V0U3RhdGljQ2xhc3NJRCgpOwoKcHJvdGVjdGVkOgogIAogICAgLy8gQ29sbGF0aW9uRWxlbWVudEl0ZXJhdG9yIHByb3RlY3RlZCBjb25zdHJ1Y3RvcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIC8qKgogICAgKiBAc3RhYmxlIElDVSAyLjAKICAgICovCiAgICBmcmllbmQgY2xhc3MgUnVsZUJhc2VkQ29sbGF0b3I7CgogICAgLyoqCiAgICAqIENvbGxhdGlvbkVsZW1lbnRJdGVyYXRvciBjb25zdHJ1Y3Rvci4gVGhpcyB0YWtlcyB0aGUgc291cmNlIHN0cmluZyBhbmQgdGhlIAogICAgKiBjb2xsYXRpb24gb2JqZWN0LiBUaGUgY3Vyc29yIHdpbGwgd2FsayB0aHJ1IHRoZSBzb3VyY2Ugc3RyaW5nIGJhc2VkIG9uIHRoZSAKICAgICogcHJlZGVmaW5lZCBjb2xsYXRpb24gcnVsZXMuIElmIHRoZSBzb3VyY2Ugc3RyaW5nIGlzIGVtcHR5LCBOVUxMT1JERVIgd2lsbCAKICAgICogYmUgcmV0dXJuZWQgb24gdGhlIGNhbGxzIHRvIG5leHQoKS4KICAgICogQHBhcmFtIHNvdXJjZVRleHQgICAgdGhlIHNvdXJjZSBzdHJpbmcuCiAgICAqIEBwYXJhbSBvcmRlciAgICAgICAgIHRoZSBjb2xsYXRpb24gb2JqZWN0LgogICAgKiBAcGFyYW0gc3RhdHVzICAgICAgICB0aGUgZXJyb3IgY29kZSBzdGF0dXMuCiAgICAqIEBzdGFibGUgSUNVIDIuMAogICAgKi8KICAgIENvbGxhdGlvbkVsZW1lbnRJdGVyYXRvcihjb25zdCBVbmljb2RlU3RyaW5nJiBzb3VyY2VUZXh0LAogICAgICAgIGNvbnN0IFJ1bGVCYXNlZENvbGxhdG9yKiBvcmRlciwgVUVycm9yQ29kZSYgc3RhdHVzKTsKCiAgICAvKioKICAgICogQ29sbGF0aW9uRWxlbWVudEl0ZXJhdG9yIGNvbnN0cnVjdG9yLiBUaGlzIHRha2VzIHRoZSBzb3VyY2Ugc3RyaW5nIGFuZCB0aGUgCiAgICAqIGNvbGxhdGlvbiBvYmplY3QuICBUaGUgY3Vyc29yIHdpbGwgd2FsayB0aHJ1IHRoZSBzb3VyY2Ugc3RyaW5nIGJhc2VkIG9uIHRoZSAKICAgICogcHJlZGVmaW5lZCBjb2xsYXRpb24gcnVsZXMuICBJZiB0aGUgc291cmNlIHN0cmluZyBpcyBlbXB0eSwgTlVMTE9SREVSIHdpbGwgCiAgICAqIGJlIHJldHVybmVkIG9uIHRoZSBjYWxscyB0byBuZXh0KCkuCiAgICAqIEBwYXJhbSBzb3VyY2VUZXh0ICAgIHRoZSBzb3VyY2Ugc3RyaW5nLgogICAgKiBAcGFyYW0gb3JkZXIgICAgICAgICB0aGUgY29sbGF0aW9uIG9iamVjdC4KICAgICogQHBhcmFtIHN0YXR1cyAgICAgICAgdGhlIGVycm9yIGNvZGUgc3RhdHVzLgogICAgKiBAc3RhYmxlIElDVSAyLjAKICAgICovCiAgICBDb2xsYXRpb25FbGVtZW50SXRlcmF0b3IoY29uc3QgQ2hhcmFjdGVySXRlcmF0b3ImIHNvdXJjZVRleHQsCiAgICAgICAgY29uc3QgUnVsZUJhc2VkQ29sbGF0b3IqIG9yZGVyLCBVRXJyb3JDb2RlJiBzdGF0dXMpOwoKICAgIC8vIENvbGxhdGlvbkVsZW1lbnRJdGVyYXRvciBwcm90ZWN0ZWQgbWV0aG9kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgLyoqCiAgICAqIEFzc2lnbm1lbnQgb3BlcmF0b3IKICAgICoKICAgICogQHBhcmFtIG90aGVyICAgIHRoZSBvYmplY3QgdG8gYmUgY29waWVkCiAgICAqIEBzdGFibGUgSUNVIDIuMAogICAgKi8KICAgIGNvbnN0IENvbGxhdGlvbkVsZW1lbnRJdGVyYXRvciYKICAgICAgICBvcGVyYXRvcj0oY29uc3QgQ29sbGF0aW9uRWxlbWVudEl0ZXJhdG9yJiBvdGhlcik7Cgpwcml2YXRlOgogICAgQ29sbGF0aW9uRWxlbWVudEl0ZXJhdG9yKCk7IC8vIGRlZmF1bHQgY29uc3RydWN0b3Igbm90IGltcGxlbWVudGVkCgogICAgLy8gQ29sbGF0aW9uRWxlbWVudEl0ZXJhdG9yIHByaXZhdGUgZGF0YSBtZW1iZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICAvKioKICAgICogRGF0YSB3cmFwcGVyIGZvciBjb2xsYXRpb24gZWxlbWVudHMKICAgICovCiAgICBVQ29sbGF0aW9uRWxlbWVudHMgKm1fZGF0YV87CgogICAgLyoqCiAgICAqIEluZGljYXRlcyBpZiBtX2RhdGFfIGJlbG9uZ3MgdG8gdGhpcyBvYmplY3QuCiAgICAqLwogICAgVUJvb2wgaXNEYXRhT3duZWRfOwoKfTsKCi8vIENvbGxhdGlvbkVsZW1lbnRJdGVyYXRvciBpbmxpbmUgbWV0aG9kIGRlZmluYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCi8qKgoqIEdldCB0aGUgcHJpbWFyeSBvcmRlciBvZiBhIGNvbGxhdGlvbiBvcmRlci4KKiBAcGFyYW0gb3JkZXIgdGhlIGNvbGxhdGlvbiBvcmRlcgoqIEByZXR1cm4gdGhlIHByaW1hcnkgb3JkZXIgb2YgYSBjb2xsYXRpb24gb3JkZXIuCiovCmlubGluZSBpbnQzMl90IENvbGxhdGlvbkVsZW1lbnRJdGVyYXRvcjo6cHJpbWFyeU9yZGVyKGludDMyX3Qgb3JkZXIpCnsKICAgIG9yZGVyICY9IFJ1bGVCYXNlZENvbGxhdG9yOjpQUklNQVJZT1JERVJNQVNLOwogICAgcmV0dXJuIChvcmRlciA+PiBSdWxlQmFzZWRDb2xsYXRvcjo6UFJJTUFSWU9SREVSU0hJRlQpOwp9CgovKioKKiBHZXQgdGhlIHNlY29uZGFyeSBvcmRlciBvZiBhIGNvbGxhdGlvbiBvcmRlci4KKiBAcGFyYW0gb3JkZXIgdGhlIGNvbGxhdGlvbiBvcmRlcgoqIEByZXR1cm4gdGhlIHNlY29uZGFyeSBvcmRlciBvZiBhIGNvbGxhdGlvbiBvcmRlci4KKi8KaW5saW5lIGludDMyX3QgQ29sbGF0aW9uRWxlbWVudEl0ZXJhdG9yOjpzZWNvbmRhcnlPcmRlcihpbnQzMl90IG9yZGVyKQp7CiAgICBvcmRlciA9IG9yZGVyICYgUnVsZUJhc2VkQ29sbGF0b3I6OlNFQ09OREFSWU9SREVSTUFTSzsKICAgIHJldHVybiAob3JkZXIgPj4gUnVsZUJhc2VkQ29sbGF0b3I6OlNFQ09OREFSWU9SREVSU0hJRlQpOwp9CgovKioKKiBHZXQgdGhlIHRlcnRpYXJ5IG9yZGVyIG9mIGEgY29sbGF0aW9uIG9yZGVyLgoqIEBwYXJhbSBvcmRlciB0aGUgY29sbGF0aW9uIG9yZGVyCiogQHJldHVybiB0aGUgdGVydGlhcnkgb3JkZXIgb2YgYSBjb2xsYXRpb24gb3JkZXIuCiovCmlubGluZSBpbnQzMl90IENvbGxhdGlvbkVsZW1lbnRJdGVyYXRvcjo6dGVydGlhcnlPcmRlcihpbnQzMl90IG9yZGVyKQp7CiAgICByZXR1cm4gKG9yZGVyICY9IFJ1bGVCYXNlZENvbGxhdG9yOjpURVJUSUFSWU9SREVSTUFTSyk7Cn0KCmlubGluZSBpbnQzMl90IENvbGxhdGlvbkVsZW1lbnRJdGVyYXRvcjo6Z2V0TWF4RXhwYW5zaW9uKGludDMyX3Qgb3JkZXIpIGNvbnN0CnsKICAgIHJldHVybiB1Y29sX2dldE1heEV4cGFuc2lvbihtX2RhdGFfLCAodWludDMyX3Qpb3JkZXIpOwp9CgppbmxpbmUgVUJvb2wgQ29sbGF0aW9uRWxlbWVudEl0ZXJhdG9yOjppc0lnbm9yYWJsZShpbnQzMl90IG9yZGVyKQp7CiAgICByZXR1cm4gKHByaW1hcnlPcmRlcihvcmRlcikgPT0gUnVsZUJhc2VkQ29sbGF0b3I6OlBSSU1JR05PUkFCTEUpOwp9CgpVX05BTUVTUEFDRV9FTkQKCiNlbmRpZiAvKiAjaWYgIVVDT05GSUdfTk9fQ09MTEFUSU9OICovCgojZW5kaWYK