LyoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqICAgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDMgSUJNIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiAgIERhdGUgICAgICAgIE5hbWUgICAgICAgIERlc2NyaXB0aW9uCiogIDA2LzI4LzIwMDEgICBzeW53ZWUgICAgICBDcmVhdGlvbi4KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqLwojaWZuZGVmIFVTRUFSQ0hfSAojZGVmaW5lIFVTRUFSQ0hfSAoKI2luY2x1ZGUgInVuaWNvZGUvdXR5cGVzLmgiCgojaWYgIVVDT05GSUdfTk9fQ09MTEFUSU9OCgojaW5jbHVkZSAidW5pY29kZS91Y29sLmgiCiNpbmNsdWRlICJ1bmljb2RlL3Vjb2xlaXRyLmgiCiNpbmNsdWRlICJ1bmljb2RlL3VicmsuaCIKCi8qKgogKiBcZmlsZQogKiBcYnJpZWYgQyBBUEk6IFN0cmluZ1NlYXJjaAogKgogKiBDIEFwaXMgZm9yIGFuIGVuZ2luZSB0aGF0IHByb3ZpZGVzIGxhbmd1YWdlLXNlbnNpdGl2ZSB0ZXh0IHNlYXJjaGluZyBiYXNlZCAKICogb24gdGhlIGNvbXBhcmlzb24gcnVsZXMgZGVmaW5lZCBpbiBhIDx0dD5VQ29sbGF0b3I8L3R0PiBkYXRhIHN0cnVjdCwKICogc2VlIDx0dD51Y29sLmg8L3R0Pi4gVGhpcyBlbnN1cmVzIHRoYXQgbGFuZ3VhZ2UgZWNjZW50cmljaXR5IGNhbiBiZSAKICogaGFuZGxlZCwgZS5nLiBmb3IgdGhlIEdlcm1hbiBjb2xsYXRvciwgY2hhcmFjdGVycyDfIGFuZCBTUyB3aWxsIGJlIG1hdGNoZWQgCiAqIGlmIGNhc2UgaXMgY2hvc2VuIHRvIGJlIGlnbm9yZWQuIAogKiBTZWUgdGhlIDxhIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9jdnMvaWN1L35jaGVja291dH4vaWN1aHRtbC9kZXNpZ24vY29sbGF0aW9uL0lDVV9jb2xsYXRpb25fZGVzaWduLmh0bSI+CiAqICJJQ1UgQ29sbGF0aW9uIERlc2lnbiBEb2N1bWVudCI8L2E+IGZvciBtb3JlIGluZm9ybWF0aW9uLgogKiA8cD4gCiAqIFRoZSBhbGdvcml0aG0gaW1wbGVtZW50ZWQgaXMgYSBtb2RpZmllZCBmb3JtIG9mIHRoZSBCb3llciBNb29yZSdzIHNlYXJjaC4KICogRm9yIG1vcmUgaW5mb3JtYXRpb24gIHNlZSAKICogPGEgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2ljdS9kb2NzL3BhcGVycy9lZmZpY2llbnRfdGV4dF9zZWFyY2hpbmdfaW5famF2YS5odG1sIj4KICogIkVmZmljaWVudCBUZXh0IFNlYXJjaGluZyBpbiBKYXZhIjwvYT4sIHB1Ymxpc2hlZCBpbiA8aT5KYXZhIFJlcG9ydDwvaT4gCiAqIGluIEZlYnJ1YXJ5LCAxOTk5LCBmb3IgZnVydGhlciBpbmZvcm1hdGlvbiBvbiB0aGUgYWxnb3JpdGhtLgogKiA8cD4KICogVGhlcmUgYXJlIDIgbWF0Y2ggb3B0aW9ucyBmb3Igc2VsZWN0aW9uOjxicj4KICogTGV0IFMnIGJlIHRoZSBzdWItc3RyaW5nIG9mIGEgdGV4dCBzdHJpbmcgUyBiZXR3ZWVuIHRoZSBvZmZzZXRzIHN0YXJ0IGFuZCAKICogZW5kIDxzdGFydCwgZW5kPi4KICogPGJyPgogKiBBIHBhdHRlcm4gc3RyaW5nIFAgbWF0Y2hlcyBhIHRleHQgc3RyaW5nIFMgYXQgdGhlIG9mZnNldHMgPHN0YXJ0LCBlbmQ+IAogKiBpZgogKiA8cHJlPiAKICogb3B0aW9uIDEuIFNvbWUgY2Fub25pY2FsIGVxdWl2YWxlbnQgb2YgUCBtYXRjaGVzIHNvbWUgY2Fub25pY2FsIGVxdWl2YWxlbnQgCiAqICAgICAgICAgICBvZiBTJwogKiBvcHRpb24gMi4gUCBtYXRjaGVzIFMnIGFuZCBpZiBQIHN0YXJ0cyBvciBlbmRzIHdpdGggYSBjb21iaW5pbmcgbWFyaywgCiAqICAgICAgICAgICB0aGVyZSBleGlzdHMgbm8gbm9uLWlnbm9yYWJsZSBjb21iaW5pbmcgbWFyayBiZWZvcmUgb3IgYWZ0ZXIgU5IgCiAqICAgICAgICAgICBpbiBTIHJlc3BlY3RpdmVseS4gCiAqIDwvcHJlPgogKiBPcHRpb24gMi4gd2lsbCBiZSB0aGUgZGVmYXVsdLcKICogPHA+CiAqIFRoaXMgc2VhcmNoIGhhcyBBUElzIHNpbWlsYXIgdG8gdGhhdCBvZiBvdGhlciB0ZXh0IGl0ZXJhdGlvbiBtZWNoYW5pc21zIAogKiBzdWNoIGFzIHRoZSBicmVhayBpdGVyYXRvcnMgaW4gPHR0PnVicmsuaDwvdHQ+LiBVc2luZyB0aGVzZSAKICogQVBJcywgaXQgaXMgZWFzeSB0byBzY2FuIHRocm91Z2ggdGV4dCBsb29raW5nIGZvciBhbGwgb2NjdXJhbmNlcyBvZiAKICogYSBnaXZlbiBwYXR0ZXJuLiBUaGlzIHNlYXJjaCBpdGVyYXRvciBhbGxvd3MgY2hhbmdpbmcgb2YgZGlyZWN0aW9uIGJ5IAogKiBjYWxsaW5nIGEgPHR0PnJlc2V0PC90dD4gZm9sbG93ZWQgYnkgYSA8dHQ+bmV4dDwvdHQ+IG9yIDx0dD5wcmV2aW91czwvdHQ+LiAKICogVGhvdWdoIGEgZGlyZWN0aW9uIGNoYW5nZSBjYW4gb2NjdXIgd2l0aG91dCBjYWxsaW5nIDx0dD5yZXNldDwvdHQ+IGZpcnN0LCAgCiAqIHRoaXMgb3BlcmF0aW9uIGNvbWVzIHdpdGggc29tZSBzcGVlZCBwZW5hbHR5LgogKiBHZW5lcmFsbHksIG1hdGNoIHJlc3VsdHMgaW4gdGhlIGZvcndhcmQgZGlyZWN0aW9uIHdpbGwgbWF0Y2ggdGhlIHJlc3VsdCAKICogbWF0Y2hlcyBpbiB0aGUgYmFja3dhcmRzIGRpcmVjdGlvbiBpbiB0aGUgcmV2ZXJzZSBvcmRlcgogKiA8cD4KICogPHR0PnVzZWFyY2guaDwvdHQ+IHByb3ZpZGVzIEFQSXMgdG8gc3BlY2lmeSB0aGUgc3RhcnRpbmcgcG9zaXRpb24gCiAqIHdpdGhpbiB0aGUgdGV4dCBzdHJpbmcgdG8gYmUgc2VhcmNoZWQsIGUuZy4gPHR0PnVzZWFyY2hfc2V0T2Zmc2V0PC90dD4sCiAqIDx0dD51c2VhcmNoX3ByZWNlZGluZzwvdHQ+IGFuZCA8dHQ+dXNlYXJjaF9mb2xsb3dpbmc8L3R0Pi4gU2luY2UgdGhlIAogKiBzdGFydGluZyBwb3NpdGlvbiB3aWxsIGJlIHNldCBhcyBpdCBpcyBzcGVjaWZpZWQsIHBsZWFzZSB0YWtlIG5vdGUgdGhhdCAKICogdGhlcmUgYXJlIHNvbWUgZGFuZ2Vyb3VzIHBvc2l0aW9ucyB3aGljaCB0aGUgc2VhcmNoIG1heSByZW5kZXIgaW5jb3JyZWN0IAogKiByZXN1bHRzOgogKiA8dWw+CiAqIDxsaT4gVGhlIG1pZHN0IG9mIGEgc3Vic3RyaW5nIHRoYXQgcmVxdWlyZXMgbm9ybWFsaXphdGlvbi4KICogPGxpPiBJZiB0aGUgZm9sbG93aW5nIG1hdGNoIGlzIHRvIGJlIGZvdW5kLCB0aGUgcG9zaXRpb24gc2hvdWxkIG5vdCBiZSB0aGUKICogICAgICBzZWNvbmQgY2hhcmFjdGVyIHdoaWNoIHJlcXVpcmVzIHRvIGJlIHN3YXBwZWQgd2l0aCB0aGUgcHJlY2VkaW5nIAogKiAgICAgIGNoYXJhY3Rlci4gVmljZSB2ZXJzYSwgaWYgdGhlIHByZWNlZGluZyBtYXRjaCBpcyB0byBiZSBmb3VuZCwgCiAqICAgICAgcG9zaXRpb24gdG8gc2VhcmNoIGZyb20gc2hvdWxkIG5vdCBiZSB0aGUgZmlyc3QgY2hhcmFjdGVyIHdoaWNoIAogKiAgICAgIHJlcXVpcmVzIHRvIGJlIHN3YXBwZWQgd2l0aCB0aGUgbmV4dCBjaGFyYWN0ZXIuIEUuZyBjZXJ0YWluIFRoYWkgYW5kCiAqICAgICAgTGFvIGNoYXJhY3RlcnMgcmVxdWlyZSBzd2FwcGluZy4KICogPGxpPiBJZiBhIGZvbGxvd2luZyBwYXR0ZXJuIG1hdGNoIGlzIHRvIGJlIGZvdW5kLCBhbnkgcG9zaXRpb24gd2l0aGluIGEgCiAqICAgICAgY29udHJhY3Rpbmcgc2VxdWVuY2UgZXhjZXB0IHRoZSBmaXJzdCB3aWxsIGZhaWwuIFZpY2UgdmVyc2EgaWYgYSAKICogICAgICBwcmVjZWRpbmcgcGF0dGVybiBtYXRjaCBpcyB0byBiZSBmb3VuZCwgYSBpbnZhbGlkIHN0YXJ0aW5nIHBvaW50IAogKiAgICAgIHdvdWxkIGJlIGFueSBjaGFyYWN0ZXIgd2l0aGluIGEgY29udHJhY3Rpbmcgc2VxdWVuY2UgZXhjZXB0IHRoZSBsYXN0LgogKiA8L3VsPgogKiA8cD4KICogQSBicmVha2l0ZXJhdG9yIGNhbiBiZSB1c2VkIGlmIG9ubHkgbWF0Y2hlcyBhdCBsb2dpY2FsIGJyZWFrcyBhcmUgZGVzaXJlZC4KICogVXNpbmcgYSBicmVha2l0ZXJhdG9yIHdpbGwgb25seSBnaXZlIHlvdSByZXN1bHRzIHRoYXQgZXhhY3RseSBtYXRjaGVzIHRoZQogKiBib3VuZGFyaWVzIGdpdmVuIGJ5IHRoZSBicmVha2l0ZXJhdG9yLiBGb3IgaW5zdGFuY2UgdGhlIHBhdHRlcm4gImUiIHdpbGwKICogbm90IGJlIGZvdW5kIGluIHRoZSBzdHJpbmcgIlx1MDBlOSIgaWYgYSBjaGFyYWN0ZXIgYnJlYWsgaXRlcmF0b3IgaXMgdXNlZC4KICogPHA+CiAqIE9wdGlvbnMgYXJlIHByb3ZpZGVkIHRvIGhhbmRsZSBvdmVybGFwcGluZyBtYXRjaGVzLiAKICogRS5nLiBJbiBFbmdsaXNoLCBvdmVybGFwcGluZyBtYXRjaGVzIHByb2R1Y2VzIHRoZSByZXN1bHQgMCBhbmQgMiAKICogZm9yIHRoZSBwYXR0ZXJuICJhYmFiIiBpbiB0aGUgdGV4dCAiYWJhYmFiIiwgd2hlcmUgZWxzZSBtdXR1YWxseSAKICogZXhjbHVzaXZlIG1hdGNoZXMgb25seSBwcm9kdWNlIHRoZSByZXN1bHQgb2YgMC4KICogPHA+CiAqIFRob3VnaCBjb2xsYXRvciBhdHRyaWJ1dGVzIHdpbGwgYmUgdGFrZW4gaW50byBjb25zaWRlcmF0aW9uIHdoaWxlIAogKiBwZXJmb3JtaW5nIG1hdGNoZXMsIHRoZXJlIGFyZSBubyBBUElzIGhlcmUgZm9yIHNldHRpbmcgYW5kIGdldHRpbmcgdGhlIAogKiBhdHRyaWJ1dGVzLiBUaGVzZSBhdHRyaWJ1dGVzIGNhbiBiZSBzZXQgYnkgZ2V0dGluZyB0aGUgY29sbGF0b3IKICogZnJvbSA8dHQ+dXNlYXJjaF9nZXRDb2xsYXRvcjwvdHQ+IGFuZCB1c2luZyB0aGUgQVBJcyBpbiA8dHQ+dWNvbC5oPC90dD4uCiAqIExhc3RseSB0byB1cGRhdGUgU3RyaW5nIFNlYXJjaCB0byB0aGUgbmV3IGNvbGxhdG9yIGF0dHJpYnV0ZXMsIAogKiB1c2VhcmNoX3Jlc2V0KCkgaGFzIHRvIGJlIGNhbGxlZC4KICogPHA+IAogKiBSZXN0cmljdGlvbjogPGJyPgogKiBDdXJyZW50bHkgdGhlcmUgYXJlIG5vIGNvbXBvc2l0ZSBjaGFyYWN0ZXJzIHRoYXQgY29uc2lzdHMgb2YgYQogKiBjaGFyYWN0ZXIgd2l0aCBjb21iaW5pbmcgY2xhc3MgPiAwIGJlZm9yZSBhIGNoYXJhY3RlciB3aXRoIGNvbWJpbmluZyAKICogY2xhc3MgPT0gMC4gSG93ZXZlciwgaWYgc3VjaCBhIGNoYXJhY3RlciBleGlzdHMgaW4gdGhlIGZ1dHVyZSwgdGhlIAogKiBzZWFyY2ggbWVjaGFuaXNtIGRvZXMgbm90IGd1YXJhbnRlZSB0aGUgcmVzdWx0cyBmb3Igb3B0aW9uIDEuCiAqIAogKiA8cD4KICogRXhhbXBsZSBvZiB1c2U6PGJyPgogKiA8cHJlPjxjb2RlPgogKiBjaGFyICp0Z3RzdHIgPSAiVGhlIHF1aWNrIGJyb3duIGZveCBqdW1wZWQgb3ZlciB0aGUgbGF6eSBmb3giOwogKiBjaGFyICpwYXRzdHIgPSAiZm94IjsKICogVUNoYXIgdGFyZ2V0WzY0XTsKICogVUNoYXIgcGF0dGVyblsxNl07CiAqIFVFcnJvckNvZGUgc3RhdHVzID0gVV9aRVJPX0VSUk9SOwogKiB1X3Vhc3RyY3B5KHRhcmdldCwgdGd0c3RyKTsKICogdV91YXN0cmNweShwYXR0ZXJuLCBwYXRzdHIpOwogKgogKiBVU3RyaW5nU2VhcmNoICpzZWFyY2ggPSB1c2VhcmNoX29wZW4ocGF0dGVybiwgLTEsIHRhcmdldCwgLTEsICJlbl9VUyIsIAogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhdHVzKTsKICogaWYgKFVfU1VDQ0VTUyhzdGF0dXMpKSB7CiAqICAgICBmb3IgKGludCBwb3MgPSB1c2VhcmNoX2ZpcnN0KHNlYXJjaCwgJnN0YXR1cyk7IAogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zICE9IFVTRUFSQ0hfRE9ORTsgCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3MgPSB1c2VhcmNoX25leHQoc2VhcmNoLCAmc3RhdHVzKSkgewogKiAgICAgICAgIHByaW50ZigiRm91bmQgbWF0Y2ggYXQgJWQgcG9zLCBsZW5ndGggaXMgJWRcbiIsIHBvcywgCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWFyY2hfZ2V0TWF0Y2hMZW5ndGgoc2VhcmNoKSk7CiAqICAgICB9CiAqIH0KICogPC9jb2RlPjwvcHJlPgogKiBAc3RhYmxlIElDVSAyLjQKICovCgovKioKKiBET05FIGlzIHJldHVybmVkIGJ5IHByZXZpb3VzKCkgYW5kIG5leHQoKSBhZnRlciBhbGwgdmFsaWQgbWF0Y2hlcyBoYXZlIAoqIGJlZW4gcmV0dXJuZWQsIGFuZCBieSBmaXJzdCgpIGFuZCBsYXN0KCkgaWYgdGhlcmUgYXJlIG5vIG1hdGNoZXMgYXQgYWxsLgoqIEBzdGFibGUgSUNVIDIuNAoqLwojZGVmaW5lIFVTRUFSQ0hfRE9ORSAtMQoKLyoqCiogRGF0YSBzdHJ1Y3R1cmUgZm9yIHNlYXJjaGluZwoqIEBzdGFibGUgSUNVIDIuNAoqLwpzdHJ1Y3QgVVN0cmluZ1NlYXJjaDsKLyoqCiogRGF0YSBzdHJ1Y3R1cmUgZm9yIHNlYXJjaGluZwoqIEBzdGFibGUgSUNVIDIuNAoqLwp0eXBlZGVmIHN0cnVjdCBVU3RyaW5nU2VhcmNoIFVTdHJpbmdTZWFyY2g7CgovKioKKiBAc3RhYmxlIElDVSAyLjQKKi8KdHlwZWRlZiBlbnVtIHsKICAgIC8qKiBPcHRpb24gZm9yIG92ZXJsYXBwaW5nIG1hdGNoZXMgKi8KICAgIFVTRUFSQ0hfT1ZFUkxBUCwKICAgIC8qKiAKICAgIE9wdGlvbiBmb3IgY2Fub25pY2FsIG1hdGNoZXMuIG9wdGlvbiAxIGluIGhlYWRlciBkb2N1bWVudGF0aW9uLgogICAgVGhlIGRlZmF1bHQgdmFsdWUgd2lsbCBiZSBVU0VBUkNIX09GRgogICAgKi8KICAgIFVTRUFSQ0hfQ0FOT05JQ0FMX01BVENILAogICAgVVNFQVJDSF9BVFRSSUJVVEVfQ09VTlQKfSBVU2VhcmNoQXR0cmlidXRlOwoKLyoqCiogQHN0YWJsZSBJQ1UgMi40CiovCnR5cGVkZWYgZW51bSB7CiAgICAvKiogZGVmYXVsdCB2YWx1ZSBmb3IgYW55IFVTZWFyY2hBdHRyaWJ1dGUgKi8KICAgIFVTRUFSQ0hfREVGQVVMVCA9IC0xLAogICAgLyoqIHZhbHVlIGZvciBVU0VBUkNIX09WRVJMQVAgYW5kIFVTRUFSQ0hfQ0FOT05JQ0FMX01BVENIICovCiAgICBVU0VBUkNIX09GRiwgCiAgICAvKiogdmFsdWUgZm9yIFVTRUFSQ0hfT1ZFUkxBUCBhbmQgVVNFQVJDSF9DQU5PTklDQUxfTUFUQ0ggKi8KICAgIFVTRUFSQ0hfT04sCiAgICBVU0VBUkNIX0FUVFJJQlVURV9WQUxVRV9DT1VOVAp9IFVTZWFyY2hBdHRyaWJ1dGVWYWx1ZTsKCi8qIG9wZW4gYW5kIGNsb3NlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKLyoqCiogQ3JlYXRpbmcgYSBzZWFyY2ggaXRlcmF0b3IgZGF0YSBzdHJ1Y3QgdXNpbmcgdGhlIGFyZ3VtZW50IGxvY2FsZSBsYW5ndWFnZQoqIHJ1bGUgc2V0LiBBIGNvbGxhdG9yIHdpbGwgYmUgY3JlYXRlZCBpbiB0aGUgcHJvY2Vzcywgd2hpY2ggd2lsbCBiZSBvd25lZCBieQoqIHRoaXMgc2VhcmNoIGFuZCB3aWxsIGJlIGRlbGV0ZWQgaW4gPHR0PnVzZWFyY2hfY2xvc2U8L3R0Pi4KKiBAcGFyYW0gcGF0dGVybiBmb3IgbWF0Y2hpbmcKKiBAcGFyYW0gcGF0dGVybmxlbmd0aCBsZW5ndGggb2YgdGhlIHBhdHRlcm4sIC0xIGZvciBudWxsLXRlcm1pbmF0aW9uCiogQHBhcmFtIHRleHQgdGV4dCBzdHJpbmcKKiBAcGFyYW0gdGV4dGxlbmd0aCBsZW5ndGggb2YgdGhlIHRleHQgc3RyaW5nLCAtMSBmb3IgbnVsbC10ZXJtaW5hdGlvbgoqIEBwYXJhbSBsb2NhbGUgbmFtZSBvZiBsb2NhbGUgZm9yIHRoZSBydWxlcyB0byBiZSB1c2VkCiogQHBhcmFtIGJyZWFraXRlciBBIEJyZWFrSXRlcmF0b3IgdGhhdCB3aWxsIGJlIHVzZWQgdG8gcmVzdHJpY3QgdGhlIHBvaW50cwoqICAgICAgICAgICAgICAgICAgYXQgd2hpY2ggbWF0Y2hlcyBhcmUgZGV0ZWN0ZWQuIElmIGEgbWF0Y2ggaXMgZm91bmQsIGJ1dCAKKiAgICAgICAgICAgICAgICAgIHRoZSBtYXRjaCdzIHN0YXJ0IG9yIGVuZCBpbmRleCBpcyBub3QgYSBib3VuZGFyeSBhcyAKKiAgICAgICAgICAgICAgICAgIGRldGVybWluZWQgYnkgdGhlIDx0dD5CcmVha0l0ZXJhdG9yPC90dD4sIHRoZSBtYXRjaCB3aWxsIAoqICAgICAgICAgICAgICAgICAgYmUgcmVqZWN0ZWQgYW5kIGFub3RoZXIgd2lsbCBiZSBzZWFyY2hlZCBmb3IuIAoqICAgICAgICAgICAgICAgICAgSWYgdGhpcyBwYXJhbWV0ZXIgaXMgPHR0Pk5VTEw8L3R0Piwgbm8gYnJlYWsgZGV0ZWN0aW9uIGlzIAoqICAgICAgICAgICAgICAgICAgYXR0ZW1wdGVkLgoqIEBwYXJhbSBzdGF0dXMgZm9yIGVycm9ycyBpZiBpdCBvY2N1cnMuIElmIHBhdHRlcm4gb3IgdGV4dCBpcyBOVUxMLCBvciBpZgoqICAgICAgICAgICAgICAgcGF0dGVybmxlbmd0aCBvciB0ZXh0bGVuZ3RoIGlzIDAgdGhlbiBhbiAKKiAgICAgICAgICAgICAgIFVfSUxMRUdBTF9BUkdVTUVOVF9FUlJPUiBpcyByZXR1cm5lZC4KKiBAcmV0dXJuIHNlYXJjaCBpdGVyYXRvciBkYXRhIHN0cnVjdHVyZSwgb3IgTlVMTCBpZiB0aGVyZSBpcyBhbiBlcnJvci4KKiBAc3RhYmxlIElDVSAyLjQKKi8KVV9DQVBJIFVTdHJpbmdTZWFyY2ggKiBVX0VYUE9SVDIgdXNlYXJjaF9vcGVuKGNvbnN0IFVDaGFyICAgICAgICAgICpwYXR0ZXJuLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgICAgICAgICBwYXR0ZXJubGVuZ3RoLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVDaGFyICAgICAgICAgICp0ZXh0LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgICAgICAgICB0ZXh0bGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgICAgKmxvY2FsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVCcmVha0l0ZXJhdG9yICpicmVha2l0ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVRXJyb3JDb2RlICAgICAqc3RhdHVzKTsKCi8qKgoqIENyZWF0aW5nIGEgc2VhcmNoIGl0ZXJhdG9yIGRhdGEgc3RydWN0IHVzaW5nIHRoZSBhcmd1bWVudCBjb2xsYXRvciBsYW5ndWFnZQoqIHJ1bGUgc2V0LiBOb3RlLCB1c2VyIHJldGFpbnMgdGhlIG93bmVyc2hpcCBvZiB0aGlzIGNvbGxhdG9yLCB0aHVzIHRoZSAKKiByZXNwb25zaWJpbGl0eSBvZiBkZWxldGlvbiBsaWVzIHdpdGggdGhlIHVzZXIuCiogQHBhcmFtIHBhdHRlcm4gZm9yIG1hdGNoaW5nCiogQHBhcmFtIHBhdHRlcm5sZW5ndGggbGVuZ3RoIG9mIHRoZSBwYXR0ZXJuLCAtMSBmb3IgbnVsbC10ZXJtaW5hdGlvbgoqIEBwYXJhbSB0ZXh0IHRleHQgc3RyaW5nCiogQHBhcmFtIHRleHRsZW5ndGggbGVuZ3RoIG9mIHRoZSB0ZXh0IHN0cmluZywgLTEgZm9yIG51bGwtdGVybWluYXRpb24KKiBAcGFyYW0gY29sbGF0b3IgdXNlZCBmb3IgdGhlIGxhbmd1YWdlIHJ1bGVzCiogQHBhcmFtIGJyZWFraXRlciBBIEJyZWFrSXRlcmF0b3IgdGhhdCB3aWxsIGJlIHVzZWQgdG8gcmVzdHJpY3QgdGhlIHBvaW50cwoqICAgICAgICAgICAgICAgICAgYXQgd2hpY2ggbWF0Y2hlcyBhcmUgZGV0ZWN0ZWQuIElmIGEgbWF0Y2ggaXMgZm91bmQsIGJ1dCAKKiAgICAgICAgICAgICAgICAgIHRoZSBtYXRjaCdzIHN0YXJ0IG9yIGVuZCBpbmRleCBpcyBub3QgYSBib3VuZGFyeSBhcyAKKiAgICAgICAgICAgICAgICAgIGRldGVybWluZWQgYnkgdGhlIDx0dD5CcmVha0l0ZXJhdG9yPC90dD4sIHRoZSBtYXRjaCB3aWxsIAoqICAgICAgICAgICAgICAgICAgYmUgcmVqZWN0ZWQgYW5kIGFub3RoZXIgd2lsbCBiZSBzZWFyY2hlZCBmb3IuIAoqICAgICAgICAgICAgICAgICAgSWYgdGhpcyBwYXJhbWV0ZXIgaXMgPHR0Pk5VTEw8L3R0Piwgbm8gYnJlYWsgZGV0ZWN0aW9uIGlzIAoqICAgICAgICAgICAgICAgICAgYXR0ZW1wdGVkLgoqIEBwYXJhbSBzdGF0dXMgZm9yIGVycm9ycyBpZiBpdCBvY2N1cnMuIElmIGNvbGxhdG9yLCBwYXR0ZXJuIG9yIHRleHQgaXMgTlVMTCwgCiogICAgICAgICAgICAgICBvciBpZiBwYXR0ZXJubGVuZ3RoIG9yIHRleHRsZW5ndGggaXMgMCB0aGVuIGFuIAoqICAgICAgICAgICAgICAgVV9JTExFR0FMX0FSR1VNRU5UX0VSUk9SIGlzIHJldHVybmVkLgoqIEByZXR1cm4gc2VhcmNoIGl0ZXJhdG9yIGRhdGEgc3RydWN0dXJlLCBvciBOVUxMIGlmIHRoZXJlIGlzIGFuIGVycm9yLgoqIEBzdGFibGUgSUNVIDIuNAoqLwpVX0NBUEkgVVN0cmluZ1NlYXJjaCAqIFVfRVhQT1JUMiB1c2VhcmNoX29wZW5Gcm9tQ29sbGF0b3IoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUNoYXIgKnBhdHRlcm4sIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgICAgICAgICBwYXR0ZXJubGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVDaGFyICAgICAgICAgICp0ZXh0LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICAgICAgICAgdGV4dGxlbmd0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVQ29sbGF0b3IgICAgICAqY29sbGF0b3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUJyZWFrSXRlcmF0b3IgKmJyZWFraXRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVRXJyb3JDb2RlICAgICAqc3RhdHVzKTsKCi8qKgoqIERlc3Ryb3lpbmcgYW5kIGNsZWFuaW5nIHVwIHRoZSBzZWFyY2ggaXRlcmF0b3IgZGF0YSBzdHJ1Y3QuCiogSWYgYSBjb2xsYXRvciBpcyBjcmVhdGVkIGluIDx0dD51c2VhcmNoX29wZW48L3R0PiwgaXQgd2lsbCBiZSBkZXN0cm95ZWQgaGVyZS4KKiBAcGFyYW0gc2VhcmNoaXRlciBkYXRhIHN0cnVjdCB0byBjbGVhbiB1cAoqIEBzdGFibGUgSUNVIDIuNAoqLwpVX0NBUEkgdm9pZCBVX0VYUE9SVDIgdXNlYXJjaF9jbG9zZShVU3RyaW5nU2VhcmNoICpzZWFyY2hpdGVyKTsKCi8qIGdldCBhbmQgc2V0IG1ldGhvZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCi8qKgoqIFNldHMgdGhlIGN1cnJlbnQgcG9zaXRpb24gaW4gdGhlIHRleHQgc3RyaW5nIHdoaWNoIHRoZSBuZXh0IHNlYXJjaCB3aWxsIAoqIHN0YXJ0IGZyb20uIENsZWFycyBwcmV2aW91cyBzdGF0ZXMuIAoqIFRoaXMgbWV0aG9kIHRha2VzIHRoZSBhcmd1bWVudCBpbmRleCBhbmQgc2V0cyB0aGUgcG9zaXRpb24gaW4gdGhlIHRleHQgCiogc3RyaW5nIGFjY29yZGluZ2x5IHdpdGhvdXQgY2hlY2tpbmcgaWYgdGhlIGluZGV4IGlzIHBvaW50aW5nIHRvIGEgCiogdmFsaWQgc3RhcnRpbmcgcG9pbnQgdG8gYmVnaW4gc2VhcmNoaW5nLiAKKiBTZWFyY2ggcG9zaXRpb25zIHRoYXQgbWF5IHJlbmRlciBpbmNvcnJlY3QgcmVzdWx0cyBhcmUgaGlnaGxpZ2h0ZWQgaW4gdGhlCiogaGVhZGVyIGNvbW1lbnRzCiogQHBhcmFtIHN0cnNyY2ggc2VhcmNoIGl0ZXJhdG9yIGRhdGEgc3RydWN0CiogQHBhcmFtIHBvc2l0aW9uIHBvc2l0aW9uIHRvIHN0YXJ0IG5leHQgc2VhcmNoIGZyb20uIElmIHBvc2l0aW9uIGlzIGxlc3MKKiAJCQl0aGFuIG9yIGdyZWF0ZXIgdGhhbiB0aGUgdGV4dCByYW5nZSBmb3Igc2VhcmNoaW5nLCAKKiAgICAgICAgICBhbiBVX0lOREVYX09VVE9GQk9VTkRTX0VSUk9SIHdpbGwgYmUgcmV0dXJuZWQKKiBAcGFyYW0gc3RhdHVzIGVycm9yIHN0YXR1cyBpZiBhbnkuCiogQHN0YWJsZSBJQ1UgMi40CiovClVfQ0FQSSB2b2lkIFVfRVhQT1JUMiB1c2VhcmNoX3NldE9mZnNldChVU3RyaW5nU2VhcmNoICpzdHJzcmNoLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgICAgcG9zaXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVRXJyb3JDb2RlICAgICpzdGF0dXMpOwoKLyoqCiogUmV0dXJuIHRoZSBjdXJyZW50IGluZGV4IGluIHRoZSBzdHJpbmcgdGV4dCBiZWluZyBzZWFyY2hlZC4KKiBJZiB0aGUgaXRlcmF0aW9uIGhhcyBnb25lIHBhc3QgdGhlIGVuZCBvZiB0aGUgdGV4dCAob3IgcGFzdCB0aGUgYmVnaW5uaW5nIAoqIGZvciBhIGJhY2t3YXJkcyBzZWFyY2gpLCA8dHQ+VVNFQVJDSF9ET05FPC90dD4gaXMgcmV0dXJuZWQuCiogQHBhcmFtIHN0cnNyY2ggc2VhcmNoIGl0ZXJhdG9yIGRhdGEgc3RydWN0CiogQHNlZSAjVVNFQVJDSF9ET05FCiogQHN0YWJsZSBJQ1UgMi40CiovClVfQ0FQSSBpbnQzMl90IFVfRVhQT1JUMiB1c2VhcmNoX2dldE9mZnNldChjb25zdCBVU3RyaW5nU2VhcmNoICpzdHJzcmNoKTsKICAgIAovKioKKiBTZXRzIHRoZSB0ZXh0IHNlYXJjaGluZyBhdHRyaWJ1dGVzIGxvY2F0ZWQgaW4gdGhlIGVudW0gVVNlYXJjaEF0dHJpYnV0ZQoqIHdpdGggdmFsdWVzIGZyb20gdGhlIGVudW0gVVNlYXJjaEF0dHJpYnV0ZVZhbHVlLgoqIDx0dD5VU0VBUkNIX0RFRkFVTFQ8L3R0PiBjYW4gYmUgdXNlZCBmb3IgYWxsIGF0dHJpYnV0ZXMgZm9yIHJlc2V0dGluZy4KKiBAcGFyYW0gc3Ryc3JjaCBzZWFyY2ggaXRlcmF0b3IgZGF0YSBzdHJ1Y3QKKiBAcGFyYW0gYXR0cmlidXRlIHRleHQgYXR0cmlidXRlIHRvIGJlIHNldAoqIEBwYXJhbSB2YWx1ZSB0ZXh0IGF0dHJpYnV0ZSB2YWx1ZQoqIEBwYXJhbSBzdGF0dXMgZm9yIGVycm9ycyBpZiBpdCBvY2N1cnMKKiBAc2VlICN1c2VhcmNoX2dldEF0dHJpYnV0ZQoqIEBzdGFibGUgSUNVIDIuNAoqLwpVX0NBUEkgdm9pZCBVX0VYUE9SVDIgdXNlYXJjaF9zZXRBdHRyaWJ1dGUoVVN0cmluZ1NlYXJjaCAgICAgICAgICpzdHJzcmNoLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTZWFyY2hBdHRyaWJ1dGUgICAgICAgYXR0cmlidXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNlYXJjaEF0dHJpYnV0ZVZhbHVlICB2YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVFcnJvckNvZGUgICAgICAgICAgICAqc3RhdHVzKTsKCi8qKiAgICAKKiBHZXRzIHRoZSB0ZXh0IHNlYXJjaGluZyBhdHRyaWJ1dGVzLgoqIEBwYXJhbSBzdHJzcmNoIHNlYXJjaCBpdGVyYXRvciBkYXRhIHN0cnVjdAoqIEBwYXJhbSBhdHRyaWJ1dGUgdGV4dCBhdHRyaWJ1dGUgdG8gYmUgcmV0cmlldmUKKiBAcmV0dXJuIHRleHQgYXR0cmlidXRlIHZhbHVlCiogQHNlZSAjdXNlYXJjaF9zZXRBdHRyaWJ1dGUKKiBAc3RhYmxlIElDVSAyLjQKKi8KVV9DQVBJIFVTZWFyY2hBdHRyaWJ1dGVWYWx1ZSBVX0VYUE9SVDIgdXNlYXJjaF9nZXRBdHRyaWJ1dGUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVVN0cmluZ1NlYXJjaCAgICAqc3Ryc3JjaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU2VhcmNoQXR0cmlidXRlICBhdHRyaWJ1dGUpOwoKLyoqCiogUmV0dXJucyB0aGUgaW5kZXggdG8gdGhlIG1hdGNoIGluIHRoZSB0ZXh0IHN0cmluZyB0aGF0IHdhcyBzZWFyY2hlZC4KKiBUaGlzIGNhbGwgcmV0dXJucyBhIHZhbGlkIHJlc3VsdCBvbmx5IGFmdGVyIGEgc3VjY2Vzc2Z1bCBjYWxsIHRvIAoqIDx0dD51c2VhcmNoX2ZpcnN0PC90dD4sIDx0dD51c2VhcmNoX25leHQ8L3R0PiwgPHR0PnVzZWFyY2hfcHJldmlvdXM8L3R0PiwgCiogb3IgPHR0PnVzZWFyY2hfbGFzdDwvdHQ+LgoqIEp1c3QgYWZ0ZXIgY29uc3RydWN0aW9uLCBvciBhZnRlciBhIHNlYXJjaGluZyBtZXRob2QgcmV0dXJucyAKKiA8dHQ+VVNFQVJDSF9ET05FPC90dD4sIHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIDx0dD5VU0VBUkNIX0RPTkU8L3R0Pi4KKiA8cD4KKiBVc2UgPHR0PnVzZWFyY2hfZ2V0TWF0Y2hlZExlbmd0aDwvdHQ+IHRvIGdldCB0aGUgbWF0Y2hlZCBzdHJpbmcgbGVuZ3RoLgoqIEBwYXJhbSBzdHJzcmNoIHNlYXJjaCBpdGVyYXRvciBkYXRhIHN0cnVjdAoqIEByZXR1cm4gaW5kZXggdG8gYSBzdWJzdHJpbmcgd2l0aGluIHRoZSB0ZXh0IHN0cmluZyB0aGF0IGlzIGJlaW5nIAoqICAgICAgICAgc2VhcmNoZWQuCiogQHNlZSAjdXNlYXJjaF9maXJzdAoqIEBzZWUgI3VzZWFyY2hfbmV4dAoqIEBzZWUgI3VzZWFyY2hfcHJldmlvdXMKKiBAc2VlICN1c2VhcmNoX2xhc3QKKiBAc2VlICNVU0VBUkNIX0RPTkUKKiBAc3RhYmxlIElDVSAyLjQKKi8KVV9DQVBJIGludDMyX3QgVV9FWFBPUlQyIHVzZWFyY2hfZ2V0TWF0Y2hlZFN0YXJ0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVTdHJpbmdTZWFyY2ggKnN0cnNyY2gpOwogICAgCi8qKgoqIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0ZXh0IGluIHRoZSBzdHJpbmcgd2hpY2ggbWF0Y2hlcyB0aGUgc2VhcmNoIHBhdHRlcm4uIAoqIFRoaXMgY2FsbCByZXR1cm5zIGEgdmFsaWQgcmVzdWx0IG9ubHkgYWZ0ZXIgYSBzdWNjZXNzZnVsIGNhbGwgdG8gCiogPHR0PnVzZWFyY2hfZmlyc3Q8L3R0PiwgPHR0PnVzZWFyY2hfbmV4dDwvdHQ+LCA8dHQ+dXNlYXJjaF9wcmV2aW91czwvdHQ+LCAKKiBvciA8dHQ+dXNlYXJjaF9sYXN0PC90dD4uCiogSnVzdCBhZnRlciBjb25zdHJ1Y3Rpb24sIG9yIGFmdGVyIGEgc2VhcmNoaW5nIG1ldGhvZCByZXR1cm5zIAoqIDx0dD5VU0VBUkNIX0RPTkU8L3R0PiwgdGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gMC4KKiBAcGFyYW0gc3Ryc3JjaCBzZWFyY2ggaXRlcmF0b3IgZGF0YSBzdHJ1Y3QKKiBAcmV0dXJuIFRoZSBsZW5ndGggb2YgdGhlIG1hdGNoIGluIHRoZSBzdHJpbmcgdGV4dCwgb3IgMCBpZiB0aGVyZSBpcyBubyAKKiAgICAgICAgIG1hdGNoIGN1cnJlbnRseS4KKiBAc2VlICN1c2VhcmNoX2ZpcnN0CiogQHNlZSAjdXNlYXJjaF9uZXh0CiogQHNlZSAjdXNlYXJjaF9wcmV2aW91cwoqIEBzZWUgI3VzZWFyY2hfbGFzdAoqIEBzZWUgI1VTRUFSQ0hfRE9ORQoqIEBzdGFibGUgSUNVIDIuNAoqLwpVX0NBUEkgaW50MzJfdCBVX0VYUE9SVDIgdXNlYXJjaF9nZXRNYXRjaGVkTGVuZ3RoKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVTdHJpbmdTZWFyY2ggKnN0cnNyY2gpOwoKLyoqCiogUmV0dXJucyB0aGUgdGV4dCB0aGF0IHdhcyBtYXRjaGVkIGJ5IHRoZSBtb3N0IHJlY2VudCBjYWxsIHRvIAoqIDx0dD51c2VhcmNoX2ZpcnN0PC90dD4sIDx0dD51c2VhcmNoX25leHQ8L3R0PiwgPHR0PnVzZWFyY2hfcHJldmlvdXM8L3R0PiwgCiogb3IgPHR0PnVzZWFyY2hfbGFzdDwvdHQ+LgoqIElmIHRoZSBpdGVyYXRvciBpcyBub3QgcG9pbnRpbmcgYXQgYSB2YWxpZCBtYXRjaCAoZS5nLiBqdXN0IGFmdGVyIAoqIGNvbnN0cnVjdGlvbiBvciBhZnRlciA8dHQ+VVNFQVJDSF9ET05FPC90dD4gaGFzIGJlZW4gcmV0dXJuZWQsIHJldHVybnMKKiBhbiBlbXB0eSBzdHJpbmcuIElmIHJlc3VsdCBpcyBub3QgbGFyZ2UgZW5vdWdoIHRvIHN0b3JlIHRoZSBtYXRjaGVkIHRleHQsCiogcmVzdWx0IHdpbGwgYmUgZmlsbGVkIHdpdGggdGhlIHBhcnRpYWwgdGV4dCBhbmQgYW4gVV9CVUZGRVJfT1ZFUkZMT1dfRVJST1IgCiogd2lsbCBiZSByZXR1cm5lZCBpbiBzdGF0dXMuIHJlc3VsdCB3aWxsIGJlIG51bGwtdGVybWluYXRlZCB3aGVuZXZlciAKKiBwb3NzaWJsZS4gSWYgdGhlIGJ1ZmZlciBmaXRzIHRoZSBtYXRjaGVkIHRleHQgZXhhY3RseSwgYSBudWxsLXRlcm1pbmF0aW9uIAoqIGlzIG5vdCBwb3NzaWJsZSwgdGhlbiBhIFVfU1RSSU5HX05PVF9URVJNSU5BVEVEX0VSUk9SIHNldCBpbiBzdGF0dXMuCiogUHJlLWZsaWdodGluZyBjYW4gYmUgZWl0aGVyIGRvbmUgd2l0aCBsZW5ndGggPSAwIG9yIHRoZSBBUEkgCiogPHR0PnVzZWFyY2hfZ2V0TWF0Y2hMZW5ndGg8L3R0Pi4KKiBAcGFyYW0gc3Ryc3JjaCBzZWFyY2ggaXRlcmF0b3IgZGF0YSBzdHJ1Y3QKKiBAcGFyYW0gcmVzdWx0IFVDaGFyIGJ1ZmZlciB0byBzdG9yZSB0aGUgbWF0Y2hlZCBzdHJpbmcKKiBAcGFyYW0gcmVzdWx0Q2FwYWNpdHkgbGVuZ3RoIG9mIHRoZSByZXN1bHQgYnVmZmVyCiogQHBhcmFtIHN0YXR1cyBlcnJvciByZXR1cm5lZCBpZiByZXN1bHQgaXMgbm90IGxhcmdlIGVub3VnaAoqIEByZXR1cm4gZXhhY3QgbGVuZ3RoIG9mIHRoZSBtYXRjaGVkIHRleHQsIG5vdCBjb3VudGluZyB0aGUgbnVsbC10ZXJtaW5hdGlvbgoqIEBzZWUgI3VzZWFyY2hfZmlyc3QKKiBAc2VlICN1c2VhcmNoX25leHQKKiBAc2VlICN1c2VhcmNoX3ByZXZpb3VzCiogQHNlZSAjdXNlYXJjaF9sYXN0CiogQHNlZSAjVVNFQVJDSF9ET05FCiogQHN0YWJsZSBJQ1UgMi40CiovClVfQ0FQSSBpbnQzMl90IFVfRVhQT1JUMiB1c2VhcmNoX2dldE1hdGNoZWRUZXh0KGNvbnN0IFVTdHJpbmdTZWFyY2ggKnN0cnNyY2gsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDaGFyICAgICAgICAgKnJlc3VsdCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAgICAgICAgcmVzdWx0Q2FwYWNpdHksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVFcnJvckNvZGUgICAgKnN0YXR1cyk7CgojaWYgIVVDT05GSUdfTk9fQlJFQUtfSVRFUkFUSU9OCgovKioKKiBTZXQgdGhlIEJyZWFrSXRlcmF0b3IgdGhhdCB3aWxsIGJlIHVzZWQgdG8gcmVzdHJpY3QgdGhlIHBvaW50cyBhdCB3aGljaCAKKiBtYXRjaGVzIGFyZSBkZXRlY3RlZC4KKiBAcGFyYW0gc3Ryc3JjaCBzZWFyY2ggaXRlcmF0b3IgZGF0YSBzdHJ1Y3QKKiBAcGFyYW0gYnJlYWtpdGVyIEEgQnJlYWtJdGVyYXRvciB0aGF0IHdpbGwgYmUgdXNlZCB0byByZXN0cmljdCB0aGUgcG9pbnRzCiogICAgICAgICAgICAgICAgICBhdCB3aGljaCBtYXRjaGVzIGFyZSBkZXRlY3RlZC4gSWYgYSBtYXRjaCBpcyBmb3VuZCwgYnV0IAoqICAgICAgICAgICAgICAgICAgdGhlIG1hdGNoJ3Mgc3RhcnQgb3IgZW5kIGluZGV4IGlzIG5vdCBhIGJvdW5kYXJ5IGFzIAoqICAgICAgICAgICAgICAgICAgZGV0ZXJtaW5lZCBieSB0aGUgPHR0PkJyZWFrSXRlcmF0b3I8L3R0PiwgdGhlIG1hdGNoIHdpbGwgCiogICAgICAgICAgICAgICAgICBiZSByZWplY3RlZCBhbmQgYW5vdGhlciB3aWxsIGJlIHNlYXJjaGVkIGZvci4gCiogICAgICAgICAgICAgICAgICBJZiB0aGlzIHBhcmFtZXRlciBpcyA8dHQ+TlVMTDwvdHQ+LCBubyBicmVhayBkZXRlY3Rpb24gaXMgCiogICAgICAgICAgICAgICAgICBhdHRlbXB0ZWQuCiogQHBhcmFtIHN0YXR1cyBmb3IgZXJyb3JzIGlmIGl0IG9jY3VycwoqIEBzZWUgI3VzZWFyY2hfZ2V0QnJlYWtJdGVyYXRvcgoqIEBzdGFibGUgSUNVIDIuNAoqLwpVX0NBUEkgdm9pZCBVX0VYUE9SVDIgdXNlYXJjaF9zZXRCcmVha0l0ZXJhdG9yKFVTdHJpbmdTZWFyY2ggICpzdHJzcmNoLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQnJlYWtJdGVyYXRvciAqYnJlYWtpdGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVFcnJvckNvZGUgICAgICpzdGF0dXMpOwoKLyoqCiogUmV0dXJucyB0aGUgQnJlYWtJdGVyYXRvciB0aGF0IGlzIHVzZWQgdG8gcmVzdHJpY3QgdGhlIHBvaW50cyBhdCB3aGljaCAKKiBtYXRjaGVzIGFyZSBkZXRlY3RlZC4gVGhpcyB3aWxsIGJlIHRoZSBzYW1lIG9iamVjdCB0aGF0IHdhcyBwYXNzZWQgdG8gdGhlIAoqIGNvbnN0cnVjdG9yIG9yIHRvIDx0dD51c2VhcmNoX3NldEJyZWFrSXRlcmF0b3I8L3R0Pi4gTm90ZSB0aGF0IAoqIDx0dD5OVUxMPC90dD4gCiogaXMgYSBsZWdhbCB2YWx1ZTsgaXQgbWVhbnMgdGhhdCBicmVhayBkZXRlY3Rpb24gc2hvdWxkIG5vdCBiZSBhdHRlbXB0ZWQuCiogQHBhcmFtIHN0cnNyY2ggc2VhcmNoIGl0ZXJhdG9yIGRhdGEgc3RydWN0CiogQHJldHVybiBicmVhayBpdGVyYXRvciB1c2VkCiogQHNlZSAjdXNlYXJjaF9zZXRCcmVha0l0ZXJhdG9yCiogQHN0YWJsZSBJQ1UgMi40CiovClVfQ0FQSSBjb25zdCBVQnJlYWtJdGVyYXRvciAqIFVfRVhQT1JUMiB1c2VhcmNoX2dldEJyZWFrSXRlcmF0b3IoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVU3RyaW5nU2VhcmNoICpzdHJzcmNoKTsKICAgIAojZW5kaWYKICAgIAovKioKKiBTZXQgdGhlIHN0cmluZyB0ZXh0IHRvIGJlIHNlYXJjaGVkLiBUZXh0IGl0ZXJhdGlvbiB3aWxsIGhlbmNlIGJlZ2luIGF0IHRoZSAKKiBzdGFydCBvZiB0aGUgdGV4dCBzdHJpbmcuIFRoaXMgbWV0aG9kIGlzIHVzZWZ1bCBpZiB5b3Ugd2FudCB0byByZS11c2UgYW4gCiogaXRlcmF0b3IgdG8gc2VhcmNoIGZvciB0aGUgc2FtZSBwYXR0ZXJuIHdpdGhpbiBhIGRpZmZlcmVudCBib2R5IG9mIHRleHQuCiogQHBhcmFtIHN0cnNyY2ggc2VhcmNoIGl0ZXJhdG9yIGRhdGEgc3RydWN0CiogQHBhcmFtIHRleHQgbmV3IHN0cmluZyB0byBsb29rIGZvciBtYXRjaAoqIEBwYXJhbSB0ZXh0bGVuZ3RoIGxlbmd0aCBvZiB0aGUgbmV3IHN0cmluZywgLTEgZm9yIG51bGwtdGVybWluYXRpb24KKiBAcGFyYW0gc3RhdHVzIGZvciBlcnJvcnMgaWYgaXQgb2NjdXJzLiBJZiB0ZXh0IGlzIE5VTEwsIG9yIHRleHRsZW5ndGggaXMgMCAKKiAgICAgICAgICAgICAgIHRoZW4gYW4gVV9JTExFR0FMX0FSR1VNRU5UX0VSUk9SIGlzIHJldHVybmVkIHdpdGggbm8gY2hhbmdlCiogICAgICAgICAgICAgICBkb25lIHRvIHN0cnNyY2guCiogQHNlZSAjdXNlYXJjaF9nZXRUZXh0CiogQHN0YWJsZSBJQ1UgMi40CiovClVfQ0FQSSB2b2lkIFVfRVhQT1JUMiB1c2VhcmNoX3NldFRleHQoICAgICAgVVN0cmluZ1NlYXJjaCAqc3Ryc3JjaCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUNoYXIgICAgICAgICAqdGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICAgICAgICB0ZXh0bGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVFcnJvckNvZGUgICAgKnN0YXR1cyk7CgovKioKKiBSZXR1cm4gdGhlIHN0cmluZyB0ZXh0IHRvIGJlIHNlYXJjaGVkLgoqIEBwYXJhbSBzdHJzcmNoIHNlYXJjaCBpdGVyYXRvciBkYXRhIHN0cnVjdAoqIEBwYXJhbSBsZW5ndGggcmV0dXJuZWQgc3RyaW5nIHRleHQgbGVuZ3RoCiogQHJldHVybiBzdHJpbmcgdGV4dCAKKiBAc2VlICN1c2VhcmNoX3NldFRleHQKKiBAc3RhYmxlIElDVSAyLjQKKi8KVV9DQVBJIGNvbnN0IFVDaGFyICogVV9FWFBPUlQyIHVzZWFyY2hfZ2V0VGV4dChjb25zdCBVU3RyaW5nU2VhcmNoICpzdHJzcmNoLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICAgICAgICpsZW5ndGgpOwoKLyoqCiogR2V0cyB0aGUgY29sbGF0b3IgdXNlZCBmb3IgdGhlIGxhbmd1YWdlIHJ1bGVzLiAKKiA8cD4KKiBEZWxldGluZyB0aGUgcmV0dXJuZWQgPHR0PlVDb2xsYXRvcjwvdHQ+IGJlZm9yZSBjYWxsaW5nIAoqIDx0dD51c2VhcmNoX2Nsb3NlPC90dD4gd291bGQgY2F1c2UgdGhlIHN0cmluZyBzZWFyY2ggdG8gZmFpbC4KKiA8dHQ+dXNlYXJjaF9jbG9zZTwvdHQ+IHdpbGwgZGVsZXRlIHRoZSBjb2xsYXRvciBpZiB0aGlzIHNlYXJjaCBvd25zIGl0LgoqIEBwYXJhbSBzdHJzcmNoIHNlYXJjaCBpdGVyYXRvciBkYXRhIHN0cnVjdAoqIEByZXR1cm4gY29sbGF0b3IKKiBAc3RhYmxlIElDVSAyLjQKKi8KVV9DQVBJIFVDb2xsYXRvciAqIFVfRVhQT1JUMiB1c2VhcmNoX2dldENvbGxhdG9yKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVTdHJpbmdTZWFyY2ggKnN0cnNyY2gpOwoKLyoqCiogU2V0cyB0aGUgY29sbGF0b3IgdXNlZCBmb3IgdGhlIGxhbmd1YWdlIHJ1bGVzLiBVc2VyIHJldGFpbnMgdGhlIG93bmVyc2hpcCAKKiBvZiB0aGlzIGNvbGxhdG9yLCB0aHVzIHRoZSByZXNwb25zaWJpbGl0eSBvZiBkZWxldGlvbiBsaWVzIHdpdGggdGhlIHVzZXIuCiogVGhpcyBtZXRob2QgY2F1c2VzIGludGVybmFsIGRhdGEgc3VjaCBhcyBCb3llci1Nb29yZSBzaGlmdCB0YWJsZXMgdG8gIAoqIGJlIHJlY2FsY3VsYXRlZCwgYnV0IHRoZSBpdGVyYXRvcidzIHBvc2l0aW9uIGlzIHVuY2hhbmdlZC4KKiBAcGFyYW0gc3Ryc3JjaCBzZWFyY2ggaXRlcmF0b3IgZGF0YSBzdHJ1Y3QKKiBAcGFyYW0gY29sbGF0b3IgdG8gYmUgdXNlZAoqIEBwYXJhbSBzdGF0dXMgZm9yIGVycm9ycyBpZiBpdCBvY2N1cnMKKiBAc3RhYmxlIElDVSAyLjQKKi8KVV9DQVBJIHZvaWQgVV9FWFBPUlQyIHVzZWFyY2hfc2V0Q29sbGF0b3IoICAgICAgVVN0cmluZ1NlYXJjaCAqc3Ryc3JjaCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVDb2xsYXRvciAgICAgKmNvbGxhdG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVRXJyb3JDb2RlICAgICpzdGF0dXMpOwoKLyoqCiogU2V0cyB0aGUgcGF0dGVybiB1c2VkIGZvciBtYXRjaGluZy4KKiBJbnRlcm5hbCBkYXRhIGxpa2UgdGhlIEJveWVyIE1vb3JlIHRhYmxlIHdpbGwgYmUgcmVjYWxjdWxhdGVkLCBidXQgdGhlIAoqIGl0ZXJhdG9yJ3MgcG9zaXRpb24gaXMgdW5jaGFuZ2VkLgoqIEBwYXJhbSBzdHJzcmNoIHNlYXJjaCBpdGVyYXRvciBkYXRhIHN0cnVjdAoqIEBwYXJhbSBwYXR0ZXJuIHN0cmluZwoqIEBwYXJhbSBwYXR0ZXJubGVuZ3RoIHBhdHRlcm4gbGVuZ3RoLCAtMSBmb3IgbnVsbC10ZXJtaW5hdGVkIHN0cmluZwoqIEBwYXJhbSBzdGF0dXMgZm9yIGVycm9ycyBpZiBpdCBvY2N1cnMuIElmIHRleHQgaXMgTlVMTCwgb3IgdGV4dGxlbmd0aCBpcyAwIAoqICAgICAgICAgICAgICAgdGhlbiBhbiBVX0lMTEVHQUxfQVJHVU1FTlRfRVJST1IgaXMgcmV0dXJuZWQgd2l0aCBubyBjaGFuZ2UKKiAgICAgICAgICAgICAgIGRvbmUgdG8gc3Ryc3JjaC4KKiBAc3RhYmxlIElDVSAyLjQKKi8KVV9DQVBJIHZvaWQgVV9FWFBPUlQyIHVzZWFyY2hfc2V0UGF0dGVybiggICAgICBVU3RyaW5nU2VhcmNoICpzdHJzcmNoLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVQ2hhciAgICAgICAgICpwYXR0ZXJuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgICAgICAgIHBhdHRlcm5sZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUVycm9yQ29kZSAgICAqc3RhdHVzKTsKCi8qKgoqIEdldHMgdGhlIHNlYXJjaCBwYXR0ZXJuCiogQHBhcmFtIHN0cnNyY2ggc2VhcmNoIGl0ZXJhdG9yIGRhdGEgc3RydWN0CiogQHBhcmFtIGxlbmd0aCByZXR1cm4gbGVuZ3RoIG9mIHRoZSBwYXR0ZXJuLCAtMSBpbmRpY2F0ZXMgdGhhdCB0aGUgcGF0dGVybiAKKiAgICAgICAgICAgICAgIGlzIG51bGwtdGVybWluYXRlZAoqIEByZXR1cm4gcGF0dGVybiBzdHJpbmcKKiBAc3RhYmxlIElDVSAyLjQKKi8KVV9DQVBJIGNvbnN0IFVDaGFyICogVV9FWFBPUlQyIHVzZWFyY2hfZ2V0UGF0dGVybigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVU3RyaW5nU2VhcmNoICpzdHJzcmNoLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICAgICAgICpsZW5ndGgpOwoKLyogbWV0aG9kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKioKKiBSZXR1cm5zIHRoZSBmaXJzdCBpbmRleCBhdCB3aGljaCB0aGUgc3RyaW5nIHRleHQgbWF0Y2hlcyB0aGUgc2VhcmNoIAoqIHBhdHRlcm4uICAKKiBUaGUgaXRlcmF0b3IgaXMgYWRqdXN0ZWQgc28gdGhhdCBpdHMgY3VycmVudCBpbmRleCAoYXMgcmV0dXJuZWQgYnkgCiogPHR0PnVzZWFyY2hfZ2V0T2Zmc2V0PC90dD4pIGlzIHRoZSBtYXRjaCBwb3NpdGlvbiBpZiBvbmUgd2FzIGZvdW5kLgoqIElmIGEgbWF0Y2ggaXMgbm90IGZvdW5kLCA8dHQ+VVNFQVJDSF9ET05FPC90dD4gd2lsbCBiZSByZXR1cm5lZCBhbmQKKiB0aGUgaXRlcmF0b3Igd2lsbCBiZSBhZGp1c3RlZCB0byB0aGUgaW5kZXggPHR0PlVTRUFSQ0hfRE9ORTwvdHQ+LgoqIEBwYXJhbSBzdHJzcmNoIHNlYXJjaCBpdGVyYXRvciBkYXRhIHN0cnVjdAoqIEBwYXJhbSBzdGF0dXMgZm9yIGVycm9ycyBpZiBpdCBvY2N1cnMKKiBAcmV0dXJuIFRoZSBjaGFyYWN0ZXIgaW5kZXggb2YgdGhlIGZpcnN0IG1hdGNoLCBvciAKKiA8dHQ+VVNFQVJDSF9ET05FPC90dD4gaWYgdGhlcmUgYXJlIG5vIG1hdGNoZXMuCiogQHNlZSAjdXNlYXJjaF9nZXRPZmZzZXQKKiBAc2VlICNVU0VBUkNIX0RPTkUKKiBAc3RhYmxlIElDVSAyLjQKKi8KVV9DQVBJIGludDMyX3QgVV9FWFBPUlQyIHVzZWFyY2hfZmlyc3QoVVN0cmluZ1NlYXJjaCAqc3Ryc3JjaCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVRXJyb3JDb2RlICAgICpzdGF0dXMpOwoKLyoqCiogUmV0dXJucyB0aGUgZmlyc3QgaW5kZXggZ3JlYXRlciB0aGFuIDx0dD5wb3NpdGlvbjwvdHQ+IGF0IHdoaWNoIHRoZSBzdHJpbmcgCiogdGV4dCAKKiBtYXRjaGVzIHRoZSBzZWFyY2ggcGF0dGVybi4gVGhlIGl0ZXJhdG9yIGlzIGFkanVzdGVkIHNvIHRoYXQgaXRzIGN1cnJlbnQgCiogaW5kZXggKGFzIHJldHVybmVkIGJ5IDx0dD51c2VhcmNoX2dldE9mZnNldDwvdHQ+KSBpcyB0aGUgbWF0Y2ggcG9zaXRpb24gaWYgCiogb25lIHdhcyBmb3VuZC4KKiBJZiBhIG1hdGNoIGlzIG5vdCBmb3VuZCwgPHR0PlVTRUFSQ0hfRE9ORTwvdHQ+IHdpbGwgYmUgcmV0dXJuZWQgYW5kCiogdGhlIGl0ZXJhdG9yIHdpbGwgYmUgYWRqdXN0ZWQgdG8gdGhlIGluZGV4IDx0dD5VU0VBUkNIX0RPTkU8L3R0PgoqIDxwPgoqIFNlYXJjaCBwb3NpdGlvbnMgdGhhdCBtYXkgcmVuZGVyIGluY29ycmVjdCByZXN1bHRzIGFyZSBoaWdobGlnaHRlZCBpbiB0aGUKKiBoZWFkZXIgY29tbWVudHMuIElmIHBvc2l0aW9uIGlzIGxlc3MgdGhhbiBvciBncmVhdGVyIHRoYW4gdGhlIHRleHQgcmFuZ2UgCiogZm9yIHNlYXJjaGluZywgYW4gVV9JTkRFWF9PVVRPRkJPVU5EU19FUlJPUiB3aWxsIGJlIHJldHVybmVkCiogQHBhcmFtIHN0cnNyY2ggc2VhcmNoIGl0ZXJhdG9yIGRhdGEgc3RydWN0CiogQHBhcmFtIHBvc2l0aW9uIHRvIHN0YXJ0IHRoZSBzZWFyY2ggYXQKKiBAcGFyYW0gc3RhdHVzIGZvciBlcnJvcnMgaWYgaXQgb2NjdXJzCiogQHJldHVybiBUaGUgY2hhcmFjdGVyIGluZGV4IG9mIHRoZSBmaXJzdCBtYXRjaCBmb2xsb3dpbmcgPHR0PnBvczwvdHQ+LAoqICAgICAgICAgb3IgPHR0PlVTRUFSQ0hfRE9ORTwvdHQ+IGlmIHRoZXJlIGFyZSBubyBtYXRjaGVzLgoqIEBzZWUgI3VzZWFyY2hfZ2V0T2Zmc2V0CiogQHNlZSAjVVNFQVJDSF9ET05FCiogQHN0YWJsZSBJQ1UgMi40CiovClVfQ0FQSSBpbnQzMl90IFVfRVhQT1JUMiB1c2VhcmNoX2ZvbGxvd2luZyhVU3RyaW5nU2VhcmNoICpzdHJzcmNoLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICAgIHBvc2l0aW9uLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVRXJyb3JDb2RlICAgICpzdGF0dXMpOwogICAgCi8qKgoqIFJldHVybnMgdGhlIGxhc3QgaW5kZXggaW4gdGhlIHRhcmdldCB0ZXh0IGF0IHdoaWNoIGl0IG1hdGNoZXMgdGhlIHNlYXJjaCAKKiBwYXR0ZXJuLiBUaGUgaXRlcmF0b3IgaXMgYWRqdXN0ZWQgc28gdGhhdCBpdHMgY3VycmVudCAKKiBpbmRleCAoYXMgcmV0dXJuZWQgYnkgPHR0PnVzZWFyY2hfZ2V0T2Zmc2V0PC90dD4pIGlzIHRoZSBtYXRjaCBwb3NpdGlvbiBpZiAKKiBvbmUgd2FzIGZvdW5kLgoqIElmIGEgbWF0Y2ggaXMgbm90IGZvdW5kLCA8dHQ+VVNFQVJDSF9ET05FPC90dD4gd2lsbCBiZSByZXR1cm5lZCBhbmQKKiB0aGUgaXRlcmF0b3Igd2lsbCBiZSBhZGp1c3RlZCB0byB0aGUgaW5kZXggPHR0PlVTRUFSQ0hfRE9ORTwvdHQ+LgoqIEBwYXJhbSBzdHJzcmNoIHNlYXJjaCBpdGVyYXRvciBkYXRhIHN0cnVjdAoqIEBwYXJhbSBzdGF0dXMgZm9yIGVycm9ycyBpZiBpdCBvY2N1cnMKKiBAcmV0dXJuIFRoZSBpbmRleCBvZiB0aGUgZmlyc3QgbWF0Y2gsIG9yIDx0dD5VU0VBUkNIX0RPTkU8L3R0PiBpZiB0aGVyZSAKKiAgICAgICAgIGFyZSBubyBtYXRjaGVzLgoqIEBzZWUgI3VzZWFyY2hfZ2V0T2Zmc2V0CiogQHNlZSAjVVNFQVJDSF9ET05FCiogQHN0YWJsZSBJQ1UgMi40CiovClVfQ0FQSSBpbnQzMl90IFVfRVhQT1JUMiB1c2VhcmNoX2xhc3QoVVN0cmluZ1NlYXJjaCAqc3Ryc3JjaCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVFcnJvckNvZGUgICAgKnN0YXR1cyk7CgovKioKKiBSZXR1cm5zIHRoZSBmaXJzdCBpbmRleCBsZXNzIHRoYW4gPHR0PnBvc2l0aW9uPC90dD4gYXQgd2hpY2ggdGhlIHN0cmluZyB0ZXh0IAoqIG1hdGNoZXMgdGhlIHNlYXJjaCBwYXR0ZXJuLiBUaGUgaXRlcmF0b3IgaXMgYWRqdXN0ZWQgc28gdGhhdCBpdHMgY3VycmVudCAKKiBpbmRleCAoYXMgcmV0dXJuZWQgYnkgPHR0PnVzZWFyY2hfZ2V0T2Zmc2V0PC90dD4pIGlzIHRoZSBtYXRjaCBwb3NpdGlvbiBpZiAKKiBvbmUgd2FzIGZvdW5kLgoqIElmIGEgbWF0Y2ggaXMgbm90IGZvdW5kLCA8dHQ+VVNFQVJDSF9ET05FPC90dD4gd2lsbCBiZSByZXR1cm5lZCBhbmQKKiB0aGUgaXRlcmF0b3Igd2lsbCBiZSBhZGp1c3RlZCB0byB0aGUgaW5kZXggPHR0PlVTRUFSQ0hfRE9ORTwvdHQ+CiogPHA+CiogU2VhcmNoIHBvc2l0aW9ucyB0aGF0IG1heSByZW5kZXIgaW5jb3JyZWN0IHJlc3VsdHMgYXJlIGhpZ2hsaWdodGVkIGluIHRoZQoqIGhlYWRlciBjb21tZW50cy4gSWYgcG9zaXRpb24gaXMgbGVzcyB0aGFuIG9yIGdyZWF0ZXIgdGhhbiB0aGUgdGV4dCByYW5nZSAKKiBmb3Igc2VhcmNoaW5nLCBhbiBVX0lOREVYX09VVE9GQk9VTkRTX0VSUk9SIHdpbGwgYmUgcmV0dXJuZWQKKiBAcGFyYW0gc3Ryc3JjaCBzZWFyY2ggaXRlcmF0b3IgZGF0YSBzdHJ1Y3QKKiBAcGFyYW0gcG9zaXRpb24gaW5kZXggcG9zaXRpb24gdGhlIHNlYXJjaCBpcyB0byBiZWdpbiBhdAoqIEBwYXJhbSBzdGF0dXMgZm9yIGVycm9ycyBpZiBpdCBvY2N1cnMKKiBAcmV0dXJuIFRoZSBjaGFyYWN0ZXIgaW5kZXggb2YgdGhlIGZpcnN0IG1hdGNoIHByZWNlZGluZyA8dHQ+cG9zPC90dD4sCiogICAgICAgICBvciA8dHQ+VVNFQVJDSF9ET05FPC90dD4gaWYgdGhlcmUgYXJlIG5vIG1hdGNoZXMuCiogQHNlZSAjdXNlYXJjaF9nZXRPZmZzZXQKKiBAc2VlICNVU0VBUkNIX0RPTkUKKiBAc3RhYmxlIElDVSAyLjQKKi8KVV9DQVBJIGludDMyX3QgVV9FWFBPUlQyIHVzZWFyY2hfcHJlY2VkaW5nKFVTdHJpbmdTZWFyY2ggKnN0cnNyY2gsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgICAgcG9zaXRpb24sIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVFcnJvckNvZGUgICAgKnN0YXR1cyk7CiAgICAKLyoqCiogUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG5leHQgcG9pbnQgYXQgd2hpY2ggdGhlIHN0cmluZyB0ZXh0IG1hdGNoZXMgdGhlCiogc2VhcmNoIHBhdHRlcm4sIHN0YXJ0aW5nIGZyb20gdGhlIGN1cnJlbnQgcG9zaXRpb24uCiogVGhlIGl0ZXJhdG9yIGlzIGFkanVzdGVkIHNvIHRoYXQgaXRzIGN1cnJlbnQgCiogaW5kZXggKGFzIHJldHVybmVkIGJ5IDx0dD51c2VhcmNoX2dldE9mZnNldDwvdHQ+KSBpcyB0aGUgbWF0Y2ggcG9zaXRpb24gaWYgCiogb25lIHdhcyBmb3VuZC4KKiBJZiBhIG1hdGNoIGlzIG5vdCBmb3VuZCwgPHR0PlVTRUFSQ0hfRE9ORTwvdHQ+IHdpbGwgYmUgcmV0dXJuZWQgYW5kCiogdGhlIGl0ZXJhdG9yIHdpbGwgYmUgYWRqdXN0ZWQgdG8gdGhlIGluZGV4IDx0dD5VU0VBUkNIX0RPTkU8L3R0PgoqIEBwYXJhbSBzdHJzcmNoIHNlYXJjaCBpdGVyYXRvciBkYXRhIHN0cnVjdAoqIEBwYXJhbSBzdGF0dXMgZm9yIGVycm9ycyBpZiBpdCBvY2N1cnMKKiBAcmV0dXJuIFRoZSBpbmRleCBvZiB0aGUgbmV4dCBtYXRjaCBhZnRlciB0aGUgY3VycmVudCBwb3NpdGlvbiwgb3IgCiogICAgICAgICA8dHQ+VVNFQVJDSF9ET05FPC90dD4gaWYgdGhlcmUgYXJlIG5vIG1vcmUgbWF0Y2hlcy4KKiBAc2VlICN1c2VhcmNoX2ZpcnN0CiogQHNlZSAjdXNlYXJjaF9nZXRPZmZzZXQKKiBAc2VlICNVU0VBUkNIX0RPTkUKKiBAc3RhYmxlIElDVSAyLjQKKi8KVV9DQVBJIGludDMyX3QgVV9FWFBPUlQyIHVzZWFyY2hfbmV4dChVU3RyaW5nU2VhcmNoICpzdHJzcmNoLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUVycm9yQ29kZSAgICAqc3RhdHVzKTsKCi8qKgoqIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBwcmV2aW91cyBwb2ludCBhdCB3aGljaCB0aGUgc3RyaW5nIHRleHQgbWF0Y2hlcwoqIHRoZSBzZWFyY2ggcGF0dGVybiwgc3RhcnRpbmcgYXQgdGhlIGN1cnJlbnQgcG9zaXRpb24uCiogVGhlIGl0ZXJhdG9yIGlzIGFkanVzdGVkIHNvIHRoYXQgaXRzIGN1cnJlbnQgCiogaW5kZXggKGFzIHJldHVybmVkIGJ5IDx0dD51c2VhcmNoX2dldE9mZnNldDwvdHQ+KSBpcyB0aGUgbWF0Y2ggcG9zaXRpb24gaWYgCiogb25lIHdhcyBmb3VuZC4KKiBJZiBhIG1hdGNoIGlzIG5vdCBmb3VuZCwgPHR0PlVTRUFSQ0hfRE9ORTwvdHQ+IHdpbGwgYmUgcmV0dXJuZWQgYW5kCiogdGhlIGl0ZXJhdG9yIHdpbGwgYmUgYWRqdXN0ZWQgdG8gdGhlIGluZGV4IDx0dD5VU0VBUkNIX0RPTkU8L3R0PgoqIEBwYXJhbSBzdHJzcmNoIHNlYXJjaCBpdGVyYXRvciBkYXRhIHN0cnVjdAoqIEBwYXJhbSBzdGF0dXMgZm9yIGVycm9ycyBpZiBpdCBvY2N1cnMKKiBAcmV0dXJuIFRoZSBpbmRleCBvZiB0aGUgcHJldmlvdXMgbWF0Y2ggYmVmb3JlIHRoZSBjdXJyZW50IHBvc2l0aW9uLAoqICAgICAgICAgb3IgPHR0PlVTRUFSQ0hfRE9ORTwvdHQ+IGlmIHRoZXJlIGFyZSBubyBtb3JlIG1hdGNoZXMuCiogQHNlZSAjdXNlYXJjaF9sYXN0CiogQHNlZSAjdXNlYXJjaF9nZXRPZmZzZXQKKiBAc2VlICNVU0VBUkNIX0RPTkUKKiBAc3RhYmxlIElDVSAyLjQKKi8KVV9DQVBJIGludDMyX3QgVV9FWFBPUlQyIHVzZWFyY2hfcHJldmlvdXMoVVN0cmluZ1NlYXJjaCAqc3Ryc3JjaCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVRXJyb3JDb2RlICAgICpzdGF0dXMpOwogICAgCi8qKiAKKiBSZXNldCB0aGUgaXRlcmF0aW9uLgoqIFNlYXJjaCB3aWxsIGJlZ2luIGF0IHRoZSBzdGFydCBvZiB0aGUgdGV4dCBzdHJpbmcgaWYgYSBmb3J3YXJkIGl0ZXJhdGlvbiAKKiBpcyBpbml0aWF0ZWQgYmVmb3JlIGEgYmFja3dhcmRzIGl0ZXJhdGlvbi4gT3RoZXJ3aXNlIGlmIGEgYmFja3dhcmRzIAoqIGl0ZXJhdGlvbiBpcyBpbml0aWF0ZWQgYmVmb3JlIGEgZm9yd2FyZHMgaXRlcmF0aW9uLCB0aGUgc2VhcmNoIHdpbGwgYmVnaW4KKiBhdCB0aGUgZW5kIG9mIHRoZSB0ZXh0IHN0cmluZy4KKiBAcGFyYW0gc3Ryc3JjaCBzZWFyY2ggaXRlcmF0b3IgZGF0YSBzdHJ1Y3QKKiBAc2VlICN1c2VhcmNoX2ZpcnN0CiogQHN0YWJsZSBJQ1UgMi40CiovClVfQ0FQSSB2b2lkIFVfRVhQT1JUMiB1c2VhcmNoX3Jlc2V0KFVTdHJpbmdTZWFyY2ggKnN0cnNyY2gpOwoKI2VuZGlmIC8qICNpZiAhVUNPTkZJR19OT19DT0xMQVRJT04gKi8KCiNlbmRpZgo=