LyoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqICAgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDMgSUJNIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiAgIERhdGUgICAgICAgIE5hbWUgICAgICAgIERlc2NyaXB0aW9uCiogIDA2LzI4LzIwMDEgICBzeW53ZWUgICAgICBDcmVhdGlvbi4KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqLwojaWZuZGVmIFVTRUFSQ0hfSAojZGVmaW5lIFVTRUFSQ0hfSAoKI2luY2x1ZGUgInVuaWNvZGUvdXR5cGVzLmgiCgojaWYgIVVDT05GSUdfTk9fQ09MTEFUSU9OCgojaW5jbHVkZSAidW5pY29kZS91Y29sLmgiCiNpbmNsdWRlICJ1bmljb2RlL3Vjb2xlaXRyLmgiCiNpbmNsdWRlICJ1bmljb2RlL3VicmsuaCIKCi8qKgogKiBcZmlsZQogKiBcYnJpZWYgQyBBUEk6IFN0cmluZ1NlYXJjaAogKgogKiBDIEFwaXMgZm9yIGFuIGVuZ2luZSB0aGF0IHByb3ZpZGVzIGxhbmd1YWdlLXNlbnNpdGl2ZSB0ZXh0IHNlYXJjaGluZyBiYXNlZCAKICogb24gdGhlIGNvbXBhcmlzb24gcnVsZXMgZGVmaW5lZCBpbiBhIDx0dD5VQ29sbGF0b3I8L3R0PiBkYXRhIHN0cnVjdCwKICogc2VlIDx0dD51Y29sLmg8L3R0Pi4gVGhpcyBlbnN1cmVzIHRoYXQgbGFuZ3VhZ2UgZWNjZW50cmljaXR5IGNhbiBiZSAKICogaGFuZGxlZCwgZS5nLiBmb3IgdGhlIEdlcm1hbiBjb2xsYXRvciwgY2hhcmFjdGVycyDfIGFuZCBTUyB3aWxsIGJlIG1hdGNoZWQgCiAqIGlmIGNhc2UgaXMgY2hvc2VuIHRvIGJlIGlnbm9yZWQuIAogKiBTZWUgdGhlIDxhIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9jdnMvaWN1L35jaGVja291dH4vaWN1aHRtbC9kZXNpZ24vY29sbGF0aW9uL0lDVV9jb2xsYXRpb25fZGVzaWduLmh0bSI+CiAqICJJQ1UgQ29sbGF0aW9uIERlc2lnbiBEb2N1bWVudCI8L2E+IGZvciBtb3JlIGluZm9ybWF0aW9uLgogKiA8cD4gCiAqIFRoZSBhbGdvcml0aG0gaW1wbGVtZW50ZWQgaXMgYSBtb2RpZmllZCBmb3JtIG9mIHRoZSBCb3llciBNb29yZSdzIHNlYXJjaC4KICogRm9yIG1vcmUgaW5mb3JtYXRpb24gIHNlZSAKICogPGEgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2ljdS9kb2NzL3BhcGVycy9lZmZpY2llbnRfdGV4dF9zZWFyY2hpbmdfaW5famF2YS5odG1sIj4KICogIkVmZmljaWVudCBUZXh0IFNlYXJjaGluZyBpbiBKYXZhIjwvYT4sIHB1Ymxpc2hlZCBpbiA8aT5KYXZhIFJlcG9ydDwvaT4gCiAqIGluIEZlYnJ1YXJ5LCAxOTk5LCBmb3IgZnVydGhlciBpbmZvcm1hdGlvbiBvbiB0aGUgYWxnb3JpdGhtLgogKiA8cD4KICogVGhlcmUgYXJlIDIgbWF0Y2ggb3B0aW9ucyBmb3Igc2VsZWN0aW9uOjxicj4KICogTGV0IFMnIGJlIHRoZSBzdWItc3RyaW5nIG9mIGEgdGV4dCBzdHJpbmcgUyBiZXR3ZWVuIHRoZSBvZmZzZXRzIHN0YXJ0IGFuZCAKICogZW5kIDxzdGFydCwgZW5kPi4KICogPGJyPgogKiBBIHBhdHRlcm4gc3RyaW5nIFAgbWF0Y2hlcyBhIHRleHQgc3RyaW5nIFMgYXQgdGhlIG9mZnNldHMgPHN0YXJ0LCBlbmQ+IAogKiBpZgogKiA8cHJlPiAKICogb3B0aW9uIDEuIFNvbWUgY2Fub25pY2FsIGVxdWl2YWxlbnQgb2YgUCBtYXRjaGVzIHNvbWUgY2Fub25pY2FsIGVxdWl2YWxlbnQgCiAqICAgICAgICAgICBvZiBTJwogKiBvcHRpb24gMi4gUCBtYXRjaGVzIFMnIGFuZCBpZiBQIHN0YXJ0cyBvciBlbmRzIHdpdGggYSBjb21iaW5pbmcgbWFyaywgCiAqICAgICAgICAgICB0aGVyZSBleGlzdHMgbm8gbm9uLWlnbm9yYWJsZSBjb21iaW5pbmcgbWFyayBiZWZvcmUgb3IgYWZ0ZXIgU5IgCiAqICAgICAgICAgICBpbiBTIHJlc3BlY3RpdmVseS4gCiAqIDwvcHJlPgogKiBPcHRpb24gMi4gd2lsbCBiZSB0aGUgZGVmYXVsdLcKICogPHA+CiAqIFRoaXMgc2VhcmNoIGhhcyBBUElzIHNpbWlsYXIgdG8gdGhhdCBvZiBvdGhlciB0ZXh0IGl0ZXJhdGlvbiBtZWNoYW5pc21zIAogKiBzdWNoIGFzIHRoZSBicmVhayBpdGVyYXRvcnMgaW4gPHR0PnVicmsuaDwvdHQ+LiBVc2luZyB0aGVzZSAKICogQVBJcywgaXQgaXMgZWFzeSB0byBzY2FuIHRocm91Z2ggdGV4dCBsb29raW5nIGZvciBhbGwgb2NjdXJhbmNlcyBvZiAKICogYSBnaXZlbiBwYXR0ZXJuLiBUaGlzIHNlYXJjaCBpdGVyYXRvciBhbGxvd3MgY2hhbmdpbmcgb2YgZGlyZWN0aW9uIGJ5IAogKiBjYWxsaW5nIGEgPHR0PnJlc2V0PC90dD4gZm9sbG93ZWQgYnkgYSA8dHQ+bmV4dDwvdHQ+IG9yIDx0dD5wcmV2aW91czwvdHQ+LiAKICogVGhvdWdoIGEgZGlyZWN0aW9uIGNoYW5nZSBjYW4gb2NjdXIgd2l0aG91dCBjYWxsaW5nIDx0dD5yZXNldDwvdHQ+IGZpcnN0LCAgCiAqIHRoaXMgb3BlcmF0aW9uIGNvbWVzIHdpdGggc29tZSBzcGVlZCBwZW5hbHR5LgogKiBHZW5lcmFsbHksIG1hdGNoIHJlc3VsdHMgaW4gdGhlIGZvcndhcmQgZGlyZWN0aW9uIHdpbGwgbWF0Y2ggdGhlIHJlc3VsdCAKICogbWF0Y2hlcyBpbiB0aGUgYmFja3dhcmRzIGRpcmVjdGlvbiBpbiB0aGUgcmV2ZXJzZSBvcmRlcgogKiA8cD4KICogPHR0PnVzZWFyY2guaDwvdHQ+IHByb3ZpZGVzIEFQSXMgdG8gc3BlY2lmeSB0aGUgc3RhcnRpbmcgcG9zaXRpb24gCiAqIHdpdGhpbiB0aGUgdGV4dCBzdHJpbmcgdG8gYmUgc2VhcmNoZWQsIGUuZy4gPHR0PnVzZWFyY2hfc2V0T2Zmc2V0PC90dD4sCiAqIDx0dD51c2VhcmNoX3ByZWNlZGluZzwvdHQ+IGFuZCA8dHQ+dXNlYXJjaF9mb2xsb3dpbmc8L3R0Pi4gU2luY2UgdGhlIAogKiBzdGFydGluZyBwb3NpdGlvbiB3aWxsIGJlIHNldCBhcyBpdCBpcyBzcGVjaWZpZWQsIHBsZWFzZSB0YWtlIG5vdGUgdGhhdCAKICogdGhlcmUgYXJlIHNvbWUgZGFuZ2Vyb3VzIHBvc2l0aW9ucyB3aGljaCB0aGUgc2VhcmNoIG1heSByZW5kZXIgaW5jb3JyZWN0IAogKiByZXN1bHRzOgogKiA8dWw+CiAqIDxsaT4gVGhlIG1pZHN0IG9mIGEgc3Vic3RyaW5nIHRoYXQgcmVxdWlyZXMgbm9ybWFsaXphdGlvbi4KICogPGxpPiBJZiB0aGUgZm9sbG93aW5nIG1hdGNoIGlzIHRvIGJlIGZvdW5kLCB0aGUgcG9zaXRpb24gc2hvdWxkIG5vdCBiZSB0aGUKICogICAgICBzZWNvbmQgY2hhcmFjdGVyIHdoaWNoIHJlcXVpcmVzIHRvIGJlIHN3YXBwZWQgd2l0aCB0aGUgcHJlY2VkaW5nIAogKiAgICAgIGNoYXJhY3Rlci4gVmljZSB2ZXJzYSwgaWYgdGhlIHByZWNlZGluZyBtYXRjaCBpcyB0byBiZSBmb3VuZCwgCiAqICAgICAgcG9zaXRpb24gdG8gc2VhcmNoIGZyb20gc2hvdWxkIG5vdCBiZSB0aGUgZmlyc3QgY2hhcmFjdGVyIHdoaWNoIAogKiAgICAgIHJlcXVpcmVzIHRvIGJlIHN3YXBwZWQgd2l0aCB0aGUgbmV4dCBjaGFyYWN0ZXIuIEUuZyBjZXJ0YWluIFRoYWkgYW5kCiAqICAgICAgTGFvIGNoYXJhY3RlcnMgcmVxdWlyZSBzd2FwcGluZy4KICogPGxpPiBJZiBhIGZvbGxvd2luZyBwYXR0ZXJuIG1hdGNoIGlzIHRvIGJlIGZvdW5kLCBhbnkgcG9zaXRpb24gd2l0aGluIGEgCiAqICAgICAgY29udHJhY3Rpbmcgc2VxdWVuY2UgZXhjZXB0IHRoZSBmaXJzdCB3aWxsIGZhaWwuIFZpY2UgdmVyc2EgaWYgYSAKICogICAgICBwcmVjZWRpbmcgcGF0dGVybiBtYXRjaCBpcyB0byBiZSBmb3VuZCwgYSBpbnZhbGlkIHN0YXJ0aW5nIHBvaW50IAogKiAgICAgIHdvdWxkIGJlIGFueSBjaGFyYWN0ZXIgd2l0aGluIGEgY29udHJhY3Rpbmcgc2VxdWVuY2UgZXhjZXB0IHRoZSBsYXN0LgogKiA8L3VsPgogKiA8cD4KICogQSBicmVha2l0ZXJhdG9yIGNhbiBiZSB1c2VkIGlmIG9ubHkgbWF0Y2hlcyBhdCBsb2dpY2FsIGJyZWFrcyBhcmUgZGVzaXJlZC4KICogVXNpbmcgYSBicmVha2l0ZXJhdG9yIHdpbGwgb25seSBnaXZlIHlvdSByZXN1bHRzIHRoYXQgZXhhY3RseSBtYXRjaGVzIHRoZQogKiBib3VuZGFyaWVzIGdpdmVuIGJ5IHRoZSBicmVha2l0ZXJhdG9yLiBGb3IgaW5zdGFuY2UgdGhlIHBhdHRlcm4gImUiIHdpbGwKICogbm90IGJlIGZvdW5kIGluIHRoZSBzdHJpbmcgIlx1MDBlOSIgaWYgYSBjaGFyYWN0ZXIgYnJlYWsgaXRlcmF0b3IgaXMgdXNlZC4KICogPHA+CiAqIE9wdGlvbnMgYXJlIHByb3ZpZGVkIHRvIGhhbmRsZSBvdmVybGFwcGluZyBtYXRjaGVzLiAKICogRS5nLiBJbiBFbmdsaXNoLCBvdmVybGFwcGluZyBtYXRjaGVzIHByb2R1Y2VzIHRoZSByZXN1bHQgMCBhbmQgMiAKICogZm9yIHRoZSBwYXR0ZXJuICJhYmFiIiBpbiB0aGUgdGV4dCAiYWJhYmFiIiwgd2hlcmUgZWxzZSBtdXR1YWxseSAKICogZXhjbHVzaXZlIG1hdGNoZXMgb25seSBwcm9kdWNlIHRoZSByZXN1bHQgb2YgMC4KICogPHA+CiAqIFRob3VnaCBjb2xsYXRvciBhdHRyaWJ1dGVzIHdpbGwgYmUgdGFrZW4gaW50byBjb25zaWRlcmF0aW9uIHdoaWxlIAogKiBwZXJmb3JtaW5nIG1hdGNoZXMsIHRoZXJlIGFyZSBubyBBUElzIGhlcmUgZm9yIHNldHRpbmcgYW5kIGdldHRpbmcgdGhlIAogKiBhdHRyaWJ1dGVzLiBUaGVzZSBhdHRyaWJ1dGVzIGNhbiBiZSBzZXQgYnkgZ2V0dGluZyB0aGUgY29sbGF0b3IKICogZnJvbSA8dHQ+dXNlYXJjaF9nZXRDb2xsYXRvcjwvdHQ+IGFuZCB1c2luZyB0aGUgQVBJcyBpbiA8dHQ+dWNvbC5oPC90dD4uCiAqIExhc3RseSB0byB1cGRhdGUgU3RyaW5nIFNlYXJjaCB0byB0aGUgbmV3IGNvbGxhdG9yIGF0dHJpYnV0ZXMsIAogKiB1c2VhcmNoX3Jlc2V0KCkgaGFzIHRvIGJlIGNhbGxlZC4KICogPHA+IAogKiBSZXN0cmljdGlvbjogPGJyPgogKiBDdXJyZW50bHkgdGhlcmUgYXJlIG5vIGNvbXBvc2l0ZSBjaGFyYWN0ZXJzIHRoYXQgY29uc2lzdHMgb2YgYQogKiBjaGFyYWN0ZXIgd2l0aCBjb21iaW5pbmcgY2xhc3MgPiAwIGJlZm9yZSBhIGNoYXJhY3RlciB3aXRoIGNvbWJpbmluZyAKICogY2xhc3MgPT0gMC4gSG93ZXZlciwgaWYgc3VjaCBhIGNoYXJhY3RlciBleGlzdHMgaW4gdGhlIGZ1dHVyZSwgdGhlIAogKiBzZWFyY2ggbWVjaGFuaXNtIGRvZXMgbm90IGd1YXJhbnRlZSB0aGUgcmVzdWx0cyBmb3Igb3B0aW9uIDEuCiAqIAogKiA8cD4KICogRXhhbXBsZSBvZiB1c2U6PGJyPgogKiA8cHJlPjxjb2RlPgogKiBjaGFyICp0Z3RzdHIgPSAiVGhlIHF1aWNrIGJyb3duIGZveCBqdW1wZWQgb3ZlciB0aGUgbGF6eSBmb3giOwogKiBjaGFyICpwYXRzdHIgPSAiZm94IjsKICogVUNoYXIgdGFyZ2V0WzY0XTsKICogVUNoYXIgcGF0dGVyblsxNl07CiAqIFVFcnJvckNvZGUgc3RhdHVzID0gVV9aRVJPX0VSUk9SOwogKiB1X3Vhc3RyY3B5KHRhcmdldCwgdGd0c3RyKTsKICogdV91YXN0cmNweShwYXR0ZXJuLCBwYXRzdHIpOwogKgogKiBVU3RyaW5nU2VhcmNoICpzZWFyY2ggPSB1c2VhcmNoX29wZW4ocGF0dGVybiwgLTEsIHRhcmdldCwgLTEsICJlbl9VUyIsIAogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhdHVzKTsKICogaWYgKFVfU1VDQ0VTUyhzdGF0dXMpKSB7CiAqICAgICBmb3IgKGludCBwb3MgPSB1c2VhcmNoX2ZpcnN0KHNlYXJjaCwgJnN0YXR1cyk7IAogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zICE9IFVTRUFSQ0hfRE9ORTsgCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3MgPSB1c2VhcmNoX25leHQoc2VhcmNoLCAmc3RhdHVzKSkgewogKiAgICAgICAgIHByaW50ZigiRm91bmQgbWF0Y2ggYXQgJWQgcG9zLCBsZW5ndGggaXMgJWRcbiIsIHBvcywgCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWFyY2hfZ2V0TWF0Y2hMZW5ndGgoc2VhcmNoKSk7CiAqICAgICB9CiAqIH0KICogPC9jb2RlPjwvcHJlPgogKiBAc3RhYmxlIElDVSAyLjQKICovCgovKioKKiBET05FIGlzIHJldHVybmVkIGJ5IHByZXZpb3VzKCkgYW5kIG5leHQoKSBhZnRlciBhbGwgdmFsaWQgbWF0Y2hlcyBoYXZlIAoqIGJlZW4gcmV0dXJuZWQsIGFuZCBieSBmaXJzdCgpIGFuZCBsYXN0KCkgaWYgdGhlcmUgYXJlIG5vIG1hdGNoZXMgYXQgYWxsLgoqIEBzdGFibGUgSUNVIDIuNAoqLwojZGVmaW5lIFVTRUFSQ0hfRE9ORSAtMQoKLyoqCiogRGF0YSBzdHJ1Y3R1cmUgZm9yIHNlYXJjaGluZwoqIEBzdGFibGUgSUNVIDIuNAoqLwpzdHJ1Y3QgVVN0cmluZ1NlYXJjaDsKLyoqCiogRGF0YSBzdHJ1Y3R1cmUgZm9yIHNlYXJjaGluZwoqIEBzdGFibGUgSUNVIDIuNAoqLwp0eXBlZGVmIHN0cnVjdCBVU3RyaW5nU2VhcmNoIFVTdHJpbmdTZWFyY2g7CgovKioKKiBAc3RhYmxlIElDVSAyLjQKKi8KdHlwZWRlZiBlbnVtIHsKICAgIC8qKiBPcHRpb24gZm9yIG92ZXJsYXBwaW5nIG1hdGNoZXMgKi8KICAgIFVTRUFSQ0hfT1ZFUkxBUCwKICAgIC8qKiAKICAgIE9wdGlvbiBmb3IgY2Fub25pY2FsIG1hdGNoZXMuIG9wdGlvbiAxIGluIGhlYWRlciBkb2N1bWVudGF0aW9uLgogICAgVGhlIGRlZmF1bHQgdmFsdWUgd2lsbCBiZSBVU0VBUkNIX09GRgogICAgKi8KICAgIFVTRUFSQ0hfQ0FOT05JQ0FMX01BVENILAogICAgVVNFQVJDSF9BVFRSSUJVVEVfQ09VTlQKfSBVU2VhcmNoQXR0cmlidXRlOwoKLyoqCiogQHN0YWJsZSBJQ1UgMi40CiovCnR5cGVkZWYgZW51bSB7CiAgICAvKiogZGVmYXVsdCB2YWx1ZSBmb3IgYW55IFVTZWFyY2hBdHRyaWJ1dGUgKi8KICAgIFVTRUFSQ0hfREVGQVVMVCA9IC0xLAogICAgLyoqIHZhbHVlIGZvciBVU0VBUkNIX09WRVJMQVAgYW5kIFVTRUFSQ0hfQ0FOT05JQ0FMX01BVENIICovCiAgICBVU0VBUkNIX09GRiwgCiAgICAvKiogdmFsdWUgZm9yIFVTRUFSQ0hfT1ZFUkxBUCBhbmQgVVNFQVJDSF9DQU5PTklDQUxfTUFUQ0ggKi8KICAgIFVTRUFSQ0hfT04sCiAgICBVU0VBUkNIX0FUVFJJQlVURV9WQUxVRV9DT1VOVAp9IFVTZWFyY2hBdHRyaWJ1dGVWYWx1ZTsKCi8qIG9wZW4gYW5kIGNsb3NlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKLyoqCiogQ3JlYXRpbmcgYSBzZWFyY2ggaXRlcmF0b3IgZGF0YSBzdHJ1Y3QgdXNpbmcgdGhlIGFyZ3VtZW50IGxvY2FsZSBsYW5ndWFnZQoqIHJ1bGUgc2V0LiBBIGNvbGxhdG9yIHdpbGwgYmUgY3JlYXRlZCBpbiB0aGUgcHJvY2Vzcywgd2hpY2ggd2lsbCBiZSBvd25lZCBieQoqIHRoaXMgc2VhcmNoIGFuZCB3aWxsIGJlIGRlbGV0ZWQgaW4gPHR0PnVzZWFyY2hfY2xvc2U8L3R0Pi4KKiBAcGFyYW0gcGF0dGVybiBmb3IgbWF0Y2hpbmcKKiBAcGFyYW0gcGF0dGVybmxlbmd0aCBsZW5ndGggb2YgdGhlIHBhdHRlcm4sIC0xIGZvciBudWxsLXRlcm1pbmF0aW9uCiogQHBhcmFtIHRleHQgdGV4dCBzdHJpbmcKKiBAcGFyYW0gdGV4dGxlbmd0aCBsZW5ndGggb2YgdGhlIHRleHQgc3RyaW5nLCAtMSBmb3IgbnVsbC10ZXJtaW5hdGlvbgoqIEBwYXJhbSBsb2NhbGUgbmFtZSBvZiBsb2NhbGUgZm9yIHRoZSBydWxlcyB0byBiZSB1c2VkCiogQHBhcmFtIGJyZWFraXRlciBBIEJyZWFrSXRlcmF0b3IgdGhhdCB3aWxsIGJlIHVzZWQgdG8gcmVzdHJpY3QgdGhlIHBvaW50cwoqICAgICAgICAgICAgICAgICAgYXQgd2hpY2ggbWF0Y2hlcyBhcmUgZGV0ZWN0ZWQuIElmIGEgbWF0Y2ggaXMgZm91bmQsIGJ1dCAKKiAgICAgICAgICAgICAgICAgIHRoZSBtYXRjaCdzIHN0YXJ0IG9yIGVuZCBpbmRleCBpcyBub3QgYSBib3VuZGFyeSBhcyAKKiAgICAgICAgICAgICAgICAgIGRldGVybWluZWQgYnkgdGhlIDx0dD5CcmVha0l0ZXJhdG9yPC90dD4sIHRoZSBtYXRjaCB3aWxsIAoqICAgICAgICAgICAgICAgICAgYmUgcmVqZWN0ZWQgYW5kIGFub3RoZXIgd2lsbCBiZSBzZWFyY2hlZCBmb3IuIAoqICAgICAgICAgICAgICAgICAgSWYgdGhpcyBwYXJhbWV0ZXIgaXMgPHR0Pk5VTEw8L3R0Piwgbm8gYnJlYWsgZGV0ZWN0aW9uIGlzIAoqICAgICAgICAgICAgICAgICAgYXR0ZW1wdGVkLgoqIEBwYXJhbSBzdGF0dXMgZm9yIGVycm9ycyBpZiBpdCBvY2N1cnMuIElmIHBhdHRlcm4gb3IgdGV4dCBpcyBOVUxMLCBvciBpZgoqICAgICAgICAgICAgICAgcGF0dGVybmxlbmd0aCBvciB0ZXh0bGVuZ3RoIGlzIDAgdGhlbiBhbiAKKiAgICAgICAgICAgICAgIFVfSUxMRUdBTF9BUkdVTUVOVF9FUlJPUiBpcyByZXR1cm5lZC4KKiBAcmV0dXJuIHNlYXJjaCBpdGVyYXRvciBkYXRhIHN0cnVjdHVyZSwgb3IgTlVMTCBpZiB0aGVyZSBpcyBhbiBlcnJvci4KKiBAc3RhYmxlIElDVSAyLjQKKi8KVV9DQVBJIFVTdHJpbmdTZWFyY2ggKiBVX0VYUE9SVDIgdXNlYXJjaF9vcGVuKGNvbnN0IFVDaGFyICAgICAgICAgICpwYXR0ZXJuLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgICAgICAgICBwYXR0ZXJubGVuZ3RoLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVDaGFyICAgICAgICAgICp0ZXh0LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgICAgICAgICB0ZXh0bGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgICAgICAgKmxvY2FsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVCcmVha0l0ZXJhdG9yICpicmVha2l0ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVRXJyb3JDb2RlICAgICAqc3RhdHVzKTsKCi8qKgoqIENyZWF0aW5nIGEgc2VhcmNoIGl0ZXJhdG9yIGRhdGEgc3RydWN0IHVzaW5nIHRoZSBhcmd1bWVudCBjb2xsYXRvciBsYW5ndWFnZQoqIHJ1bGUgc2V0LiBOb3RlLCB1c2VyIHJldGFpbnMgdGhlIG93bmVyc2hpcCBvZiB0aGlzIGNvbGxhdG9yLCB0aHVzIHRoZSAKKiByZXNwb25zaWJpbGl0eSBvZiBkZWxldGlvbiBsaWVzIHdpdGggdGhlIHVzZXIuCiogTk9URTogc3RyaW5nIHNlYXJjaCBjYW5ub3QgYmUgaW5zdGFudGlhdGVkIGZyb20gYSBjb2xsYXRvciB0aGF0IGhhcyAKKiBjb2xsYXRlIGRpZ2l0cyBhcyBudW1iZXJzIChDT0RBTikgdHVybmVkIG9uLgoqIEBwYXJhbSBwYXR0ZXJuIGZvciBtYXRjaGluZwoqIEBwYXJhbSBwYXR0ZXJubGVuZ3RoIGxlbmd0aCBvZiB0aGUgcGF0dGVybiwgLTEgZm9yIG51bGwtdGVybWluYXRpb24KKiBAcGFyYW0gdGV4dCB0ZXh0IHN0cmluZwoqIEBwYXJhbSB0ZXh0bGVuZ3RoIGxlbmd0aCBvZiB0aGUgdGV4dCBzdHJpbmcsIC0xIGZvciBudWxsLXRlcm1pbmF0aW9uCiogQHBhcmFtIGNvbGxhdG9yIHVzZWQgZm9yIHRoZSBsYW5ndWFnZSBydWxlcwoqIEBwYXJhbSBicmVha2l0ZXIgQSBCcmVha0l0ZXJhdG9yIHRoYXQgd2lsbCBiZSB1c2VkIHRvIHJlc3RyaWN0IHRoZSBwb2ludHMKKiAgICAgICAgICAgICAgICAgIGF0IHdoaWNoIG1hdGNoZXMgYXJlIGRldGVjdGVkLiBJZiBhIG1hdGNoIGlzIGZvdW5kLCBidXQgCiogICAgICAgICAgICAgICAgICB0aGUgbWF0Y2gncyBzdGFydCBvciBlbmQgaW5kZXggaXMgbm90IGEgYm91bmRhcnkgYXMgCiogICAgICAgICAgICAgICAgICBkZXRlcm1pbmVkIGJ5IHRoZSA8dHQ+QnJlYWtJdGVyYXRvcjwvdHQ+LCB0aGUgbWF0Y2ggd2lsbCAKKiAgICAgICAgICAgICAgICAgIGJlIHJlamVjdGVkIGFuZCBhbm90aGVyIHdpbGwgYmUgc2VhcmNoZWQgZm9yLiAKKiAgICAgICAgICAgICAgICAgIElmIHRoaXMgcGFyYW1ldGVyIGlzIDx0dD5OVUxMPC90dD4sIG5vIGJyZWFrIGRldGVjdGlvbiBpcyAKKiAgICAgICAgICAgICAgICAgIGF0dGVtcHRlZC4KKiBAcGFyYW0gc3RhdHVzIGZvciBlcnJvcnMgaWYgaXQgb2NjdXJzLiBJZiBjb2xsYXRvciwgcGF0dGVybiBvciB0ZXh0IGlzIE5VTEwsIAoqICAgICAgICAgICAgICAgb3IgaWYgcGF0dGVybmxlbmd0aCBvciB0ZXh0bGVuZ3RoIGlzIDAgdGhlbiBhbiAKKiAgICAgICAgICAgICAgIFVfSUxMRUdBTF9BUkdVTUVOVF9FUlJPUiBpcyByZXR1cm5lZC4KKiBAcmV0dXJuIHNlYXJjaCBpdGVyYXRvciBkYXRhIHN0cnVjdHVyZSwgb3IgTlVMTCBpZiB0aGVyZSBpcyBhbiBlcnJvci4KKiBAc3RhYmxlIElDVSAyLjQKKi8KVV9DQVBJIFVTdHJpbmdTZWFyY2ggKiBVX0VYUE9SVDIgdXNlYXJjaF9vcGVuRnJvbUNvbGxhdG9yKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVDaGFyICpwYXR0ZXJuLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICAgICAgICAgcGF0dGVybmxlbmd0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVQ2hhciAgICAgICAgICAqdGV4dCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAgICAgICAgIHRleHRsZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUNvbGxhdG9yICAgICAgKmNvbGxhdG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVCcmVha0l0ZXJhdG9yICpicmVha2l0ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUVycm9yQ29kZSAgICAgKnN0YXR1cyk7CgovKioKKiBEZXN0cm95aW5nIGFuZCBjbGVhbmluZyB1cCB0aGUgc2VhcmNoIGl0ZXJhdG9yIGRhdGEgc3RydWN0LgoqIElmIGEgY29sbGF0b3IgaXMgY3JlYXRlZCBpbiA8dHQ+dXNlYXJjaF9vcGVuPC90dD4sIGl0IHdpbGwgYmUgZGVzdHJveWVkIGhlcmUuCiogQHBhcmFtIHNlYXJjaGl0ZXIgZGF0YSBzdHJ1Y3QgdG8gY2xlYW4gdXAKKiBAc3RhYmxlIElDVSAyLjQKKi8KVV9DQVBJIHZvaWQgVV9FWFBPUlQyIHVzZWFyY2hfY2xvc2UoVVN0cmluZ1NlYXJjaCAqc2VhcmNoaXRlcik7CgovKiBnZXQgYW5kIHNldCBtZXRob2RzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKioKKiBTZXRzIHRoZSBjdXJyZW50IHBvc2l0aW9uIGluIHRoZSB0ZXh0IHN0cmluZyB3aGljaCB0aGUgbmV4dCBzZWFyY2ggd2lsbCAKKiBzdGFydCBmcm9tLiBDbGVhcnMgcHJldmlvdXMgc3RhdGVzLiAKKiBUaGlzIG1ldGhvZCB0YWtlcyB0aGUgYXJndW1lbnQgaW5kZXggYW5kIHNldHMgdGhlIHBvc2l0aW9uIGluIHRoZSB0ZXh0IAoqIHN0cmluZyBhY2NvcmRpbmdseSB3aXRob3V0IGNoZWNraW5nIGlmIHRoZSBpbmRleCBpcyBwb2ludGluZyB0byBhIAoqIHZhbGlkIHN0YXJ0aW5nIHBvaW50IHRvIGJlZ2luIHNlYXJjaGluZy4gCiogU2VhcmNoIHBvc2l0aW9ucyB0aGF0IG1heSByZW5kZXIgaW5jb3JyZWN0IHJlc3VsdHMgYXJlIGhpZ2hsaWdodGVkIGluIHRoZQoqIGhlYWRlciBjb21tZW50cwoqIEBwYXJhbSBzdHJzcmNoIHNlYXJjaCBpdGVyYXRvciBkYXRhIHN0cnVjdAoqIEBwYXJhbSBwb3NpdGlvbiBwb3NpdGlvbiB0byBzdGFydCBuZXh0IHNlYXJjaCBmcm9tLiBJZiBwb3NpdGlvbiBpcyBsZXNzCiogCQkJdGhhbiBvciBncmVhdGVyIHRoYW4gdGhlIHRleHQgcmFuZ2UgZm9yIHNlYXJjaGluZywgCiogICAgICAgICAgYW4gVV9JTkRFWF9PVVRPRkJPVU5EU19FUlJPUiB3aWxsIGJlIHJldHVybmVkCiogQHBhcmFtIHN0YXR1cyBlcnJvciBzdGF0dXMgaWYgYW55LgoqIEBzdGFibGUgSUNVIDIuNAoqLwpVX0NBUEkgdm9pZCBVX0VYUE9SVDIgdXNlYXJjaF9zZXRPZmZzZXQoVVN0cmluZ1NlYXJjaCAqc3Ryc3JjaCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICAgIHBvc2l0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUVycm9yQ29kZSAgICAqc3RhdHVzKTsKCi8qKgoqIFJldHVybiB0aGUgY3VycmVudCBpbmRleCBpbiB0aGUgc3RyaW5nIHRleHQgYmVpbmcgc2VhcmNoZWQuCiogSWYgdGhlIGl0ZXJhdGlvbiBoYXMgZ29uZSBwYXN0IHRoZSBlbmQgb2YgdGhlIHRleHQgKG9yIHBhc3QgdGhlIGJlZ2lubmluZyAKKiBmb3IgYSBiYWNrd2FyZHMgc2VhcmNoKSwgPHR0PlVTRUFSQ0hfRE9ORTwvdHQ+IGlzIHJldHVybmVkLgoqIEBwYXJhbSBzdHJzcmNoIHNlYXJjaCBpdGVyYXRvciBkYXRhIHN0cnVjdAoqIEBzZWUgI1VTRUFSQ0hfRE9ORQoqIEBzdGFibGUgSUNVIDIuNAoqLwpVX0NBUEkgaW50MzJfdCBVX0VYUE9SVDIgdXNlYXJjaF9nZXRPZmZzZXQoY29uc3QgVVN0cmluZ1NlYXJjaCAqc3Ryc3JjaCk7CiAgICAKLyoqCiogU2V0cyB0aGUgdGV4dCBzZWFyY2hpbmcgYXR0cmlidXRlcyBsb2NhdGVkIGluIHRoZSBlbnVtIFVTZWFyY2hBdHRyaWJ1dGUKKiB3aXRoIHZhbHVlcyBmcm9tIHRoZSBlbnVtIFVTZWFyY2hBdHRyaWJ1dGVWYWx1ZS4KKiA8dHQ+VVNFQVJDSF9ERUZBVUxUPC90dD4gY2FuIGJlIHVzZWQgZm9yIGFsbCBhdHRyaWJ1dGVzIGZvciByZXNldHRpbmcuCiogQHBhcmFtIHN0cnNyY2ggc2VhcmNoIGl0ZXJhdG9yIGRhdGEgc3RydWN0CiogQHBhcmFtIGF0dHJpYnV0ZSB0ZXh0IGF0dHJpYnV0ZSB0byBiZSBzZXQKKiBAcGFyYW0gdmFsdWUgdGV4dCBhdHRyaWJ1dGUgdmFsdWUKKiBAcGFyYW0gc3RhdHVzIGZvciBlcnJvcnMgaWYgaXQgb2NjdXJzCiogQHNlZSAjdXNlYXJjaF9nZXRBdHRyaWJ1dGUKKiBAc3RhYmxlIElDVSAyLjQKKi8KVV9DQVBJIHZvaWQgVV9FWFBPUlQyIHVzZWFyY2hfc2V0QXR0cmlidXRlKFVTdHJpbmdTZWFyY2ggICAgICAgICAqc3Ryc3JjaCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU2VhcmNoQXR0cmlidXRlICAgICAgIGF0dHJpYnV0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTZWFyY2hBdHRyaWJ1dGVWYWx1ZSAgdmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVRXJyb3JDb2RlICAgICAgICAgICAgKnN0YXR1cyk7CgovKiogICAgCiogR2V0cyB0aGUgdGV4dCBzZWFyY2hpbmcgYXR0cmlidXRlcy4KKiBAcGFyYW0gc3Ryc3JjaCBzZWFyY2ggaXRlcmF0b3IgZGF0YSBzdHJ1Y3QKKiBAcGFyYW0gYXR0cmlidXRlIHRleHQgYXR0cmlidXRlIHRvIGJlIHJldHJpZXZlCiogQHJldHVybiB0ZXh0IGF0dHJpYnV0ZSB2YWx1ZQoqIEBzZWUgI3VzZWFyY2hfc2V0QXR0cmlidXRlCiogQHN0YWJsZSBJQ1UgMi40CiovClVfQ0FQSSBVU2VhcmNoQXR0cmlidXRlVmFsdWUgVV9FWFBPUlQyIHVzZWFyY2hfZ2V0QXR0cmlidXRlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVTdHJpbmdTZWFyY2ggICAgKnN0cnNyY2gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNlYXJjaEF0dHJpYnV0ZSAgYXR0cmlidXRlKTsKCi8qKgoqIFJldHVybnMgdGhlIGluZGV4IHRvIHRoZSBtYXRjaCBpbiB0aGUgdGV4dCBzdHJpbmcgdGhhdCB3YXMgc2VhcmNoZWQuCiogVGhpcyBjYWxsIHJldHVybnMgYSB2YWxpZCByZXN1bHQgb25seSBhZnRlciBhIHN1Y2Nlc3NmdWwgY2FsbCB0byAKKiA8dHQ+dXNlYXJjaF9maXJzdDwvdHQ+LCA8dHQ+dXNlYXJjaF9uZXh0PC90dD4sIDx0dD51c2VhcmNoX3ByZXZpb3VzPC90dD4sIAoqIG9yIDx0dD51c2VhcmNoX2xhc3Q8L3R0Pi4KKiBKdXN0IGFmdGVyIGNvbnN0cnVjdGlvbiwgb3IgYWZ0ZXIgYSBzZWFyY2hpbmcgbWV0aG9kIHJldHVybnMgCiogPHR0PlVTRUFSQ0hfRE9ORTwvdHQ+LCB0aGlzIG1ldGhvZCB3aWxsIHJldHVybiA8dHQ+VVNFQVJDSF9ET05FPC90dD4uCiogPHA+CiogVXNlIDx0dD51c2VhcmNoX2dldE1hdGNoZWRMZW5ndGg8L3R0PiB0byBnZXQgdGhlIG1hdGNoZWQgc3RyaW5nIGxlbmd0aC4KKiBAcGFyYW0gc3Ryc3JjaCBzZWFyY2ggaXRlcmF0b3IgZGF0YSBzdHJ1Y3QKKiBAcmV0dXJuIGluZGV4IHRvIGEgc3Vic3RyaW5nIHdpdGhpbiB0aGUgdGV4dCBzdHJpbmcgdGhhdCBpcyBiZWluZyAKKiAgICAgICAgIHNlYXJjaGVkLgoqIEBzZWUgI3VzZWFyY2hfZmlyc3QKKiBAc2VlICN1c2VhcmNoX25leHQKKiBAc2VlICN1c2VhcmNoX3ByZXZpb3VzCiogQHNlZSAjdXNlYXJjaF9sYXN0CiogQHNlZSAjVVNFQVJDSF9ET05FCiogQHN0YWJsZSBJQ1UgMi40CiovClVfQ0FQSSBpbnQzMl90IFVfRVhQT1JUMiB1c2VhcmNoX2dldE1hdGNoZWRTdGFydCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVU3RyaW5nU2VhcmNoICpzdHJzcmNoKTsKICAgIAovKioKKiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGV4dCBpbiB0aGUgc3RyaW5nIHdoaWNoIG1hdGNoZXMgdGhlIHNlYXJjaCBwYXR0ZXJuLiAKKiBUaGlzIGNhbGwgcmV0dXJucyBhIHZhbGlkIHJlc3VsdCBvbmx5IGFmdGVyIGEgc3VjY2Vzc2Z1bCBjYWxsIHRvIAoqIDx0dD51c2VhcmNoX2ZpcnN0PC90dD4sIDx0dD51c2VhcmNoX25leHQ8L3R0PiwgPHR0PnVzZWFyY2hfcHJldmlvdXM8L3R0PiwgCiogb3IgPHR0PnVzZWFyY2hfbGFzdDwvdHQ+LgoqIEp1c3QgYWZ0ZXIgY29uc3RydWN0aW9uLCBvciBhZnRlciBhIHNlYXJjaGluZyBtZXRob2QgcmV0dXJucyAKKiA8dHQ+VVNFQVJDSF9ET05FPC90dD4sIHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIDAuCiogQHBhcmFtIHN0cnNyY2ggc2VhcmNoIGl0ZXJhdG9yIGRhdGEgc3RydWN0CiogQHJldHVybiBUaGUgbGVuZ3RoIG9mIHRoZSBtYXRjaCBpbiB0aGUgc3RyaW5nIHRleHQsIG9yIDAgaWYgdGhlcmUgaXMgbm8gCiogICAgICAgICBtYXRjaCBjdXJyZW50bHkuCiogQHNlZSAjdXNlYXJjaF9maXJzdAoqIEBzZWUgI3VzZWFyY2hfbmV4dAoqIEBzZWUgI3VzZWFyY2hfcHJldmlvdXMKKiBAc2VlICN1c2VhcmNoX2xhc3QKKiBAc2VlICNVU0VBUkNIX0RPTkUKKiBAc3RhYmxlIElDVSAyLjQKKi8KVV9DQVBJIGludDMyX3QgVV9FWFBPUlQyIHVzZWFyY2hfZ2V0TWF0Y2hlZExlbmd0aCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVU3RyaW5nU2VhcmNoICpzdHJzcmNoKTsKCi8qKgoqIFJldHVybnMgdGhlIHRleHQgdGhhdCB3YXMgbWF0Y2hlZCBieSB0aGUgbW9zdCByZWNlbnQgY2FsbCB0byAKKiA8dHQ+dXNlYXJjaF9maXJzdDwvdHQ+LCA8dHQ+dXNlYXJjaF9uZXh0PC90dD4sIDx0dD51c2VhcmNoX3ByZXZpb3VzPC90dD4sIAoqIG9yIDx0dD51c2VhcmNoX2xhc3Q8L3R0Pi4KKiBJZiB0aGUgaXRlcmF0b3IgaXMgbm90IHBvaW50aW5nIGF0IGEgdmFsaWQgbWF0Y2ggKGUuZy4ganVzdCBhZnRlciAKKiBjb25zdHJ1Y3Rpb24gb3IgYWZ0ZXIgPHR0PlVTRUFSQ0hfRE9ORTwvdHQ+IGhhcyBiZWVuIHJldHVybmVkLCByZXR1cm5zCiogYW4gZW1wdHkgc3RyaW5nLiBJZiByZXN1bHQgaXMgbm90IGxhcmdlIGVub3VnaCB0byBzdG9yZSB0aGUgbWF0Y2hlZCB0ZXh0LAoqIHJlc3VsdCB3aWxsIGJlIGZpbGxlZCB3aXRoIHRoZSBwYXJ0aWFsIHRleHQgYW5kIGFuIFVfQlVGRkVSX09WRVJGTE9XX0VSUk9SIAoqIHdpbGwgYmUgcmV0dXJuZWQgaW4gc3RhdHVzLiByZXN1bHQgd2lsbCBiZSBudWxsLXRlcm1pbmF0ZWQgd2hlbmV2ZXIgCiogcG9zc2libGUuIElmIHRoZSBidWZmZXIgZml0cyB0aGUgbWF0Y2hlZCB0ZXh0IGV4YWN0bHksIGEgbnVsbC10ZXJtaW5hdGlvbiAKKiBpcyBub3QgcG9zc2libGUsIHRoZW4gYSBVX1NUUklOR19OT1RfVEVSTUlOQVRFRF9FUlJPUiBzZXQgaW4gc3RhdHVzLgoqIFByZS1mbGlnaHRpbmcgY2FuIGJlIGVpdGhlciBkb25lIHdpdGggbGVuZ3RoID0gMCBvciB0aGUgQVBJIAoqIDx0dD51c2VhcmNoX2dldE1hdGNoTGVuZ3RoPC90dD4uCiogQHBhcmFtIHN0cnNyY2ggc2VhcmNoIGl0ZXJhdG9yIGRhdGEgc3RydWN0CiogQHBhcmFtIHJlc3VsdCBVQ2hhciBidWZmZXIgdG8gc3RvcmUgdGhlIG1hdGNoZWQgc3RyaW5nCiogQHBhcmFtIHJlc3VsdENhcGFjaXR5IGxlbmd0aCBvZiB0aGUgcmVzdWx0IGJ1ZmZlcgoqIEBwYXJhbSBzdGF0dXMgZXJyb3IgcmV0dXJuZWQgaWYgcmVzdWx0IGlzIG5vdCBsYXJnZSBlbm91Z2gKKiBAcmV0dXJuIGV4YWN0IGxlbmd0aCBvZiB0aGUgbWF0Y2hlZCB0ZXh0LCBub3QgY291bnRpbmcgdGhlIG51bGwtdGVybWluYXRpb24KKiBAc2VlICN1c2VhcmNoX2ZpcnN0CiogQHNlZSAjdXNlYXJjaF9uZXh0CiogQHNlZSAjdXNlYXJjaF9wcmV2aW91cwoqIEBzZWUgI3VzZWFyY2hfbGFzdAoqIEBzZWUgI1VTRUFSQ0hfRE9ORQoqIEBzdGFibGUgSUNVIDIuNAoqLwpVX0NBUEkgaW50MzJfdCBVX0VYUE9SVDIgdXNlYXJjaF9nZXRNYXRjaGVkVGV4dChjb25zdCBVU3RyaW5nU2VhcmNoICpzdHJzcmNoLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ2hhciAgICAgICAgICpyZXN1bHQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgICAgICAgIHJlc3VsdENhcGFjaXR5LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVRXJyb3JDb2RlICAgICpzdGF0dXMpOwoKI2lmICFVQ09ORklHX05PX0JSRUFLX0lURVJBVElPTgoKLyoqCiogU2V0IHRoZSBCcmVha0l0ZXJhdG9yIHRoYXQgd2lsbCBiZSB1c2VkIHRvIHJlc3RyaWN0IHRoZSBwb2ludHMgYXQgd2hpY2ggCiogbWF0Y2hlcyBhcmUgZGV0ZWN0ZWQuCiogQHBhcmFtIHN0cnNyY2ggc2VhcmNoIGl0ZXJhdG9yIGRhdGEgc3RydWN0CiogQHBhcmFtIGJyZWFraXRlciBBIEJyZWFrSXRlcmF0b3IgdGhhdCB3aWxsIGJlIHVzZWQgdG8gcmVzdHJpY3QgdGhlIHBvaW50cwoqICAgICAgICAgICAgICAgICAgYXQgd2hpY2ggbWF0Y2hlcyBhcmUgZGV0ZWN0ZWQuIElmIGEgbWF0Y2ggaXMgZm91bmQsIGJ1dCAKKiAgICAgICAgICAgICAgICAgIHRoZSBtYXRjaCdzIHN0YXJ0IG9yIGVuZCBpbmRleCBpcyBub3QgYSBib3VuZGFyeSBhcyAKKiAgICAgICAgICAgICAgICAgIGRldGVybWluZWQgYnkgdGhlIDx0dD5CcmVha0l0ZXJhdG9yPC90dD4sIHRoZSBtYXRjaCB3aWxsIAoqICAgICAgICAgICAgICAgICAgYmUgcmVqZWN0ZWQgYW5kIGFub3RoZXIgd2lsbCBiZSBzZWFyY2hlZCBmb3IuIAoqICAgICAgICAgICAgICAgICAgSWYgdGhpcyBwYXJhbWV0ZXIgaXMgPHR0Pk5VTEw8L3R0Piwgbm8gYnJlYWsgZGV0ZWN0aW9uIGlzIAoqICAgICAgICAgICAgICAgICAgYXR0ZW1wdGVkLgoqIEBwYXJhbSBzdGF0dXMgZm9yIGVycm9ycyBpZiBpdCBvY2N1cnMKKiBAc2VlICN1c2VhcmNoX2dldEJyZWFrSXRlcmF0b3IKKiBAc3RhYmxlIElDVSAyLjQKKi8KVV9DQVBJIHZvaWQgVV9FWFBPUlQyIHVzZWFyY2hfc2V0QnJlYWtJdGVyYXRvcihVU3RyaW5nU2VhcmNoICAqc3Ryc3JjaCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUJyZWFrSXRlcmF0b3IgKmJyZWFraXRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVRXJyb3JDb2RlICAgICAqc3RhdHVzKTsKCi8qKgoqIFJldHVybnMgdGhlIEJyZWFrSXRlcmF0b3IgdGhhdCBpcyB1c2VkIHRvIHJlc3RyaWN0IHRoZSBwb2ludHMgYXQgd2hpY2ggCiogbWF0Y2hlcyBhcmUgZGV0ZWN0ZWQuIFRoaXMgd2lsbCBiZSB0aGUgc2FtZSBvYmplY3QgdGhhdCB3YXMgcGFzc2VkIHRvIHRoZSAKKiBjb25zdHJ1Y3RvciBvciB0byA8dHQ+dXNlYXJjaF9zZXRCcmVha0l0ZXJhdG9yPC90dD4uIE5vdGUgdGhhdCAKKiA8dHQ+TlVMTDwvdHQ+IAoqIGlzIGEgbGVnYWwgdmFsdWU7IGl0IG1lYW5zIHRoYXQgYnJlYWsgZGV0ZWN0aW9uIHNob3VsZCBub3QgYmUgYXR0ZW1wdGVkLgoqIEBwYXJhbSBzdHJzcmNoIHNlYXJjaCBpdGVyYXRvciBkYXRhIHN0cnVjdAoqIEByZXR1cm4gYnJlYWsgaXRlcmF0b3IgdXNlZAoqIEBzZWUgI3VzZWFyY2hfc2V0QnJlYWtJdGVyYXRvcgoqIEBzdGFibGUgSUNVIDIuNAoqLwpVX0NBUEkgY29uc3QgVUJyZWFrSXRlcmF0b3IgKiBVX0VYUE9SVDIgdXNlYXJjaF9nZXRCcmVha0l0ZXJhdG9yKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVVN0cmluZ1NlYXJjaCAqc3Ryc3JjaCk7CiAgICAKI2VuZGlmCiAgICAKLyoqCiogU2V0IHRoZSBzdHJpbmcgdGV4dCB0byBiZSBzZWFyY2hlZC4gVGV4dCBpdGVyYXRpb24gd2lsbCBoZW5jZSBiZWdpbiBhdCB0aGUgCiogc3RhcnQgb2YgdGhlIHRleHQgc3RyaW5nLiBUaGlzIG1ldGhvZCBpcyB1c2VmdWwgaWYgeW91IHdhbnQgdG8gcmUtdXNlIGFuIAoqIGl0ZXJhdG9yIHRvIHNlYXJjaCBmb3IgdGhlIHNhbWUgcGF0dGVybiB3aXRoaW4gYSBkaWZmZXJlbnQgYm9keSBvZiB0ZXh0LgoqIEBwYXJhbSBzdHJzcmNoIHNlYXJjaCBpdGVyYXRvciBkYXRhIHN0cnVjdAoqIEBwYXJhbSB0ZXh0IG5ldyBzdHJpbmcgdG8gbG9vayBmb3IgbWF0Y2gKKiBAcGFyYW0gdGV4dGxlbmd0aCBsZW5ndGggb2YgdGhlIG5ldyBzdHJpbmcsIC0xIGZvciBudWxsLXRlcm1pbmF0aW9uCiogQHBhcmFtIHN0YXR1cyBmb3IgZXJyb3JzIGlmIGl0IG9jY3Vycy4gSWYgdGV4dCBpcyBOVUxMLCBvciB0ZXh0bGVuZ3RoIGlzIDAgCiogICAgICAgICAgICAgICB0aGVuIGFuIFVfSUxMRUdBTF9BUkdVTUVOVF9FUlJPUiBpcyByZXR1cm5lZCB3aXRoIG5vIGNoYW5nZQoqICAgICAgICAgICAgICAgZG9uZSB0byBzdHJzcmNoLgoqIEBzZWUgI3VzZWFyY2hfZ2V0VGV4dAoqIEBzdGFibGUgSUNVIDIuNAoqLwpVX0NBUEkgdm9pZCBVX0VYUE9SVDIgdXNlYXJjaF9zZXRUZXh0KCAgICAgIFVTdHJpbmdTZWFyY2ggKnN0cnNyY2gsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVDaGFyICAgICAgICAgKnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAgICAgICAgdGV4dGxlbmd0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVRXJyb3JDb2RlICAgICpzdGF0dXMpOwoKLyoqCiogUmV0dXJuIHRoZSBzdHJpbmcgdGV4dCB0byBiZSBzZWFyY2hlZC4KKiBAcGFyYW0gc3Ryc3JjaCBzZWFyY2ggaXRlcmF0b3IgZGF0YSBzdHJ1Y3QKKiBAcGFyYW0gbGVuZ3RoIHJldHVybmVkIHN0cmluZyB0ZXh0IGxlbmd0aAoqIEByZXR1cm4gc3RyaW5nIHRleHQgCiogQHNlZSAjdXNlYXJjaF9zZXRUZXh0CiogQHN0YWJsZSBJQ1UgMi40CiovClVfQ0FQSSBjb25zdCBVQ2hhciAqIFVfRVhQT1JUMiB1c2VhcmNoX2dldFRleHQoY29uc3QgVVN0cmluZ1NlYXJjaCAqc3Ryc3JjaCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAgICAgICAqbGVuZ3RoKTsKCi8qKgoqIEdldHMgdGhlIGNvbGxhdG9yIHVzZWQgZm9yIHRoZSBsYW5ndWFnZSBydWxlcy4gCiogPHA+CiogRGVsZXRpbmcgdGhlIHJldHVybmVkIDx0dD5VQ29sbGF0b3I8L3R0PiBiZWZvcmUgY2FsbGluZyAKKiA8dHQ+dXNlYXJjaF9jbG9zZTwvdHQ+IHdvdWxkIGNhdXNlIHRoZSBzdHJpbmcgc2VhcmNoIHRvIGZhaWwuCiogPHR0PnVzZWFyY2hfY2xvc2U8L3R0PiB3aWxsIGRlbGV0ZSB0aGUgY29sbGF0b3IgaWYgdGhpcyBzZWFyY2ggb3ducyBpdC4KKiBAcGFyYW0gc3Ryc3JjaCBzZWFyY2ggaXRlcmF0b3IgZGF0YSBzdHJ1Y3QKKiBAcmV0dXJuIGNvbGxhdG9yCiogQHN0YWJsZSBJQ1UgMi40CiovClVfQ0FQSSBVQ29sbGF0b3IgKiBVX0VYUE9SVDIgdXNlYXJjaF9nZXRDb2xsYXRvcigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVU3RyaW5nU2VhcmNoICpzdHJzcmNoKTsKCi8qKgoqIFNldHMgdGhlIGNvbGxhdG9yIHVzZWQgZm9yIHRoZSBsYW5ndWFnZSBydWxlcy4gVXNlciByZXRhaW5zIHRoZSBvd25lcnNoaXAgCiogb2YgdGhpcyBjb2xsYXRvciwgdGh1cyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgZGVsZXRpb24gbGllcyB3aXRoIHRoZSB1c2VyLgoqIFRoaXMgbWV0aG9kIGNhdXNlcyBpbnRlcm5hbCBkYXRhIHN1Y2ggYXMgQm95ZXItTW9vcmUgc2hpZnQgdGFibGVzIHRvICAKKiBiZSByZWNhbGN1bGF0ZWQsIGJ1dCB0aGUgaXRlcmF0b3IncyBwb3NpdGlvbiBpcyB1bmNoYW5nZWQuCiogQHBhcmFtIHN0cnNyY2ggc2VhcmNoIGl0ZXJhdG9yIGRhdGEgc3RydWN0CiogQHBhcmFtIGNvbGxhdG9yIHRvIGJlIHVzZWQKKiBAcGFyYW0gc3RhdHVzIGZvciBlcnJvcnMgaWYgaXQgb2NjdXJzCiogQHN0YWJsZSBJQ1UgMi40CiovClVfQ0FQSSB2b2lkIFVfRVhQT1JUMiB1c2VhcmNoX3NldENvbGxhdG9yKCAgICAgIFVTdHJpbmdTZWFyY2ggKnN0cnNyY2gsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVQ29sbGF0b3IgICAgICpjb2xsYXRvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUVycm9yQ29kZSAgICAqc3RhdHVzKTsKCi8qKgoqIFNldHMgdGhlIHBhdHRlcm4gdXNlZCBmb3IgbWF0Y2hpbmcuCiogSW50ZXJuYWwgZGF0YSBsaWtlIHRoZSBCb3llciBNb29yZSB0YWJsZSB3aWxsIGJlIHJlY2FsY3VsYXRlZCwgYnV0IHRoZSAKKiBpdGVyYXRvcidzIHBvc2l0aW9uIGlzIHVuY2hhbmdlZC4KKiBAcGFyYW0gc3Ryc3JjaCBzZWFyY2ggaXRlcmF0b3IgZGF0YSBzdHJ1Y3QKKiBAcGFyYW0gcGF0dGVybiBzdHJpbmcKKiBAcGFyYW0gcGF0dGVybmxlbmd0aCBwYXR0ZXJuIGxlbmd0aCwgLTEgZm9yIG51bGwtdGVybWluYXRlZCBzdHJpbmcKKiBAcGFyYW0gc3RhdHVzIGZvciBlcnJvcnMgaWYgaXQgb2NjdXJzLiBJZiB0ZXh0IGlzIE5VTEwsIG9yIHRleHRsZW5ndGggaXMgMCAKKiAgICAgICAgICAgICAgIHRoZW4gYW4gVV9JTExFR0FMX0FSR1VNRU5UX0VSUk9SIGlzIHJldHVybmVkIHdpdGggbm8gY2hhbmdlCiogICAgICAgICAgICAgICBkb25lIHRvIHN0cnNyY2guCiogQHN0YWJsZSBJQ1UgMi40CiovClVfQ0FQSSB2b2lkIFVfRVhQT1JUMiB1c2VhcmNoX3NldFBhdHRlcm4oICAgICAgVVN0cmluZ1NlYXJjaCAqc3Ryc3JjaCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUNoYXIgICAgICAgICAqcGF0dGVybiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICAgICAgICBwYXR0ZXJubGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVFcnJvckNvZGUgICAgKnN0YXR1cyk7CgovKioKKiBHZXRzIHRoZSBzZWFyY2ggcGF0dGVybgoqIEBwYXJhbSBzdHJzcmNoIHNlYXJjaCBpdGVyYXRvciBkYXRhIHN0cnVjdAoqIEBwYXJhbSBsZW5ndGggcmV0dXJuIGxlbmd0aCBvZiB0aGUgcGF0dGVybiwgLTEgaW5kaWNhdGVzIHRoYXQgdGhlIHBhdHRlcm4gCiogICAgICAgICAgICAgICBpcyBudWxsLXRlcm1pbmF0ZWQKKiBAcmV0dXJuIHBhdHRlcm4gc3RyaW5nCiogQHN0YWJsZSBJQ1UgMi40CiovClVfQ0FQSSBjb25zdCBVQ2hhciAqIFVfRVhQT1JUMiB1c2VhcmNoX2dldFBhdHRlcm4oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVVN0cmluZ1NlYXJjaCAqc3Ryc3JjaCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAgICAgICAqbGVuZ3RoKTsKCi8qIG1ldGhvZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKLyoqCiogUmV0dXJucyB0aGUgZmlyc3QgaW5kZXggYXQgd2hpY2ggdGhlIHN0cmluZyB0ZXh0IG1hdGNoZXMgdGhlIHNlYXJjaCAKKiBwYXR0ZXJuLiAgCiogVGhlIGl0ZXJhdG9yIGlzIGFkanVzdGVkIHNvIHRoYXQgaXRzIGN1cnJlbnQgaW5kZXggKGFzIHJldHVybmVkIGJ5IAoqIDx0dD51c2VhcmNoX2dldE9mZnNldDwvdHQ+KSBpcyB0aGUgbWF0Y2ggcG9zaXRpb24gaWYgb25lIHdhcyBmb3VuZC4KKiBJZiBhIG1hdGNoIGlzIG5vdCBmb3VuZCwgPHR0PlVTRUFSQ0hfRE9ORTwvdHQ+IHdpbGwgYmUgcmV0dXJuZWQgYW5kCiogdGhlIGl0ZXJhdG9yIHdpbGwgYmUgYWRqdXN0ZWQgdG8gdGhlIGluZGV4IDx0dD5VU0VBUkNIX0RPTkU8L3R0Pi4KKiBAcGFyYW0gc3Ryc3JjaCBzZWFyY2ggaXRlcmF0b3IgZGF0YSBzdHJ1Y3QKKiBAcGFyYW0gc3RhdHVzIGZvciBlcnJvcnMgaWYgaXQgb2NjdXJzCiogQHJldHVybiBUaGUgY2hhcmFjdGVyIGluZGV4IG9mIHRoZSBmaXJzdCBtYXRjaCwgb3IgCiogPHR0PlVTRUFSQ0hfRE9ORTwvdHQ+IGlmIHRoZXJlIGFyZSBubyBtYXRjaGVzLgoqIEBzZWUgI3VzZWFyY2hfZ2V0T2Zmc2V0CiogQHNlZSAjVVNFQVJDSF9ET05FCiogQHN0YWJsZSBJQ1UgMi40CiovClVfQ0FQSSBpbnQzMl90IFVfRVhQT1JUMiB1c2VhcmNoX2ZpcnN0KFVTdHJpbmdTZWFyY2ggKnN0cnNyY2gsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUVycm9yQ29kZSAgICAqc3RhdHVzKTsKCi8qKgoqIFJldHVybnMgdGhlIGZpcnN0IGluZGV4IGdyZWF0ZXIgdGhhbiA8dHQ+cG9zaXRpb248L3R0PiBhdCB3aGljaCB0aGUgc3RyaW5nIAoqIHRleHQgCiogbWF0Y2hlcyB0aGUgc2VhcmNoIHBhdHRlcm4uIFRoZSBpdGVyYXRvciBpcyBhZGp1c3RlZCBzbyB0aGF0IGl0cyBjdXJyZW50IAoqIGluZGV4IChhcyByZXR1cm5lZCBieSA8dHQ+dXNlYXJjaF9nZXRPZmZzZXQ8L3R0PikgaXMgdGhlIG1hdGNoIHBvc2l0aW9uIGlmIAoqIG9uZSB3YXMgZm91bmQuCiogSWYgYSBtYXRjaCBpcyBub3QgZm91bmQsIDx0dD5VU0VBUkNIX0RPTkU8L3R0PiB3aWxsIGJlIHJldHVybmVkIGFuZAoqIHRoZSBpdGVyYXRvciB3aWxsIGJlIGFkanVzdGVkIHRvIHRoZSBpbmRleCA8dHQ+VVNFQVJDSF9ET05FPC90dD4KKiA8cD4KKiBTZWFyY2ggcG9zaXRpb25zIHRoYXQgbWF5IHJlbmRlciBpbmNvcnJlY3QgcmVzdWx0cyBhcmUgaGlnaGxpZ2h0ZWQgaW4gdGhlCiogaGVhZGVyIGNvbW1lbnRzLiBJZiBwb3NpdGlvbiBpcyBsZXNzIHRoYW4gb3IgZ3JlYXRlciB0aGFuIHRoZSB0ZXh0IHJhbmdlIAoqIGZvciBzZWFyY2hpbmcsIGFuIFVfSU5ERVhfT1VUT0ZCT1VORFNfRVJST1Igd2lsbCBiZSByZXR1cm5lZAoqIEBwYXJhbSBzdHJzcmNoIHNlYXJjaCBpdGVyYXRvciBkYXRhIHN0cnVjdAoqIEBwYXJhbSBwb3NpdGlvbiB0byBzdGFydCB0aGUgc2VhcmNoIGF0CiogQHBhcmFtIHN0YXR1cyBmb3IgZXJyb3JzIGlmIGl0IG9jY3VycwoqIEByZXR1cm4gVGhlIGNoYXJhY3RlciBpbmRleCBvZiB0aGUgZmlyc3QgbWF0Y2ggZm9sbG93aW5nIDx0dD5wb3M8L3R0PiwKKiAgICAgICAgIG9yIDx0dD5VU0VBUkNIX0RPTkU8L3R0PiBpZiB0aGVyZSBhcmUgbm8gbWF0Y2hlcy4KKiBAc2VlICN1c2VhcmNoX2dldE9mZnNldAoqIEBzZWUgI1VTRUFSQ0hfRE9ORQoqIEBzdGFibGUgSUNVIDIuNAoqLwpVX0NBUEkgaW50MzJfdCBVX0VYUE9SVDIgdXNlYXJjaF9mb2xsb3dpbmcoVVN0cmluZ1NlYXJjaCAqc3Ryc3JjaCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAgICBwb3NpdGlvbiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUVycm9yQ29kZSAgICAqc3RhdHVzKTsKICAgIAovKioKKiBSZXR1cm5zIHRoZSBsYXN0IGluZGV4IGluIHRoZSB0YXJnZXQgdGV4dCBhdCB3aGljaCBpdCBtYXRjaGVzIHRoZSBzZWFyY2ggCiogcGF0dGVybi4gVGhlIGl0ZXJhdG9yIGlzIGFkanVzdGVkIHNvIHRoYXQgaXRzIGN1cnJlbnQgCiogaW5kZXggKGFzIHJldHVybmVkIGJ5IDx0dD51c2VhcmNoX2dldE9mZnNldDwvdHQ+KSBpcyB0aGUgbWF0Y2ggcG9zaXRpb24gaWYgCiogb25lIHdhcyBmb3VuZC4KKiBJZiBhIG1hdGNoIGlzIG5vdCBmb3VuZCwgPHR0PlVTRUFSQ0hfRE9ORTwvdHQ+IHdpbGwgYmUgcmV0dXJuZWQgYW5kCiogdGhlIGl0ZXJhdG9yIHdpbGwgYmUgYWRqdXN0ZWQgdG8gdGhlIGluZGV4IDx0dD5VU0VBUkNIX0RPTkU8L3R0Pi4KKiBAcGFyYW0gc3Ryc3JjaCBzZWFyY2ggaXRlcmF0b3IgZGF0YSBzdHJ1Y3QKKiBAcGFyYW0gc3RhdHVzIGZvciBlcnJvcnMgaWYgaXQgb2NjdXJzCiogQHJldHVybiBUaGUgaW5kZXggb2YgdGhlIGZpcnN0IG1hdGNoLCBvciA8dHQ+VVNFQVJDSF9ET05FPC90dD4gaWYgdGhlcmUgCiogICAgICAgICBhcmUgbm8gbWF0Y2hlcy4KKiBAc2VlICN1c2VhcmNoX2dldE9mZnNldAoqIEBzZWUgI1VTRUFSQ0hfRE9ORQoqIEBzdGFibGUgSUNVIDIuNAoqLwpVX0NBUEkgaW50MzJfdCBVX0VYUE9SVDIgdXNlYXJjaF9sYXN0KFVTdHJpbmdTZWFyY2ggKnN0cnNyY2gsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVRXJyb3JDb2RlICAgICpzdGF0dXMpOwoKLyoqCiogUmV0dXJucyB0aGUgZmlyc3QgaW5kZXggbGVzcyB0aGFuIDx0dD5wb3NpdGlvbjwvdHQ+IGF0IHdoaWNoIHRoZSBzdHJpbmcgdGV4dCAKKiBtYXRjaGVzIHRoZSBzZWFyY2ggcGF0dGVybi4gVGhlIGl0ZXJhdG9yIGlzIGFkanVzdGVkIHNvIHRoYXQgaXRzIGN1cnJlbnQgCiogaW5kZXggKGFzIHJldHVybmVkIGJ5IDx0dD51c2VhcmNoX2dldE9mZnNldDwvdHQ+KSBpcyB0aGUgbWF0Y2ggcG9zaXRpb24gaWYgCiogb25lIHdhcyBmb3VuZC4KKiBJZiBhIG1hdGNoIGlzIG5vdCBmb3VuZCwgPHR0PlVTRUFSQ0hfRE9ORTwvdHQ+IHdpbGwgYmUgcmV0dXJuZWQgYW5kCiogdGhlIGl0ZXJhdG9yIHdpbGwgYmUgYWRqdXN0ZWQgdG8gdGhlIGluZGV4IDx0dD5VU0VBUkNIX0RPTkU8L3R0PgoqIDxwPgoqIFNlYXJjaCBwb3NpdGlvbnMgdGhhdCBtYXkgcmVuZGVyIGluY29ycmVjdCByZXN1bHRzIGFyZSBoaWdobGlnaHRlZCBpbiB0aGUKKiBoZWFkZXIgY29tbWVudHMuIElmIHBvc2l0aW9uIGlzIGxlc3MgdGhhbiBvciBncmVhdGVyIHRoYW4gdGhlIHRleHQgcmFuZ2UgCiogZm9yIHNlYXJjaGluZywgYW4gVV9JTkRFWF9PVVRPRkJPVU5EU19FUlJPUiB3aWxsIGJlIHJldHVybmVkCiogQHBhcmFtIHN0cnNyY2ggc2VhcmNoIGl0ZXJhdG9yIGRhdGEgc3RydWN0CiogQHBhcmFtIHBvc2l0aW9uIGluZGV4IHBvc2l0aW9uIHRoZSBzZWFyY2ggaXMgdG8gYmVnaW4gYXQKKiBAcGFyYW0gc3RhdHVzIGZvciBlcnJvcnMgaWYgaXQgb2NjdXJzCiogQHJldHVybiBUaGUgY2hhcmFjdGVyIGluZGV4IG9mIHRoZSBmaXJzdCBtYXRjaCBwcmVjZWRpbmcgPHR0PnBvczwvdHQ+LAoqICAgICAgICAgb3IgPHR0PlVTRUFSQ0hfRE9ORTwvdHQ+IGlmIHRoZXJlIGFyZSBubyBtYXRjaGVzLgoqIEBzZWUgI3VzZWFyY2hfZ2V0T2Zmc2V0CiogQHNlZSAjVVNFQVJDSF9ET05FCiogQHN0YWJsZSBJQ1UgMi40CiovClVfQ0FQSSBpbnQzMl90IFVfRVhQT1JUMiB1c2VhcmNoX3ByZWNlZGluZyhVU3RyaW5nU2VhcmNoICpzdHJzcmNoLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICAgIHBvc2l0aW9uLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVRXJyb3JDb2RlICAgICpzdGF0dXMpOwogICAgCi8qKgoqIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBuZXh0IHBvaW50IGF0IHdoaWNoIHRoZSBzdHJpbmcgdGV4dCBtYXRjaGVzIHRoZQoqIHNlYXJjaCBwYXR0ZXJuLCBzdGFydGluZyBmcm9tIHRoZSBjdXJyZW50IHBvc2l0aW9uLgoqIFRoZSBpdGVyYXRvciBpcyBhZGp1c3RlZCBzbyB0aGF0IGl0cyBjdXJyZW50IAoqIGluZGV4IChhcyByZXR1cm5lZCBieSA8dHQ+dXNlYXJjaF9nZXRPZmZzZXQ8L3R0PikgaXMgdGhlIG1hdGNoIHBvc2l0aW9uIGlmIAoqIG9uZSB3YXMgZm91bmQuCiogSWYgYSBtYXRjaCBpcyBub3QgZm91bmQsIDx0dD5VU0VBUkNIX0RPTkU8L3R0PiB3aWxsIGJlIHJldHVybmVkIGFuZAoqIHRoZSBpdGVyYXRvciB3aWxsIGJlIGFkanVzdGVkIHRvIHRoZSBpbmRleCA8dHQ+VVNFQVJDSF9ET05FPC90dD4KKiBAcGFyYW0gc3Ryc3JjaCBzZWFyY2ggaXRlcmF0b3IgZGF0YSBzdHJ1Y3QKKiBAcGFyYW0gc3RhdHVzIGZvciBlcnJvcnMgaWYgaXQgb2NjdXJzCiogQHJldHVybiBUaGUgaW5kZXggb2YgdGhlIG5leHQgbWF0Y2ggYWZ0ZXIgdGhlIGN1cnJlbnQgcG9zaXRpb24sIG9yIAoqICAgICAgICAgPHR0PlVTRUFSQ0hfRE9ORTwvdHQ+IGlmIHRoZXJlIGFyZSBubyBtb3JlIG1hdGNoZXMuCiogQHNlZSAjdXNlYXJjaF9maXJzdAoqIEBzZWUgI3VzZWFyY2hfZ2V0T2Zmc2V0CiogQHNlZSAjVVNFQVJDSF9ET05FCiogQHN0YWJsZSBJQ1UgMi40CiovClVfQ0FQSSBpbnQzMl90IFVfRVhQT1JUMiB1c2VhcmNoX25leHQoVVN0cmluZ1NlYXJjaCAqc3Ryc3JjaCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVFcnJvckNvZGUgICAgKnN0YXR1cyk7CgovKioKKiBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgcHJldmlvdXMgcG9pbnQgYXQgd2hpY2ggdGhlIHN0cmluZyB0ZXh0IG1hdGNoZXMKKiB0aGUgc2VhcmNoIHBhdHRlcm4sIHN0YXJ0aW5nIGF0IHRoZSBjdXJyZW50IHBvc2l0aW9uLgoqIFRoZSBpdGVyYXRvciBpcyBhZGp1c3RlZCBzbyB0aGF0IGl0cyBjdXJyZW50IAoqIGluZGV4IChhcyByZXR1cm5lZCBieSA8dHQ+dXNlYXJjaF9nZXRPZmZzZXQ8L3R0PikgaXMgdGhlIG1hdGNoIHBvc2l0aW9uIGlmIAoqIG9uZSB3YXMgZm91bmQuCiogSWYgYSBtYXRjaCBpcyBub3QgZm91bmQsIDx0dD5VU0VBUkNIX0RPTkU8L3R0PiB3aWxsIGJlIHJldHVybmVkIGFuZAoqIHRoZSBpdGVyYXRvciB3aWxsIGJlIGFkanVzdGVkIHRvIHRoZSBpbmRleCA8dHQ+VVNFQVJDSF9ET05FPC90dD4KKiBAcGFyYW0gc3Ryc3JjaCBzZWFyY2ggaXRlcmF0b3IgZGF0YSBzdHJ1Y3QKKiBAcGFyYW0gc3RhdHVzIGZvciBlcnJvcnMgaWYgaXQgb2NjdXJzCiogQHJldHVybiBUaGUgaW5kZXggb2YgdGhlIHByZXZpb3VzIG1hdGNoIGJlZm9yZSB0aGUgY3VycmVudCBwb3NpdGlvbiwKKiAgICAgICAgIG9yIDx0dD5VU0VBUkNIX0RPTkU8L3R0PiBpZiB0aGVyZSBhcmUgbm8gbW9yZSBtYXRjaGVzLgoqIEBzZWUgI3VzZWFyY2hfbGFzdAoqIEBzZWUgI3VzZWFyY2hfZ2V0T2Zmc2V0CiogQHNlZSAjVVNFQVJDSF9ET05FCiogQHN0YWJsZSBJQ1UgMi40CiovClVfQ0FQSSBpbnQzMl90IFVfRVhQT1JUMiB1c2VhcmNoX3ByZXZpb3VzKFVTdHJpbmdTZWFyY2ggKnN0cnNyY2gsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUVycm9yQ29kZSAgICAqc3RhdHVzKTsKICAgIAovKiogCiogUmVzZXQgdGhlIGl0ZXJhdGlvbi4KKiBTZWFyY2ggd2lsbCBiZWdpbiBhdCB0aGUgc3RhcnQgb2YgdGhlIHRleHQgc3RyaW5nIGlmIGEgZm9yd2FyZCBpdGVyYXRpb24gCiogaXMgaW5pdGlhdGVkIGJlZm9yZSBhIGJhY2t3YXJkcyBpdGVyYXRpb24uIE90aGVyd2lzZSBpZiBhIGJhY2t3YXJkcyAKKiBpdGVyYXRpb24gaXMgaW5pdGlhdGVkIGJlZm9yZSBhIGZvcndhcmRzIGl0ZXJhdGlvbiwgdGhlIHNlYXJjaCB3aWxsIGJlZ2luCiogYXQgdGhlIGVuZCBvZiB0aGUgdGV4dCBzdHJpbmcuCiogQHBhcmFtIHN0cnNyY2ggc2VhcmNoIGl0ZXJhdG9yIGRhdGEgc3RydWN0CiogQHNlZSAjdXNlYXJjaF9maXJzdAoqIEBzdGFibGUgSUNVIDIuNAoqLwpVX0NBUEkgdm9pZCBVX0VYUE9SVDIgdXNlYXJjaF9yZXNldChVU3RyaW5nU2VhcmNoICpzdHJzcmNoKTsKCiNlbmRpZiAvKiAjaWYgIVVDT05GSUdfTk9fQ09MTEFUSU9OICovCgojZW5kaWYK