LyoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIENvcHlyaWdodCAoYykgMTk5Ni0yMDA0LCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqLwoKI2lmbmRlZiBVQ09MX0gKI2RlZmluZSBVQ09MX0gKCiNpbmNsdWRlICJ1bmljb2RlL3V0eXBlcy5oIgoKI2lmICFVQ09ORklHX05PX0NPTExBVElPTgoKI2luY2x1ZGUgInVuaWNvZGUvdW5vcm0uaCIKI2luY2x1ZGUgInVuaWNvZGUvcGFyc2VlcnIuaCIKI2luY2x1ZGUgInVuaWNvZGUvdWxvYy5oIgojaW5jbHVkZSAidW5pY29kZS91c2V0LmgiCgovKioKICogXGZpbGUKICogXGJyaWVmIEMgQVBJOiBDb2xsYXRvciAKICoKICogPGgyPiBDb2xsYXRvciBDIEFQSSA8L2gyPgogKgogKiBUaGUgQyBBUEkgZm9yIENvbGxhdG9yIHBlcmZvcm1zIGxvY2FsZS1zZW5zaXRpdmUKICogc3RyaW5nIGNvbXBhcmlzb24uIFlvdSB1c2UgdGhpcyBzZXJ2aWNlIHRvIGJ1aWxkCiAqIHNlYXJjaGluZyBhbmQgc29ydGluZyByb3V0aW5lcyBmb3IgbmF0dXJhbCBsYW5ndWFnZSB0ZXh0LgogKiA8ZW0+SW1wb3J0YW50OiA8L2VtPlRoZSBJQ1UgY29sbGF0aW9uIHNlcnZpY2UgaGFzIGJlZW4gcmVpbXBsZW1lbnRlZCAKICogaW4gb3JkZXIgdG8gYWNoaWV2ZSBiZXR0ZXIgcGVyZm9ybWFuY2UgYW5kIFVDQSBjb21wbGlhbmNlLiAKICogRm9yIGRldGFpbHMsIHNlZSB0aGUgCiAqIDxhIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9jdnMvaWN1L35jaGVja291dH4vaWN1aHRtbC9kZXNpZ24vY29sbGF0aW9uL0lDVV9jb2xsYXRpb25fZGVzaWduLmh0bSI+CiAqIGNvbGxhdGlvbiBkZXNpZ24gZG9jdW1lbnQ8L2E+LgogKiA8cD4KICogRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbGxhdGlvbiBzZXJ2aWNlIHNlZSAKICogPGEgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2ljdS91c2VyZ3VpZGUvQ29sbGF0ZV9JbnRyby5odG1sIj50aGUgdXNlcnMgZ3VpZGU8L2E+LgogKiA8cD4KICogQ29sbGF0aW9uIHNlcnZpY2UgcHJvdmlkZXMgY29ycmVjdCBzb3J0aW5nIG9yZGVycyBmb3IgbW9zdCBsb2NhbGVzIHN1cHBvcnRlZCBpbiBJQ1UuIAogKiBJZiBzcGVjaWZpYyBkYXRhIGZvciBhIGxvY2FsZSBpcyBub3QgYXZhaWxhYmxlLCB0aGUgb3JkZXJzIGV2ZW50dWFsbHkgZmFsbHMgYmFjawogKiB0byB0aGUgPGEgaHJlZj0iaHR0cDovL3d3dy51bmljb2RlLm9yZy91bmljb2RlL3JlcG9ydHMvdHIxMC8iPlVDQSBzb3J0IG9yZGVyPC9hPi4gCiAqIDxwPgogKiBTb3J0IG9yZGVyaW5nIG1heSBiZSBjdXN0b21pemVkIGJ5IHByb3ZpZGluZyB5b3VyIG93biBzZXQgb2YgcnVsZXMuIEZvciBtb3JlIG9uCiAqIHRoaXMgc3ViamVjdCBzZWUgdGhlIAogKiA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vaWN1L3VzZXJndWlkZS9Db2xsYXRlX0N1c3RvbWl6YXRpb24uaHRtbCI+CiAqIENvbGxhdGlvbiBjdXN0b21pemF0aW9uPC9hPiBzZWN0aW9uIG9mIHRoZSB1c2VycyBndWlkZS4KICogPHA+CiAqIEBzZWUgICAgICAgICBVQ29sbGF0aW9uUmVzdWx0CiAqIEBzZWUgICAgICAgICBVTm9ybWFsaXphdGlvbk1vZGUKICogQHNlZSAgICAgICAgIFVDb2xsYXRpb25TdHJlbmd0aAogKiBAc2VlICAgICAgICAgVUNvbGxhdGlvbkVsZW1lbnRzCiAqLwoKLyoqIEEgY29sbGF0aW9uIGVsZW1lbnQgaXRlcmF0b3IuCiogIEZvciB1c2FnZSBpbiBDIHByb2dyYW1zLgoqLwpzdHJ1Y3QgY29sbEl0ZXJhdGU7Ci8qKiBzdHJ1Y3R1cmUgcmVwcmVzZW50aW5nIGNvbGxhdGlvbiBlbGVtZW50IGl0ZXJhdG9yIGluc3RhbmNlIAogKiBAc3RhYmxlIElDVSAyLjAKICovCnR5cGVkZWYgc3RydWN0IGNvbGxJdGVyYXRlIGNvbGxJdGVyYXRlOwoKLyoqIEEgY29sbGF0b3IuCiogIEZvciB1c2FnZSBpbiBDIHByb2dyYW1zLgoqLwpzdHJ1Y3QgVUNvbGxhdG9yOwovKiogc3RydWN0dXJlIHJlcHJlc2VudGluZyBhIGNvbGxhdG9yIG9iamVjdCBpbnN0YW5jZSAKICogQHN0YWJsZSBJQ1UgMi4wCiAqLwp0eXBlZGVmIHN0cnVjdCBVQ29sbGF0b3IgVUNvbGxhdG9yOwoKCi8qKgogKiBVQ09MX0xFU1MgaXMgcmV0dXJuZWQgaWYgc291cmNlIHN0cmluZyBpcyBjb21wYXJlZCB0byBiZSBsZXNzIHRoYW4gdGFyZ2V0CiAqIHN0cmluZyBpbiB0aGUgdV9zdHJjb2xsKCkgbWV0aG9kLgogKiBVQ09MX0VRVUFMIGlzIHJldHVybmVkIGlmIHNvdXJjZSBzdHJpbmcgaXMgY29tcGFyZWQgdG8gYmUgZXF1YWwgdG8gdGFyZ2V0CiAqIHN0cmluZyBpbiB0aGUgdV9zdHJjb2xsKCkgbWV0aG9kLgogKiBVQ09MX0dSRUFURVIgaXMgcmV0dXJuZWQgaWYgc291cmNlIHN0cmluZyBpcyBjb21wYXJlZCB0byBiZSBncmVhdGVyIHRoYW4KICogdGFyZ2V0IHN0cmluZyBpbiB0aGUgdV9zdHJjb2xsKCkgbWV0aG9kLgogKiBAc2VlIHVfc3RyY29sbCgpCiAqIDxwPgogKiBQb3NzaWJsZSB2YWx1ZXMgZm9yIGEgY29tcGFyaXNvbiByZXN1bHQgCiAqIEBzdGFibGUgSUNVIDIuMAogKi8KdHlwZWRlZiBlbnVtIHsKICAvKiogc3RyaW5nIGEgPT0gc3RyaW5nIGIgKi8KICBVQ09MX0VRVUFMICAgID0gMCwKICAvKiogc3RyaW5nIGEgPiBzdHJpbmcgYiAqLwogIFVDT0xfR1JFQVRFUiAgICA9IDEsCiAgLyoqIHN0cmluZyBhIDwgc3RyaW5nIGIgKi8KICBVQ09MX0xFU1MgICAgPSAtMQp9IFVDb2xsYXRpb25SZXN1bHQgOwoKCi8qKiBFbnVtIGNvbnRhaW5pbmcgYXR0cmlidXRlIHZhbHVlcyBmb3IgY29udHJvbGluZyBjb2xsYXRpb24gYmVoYXZpb3IuCiAqIEhlcmUgYXJlIGFsbCB0aGUgYWxsb3dhYmxlIHZhbHVlcy4gTm90IGV2ZXJ5IGF0dHJpYnV0ZSBjYW4gdGFrZSBldmVyeSB2YWx1ZS4gVGhlIG9ubHkKICogdW5pdmVyc2FsIHZhbHVlIGlzIFVDT0xfREVGQVVMVCwgd2hpY2ggcmVzZXRzIHRoZSBhdHRyaWJ1dGUgdmFsdWUgdG8gdGhlIHByZWRlZmluZWQgIAogKiB2YWx1ZSBmb3IgdGhhdCBsb2NhbGUgCiAqIEBzdGFibGUgSUNVIDIuMAogKi8KdHlwZWRlZiBlbnVtIHsKICAvKiogYWNjZXB0ZWQgYnkgbW9zdCBhdHRyaWJ1dGVzICovCiAgVUNPTF9ERUZBVUxUID0gLTEsCgogIC8qKiBQcmltYXJ5IGNvbGxhdGlvbiBzdHJlbmd0aCAqLwogIFVDT0xfUFJJTUFSWSA9IDAsCiAgLyoqIFNlY29uZGFyeSBjb2xsYXRpb24gc3RyZW5ndGggKi8KICBVQ09MX1NFQ09OREFSWSA9IDEsCiAgLyoqIFRlcnRpYXJ5IGNvbGxhdGlvbiBzdHJlbmd0aCAqLwogIFVDT0xfVEVSVElBUlkgPSAyLAogIC8qKiBEZWZhdWx0IGNvbGxhdGlvbiBzdHJlbmd0aCAqLwogIFVDT0xfREVGQVVMVF9TVFJFTkdUSCA9IFVDT0xfVEVSVElBUlksCiAgVUNPTF9DRV9TVFJFTkdUSF9MSU1JVCwKICAvKiogUXVhdGVybmFyeSBjb2xsYXRpb24gc3RyZW5ndGggKi8KICBVQ09MX1FVQVRFUk5BUlk9MywKICAvKiogSWRlbnRpY2FsIGNvbGxhdGlvbiBzdHJlbmd0aCAqLwogIFVDT0xfSURFTlRJQ0FMPTE1LAogIFVDT0xfU1RSRU5HVEhfTElNSVQsCgogIC8qKiBUdXJuIHRoZSBmZWF0dXJlIG9mZiAtIHdvcmtzIGZvciBVQ09MX0ZSRU5DSF9DT0xMQVRJT04sIAogICAgICBVQ09MX0NBU0VfTEVWRUwsIFVDT0xfSElSQUdBTkFfUVVBVEVSTkFSWV9NT0RFCiAgICAgICYgVUNPTF9ERUNPTVBPU0lUSU9OX01PREUqLwogIFVDT0xfT0ZGID0gMTYsCiAgLyoqIFR1cm4gdGhlIGZlYXR1cmUgb24gLSB3b3JrcyBmb3IgVUNPTF9GUkVOQ0hfQ09MTEFUSU9OLCAKICAgICAgVUNPTF9DQVNFX0xFVkVMLCBVQ09MX0hJUkFHQU5BX1FVQVRFUk5BUllfTU9ERQogICAgICAmIFVDT0xfREVDT01QT1NJVElPTl9NT0RFKi8KICBVQ09MX09OID0gMTcsCiAgCiAgLyoqIFZhbGlkIGZvciBVQ09MX0FMVEVSTkFURV9IQU5ETElORy4gQWx0ZXJuYXRlIGhhbmRsaW5nIHdpbGwgYmUgc2hpZnRlZCAqLwogIFVDT0xfU0hJRlRFRCA9IDIwLAogIC8qKiBWYWxpZCBmb3IgVUNPTF9BTFRFUk5BVEVfSEFORExJTkcuIEFsdGVybmF0ZSBoYW5kbGluZyB3aWxsIGJlIG5vbiBpZ25vcmFibGUgKi8KICBVQ09MX05PTl9JR05PUkFCTEUgPSAyMSwKCiAgLyoqIFZhbGlkIGZvciBVQ09MX0NBU0VfRklSU1QgLSAKICAgICAgbG93ZXIgY2FzZSBzb3J0cyBiZWZvcmUgdXBwZXIgY2FzZSAqLwogIFVDT0xfTE9XRVJfRklSU1QgPSAyNCwKICAvKiogdXBwZXIgY2FzZSBzb3J0cyBiZWZvcmUgbG93ZXIgY2FzZSAqLwogIFVDT0xfVVBQRVJfRklSU1QgPSAyNSwKCiAgVUNPTF9BVFRSSUJVVEVfVkFMVUVfQ09VTlQKCn0gVUNvbEF0dHJpYnV0ZVZhbHVlOwoKLyoqCiAqIEJhc2UgbGV0dGVyIHJlcHJlc2VudHMgYSBwcmltYXJ5IGRpZmZlcmVuY2UuICBTZXQgY29tcGFyaXNvbgogKiBsZXZlbCB0byBVQ09MX1BSSU1BUlkgdG8gaWdub3JlIHNlY29uZGFyeSBhbmQgdGVydGlhcnkgZGlmZmVyZW5jZXMuCiAqIFVzZSB0aGlzIHRvIHNldCB0aGUgc3RyZW5ndGggb2YgYSBDb2xsYXRvciBvYmplY3QuCiAqIEV4YW1wbGUgb2YgcHJpbWFyeSBkaWZmZXJlbmNlLCAiYWJjIiAmbHQ7ICJhYmQiCiAqIAogKiBEaWFjcml0aWNhbCBkaWZmZXJlbmNlcyBvbiB0aGUgc2FtZSBiYXNlIGxldHRlciByZXByZXNlbnQgYSBzZWNvbmRhcnkKICogZGlmZmVyZW5jZS4gIFNldCBjb21wYXJpc29uIGxldmVsIHRvIFVDT0xfU0VDT05EQVJZIHRvIGlnbm9yZSB0ZXJ0aWFyeQogKiBkaWZmZXJlbmNlcy4gVXNlIHRoaXMgdG8gc2V0IHRoZSBzdHJlbmd0aCBvZiBhIENvbGxhdG9yIG9iamVjdC4KICogRXhhbXBsZSBvZiBzZWNvbmRhcnkgZGlmZmVyZW5jZSwgIuQiID4+ICJhIi4KICoKICogVXBwZXJjYXNlIGFuZCBsb3dlcmNhc2UgdmVyc2lvbnMgb2YgdGhlIHNhbWUgY2hhcmFjdGVyIHJlcHJlc2VudHMgYQogKiB0ZXJ0aWFyeSBkaWZmZXJlbmNlLiAgU2V0IGNvbXBhcmlzb24gbGV2ZWwgdG8gVUNPTF9URVJUSUFSWSB0byBpbmNsdWRlCiAqIGFsbCBjb21wYXJpc29uIGRpZmZlcmVuY2VzLiBVc2UgdGhpcyB0byBzZXQgdGhlIHN0cmVuZ3RoIG9mIGEgQ29sbGF0b3IKICogb2JqZWN0LgogKiBFeGFtcGxlIG9mIHRlcnRpYXJ5IGRpZmZlcmVuY2UsICJhYmMiICZsdDsmbHQ7Jmx0OyAiQUJDIi4KICoKICogVHdvIGNoYXJhY3RlcnMgYXJlIGNvbnNpZGVyZWQgImlkZW50aWNhbCIgd2hlbiB0aGV5IGhhdmUgdGhlIHNhbWUKICogdW5pY29kZSBzcGVsbGluZ3MuICBVQ09MX0lERU5USUNBTC4KICogRm9yIGV4YW1wbGUsICLkIiA9PSAi5CIuCiAqCiAqIFVDb2xsYXRpb25TdHJlbmd0aCBpcyBhbHNvIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBzdHJlbmd0aCBvZiBzb3J0IGtleXMgCiAqIGdlbmVyYXRlZCBmcm9tIFVDb2xsYXRvciBvYmplY3RzCiAqIFRoZXNlIHZhbHVlcyBjYW4gYmUgbm93IGZvdW5kIGluIHRoZSBVQ29sQXR0cmlidXRlVmFsdWUgZW51bS4KICogQHN0YWJsZSBJQ1UgMi4wCiAqKi8KdHlwZWRlZiBVQ29sQXR0cmlidXRlVmFsdWUgVUNvbGxhdGlvblN0cmVuZ3RoOwoKLyoqIEF0dHJpYnV0ZXMgdGhhdCBjb2xsYXRpb24gc2VydmljZSB1bmRlcnN0YW5kcy4gQWxsIHRoZSBhdHRyaWJ1dGVzIGNhbiB0YWtlIFVDT0xfREVGQVVMVAogKiB2YWx1ZSwgYXMgd2VsbCBhcyB0aGUgdmFsdWVzIHNwZWNpZmljIHRvIGVhY2ggb25lLiAKICogQHN0YWJsZSBJQ1UgMi4wCiAqLwp0eXBlZGVmIGVudW0gewogICAgIC8qKiBBdHRyaWJ1dGUgZm9yIGRpcmVjdGlvbiBvZiBzZWNvbmRhcnkgd2VpZ2h0cyAtIHVzZWQgaW4gRnJlbmNoLlwgCiAgICAgICogQWNjZXB0YWJsZSB2YWx1ZXMgYXJlIFVDT0xfT04sIHdoaWNoIHJlc3VsdHMgaW4gc2Vjb25kYXJ5IHdlaWdodHMKICAgICAgKiBiZWluZyBjb25zaWRlcmVkIGJhY2t3YXJkcyBhbmQgVUNPTF9PRkYgd2hpY2ggdHJlYXRzIHNlY29uZGFyeQogICAgICAqIHdlaWdodHMgaW4gdGhlIG9yZGVyIHRoZXkgYXBwZWFyLiovCiAgICAgVUNPTF9GUkVOQ0hfQ09MTEFUSU9OLCAKICAgICAvKiogQXR0cmlidXRlIGZvciBoYW5kbGluZyB2YXJpYWJsZSBlbGVtZW50cy5cIAogICAgICAqIEFjY2VwdGFibGUgdmFsdWVzIGFyZSBVQ09MX05PTl9JR05PUkFCTEUgKGRlZmF1bHQpCiAgICAgICogd2hpY2ggdHJlYXRzIGFsbCB0aGUgY29kZXBvaW50cyB3aXRoIG5vbi1pZ25vcmFibGUgCiAgICAgICogcHJpbWFyeSB3ZWlnaHRzIGluIHRoZSBzYW1lIHdheSwKICAgICAgKiBhbmQgVUNPTF9TSElGVEVEIHdoaWNoIGNhdXNlcyBjb2RlcG9pbnRzIHdpdGggcHJpbWFyeSAKICAgICAgKiB3ZWlnaHRzIHRoYXQgYXJlIGVxdWFsIG9yIGJlbG93IHRoZSB2YXJpYWJsZSB0b3AgdmFsdWUKICAgICAgKiB0byBiZSBpZ25vcmVkIG9uIHByaW1hcnkgbGV2ZWwgYW5kIG1vdmVkIHRvIHRoZSBxdWF0ZXJuYXJ5IAogICAgICAqIGxldmVsLiovCiAgICAgVUNPTF9BTFRFUk5BVEVfSEFORExJTkcsIAogICAgIC8qKiBDb250cm9scyB0aGUgb3JkZXJpbmcgb2YgdXBwZXIgYW5kIGxvd2VyIGNhc2UgbGV0dGVycy5cIAogICAgICAqIEFjY2VwdGFibGUgdmFsdWVzIGFyZSBVQ09MX09GRiAoZGVmYXVsdCksIHdoaWNoIG9yZGVycwogICAgICAqIHVwcGVyIGFuZCBsb3dlciBjYXNlIGxldHRlcnMgaW4gYWNjb3JkYW5jZSB0byB0aGVpciB0ZXJ0aWFyeQogICAgICAqIHdlaWdodHMsIFVDT0xfVVBQRVJfRklSU1Qgd2hpY2ggZm9yY2VzIHVwcGVyIGNhc2UgbGV0dGVycyB0byAKICAgICAgKiBzb3J0IGJlZm9yZSBsb3dlciBjYXNlIGxldHRlcnMsIGFuZCBVQ09MX0xPV0VSX0ZJUlNUIHdoaWNoIGRvZXMgCiAgICAgICogdGhlIG9wcG9zaXRlLiAqLwogICAgIFVDT0xfQ0FTRV9GSVJTVCwgCiAgICAgLyoqIENvbnRyb2xzIHdoZXRoZXIgYW4gZXh0cmEgY2FzZSBsZXZlbCAocG9zaXRpb25lZCBiZWZvcmUgdGhlIHRoaXJkCiAgICAgICogbGV2ZWwpIGlzIGdlbmVyYXRlZCBvciBub3QuXCBBY2NlcHRhYmxlIHZhbHVlcyBhcmUgVUNPTF9PRkYgKGRlZmF1bHQpLCAKICAgICAgKiB3aGVuIGNhc2UgbGV2ZWwgaXMgbm90IGdlbmVyYXRlZCwgYW5kIFVDT0xfT04gd2hpY2ggY2F1c2VzIHRoZSBjYXNlCiAgICAgICogbGV2ZWwgdG8gYmUgZ2VuZXJhdGVkLlwgQ29udGVudHMgb2YgdGhlIGNhc2UgbGV2ZWwgYXJlIGFmZmVjdGVkIGJ5CiAgICAgICogdGhlIHZhbHVlIG9mIFVDT0xfQ0FTRV9GSVJTVCBhdHRyaWJ1dGUuXCBBIHNpbXBsZSB3YXkgdG8gaWdub3JlIAogICAgICAqIGFjY2VudCBkaWZmZXJlbmNlcyBpbiBhIHN0cmluZyBpcyB0byBzZXQgdGhlIHN0cmVuZ3RoIHRvIFVDT0xfUFJJTUFSWQogICAgICAqIGFuZCBlbmFibGUgY2FzZSBsZXZlbC4gKi8KICAgICBVQ09MX0NBU0VfTEVWRUwsCiAgICAgLyoqIENvbnRyb2xzIHdoZXRoZXIgdGhlIG5vcm1hbGl6YXRpb24gY2hlY2sgYW5kIG5lY2Vzc2FyeSBub3JtYWxpemF0aW9ucwogICAgICAqIGFyZSBwZXJmb3JtZWQuXCBXaGVuIHNldCB0byBVQ09MX09GRiAoZGVmYXVsdCkgbm8gbm9ybWFsaXphdGlvbiBjaGVjawogICAgICAqIGlzIHBlcmZvcm1lZC5cIFRoZSBjb3JyZWN0bmVzcyBvZiB0aGUgcmVzdWx0IGlzIGd1YXJhbnRlZWQgb25seSBpZiB0aGUgCiAgICAgICogaW5wdXQgZGF0YSBpcyBpbiBzby1jYWxsZWQgRkNEIGZvcm0gKHNlZSB1c2VycyBtYW51YWwgZm9yIG1vcmUgaW5mbykuXCAKICAgICAgKiBXaGVuIHNldCB0byBVQ09MX09OLCBhbiBpbmNyZW1lbnRhbCBjaGVjayBpcyBwZXJmb3JtZWQgdG8gc2VlIHdoZXRoZXIgdGhlIGlucHV0IGRhdGEKICAgICAgKiBpcyBpbiB0aGUgRkNEIGZvcm0uXCBJZiB0aGUgZGF0YSBpcyBub3QgaW4gdGhlIEZDRCBmb3JtLCBpbmNyZW1lbnRhbCAKICAgICAgKiBORkQgbm9ybWFsaXphdGlvbiBpcyBwZXJmb3JtZWQuICovCiAgICAgVUNPTF9OT1JNQUxJWkFUSU9OX01PREUsIAogICAgIC8qKiBBbiBhbGlhcyBmb3IgVUNPTF9OT1JNQUxJWkFUSU9OX01PREUgYXR0cmlidXRlICovCiAgICAgVUNPTF9ERUNPTVBPU0lUSU9OX01PREUgPSBVQ09MX05PUk1BTElaQVRJT05fTU9ERSwKICAgICAvKiogVGhlIHN0cmVuZ3RoIGF0dHJpYnV0ZS5cIENhbiBiZSBlaXRoZXIgVUNPTF9QUklNQVJZLCBVQ09MX1NFQ09OREFSWSwKICAgICAgKiBVQ09MX1RFUlRJQVJZLCBVQ09MX1FVQVRFUk5BUlkgb3IgVUNPTF9JREVOVElDQUwuXCBUaGUgdXN1YWwgc3RyZW5ndGgKICAgICAgKiBmb3IgbW9zdCBsb2NhbGVzIChleGNlcHQgSmFwYW5lc2UpIGlzIHRlcnRpYXJ5LlwgUXVhdGVybmFyeSBzdHJlbmd0aCAKICAgICAgKiBpcyB1c2VmdWwgd2hlbiBjb21iaW5lZCB3aXRoIHNoaWZ0ZWQgc2V0dGluZyBmb3IgYWx0ZXJuYXRlIGhhbmRsaW5nCiAgICAgICogYXR0cmlidXRlIGFuZCBmb3IgSklTIHggNDA2MSBjb2xsYXRpb24sIHdoZW4gaXQgaXMgdXNlZCB0byBkaXN0aW5ndWlzaAogICAgICAqIGJldHdlZW4gS2F0YWthbmEgIGFuZCBIaXJhZ2FuYSAodGhpcyBpcyBhY2hpZXZlZCBieSBzZXR0aW5nIHRoZSAKICAgICAgKiBVQ09MX0hJUkFHQU5BX1FVQVRFUk5BUlkgbW9kZSB0byBvbi5cIE90aGVyd2lzZSwgcXVhdGVybmFyeSBsZXZlbAogICAgICAqIGlzIGFmZmVjdGVkIG9ubHkgYnkgdGhlIG51bWJlciBvZiBub24gaWdub3JhYmxlIGNvZGUgcG9pbnRzIGluCiAgICAgICogdGhlIHN0cmluZy5cIElkZW50aWNhbCBzdHJlbmd0aCBpcyByYXJlbHkgdXNlZnVsLCBhcyBpdCBhbW91bnRzIAogICAgICAqIHRvIGNvZGVwb2ludHMgb2YgdGhlIE5GRCBmb3JtIG9mIHRoZSBzdHJpbmcuICovCiAgICAgVUNPTF9TVFJFTkdUSCwgIAogICAgIC8qKiB3aGVuIHR1cm5lZCBvbiwgdGhpcyBhdHRyaWJ1dGUgCiAgICAgICogcG9zaXRpb25zIEhpcmFnYW5hIGJlZm9yZSBhbGwgIAogICAgICAqIG5vbi1pZ25vcmFibGVzIG9uIHF1YXRlcm5hcnkgbGV2ZWwKICAgICAgKiBUaGlzIGlzIGEgc25lYWt5IHdheSB0byBwcm9kdWNlIEpJUwogICAgICAqIHNvcnQgb3JkZXIgKi8gICAgIAogICAgIFVDT0xfSElSQUdBTkFfUVVBVEVSTkFSWV9NT0RFLAogICAgIC8qKiB3aGVuIHR1cm5lZCBvbiwgdGhpcyBhdHRyaWJ1dGUgCiAgICAgICogZ2VuZXJhdGVzIGEgY29sbGF0aW9uIGtleQogICAgICAqIGZvciB0aGUgbnVtZXJpYyB2YWx1ZSBvZiBzdWJzdHJpbmdzCiAgICAgICogb2YgZGlnaXRzLiBUaGlzIGlzIGEgd2F5IHRvIGdldCAnMTAwJyAKICAgICAgKiB0byBzb3J0IEFGVEVSICcyJy4qLyAgICAgICAgICAKICAgICBVQ09MX05VTUVSSUNfQ09MTEFUSU9OLCAKICAgICBVQ09MX0FUVFJJQlVURV9DT1VOVAp9IFVDb2xBdHRyaWJ1dGU7CgovKiogT3B0aW9ucyBmb3IgcmV0cmlldmluZyB0aGUgcnVsZSBzdHJpbmcgCiAqICBAc3RhYmxlIElDVSAyLjAKICovCnR5cGVkZWYgZW51bSB7CiAgLyoqIFJldHJpZXZlIHRhaWxvcmluZyBvbmx5ICovCiAgVUNPTF9UQUlMT1JJTkdfT05MWSwgCiAgLyoqIFJldHJpZXZlIFVDQSBydWxlcyBhbmQgdGFpbG9yaW5nICovCiAgVUNPTF9GVUxMX1JVTEVTIAp9IFVDb2xSdWxlT3B0aW9uIDsKCi8qKgogKiBPcGVuIGEgVUNvbGxhdG9yIGZvciBjb21wYXJpbmcgc3RyaW5ncy4KICogVGhlIFVDb2xsYXRvciBwb2ludGVyIGlzIHVzZWQgaW4gYWxsIHRoZSBjYWxscyB0byB0aGUgQ29sbGF0aW9uIAogKiBzZXJ2aWNlLiBBZnRlciBmaW5pc2hlZCwgY29sbGF0b3IgbXVzdCBiZSBkaXNwb3NlZCBvZiBieSBjYWxsaW5nCiAqIHtAbGluayAjdWNvbF9jbG9zZSB9LgogKiBAcGFyYW0gbG9jIFRoZSBsb2NhbGUgY29udGFpbmluZyB0aGUgcmVxdWlyZWQgY29sbGF0aW9uIHJ1bGVzLiAKICogICAgICAgICAgICBTcGVjaWFsIHZhbHVlcyBmb3IgbG9jYWxlcyBjYW4gYmUgcGFzc2VkIGluIC0gCiAqICAgICAgICAgICAgaWYgTlVMTCBpcyBwYXNzZWQgZm9yIHRoZSBsb2NhbGUsIHRoZSBkZWZhdWx0IGxvY2FsZQogKiAgICAgICAgICAgIGNvbGxhdGlvbiBydWxlcyB3aWxsIGJlIHVzZWQuIElmIGVtcHR5IHN0cmluZyAoIiIpIG9yCiAqICAgICAgICAgICAgInJvb3QiIGFyZSBwYXNzZWQsIFVDQSBydWxlcyB3aWxsIGJlIHVzZWQuCiAqIEBwYXJhbSBzdGF0dXMgQSBwb2ludGVyIHRvIGFuIFVFcnJvckNvZGUgdG8gcmVjZWl2ZSBhbnkgZXJyb3JzCiAqIEByZXR1cm4gQSBwb2ludGVyIHRvIGEgVUNvbGxhdG9yLCBvciAwIGlmIGFuIGVycm9yIG9jY3VycmVkLgogKiBAc2VlIHVjb2xfb3BlblJ1bGVzCiAqIEBzZWUgdWNvbF9zYWZlQ2xvbmUKICogQHNlZSB1Y29sX2Nsb3NlCiAqIEBzdGFibGUgSUNVIDIuMAogKi8KVV9TVEFCTEUgVUNvbGxhdG9yKiBVX0VYUE9SVDIgCnVjb2xfb3Blbihjb25zdCBjaGFyICpsb2MsIFVFcnJvckNvZGUgKnN0YXR1cyk7CgovKioKICogUHJvZHVjZSBhbiBVQ29sbGF0b3IgaW5zdGFuY2UgYWNjb3JkaW5nIHRvIHRoZSBydWxlcyBzdXBwbGllZC4KICogVGhlIHJ1bGVzIGFyZSB1c2VkIHRvIGNoYW5nZSB0aGUgZGVmYXVsdCBvcmRlcmluZywgZGVmaW5lZCBpbiB0aGUKICogVUNBIGluIGEgcHJvY2VzcyBjYWxsZWQgdGFpbG9yaW5nLiBUaGUgcmVzdWx0aW5nIFVDb2xsYXRvciBwb2ludGVyCiAqIGNhbiBiZSB1c2VkIGluIHRoZSBzYW1lIHdheSBhcyB0aGUgb25lIG9idGFpbmVkIGJ5IHtAbGluayAjdWNvbF9zdHJjb2xsIH0uCiAqIEBwYXJhbSBydWxlcyBBIHN0cmluZyBkZXNjcmliaW5nIHRoZSBjb2xsYXRpb24gcnVsZXMuIEZvciB0aGUgc3ludGF4CiAqICAgICAgICAgICAgICBvZiB0aGUgcnVsZXMgcGxlYXNlIHNlZSB1c2VycyBndWlkZS4KICogQHBhcmFtIHJ1bGVzTGVuZ3RoIFRoZSBsZW5ndGggb2YgcnVsZXMsIG9yIC0xIGlmIG51bGwtdGVybWluYXRlZC4KICogQHBhcmFtIG5vcm1hbGl6YXRpb25Nb2RlIFRoZSBub3JtYWxpemF0aW9uIG1vZGU6IE9uZSBvZgogKiAgICAgICAgICAgICBVQ09MX09GRiAgICAgKGV4cGVjdCB0aGUgdGV4dCB0byBub3QgbmVlZCBub3JtYWxpemF0aW9uKSwKICogICAgICAgICAgICAgVUNPTF9PTiAgICAgIChub3JtYWxpemUpLCBvcgogKiAgICAgICAgICAgICBVQ09MX0RFRkFVTFQgKHNldCB0aGUgbW9kZSBhY2NvcmRpbmcgdG8gdGhlIHJ1bGVzKQogKiBAcGFyYW0gc3RyZW5ndGggVGhlIGRlZmF1bHQgY29sbGF0aW9uIHN0cmVuZ3RoOyBvbmUgb2YgVUNPTF9QUklNQVJZLCBVQ09MX1NFQ09OREFSWSwKICogVUNPTF9URVJUSUFSWSwgVUNPTF9JREVOVElDQUwsVUNPTF9ERUZBVUxUX1NUUkVOR1RIIC0gY2FuIGJlIGFsc28gc2V0IGluIHRoZSBydWxlcy4KICogQHBhcmFtIHBhcnNlRXJyb3IgIEEgcG9pbnRlciB0byBVUGFyc2VFcnJvciB0byByZWNpZXZlIGluZm9ybWF0aW9uIGFib3V0IGVycm9ycwogKiAgICAgICAgICAgICAgICAgICAgb2NjdXJyZWQgZHVyaW5nIHBhcnNpbmcuIFRoaXMgYXJndW1lbnQgY2FuIGN1cnJlbnRseSBiZSBzZXQKICogICAgICAgICAgICAgICAgICAgIHRvIE5VTEwsIGJ1dCBhdCB1c2VycyBvd24gcmlzay4gUGxlYXNlIHByb3ZpZGUgYSByZWFsIHN0cnVjdHVyZS4KICogQHBhcmFtIHN0YXR1cyBBIHBvaW50ZXIgdG8gYW4gVUVycm9yQ29kZSB0byByZWNlaXZlIGFueSBlcnJvcnMKICogQHJldHVybiBBIHBvaW50ZXIgdG8gYSBVQ29sbGF0b3IuXCBJdCBpcyBub3QgZ3VhcmFudGVlZCB0aGF0IE5VTEwgYmUgcmV0dXJuZWQgaW4gY2FzZQogKiAgICAgICAgIG9mIGVycm9yIC0gcGxlYXNlIHVzZSBzdGF0dXMgYXJndW1lbnQgdG8gY2hlY2sgZm9yIGVycm9ycy4KICogQHNlZSB1Y29sX29wZW4KICogQHNlZSB1Y29sX3NhZmVDbG9uZQogKiBAc2VlIHVjb2xfY2xvc2UKICogQHN0YWJsZSBJQ1UgMi4wCiAqLwpVX1NUQUJMRSBVQ29sbGF0b3IqIFVfRVhQT1JUMiAKdWNvbF9vcGVuUnVsZXMoIGNvbnN0IFVDaGFyICAgICAgICAqcnVsZXMsCiAgICAgICAgICAgICAgICBpbnQzMl90ICAgICAgICAgICAgcnVsZXNMZW5ndGgsCiAgICAgICAgICAgICAgICBVQ29sQXR0cmlidXRlVmFsdWUgbm9ybWFsaXphdGlvbk1vZGUsCiAgICAgICAgICAgICAgICBVQ29sbGF0aW9uU3RyZW5ndGggc3RyZW5ndGgsCiAgICAgICAgICAgICAgICBVUGFyc2VFcnJvciAgICAgICAgKnBhcnNlRXJyb3IsCiAgICAgICAgICAgICAgICBVRXJyb3JDb2RlICAgICAgICAgKnN0YXR1cyk7CgovKiogCiAqIE9wZW4gYSBjb2xsYXRvciBkZWZpbmVkIGJ5IGEgc2hvcnQgZm9ybSBzdHJpbmcuCiAqIFRoZSBzdHJ1Y3R1cmUgYW5kIHRoZSBzeW50YXggb2YgdGhlIHN0cmluZyBpcyBkZWZpbmVkIGluIHRoZSAiTmFtaW5nIGNvbGxhdG9ycyIKICogc2VjdGlvbiBvZiB0aGUgdXNlcnMgZ3VpZGU6IAogKiBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vaWN1L3VzZXJndWlkZS9Db2xsYXRlX0NvbmNlcHRzLmh0bWwjTmFtaW5nX0NvbGxhdG9ycwogKiBBdHRyaWJ1dGVzIGFyZSBvdmVycmlkZW4gYnkgdGhlIHN1YnNlcXVlbnQgYXR0cmlidXRlcy4gU28sIGZvciAiUzJfUzMiLCBmaW5hbAogKiBzdHJlbmd0aCB3aWxsIGJlIDMuIDMwNjZiaXMgbG9jYWxlIG92ZXJyaWRlcyBpbmRpdmlkdWFsIGxvY2FsZSBwYXJ0cy4KICogVGhlIGNhbGwgdG8gdGhpcyBmdW5jdGlvbiBpcyBlcXVpdmFsZW50IHRvIGEgY2FsbCB0byB1Y29sX29wZW4sIGZvbGxvd2VkIGJ5IGEgCiAqIHNlcmllcyBvZiBjYWxscyB0byB1Y29sX3NldEF0dHJpYnV0ZSBhbmQgdWNvbF9zZXRWYXJpYWJsZVRvcC4KICogQHBhcmFtIGRlZmluaXRpb24gQSBzaG9ydCBzdHJpbmcgY29udGFpbmluZyBhIGxvY2FsZSBhbmQgYSBzZXQgb2YgYXR0cmlidXRlcy4gCiAqICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZXMgbm90IGV4cGxpY2l0bHkgbWVudGlvbmVkIGFyZSBsZWZ0IGF0IHRoZSBkZWZhdWx0CiAqICAgICAgICAgICAgICAgICAgIHN0YXRlIGZvciBhIGxvY2FsZS4KICogQHBhcmFtIHBhcnNlRXJyb3IgaWYgbm90IE5VTEwsIHN0cnVjdHVyZSB0aGF0IHdpbGwgZ2V0IGZpbGxlZCB3aXRoIGVycm9yJ3MgcHJlCiAqICAgICAgICAgICAgICAgICAgIGFuZCBwb3N0IGNvbnRleHQgaW4gY2FzZSBvZiBlcnJvci4KICogQHBhcmFtIGZvcmNlRGVmYXVsdHMgaWYgRkFMU0UsIHRoZSBzZXR0aW5ncyB0aGF0IGFyZSB0aGUgc2FtZSBhcyB0aGUgY29sbGF0b3IgCiAqICAgICAgICAgICAgICAgICAgIGRlZmF1bHQgc2V0dGluZ3Mgd2lsbCBub3QgYmUgYXBwbGllZCAoZm9yIGV4YW1wbGUsIHNldHRpbmcKICogICAgICAgICAgICAgICAgICAgRnJlbmNoIHNlY29uZGFyeSBvbiBhIEZyZW5jaCBjb2xsYXRvciB3b3VsZCBub3QgYmUgZXhlY3V0ZWQpLiAKICogICAgICAgICAgICAgICAgICAgSWYgVFJVRSwgYWxsIHRoZSBzZXR0aW5ncyB3aWxsIGJlIGFwcGxpZWQgcmVnYXJkbGVzcyBvZiB0aGUgCiAqICAgICAgICAgICAgICAgICAgIGNvbGxhdG9yIGRlZmF1bHQgdmFsdWUuIElmIHRoZSBkZWZpbml0aW9uCiAqICAgICAgICAgICAgICAgICAgIHN0cmluZ3MgYXJlIHRvIGJlIGNhY2hlZCwgc2hvdWxkIGJlIHNldCB0byBGQUxTRS4KICogQHBhcmFtIHN0YXR1cyAgICAgRXJyb3IgY29kZS4gQXBhcnQgZnJvbSByZWd1bGFyIGVycm9yIGNvbmRpdGlvbnMgY29ubmVjdGVkIHRvIAogKiAgICAgICAgICAgICAgICAgICBpbnN0YW50aWF0aW5nIGNvbGxhdG9ycyAobGlrZSBvdXQgb2YgbWVtb3J5IG9yIHNpbWlsYXIpLCB0aGlzCiAqICAgICAgICAgICAgICAgICAgIEFQSSB3aWxsIHJldHVybiBhbiBlcnJvciBpZiBhbiBpbnZhbGlkIGF0dHJpYnV0ZSBvciBhdHRyaWJ1dGUvdmFsdWUKICogICAgICAgICAgICAgICAgICAgY29tYmluYXRpb24gaXMgc3BlY2lmaWVkLgogKiBAcmV0dXJuICAgICAgICAgICBBIHBvaW50ZXIgdG8gYSBVQ29sbGF0b3Igb3IgMCBpZiBhbiBlcnJvciBvY2N1cmVkIChpbmNsdWRpbmcgYW4gCiAqICAgICAgICAgICAgICAgICAgIGludmFsaWQgYXR0cmlidXRlKS4KICogQHNlZSB1Y29sX29wZW4KICogQHNlZSB1Y29sX3NldEF0dHJpYnV0ZQogKiBAc2VlIHVjb2xfc2V0VmFyaWFibGVUb3AKICogQHNlZSB1Y29sX2dldFNob3J0RGVmaW5pdGlvblN0cmluZwogKiBAc2VlIHVjb2xfbm9ybWFsaXplU2hvcnREZWZpbml0aW9uU3RyaW5nCiAqIEBkcmFmdCBJQ1UgMy4wCiAqCiAqLwpVX0NBUEkgVUNvbGxhdG9yKiBVX0VYUE9SVDIKdWNvbF9vcGVuRnJvbVNob3J0U3RyaW5nKCBjb25zdCBjaGFyICpkZWZpbml0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgIFVCb29sIGZvcmNlRGVmYXVsdHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgVVBhcnNlRXJyb3IgKnBhcnNlRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgVUVycm9yQ29kZSAqc3RhdHVzKTsKCi8qKgogKiBHZXQgYSBzZXQgY29udGFpbmluZyB0aGUgY29udHJhY3Rpb25zIGRlZmluZWQgYnkgdGhlIGNvbGxhdG9yLiBUaGUgc2V0IGluY2x1ZGVzCiAqIGJvdGggdGhlIFVDQSBjb250cmFjdGlvbnMgYW5kIHRoZSBjb250cmFjdGlvbnMgZGVmaW5lZCBieSB0aGUgY29sbGF0b3IuIFRoaXMgc2V0CiAqIHdpbGwgY29udGFpbiBvbmx5IHN0cmluZ3MuIElmIGEgdGFpbG9yaW5nIGV4cGxpY2l0bHkgc3VwcHJlc3NlcyBjb250cmFjdGlvbnMgZnJvbSAKICogdGhlIFVDQSAobGlrZSBSdXNzaWFuKSwgcmVtb3ZlZCBjb250cmFjdGlvbnMgd2lsbCBub3QgYmUgaW4gdGhlIHJlc3VsdGluZyBzZXQuCiAqIEBwYXJhbSBjb2xsIGNvbGxhdG9yIAogKiBAcGFyYW0gY29udHMgdGhlIHNldCB0byBob2xkIHRoZSByZXN1bHQuIEl0IGdldHMgZW1wdGllZCBiZWZvcmUKICogICAgICAgICAgICAgIGNvbnRyYWN0aW9ucyBhcmUgYWRkZWQuIAogKiBAcGFyYW0gc3RhdHVzIHRvIGhvbGQgdGhlIGVycm9yIGNvZGUKICogQHJldHVybiB0aGUgc2l6ZSBvZiB0aGUgY29udHJhY3Rpb24gc2V0CiAqCiAqIEBkcmFmdCBJQ1UgMy4wCiAqLwpVX0NBUEkgaW50MzJfdCBVX0VYUE9SVDIKdWNvbF9nZXRDb250cmFjdGlvbnMoIGNvbnN0IFVDb2xsYXRvciAqY29sbCwKICAgICAgICAgICAgICAgICAgVVNldCAqY29udHMsCiAgICAgICAgICAgICAgICAgIFVFcnJvckNvZGUgKnN0YXR1cyk7CgoKLyoqIAogKiBDbG9zZSBhIFVDb2xsYXRvci4KICogT25jZSBjbG9zZWQsIGEgVUNvbGxhdG9yIHNob3VsZCBub3QgYmUgdXNlZC5cIEV2ZXJ5IG9wZW4gY29sbGF0b3Igc2hvdWxkCiAqIGJlIGNsb3NlZC5cIE90aGVyd2lzZSwgYSBtZW1vcnkgbGVhayB3aWxsIHJlc3VsdC4KICogQHBhcmFtIGNvbGwgVGhlIFVDb2xsYXRvciB0byBjbG9zZS4KICogQHNlZSB1Y29sX29wZW4KICogQHNlZSB1Y29sX29wZW5SdWxlcwogKiBAc2VlIHVjb2xfc2FmZUNsb25lCiAqIEBzdGFibGUgSUNVIDIuMAogKi8KVV9TVEFCTEUgdm9pZCBVX0VYUE9SVDIgCnVjb2xfY2xvc2UoVUNvbGxhdG9yICpjb2xsKTsKCi8qKgogKiBDb21wYXJlIHR3byBzdHJpbmdzLgogKiBUaGUgc3RyaW5ncyB3aWxsIGJlIGNvbXBhcmVkIHVzaW5nIHRoZSBvcHRpb25zIGFscmVhZHkgc3BlY2lmaWVkLgogKiBAcGFyYW0gY29sbCBUaGUgVUNvbGxhdG9yIGNvbnRhaW5pbmcgdGhlIGNvbXBhcmlzb24gcnVsZXMuCiAqIEBwYXJhbSBzb3VyY2UgVGhlIHNvdXJjZSBzdHJpbmcuCiAqIEBwYXJhbSBzb3VyY2VMZW5ndGggVGhlIGxlbmd0aCBvZiBzb3VyY2UsIG9yIC0xIGlmIG51bGwtdGVybWluYXRlZC4KICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IHN0cmluZy4KICogQHBhcmFtIHRhcmdldExlbmd0aCBUaGUgbGVuZ3RoIG9mIHRhcmdldCwgb3IgLTEgaWYgbnVsbC10ZXJtaW5hdGVkLgogKiBAcmV0dXJuIFRoZSByZXN1bHQgb2YgY29tcGFyaW5nIHRoZSBzdHJpbmdzOyBvbmUgb2YgVUNPTF9FUVVBTCwKICogVUNPTF9HUkVBVEVSLCBVQ09MX0xFU1MKICogQHNlZSB1Y29sX2dyZWF0ZXIKICogQHNlZSB1Y29sX2dyZWF0ZXJPckVxdWFsCiAqIEBzZWUgdWNvbF9lcXVhbAogKiBAc3RhYmxlIElDVSAyLjAKICovClVfU1RBQkxFIFVDb2xsYXRpb25SZXN1bHQgVV9FWFBPUlQyIAp1Y29sX3N0cmNvbGwoICAgIGNvbnN0ICAgIFVDb2xsYXRvciAgICAqY29sbCwKICAgICAgICBjb25zdCAgICBVQ2hhciAgICAgICAgKnNvdXJjZSwKICAgICAgICBpbnQzMl90ICAgICAgICAgICAgc291cmNlTGVuZ3RoLAogICAgICAgIGNvbnN0ICAgIFVDaGFyICAgICAgICAqdGFyZ2V0LAogICAgICAgIGludDMyX3QgICAgICAgICAgICB0YXJnZXRMZW5ndGgpOwoKLyoqCiAqIERldGVybWluZSBpZiBvbmUgc3RyaW5nIGlzIGdyZWF0ZXIgdGhhbiBhbm90aGVyLgogKiBUaGlzIGZ1bmN0aW9uIGlzIGVxdWl2YWxlbnQgdG8ge0BsaW5rICN1Y29sX3N0cmNvbGwgfSA9PSBVQ09MX0dSRUFURVIKICogQHBhcmFtIGNvbGwgVGhlIFVDb2xsYXRvciBjb250YWluaW5nIHRoZSBjb21wYXJpc29uIHJ1bGVzLgogKiBAcGFyYW0gc291cmNlIFRoZSBzb3VyY2Ugc3RyaW5nLgogKiBAcGFyYW0gc291cmNlTGVuZ3RoIFRoZSBsZW5ndGggb2Ygc291cmNlLCBvciAtMSBpZiBudWxsLXRlcm1pbmF0ZWQuCiAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBzdHJpbmcuCiAqIEBwYXJhbSB0YXJnZXRMZW5ndGggVGhlIGxlbmd0aCBvZiB0YXJnZXQsIG9yIC0xIGlmIG51bGwtdGVybWluYXRlZC4KICogQHJldHVybiBUUlVFIGlmIHNvdXJjZSBpcyBncmVhdGVyIHRoYW4gdGFyZ2V0LCBGQUxTRSBvdGhlcndpc2UuCiAqIEBzZWUgdWNvbF9zdHJjb2xsCiAqIEBzZWUgdWNvbF9ncmVhdGVyT3JFcXVhbAogKiBAc2VlIHVjb2xfZXF1YWwKICogQHN0YWJsZSBJQ1UgMi4wCiAqLwpVX1NUQUJMRSBVQm9vbCBVX0VYUE9SVDIgCnVjb2xfZ3JlYXRlcihjb25zdCBVQ29sbGF0b3IgKmNvbGwsCiAgICAgICAgICAgICBjb25zdCBVQ2hhciAgICAgKnNvdXJjZSwgaW50MzJfdCBzb3VyY2VMZW5ndGgsCiAgICAgICAgICAgICBjb25zdCBVQ2hhciAgICAgKnRhcmdldCwgaW50MzJfdCB0YXJnZXRMZW5ndGgpOwoKLyoqCiAqIERldGVybWluZSBpZiBvbmUgc3RyaW5nIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBhbm90aGVyLgogKiBUaGlzIGZ1bmN0aW9uIGlzIGVxdWl2YWxlbnQgdG8ge0BsaW5rICN1Y29sX3N0cmNvbGwgfSAhPSBVQ09MX0xFU1MKICogQHBhcmFtIGNvbGwgVGhlIFVDb2xsYXRvciBjb250YWluaW5nIHRoZSBjb21wYXJpc29uIHJ1bGVzLgogKiBAcGFyYW0gc291cmNlIFRoZSBzb3VyY2Ugc3RyaW5nLgogKiBAcGFyYW0gc291cmNlTGVuZ3RoIFRoZSBsZW5ndGggb2Ygc291cmNlLCBvciAtMSBpZiBudWxsLXRlcm1pbmF0ZWQuCiAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBzdHJpbmcuCiAqIEBwYXJhbSB0YXJnZXRMZW5ndGggVGhlIGxlbmd0aCBvZiB0YXJnZXQsIG9yIC0xIGlmIG51bGwtdGVybWluYXRlZC4KICogQHJldHVybiBUUlVFIGlmIHNvdXJjZSBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGFyZ2V0LCBGQUxTRSBvdGhlcndpc2UuCiAqIEBzZWUgdWNvbF9zdHJjb2xsCiAqIEBzZWUgdWNvbF9ncmVhdGVyCiAqIEBzZWUgdWNvbF9lcXVhbAogKiBAc3RhYmxlIElDVSAyLjAKICovClVfU1RBQkxFIFVCb29sIFVfRVhQT1JUMiAKdWNvbF9ncmVhdGVyT3JFcXVhbChjb25zdCBVQ29sbGF0b3IgKmNvbGwsCiAgICAgICAgICAgICAgICAgICAgY29uc3QgVUNoYXIgICAgICpzb3VyY2UsIGludDMyX3Qgc291cmNlTGVuZ3RoLAogICAgICAgICAgICAgICAgICAgIGNvbnN0IFVDaGFyICAgICAqdGFyZ2V0LCBpbnQzMl90IHRhcmdldExlbmd0aCk7CgovKioKICogQ29tcGFyZSB0d28gc3RyaW5ncyBmb3IgZXF1YWxpdHkuCiAqIFRoaXMgZnVuY3Rpb24gaXMgZXF1aXZhbGVudCB0byB7QGxpbmsgI3Vjb2xfc3RyY29sbCB9ID09IFVDT0xfRVFVQUwKICogQHBhcmFtIGNvbGwgVGhlIFVDb2xsYXRvciBjb250YWluaW5nIHRoZSBjb21wYXJpc29uIHJ1bGVzLgogKiBAcGFyYW0gc291cmNlIFRoZSBzb3VyY2Ugc3RyaW5nLgogKiBAcGFyYW0gc291cmNlTGVuZ3RoIFRoZSBsZW5ndGggb2Ygc291cmNlLCBvciAtMSBpZiBudWxsLXRlcm1pbmF0ZWQuCiAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBzdHJpbmcuCiAqIEBwYXJhbSB0YXJnZXRMZW5ndGggVGhlIGxlbmd0aCBvZiB0YXJnZXQsIG9yIC0xIGlmIG51bGwtdGVybWluYXRlZC4KICogQHJldHVybiBUUlVFIGlmIHNvdXJjZSBpcyBlcXVhbCB0byB0YXJnZXQsIEZBTFNFIG90aGVyd2lzZQogKiBAc2VlIHVjb2xfc3RyY29sbAogKiBAc2VlIHVjb2xfZ3JlYXRlcgogKiBAc2VlIHVjb2xfZ3JlYXRlck9yRXF1YWwKICogQHN0YWJsZSBJQ1UgMi4wCiAqLwpVX1NUQUJMRSBVQm9vbCBVX0VYUE9SVDIgCnVjb2xfZXF1YWwoY29uc3QgVUNvbGxhdG9yICpjb2xsLAogICAgICAgICAgIGNvbnN0IFVDaGFyICAgICAqc291cmNlLCBpbnQzMl90IHNvdXJjZUxlbmd0aCwKICAgICAgICAgICBjb25zdCBVQ2hhciAgICAgKnRhcmdldCwgaW50MzJfdCB0YXJnZXRMZW5ndGgpOwoKLyoqCiAqIENvbXBhcmUgdHdvIFVURi04IGVuY29kZWQgdHJpbmdzLgogKiBUaGUgc3RyaW5ncyB3aWxsIGJlIGNvbXBhcmVkIHVzaW5nIHRoZSBvcHRpb25zIGFscmVhZHkgc3BlY2lmaWVkLgogKiBAcGFyYW0gY29sbCBUaGUgVUNvbGxhdG9yIGNvbnRhaW5pbmcgdGhlIGNvbXBhcmlzb24gcnVsZXMuCiAqIEBwYXJhbSBzSXRlciBUaGUgc291cmNlIHN0cmluZyBpdGVyYXRvci4KICogQHBhcmFtIHRJdGVyIFRoZSB0YXJnZXQgc3RyaW5nIGl0ZXJhdG9yLgogKiBAcmV0dXJuIFRoZSByZXN1bHQgb2YgY29tcGFyaW5nIHRoZSBzdHJpbmdzOyBvbmUgb2YgVUNPTF9FUVVBTCwKICogVUNPTF9HUkVBVEVSLCBVQ09MX0xFU1MKICogQHBhcmFtIHN0YXR1cyBBIHBvaW50ZXIgdG8gYW4gVUVycm9yQ29kZSB0byByZWNlaXZlIGFueSBlcnJvcnMKICogQHNlZSB1Y29sX3N0cmNvbGwKICogQHN0YWJsZSBJQ1UgMi42CiAqLwpVX1NUQUJMRSBVQ29sbGF0aW9uUmVzdWx0IFVfRVhQT1JUMiAKdWNvbF9zdHJjb2xsSXRlciggIGNvbnN0ICAgIFVDb2xsYXRvciAgICAqY29sbCwKICAgICAgICAgICAgICAgICAgVUNoYXJJdGVyYXRvciAqc0l0ZXIsCiAgICAgICAgICAgICAgICAgIFVDaGFySXRlcmF0b3IgKnRJdGVyLAogICAgICAgICAgICAgICAgICBVRXJyb3JDb2RlICpzdGF0dXMpOwoKLyoqCiAqIEdldCB0aGUgY29sbGF0aW9uIHN0cmVuZ3RoIHVzZWQgaW4gYSBVQ29sbGF0b3IuCiAqIFRoZSBzdHJlbmd0aCBpbmZsdWVuY2VzIGhvdyBzdHJpbmdzIGFyZSBjb21wYXJlZC4KICogQHBhcmFtIGNvbGwgVGhlIFVDb2xsYXRvciB0byBxdWVyeS4KICogQHJldHVybiBUaGUgY29sbGF0aW9uIHN0cmVuZ3RoOyBvbmUgb2YgVUNPTF9QUklNQVJZLCBVQ09MX1NFQ09OREFSWSwKICogVUNPTF9URVJUSUFSWSwgVUNPTF9RVUFURVJOQVJZLCBVQ09MX0lERU5USUNBTAogKiBAc2VlIHVjb2xfc2V0U3RyZW5ndGgKICogQHN0YWJsZSBJQ1UgMi4wCiAqLwpVX1NUQUJMRSBVQ29sbGF0aW9uU3RyZW5ndGggVV9FWFBPUlQyIAp1Y29sX2dldFN0cmVuZ3RoKGNvbnN0IFVDb2xsYXRvciAqY29sbCk7CgovKioKICogU2V0IHRoZSBjb2xsYXRpb24gc3RyZW5ndGggdXNlZCBpbiBhIFVDb2xsYXRvci4KICogVGhlIHN0cmVuZ3RoIGluZmx1ZW5jZXMgaG93IHN0cmluZ3MgYXJlIGNvbXBhcmVkLgogKiBAcGFyYW0gY29sbCBUaGUgVUNvbGxhdG9yIHRvIHNldC4KICogQHBhcmFtIHN0cmVuZ3RoIFRoZSBkZXNpcmVkIGNvbGxhdGlvbiBzdHJlbmd0aDsgb25lIG9mIFVDT0xfUFJJTUFSWSwgCiAqIFVDT0xfU0VDT05EQVJZLCBVQ09MX1RFUlRJQVJZLCBVQ09MX1FVQVRFUk5BUlksIFVDT0xfSURFTlRJQ0FMLCBVQ09MX0RFRkFVTFQKICogQHNlZSB1Y29sX2dldFN0cmVuZ3RoCiAqIEBzdGFibGUgSUNVIDIuMAogKi8KVV9TVEFCTEUgdm9pZCBVX0VYUE9SVDIgCnVjb2xfc2V0U3RyZW5ndGgoVUNvbGxhdG9yICpjb2xsLAogICAgICAgICAgICAgICAgIFVDb2xsYXRpb25TdHJlbmd0aCBzdHJlbmd0aCk7CgovKioKICogR2V0IHRoZSBkaXNwbGF5IG5hbWUgZm9yIGEgVUNvbGxhdG9yLgogKiBUaGUgZGlzcGxheSBuYW1lIGlzIHN1aXRhYmxlIGZvciBwcmVzZW50YXRpb24gdG8gYSB1c2VyLgogKiBAcGFyYW0gb2JqTG9jIFRoZSBsb2NhbGUgb2YgdGhlIGNvbGxhdG9yIGluIHF1ZXN0aW9uLgogKiBAcGFyYW0gZGlzcExvYyBUaGUgbG9jYWxlIGZvciBkaXNwbGF5LgogKiBAcGFyYW0gcmVzdWx0IEEgcG9pbnRlciB0byBhIGJ1ZmZlciB0byByZWNlaXZlIHRoZSBhdHRyaWJ1dGUuCiAqIEBwYXJhbSByZXN1bHRMZW5ndGggVGhlIG1heGltdW0gc2l6ZSBvZiByZXN1bHQuCiAqIEBwYXJhbSBzdGF0dXMgQSBwb2ludGVyIHRvIGFuIFVFcnJvckNvZGUgdG8gcmVjZWl2ZSBhbnkgZXJyb3JzCiAqIEByZXR1cm4gVGhlIHRvdGFsIGJ1ZmZlciBzaXplIG5lZWRlZDsgaWYgZ3JlYXRlciB0aGFuIHJlc3VsdExlbmd0aCwKICogdGhlIG91dHB1dCB3YXMgdHJ1bmNhdGVkLgogKiBAc3RhYmxlIElDVSAyLjAKICovClVfU1RBQkxFIGludDMyX3QgVV9FWFBPUlQyIAp1Y29sX2dldERpc3BsYXlOYW1lKCAgICBjb25zdCAgICBjaGFyICAgICAgICAqb2JqTG9jLAogICAgICAgICAgICBjb25zdCAgICBjaGFyICAgICAgICAqZGlzcExvYywKICAgICAgICAgICAgVUNoYXIgICAgICAgICAgICAgKnJlc3VsdCwKICAgICAgICAgICAgaW50MzJfdCAgICAgICAgIHJlc3VsdExlbmd0aCwKICAgICAgICAgICAgVUVycm9yQ29kZSAgICAgICAgKnN0YXR1cyk7CgovKioKICogR2V0IGEgbG9jYWxlIGZvciB3aGljaCBjb2xsYXRpb24gcnVsZXMgYXJlIGF2YWlsYWJsZS4KICogQSBVQ29sbGF0b3IgaW4gYSBsb2NhbGUgcmV0dXJuZWQgYnkgdGhpcyBmdW5jdGlvbiB3aWxsIHBlcmZvcm0gdGhlIGNvcnJlY3QKICogY29sbGF0aW9uIGZvciB0aGUgbG9jYWxlLgogKiBAcGFyYW0gaW5kZXggVGhlIGluZGV4IG9mIHRoZSBkZXNpcmVkIGxvY2FsZS4KICogQHJldHVybiBBIGxvY2FsZSBmb3Igd2hpY2ggY29sbGF0aW9uIHJ1bGVzIGFyZSBhdmFpbGFibGUsIG9yIDAgaWYgbm9uZS4KICogQHNlZSB1Y29sX2NvdW50QXZhaWxhYmxlCiAqIEBzdGFibGUgSUNVIDIuMAogKi8KVV9TVEFCTEUgY29uc3QgY2hhciogVV9FWFBPUlQyIAp1Y29sX2dldEF2YWlsYWJsZShpbnQzMl90IGluZGV4KTsKCi8qKgogKiBEZXRlcm1pbmUgaG93IG1hbnkgbG9jYWxlcyBoYXZlIGNvbGxhdGlvbiBydWxlcyBhdmFpbGFibGUuCiAqIFRoaXMgZnVuY3Rpb24gaXMgbW9zdCB1c2VmdWwgYXMgZGV0ZXJtaW5pbmcgdGhlIGxvb3AgZW5kaW5nIGNvbmRpdGlvbiBmb3IKICogY2FsbHMgdG8ge0BsaW5rICN1Y29sX2dldEF2YWlsYWJsZSB9LgogKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgbG9jYWxlcyBmb3Igd2hpY2ggY29sbGF0aW9uIHJ1bGVzIGFyZSBhdmFpbGFibGUuCiAqIEBzZWUgdWNvbF9nZXRBdmFpbGFibGUKICogQHN0YWJsZSBJQ1UgMi4wCiAqLwpVX1NUQUJMRSBpbnQzMl90IFVfRVhQT1JUMiAKdWNvbF9jb3VudEF2YWlsYWJsZSh2b2lkKTsKCiNpZiAhVUNPTkZJR19OT19TRVJWSUNFCi8qKgogKiBDcmVhdGUgYSBzdHJpbmcgZW51bWVyYXRvciBvZiBhbGwgbG9jYWxlcyBmb3Igd2hpY2ggYSB2YWxpZAogKiBjb2xsYXRvciBtYXkgYmUgb3BlbmVkLgogKiBAcGFyYW0gc3RhdHVzIGlucHV0LW91dHB1dCBlcnJvciBjb2RlCiAqIEByZXR1cm4gYSBzdHJpbmcgZW51bWVyYXRpb24gb3ZlciBsb2NhbGUgc3RyaW5ncy4gVGhlIGNhbGxlciBpcwogKiByZXNwb25zaWJsZSBmb3IgY2xvc2luZyB0aGUgcmVzdWx0LgogKiBAZHJhZnQgSUNVIDMuMAogKi8KVV9EUkFGVCBVRW51bWVyYXRpb24qIFVfRVhQT1JUMgp1Y29sX29wZW5BdmFpbGFibGVMb2NhbGVzKFVFcnJvckNvZGUgKnN0YXR1cyk7CiNlbmRpZgoKLyoqCiAqIENyZWF0ZSBhIHN0cmluZyBlbnVtZXJhdG9yIG9mIGFsbCBwb3NzaWJsZSBrZXl3b3JkcyB0aGF0IGFyZSByZWxldmFudCB0bwogKiBjb2xsYXRpb24uIEF0IHRoaXMgcG9pbnQsIHRoZSBvbmx5IHJlY29nbml6ZWQga2V5d29yZCBmb3IgdGhpcwogKiBzZXJ2aWNlIGlzICJjb2xsYXRpb24iLgogKiBAcGFyYW0gc3RhdHVzIGlucHV0LW91dHB1dCBlcnJvciBjb2RlCiAqIEByZXR1cm4gYSBzdHJpbmcgZW51bWVyYXRpb24gb3ZlciBsb2NhbGUgc3RyaW5ncy4gVGhlIGNhbGxlciBpcwogKiByZXNwb25zaWJsZSBmb3IgY2xvc2luZyB0aGUgcmVzdWx0LgogKiBAZHJhZnQgSUNVIDMuMAogKi8KVV9EUkFGVCBVRW51bWVyYXRpb24qIFVfRVhQT1JUMgp1Y29sX2dldEtleXdvcmRzKFVFcnJvckNvZGUgKnN0YXR1cyk7CgovKioKICogR2l2ZW4gYSBrZXl3b3JkLCBjcmVhdGUgYSBzdHJpbmcgZW51bWVyYXRpb24gb2YgYWxsIHZhbHVlcwogKiBmb3IgdGhhdCBrZXl3b3JkIHRoYXQgYXJlIGN1cnJlbnRseSBpbiB1c2UuCiAqIEBwYXJhbSBrZXl3b3JkIGEgcGFydGljdWxhciBrZXl3b3JkIGFzIGVudW1lcmF0ZWQgYnkKICogdWNvbF9nZXRLZXl3b3Jkcy4gSWYgYW55IG90aGVyIGtleXdvcmQgaXMgcGFzc2VkIGluLCAqc3RhdHVzIGlzIHNldAogKiB0byBVX0lMTEVHQUxfQVJHVU1FTlRfRVJST1IuCiAqIEBwYXJhbSBzdGF0dXMgaW5wdXQtb3V0cHV0IGVycm9yIGNvZGUKICogQHJldHVybiBhIHN0cmluZyBlbnVtZXJhdGlvbiBvdmVyIGNvbGxhdGlvbiBrZXl3b3JkIHZhbHVlcywgb3IgTlVMTAogKiB1cG9uIGVycm9yLiBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBjbG9zaW5nIHRoZSByZXN1bHQuCiAqIEBkcmFmdCBJQ1UgMy4wCiAqLwpVX0RSQUZUIFVFbnVtZXJhdGlvbiogVV9FWFBPUlQyCnVjb2xfZ2V0S2V5d29yZFZhbHVlcyhjb25zdCBjaGFyICprZXl3b3JkLCBVRXJyb3JDb2RlICpzdGF0dXMpOwoKLyoqCiAqIFJldHVybiB0aGUgZnVuY3Rpb25hbGx5IGVxdWl2YWxlbnQgbG9jYWxlIGZvciB0aGUgZ2l2ZW4KICogcmVxdWVzdGVkIGxvY2FsZSwgd2l0aCByZXNwZWN0IHRvIGdpdmVuIGtleXdvcmQsIGZvciB0aGUKICogY29sbGF0aW9uIHNlcnZpY2UuICBJZiB0d28gbG9jYWxlcyByZXR1cm4gdGhlIHNhbWUgcmVzdWx0LCB0aGVuCiAqIGNvbGxhdG9ycyBpbnN0YW50aWF0ZWQgZm9yIHRoZXNlIGxvY2FsZXMgd2lsbCBiZWhhdmUKICogZXF1aXZhbGVudGx5LiAgVGhlIGNvbnZlcnNlIGlzIG5vdCBhbHdheXMgdHJ1ZTsgdHdvIGNvbGxhdG9ycwogKiBtYXkgaW4gZmFjdCBiZSBlcXVpdmFsZW50LCBidXQgcmV0dXJuIGRpZmZlcmVudCByZXN1bHRzLCBkdWUgdG8KICogaW50ZXJuYWwgZGV0YWlscy4gIFRoZSByZXR1cm4gcmVzdWx0IGhhcyBubyBvdGhlciBtZWFuaW5nIHRoYW4KICogdGhhdCBzdGF0ZWQgYWJvdmUsIGFuZCBpbXBsaWVzIG5vdGhpbmcgYXMgdG8gdGhlIHJlbGF0aW9uc2hpcAogKiBiZXR3ZWVuIHRoZSB0d28gbG9jYWxlcy4gIFRoaXMgaXMgaW50ZW5kZWQgZm9yIHVzZSBieQogKiBhcHBsaWNhdGlvbnMgd2hvIHdpc2ggdG8gY2FjaGUgY29sbGF0b3JzLCBvciBvdGhlcndpc2UgcmV1c2UKICogY29sbGF0b3JzIHdoZW4gcG9zc2libGUuICBUaGUgZnVuY3Rpb25hbCBlcXVpdmFsZW50IG1heSBjaGFuZ2UKICogb3ZlciB0aW1lLiAgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHBsZWFzZSBzZWUgdGhlIDxhCiAqIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9pY3UvdXNlcmd1aWRlL2xvY2FsZS5odG1sI3NlcnZpY2VzIj4KICogTG9jYWxlcyBhbmQgU2VydmljZXM8L2E+IHNlY3Rpb24gb2YgdGhlIElDVSBVc2VyIEd1aWRlLgogKiBAcGFyYW0gcmVzdWx0IGZpbGxpbiBmb3IgdGhlIGZ1bmN0aW9uYWxseSBlcXVpdmFsZW50IGxvY2FsZQogKiBAcGFyYW0gcmVzdWx0Q2FwYWNpdHkgY2FwYWNpdHkgb2YgdGhlIGZpbGxpbiBidWZmZXIKICogQHBhcmFtIGtleXdvcmQgYSBwYXJ0aWN1bGFyIGtleXdvcmQgYXMgZW51bWVyYXRlZCBieQogKiB1Y29sX2dldEtleXdvcmRzLgogKiBAcGFyYW0gbG9jYWxlIHRoZSByZXF1ZXN0ZWQgbG9jYWxlCiAqIEBwYXJhbSBpc0F2YWlsYWJsZSBpZiBub24tTlVMTCwgcG9pbnRlciB0byBhIGZpbGxpbiBwYXJhbWV0ZXIgdGhhdAogKiBpbmRpY2F0ZXMgd2hldGhlciB0aGUgcmVxdWVzdGVkIGxvY2FsZSB3YXMgJ2F2YWlsYWJsZScgdG8gdGhlCiAqIGNvbGxhdGlvbiBzZXJ2aWNlLiBBIGxvY2FsZSBpcyBkZWZpbmVkIGFzICdhdmFpbGFibGUnIGlmIGl0CiAqIHBoeXNpY2FsbHkgZXhpc3RzIHdpdGhpbiB0aGUgY29sbGF0aW9uIGxvY2FsZSBkYXRhLgogKiBAcGFyYW0gc3RhdHVzIHBvaW50ZXIgdG8gaW5wdXQtb3V0cHV0IGVycm9yIGNvZGUKICogQHJldHVybiB0aGUgYWN0dWFsIGJ1ZmZlciBzaXplIG5lZWRlZCBmb3IgdGhlIGxvY2FsZS4gIElmIGdyZWF0ZXIKICogdGhhbiByZXN1bHRDYXBhY2l0eSwgdGhlIHJldHVybmVkIGZ1bGwgbmFtZSB3aWxsIGJlIHRydW5jYXRlZCBhbmQKICogYW4gZXJyb3IgY29kZSB3aWxsIGJlIHJldHVybmVkLgogKiBAZHJhZnQgSUNVIDMuMAogKi8KVV9EUkFGVCBpbnQzMl90IFVfRVhQT1JUMgp1Y29sX2dldEZ1bmN0aW9uYWxFcXVpdmFsZW50KGNoYXIqIHJlc3VsdCwgaW50MzJfdCByZXN1bHRDYXBhY2l0eSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBrZXl3b3JkLCBjb25zdCBjaGFyKiBsb2NhbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUJvb2wqIGlzQXZhaWxhYmxlLCBVRXJyb3JDb2RlKiBzdGF0dXMpOwoKLyoqCiAqIEdldCB0aGUgY29sbGF0aW9uIHJ1bGVzIGZyb20gYSBVQ29sbGF0b3IuCiAqIFRoZSBydWxlcyB3aWxsIGZvbGxvdyB0aGUgcnVsZSBzeW50YXguCiAqIEBwYXJhbSBjb2xsIFRoZSBVQ29sbGF0b3IgdG8gcXVlcnkuCiAqIEBwYXJhbSBsZW5ndGggCiAqIEByZXR1cm4gVGhlIGNvbGxhdGlvbiBydWxlcy4KICogQHN0YWJsZSBJQ1UgMi4wCiAqLwpVX1NUQUJMRSBjb25zdCBVQ2hhciogVV9FWFBPUlQyIAp1Y29sX2dldFJ1bGVzKCAgICBjb25zdCAgICBVQ29sbGF0b3IgICAgKmNvbGwsIAogICAgICAgIGludDMyX3QgICAgICAgICAgICAqbGVuZ3RoKTsKCi8qKiBHZXQgdGhlIHNob3J0IGRlZmluaXRpb24gc3RyaW5nIGZvciBhIGNvbGxhdG9yLiBUaGlzIEFQSSBoYXJ2ZXN0cyB0aGUgY29sbGF0b3IncwogKiAgbG9jYWxlIGFuZCB0aGUgYXR0cmlidXRlIHNldCBhbmQgcHJvZHVjZXMgYSBzdHJpbmcgdGhhdCBjYW4gYmUgdXNlZCBmb3Igb3BlbmluZyAKICogIGEgY29sbGF0b3Igd2l0aCB0aGUgc2FtZSBwcm9wZXJ0aWVzIHVzaW5nIHRoZSB1Y29sX29wZW5Gcm9tU2hvcnRTdHJpbmcgQVBJLgogKiAgVGhpcyBzdHJpbmcgd2lsbCBiZSBub3JtYWxpemVkLgogKiAgVGhlIHN0cnVjdHVyZSBhbmQgdGhlIHN5bnRheCBvZiB0aGUgc3RyaW5nIGlzIGRlZmluZWQgaW4gdGhlICJOYW1pbmcgY29sbGF0b3JzIgogKiAgc2VjdGlvbiBvZiB0aGUgdXNlcnMgZ3VpZGU6IAogKiAgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2ljdS91c2VyZ3VpZGUvQ29sbGF0ZV9Db25jZXB0cy5odG1sI05hbWluZ19Db2xsYXRvcnMKICogIFRoaXMgQVBJIHN1cHBvcnRzIHByZWZsaWdodGluZy4KICogIEBwYXJhbSBjb2xsIGEgY29sbGF0b3IKICogIEBwYXJhbSBsb2NhbGUgYSBsb2NhbGUgdGhhdCB3aWxsIGFwcGVhciBhcyBhIGNvbGxhdG9ycyBsb2NhbGUgaW4gdGhlIHJlc3VsdGluZwogKiAgICAgICAgICAgICAgICBzaG9ydCBzdHJpbmcgZGVmaW5pdGlvbi4gSWYgTlVMTCwgdGhlIGxvY2FsZSB3aWxsIGJlIGhhcnZlc3RlZCAKICogICAgICAgICAgICAgICAgZnJvbSB0aGUgY29sbGF0b3IuCiAqICBAcGFyYW0gYnVmZmVyIHNwYWNlIHRvIGhvbGQgdGhlIHJlc3VsdGluZyBzdHJpbmcKICogIEBwYXJhbSBjYXBhY2l0eSBjYXBhY2l0eSBvZiB0aGUgYnVmZmVyCiAqICBAcGFyYW0gc3RhdHVzIGZvciByZXR1cm5pbmcgZXJyb3JzLiBBbGwgdGhlIHByZWZsaWdodGluZyBlcnJvcnMgYXJlIGZlYXR1cmVkCiAqICBAcmV0dXJuIGxlbmd0aCBvZiB0aGUgcmVzdWx0aW5nIHN0cmluZwogKiAgQHNlZSB1Y29sX29wZW5Gcm9tU2hvcnRTdHJpbmcKICogIEBzZWUgdWNvbF9ub3JtYWxpemVTaG9ydERlZmluaXRpb25TdHJpbmcKICogIEBkcmFmdCBJQ1UgMy4wCiAqLwpVX0NBUEkgaW50MzJfdCBVX0VYUE9SVDIKdWNvbF9nZXRTaG9ydERlZmluaXRpb25TdHJpbmcoY29uc3QgVUNvbGxhdG9yICpjb2xsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpsb2NhbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjYXBhY2l0eSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUVycm9yQ29kZSAqc3RhdHVzKTsKCi8qKiBWZXJpZmllcyBhbmQgbm9ybWFsaXplcyBzaG9ydCBkZWZpbml0aW9uIHN0cmluZy4KICogIE5vcm1hbGl6ZWQgc2hvcnQgZGVmaW5pdGlvbiBzdHJpbmcgaGFzIGFsbCB0aGUgb3B0aW9uIHNvcnRlZCBieSB0aGUgYXJndW1lbnQgbmFtZSwKICogIHNvIHRoYXQgZXF1aXZhbGVudCBkZWZpbml0aW9uIHN0cmluZ3MgYXJlIHRoZSBzYW1lLiAKICogIFRoaXMgQVBJIHN1cHBvcnRzIHByZWZsaWdodGluZy4KICogIEBwYXJhbSBzb3VyY2UgZGVmaW5pdGlvbiBzdHJpbmcKICogIEBwYXJhbSBkZXN0aW5hdGlvbiBzcGFjZSB0byBob2xkIHRoZSByZXN1bHRpbmcgc3RyaW5nCiAqICBAcGFyYW0gY2FwYWNpdHkgY2FwYWNpdHkgb2YgdGhlIGJ1ZmZlcgogKiAgQHBhcmFtIHBhcnNlRXJyb3IgaWYgbm90IE5VTEwsIHN0cnVjdHVyZSB0aGF0IHdpbGwgZ2V0IGZpbGxlZCB3aXRoIGVycm9yJ3MgcHJlCiAqICAgICAgICAgICAgICAgICAgIGFuZCBwb3N0IGNvbnRleHQgaW4gY2FzZSBvZiBlcnJvci4KICogIEBwYXJhbSBzdGF0dXMgICAgIEVycm9yIGNvZGUuIFRoaXMgQVBJIHdpbGwgcmV0dXJuIGFuIGVycm9yIGlmIGFuIGludmFsaWQgYXR0cmlidXRlIAogKiAgICAgICAgICAgICAgICAgICAgb3IgYXR0cmlidXRlL3ZhbHVlIGNvbWJpbmF0aW9uIGlzIHNwZWNpZmllZC4gQWxsIHRoZSBwcmVmbGlnaHRpbmcgCiAqICAgICAgICAgICAgICAgICAgICBlcnJvcnMgYXJlIGFsc28gZmVhdHVyZWQKICogIEByZXR1cm4gbGVuZ3RoIG9mIHRoZSByZXN1bHRpbmcgbm9ybWFsaXplZCBzdHJpbmcuCiAqCiAqICBAc2VlIHVjb2xfb3BlbkZyb21TaG9ydFN0cmluZwogKiAgQHNlZSB1Y29sX2dldFNob3J0RGVmaW5pdGlvblN0cmluZwogKiAKICogIEBkcmFmdCBJQ1UgMy4wCiAqLwoKVV9DQVBJIGludDMyX3QgVV9FWFBPUlQyCnVjb2xfbm9ybWFsaXplU2hvcnREZWZpbml0aW9uU3RyaW5nKGNvbnN0IGNoYXIgKnNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqZGVzdGluYXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY2FwYWNpdHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQYXJzZUVycm9yICpwYXJzZUVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVRXJyb3JDb2RlICpzdGF0dXMpOwogICAgICAgIAoKLyoqCiAqIEdldCBhIHNvcnQga2V5IGZvciBhIHN0cmluZyBmcm9tIGEgVUNvbGxhdG9yLgogKiBTb3J0IGtleXMgbWF5IGJlIGNvbXBhcmVkIHVzaW5nIDxUVD5zdHJjbXA8L1RUPi4KICogQHBhcmFtIGNvbGwgVGhlIFVDb2xsYXRvciBjb250YWluaW5nIHRoZSBjb2xsYXRpb24gcnVsZXMuCiAqIEBwYXJhbSBzb3VyY2UgVGhlIHN0cmluZyB0byB0cmFuc2Zvcm0uCiAqIEBwYXJhbSBzb3VyY2VMZW5ndGggVGhlIGxlbmd0aCBvZiBzb3VyY2UsIG9yIC0xIGlmIG51bGwtdGVybWluYXRlZC4KICogQHBhcmFtIHJlc3VsdCBBIHBvaW50ZXIgdG8gYSBidWZmZXIgdG8gcmVjZWl2ZSB0aGUgYXR0cmlidXRlLgogKiBAcGFyYW0gcmVzdWx0TGVuZ3RoIFRoZSBtYXhpbXVtIHNpemUgb2YgcmVzdWx0LgogKiBAcmV0dXJuIFRoZSBzaXplIG5lZWRlZCB0byBmdWxseSBzdG9yZSB0aGUgc29ydCBrZXkuLgogKiBAc2VlIHVjb2xfa2V5SGFzaENvZGUKICogQHN0YWJsZSBJQ1UgMi4wCiAqLwpVX1NUQUJMRSBpbnQzMl90IFVfRVhQT1JUMiAKdWNvbF9nZXRTb3J0S2V5KGNvbnN0ICAgIFVDb2xsYXRvciAgICAqY29sbCwKICAgICAgICBjb25zdCAgICBVQ2hhciAgICAgICAgKnNvdXJjZSwKICAgICAgICBpbnQzMl90ICAgICAgICBzb3VyY2VMZW5ndGgsCiAgICAgICAgdWludDhfdCAgICAgICAgKnJlc3VsdCwKICAgICAgICBpbnQzMl90ICAgICAgICByZXN1bHRMZW5ndGgpOwoKCi8qKiBHZXRzIHRoZSBuZXh0IGNvdW50IGJ5dGVzIG9mIGEgc29ydCBrZXkuIENhbGxlciBuZWVkcwogKiAgdG8gcHJlc2VydmUgc3RhdGUgYXJyYXkgYmV0d2VlbiBjYWxscyBhbmQgdG8gcHJvdmlkZQogKiAgdGhlIHNhbWUgdHlwZSBvZiBVQ2hhckl0ZXJhdG9yIHNldCB3aXRoIHRoZSBzYW1lIHN0cmluZy4KICogIFRoZSBkZXN0aW5hdGlvbiBidWZmZXIgcHJvdmlkZWQgbXVzdCBiZSBiaWcgZW5vdWdoIHRvIHN0b3JlCiAqICB0aGUgbnVtYmVyIG9mIHJlcXVlc3RlZCBieXRlcy4gR2VuZXJhdGVkIHNvcnRrZXkgaXMgbm90IAogKiAgY29tcGF0aWJsZSB3aXRoIHNvcnRrZXlzIGdlbmVyYXRlZCB1c2luZyB1Y29sX2dldFNvcnRLZXkKICogIEFQSSwgc2luY2Ugd2UgZG9uJ3QgZG8gYW55IGNvbXByZXNzaW9uLiBJZiB1bmNvbXByZXNzZWQKICogIHNvcnRrZXlzIGFyZSByZXF1aXJlZCwgdGhpcyBBUEkgY2FuIGJlIHVzZWQuCiAqICBAcGFyYW0gY29sbCBUaGUgVUNvbGxhdG9yIGNvbnRhaW5pbmcgdGhlIGNvbGxhdGlvbiBydWxlcy4KICogIEBwYXJhbSBpdGVyIFVDaGFySXRlcmF0b3IgY29udGFpbmluZyB0aGUgc3RyaW5nIHdlIG5lZWQgCiAqICAgICAgICAgICAgICB0aGUgc29ydCBrZXkgdG8gYmUgY2FsY3VsYXRlZCBmb3IuCiAqICBAcGFyYW0gc3RhdGUgT3BhcXVlIHN0YXRlIG9mIHNvcnRrZXkgaXRlcmF0aW9uLgogKiAgQHBhcmFtIGRlc3QgQnVmZmVyIHRvIGhvbGQgdGhlIHJlc3VsdGluZyBzb3J0a2V5IHBhcnQKICogIEBwYXJhbSBjb3VudCBudW1iZXIgb2Ygc29ydCBrZXkgYnl0ZXMgcmVxdWlyZWQuCiAqICBAcGFyYW0gc3RhdHVzIGVycm9yIGNvZGUgaW5kaWNhdG9yLgogKiAgQHJldHVybiB0aGUgYWN0dWFsIG51bWJlciBvZiBieXRlcyBvZiBhIHNvcnRrZXkuIEl0IGNhbiBiZQogKiAgICAgICAgICBzbWFsbGVyIHRoYW4gY291bnQgaWYgd2UgaGF2ZSByZWFjaGVkIHRoZSBlbmQgb2YgCiAqICAgICAgICAgIHRoZSBzb3J0IGtleS4KICogIEBzdGFibGUgSUNVIDIuNgogKi8KVV9TVEFCTEUgaW50MzJfdCBVX0VYUE9SVDIgCnVjb2xfbmV4dFNvcnRLZXlQYXJ0KGNvbnN0IFVDb2xsYXRvciAqY29sbCwKICAgICAgICAgICAgICAgICAgICAgVUNoYXJJdGVyYXRvciAqaXRlciwKICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3RhdGVbMl0sCiAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRlc3QsIGludDMyX3QgY291bnQsCiAgICAgICAgICAgICAgICAgICAgIFVFcnJvckNvZGUgKnN0YXR1cyk7CgovKiogZW51bSB0aGF0IGlzIHRha2VuIGJ5IHVjb2xfZ2V0Qm91bmQgQVBJIAogKiBTZWUgYmVsb3cgZm9yIGV4cGxhbmF0aW9uICAgICAgICAgICAgICAgIAogKiBkbyBub3QgY2hhbmdlIHRoZSB2YWx1ZXMgYXNzaWduZWQgdG8gdGhlIAogKiBtZW1iZXJzIG9mIHRoaXMgZW51bS4gVW5kZXJseWluZyBjb2RlICAgIAogKiBkZXBlbmRzIG9uIHRoZW0gaGF2aW5nIHRoZXNlIG51bWJlcnMgICAgIAogKiBAc3RhYmxlIElDVSAyLjAKICovCnR5cGVkZWYgZW51bSB7CiAgLyoqIGxvd2VyIGJvdW5kICovCiAgVUNPTF9CT1VORF9MT1dFUiA9IDAsCiAgLyoqIHVwcGVyIGJvdW5kIHRoYXQgd2lsbCBtYXRjaCBzdHJpbmdzIG9mIGV4YWN0IHNpemUgKi8KICBVQ09MX0JPVU5EX1VQUEVSID0gMSwKICAvKiogdXBwZXIgYm91bmQgdGhhdCB3aWxsIG1hdGNoIGFsbCB0aGUgc3RyaW5ncyB0aGF0IGhhdmUgdGhlIHNhbWUgaW5pdGlhbCBzdWJzdHJpbmcgYXMgdGhlIGdpdmVuIHN0cmluZyAqLwogIFVDT0xfQk9VTkRfVVBQRVJfTE9ORyA9IDIsCiAgVUNPTF9CT1VORF9WQUxVRV9DT1VOVAp9IFVDb2xCb3VuZE1vZGU7CgovKioKICogUHJvZHVjZSBhIGJvdW5kIGZvciBhIGdpdmVuIHNvcnRrZXkgYW5kIGEgbnVtYmVyIG9mIGxldmVscy4KICogUmV0dXJuIHZhbHVlIGlzIGFsd2F5cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIG5lZWRlZCwgcmVnYXJkbGVzcyBvZiAKICogd2hldGhlciB0aGUgcmVzdWx0IGJ1ZmZlciB3YXMgYmlnIGVub3VnaCBvciBldmVuIHZhbGlkLjxicj4KICogUmVzdWx0aW5nIGJvdW5kcyBjYW4gYmUgdXNlZCB0byBwcm9kdWNlIGEgcmFuZ2Ugb2Ygc3RyaW5ncyB0aGF0IGFyZQogKiBiZXR3ZWVuIHVwcGVyIGFuZCBsb3dlciBib3VuZHMuIEZvciBleGFtcGxlLCBpZiBib3VuZHMgYXJlIHByb2R1Y2VkCiAqIGZvciBhIHNvcnRrZXkgb2Ygc3RyaW5nICJzbWl0aCIsIHN0cmluZ3MgYmV0d2VlbiB1cHBlciBhbmQgbG93ZXIgCiAqIGJvdW5kcyB3aXRoIG9uZSBsZXZlbCB3b3VsZCBpbmNsdWRlICJTbWl0aCIsICJTTUlUSCIsICJzTWlUaCIuPGJyPgogKiBUaGVyZSBhcmUgdHdvIHVwcGVyIGJvdW5kcyB0aGF0IGNhbiBiZSBwcm9kdWNlZC4gSWYgVUNPTF9CT1VORF9VUFBFUgogKiBpcyBwcm9kdWNlZCwgc3RyaW5ncyBtYXRjaGVkIHdvdWxkIGJlIGFzIGFib3ZlLiBIb3dldmVyLCBpZiBib3VuZAogKiBwcm9kdWNlZCB1c2luZyBVQ09MX0JPVU5EX1VQUEVSX0xPTkcgaXMgdXNlZCwgdGhlIGFib3ZlIGV4YW1wbGUgd2lsbAogKiBhbHNvIG1hdGNoICJTbWl0aHNvbmlhbiIgYW5kIHNpbWlsYXIuPGJyPgogKiBGb3IgbW9yZSBvbiB1c2FnZSwgc2VlIGV4YW1wbGUgaW4gY2ludGx0c3QvY2FwaXRzdC5jIGluIHByb2NlZHVyZQogKiBUZXN0Qm91bmRzLgogKiBTb3J0IGtleXMgbWF5IGJlIGNvbXBhcmVkIHVzaW5nIDxUVD5zdHJjbXA8L1RUPi4KICogQHBhcmFtIHNvdXJjZSBUaGUgc291cmNlIHNvcnRrZXkuCiAqIEBwYXJhbSBzb3VyY2VMZW5ndGggVGhlIGxlbmd0aCBvZiBzb3VyY2UsIG9yIC0xIGlmIG51bGwtdGVybWluYXRlZC4gCiAqICAgICAgICAgICAgICAgICAgICAgKElmIGFuIHVubW9kaWZpZWQgc29ydGtleSBpcyBwYXNzZWQsIGl0IGlzIGFsd2F5cyBudWxsIAogKiAgICAgICAgICAgICAgICAgICAgICB0ZXJtaW5hdGVkKS4KICogQHBhcmFtIGJvdW5kVHlwZSBUeXBlIG9mIGJvdW5kIHJlcXVpcmVkLiBJdCBjYW4gYmUgVUNPTF9CT1VORF9MT1dFUiwgd2hpY2ggCiAqICAgICAgICAgICAgICAgICAgcHJvZHVjZXMgYSBsb3dlciBpbmNsdXNpdmUgYm91bmQsIFVDT0xfQk9VTkRfVVBQRVIsIHRoYXQgCiAqICAgICAgICAgICAgICAgICAgcHJvZHVjZXMgdXBwZXIgYm91bmQgdGhhdCBtYXRjaGVzIHN0cmluZ3Mgb2YgdGhlIHNhbWUgbGVuZ3RoIAogKiAgICAgICAgICAgICAgICAgIG9yIFVDT0xfQk9VTkRfVVBQRVJfTE9ORyB0aGF0IG1hdGNoZXMgc3RyaW5ncyB0aGF0IGhhdmUgdGhlIAogKiAgICAgICAgICAgICAgICAgIHNhbWUgc3RhcnRpbmcgc3Vic3RyaW5nIGFzIHRoZSBzb3VyY2Ugc3RyaW5nLgogKiBAcGFyYW0gbm9PZkxldmVscyAgTnVtYmVyIG9mIGxldmVscyByZXF1aXJlZCBpbiB0aGUgcmVzdWx0aW5nIGJvdW5kIChmb3IgbW9zdCAKICogICAgICAgICAgICAgICAgICAgIHVzZXMsIHRoZSByZWNvbW1lbmRlZCB2YWx1ZSBpcyAxKS4gU2VlIHVzZXJzIGd1aWRlIGZvciAKICogICAgICAgICAgICAgICAgICAgIGV4cGxhbmF0aW9uIG9uIG51bWJlciBvZiBsZXZlbHMgYSBzb3J0a2V5IGNhbiBoYXZlLgogKiBAcGFyYW0gcmVzdWx0IEEgcG9pbnRlciB0byBhIGJ1ZmZlciB0byByZWNlaXZlIHRoZSByZXN1bHRpbmcgc29ydGtleS4KICogQHBhcmFtIHJlc3VsdExlbmd0aCBUaGUgbWF4aW11bSBzaXplIG9mIHJlc3VsdC4KICogQHBhcmFtIHN0YXR1cyBVc2VkIGZvciByZXR1cm5pbmcgZXJyb3IgY29kZSBpZiBzb21ldGhpbmcgd2VudCB3cm9uZy4gSWYgdGhlIAogKiAgICAgICAgICAgICAgIG51bWJlciBvZiBsZXZlbHMgcmVxdWVzdGVkIGlzIGhpZ2hlciB0aGFuIHRoZSBudW1iZXIgb2YgbGV2ZWxzCiAqICAgICAgICAgICAgICAgaW4gdGhlIHNvdXJjZSBrZXksIGEgd2FybmluZyAoVV9TT1JUX0tFWV9UT09fU0hPUlRfV0FSTklORykgaXMgCiAqICAgICAgICAgICAgICAgaXNzdWVkLgogKiBAcmV0dXJuIFRoZSBzaXplIG5lZWRlZCB0byBmdWxseSBzdG9yZSB0aGUgYm91bmQuIAogKiBAc2VlIHVjb2xfa2V5SGFzaENvZGUKICogQHN0YWJsZSBJQ1UgMi4xCiAqLwpVX1NUQUJMRSBpbnQzMl90IFVfRVhQT1JUMiAKdWNvbF9nZXRCb3VuZChjb25zdCB1aW50OF90ICAgICAgICpzb3VyY2UsCiAgICAgICAgaW50MzJfdCAgICAgICAgICAgICBzb3VyY2VMZW5ndGgsCiAgICAgICAgVUNvbEJvdW5kTW9kZSAgICAgICBib3VuZFR5cGUsCiAgICAgICAgdWludDMyX3QgICAgICAgICAgICBub09mTGV2ZWxzLAogICAgICAgIHVpbnQ4X3QgICAgICAgICAgICAgKnJlc3VsdCwKICAgICAgICBpbnQzMl90ICAgICAgICAgICAgIHJlc3VsdExlbmd0aCwKICAgICAgICBVRXJyb3JDb2RlICAgICAgICAgICpzdGF0dXMpOwogICAgICAgIAovKioKICogR2V0cyB0aGUgdmVyc2lvbiBpbmZvcm1hdGlvbiBmb3IgYSBDb2xsYXRvci4gVmVyc2lvbiBpcyBjdXJyZW50bHkKICogYW4gb3BhcXVlIDMyLWJpdCBudW1iZXIgd2hpY2ggZGVwZW5kcywgYW1vbmcgb3RoZXIgdGhpbmdzLCBvbiBtYWpvcgogKiB2ZXJzaW9ucyBvZiB0aGUgY29sbGF0b3IgdGFpbG9yaW5nIGFuZCBVQ0EuCiAqIEBwYXJhbSBjb2xsIFRoZSBVQ29sbGF0b3IgdG8gcXVlcnkuCiAqIEBwYXJhbSBpbmZvIHRoZSB2ZXJzaW9uICMgaW5mb3JtYXRpb24sIHRoZSByZXN1bHQgd2lsbCBiZSBmaWxsZWQgaW4KICogQHN0YWJsZSBJQ1UgMi4wCiAqLwpVX1NUQUJMRSB2b2lkIFVfRVhQT1JUMgp1Y29sX2dldFZlcnNpb24oY29uc3QgVUNvbGxhdG9yKiBjb2xsLCBVVmVyc2lvbkluZm8gaW5mbyk7CgovKioKICogR2V0cyB0aGUgVUNBIHZlcnNpb24gaW5mb3JtYXRpb24gZm9yIGEgQ29sbGF0b3IuIFZlcnNpb24gaXMgdGhlCiAqIFVDQSB2ZXJzaW9uIG51bWJlciAoMy4xLjEsIDQuMCkuCiAqIEBwYXJhbSBjb2xsIFRoZSBVQ29sbGF0b3IgdG8gcXVlcnkuCiAqIEBwYXJhbSBpbmZvIHRoZSB2ZXJzaW9uICMgaW5mb3JtYXRpb24sIHRoZSByZXN1bHQgd2lsbCBiZSBmaWxsZWQgaW4KICogQGRyYWZ0IElDVSAyLjgKICovClVfRFJBRlQgdm9pZCBVX0VYUE9SVDIKdWNvbF9nZXRVQ0FWZXJzaW9uKGNvbnN0IFVDb2xsYXRvciogY29sbCwgVVZlcnNpb25JbmZvIGluZm8pOwoKLyoqIAogKiBNZXJnZSB0d28gc29ydCBrZXlzLiBUaGUgbGV2ZWxzIGFyZSBtZXJnZWQgd2l0aCB0aGVpciBjb3JyZXNwb25kaW5nIGNvdW50ZXJwYXJ0cwogKiAocHJpbWFyaWVzIHdpdGggcHJpbWFyaWVzLCBzZWNvbmRhcmllcyB3aXRoIHNlY29uZGFyaWVzIGV0Yy4pLiBCZXR3ZWVuIHRoZSB2YWx1ZXMKICogZnJvbSB0aGUgc2FtZSBsZXZlbCBhIHNlcGFyYXRvciBpcyBpbnNlcnRlZC4KICogZXhhbXBsZSAodW5jb21wcmVzc2VkKTogCiAqIDE5MUIxRCAwMSAwNTA1MDUgMDEgOTEwNTA1IDAwIGFuZCAxRjIxMjMgMDEgMDUwNTA1IDAxIDkxMDUwNSAwMAogKiB3aWxsIGJlIG1lcmdlZCBhcyAKICogMTkxQjFEIDAyIDFGMjEyMzAxIDA1MDUwNSAwMiAwNTA1MDUgMDEgOTEwNTA1IDAyIDkxMDUwNSAwMAogKiBUaGlzIGFsbG93cyBmb3IgY29uY2F0ZW5hdGluZyBvZiBmaXJzdCBhbmQgbGFzdCBuYW1lcyBmb3Igc29ydGluZywgYW1vbmcgb3RoZXIgdGhpbmdzLgogKiBJZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyIGlzIG5vdCBiaWcgZW5vdWdoLCB0aGUgcmVzdWx0cyBhcmUgdW5kZWZpbmVkLgogKiBJZiBhbnkgb2Ygc291cmNlIGxlbmd0aHMgYXJlIHplcm8gb3IgYW55IG9mIHNvdXJjZSBwb2ludGVycyBhcmUgTlVMTC91bmRlZmluZWQsIAogKiByZXN1bHQgaXMgb2Ygc2l6ZSB6ZXJvLgogKiBAcGFyYW0gc3JjMSBwb2ludGVyIHRvIHRoZSBmaXJzdCBzb3J0a2V5CiAqIEBwYXJhbSBzcmMxTGVuZ3RoIGxlbmd0aCBvZiB0aGUgZmlyc3Qgc29ydGtleQogKiBAcGFyYW0gc3JjMiBwb2ludGVyIHRvIHRoZSBzZWNvbmQgc29ydGtleQogKiBAcGFyYW0gc3JjMkxlbmd0aCBsZW5ndGggb2YgdGhlIHNlY29uZCBzb3J0a2V5CiAqIEBwYXJhbSBkZXN0IGJ1ZmZlciB0byBob2xkIHRoZSByZXN1bHQKICogQHBhcmFtIGRlc3RDYXBhY2l0eSBzaXplIG9mIHRoZSBidWZmZXIgZm9yIHRoZSByZXN1bHQKICogQHJldHVybiBzaXplIG9mIHRoZSByZXN1bHQuIElmIHRoZSBidWZmZXIgaXMgYmlnIGVub3VnaCBzaXplIGlzIGFsd2F5cwogKiAgICAgICAgIHNyYzFMZW5ndGgrc3JjMkxlbmd0aC0xCiAqIEBzdGFibGUgSUNVIDIuMAogKi8KVV9TVEFCTEUgaW50MzJfdCBVX0VYUE9SVDIgCnVjb2xfbWVyZ2VTb3J0a2V5cyhjb25zdCB1aW50OF90ICpzcmMxLCBpbnQzMl90IHNyYzFMZW5ndGgsCiAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmMyLCBpbnQzMl90IHNyYzJMZW5ndGgsCiAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkZXN0LCBpbnQzMl90IGRlc3RDYXBhY2l0eSk7CgovKioKICogVW5pdmVyc2FsIGF0dHJpYnV0ZSBzZXR0ZXIKICogQHBhcmFtIGNvbGwgY29sbGF0b3Igd2hpY2ggYXR0cmlidXRlcyBhcmUgdG8gYmUgY2hhbmdlZAogKiBAcGFyYW0gYXR0ciBhdHRyaWJ1dGUgdHlwZSAKICogQHBhcmFtIHZhbHVlIGF0dHJpYnV0ZSB2YWx1ZQogKiBAcGFyYW0gc3RhdHVzIHRvIGluZGljYXRlIHdoZXRoZXIgdGhlIG9wZXJhdGlvbiB3ZW50IG9uIHNtb290aGx5IG9yIHRoZXJlIHdlcmUgZXJyb3JzCiAqIEBzZWUgVUNvbEF0dHJpYnV0ZQogKiBAc2VlIFVDb2xBdHRyaWJ1dGVWYWx1ZQogKiBAc2VlIHVjb2xfZ2V0QXR0cmlidXRlCiAqIEBzdGFibGUgSUNVIDIuMAogKi8KVV9TVEFCTEUgdm9pZCBVX0VYUE9SVDIgCnVjb2xfc2V0QXR0cmlidXRlKFVDb2xsYXRvciAqY29sbCwgVUNvbEF0dHJpYnV0ZSBhdHRyLCBVQ29sQXR0cmlidXRlVmFsdWUgdmFsdWUsIFVFcnJvckNvZGUgKnN0YXR1cyk7CgovKioKICogVW5pdmVyc2FsIGF0dHJpYnV0ZSBnZXR0ZXIKICogQHBhcmFtIGNvbGwgY29sbGF0b3Igd2hpY2ggYXR0cmlidXRlcyBhcmUgdG8gYmUgY2hhbmdlZAogKiBAcGFyYW0gYXR0ciBhdHRyaWJ1dGUgdHlwZQogKiBAcmV0dXJuIGF0dHJpYnV0ZSB2YWx1ZQogKiBAcGFyYW0gc3RhdHVzIHRvIGluZGljYXRlIHdoZXRoZXIgdGhlIG9wZXJhdGlvbiB3ZW50IG9uIHNtb290aGx5IG9yIHRoZXJlIHdlcmUgZXJyb3JzCiAqIEBzZWUgVUNvbEF0dHJpYnV0ZQogKiBAc2VlIFVDb2xBdHRyaWJ1dGVWYWx1ZQogKiBAc2VlIHVjb2xfc2V0QXR0cmlidXRlCiAqIEBzdGFibGUgSUNVIDIuMAogKi8KVV9TVEFCTEUgVUNvbEF0dHJpYnV0ZVZhbHVlICBVX0VYUE9SVDIgCnVjb2xfZ2V0QXR0cmlidXRlKGNvbnN0IFVDb2xsYXRvciAqY29sbCwgVUNvbEF0dHJpYnV0ZSBhdHRyLCBVRXJyb3JDb2RlICpzdGF0dXMpOwoKLyoqIFZhcmlhYmxlIHRvcAogKiBpcyBhIHR3byBieXRlIHByaW1hcnkgdmFsdWUgd2hpY2ggY2F1c2VzIGFsbCB0aGUgY29kZXBvaW50cyB3aXRoIHByaW1hcnkgdmFsdWVzIHRoYXQKICogYXJlIGxlc3Mgb3IgZXF1YWwgdGhhbiB0aGUgdmFyaWFibGUgdG9wIHRvIGJlIHNoaWZ0ZWQgd2hlbiBhbHRlcm5hdGUgaGFuZGxpbmcgaXMgc2V0CiAqIHRvIFVDT0xfU0hJRlRFRC4KICogU2V0cyB0aGUgdmFyaWFibGUgdG9wIHRvIGEgY29sbGF0aW9uIGVsZW1lbnQgdmFsdWUgb2YgYSBzdHJpbmcgc3VwcGxpZWQuIAogKiBAcGFyYW0gY29sbCBjb2xsYXRvciB3aGljaCB2YXJpYWJsZSB0b3AgbmVlZHMgdG8gYmUgY2hhbmdlZAogKiBAcGFyYW0gdmFyVG9wIG9uZSBvciBtb3JlIChpZiBjb250cmFjdGlvbikgVUNoYXJzIHRvIHdoaWNoIHRoZSB2YXJpYWJsZSB0b3Agc2hvdWxkIGJlIHNldAogKiBAcGFyYW0gbGVuIGxlbmd0aCBvZiB2YXJpYWJsZSB0b3Agc3RyaW5nLiBJZiAtMSBpdCBpcyBjb25zaWRlcmVkIHRvIGJlIHplcm8gdGVybWluYXRlZC4KICogQHBhcmFtIHN0YXR1cyBlcnJvciBjb2RlLiBJZiBlcnJvciBjb2RlIGlzIHNldCwgdGhlIHJldHVybiB2YWx1ZSBpcyB1bmRlZmluZWQuIAogKiAgICAgICAgICAgICAgIEVycm9ycyBzZXQgYnkgdGhpcyBmdW5jdGlvbiBhcmU6IDxicj4KICogICAgVV9DRV9OT1RfRk9VTkRfRVJST1IgaWYgbW9yZSB0aGFuIG9uZSBjaGFyYWN0ZXIgd2FzIHBhc3NlZCBhbmQgdGhlcmUgaXMgbm8gc3VjaCAKICogICAgYSBjb250cmFjdGlvbjxicj4KICogICAgVV9QUklNQVJZX1RPT19MT05HX0VSUk9SIGlmIHRoZSBwcmltYXJ5IGZvciB0aGUgdmFyaWFibGUgdG9wIGhhcyBtb3JlIHRoYW4gdHdvIGJ5dGVzCiAqIEByZXR1cm4gYSAzMiBiaXQgdmFsdWUgY29udGFpbmluZyB0aGUgdmFsdWUgb2YgdGhlIHZhcmlhYmxlIHRvcCBpbiB1cHBlciAxNiBiaXRzLiAKICogICAgICAgICBMb3dlciAxNiBiaXRzIGFyZSB1bmRlZmluZWQKICogQHNlZSB1Y29sX2dldFZhcmlhYmxlVG9wCiAqIEBzZWUgdWNvbF9yZXN0b3JlVmFyaWFibGVUb3AKICogQHN0YWJsZSBJQ1UgMi4wCiAqLwpVX1NUQUJMRSB1aW50MzJfdCBVX0VYUE9SVDIgCnVjb2xfc2V0VmFyaWFibGVUb3AoVUNvbGxhdG9yICpjb2xsLCAKICAgICAgICAgICAgICAgICAgICBjb25zdCBVQ2hhciAqdmFyVG9wLCBpbnQzMl90IGxlbiwgCiAgICAgICAgICAgICAgICAgICAgVUVycm9yQ29kZSAqc3RhdHVzKTsKCi8qKiAKICogR2V0cyB0aGUgdmFyaWFibGUgdG9wIHZhbHVlIG9mIGEgQ29sbGF0b3IuIAogKiBMb3dlciAxNiBiaXRzIGFyZSB1bmRlZmluZWQgYW5kIHNob3VsZCBiZSBpZ25vcmVkLgogKiBAcGFyYW0gY29sbCBjb2xsYXRvciB3aGljaCB2YXJpYWJsZSB0b3AgbmVlZHMgdG8gYmUgcmV0cmlldmVkCiAqIEBwYXJhbSBzdGF0dXMgZXJyb3IgY29kZSAobm90IGNoYW5nZWQgYnkgZnVuY3Rpb24pLiBJZiBlcnJvciBjb2RlIGlzIHNldCwgCiAqICAgICAgICAgICAgICAgdGhlIHJldHVybiB2YWx1ZSBpcyB1bmRlZmluZWQuCiAqIEByZXR1cm4gdGhlIHZhcmlhYmxlIHRvcCB2YWx1ZSBvZiBhIENvbGxhdG9yLgogKiBAc2VlIHVjb2xfc2V0VmFyaWFibGVUb3AKICogQHNlZSB1Y29sX3Jlc3RvcmVWYXJpYWJsZVRvcAogKiBAc3RhYmxlIElDVSAyLjAKICovClVfU1RBQkxFIHVpbnQzMl90IFVfRVhQT1JUMiB1Y29sX2dldFZhcmlhYmxlVG9wKGNvbnN0IFVDb2xsYXRvciAqY29sbCwgVUVycm9yQ29kZSAqc3RhdHVzKTsKCi8qKiAKICogU2V0cyB0aGUgdmFyaWFibGUgdG9wIHRvIGEgY29sbGF0aW9uIGVsZW1lbnQgdmFsdWUgc3VwcGxpZWQuIFZhcmlhYmxlIHRvcCBpcyAKICogc2V0IHRvIHRoZSB1cHBlciAxNiBiaXRzLiAKICogTG93ZXIgMTYgYml0cyBhcmUgaWdub3JlZC4KICogQHBhcmFtIGNvbGwgY29sbGF0b3Igd2hpY2ggdmFyaWFibGUgdG9wIG5lZWRzIHRvIGJlIGNoYW5nZWQKICogQHBhcmFtIHZhclRvcCBDRSB2YWx1ZSwgYXMgcmV0dXJuZWQgYnkgdWNvbF9zZXRWYXJpYWJsZVRvcCBvciB1Y29sKWdldFZhcmlhYmxlVG9wCiAqIEBwYXJhbSBzdGF0dXMgZXJyb3IgY29kZSAobm90IGNoYW5nZWQgYnkgZnVuY3Rpb24pCiAqIEBzZWUgdWNvbF9nZXRWYXJpYWJsZVRvcAogKiBAc2VlIHVjb2xfc2V0VmFyaWFibGVUb3AKICogQHN0YWJsZSBJQ1UgMi4wCiAqLwpVX1NUQUJMRSB2b2lkIFVfRVhQT1JUMiAKdWNvbF9yZXN0b3JlVmFyaWFibGVUb3AoVUNvbGxhdG9yICpjb2xsLCBjb25zdCB1aW50MzJfdCB2YXJUb3AsIFVFcnJvckNvZGUgKnN0YXR1cyk7CgovKioKICogVGhyZWFkIHNhZmUgY2xvbmluZyBvcGVyYXRpb24uIFRoZSByZXN1bHQgaXMgYSBjbG9uZSBvZiBhIGdpdmVuIGNvbGxhdG9yLgogKiBAcGFyYW0gY29sbCBjb2xsYXRvciB0byBiZSBjbG9uZWQKICogQHBhcmFtIHN0YWNrQnVmZmVyIHVzZXIgYWxsb2NhdGVkIHNwYWNlIGZvciB0aGUgbmV3IGNsb25lLiAKICogSWYgTlVMTCBuZXcgbWVtb3J5IHdpbGwgYmUgYWxsb2NhdGVkLiAKICogIElmIGJ1ZmZlciBpcyBub3QgbGFyZ2UgZW5vdWdoLCBuZXcgbWVtb3J5IHdpbGwgYmUgYWxsb2NhdGVkLgogKiAgQ2xpZW50cyBjYW4gdXNlIHRoZSBVX0NPTF9TQUZFQ0xPTkVfQlVGRkVSU0laRS4gCiAqICBUaGlzIHdpbGwgcHJvYmFibHkgYmUgZW5vdWdoIHRvIGF2b2lkIG1lbW9yeSBhbGxvY2F0aW9ucy4KICogQHBhcmFtIHBCdWZmZXJTaXplIHBvaW50ZXIgdG8gc2l6ZSBvZiBhbGxvY2F0ZWQgc3BhY2UuIAogKiAgSWYgKnBCdWZmZXJTaXplID09IDAsIGEgc3VmZmljaWVudCBzaXplIGZvciB1c2UgaW4gY2xvbmluZyB3aWxsIAogKiAgYmUgcmV0dXJuZWQgKCdwcmUtZmxpZ2h0aW5nJykKICogIElmICpwQnVmZmVyU2l6ZSBpcyBub3QgZW5vdWdoIGZvciBhIHN0YWNrLWJhc2VkIHNhZmUgY2xvbmUsIAogKiAgbmV3IG1lbW9yeSB3aWxsIGJlIGFsbG9jYXRlZC4KICogQHBhcmFtIHN0YXR1cyB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoZSBvcGVyYXRpb24gd2VudCBvbiBzbW9vdGhseSBvciB0aGVyZSB3ZXJlIGVycm9ycwogKiAgICBBbiBpbmZvcm1hdGlvbmFsIHN0YXR1cyB2YWx1ZSwgVV9TQUZFQ0xPTkVfQUxMT0NBVEVEX0VSUk9SLCBpcyB1c2VkIGlmIGFueQogKiBhbGxvY2F0aW9ucyB3ZXJlIG5lY2Vzc2FyeS4KICogQHJldHVybiBwb2ludGVyIHRvIHRoZSBuZXcgY2xvbmUKICogQHNlZSB1Y29sX29wZW4KICogQHNlZSB1Y29sX29wZW5SdWxlcwogKiBAc2VlIHVjb2xfY2xvc2UKICogQHN0YWJsZSBJQ1UgMi4wCiAqLwpVX1NUQUJMRSBVQ29sbGF0b3IqIFVfRVhQT1JUMiAKdWNvbF9zYWZlQ2xvbmUoY29uc3QgVUNvbGxhdG9yICpjb2xsLAogICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgKnN0YWNrQnVmZmVyLAogICAgICAgICAgICAgICBpbnQzMl90ICAgICAgICAgKnBCdWZmZXJTaXplLAogICAgICAgICAgICAgICBVRXJyb3JDb2RlICAgICAgKnN0YXR1cyk7CgovKiogZGVmYXVsdCBtZW1vcnkgc2l6ZSBmb3IgdGhlIG5ldyBjbG9uZS4gSXQgbmVlZHMgdG8gYmUgdGhpcyBsYXJnZSBmb3Igb3MvNDAwIGxhcmdlIHBvaW50ZXJzIAogKiBAc3RhYmxlIElDVSAyLjAKICovCiNkZWZpbmUgVV9DT0xfU0FGRUNMT05FX0JVRkZFUlNJWkUgNTEyCgovKioKICogUmV0dXJucyBjdXJyZW50IHJ1bGVzLiBEZWx0YSBkZWZpbmVzIHdoZXRoZXIgZnVsbCBydWxlcyBhcmUgcmV0dXJuZWQgb3IganVzdCB0aGUgdGFpbG9yaW5nLiAKICogUmV0dXJucyBudW1iZXIgb2YgVUNoYXJzIG5lZWRlZCB0byBzdG9yZSBydWxlcy4gSWYgYnVmZmVyIGlzIE5VTEwgb3IgYnVmZmVyTGVuIGlzIG5vdCBlbm91Z2ggCiAqIHRvIHN0b3JlIHJ1bGVzLCB3aWxsIHN0b3JlIHVwIHRvIGF2YWlsYWJsZSBzcGFjZS4KICogQHBhcmFtIGNvbGwgY29sbGF0b3IgdG8gZ2V0IHRoZSBydWxlcyBmcm9tCiAqIEBwYXJhbSBkZWx0YSBvbmUgb2YgVUNPTF9UQUlMT1JJTkdfT05MWSwgVUNPTF9GVUxMX1JVTEVTLiAKICogQHBhcmFtIGJ1ZmZlciBidWZmZXIgdG8gc3RvcmUgdGhlIHJlc3VsdCBpbi4gSWYgTlVMTCwgeW91J2xsIGdldCBubyBydWxlcy4KICogQHBhcmFtIGJ1ZmZlckxlbiBsZW5naHQgb2YgYnVmZmVyIHRvIHN0b3JlIHJ1bGVzIGluLiBJZiBsZXNzIHRoZW4gbmVlZGVkIHlvdSdsbCBnZXQgb25seSB0aGUgcGFydCB0aGF0IGZpdHMgaW4uCiAqIEByZXR1cm4gY3VycmVudCBydWxlcwogKiBAc3RhYmxlIElDVSAyLjAKICovClVfU1RBQkxFIGludDMyX3QgVV9FWFBPUlQyIAp1Y29sX2dldFJ1bGVzRXgoY29uc3QgVUNvbGxhdG9yICpjb2xsLCBVQ29sUnVsZU9wdGlvbiBkZWx0YSwgVUNoYXIgKmJ1ZmZlciwgaW50MzJfdCBidWZmZXJMZW4pOwoKLyoqCiAqIGdldHMgdGhlIGxvY2FsZSBuYW1lIG9mIHRoZSBjb2xsYXRvci4gSWYgdGhlIGNvbGxhdG9yCiAqIGlzIGluc3RhbnRpYXRlZCBmcm9tIHRoZSBydWxlcywgdGhlbiB0aGlzIGZ1bmN0aW9uIHJldHVybnMKICogTlVMTC4KICogQHBhcmFtIGNvbGwgVGhlIFVDb2xsYXRvciBmb3Igd2hpY2ggdGhlIGxvY2FsZSBpcyBuZWVkZWQKICogQHBhcmFtIHR5cGUgWW91IGNhbiBjaG9vc2UgYmV0d2VlbiByZXF1ZXN0ZWQsIHZhbGlkIGFuZCBhY3R1YWwKICogICAgICAgICAgICAgbG9jYWxlLiBGb3IgZGVzY3JpcHRpb24gc2VlIHRoZSBkZWZpbml0aW9uIG9mCiAqICAgICAgICAgICAgIFVMb2NEYXRhTG9jYWxlVHlwZSBpbiB1bG9jLmgKICogQHBhcmFtIHN0YXR1cyBlcnJvciBjb2RlIG9mIHRoZSBvcGVyYXRpb24KICogQHJldHVybiByZWFsIGxvY2FsZSBuYW1lIGZyb20gd2hpY2ggdGhlIGNvbGxhdGlvbiBkYXRhIGNvbWVzLiAKICogICAgICAgICBJZiB0aGUgY29sbGF0b3Igd2FzIGluc3RhbnRpYXRlZCBmcm9tIHJ1bGVzLCByZXR1cm5zCiAqICAgICAgICAgTlVMTC4KICogQGRlcHJlY2F0ZWQgSUNVIDIuOCBVc2UgdWNvbF9nZXRMb2NhbGVCeVR5cGUgaW5zdGVhZAogKi8KVV9ERVBSRUNBVEVEIGNvbnN0IGNoYXIgKiBVX0VYUE9SVDIKdWNvbF9nZXRMb2NhbGUoY29uc3QgVUNvbGxhdG9yICpjb2xsLCBVTG9jRGF0YUxvY2FsZVR5cGUgdHlwZSwgVUVycm9yQ29kZSAqc3RhdHVzKTsKCgovKioKICogZ2V0cyB0aGUgbG9jYWxlIG5hbWUgb2YgdGhlIGNvbGxhdG9yLiBJZiB0aGUgY29sbGF0b3IKICogaXMgaW5zdGFudGlhdGVkIGZyb20gdGhlIHJ1bGVzLCB0aGVuIHRoaXMgZnVuY3Rpb24gcmV0dXJucwogKiBOVUxMLgogKiBAcGFyYW0gY29sbCBUaGUgVUNvbGxhdG9yIGZvciB3aGljaCB0aGUgbG9jYWxlIGlzIG5lZWRlZAogKiBAcGFyYW0gdHlwZSBZb3UgY2FuIGNob29zZSBiZXR3ZWVuIHJlcXVlc3RlZCwgdmFsaWQgYW5kIGFjdHVhbAogKiAgICAgICAgICAgICBsb2NhbGUuIEZvciBkZXNjcmlwdGlvbiBzZWUgdGhlIGRlZmluaXRpb24gb2YKICogICAgICAgICAgICAgVUxvY0RhdGFMb2NhbGVUeXBlIGluIHVsb2MuaAogKiBAcGFyYW0gc3RhdHVzIGVycm9yIGNvZGUgb2YgdGhlIG9wZXJhdGlvbgogKiBAcmV0dXJuIHJlYWwgbG9jYWxlIG5hbWUgZnJvbSB3aGljaCB0aGUgY29sbGF0aW9uIGRhdGEgY29tZXMuIAogKiAgICAgICAgIElmIHRoZSBjb2xsYXRvciB3YXMgaW5zdGFudGlhdGVkIGZyb20gcnVsZXMsIHJldHVybnMKICogICAgICAgICBOVUxMLgogKiBAZHJhZnQgSUNVIDIuOCBsaWtlbHkgdG8gY2hhbmdlIGluIElDVSAzLjAsIGJhc2VkIG9uIGZlZWRiYWNrCiAqLwpVX0RSQUZUIGNvbnN0IGNoYXIgKiBVX0VYUE9SVDIKdWNvbF9nZXRMb2NhbGVCeVR5cGUoY29uc3QgVUNvbGxhdG9yICpjb2xsLCBVTG9jRGF0YUxvY2FsZVR5cGUgdHlwZSwgVUVycm9yQ29kZSAqc3RhdHVzKTsKCi8qKgogKiBHZXQgYW4gVW5pY29kZSBzZXQgdGhhdCBjb250YWlucyBhbGwgdGhlIGNoYXJhY3RlcnMgYW5kIHNlcXVlbmNlcyB0YWlsb3JlZCBpbiAKICogdGhpcyBjb2xsYXRvci4gVGhlIHJlc3VsdCBtdXN0IGJlIGRpc3Bvc2VkIG9mIGJ5IHVzaW5nIHVzZXRfY2xvc2UuCiAqIEBwYXJhbSBjb2xsICAgICAgICBUaGUgVUNvbGxhdG9yIGZvciB3aGljaCB3ZSB3YW50IHRvIGdldCB0YWlsb3JlZCBjaGFycwogKiBAcGFyYW0gc3RhdHVzICAgICAgZXJyb3IgY29kZSBvZiB0aGUgb3BlcmF0aW9uCiAqIEByZXR1cm4gYSBwb2ludGVyIHRvIG5ld2x5IGNyZWF0ZWQgVVNldC4gTXVzdCBiZSBiZSBkaXNwb3NlZCBieSB1c2luZyB1c2V0X2Nsb3NlCiAqIEBzZWUgdWNvbF9vcGVuUnVsZXMKICogQHNlZSB1c2V0X2Nsb3NlCiAqIEBzdGFibGUgSUNVIDIuNAogKi8KVV9TVEFCTEUgVVNldCAqIFVfRVhQT1JUMgp1Y29sX2dldFRhaWxvcmVkU2V0KGNvbnN0IFVDb2xsYXRvciAqY29sbCwgVUVycm9yQ29kZSAqc3RhdHVzKTsKCi8qKgogKiBSZXR1cm5lZCBieSB1Y29sX2NvbGxhdG9yVG9JZGVudGlmaWVyIHRvIHNpZ25pZnkgdGhhdCBjb2xsYXRvciBpcwogKiBub3QgZW5jb2RhYmxlIGFzIGFuIGlkZW50aWZpZXIuCiAqIEBpbnRlcm5hbCBJQ1UgMy4wCiAqLwojZGVmaW5lIFVDT0xfU0lUX0NPTExBVE9SX05PVF9FTkNPREFCTEUgMHg4MDAwMDAwMAoKLyoqCiAqIEdldCBhIDMxLWJpdCBpZGVudGlmaWVyIGdpdmVuIGEgY29sbGF0b3IuIAogKiBAcGFyYW0gY29sbCBVQ29sbGF0b3IKICogIEBwYXJhbSBsb2NhbGUgYSBsb2NhbGUgdGhhdCB3aWxsIGFwcGVhciBhcyBhIGNvbGxhdG9ycyBsb2NhbGUgaW4gdGhlIHJlc3VsdGluZwogKiAgICAgICAgICAgICAgICBzaG9ydCBzdHJpbmcgZGVmaW5pdGlvbi4gSWYgTlVMTCwgdGhlIGxvY2FsZSB3aWxsIGJlIGhhcnZlc3RlZCAKICogICAgICAgICAgICAgICAgZnJvbSB0aGUgY29sbGF0b3IuCiAqIEBwYXJhbSBzdGF0dXMgaG9sZHMgZXJyb3IgbWVzc2FnZXMKICogQHJldHVybiAzMS1iaXQgaWRlbnRpZmllci4gTVNCIGlzIHVzZWQgaWYgdGhlIGNvbGxhdG9yIGNhbm5vdCBiZSBlbmNvZGVkLiBJbiB0aGF0CiAqICAgICAgICAgY2FzZSBVQ09MX1NJVF9DT0xMQVRPUl9OT1RfRU5DT0RBQkxFIGlzIHJldHVybmVkCiAqIEBzZWUgdWNvbF9vcGVuRnJvbUlkZW50aWZpZXIKICogQHNlZSB1Y29sX2lkZW50aWZpZXJUb1Nob3J0U3RyaW5nCiAqIEBpbnRlcm5hbCBJQ1UgMy4wCiAqLwpVX0lOVEVSTkFMIHVpbnQzMl90IFVfRVhQT1JUMgp1Y29sX2NvbGxhdG9yVG9JZGVudGlmaWVyKGNvbnN0IFVDb2xsYXRvciAqY29sbCwKICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpsb2NhbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgVUVycm9yQ29kZSAqc3RhdHVzKTsKCi8qKgogKiBPcGVuIGEgY29sbGF0b3IgZ2l2ZW4gYSAzMS1iaXQgaWRlbnRpZmllcgogKiBAcGFyYW0gaWRlbnRpZmllciAzMS1iaXQgaWRlbnRpZmllciwgZW5jb2RlZCBieSBjYWxsaW5nIHVjb2xfY29sbGF0b3JUb0lkZW50aWZpZXIKICogQHBhcmFtIGZvcmNlRGVmYXVsdHMgaWYgRkFMU0UsIHRoZSBzZXR0aW5ncyB0aGF0IGFyZSB0aGUgc2FtZSBhcyB0aGUgY29sbGF0b3IgCiAqICAgICAgICAgICAgICAgICAgIGRlZmF1bHQgc2V0dGluZ3Mgd2lsbCBub3QgYmUgYXBwbGllZCAoZm9yIGV4YW1wbGUsIHNldHRpbmcKICogICAgICAgICAgICAgICAgICAgRnJlbmNoIHNlY29uZGFyeSBvbiBhIEZyZW5jaCBjb2xsYXRvciB3b3VsZCBub3QgYmUgZXhlY3V0ZWQpLiAKICogICAgICAgICAgICAgICAgICAgSWYgVFJVRSwgYWxsIHRoZSBzZXR0aW5ncyB3aWxsIGJlIGFwcGxpZWQgcmVnYXJkbGVzcyBvZiB0aGUgCiAqICAgICAgICAgICAgICAgICAgIGNvbGxhdG9yIGRlZmF1bHQgdmFsdWUuIElmIHRoZSBkZWZpbml0aW9uCiAqICAgICAgICAgICAgICAgICAgIHN0cmluZ3MgdGhhdCBjYW4gYmUgcHJvZHVjZWQgZnJvbSBhIGNvbGxhdG9yIGluc3RhbnRpYXRlZCBieSAKICogICAgICAgICAgICAgICAgICAgY2FsbGluZyB0aGlzIEFQSSBhcmUgdG8gYmUgY2FjaGVkLCBzaG91bGQgYmUgc2V0IHRvIEZBTFNFLgogKiBAcGFyYW0gc3RhdHVzIGZvciByZXR1cm5pbmcgZXJyb3JzCiAqIEByZXR1cm4gVUNvbGxhdG9yIG9iamVjdAogKiBAc2VlIHVjb2xfY29sbGF0b3JUb0lkZW50aWZpZXIKICogQHNlZSB1Y29sX2lkZW50aWZpZXJUb1Nob3J0U3RyaW5nCiAqIEBpbnRlcm5hbCBJQ1UgMy4wCiAqLwpVX0lOVEVSTkFMIFVDb2xsYXRvciogVV9FWFBPUlQyCnVjb2xfb3BlbkZyb21JZGVudGlmaWVyKHVpbnQzMl90IGlkZW50aWZpZXIsCiAgICAgICAgICAgICAgICAgICAgICAgIFVCb29sIGZvcmNlRGVmYXVsdHMsCiAgICAgICAgICAgICAgICAgICAgICAgIFVFcnJvckNvZGUgKnN0YXR1cyk7CgoKLyoqCiAqIENhbGN1bGF0ZSB0aGUgc2hvcnQgZGVmaW5pdGlvbiBzdHJpbmcgZ2l2ZW4gYW4gaWRlbnRpZmllci4gU3VwcG9ydHMgcHJlZmxpZ2h0aW5nLgogKiBAcGFyYW0gaWRlbnRpZmllciAzMS1iaXQgaWRlbnRpZmllciwgZW5jb2RlZCBieSBjYWxsaW5nIHVjb2xfY29sbGF0b3JUb0lkZW50aWZpZXIKICogQHBhcmFtIGJ1ZmZlciBidWZmZXIgdG8gc3RvcmUgdGhlIHJlc3VsdAogKiBAcGFyYW0gY2FwYWNpdHkgYnVmZmVyIGNhcGFjaXR5CiAqIEBwYXJhbSBmb3JjZURlZmF1bHRzIHdoZXRoZXIgdGhlIHNldHRpbmdzIHRoYXQgYXJlIHRoZSBzYW1lIGFzIHRoZSBkZWZhdWx0IHNldHRpbmcKICogICAgICAgICAgICAgICAgICAgICAgc2hvdWxkIGJlIGZvcmNlZCBhbnl3YXkuIFNldHRpbmcgdGhpcyBhcmd1bWVudCB0byBGQUxTRSByZWR1Y2VzCiAqICAgICAgICAgICAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgZGlmZmVyZW50IGNvbmZpZ3VyYXRpb25zLCBidXQgZGVjcmVhc2VzIHBlcmZvcm1hY2UKICogICAgICAgICAgICAgICAgICAgICAgYXMgYSBjb2xsYXRvciBoYXMgdG8gYmUgaW5zdGFudGlhdGVkLgogKiBAcGFyYW0gc3RhdHVzIGZvciByZXR1cm5pbmcgZXJyb3JzCiAqIEByZXR1cm4gbGVuZ3RoIG9mIHRoZSBzaG9ydCBkZWZpbml0aW9uIHN0cmluZwogKiBAc2VlIHVjb2xfY29sbGF0b3JUb0lkZW50aWZpZXIKICogQHNlZSB1Y29sX29wZW5Gcm9tSWRlbnRpZmllcgogKiBAc2VlIHVjb2xfc2hvcnRTdHJpbmdUb0lkZW50aWZpZXIKICogQGludGVybmFsIElDVSAzLjAKICovClVfSU5URVJOQUwgaW50MzJfdCBVX0VYUE9SVDIKdWNvbF9pZGVudGlmaWVyVG9TaG9ydFN0cmluZyh1aW50MzJfdCBpZGVudGlmaWVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNhcGFjaXR5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVCb29sIGZvcmNlRGVmYXVsdHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUVycm9yQ29kZSAqc3RhdHVzKTsKCi8qKgogKiBDYWxjdWxhdGUgdGhlIGlkZW50aWZpZXIgZ2l2ZW4gYSBzaG9ydCBkZWZpbml0aW9uIHN0cmluZy4gU3VwcG9ydHMgcHJlZmxpZ2h0aW5nLgogKiBAcGFyYW0gZGVmaW5pdGlvbiBzaG9ydCBzdHJpbmcgZGVmaW5pdGlvbgogKiBAcGFyYW0gZm9yY2VEZWZhdWx0cyB3aGV0aGVyIHRoZSBzZXR0aW5ncyB0aGF0IGFyZSB0aGUgc2FtZSBhcyB0aGUgZGVmYXVsdCBzZXR0aW5nCiAqICAgICAgICAgICAgICAgICAgICAgIHNob3VsZCBiZSBmb3JjZWQgYW55d2F5LiBTZXR0aW5nIHRoaXMgYXJndW1lbnQgdG8gRkFMU0UgcmVkdWNlcwogKiAgICAgICAgICAgICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGRpZmZlcmVudCBjb25maWd1cmF0aW9ucywgYnV0IGRlY3JlYXNlcyBwZXJmb3JtYWNlCiAqICAgICAgICAgICAgICAgICAgICAgIGFzIGEgY29sbGF0b3IgaGFzIHRvIGJlIGluc3RhbnRpYXRlZC4KICogQHBhcmFtIHN0YXR1cyBmb3IgcmV0dXJuaW5nIGVycm9ycwogKiBAcmV0dXJuIGlkZW50aWZpZXIKICogQHNlZSB1Y29sX2NvbGxhdG9yVG9JZGVudGlmaWVyCiAqIEBzZWUgdWNvbF9vcGVuRnJvbUlkZW50aWZpZXIKICogQHNlZSB1Y29sX2lkZW50aWZpZXJUb1Nob3J0U3RyaW5nCiAqIEBpbnRlcm5hbCBJQ1UgMy4wCiAqLwpVX0lOVEVSTkFMIHVpbnQzMl90IFVfRVhQT1JUMgp1Y29sX3Nob3J0U3RyaW5nVG9JZGVudGlmaWVyKGNvbnN0IGNoYXIgKmRlZmluaXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUJvb2wgZm9yY2VEZWZhdWx0cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVRXJyb3JDb2RlICpzdGF0dXMpOwoKCgovKioKICogVW5pdmVyc2FsIGF0dHJpYnV0ZSBnZXR0ZXIgdGhhdCByZXR1cm5zIFVDT0xfREVGQVVMVCBpZiB0aGUgdmFsdWUgaXMgZGVmYXVsdAogKiBAcGFyYW0gY29sbCBjb2xsYXRvciB3aGljaCBhdHRyaWJ1dGVzIGFyZSB0byBiZSBjaGFuZ2VkCiAqIEBwYXJhbSBhdHRyIGF0dHJpYnV0ZSB0eXBlCiAqIEByZXR1cm4gYXR0cmlidXRlIHZhbHVlIG9yIFVDT0xfREVGQVVMVCBpZiB0aGUgdmFsdWUgaXMgZGVmYXVsdAogKiBAcGFyYW0gc3RhdHVzIHRvIGluZGljYXRlIHdoZXRoZXIgdGhlIG9wZXJhdGlvbiB3ZW50IG9uIHNtb290aGx5IG9yIHRoZXJlIHdlcmUgZXJyb3JzCiAqIEBzZWUgVUNvbEF0dHJpYnV0ZQogKiBAc2VlIFVDb2xBdHRyaWJ1dGVWYWx1ZQogKiBAc2VlIHVjb2xfc2V0QXR0cmlidXRlCiAqIEBpbnRlcm5hbCBJQ1UgMy4wCiAqLwpVX0lOVEVSTkFMIFVDb2xBdHRyaWJ1dGVWYWx1ZSAgVV9FWFBPUlQyCnVjb2xfZ2V0QXR0cmlidXRlT3JEZWZhdWx0KGNvbnN0IFVDb2xsYXRvciAqY29sbCwgVUNvbEF0dHJpYnV0ZSBhdHRyLCBVRXJyb3JDb2RlICpzdGF0dXMpOwoKLyoqIENoZWNrIHdoZXRoZXIgdHdvIGNvbGxhdG9ycyBhcmUgZXF1YWwuIENvbGxhdG9ycyBhcmUgY29uc2lkZXJlZCBlcXVhbCBpZiB0aGV5CiAqICB3aWxsIHNvcnQgc3RyaW5ncyB0aGUgc2FtZS4gVGhpcyBtZWFucyB0aGF0IGJvdGggdGhlIGN1cnJlbnQgYXR0cmlidXRlcyBhbmQgdGhlCiAqICBydWxlcyBtdXN0IGJlIGVxdWl2YWxlbnQuIEN1cnJlbnRseSB1c2VkIGZvciBSdWxlQmFzZWRDb2xsYXRvcjo6b3BlcmF0b3I9PS4KICogIEBwYXJhbSBzb3VyY2UgZmlyc3QgY29sbGF0b3IKICogIEBwYXJhbSB0YXJnZXQgc2Vjb25kIGNvbGxhdG9yCiAqICBAcmV0dXJuIFRSVUUgb3IgRkFMU0UKICogIEBpbnRlcm5hbCBJQ1UgMy4wCiAqLwpVX0lOVEVSTkFMIFVCb29sIFVfRVhQT1JUMgp1Y29sX2VxdWFscyhjb25zdCBVQ29sbGF0b3IgKnNvdXJjZSwgY29uc3QgVUNvbGxhdG9yICp0YXJnZXQpOwoKLyoqIENhbGN1bGF0ZXMgdGhlIHNldCBvZiB1bnNhZmUgY29kZSBwb2ludHMsIGdpdmVuIGEgY29sbGF0b3IuCiAqICBAcGFyYW0gY29sbCBDb2xsYXRvcgogKiAgQHBhcmFtIHVuc2FmZSBhIGZpbGwtaW4gc2V0IHRvIHJlY2VpdmUgdGhlIHVuc2FmZSBwb2ludHMKICogIEBwYXJhbSBzdGF0dXMgZm9yIGNhdGNoaW5nIGVycm9ycwogKiAgQHJldHVybiBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIHNldAogKiAgQGludGVybmFsIElDVSAzLjAKICovClVfSU5URVJOQUwgaW50MzJfdCBVX0VYUE9SVDIKdWNvbF9nZXRVbnNhZmVTZXQoIGNvbnN0IFVDb2xsYXRvciAqY29sbCwKICAgICAgICAgICAgICAgICAgVVNldCAqdW5zYWZlLAogICAgICAgICAgICAgICAgICBVRXJyb3JDb2RlICpzdGF0dXMpOwoKLyoqIENyZWF0ZXMgYSBiaW5hcnkgaW1hZ2Ugb2YgYSBjb2xsYXRvci4gVGhpcyBiaW5hcnkgaW1hZ2UgY2FuIGJlIHN0b3JlZCBhbmQgCiAqICBsYXRlciB1c2VkIHRvIGluc3RhbnRpYXRlIGEgY29sbGF0b3IgdXNpbmcgdWNvbF9vcGVuQmluYXJ5LgogKiAgVGhpcyBBUEkgc3VwcG9ydHMgcHJlZmxpZ2h0aW5nLgogKiAgQHBhcmFtIGNvbGwgQ29sbGF0b3IKICogIEBwYXJhbSBidWZmZXIgYSBmaWxsLWluIGJ1ZmZlciB0byByZWNlaXZlIHRoZSBiaW5hcnkgaW1hZ2UKICogIEBwYXJhbSBjYXBhY2l0eSBjYXBhY2l0eSBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyCiAqICBAcGFyYW0gc3RhdHVzIGZvciBjYXRjaGluZyBlcnJvcnMKICogIEByZXR1cm4gc2l6ZSBvZiB0aGUgaW1hZ2UKICogIEBzZWUgdWNvbF9vcGVuQmluYXJ5CiAqICBAZHJhZnQgSUNVIDMuMgogKi8KVV9EUkFGVCBpbnQzMl90IFVfRVhQT1JUMgp1Y29sX2Nsb25lQmluYXJ5KGNvbnN0IFVDb2xsYXRvciAqY29sbCwKICAgICAgICAgICAgICAgICB1aW50OF90ICpidWZmZXIsIGludDMyX3QgY2FwYWNpdHksCiAgICAgICAgICAgICAgICAgVUVycm9yQ29kZSAqc3RhdHVzKTsKCi8qKiBPcGVucyBhIGNvbGxhdG9yIGZyb20gYSBjb2xsYXRvciBiaW5hcnkgaW1hZ2UgY3JlYXRlZCB1c2luZwogKiAgdWNvbF9jbG9uZUJpbmFyeS4gQmluYXJ5IGltYWdlIHVzZWQgaW4gaW5zdGFudGlhdGlvbiBvZiB0aGUgCiAqICBjb2xsYXRvciByZW1haW5zIG93bmVkIGJ5IHRoZSB1c2VyIGFuZCBzaG91bGQgc3RheSBhcm91bmQgZm9yIAogKiAgdGhlIGxpZmV0aW1lIG9mIHRoZSBjb2xsYXRvci4gVGhlIEFQSSBhbHNvIHRha2VzIGEgYmFzZSBjb2xsYXRvcgogKiAgd2hpY2ggdXN1YWx5IHNob3VsZCBiZSBVQ0EuCiAqICBAcGFyYW0gYmluIGJpbmFyeSBpbWFnZSBvd25lZCBieSB0aGUgdXNlciBhbmQgcmVxdWlyZWQgdGhyb3VnaCB0aGUKICogICAgICAgICAgICAgbGlmZXRpbWUgb2YgdGhlIGNvbGxhdG9yCiAqICBAcGFyYW0gbGVuZ3RoIHNpemUgb2YgdGhlIGltYWdlLiBJZiBuZWdhdGl2ZSwgdGhlIEFQSSB3aWxsIHRyeSB0bwogKiAgICAgICAgICAgICAgICBmaWd1cmUgb3V0IHRoZSBsZW5ndGggb2YgdGhlIGltYWdlCiAqICBAcGFyYW0gYmFzZSBmYWxsYmFjayBjb2xsYXRvciwgdXN1YWxseSBVQ0EuIEJhc2UgaXMgcmVxdWlyZWQgdG8gYmUKICogICAgICAgICAgICAgIHByZXNlbnQgdGhyb3VnaCB0aGUgbGlmZXRpbWUgb2YgdGhlIGNvbGxhdG9yLiBDdXJyZW50bHkgCiAqICAgICAgICAgICAgICBpdCBjYW5ub3QgYmUgTlVMTC4KICogIEBwYXJhbSBzdGF0dXMgZm9yIGNhdGNoaW5nIGVycm9ycwogKiAgQHJldHVybiBuZXdseSBjcmVhdGVkIGNvbGxhdG9yCiAqICBAc2VlIHVjb2xfY2xvbmVCaW5hcnkKICogIEBkcmFmdCBJQ1UgMy4yCiAqLwpVX0RSQUZUIFVDb2xsYXRvciogVV9FWFBPUlQyCnVjb2xfb3BlbkJpbmFyeShjb25zdCB1aW50OF90ICpiaW4sIGludDMyX3QgbGVuZ3RoLCAKICAgICAgICAgICAgICAgIGNvbnN0IFVDb2xsYXRvciAqYmFzZSwgCiAgICAgICAgICAgICAgICBVRXJyb3JDb2RlICpzdGF0dXMpOwoKCiNlbmRpZiAvKiAjaWYgIVVDT05GSUdfTk9fQ09MTEFUSU9OICovCgojZW5kaWYKCg==