Ci8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAoKqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAxLiAgICBJTlRST0RVQ1RJT04KVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwp0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCgpBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQppbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydApvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KClBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwppbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCnRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCnRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwpzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCgpDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAphcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCgoyLiAgICBDT1BZUklHSFQgTElDRU5TRQoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CnBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKCllvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCnlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCgpZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCllvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgoKVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dApwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCgpZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCnNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgoKWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCiJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCgozLiAgICBOTyBQQVRFTlQgTElDRU5TRQoKTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCkFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCnJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KCllvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZApieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCgo0LiAgICBESVNDTEFJTUVSCgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwpvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgpDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCmluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCm9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCmFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgoKNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgoKRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCkF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCkFtIFdvbGZzbWFudGVsIDMzCjkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Cgp3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCmFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgojaWYgKFFNRl9OT19QT0xZPT01KQoKI2RlZmluZSBGVU5DVElPTl9xbWZGb3J3YXJkTW9kdWxhdGlvbkxQX29kZAoKI2lmZGVmIEZVTkNUSU9OX3FtZkZvcndhcmRNb2R1bGF0aW9uTFBfb2RkCnN0YXRpYyB2b2lkCnFtZkZvcndhcmRNb2R1bGF0aW9uTFBfb2RkKCBIQU5ETEVfUU1GX0ZJTFRFUl9CQU5LIGFuYVFtZiwgLyohPCBIYW5kbGUgb2YgUW1mIEFuYWx5c2lzIEJhbmsgICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGSVhQX1FNRiAqdGltZUluLCAgICAgICAgLyohPCBUaW1lIFNpZ25hbCAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9RTUYgKnJTdWJiYW5kICkgICAgICAgICAgIC8qITwgUmVhbCBPdXRwdXQgKi8KewogIGludCBpOwogIGludCBMID0gYW5hUW1mLT5ub19jaGFubmVsczsKICBpbnQgTSA9IEw+PjE7CiAgaW50IHNoaWZ0ID0gKGFuYVFtZi0+bm9fY2hhbm5lbHM+PjYpICsgMTsKICBpbnQgclN1YmJhbmRfZSA9IDA7CgogIEZJWFBfUU1GICpyU3ViYmFuZFB0cjAgPSAmclN1YmJhbmRbTSswXTsgICAgICAgICAgICAgICAgLyogcnVucyB3aXRoIGluY3JlbWVudCAqLwogIEZJWFBfUU1GICpyU3ViYmFuZFB0cjEgPSAmclN1YmJhbmRbTS0xXTsgICAgICAgICAgICAgICAgLyogcnVucyB3aXRoIGRlY3JlbWVudCAqLwogIEZJWFBfUU1GICp0aW1lSW4wID0gKEZJWFBfREJMICopICZ0aW1lSW5bMF07ICAgICAgICAgICAgLyogcnVucyB3aXRoIGluY3JlbWVudCAqLwogIEZJWFBfUU1GICp0aW1lSW4xID0gKEZJWFBfREJMICopICZ0aW1lSW5bTF07ICAgICAgICAgICAgLyogcnVucyB3aXRoIGluY3JlbWVudCAqLwogIEZJWFBfUU1GICp0aW1lSW4yID0gKEZJWFBfREJMICopICZ0aW1lSW5bTC0xXTsgICAgICAgICAgLyogcnVucyB3aXRoIGRlY3JlbWVudCAqLwogIEZJWFBfUU1GICp0aW1lSW4zID0gKEZJWFBfREJMICopICZ0aW1lSW5bMipMLTFdOyAgICAgICAgLyogcnVucyB3aXRoIGRlY3JlbWVudCAqLwoKICBmb3IgKGkgPSAwOyBpIDwgTTsgaSsrKQogIHsKICAgICpyU3ViYmFuZFB0cjArKyA9ICgqdGltZUluMi0tID4+IDEpIC0gKCp0aW1lSW4wKysgPj4gc2hpZnQpOwogICAgKnJTdWJiYW5kUHRyMS0tID0gKCp0aW1lSW4xKysgPj4gMSkgKyAoKnRpbWVJbjMtLSA+PiBzaGlmdCk7CiAgfQoKICBkY3RfSVYoclN1YmJhbmQsTCwgJnJTdWJiYW5kX2UpOwp9CiNlbmRpZiAvKiBGVU5DVElPTl9xbWZGb3J3YXJkTW9kdWxhdGlvbkxQX29kZCAqLwoKCi8qIE5FT04gb3B0aW1pemVkIFFNRiBjdXJyZW50bHkgYnVpbHRzIG9ubHkgd2l0aCBSVkNUIHRvb2xjaGFpbiAqLwoKI2lmIGRlZmluZWQoX19BUk1fQVJDSF82X18pIHx8IGRlZmluZWQoX19BUk1fQVJDSF81VEVfXykKCiNpZiAoU0FNUExFX0JJVFMgPT0gMTYpCiNkZWZpbmUgRlVOQ1RJT05fcW1mQW5hUHJvdG90eXBlRmlyU2xvdAojZW5kaWYKCiNpZmRlZiBGVU5DVElPTl9xbWZBbmFQcm90b3R5cGVGaXJTbG90CgojaWYgZGVmaW5lZChfX0dOVUNfXykJLyogY3BwcCByZXBsYWNlZDogZWxpZiAqLwoKaW5saW5lIElOVCBTTVVMQkIgKGNvbnN0IFNIT1JUIGEsIGNvbnN0IExPTkcgYikKewogIElOVCByZXN1bHQgOwogIF9fYXNtX18gKCJzbXVsYmIgJTAsICUxLCAlMiIKICAgICA6ICI9ciIgKHJlc3VsdCkKICAgICA6ICJyIiAoYSksICJyIiAoYikpIDsKICByZXR1cm4gcmVzdWx0IDsKfQppbmxpbmUgSU5UIFNNVUxCVCAoY29uc3QgU0hPUlQgYSwgY29uc3QgTE9ORyBiKQp7CiAgSU5UIHJlc3VsdCA7CiAgX19hc21fXyAoInNtdWxidCAlMCwgJTEsICUyIgogICAgIDogIj1yIiAocmVzdWx0KQogICAgIDogInIiIChhKSwgInIiIChiKSkgOwogIHJldHVybiByZXN1bHQgOwp9CgppbmxpbmUgSU5UIFNNTEFCQihjb25zdCBMT05HIGFjY3UsIGNvbnN0IFNIT1JUIGEsIGNvbnN0IExPTkcgYikKewogIElOVCByZXN1bHQgOwogIF9fYXNtX18gKCJzbWxhYmIgJTAsICUxLCAlMiwlMyIKICAgICA6ICI9ciIgKHJlc3VsdCkKICAgICA6ICJyIiAoYSksICJyIiAoYiksICJyIiAoYWNjdSkpIDsKICByZXR1cm4gcmVzdWx0Owp9CmlubGluZSBJTlQgU01MQUJUKGNvbnN0IExPTkcgYWNjdSwgY29uc3QgU0hPUlQgYSwgY29uc3QgTE9ORyBiKQp7CiAgSU5UIHJlc3VsdCA7CiAgX19hc21fXyAoInNtbGFidCAlMCwgJTEsICUyLCUzIgogICAgIDogIj1yIiAocmVzdWx0KQogICAgIDogInIiIChhKSwgInIiIChiKSwgInIiIChhY2N1KSkgOwogIHJldHVybiByZXN1bHQ7Cn0KI2VuZGlmIC8qIGNvbXBpbGVyIHNlbGVjdGlvbiAgKi8KCgp2b2lkIHFtZkFuYVByb3RvdHlwZUZpclNsb3QoIEZJWFBfUU1GICphbmFseXNpc0J1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgbm9fY2hhbm5lbHMsICAgICAgICAgICAgIC8qITwgTnVtYmVyIGNoYW5uZWxzIG9mIGFuYWx5c2lzIGZpbHRlciAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZJWFBfUEZUICpwX2ZpbHRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgcF9zdHJpZGUsICAgICAgICAgICAgICAgIC8qITwgU3RpZGUgb2YgYW5hbHlzaXMgZmlsdGVyICAgICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9RQVMgKlJFU1RSSUNUIHBGaWx0ZXJTdGF0ZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKewogIExPTkcgKnBfZmx0ID0gKExPTkcgKikgcF9maWx0ZXI7CiAgTE9ORyBmbHQ7CiAgRklYUF9RTUYgKlJFU1RSSUNUIHBEYXRhXzAgPSBhbmFseXNpc0J1ZmZlciArIDIqbm9fY2hhbm5lbHMgLSAxOwogIEZJWFBfUU1GICpSRVNUUklDVCBwRGF0YV8xID0gYW5hbHlzaXNCdWZmZXI7CgogIEZJWFBfUUFTICpSRVNUUklDVCBzdGFfMCA9IChGSVhQX1FBUyAqKXBGaWx0ZXJTdGF0ZXM7CiAgRklYUF9RQVMgKlJFU1RSSUNUIHN0YV8xID0gKEZJWFBfUUFTICopcEZpbHRlclN0YXRlcyArICgyKlFNRl9OT19QT0xZKm5vX2NoYW5uZWxzKSAtIDE7CgogIEZJWFBfREJMIGFjY3UwLCBhY2N1MTsKICBGSVhQX1FBUyBzdGEwLCBzdGExOwoKICBpbnQgc3RhU3RlcDEgPSAgbm9fY2hhbm5lbHM8PDE7CiAgaW50IHN0YVN0ZXAyID0gKG5vX2NoYW5uZWxzPDwzKSAtIDE7IC8qIFJld2luZCBvbmUgbGVzcyAqLwoKICBpZiAocF9zdHJpZGUgPT0gMSkKICB7CiAgICAvKiBGSVIgZmlsdGVyIDAgKi8KICAgIGZsdCA9ICpwX2ZsdCsrOwogICAgc3RhMSA9ICpzdGFfMTsgIHN0YV8xIC09IHN0YVN0ZXAxOwogICAgYWNjdTEgPSBTTVVMQkIoICAgICAgICBzdGExLCBmbHQpOwogICAgc3RhMSA9ICpzdGFfMTsgIHN0YV8xIC09IHN0YVN0ZXAxOwogICAgYWNjdTEgPSBTTUxBQlQoIGFjY3UxLCBzdGExLCBmbHQpOwoKICAgIGZsdCA9ICpwX2ZsdCsrOwogICAgc3RhMSA9ICpzdGFfMTsgIHN0YV8xIC09IHN0YVN0ZXAxOwogICAgYWNjdTEgPSBTTUxBQkIoIGFjY3UxLCBzdGExLCBmbHQpOwogICAgc3RhMSA9ICpzdGFfMTsgIHN0YV8xIC09IHN0YVN0ZXAxOwogICAgYWNjdTEgPSBTTUxBQlQoIGFjY3UxLCBzdGExLCBmbHQpOwoKICAgIGZsdCA9ICpwX2ZsdCsrOwogICAgc3RhMSA9ICpzdGFfMTsgIHN0YV8xICs9IHN0YVN0ZXAyOwogICAgYWNjdTEgPSBTTUxBQkIoIGFjY3UxLCBzdGExLCBmbHQpOwogICAgKnBEYXRhXzErKyA9IEZYX0RCTDJGWF9RTUYoYWNjdTE8PDEpOwoKICAgIC8qIEZJUiBmaWx0ZXJzIDEuLjYzIDEyNy4uNjUgb3IgMS4uMzEgNjMuLjMzICovCiAgICBub19jaGFubmVscyA+Pj0gMTsKICAgIGZvciAoOyAtLW5vX2NoYW5uZWxzOyApCiAgICB7CiAgICAgIHN0YTAgPSAqc3RhXzA7IHN0YV8wICs9IHN0YVN0ZXAxOyAgLyogMSwzLDUsIC4uLiAyOS82MSAqLwogICAgICBzdGExID0gKnN0YV8xOyBzdGFfMSAtPSBzdGFTdGVwMTsKICAgICAgYWNjdTAgPSBTTVVMQlQoICAgICAgICBzdGEwLCBmbHQpOwogICAgICBhY2N1MSA9IFNNVUxCVCggICAgICAgIHN0YTEsIGZsdCk7CgogICAgICBmbHQgPSAqcF9mbHQrKzsKICAgICAgc3RhMCA9ICpzdGFfMDsgc3RhXzAgKz0gc3RhU3RlcDE7CiAgICAgIHN0YTEgPSAqc3RhXzE7IHN0YV8xIC09IHN0YVN0ZXAxOwogICAgICBhY2N1MCA9IFNNTEFCQiggYWNjdTAsIHN0YTAsIGZsdCk7CiAgICAgIGFjY3UxID0gU01MQUJCKCBhY2N1MSwgc3RhMSwgZmx0KTsKCiAgICAgIHN0YTAgPSAqc3RhXzA7IHN0YV8wICs9IHN0YVN0ZXAxOwogICAgICBzdGExID0gKnN0YV8xOyBzdGFfMSAtPSBzdGFTdGVwMTsKICAgICAgYWNjdTAgPSBTTUxBQlQoIGFjY3UwLCBzdGEwLCBmbHQpOwogICAgICBhY2N1MSA9IFNNTEFCVCggYWNjdTEsIHN0YTEsIGZsdCk7CgogICAgICBmbHQgPSAqcF9mbHQrKzsKICAgICAgc3RhMCA9ICpzdGFfMDsgc3RhXzAgKz0gc3RhU3RlcDE7CiAgICAgIHN0YTEgPSAqc3RhXzE7IHN0YV8xIC09IHN0YVN0ZXAxOwogICAgICBhY2N1MCA9IFNNTEFCQiggYWNjdTAsIHN0YTAsIGZsdCk7CiAgICAgIGFjY3UxID0gU01MQUJCKCBhY2N1MSwgc3RhMSwgZmx0KTsKCiAgICAgIHN0YTAgPSAqc3RhXzA7IHN0YV8wIC09IHN0YVN0ZXAyOwogICAgICBzdGExID0gKnN0YV8xOyBzdGFfMSArPSBzdGFTdGVwMjsKICAgICAgYWNjdTAgPSBTTUxBQlQoIGFjY3UwLCBzdGEwLCBmbHQpOwogICAgICBhY2N1MSA9IFNNTEFCVCggYWNjdTEsIHN0YTEsIGZsdCk7CgogICAgICAqcERhdGFfMC0tID0gRlhfREJMMkZYX1FNRihhY2N1MDw8MSk7CiAgICAgICpwRGF0YV8xKysgPSBGWF9EQkwyRlhfUU1GKGFjY3UxPDwxKTsKCiAgICAgIC8qIFNhbWUgc2VxdWVuY2UgYXMgYWJvdmUsIGJ1dCBtaXggQj1ib3R0b20gd2l0aCBUPVRvcCAqLwoKICAgICAgZmx0ID0gKnBfZmx0Kys7CiAgICAgIHN0YTAgPSAqc3RhXzA7IHN0YV8wICs9IHN0YVN0ZXAxOyAgLyogMiw0LDYsIC4uLiAzMC82MiAqLwogICAgICBzdGExID0gKnN0YV8xOyBzdGFfMSAtPSBzdGFTdGVwMTsKICAgICAgYWNjdTAgPSBTTVVMQkIoICAgICAgICBzdGEwLCBmbHQpOwogICAgICBhY2N1MSA9IFNNVUxCQiggICAgICAgIHN0YTEsIGZsdCk7CgogICAgICBzdGEwID0gKnN0YV8wOyBzdGFfMCArPSBzdGFTdGVwMTsKICAgICAgc3RhMSA9ICpzdGFfMTsgc3RhXzEgLT0gc3RhU3RlcDE7CiAgICAgIGFjY3UwID0gU01MQUJUKCBhY2N1MCwgc3RhMCwgZmx0KTsKICAgICAgYWNjdTEgPSBTTUxBQlQoIGFjY3UxLCBzdGExLCBmbHQpOwoKICAgICAgZmx0ID0gKnBfZmx0Kys7CiAgICAgIHN0YTAgPSAqc3RhXzA7IHN0YV8wICs9IHN0YVN0ZXAxOwogICAgICBzdGExID0gKnN0YV8xOyBzdGFfMSAtPSBzdGFTdGVwMTsKICAgICAgYWNjdTAgPSBTTUxBQkIoIGFjY3UwLCBzdGEwLCBmbHQpOwogICAgICBhY2N1MSA9IFNNTEFCQiggYWNjdTEsIHN0YTEsIGZsdCk7CgogICAgICBzdGEwID0gKnN0YV8wOyBzdGFfMCArPSBzdGFTdGVwMTsKICAgICAgc3RhMSA9ICpzdGFfMTsgc3RhXzEgLT0gc3RhU3RlcDE7CiAgICAgIGFjY3UwID0gU01MQUJUKCBhY2N1MCwgc3RhMCwgZmx0KTsKICAgICAgYWNjdTEgPSBTTUxBQlQoIGFjY3UxLCBzdGExLCBmbHQpOwoKICAgICAgZmx0ID0gKnBfZmx0Kys7CiAgICAgIHN0YTAgPSAqc3RhXzA7IHN0YV8wIC09IHN0YVN0ZXAyOwogICAgICBzdGExID0gKnN0YV8xOyBzdGFfMSArPSBzdGFTdGVwMjsKICAgICAgYWNjdTAgPSBTTUxBQkIoIGFjY3UwLCBzdGEwLCBmbHQpOwogICAgICBhY2N1MSA9IFNNTEFCQiggYWNjdTEsIHN0YTEsIGZsdCk7CgogICAgICAqcERhdGFfMC0tID0gRlhfREJMMkZYX1FNRihhY2N1MDw8MSk7CiAgICAgICpwRGF0YV8xKysgPSBGWF9EQkwyRlhfUU1GKGFjY3UxPDwxKTsKICAgIH0KCiAgICAvKiBGSVIgZmlsdGVyIDMxLzYzIGFuZCAzMy82NSAqLwogICAgc3RhMCA9ICpzdGFfMDsgc3RhXzAgKz0gc3RhU3RlcDE7CiAgICBzdGExID0gKnN0YV8xOyBzdGFfMSAtPSBzdGFTdGVwMTsKICAgIGFjY3UwID0gU01VTEJUKCAgICAgICAgc3RhMCwgZmx0KTsKICAgIGFjY3UxID0gU01VTEJUKCAgICAgICAgc3RhMSwgZmx0KTsKCiAgICBmbHQgPSAqcF9mbHQrKzsKICAgIHN0YTAgPSAqc3RhXzA7IHN0YV8wICs9IHN0YVN0ZXAxOwogICAgc3RhMSA9ICpzdGFfMTsgc3RhXzEgLT0gc3RhU3RlcDE7CiAgICBhY2N1MCA9IFNNTEFCQiggYWNjdTAsIHN0YTAsIGZsdCk7CiAgICBhY2N1MSA9IFNNTEFCQiggYWNjdTEsIHN0YTEsIGZsdCk7CgogICAgc3RhMCA9ICpzdGFfMDsgc3RhXzAgKz0gc3RhU3RlcDE7CiAgICBzdGExID0gKnN0YV8xOyBzdGFfMSAtPSBzdGFTdGVwMTsKICAgIGFjY3UwID0gU01MQUJUKCBhY2N1MCwgc3RhMCwgZmx0KTsKICAgIGFjY3UxID0gU01MQUJUKCBhY2N1MSwgc3RhMSwgZmx0KTsKCiAgICBmbHQgPSAqcF9mbHQrKzsKICAgIHN0YTAgPSAqc3RhXzA7IHN0YV8wICs9IHN0YVN0ZXAxOwogICAgc3RhMSA9ICpzdGFfMTsgc3RhXzEgLT0gc3RhU3RlcDE7CiAgICBhY2N1MCA9IFNNTEFCQiggYWNjdTAsIHN0YTAsIGZsdCk7CiAgICBhY2N1MSA9IFNNTEFCQiggYWNjdTEsIHN0YTEsIGZsdCk7CgogICAgc3RhMCA9ICpzdGFfMDsgc3RhXzAgLT0gc3RhU3RlcDI7CiAgICBzdGExID0gKnN0YV8xOyBzdGFfMSArPSBzdGFTdGVwMjsKICAgIGFjY3UwID0gU01MQUJUKCBhY2N1MCwgc3RhMCwgZmx0KTsKICAgIGFjY3UxID0gU01MQUJUKCBhY2N1MSwgc3RhMSwgZmx0KTsKCiAgICAqcERhdGFfMC0tID0gRlhfREJMMkZYX1FNRihhY2N1MDw8MSk7CiAgICAqcERhdGFfMSsrID0gRlhfREJMMkZYX1FNRihhY2N1MTw8MSk7CgogICAgLyogRklSIGZpbHRlciAzMi82NCAqLwogICAgZmx0ID0gKnBfZmx0Kys7CiAgICBzdGEwID0gKnN0YV8wOyBzdGFfMCArPSBzdGFTdGVwMTsKICAgIHN0YTEgPSAqc3RhXzE7IHN0YV8xIC09IHN0YVN0ZXAxOwogICAgYWNjdTAgPSBTTVVMQkIoICAgICAgICBzdGEwLCBmbHQpOwogICAgYWNjdTEgPSBTTVVMQkIoICAgICAgICBzdGExLCBmbHQpOwoKICAgIHN0YTAgPSAqc3RhXzA7IHN0YV8wICs9IHN0YVN0ZXAxOwogICAgc3RhMSA9ICpzdGFfMTsgc3RhXzEgLT0gc3RhU3RlcDE7CiAgICBhY2N1MCA9IFNNTEFCVCggYWNjdTAsIHN0YTAsIGZsdCk7CiAgICBhY2N1MSA9IFNNTEFCVCggYWNjdTEsIHN0YTEsIGZsdCk7CgogICAgZmx0ID0gKnBfZmx0Kys7CiAgICBzdGEwID0gKnN0YV8wOyBzdGFfMCArPSBzdGFTdGVwMTsKICAgIHN0YTEgPSAqc3RhXzE7IHN0YV8xIC09IHN0YVN0ZXAxOwogICAgYWNjdTAgPSBTTUxBQkIoIGFjY3UwLCBzdGEwLCBmbHQpOwogICAgYWNjdTEgPSBTTUxBQkIoIGFjY3UxLCBzdGExLCBmbHQpOwoKICAgIHN0YTAgPSAqc3RhXzA7IHN0YV8wICs9IHN0YVN0ZXAxOwogICAgc3RhMSA9ICpzdGFfMTsgc3RhXzEgLT0gc3RhU3RlcDE7CiAgICBhY2N1MCA9IFNNTEFCVCggYWNjdTAsIHN0YTAsIGZsdCk7CiAgICBhY2N1MSA9IFNNTEFCVCggYWNjdTEsIHN0YTEsIGZsdCk7CgogICAgZmx0ID0gKnBfZmx0OwogICAgc3RhMCA9ICpzdGFfMDsKICAgIHN0YTEgPSAqc3RhXzE7CiAgICBhY2N1MCA9IFNNTEFCQiggYWNjdTAsIHN0YTAsIGZsdCk7CiAgICBhY2N1MSA9IFNNTEFCQiggYWNjdTEsIHN0YTEsIGZsdCk7CgogICAgKnBEYXRhXzAtLSA9IEZYX0RCTDJGWF9RTUYoYWNjdTA8PDEpOwogICAgKnBEYXRhXzErKyA9IEZYX0RCTDJGWF9RTUYoYWNjdTE8PDEpOwogIH0KICBlbHNlCiAgewogICAgaW50IHBmbHRTdGVwID0gUU1GX05PX1BPTFkgKiAocF9zdHJpZGUtMSk7CgogICAgZmx0ID0gcF9mbHRbMF07CiAgICBzdGExID0gKnN0YV8xOyAgc3RhXzEgLT0gc3RhU3RlcDE7CiAgICBhY2N1MSA9IFNNVUxCQiggICAgICAgIHN0YTEsIGZsdCk7CiAgICBzdGExID0gKnN0YV8xOyAgc3RhXzEgLT0gc3RhU3RlcDE7CiAgICBhY2N1MSA9IFNNTEFCVCggYWNjdTEsIHN0YTEsIGZsdCk7CgogICAgZmx0ID0gcF9mbHRbMV07CiAgICBzdGExID0gKnN0YV8xOyAgc3RhXzEgLT0gc3RhU3RlcDE7CiAgICBhY2N1MSA9IFNNTEFCQiggYWNjdTEsIHN0YTEsIGZsdCk7CiAgICBzdGExID0gKnN0YV8xOyAgc3RhXzEgLT0gc3RhU3RlcDE7CiAgICBhY2N1MSA9IFNNTEFCVCggYWNjdTEsIHN0YTEsIGZsdCk7CgogICAgZmx0ID0gcF9mbHRbMl07IHBfZmx0ICs9IHBmbHRTdGVwOwogICAgc3RhMSA9ICpzdGFfMTsgIHN0YV8xICs9IHN0YVN0ZXAyOwogICAgYWNjdTEgPSBTTUxBQkIoIGFjY3UxLCBzdGExLCBmbHQpOwogICAgKnBEYXRhXzErKyA9IEZYX0RCTDJGWF9RTUYoYWNjdTE8PDEpOwoKICAgIC8qIEZJUiBmaWx0ZXJzIDEuLjYzIDEyNy4uNjUgb3IgMS4uMzEgNjMuLjMzICovCiAgICBmb3IgKDsgLS1ub19jaGFubmVsczsgKQogICAgewogICAgICBmbHQgPSBwX2ZsdFswXTsKICAgICAgc3RhMCA9ICpzdGFfMDsgc3RhXzAgKz0gc3RhU3RlcDE7CiAgICAgIHN0YTEgPSAqc3RhXzE7IHN0YV8xIC09IHN0YVN0ZXAxOwogICAgICBhY2N1MCA9IFNNVUxCQiggICAgICAgIHN0YTAsIGZsdCk7CiAgICAgIGFjY3UxID0gU01VTEJCKCAgICAgICAgc3RhMSwgZmx0KTsKCiAgICAgIHN0YTAgPSAqc3RhXzA7IHN0YV8wICs9IHN0YVN0ZXAxOwogICAgICBzdGExID0gKnN0YV8xOyBzdGFfMSAtPSBzdGFTdGVwMTsKICAgICAgYWNjdTAgPSBTTUxBQlQoIGFjY3UwLCBzdGEwLCBmbHQpOwogICAgICBhY2N1MSA9IFNNTEFCVCggYWNjdTEsIHN0YTEsIGZsdCk7CgogICAgICBmbHQgPSBwX2ZsdFsxXTsKICAgICAgc3RhMCA9ICpzdGFfMDsgc3RhXzAgKz0gc3RhU3RlcDE7CiAgICAgIHN0YTEgPSAqc3RhXzE7IHN0YV8xIC09IHN0YVN0ZXAxOwogICAgICBhY2N1MCA9IFNNTEFCQiggYWNjdTAsIHN0YTAsIGZsdCk7CiAgICAgIGFjY3UxID0gU01MQUJCKCBhY2N1MSwgc3RhMSwgZmx0KTsKCiAgICAgIHN0YTAgPSAqc3RhXzA7IHN0YV8wICs9IHN0YVN0ZXAxOwogICAgICBzdGExID0gKnN0YV8xOyBzdGFfMSAtPSBzdGFTdGVwMTsKICAgICAgYWNjdTAgPSBTTUxBQlQoIGFjY3UwLCBzdGEwLCBmbHQpOwogICAgICBhY2N1MSA9IFNNTEFCVCggYWNjdTEsIHN0YTEsIGZsdCk7CgogICAgICBmbHQgPSBwX2ZsdFsyXTsgcF9mbHQgKz0gcGZsdFN0ZXA7CiAgICAgIHN0YTAgPSAqc3RhXzA7IHN0YV8wIC09IHN0YVN0ZXAyOwogICAgICBzdGExID0gKnN0YV8xOyBzdGFfMSArPSBzdGFTdGVwMjsKICAgICAgYWNjdTAgPSBTTUxBQkIoIGFjY3UwLCBzdGEwLCBmbHQpOwogICAgICBhY2N1MSA9IFNNTEFCQiggYWNjdTEsIHN0YTEsIGZsdCk7CgogICAgICAqcERhdGFfMC0tID0gRlhfREJMMkZYX1FNRihhY2N1MDw8MSk7CiAgICAgICpwRGF0YV8xKysgPSBGWF9EQkwyRlhfUU1GKGFjY3UxPDwxKTsKICAgIH0KCiAgICAvKiBGSVIgZmlsdGVyIDMyLzY0ICovCiAgICBmbHQgPSBwX2ZsdFswXTsKICAgIHN0YTAgPSAqc3RhXzA7IHN0YV8wICs9IHN0YVN0ZXAxOwogICAgYWNjdTAgPSBTTVVMQkIoICAgICAgICBzdGEwLCBmbHQpOwogICAgc3RhMCA9ICpzdGFfMDsgc3RhXzAgKz0gc3RhU3RlcDE7CiAgICBhY2N1MCA9IFNNTEFCVCggYWNjdTAsIHN0YTAsIGZsdCk7CgogICAgZmx0ID0gcF9mbHRbMV07CiAgICBzdGEwID0gKnN0YV8wOyBzdGFfMCArPSBzdGFTdGVwMTsKICAgIGFjY3UwID0gU01MQUJCKCBhY2N1MCwgc3RhMCwgZmx0KTsKICAgIHN0YTAgPSAqc3RhXzA7IHN0YV8wICs9IHN0YVN0ZXAxOwogICAgYWNjdTAgPSBTTUxBQlQoIGFjY3UwLCBzdGEwLCBmbHQpOwoKICAgIGZsdCA9IHBfZmx0WzJdOwogICAgc3RhMCA9ICpzdGFfMDsKICAgIGFjY3UwID0gU01MQUJCKCBhY2N1MCwgc3RhMCwgZmx0KTsKICAgICpwRGF0YV8wLS0gPSBGWF9EQkwyRlhfUU1GKGFjY3UwPDwxKTsKICB9Cn0KI2VuZGlmIC8qIEZVTkNUSU9OX3FtZkFuYVByb3RvdHlwZUZpclNsb3QgKi8KI2VuZGlmIC8qICNpZiBkZWZpbmVkKF9fQ0NfQVJNKSAmJiBkZWZpbmVkKF9fQVJNX0FSQ0hfNl9fKSAqLwoKI2lmICggZGVmaW5lZChfX0FSTV9BUkNIXzVURV9fKSAmJiAoU0FNUExFX0JJVFMgPT0gMTYpICkgJiYgIWRlZmluZWQoUU1GX1RBQkxFX0ZVTEwpCgojZGVmaW5lIEZVTkNUSU9OX3FtZlN5blByb3RvdHlwZUZpclNsb3QKCiNpZiBkZWZpbmVkKEZVTkNUSU9OX3FtZlN5blByb3RvdHlwZUZpclNsb3QpCgojaWYgZGVmaW5lZChfX0dOVUNfXykJLyogY3BwcCByZXBsYWNlZDogZWxpZiAqLwoKaW5saW5lIElOVCBTTVVMV0IgKGNvbnN0IExPTkcgYSwgY29uc3QgTE9ORyBiKQp7CiAgSU5UIHJlc3VsdCA7CiAgX19hc21fXyAoInNtdWx3YiAlMCwgJTEsICUyIgogICAgOiAiPXIiIChyZXN1bHQpCiAgICA6ICJyIiAoYSksICJyIiAoYikpIDsKCiAgcmV0dXJuIHJlc3VsdCA7Cn0KaW5saW5lIElOVCBTTVVMV1QgKGNvbnN0IExPTkcgYSwgY29uc3QgTE9ORyBiKQp7CiAgSU5UIHJlc3VsdCA7CiAgX19hc21fXyAoInNtdWx3dCAlMCwgJTEsICUyIgogICAgOiAiPXIiIChyZXN1bHQpCiAgICA6ICJyIiAoYSksICJyIiAoYikpIDsKCiAgcmV0dXJuIHJlc3VsdCA7Cn0KCmlubGluZSBJTlQgU01MQVdCKGNvbnN0IExPTkcgYWNjdSwgY29uc3QgTE9ORyBhLCBjb25zdCBMT05HIGIpCnsKICBJTlQgcmVzdWx0OwogIGFzbSgic21sYXdiICUwLCAlMSwgJTIsICUzICIKICAgICAgICA6ICI9ciIgKHJlc3VsdCkKICAgICAgICA6ICJyIiAoYSksICJyIiAoYiksICJyIiAoYWNjdSkgKTsKICByZXR1cm4gcmVzdWx0IDsKfQoKaW5saW5lIElOVCBTTUxBV1QoY29uc3QgTE9ORyBhY2N1LCBjb25zdCBMT05HIGEsIGNvbnN0IExPTkcgYikKewogIElOVCByZXN1bHQ7CiAgYXNtKCJzbWxhd3QgJTAsICUxLCAlMiwgJTMgIgogICAgICAgIDogIj1yIiAocmVzdWx0KQogICAgICAgIDogInIiIChhKSwgInIiIChiKSwgInIiIChhY2N1KSApOwogIHJldHVybiByZXN1bHQgOwp9CgojZW5kaWYgLyogQVJNIGNvbXBpbGVyIHNlbGVjdG9yICovCgoKc3RhdGljIHZvaWQgcW1mU3luUHJvdG90eXBlRmlyU2xvdDFfZmlsdGVyKEZJWFBfUU1GICpSRVNUUklDVCByZWFsU2xvdCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX1FNRiAqUkVTVFJJQ1QgaW1hZ1Nsb3QsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRklYUF9EQkwgKlJFU1RSSUNUIHBfZmx0LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfUVNTICpSRVNUUklDVCBzdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqcE15VGltZU91dCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbm9fY2hhbm5lbHMpCnsKICAvKiBUaGlzIGNvZGUgd2FzIHRoZSBiYXNlIGZvciB0aGUgYWJvdmUgbGlzdGVkIGFzc2VtYmxlciBzZXF1ZW5jZSAqLwogIC8qIEl0IGNhbiBiZSB1c2VkIGZvciBkZWJ1Z2dpbmcgcHVycG9zZSBvciBmdXJ0aGVyIG9wdGltaXphdGlvbnMgICovCiAgY29uc3QgRklYUF9EQkwgKlJFU1RSSUNUIHBfZmx0bSA9IHBfZmx0ICsgMTU1OwoKICBkbwogIHsKICAgICBGSVhQX0RCTCByZXN1bHQ7CiAgICAgRklYUF9EQkwgQSwgQiwgcmVhbCwgaW1hZywgc3RhMDsKCiAgICAgcmVhbCA9ICotLXJlYWxTbG90OwogICAgIGltYWcgPSAqLS1pbWFnU2xvdDsKICAgICBCID0gcF9mbHRbNF07ICAgICAgICAgICAgICAgICAgICAgICAgLyogQm90dG9tPVs4XSBUb3A9WzldICAgICAqLwogICAgIEEgPSBwX2ZsdG1bM107ICAgICAgICAgICAgICAgICAgICAgICAvKiBCb3R0b209WzMxNl0gVG9wPVszMTddICovCiAgICAgc3RhMCA9IHN0YVswXTsgICAgICAgICAgICAgICAgICAgICAgIC8qIHNhdmUgc3RhdGVbMF0gICAgICAgICAgKi8KICAgICAqc3RhKysgPSBTTUxBV1QoIHN0YVsxXSwgaW1hZywgQiApOyAgLyogaW5kZXg9OS4uLi4uLi4uLi4uMzE5ICAqLwogICAgICpzdGErKyA9IFNNTEFXQiggc3RhWzFdLCByZWFsLCBBICk7ICAvKiBpbmRleD0zMTYuLi4uLi4uLi4uLjYgICovCiAgICAgKnN0YSsrID0gU01MQVdCKCBzdGFbMV0sIGltYWcsIEIgKTsgIC8qIGluZGV4PTgsMTgsICAgIC4uLjMxOCAgKi8KICAgICBCID0gcF9mbHRbM107ICAgICAgICAgICAgICAgICAgICAgICAgLyogQm90dG9tPVs2XSBUb3A9WzddICAgICAqLwogICAgICpzdGErKyA9IFNNTEFXVCggc3RhWzFdLCByZWFsLCBBICk7ICAvKiBpbmRleD0zMTcuLi4uLi4uLi4uLjcgICovCiAgICAgQSA9IHBfZmx0bVs0XTsgICAgICAgICAgICAgICAgICAgICAgIC8qIEJvdHRvbT1bMzE4XSBUb3A9WzMxOV0gKi8KICAgICAqc3RhKysgPSBTTUxBV1QoIHN0YVsxXSwgaW1hZywgQiApOyAgLyogaW5kZXg9Ny4uLi4uLi4uLi4uMzE3ICAqLwogICAgICpzdGErKyA9IFNNTEFXQiggc3RhWzFdLCByZWFsLCBBICk7ICAvKiBpbmRleD0zMTguLi4uLi4uLi4uLjggICovCiAgICAgKnN0YSsrID0gU01MQVdCKCBzdGFbMV0sIGltYWcsIEIgKTsgIC8qIGluZGV4PTYuLi4uLi4uLi4uLjMxNiAgKi8KICAgICBCID0gcF9mbHRbMl07ICAgICAgICAgICAgICAgICAgICAgICAgLyogQm90dG9tPVtYXSBUb3A9WzVdICAgICAqLwogICAgICpzdGErKyA9IFNNTEFXVCggc3RhWzFdLCByZWFsLCBBICk7ICAvKiBpbmRleD05Li4uLi4uLi4uLi4zMTkgICovCiAgICAgQSA9IHBfZmx0bVsyXTsgICAgICAgICAgICAgICAgICAgICAgIC8qIEJvdHRvbT1bWF0gVG9wPVszMTVdICAgKi8KICAgICAqc3RhKysgPSAgICAgICAgIFNNVUxXVCggaW1hZywgQiApOyAgLyogaW5kZXg9NSwxNSwgLi4uICAgMzE1ICAqLwogICAgIHJlc3VsdCA9IFNNTEFXVCggc3RhMCwgICByZWFsLCBBICk7ICAvKiBpbmRleD0zMTUuLi4uLi4uLi4uLjUgICovCgogICAgICpwTXlUaW1lT3V0KysgPSByZXN1bHQ7CgogICAgIHJlYWwgPSAqLS1yZWFsU2xvdDsKICAgICBpbWFnID0gKi0taW1hZ1Nsb3Q7CiAgICAgQSA9IHBfZmx0bVswXTsgICAgICAgICAgICAgICAgICAgICAgIC8qIEJvdHRvbT1bMzEwXSBUb3A9WzMxMV0gKi8KICAgICBCID0gcF9mbHRbN107ICAgICAgICAgICAgICAgICAgICAgICAgLyogQm90dG9tPVsxNF0gIFRvcD1bMTVdICAqLwogICAgIHJlc3VsdCA9IFNNTEFXQiggc3RhWzBdLCByZWFsLCBBICk7ICAvKiBpbmRleD0zMTAuLi4uLi4uLi4uLjAgICovCiAgICAgKnN0YSsrID0gU01MQVdCKCBzdGFbMV0sIGltYWcsIEIgKTsgIC8qIGluZGV4PTE0Li4uLi4uLi4uLjMyNCAgKi8KICAgICAqcE15VGltZU91dCsrID0gcmVzdWx0OwogICAgIEIgPSBwX2ZsdFs2XTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBCb3R0b209WzEyXSAgVG9wPVsxM10gICovCiAgICAgKnN0YSsrID0gU01MQVdUKCBzdGFbMV0sIHJlYWwsIEEgKTsgIC8qIGluZGV4PTMxMS4uLi4uLi4uLi4uMSAgKi8KICAgICBBID0gcF9mbHRtWzFdOyAgICAgICAgICAgICAgICAgICAgICAgLyogQm90dG9tPVszMTJdIFRvcD1bMzEzXSAqLwogICAgICpzdGErKyA9IFNNTEFXVCggc3RhWzFdLCBpbWFnLCBCICk7ICAvKiBpbmRleD0xMy4uLi4uLi4uLi4zMjMgICovCiAgICAgKnN0YSsrID0gU01MQVdCKCBzdGFbMV0sIHJlYWwsIEEgKTsgIC8qIGluZGV4PTMxMi4uLi4uLi4uLi4uMiAgKi8KICAgICAqc3RhKysgPSBTTUxBV0IoIHN0YVsxXSwgaW1hZywgQiApOyAgLyogaW5kZXg9MTIuLi4uLi4uLi4uMzIyICAqLwogICAgICpzdGErKyA9IFNNTEFXVCggc3RhWzFdLCByZWFsLCBBICk7ICAvKiBpbmRleD0zMTMuLi4uLi4uLi4uLjMgICovCiAgICAgQSA9IHBfZmx0bVsyXTsgICAgICAgICAgICAgICAgICAgICAgIC8qIEJvdHRvbT1bMzE0XSBUb3A9WzMxNV0gKi8KICAgICBCID0gcF9mbHRbNV07ICAgICAgICAgICAgICAgICAgICAgICAgLyogQm90dG9tPVsxMF0gIFRvcD1bMTFdICAqLwogICAgICpzdGErKyA9IFNNTEFXVCggc3RhWzFdLCBpbWFnLCBCICk7ICAvKiBpbmRleD0xMS4uLi4uLi4uLi4zMjEgICovCiAgICAgKnN0YSsrID0gU01MQVdCKCBzdGFbMV0sIHJlYWwsIEEgKTsgIC8qIGluZGV4PTMxNC4uLi4uLi4uLi4uNCAgKi8KICAgICAqc3RhKysgPSAgICAgICAgIFNNVUxXQiggaW1hZywgQiApOyAgLyogaW5kZXg9MTAuLi4uLi4uLi4uMzIwICAqLwoKCiAgICAgcF9mbHQgICAgKz0gNTsKICAgICBwX2ZsdG0gICAtPSA1OwogIH0gCiAgd2hpbGUgKCgtLW5vX2NoYW5uZWxzKSAhPSAwKTsKCn0KCgoKSU5UIHFtZlN5blByb3RvdHlwZUZpclNsb3QyKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9RTUZfRklMVEVSX0JBTksgcW1mLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfUU1GICpSRVNUUklDVCByZWFsU2xvdCwgICAgICAgICAgICAvKiE8IElucHV0OiBQb2ludGVyIHRvIHJlYWwgU2xvdCAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfUU1GICpSRVNUUklDVCBpbWFnU2xvdCwgICAgICAgICAgICAvKiE8IElucHV0OiBQb2ludGVyIHRvIGltYWcgU2xvdCAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVF9QQ00gICpSRVNUUklDVCB0aW1lT3V0LCAgICAgICAgICAgICAvKiE8IFRpbWUgZG9tYWluIGRhdGEgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgc3RyaWRlICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBUaW1lIG91dHB1dCBidWZmZXIgc3RyaWRlIGZhY3RvciovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApCnsKICBGSVhQX1FTUyAqUkVTVFJJQ1Qgc3RhID0gKEZJWFBfUVNTKilxbWYtPkZpbHRlclN0YXRlczsKICBpbnQgbm9fY2hhbm5lbHMgPSBxbWYtPm5vX2NoYW5uZWxzOwogIGludCBzY2FsZSA9ICgoREZSQUNUX0JJVFMtU0FNUExFX0JJVFMpLTEtcW1mLT5vdXRTY2FsZWZhY3Rvcik7CgogIC8qIFdlIG1hcCBhbiBhcnJ5IG9mIDE2LWJpdCB2YWx1ZXMgdXBvbiBhbiBhcnJheSBvZiAyKjE2LWJpdCB2YWx1ZXMgdG8gcmVhZCAyIHZhbHVlcyBpbiBvbmUgc2hvdCAqLwogIGNvbnN0IEZJWFBfREJMICpSRVNUUklDVCBwX2ZsdCAgPSAoRklYUF9EQkwgKikgcW1mLT5wX2ZpbHRlcjsgICAgICAgICAgIC8qIGxvdz1bMF0sICAgaGlnaD1bMV0gICAqLwogIGNvbnN0IEZJWFBfREJMICpSRVNUUklDVCBwX2ZsdG0gPSAoRklYUF9EQkwgKikgcW1mLT5wX2ZpbHRlciArIDE1NTsgICAgIC8qIGxvdz1bMzEwXSwgaGlnaD1bMzExXSAqLwoKICBGREtfQVNTRVJUKFNBTVBMRV9CSVRTLTEtcW1mLT5vdXRTY2FsZWZhY3RvciA+PSAwKTsgLy8gICAoREZSQUNUX0JJVFMtU0FNUExFX0JJVFMpLTEtcW1mLT5vdXRTY2FsZWZhY3RvciA+PSAwKTsKICBGREtfQVNTRVJUKHFtZi0+cF9zdHJpZGU9PTIgJiYgcW1mLT5ub19jaGFubmVscyA9PSAzMik7CgogIEZES19BU1NFUlQoKG5vX2NoYW5uZWxzJjMpID09IDApOyAgLyogc2hvdWxkIGJlIGEgbXVsdGlwbGUgb2YgNCAqLwoKICByZWFsU2xvdCArPSBub19jaGFubmVscy0xOyAgICAvLyB+fiJ+fgogIGltYWdTbG90ICs9IG5vX2NoYW5uZWxzLTE7ICAgIC8vIG5vX2NoYW5uZWxzLTEgLi4gMAoKICBGSVhQX0RCTCBNeVRpbWVPdXRbMzJdOwogIEZJWFBfREJMICpwTXlUaW1lT3V0ID0gJk15VGltZU91dFswXTsKCiAgZm9yIChub19jaGFubmVscyA9IG5vX2NoYW5uZWxzOyBub19jaGFubmVscy0tOykKICB7CiAgICAgRklYUF9EQkwgcmVzdWx0OwogICAgIEZJWFBfREJMIEEsIEIsIHJlYWwsIGltYWc7CgogICAgIHJlYWwgPSAqcmVhbFNsb3QtLTsKICAgICBpbWFnID0gKmltYWdTbG90LS07CiAgICAgQSA9IHBfZmx0bVswXTsgICAgICAgICAgICAgICAgICAgICAgIC8qIEJvdHRvbT1bMzEwXSBUb3A9WzMxMV0gKi8KICAgICBCID0gcF9mbHRbN107ICAgICAgICAgICAgICAgICAgICAgICAgLyogQm90dG9tPVsxNF0gIFRvcD1bMTVdICAqLwogICAgIHJlc3VsdCA9IFNNTEFXQiggc3RhWzBdLCByZWFsLCBBICk7ICAvKiBpbmRleD0zMTAuLi4uLi4uLi4uLjAgICovCiAgICAgKnN0YSsrID0gU01MQVdCKCBzdGFbMV0sIGltYWcsIEIgKTsgIC8qIGluZGV4PTE0Li4uLi4uLi4uLjMyNCAgKi8KICAgICBCID0gcF9mbHRbNl07ICAgICAgICAgICAgICAgICAgICAgICAgLyogQm90dG9tPVsxMl0gIFRvcD1bMTNdICAqLwogICAgICpzdGErKyA9IFNNTEFXVCggc3RhWzFdLCByZWFsLCBBICk7ICAvKiBpbmRleD0zMTEuLi4uLi4uLi4uLjEgICovCiAgICAgQSA9IHBfZmx0bVsxXTsgICAgICAgICAgICAgICAgICAgICAgIC8qIEJvdHRvbT1bMzEyXSBUb3A9WzMxM10gKi8KICAgICAqc3RhKysgPSBTTUxBV1QoIHN0YVsxXSwgaW1hZywgQiApOyAgLyogaW5kZXg9MTMuLi4uLi4uLi4uMzIzICAqLwogICAgICpzdGErKyA9IFNNTEFXQiggc3RhWzFdLCByZWFsLCBBICk7ICAvKiBpbmRleD0zMTIuLi4uLi4uLi4uLjIgICovCiAgICAgKnN0YSsrID0gU01MQVdCKCBzdGFbMV0sIGltYWcsIEIgKTsgIC8qIGluZGV4PTEyLi4uLi4uLi4uLjMyMiAgKi8KICAgICAqc3RhKysgPSBTTUxBV1QoIHN0YVsxXSwgcmVhbCwgQSApOyAgLyogaW5kZXg9MzEzLi4uLi4uLi4uLi4zICAqLwogICAgIEEgPSBwX2ZsdG1bMl07ICAgICAgICAgICAgICAgICAgICAgICAvKiBCb3R0b209WzMxNF0gVG9wPVszMTVdICovCiAgICAgQiA9IHBfZmx0WzVdOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEJvdHRvbT1bMTBdICBUb3A9WzExXSAgKi8KICAgICAqc3RhKysgPSBTTUxBV1QoIHN0YVsxXSwgaW1hZywgQiApOyAgLyogaW5kZXg9MTEuLi4uLi4uLi4uMzIxICAqLwogICAgICpzdGErKyA9IFNNTEFXQiggc3RhWzFdLCByZWFsLCBBICk7ICAvKiBpbmRleD0zMTQuLi4uLi4uLi4uLjQgICovCiAgICAgKnN0YSsrID0gICAgICAgICBTTVVMV0IoIGltYWcsIEIgKTsgIC8qIGluZGV4PTEwLi4uLi4uLi4uLjMyMCAgKi8KCiAgICAgKnBNeVRpbWVPdXQrKyA9IHJlc3VsdDsKCiAgICAgcF9mbHRtICAgLT0gNTsKICAgICBwX2ZsdCAgICArPSA1OwogIH0KCiAgcE15VGltZU91dCA9ICZNeVRpbWVPdXRbMF07CiNpZiAoU0FNUExFX0JJVFMgPT0gMTYpICAgICAgCiAgY29uc3QgRklYUF9EQkwgbWF4X3BvcyA9IChGSVhQX0RCTCkgMHgwMDAwN0ZGRiA8PCBzY2FsZTsKICBjb25zdCBGSVhQX0RCTCBtYXhfbmVnID0gKEZJWFBfREJMKSAweEZGRkY4MDAxIDw8IHNjYWxlOwojZWxzZQogIHNjYWxlID0gLXNjYWxlOwogIGNvbnN0IEZJWFBfREJMIG1heF9wb3MgPSAoRklYUF9EQkwpIDB4N0ZGRkZGRkYgPj4gc2NhbGU7CiAgY29uc3QgRklYUF9EQkwgbWF4X25lZyA9IChGSVhQX0RCTCkgMHg4MDAwMDAwMSA+PiBzY2FsZTsgIAojZW5kaWYKICBjb25zdCBGSVhQX0RCTCBhZGRfbmVnID0gKDEgPDwgc2NhbGUpIC0gMTsKCiAgbm9fY2hhbm5lbHMgPSBxbWYtPm5vX2NoYW5uZWxzOwoKICB0aW1lT3V0ICs9IG5vX2NoYW5uZWxzKnN0cmlkZTsKCiAgRkRLX0FTU0VSVChzY2FsZSA+PSAwKTsKCiAgaWYgKHFtZi0+b3V0R2FpbiAhPSAweDgwMDAwMDAwKQogIHsKICAgIEZJWFBfREJMIGdhaW4gPSBxbWYtPm91dEdhaW47CiAgICBmb3IgKG5vX2NoYW5uZWxzPj49Mjsgbm9fY2hhbm5lbHMtLTspCiAgICB7CiAgICAgIEZJWFBfREJMIHJlc3VsdDEsIHJlc3VsdDI7CgogICAgICByZXN1bHQxID0gKnBNeVRpbWVPdXQrKzsKICAgICAgcmVzdWx0MiA9ICpwTXlUaW1lT3V0Kys7CgogICAgICByZXN1bHQxID0gZk11bHQocmVzdWx0MSxnYWluKTsKICAgICAgdGltZU91dCAtPSBzdHJpZGU7CiAgICAgIGlmIChyZXN1bHQxIDwgMCkgICAgICAgIHJlc3VsdDEgKz0gYWRkX25lZzsKICAgICAgaWYgKHJlc3VsdDEgPCBtYXhfbmVnKSAgcmVzdWx0MSA9IG1heF9uZWc7CiAgICAgIGlmIChyZXN1bHQxID4gbWF4X3BvcykgIHJlc3VsdDEgPSBtYXhfcG9zOwojaWYgKFNBTVBMRV9CSVRTID09IDE2KQogICAgICB0aW1lT3V0WzBdID0gcmVzdWx0MSA+PiBzY2FsZTsKI2Vsc2UKICAgICAgdGltZU91dFswXSA9IHJlc3VsdDEgPDwgc2NhbGU7CiNlbmRpZgoKICAgICAgcmVzdWx0MiA9IGZNdWx0KHJlc3VsdDIsZ2Fpbik7CiAgICAgIHRpbWVPdXQgLT0gc3RyaWRlOwogICAgICBpZiAocmVzdWx0MiA8IDApICAgICAgICByZXN1bHQyICs9IGFkZF9uZWc7CiAgICAgIGlmIChyZXN1bHQyIDwgbWF4X25lZykgIHJlc3VsdDIgPSBtYXhfbmVnOwogICAgICBpZiAocmVzdWx0MiA+IG1heF9wb3MpICByZXN1bHQyID0gbWF4X3BvczsKI2lmIChTQU1QTEVfQklUUyA9PSAxNikKICAgICAgdGltZU91dFswXSA9IHJlc3VsdDIgPj4gc2NhbGU7CiNlbHNlCiAgICAgIHRpbWVPdXRbMF0gPSByZXN1bHQyIDw8IHNjYWxlOwojZW5kaWYKCiAgICAgIHJlc3VsdDEgPSAqcE15VGltZU91dCsrOwogICAgICByZXN1bHQyID0gKnBNeVRpbWVPdXQrKzsKCiAgICAgIHJlc3VsdDEgPSBmTXVsdChyZXN1bHQxLGdhaW4pOwogICAgICB0aW1lT3V0IC09IHN0cmlkZTsKICAgICAgaWYgKHJlc3VsdDEgPCAwKSAgICAgICAgcmVzdWx0MSArPSBhZGRfbmVnOwogICAgICBpZiAocmVzdWx0MSA8IG1heF9uZWcpICByZXN1bHQxID0gbWF4X25lZzsKICAgICAgaWYgKHJlc3VsdDEgPiBtYXhfcG9zKSAgcmVzdWx0MSA9IG1heF9wb3M7CiNpZiAoU0FNUExFX0JJVFMgPT0gMTYpCiAgICAgIHRpbWVPdXRbMF0gPSByZXN1bHQxID4+IHNjYWxlOwojZWxzZQogICAgICB0aW1lT3V0WzBdID0gcmVzdWx0MSA8PCBzY2FsZTsKI2VuZGlmCgogICAgICByZXN1bHQyID0gZk11bHQocmVzdWx0MixnYWluKTsKICAgICAgdGltZU91dCAtPSBzdHJpZGU7CiAgICAgIGlmIChyZXN1bHQyIDwgMCkgICAgICAgIHJlc3VsdDIgKz0gYWRkX25lZzsKICAgICAgaWYgKHJlc3VsdDIgPCBtYXhfbmVnKSAgcmVzdWx0MiA9IG1heF9uZWc7CiAgICAgIGlmIChyZXN1bHQyID4gbWF4X3BvcykgIHJlc3VsdDIgPSBtYXhfcG9zOwojaWYgKFNBTVBMRV9CSVRTID09IDE2KQogICAgICB0aW1lT3V0WzBdID0gcmVzdWx0MiA+PiBzY2FsZTsKI2Vsc2UKICAgICAgdGltZU91dFswXSA9IHJlc3VsdDIgPDwgc2NhbGU7CiNlbmRpZgogICAgfQogIH0KICBlbHNlCiAgewogICAgZm9yIChub19jaGFubmVscz4+PTI7IG5vX2NoYW5uZWxzLS07KQogICAgewogICAgICBGSVhQX0RCTCByZXN1bHQxLCByZXN1bHQyOwogICAgICByZXN1bHQxID0gKnBNeVRpbWVPdXQrKzsKICAgICAgcmVzdWx0MiA9ICpwTXlUaW1lT3V0Kys7CiAgICAgIHRpbWVPdXQgLT0gc3RyaWRlOwogICAgICBpZiAocmVzdWx0MSA8IDApICAgICAgICByZXN1bHQxICs9IGFkZF9uZWc7CiAgICAgIGlmIChyZXN1bHQxIDwgbWF4X25lZykgIHJlc3VsdDEgPSBtYXhfbmVnOwogICAgICBpZiAocmVzdWx0MSA+IG1heF9wb3MpICByZXN1bHQxID0gbWF4X3BvczsKI2lmIChTQU1QTEVfQklUUyA9PSAxNikKICAgICAgdGltZU91dFswXSA9IHJlc3VsdDEgPj4gc2NhbGU7CiNlbHNlCiAgICAgIHRpbWVPdXRbMF0gPSByZXN1bHQxIDw8IHNjYWxlOwojZW5kaWYKICAgICAgCiAgICAgIHRpbWVPdXQgLT0gc3RyaWRlOwogICAgICBpZiAocmVzdWx0MiA8IDApICAgICAgICByZXN1bHQyICs9IGFkZF9uZWc7CiAgICAgIGlmIChyZXN1bHQyIDwgbWF4X25lZykgIHJlc3VsdDIgPSBtYXhfbmVnOwogICAgICBpZiAocmVzdWx0MiA+IG1heF9wb3MpICByZXN1bHQyID0gbWF4X3BvczsKI2lmIChTQU1QTEVfQklUUyA9PSAxNikKICAgICAgdGltZU91dFswXSA9IHJlc3VsdDIgPj4gc2NhbGU7CiNlbHNlCiAgICAgIHRpbWVPdXRbMF0gPSByZXN1bHQyIDw8IHNjYWxlOwojZW5kaWYKICAgICAgCiAgICAgIHJlc3VsdDEgPSAqcE15VGltZU91dCsrOwogICAgICByZXN1bHQyID0gKnBNeVRpbWVPdXQrKzsKICAgICAgdGltZU91dCAtPSBzdHJpZGU7CiAgICAgIGlmIChyZXN1bHQxIDwgMCkgICAgICAgIHJlc3VsdDEgKz0gYWRkX25lZzsKICAgICAgaWYgKHJlc3VsdDEgPCBtYXhfbmVnKSAgcmVzdWx0MSA9IG1heF9uZWc7CiAgICAgIGlmIChyZXN1bHQxID4gbWF4X3BvcykgIHJlc3VsdDEgPSBtYXhfcG9zOwojaWYgKFNBTVBMRV9CSVRTID09IDE2KQogICAgICB0aW1lT3V0WzBdID0gcmVzdWx0MSA+PiBzY2FsZTsKI2Vsc2UKICAgICAgdGltZU91dFswXSA9IHJlc3VsdDEgPDwgc2NhbGU7CiNlbmRpZgogICAgICAKICAgICAgdGltZU91dCAtPSBzdHJpZGU7CiAgICAgIGlmIChyZXN1bHQyIDwgMCkgICAgICAgIHJlc3VsdDIgKz0gYWRkX25lZzsKICAgICAgaWYgKHJlc3VsdDIgPCBtYXhfbmVnKSAgcmVzdWx0MiA9IG1heF9uZWc7CiAgICAgIGlmIChyZXN1bHQyID4gbWF4X3BvcykgIHJlc3VsdDIgPSBtYXhfcG9zOwojaWYgKFNBTVBMRV9CSVRTID09IDE2KQogICAgICB0aW1lT3V0WzBdID0gcmVzdWx0MiA+PiBzY2FsZTsKI2Vsc2UKICAgICAgdGltZU91dFswXSA9IHJlc3VsdDIgPDwgc2NhbGU7CiNlbmRpZgogICAgfQogIH0KICByZXR1cm4gMDsKfQoKc3RhdGljCnZvaWQgcW1mU3luUHJvdG90eXBlRmlyU2xvdF9mYWxsYmFjayggSEFORExFX1FNRl9GSUxURVJfQkFOSyBxbWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKnJlYWxTbG90LCAgICAgIC8qITwgSW5wdXQ6IFBvaW50ZXIgdG8gcmVhbCBTbG90ICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKmltYWdTbG90LCAgICAgIC8qITwgSW5wdXQ6IFBvaW50ZXIgdG8gaW1hZyBTbG90ICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UX1BDTSAgKnRpbWVPdXQsICAgICAgICAgICAgIC8qITwgVGltZSBkb21haW4gZGF0YSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCAgICAgICBzdHJpZGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CgovKiEKICBcYnJpZWYgUGVyZm9ybSBTeW50aGVzaXMgUHJvdG90eXBlIEZpbHRlcmluZyBvbiBhIHNpbmdsZSBzbG90IG9mIGlucHV0IGRhdGEuCgogIFRoZSBmaWx0ZXIgdGFrZXMgMiAqICNNQVhfU1lOVEhFU0lTX0NIQU5ORUxTIG9mIGlucHV0IGRhdGEgYW5kCiAgZ2VuZXJhdGVzICNNQVhfU1lOVEhFU0lTX0NIQU5ORUxTIHRpbWUgZG9tYWluIG91dHB1dCBzYW1wbGVzLgoqLwoKc3RhdGljCnZvaWQgcW1mU3luUHJvdG90eXBlRmlyU2xvdCggSEFORExFX1FNRl9GSUxURVJfQkFOSyBxbWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKnJlYWxTbG90LCAgICAgIC8qITwgSW5wdXQ6IFBvaW50ZXIgdG8gcmVhbCBTbG90ICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKmltYWdTbG90LCAgICAgIC8qITwgSW5wdXQ6IFBvaW50ZXIgdG8gaW1hZyBTbG90ICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UX1BDTSAgKnRpbWVPdXQsICAgICAgICAgICAgIC8qITwgVGltZSBkb21haW4gZGF0YSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCAgICAgICBzdHJpZGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKewogICAgSU5UIGVyciA9IC0xOwoKICAgIHN3aXRjaCAocW1mLT5wX3N0cmlkZSkgewogICAgY2FzZSAyOgogICAgICBlcnIgPSBxbWZTeW5Qcm90b3R5cGVGaXJTbG90MihxbWYsIHJlYWxTbG90LCBpbWFnU2xvdCwgdGltZU91dCwgc3RyaWRlKTsKICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICBlcnIgPSAtMTsKICAgIH0KCiAgICAvKiBmYWxsYmFjayBpZiBjb25maWd1cmF0aW9uIG5vdCBhdmFpbGFibGUgb3IgZmFpbGVkICovCiAgICBpZihlcnIhPTApIHsKICAgICAgICBxbWZTeW5Qcm90b3R5cGVGaXJTbG90X2ZhbGxiYWNrKHFtZiwgcmVhbFNsb3QsIGltYWdTbG90LCB0aW1lT3V0LCBzdHJpZGUpOwogICAgfQp9CiNlbmRpZiAvKiBGVU5DVElPTl9xbWZTeW5Qcm90b3R5cGVGaXJTbG90ICovCgojZW5kaWYgIC8qICAoIGRlZmluZWQoX19DQ19BUk0pICYmIGRlZmluZWQoX19BUk1fQVJDSF81VEVfXykgJiYgKFNBTVBMRV9CSVRTID09IDE2KSApICYmICFkZWZpbmVkKFFNRl9UQUJMRV9GVUxMKSAqLwoKCgovKiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjKi8KCgoKI2VuZGlmICAvKiAoUU1GX05PX1BPTFk9PTUpICovCgo=