LyoKICogJFhGcmVlODY6IHhjL2xpYi9mb250Y29uZmlnL3NyYy9mY2ludC5oLHYgMS4yMSAyMDAyLzA3LzMxIDAxOjM2OjM3IGtlaXRocCBFeHAgJAogKgogKiBDb3B5cmlnaHQgqSAyMDAwIEtlaXRoIFBhY2thcmQsIG1lbWJlciBvZiBUaGUgWEZyZWU4NiBQcm9qZWN0LCBJbmMuCiAqCiAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cwogKiBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAogKiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZwogKiBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBLZWl0aCBQYWNrYXJkIG5vdCBiZSB1c2VkIGluCiAqIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUgd2l0aG91dAogKiBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgS2VpdGggUGFja2FyZCBtYWtlcyBubwogKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiAgSXQKICogaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KICoKICogS0VJVEggUEFDS0FSRCBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKICogSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTwogKiBFVkVOVCBTSEFMTCBLRUlUSCBQQUNLQVJEIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCiAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLAogKiBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCiAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKICogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KICovCgojaWZuZGVmIF9GQ0lOVF9IXwojZGVmaW5lIF9GQ0lOVF9IXwoKI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8Y3R5cGUuaD4KI2luY2x1ZGUgPGVycm5vLmg+CiNpbmNsdWRlIDx1bmlzdGQuaD4KI2luY2x1ZGUgPHN5cy90eXBlcy5oPgojaW5jbHVkZSA8c3lzL3N0YXQuaD4KI2luY2x1ZGUgPHRpbWUuaD4KI2luY2x1ZGUgPGZvbnRjb25maWcvZm9udGNvbmZpZy5oPgojaW5jbHVkZSA8Zm9udGNvbmZpZy9mY3ByaXZhdGUuaD4KI2luY2x1ZGUgPGZvbnRjb25maWcvZmNmcmVldHlwZS5oPgojaWZkZWYgSEFWRV9DT05GSUdfSAojaW5jbHVkZSA8Y29uZmlnLmg+CiNlbmRpZgoKdHlwZWRlZiBzdHJ1Y3QgX0ZjU3ltYm9saWMgewogICAgY29uc3QgY2hhcgkqbmFtZTsKICAgIGludAkJdmFsdWU7Cn0gRmNTeW1ib2xpYzsKCiNpZm5kZWYgRkNfQ09ORklHX1BBVEgKI2RlZmluZSBGQ19DT05GSUdfUEFUSCAiZm9udHMuY29uZiIKI2VuZGlmCgojZGVmaW5lIEZDX0ZPTlRfRklMRV9JTlZBTElECSgoRmNDaGFyOCAqKSAiLiIpCiNkZWZpbmUgRkNfRk9OVF9GSUxFX0RJUgkoKEZjQ2hhcjggKikgIi5kaXIiKQoKI2RlZmluZSBGQ19EQkdfTUFUQ0gJMQojZGVmaW5lIEZDX0RCR19NQVRDSFYJMgojZGVmaW5lIEZDX0RCR19FRElUCTQKI2RlZmluZSBGQ19EQkdfRk9OVFNFVAk4CiNkZWZpbmUgRkNfREJHX0NBQ0hFCTE2CiNkZWZpbmUgRkNfREJHX0NBQ0hFVgkzMgojZGVmaW5lIEZDX0RCR19QQVJTRQk2NAojZGVmaW5lIEZDX0RCR19TQ0FOCTEyOAojZGVmaW5lIEZDX0RCR19TQ0FOVgkyNTYKI2RlZmluZSBGQ19EQkdfTUVNT1JZCTUxMgoKI2RlZmluZSBGQ19NRU1fQ0hBUlNFVAkgICAgMAojZGVmaW5lIEZDX01FTV9DSEFSTk9ERQkgICAgMQojZGVmaW5lIEZDX01FTV9GT05UU0VUCSAgICAyCiNkZWZpbmUgRkNfTUVNX0ZPTlRQVFIJICAgIDMKI2RlZmluZSBGQ19NRU1fT0JKRUNUU0VUICAgIDQKI2RlZmluZSBGQ19NRU1fT0JKRUNUUFRSICAgIDUKI2RlZmluZSBGQ19NRU1fTUFUUklYCSAgICA2CiNkZWZpbmUgRkNfTUVNX1BBVFRFUk4JICAgIDcKI2RlZmluZSBGQ19NRU1fUEFURUxUCSAgICA4CiNkZWZpbmUgRkNfTUVNX1ZBTExJU1QJICAgIDkKI2RlZmluZSBGQ19NRU1fU1VCU1RBVEUJICAgIDEwCiNkZWZpbmUgRkNfTUVNX1NUUklORwkgICAgMTEKI2RlZmluZSBGQ19NRU1fTElTVEJVQ0sJICAgIDEyCiNkZWZpbmUgRkNfTUVNX05VTQkgICAgMTMKI2RlZmluZSBGQ19NRU1fU1RSU0VUCSAgICAxNAojZGVmaW5lIEZDX01FTV9TVFJMSVNUCSAgICAxNQojZGVmaW5lIEZDX01FTV9DT05GSUcJICAgIDE2Cgp0eXBlZGVmIGVudW0gX0ZjVmFsdWVCaW5kaW5nIHsKICAgIEZjVmFsdWVCaW5kaW5nV2VhaywgRmNWYWx1ZUJpbmRpbmdTdHJvbmcKfSBGY1ZhbHVlQmluZGluZzsKCnR5cGVkZWYgc3RydWN0IF9GY1ZhbHVlTGlzdCB7CiAgICBzdHJ1Y3QgX0ZjVmFsdWVMaXN0ICAgICpuZXh0OwogICAgRmNWYWx1ZQkJICAgIHZhbHVlOwogICAgRmNWYWx1ZUJpbmRpbmcJICAgIGJpbmRpbmc7Cn0gRmNWYWx1ZUxpc3Q7Cgp0eXBlZGVmIHN0cnVjdCBfRmNQYXR0ZXJuRWx0IHsKICAgIGNvbnN0IGNoYXIJICAgICpvYmplY3Q7CiAgICBGY1ZhbHVlTGlzdAkgICAgKnZhbHVlczsKfSBGY1BhdHRlcm5FbHQ7CgpzdHJ1Y3QgX0ZjUGF0dGVybiB7CiAgICBpbnQJCSAgICBudW07CiAgICBpbnQJCSAgICBzaXplOwogICAgRmNQYXR0ZXJuRWx0ICAgICplbHRzOwogICAgaW50CQkgICAgcmVmOwp9OwoKdHlwZWRlZiBlbnVtIF9GY09wIHsKICAgIEZjT3BJbnRlZ2VyLCBGY09wRG91YmxlLCBGY09wU3RyaW5nLCBGY09wTWF0cml4LCBGY09wQm9vbCwgRmNPcENoYXJTZXQsIAogICAgRmNPcE5pbCwKICAgIEZjT3BGaWVsZCwgRmNPcENvbnN0LAogICAgRmNPcEFzc2lnbiwgRmNPcEFzc2lnblJlcGxhY2UsIAogICAgRmNPcFByZXBlbmRGaXJzdCwgRmNPcFByZXBlbmQsIEZjT3BBcHBlbmQsIEZjT3BBcHBlbmRMYXN0LAogICAgRmNPcFF1ZXN0LAogICAgRmNPcE9yLCBGY09wQW5kLCBGY09wRXF1YWwsIEZjT3BOb3RFcXVhbCwgRmNPcENvbnRhaW5zLAogICAgRmNPcExlc3MsIEZjT3BMZXNzRXF1YWwsIEZjT3BNb3JlLCBGY09wTW9yZUVxdWFsLAogICAgRmNPcFBsdXMsIEZjT3BNaW51cywgRmNPcFRpbWVzLCBGY09wRGl2aWRlLAogICAgRmNPcE5vdCwgRmNPcENvbW1hLCBGY09wSW52YWxpZAp9IEZjT3A7Cgp0eXBlZGVmIHN0cnVjdCBfRmNFeHByIHsKICAgIEZjT3AgICBvcDsKICAgIHVuaW9uIHsKCWludAkgICAgaXZhbDsKCWRvdWJsZQkgICAgZHZhbDsKCUZjQ2hhcjgJICAgICpzdmFsOwoJRmNNYXRyaXggICAgKm12YWw7CglGY0Jvb2wJICAgIGJ2YWw7CglGY0NoYXJTZXQgICAqY3ZhbDsKCWNoYXIJICAgICpmaWVsZDsKCUZjQ2hhcjgJICAgICpjb25zdGFudDsKCXN0cnVjdCB7CgkgICAgc3RydWN0IF9GY0V4cHIgKmxlZnQsICpyaWdodDsKCX0gdHJlZTsKICAgIH0gdTsKfSBGY0V4cHI7Cgp0eXBlZGVmIGVudW0gX0ZjUXVhbCB7CiAgICBGY1F1YWxBbnksIEZjUXVhbEFsbCwgRmNRdWFsRmlyc3QsIEZjUXVhbE5vdEZpcnN0Cn0gRmNRdWFsOwoKI2RlZmluZSBGY01hdGNoRGVmYXVsdAkoKEZjTWF0Y2hLaW5kKSAtMSkKCnR5cGVkZWYgc3RydWN0IF9GY1Rlc3QgewogICAgc3RydWN0IF9GY1Rlc3QJKm5leHQ7CiAgICBGY01hdGNoS2luZAkJa2luZDsKICAgIEZjUXVhbAkJcXVhbDsKICAgIGNvbnN0IGNoYXIJCSpmaWVsZDsKICAgIEZjT3AJCW9wOwogICAgRmNFeHByCQkqZXhwcjsKfSBGY1Rlc3Q7Cgp0eXBlZGVmIHN0cnVjdCBfRmNFZGl0IHsKICAgIHN0cnVjdCBfRmNFZGl0ICpuZXh0OwogICAgY29uc3QgY2hhcgkgICAgKmZpZWxkOwogICAgRmNPcAkgICAgb3A7CiAgICBGY0V4cHIJICAgICpleHByOwogICAgRmNWYWx1ZUJpbmRpbmcgIGJpbmRpbmc7Cn0gRmNFZGl0OwoKdHlwZWRlZiBzdHJ1Y3QgX0ZjU3Vic3QgewogICAgc3RydWN0IF9GY1N1YnN0CSpuZXh0OwogICAgRmNUZXN0CQkqdGVzdDsKICAgIEZjRWRpdAkJKmVkaXQ7Cn0gRmNTdWJzdDsKCnR5cGVkZWYgc3RydWN0IF9GY0NoYXJMZWFmIHsKICAgIEZjQ2hhcjMyCW1hcFsyNTYvMzJdOwp9IEZjQ2hhckxlYWY7Cgp0eXBlZGVmIGVudW0gX0ZjTGFuZ1Jlc3VsdCB7CiAgICBGY0xhbmdFcXVhbCwgRmNMYW5nRGlmZmVyZW50Q291bnRyeSwgRmNMYW5nRGlmZmVyZW50TGFuZwp9IEZjTGFuZ1Jlc3VsdDsKCnN0cnVjdCBfRmNDaGFyU2V0IHsKICAgIGludAkJICAgIHJlZjsJLyogcmVmZXJlbmNlIGNvdW50ICovCiAgICBGY0Jvb2wJICAgIGNvbnN0YW50OwkvKiBpbiBoYXNoIHRhYmxlIGNvbnN0YW50ICovCiAgICBpbnQJCSAgICBudW07CS8qIHNpemUgb2YgbGVhdmVzIGFuZCBudW1iZXJzIGFycmF5cyAqLwogICAgRmNDaGFyTGVhZgkgICAgKipsZWF2ZXM7CiAgICBGY0NoYXIxNgkgICAgKm51bWJlcnM7Cn07CgpzdHJ1Y3QgX0ZjU3RyU2V0IHsKICAgIGludAkJICAgIHJlZjsJLyogcmVmZXJlbmNlIGNvdW50ICovCiAgICBpbnQJCSAgICBudW07CiAgICBpbnQJCSAgICBzaXplOwogICAgRmNDaGFyOAkgICAgKipzdHJzOwp9OwoKc3RydWN0IF9GY1N0ckxpc3QgewogICAgRmNTdHJTZXQJICAgICpzZXQ7CiAgICBpbnQJCSAgICBuOwp9OwoKdHlwZWRlZiBzdHJ1Y3QgX0ZjU3RyQnVmIHsKICAgIEZjQ2hhcjggKmJ1ZjsKICAgIEZjQm9vbCAgYWxsb2NhdGVkOwogICAgRmNCb29sICBmYWlsZWQ7CiAgICBpbnQJICAgIGxlbjsKICAgIGludAkgICAgc2l6ZTsKfSBGY1N0ckJ1ZjsKCi8qCiAqIFRoZSBwZXItdXNlciB+Ly5mb250cy5jYWNoZSBmaWxlIGlzIGxvYWRlZCBpbnRvCiAqIHRoaXMgZGF0YSBzdHJ1Y3R1cmUuICBFYWNoIGRpcmVjdG9yeSBnZXRzIGEgc3Vic3RydWN0dXJlCiAqIHdoaWNoIGlzIHZhbGlkYXRlZCBieSBjb21wYXJpbmcgdGhlIGRpcmVjdG9yeSB0aW1lc3RhbXAgd2l0aAogKiB0aGF0IHNhdmVkIGluIHRoZSBjYWNoZS4gIFdoZW4gdmFsaWQsIHRoZSBlbnRpcmUgZGlyZWN0b3J5IGNhY2hlCiAqIGNhbiBiZSBpbW1lZGlhdGVseSBsb2FkZWQgd2l0aG91dCByZWFkaW5nIHRoZSBkaXJlY3RvcnkuICBPdGhlcndpc2UsCiAqIHRoZSBmaWxlcyBhcmUgY2hlY2tlZCBpbmRpdmlkdWFsbHk7IHVwZGF0ZWQgZmlsZXMgYXJlIGxvYWRlZCBpbnRvIHRoZQogKiBjYWNoZSB3aGljaCBpcyB0aGVuIHJld3JpdHRlbiB0byB0aGUgdXNlcnMgaG9tZSBkaXJlY3RvcnkKICovCgojZGVmaW5lIEZDX0dMT0JBTF9DQUNIRV9ESVJfSEFTSF9TSVpFCSAgICAzNwojZGVmaW5lIEZDX0dMT0JBTF9DQUNIRV9GSUxFX0hBU0hfU0laRQkgICAgNjcKCnR5cGVkZWYgc3RydWN0IF9GY0dsb2JhbENhY2hlSW5mbyB7CiAgICB1bnNpZ25lZCBpbnQJCWhhc2g7CiAgICBGY0NoYXI4CQkJKmZpbGU7CiAgICB0aW1lX3QJCQl0aW1lOwogICAgRmNCb29sCQkJcmVmZXJlbmNlZDsKfSBGY0dsb2JhbENhY2hlSW5mbzsKCnR5cGVkZWYgc3RydWN0IF9GY0dsb2JhbENhY2hlRmlsZSB7CiAgICBzdHJ1Y3QgX0ZjR2xvYmFsQ2FjaGVGaWxlCSpuZXh0OwogICAgRmNHbG9iYWxDYWNoZUluZm8JCWluZm87CiAgICBpbnQJCQkJaWQ7CiAgICBGY0NoYXI4CQkJKm5hbWU7Cn0gRmNHbG9iYWxDYWNoZUZpbGU7Cgp0eXBlZGVmIHN0cnVjdCBfRmNHbG9iYWxDYWNoZVN1YmRpciB7CiAgICBzdHJ1Y3QgX0ZjR2xvYmFsQ2FjaGVTdWJkaXIJKm5leHQ7CiAgICBGY0NoYXI4CQkJKmZpbGU7Cn0gRmNHbG9iYWxDYWNoZVN1YmRpcjsKCnR5cGVkZWYgc3RydWN0IF9GY0dsb2JhbENhY2hlRGlyIHsKICAgIHN0cnVjdCBfRmNHbG9iYWxDYWNoZURpcgkqbmV4dDsKICAgIEZjR2xvYmFsQ2FjaGVJbmZvICAgIAlpbmZvOwogICAgaW50CQkJCWxlbjsKICAgIEZjR2xvYmFsQ2FjaGVGaWxlCQkqZW50c1tGQ19HTE9CQUxfQ0FDSEVfRklMRV9IQVNIX1NJWkVdOwogICAgRmNHbG9iYWxDYWNoZVN1YmRpcgkJKnN1YmRpcnM7Cn0gRmNHbG9iYWxDYWNoZURpcjsKCnR5cGVkZWYgc3RydWN0IF9GY0dsb2JhbENhY2hlIHsKICAgIEZjR2xvYmFsQ2FjaGVEaXIJCSplbnRzW0ZDX0dMT0JBTF9DQUNIRV9ESVJfSEFTSF9TSVpFXTsKICAgIEZjQm9vbAkJCXVwZGF0ZWQ7CiAgICBGY0Jvb2wJCQlicm9rZW47CiAgICBpbnQJCQkJZW50cmllczsKICAgIGludAkJCQlyZWZlcmVuY2VkOwp9IEZjR2xvYmFsQ2FjaGU7CgpzdHJ1Y3QgX0ZjQXRvbWljIHsKICAgIEZjQ2hhcjgJKmZpbGU7CQkvKiBvcmlnaW5hbCBmaWxlIG5hbWUgKi8KICAgIEZjQ2hhcjgJKm5ldzsJCS8qIHRlbXAgZmlsZSBuYW1lIC0tIHdyaXRlIGRhdGEgaGVyZSAqLwogICAgRmNDaGFyOAkqbGNrOwkJLyogbG9ja2ZpbGUgbmFtZSAodXNlZCBmb3IgbG9ja2luZykgKi8KICAgIEZjQ2hhcjgJKnRtcDsJCS8qIHRtcGZpbGUgbmFtZSAodXNlZCBmb3IgbG9ja2luZykgKi8KfTsKCnN0cnVjdCBfRmNCbGFua3MgewogICAgaW50CQluYmxhbms7CiAgICBpbnQJCXNibGFuazsKICAgIEZjQ2hhcjMyCSpibGFua3M7Cn07CgpzdHJ1Y3QgX0ZjQ29uZmlnIHsKICAgIC8qCiAgICAgKiBGaWxlIG5hbWVzIGxvYWRlZCBmcm9tIHRoZSBjb25maWd1cmF0aW9uIC0tIHNhdmVkIGhlcmUgYXMgdGhlCiAgICAgKiBjYWNoZSBmaWxlIG11c3QgYmUgY29uc3VsdGVkIGJlZm9yZSB0aGUgZGlyZWN0b3JpZXMgYXJlIHNjYW5uZWQsCiAgICAgKiBhbmQgdGhvc2UgZGlyZWN0aXZlcyBtYXkgb2NjdXIgaW4gYW55IG9yZGVyCiAgICAgKi8KICAgIEZjU3RyU2V0CSpjb25maWdEaXJzOwkgICAgLyogZGlyZWN0b3JpZXMgdG8gc2NhbiBmb3IgZm9udHMgKi8KICAgIEZjQ2hhcjgJKmNhY2hlOwkJICAgIC8qIG5hbWUgb2YgcGVyLXVzZXIgY2FjaGUgZmlsZSAqLwogICAgLyoKICAgICAqIFNldCBvZiBhbGxvd2VkIGJsYW5rIGNoYXJzIC0tIHVzZWQgdG8KICAgICAqIHRyaW0gZm9udHMgb2YgYm9ndXMgZ2x5cGhzCiAgICAgKi8KICAgIEZjQmxhbmtzCSpibGFua3M7CiAgICAvKgogICAgICogTGlzdCBvZiBkaXJlY3RvcmllcyBjb250YWluaW5nIGZvbnRzLAogICAgICogYnVpbHQgYnkgcmVjdXJzaXZlbHkgc2Nhbm5pbmcgdGhlIHNldCAKICAgICAqIG9mIGNvbmZpZ3VyZWQgZGlyZWN0b3JpZXMKICAgICAqLwogICAgRmNTdHJTZXQJKmZvbnREaXJzOwogICAgLyoKICAgICAqIE5hbWVzIG9mIGFsbCBvZiB0aGUgY29uZmlndXJhdGlvbiBmaWxlcyB1c2VkCiAgICAgKiB0byBjcmVhdGUgdGhpcyBjb25maWd1cmF0aW9uCiAgICAgKi8KICAgIEZjU3RyU2V0CSpjb25maWdGaWxlczsJICAgIC8qIGNvbmZpZyBmaWxlcyBsb2FkZWQgKi8KICAgIC8qCiAgICAgKiBTdWJzdGl0dXRpb24gaW5zdHJ1Y3Rpb25zIGZvciBwYXR0ZXJucyBhbmQgZm9udHM7CiAgICAgKiBtYXhPYmplY3RzIGlzIHVzZWQgdG8gYWxsb2NhdGUgYXBwcm9wcmlhdGUgaW50ZXJtZWRpYXRlIHN0b3JhZ2UKICAgICAqIHdoaWxlIHBlcmZvcm1pbmcgYSB3aG9sZSBzZXQgb2Ygc3Vic3RpdHV0aW9ucwogICAgICovCiAgICBGY1N1YnN0CSpzdWJzdFBhdHRlcm47CSAgICAvKiBzdWJzdGl0dXRpb25zIGZvciBwYXR0ZXJucyAqLwogICAgRmNTdWJzdAkqc3Vic3RGb250OwkgICAgLyogc3Vic3RpdHV0aW9ucyBmb3IgZm9udHMgKi8KICAgIGludAkJbWF4T2JqZWN0czsJICAgIC8qIG1heGltdW0gbnVtYmVyIG9mIHRlc3RzIGluIGFsbCBzdWJzdHMgKi8KICAgIC8qCiAgICAgKiBUaGUgc2V0IG9mIGZvbnRzIGxvYWRlZCBmcm9tIHRoZSBsaXN0ZWQgZGlyZWN0b3JpZXM7IHRoZQogICAgICogb3JkZXIgd2l0aGluIHRoZSBzZXQgZG9lcyBub3QgZGV0ZXJtaW5lIHRoZSBmb250IHNlbGVjdGlvbiwKICAgICAqIGV4Y2VwdCBpbiB0aGUgY2FzZSBvZiBpZGVudGljYWwgbWF0Y2hlcyBpbiB3aGljaCBjYXNlIGVhcmxpZXIgZm9udHMKICAgICAqIG1hdGNoIHByZWZlcnJlbnRpYWxseQogICAgICovCiAgICBGY0ZvbnRTZXQJKmZvbnRzW0ZjU2V0QXBwbGljYXRpb24gKyAxXTsKICAgIC8qCiAgICAgKiBGb250Y29uZmlnIGNhbiBwZXJpb2RpY2FsbHkgcmVzY2FuIHRoZSBzeXN0ZW0gY29uZmlndXJhdGlvbgogICAgICogYW5kIGZvbnQgZGlyZWN0b3JpZXMuICBUaGlzIHJlc2Nhbm5pbmcgb2NjdXJzIHdoZW4gZm9udAogICAgICogbGlzdGluZyByZXF1ZXN0cyBhcmUgbWFkZSwgYnV0IG5vIG1vcmUgb2Z0ZW4gdGhhbiByZXNjYW5JbnRlcnZhbAogICAgICogc2Vjb25kcyBhcGFydC4KICAgICAqLwogICAgdGltZV90CXJlc2NhblRpbWU7CSAgICAvKiBsYXN0IHRpbWUgaW5mb3JtYXRpb24gd2FzIHNjYW5uZWQgKi8KICAgIGludAkJcmVzY2FuSW50ZXJ2YWw7CSAgICAvKiBpbnRlcnZhbCBiZXR3ZWVuIHNjYW5zICovCn07CiAKZXh0ZXJuIEZjQ29uZmlnCSpfZmNDb25maWc7Cgp0eXBlZGVmIHN0cnVjdCBfRmNDaGFyTWFwIEZjQ2hhck1hcDsKCi8qIGZjYmxhbmtzLmMgKi8KCi8qIGZjY2FjaGUuYyAqLwoKRmNHbG9iYWxDYWNoZSAqCkZjR2xvYmFsQ2FjaGVDcmVhdGUgKHZvaWQpOwoKdm9pZApGY0dsb2JhbENhY2hlRGVzdHJveSAoRmNHbG9iYWxDYWNoZSAqY2FjaGUpOwoKRmNCb29sCkZjR2xvYmFsQ2FjaGVDaGVja1RpbWUgKEZjR2xvYmFsQ2FjaGVJbmZvICppbmZvKTsKCnZvaWQKRmNHbG9iYWxDYWNoZVJlZmVyZW5jZWQgKEZjR2xvYmFsQ2FjaGUJICAgICpjYWNoZSwKCQkJIEZjR2xvYmFsQ2FjaGVJbmZvICAqaW5mbyk7CgpGY0dsb2JhbENhY2hlRGlyICoKRmNHbG9iYWxDYWNoZURpckdldCAoRmNHbG9iYWxDYWNoZSAgKmNhY2hlLAoJCSAgICAgY29uc3QgRmNDaGFyOCAgKmRpciwKCQkgICAgIGludAkgICAgbGVuLAoJCSAgICAgRmNCb29sCSAgICBjcmVhdGVfbWlzc2luZyk7CgpGY0Jvb2wKRmNHbG9iYWxDYWNoZVNjYW5EaXIgKEZjRm9udFNldAkJKnNldCwKCQkgICAgICBGY1N0clNldAkJKmRpcnMsCgkJICAgICAgRmNHbG9iYWxDYWNoZQkqY2FjaGUsCgkJICAgICAgY29uc3QgRmNDaGFyOAkqZGlyKTsKCkZjR2xvYmFsQ2FjaGVGaWxlICoKRmNHbG9iYWxDYWNoZUZpbGVHZXQgKEZjR2xvYmFsQ2FjaGUgKmNhY2hlLAoJCSAgICAgIGNvbnN0IEZjQ2hhcjggKmZpbGUsCgkJICAgICAgaW50CSAgICBpZCwKCQkgICAgICBpbnQJICAgICpjb3VudCk7CgoKdm9pZApGY0dsb2JhbENhY2hlTG9hZCAoRmNHbG9iYWxDYWNoZSAgICAqY2FjaGUsCgkJICAgY29uc3QgRmNDaGFyOCAgICAqY2FjaGVfZmlsZSk7CgpGY0Jvb2wKRmNHbG9iYWxDYWNoZVVwZGF0ZSAoRmNHbG9iYWxDYWNoZSAgKmNhY2hlLAoJCSAgICAgY29uc3QgRmNDaGFyOCAgKmZpbGUsCgkJICAgICBpbnQJICAgIGlkLAoJCSAgICAgY29uc3QgRmNDaGFyOCAgKm5hbWUpOwoKRmNCb29sCkZjR2xvYmFsQ2FjaGVTYXZlIChGY0dsb2JhbENhY2hlICAgICpjYWNoZSwKCQkgICBjb25zdCBGY0NoYXI4ICAgICpjYWNoZV9maWxlKTsKCkZjQm9vbApGY0RpckNhY2hlUmVhZERpciAoRmNGb250U2V0ICpzZXQsIEZjU3RyU2V0ICpkaXJzLCBjb25zdCBGY0NoYXI4ICpkaXIpOwoKRmNCb29sCkZjRGlyQ2FjaGVXcml0ZURpciAoRmNGb250U2V0ICpzZXQsIEZjU3RyU2V0ICpkaXJzLCBjb25zdCBGY0NoYXI4ICpkaXIpOwogICAgCi8qIGZjY2ZnLmMgKi8KCkZjQm9vbApGY0NvbmZpZ0FkZENvbmZpZ0RpciAoRmNDb25maWcJICAgICpjb25maWcsCgkJICAgICAgY29uc3QgRmNDaGFyOCAqZCk7CgpGY0Jvb2wKRmNDb25maWdBZGRGb250RGlyIChGY0NvbmZpZwkgICAgKmNvbmZpZywKCQkgICAgY29uc3QgRmNDaGFyOCAgICpkKTsKCkZjQm9vbApGY0NvbmZpZ0FkZERpciAoRmNDb25maWcJKmNvbmZpZywKCQljb25zdCBGY0NoYXI4CSpkKTsKCkZjQm9vbApGY0NvbmZpZ0FkZENvbmZpZ0ZpbGUgKEZjQ29uZmlnCQkqY29uZmlnLAoJCSAgICAgICBjb25zdCBGY0NoYXI4CSpmKTsKCkZjQm9vbApGY0NvbmZpZ1NldENhY2hlIChGY0NvbmZpZwkqY29uZmlnLAoJCSAgY29uc3QgRmNDaGFyOAkqYyk7CgpGY0Jvb2wKRmNDb25maWdBZGRCbGFuayAoRmNDb25maWcJKmNvbmZpZywKCQkgIEZjQ2hhcjMyICAgIAlibGFuayk7CgpGY0Jvb2wKRmNDb25maWdBZGRFZGl0IChGY0NvbmZpZwkqY29uZmlnLAoJCSBGY1Rlc3QJCSp0ZXN0LAoJCSBGY0VkaXQJCSplZGl0LAoJCSBGY01hdGNoS2luZAlraW5kKTsKCnZvaWQKRmNDb25maWdTZXRGb250cyAoRmNDb25maWcJKmNvbmZpZywKCQkgIEZjRm9udFNldAkqZm9udHMsCgkJICBGY1NldE5hbWUJc2V0KTsKCkZjQm9vbApGY0NvbmZpZ0NvbXBhcmVWYWx1ZSAoY29uc3QgRmNWYWx1ZSBtLAoJCSAgICAgIEZjT3AJICAgIG9wLAoJCSAgICAgIGNvbnN0IEZjVmFsdWUgdik7CgovKiBmY2NoYXJzZXQuYyAqLwpGY0NoYXJTZXQgKgpGY0NoYXJTZXRGcmVlemUgKEZjQ2hhclNldCAqY3MpOwoKRmNCb29sCkZjTmFtZVVucGFyc2VDaGFyU2V0IChGY1N0ckJ1ZiAqYnVmLCBjb25zdCBGY0NoYXJTZXQgKmMpOwoKRmNDaGFyU2V0ICoKRmNOYW1lUGFyc2VDaGFyU2V0IChGY0NoYXI4ICpzdHJpbmcpOwoKRmNDaGFyMzIKRmNGcmVlVHlwZVVjczRUb1ByaXZhdGUgKEZjQ2hhcjMyIHVjczQsIGNvbnN0IEZjQ2hhck1hcCAqbWFwKTsKCkZjQ2hhcjMyCkZjRnJlZVR5cGVQcml2YXRlVG9VY3M0IChGY0NoYXIzMiBwcml2YXRlLCBjb25zdCBGY0NoYXJNYXAgKm1hcCk7Cgpjb25zdCBGY0NoYXJNYXAgKgpGY0ZyZWVUeXBlR2V0UHJpdmF0ZU1hcCAoRlRfRW5jb2RpbmcgZW5jb2RpbmcpOwogICAgCi8qIGZjZGJnLmMgKi8Kdm9pZApGY1ZhbHVlTGlzdFByaW50IChjb25zdCBGY1ZhbHVlTGlzdCAqbCk7Cgp2b2lkCkZjT3BQcmludCAoRmNPcCBvcCk7Cgp2b2lkCkZjVGVzdFByaW50IChjb25zdCBGY1Rlc3QgKnRlc3QpOwoKdm9pZApGY0V4cHJQcmludCAoY29uc3QgRmNFeHByICpleHByKTsKCnZvaWQKRmNFZGl0UHJpbnQgKGNvbnN0IEZjRWRpdCAqZWRpdCk7Cgp2b2lkCkZjU3Vic3RQcmludCAoY29uc3QgRmNTdWJzdCAqc3Vic3QpOwoKaW50CkZjRGVidWcgKHZvaWQpOwoKLyogZmNkaXIuYyAqLwoKLyogZmNmb250LmMgKi8KaW50CkZjRm9udERlYnVnICh2b2lkKTsKICAgIAovKiBmY2ZyZWV0eXBlLmMgKi8KRmNCb29sCkZjRnJlZVR5cGVJc0V4Y2x1c2l2ZUxhbmcgKGNvbnN0IEZjQ2hhcjggICpsYW5nKTsKCkZjQm9vbApGY0ZyZWVUeXBlSGFzTGFuZyAoRmNQYXR0ZXJuICpwYXR0ZXJuLCBjb25zdCBGY0NoYXI4ICpsYW5nKTsKCi8qIGZjZnMuYyAqLwovKiBmY2dyYW0ueSAqLwppbnQKRmNDb25maWdwYXJzZSAodm9pZCk7CgppbnQKRmNDb25maWd3cmFwICh2b2lkKTsKICAgIAp2b2lkCkZjQ29uZmlnZXJyb3IgKGNoYXIgKmZtdCwgLi4uKTsKICAgIApjaGFyICoKRmNDb25maWdTYXZlRmllbGQgKGNvbnN0IGNoYXIgKmZpZWxkKTsKCkZjVGVzdCAqCkZjVGVzdENyZWF0ZSAoRmNNYXRjaEtpbmQgICBraW5kLAoJICAgICAgRmNRdWFsCSAgICBxdWFsLAoJICAgICAgY29uc3QgRmNDaGFyOCAqZmllbGQsCgkgICAgICBGY09wCSAgICBjb21wYXJlLAoJICAgICAgRmNFeHByCSAgICAqZXhwcik7Cgp2b2lkCkZjVGVzdERlc3Ryb3kgKEZjVGVzdCAqdGVzdCk7CgpGY0V4cHIgKgpGY0V4cHJDcmVhdGVJbnRlZ2VyIChpbnQgaSk7CgpGY0V4cHIgKgpGY0V4cHJDcmVhdGVEb3VibGUgKGRvdWJsZSBkKTsKCkZjRXhwciAqCkZjRXhwckNyZWF0ZVN0cmluZyAoY29uc3QgRmNDaGFyOCAqcyk7CgpGY0V4cHIgKgpGY0V4cHJDcmVhdGVNYXRyaXggKGNvbnN0IEZjTWF0cml4ICptKTsKCkZjRXhwciAqCkZjRXhwckNyZWF0ZUJvb2wgKEZjQm9vbCBiKTsKCkZjRXhwciAqCkZjRXhwckNyZWF0ZU5pbCAodm9pZCk7CgpGY0V4cHIgKgpGY0V4cHJDcmVhdGVGaWVsZCAoY29uc3QgY2hhciAqZmllbGQpOwoKRmNFeHByICoKRmNFeHByQ3JlYXRlQ29uc3QgKGNvbnN0IEZjQ2hhcjggKmNvbnN0YW50KTsKCkZjRXhwciAqCkZjRXhwckNyZWF0ZU9wIChGY0V4cHIgKmxlZnQsIEZjT3Agb3AsIEZjRXhwciAqcmlnaHQpOwoKdm9pZApGY0V4cHJEZXN0cm95IChGY0V4cHIgKmUpOwoKRmNFZGl0ICoKRmNFZGl0Q3JlYXRlIChjb25zdCBjaGFyICpmaWVsZCwgRmNPcCBvcCwgRmNFeHByICpleHByLCBGY1ZhbHVlQmluZGluZyBiaW5kaW5nKTsKCnZvaWQKRmNFZGl0RGVzdHJveSAoRmNFZGl0ICplKTsKCi8qIGZjaW5pdC5jICovCgp2b2lkCkZjTWVtUmVwb3J0ICh2b2lkKTsKCnZvaWQKRmNNZW1BbGxvYyAoaW50IGtpbmQsIGludCBzaXplKTsKCnZvaWQKRmNNZW1GcmVlIChpbnQga2luZCwgaW50IHNpemUpOwoKLyogZmNsYW5nLmMgKi8KRmNCb29sCkZjRnJlZVR5cGVTZXRMYW5nIChGY1BhdHRlcm4JICAgICpwYXR0ZXJuLCAKCQkgICBGY0NoYXJTZXQJICAgICpjaGFyc2V0LCAKCQkgICBjb25zdCBGY0NoYXI4ICAgICpleGNsdXNpdmVMYW5nKTsKCkZjTGFuZ1Jlc3VsdApGY0xhbmdDb21wYXJlIChjb25zdCBGY0NoYXI4ICpzMSwgY29uc3QgRmNDaGFyOCAqczIpOwogICAgCmNvbnN0IEZjQ2hhclNldCAqCkZjQ2hhclNldEZvckxhbmcgKGNvbnN0IEZjQ2hhcjggKmxhbmcpOwoKLyogZmNsaXN0LmMgKi8KCi8qIGZjbWF0Y2guYyAqLwoKLyogZmNuYW1lLmMgKi8KCkZjQm9vbApGY05hbWVCb29sIChGY0NoYXI4ICp2LCBGY0Jvb2wgKnJlc3VsdCk7CgovKiBmY3BhdC5jICovCnZvaWQKRmNWYWx1ZUxpc3REZXN0cm95IChGY1ZhbHVlTGlzdCAqbCk7CiAgICAKRmNQYXR0ZXJuRWx0ICoKRmNQYXR0ZXJuRmluZEVsdCAoY29uc3QgRmNQYXR0ZXJuICpwLCBjb25zdCBjaGFyICpvYmplY3QpOwoKRmNQYXR0ZXJuRWx0ICoKRmNQYXR0ZXJuSW5zZXJ0RWx0IChGY1BhdHRlcm4gKnAsIGNvbnN0IGNoYXIgKm9iamVjdCk7CgpGY0Jvb2wKRmNQYXR0ZXJuQWRkV2l0aEJpbmRpbmcgIChGY1BhdHRlcm4JICAgICpwLAoJCQkgIGNvbnN0IGNoYXIJICAgICpvYmplY3QsCgkJCSAgRmNWYWx1ZQkgICAgdmFsdWUsCgkJCSAgRmNWYWx1ZUJpbmRpbmcgICAgYmluZGluZywKCQkJICBGY0Jvb2wJICAgIGFwcGVuZCk7CgovKiBmY3JlbmRlci5jICovCgovKiBmY21hdHJpeC5jICovCgpleHRlcm4gY29uc3QgRmNNYXRyaXggICAgRmNJZGVudGl0eU1hdHJpeDsKCnZvaWQKRmNNYXRyaXhGcmVlIChGY01hdHJpeCAqbWF0KTsKCi8qIGZjc3RyLmMgKi8KRmNDaGFyOCAqCkZjU3RyUGx1cyAoY29uc3QgRmNDaGFyOCAqczEsIGNvbnN0IEZjQ2hhcjggKnMyKTsKICAgIAp2b2lkCkZjU3RyRnJlZSAoRmNDaGFyOCAqcyk7Cgp2b2lkCkZjU3RyQnVmSW5pdCAoRmNTdHJCdWYgKmJ1ZiwgRmNDaGFyOCAqaW5pdCwgaW50IHNpemUpOwoKdm9pZApGY1N0ckJ1ZkRlc3Ryb3kgKEZjU3RyQnVmICpidWYpOwoKRmNDaGFyOCAqCkZjU3RyQnVmRG9uZSAoRmNTdHJCdWYgKmJ1Zik7CgpGY0Jvb2wKRmNTdHJCdWZDaGFyIChGY1N0ckJ1ZiAqYnVmLCBGY0NoYXI4IGMpOwoKRmNCb29sCkZjU3RyQnVmU3RyaW5nIChGY1N0ckJ1ZiAqYnVmLCBjb25zdCBGY0NoYXI4ICpzKTsKCkZjQm9vbApGY1N0ckJ1ZkRhdGEgKEZjU3RyQnVmICpidWYsIGNvbnN0IEZjQ2hhcjggKnMsIGludCBsZW4pOwoKaW50CkZjU3RyQ21wSWdub3JlQmxhbmtzQW5kQ2FzZSAoY29uc3QgRmNDaGFyOCAqczEsIGNvbnN0IEZjQ2hhcjggKnMyKTsKCiNlbmRpZiAvKiBfRkNfSU5UX0hfICovCg==