Ci8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAoKqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAxLiAgICBJTlRST0RVQ1RJT04KVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwp0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCgpBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQppbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydApvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KClBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwppbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCnRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCnRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwpzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCgpDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAphcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCgoyLiAgICBDT1BZUklHSFQgTElDRU5TRQoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CnBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKCllvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCnlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCgpZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCllvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgoKVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dApwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCgpZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCnNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgoKWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCiJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCgozLiAgICBOTyBQQVRFTlQgTElDRU5TRQoKTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCkFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCnJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KCllvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZApieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCgo0LiAgICBESVNDTEFJTUVSCgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwpvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgpDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCmluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCm9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCmFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgoKNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgoKRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCkF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCkFtIFdvbGZzbWFudGVsIDMzCjkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Cgp3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCmFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqICBGcmF1bmhvZmVyIElJUyBGREsgVG9vbHMgICoqKioqKioqKioqKioqKioqKioqKioKCiAgIEF1dGhvcihzKTogICBKb3NlZiBIb2VwZmwsIERTUCBTb2x1dGlvbnMKICAgRGVzY3JpcHRpb246IEZpeCBwb2ludCBGRlQKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiNpbmNsdWRlICJmZnQuaCIKCiNpbmNsdWRlICJmZnRfcmFkMi5oIgojaW5jbHVkZSAiRkRLX3Rvb2xzX3JvbS5oIgoKCgoKCiNkZWZpbmUgRjNDKHgpIFNUQyh4KQoKI2RlZmluZSAgICAgQzMxICAgICAgIChGM0MoMHg5MTI2MTQ2OCkpICAgICAgLyogRkwyRlhDT05TVF9EQkwoLTAuODY2MDI1NDApICAgKi8KCi8qIFBlcmZvcm1zIHRoZSBGRlQgb2YgbGVuZ3RoIDMgYWNjb3JkaW5nIHRvIHRoZSBhbGdvcml0aG0gYWZ0ZXIgd2lub2dyYWQuCiAgIE5vIHNjYWxpbmcgb2YgdGhlIGlucHV0IHZlY3RvciBiZWNhdXNlIHRoZSBzY2FsaW5nIGlzIGFscmVhZHkgZG9uZSBpbiB0aGUgcm90YXRpb24gdmVjdG9yLiAqLwpzdGF0aWMgRk9SQ0VJTkxJTkUgdm9pZCBmZnQzKEZJWFBfREJMICpSRVNUUklDVCBwRGF0KQp7CiAgRklYUF9EQkwgcjEscjI7CiAgRklYUF9EQkwgczEsczI7CiAgLyogcmVhbCBwYXJ0ICovCiAgcjEgICAgICA9IHBEYXRbMl0gKyBwRGF0WzRdOwogIHIyICAgICAgPSBmTXVsdCgocERhdFsyXSAtIHBEYXRbNF0pLCBDMzEpOwogIHBEYXRbMF0gPSBwRGF0WzBdICsgcjE7CiAgcjEgICAgICA9IHBEYXRbMF0gLSByMSAtIChyMT4+MSk7CgogIC8qIGltYWdpbmFyeSBwYXJ0ICovCiAgczEgICAgICA9IHBEYXRbM10gKyBwRGF0WzVdOwogIHMyICAgICAgPSBmTXVsdCgocERhdFszXSAtIHBEYXRbNV0pLCBDMzEpOwogIHBEYXRbMV0gPSBwRGF0WzFdICsgczE7CiAgczEgICAgICA9IHBEYXRbMV0gLSBzMSAtIChzMT4+MSk7CgogIC8qIGNvbWJpbmF0aW9uICovCiAgcERhdFsyXSA9IHIxIC0gczI7CiAgcERhdFs0XSA9IHIxICsgczI7CiAgcERhdFszXSA9IHMxICsgcjI7CiAgcERhdFs1XSA9IHMxIC0gcjI7Cn0KCgojZGVmaW5lIEY1Qyh4KSBTVEMoeCkKCiNkZWZpbmUgICAgIEM1MSAgICAgICAoRjVDKDB4NzliYzM4NTQpKSAgICAgIC8qIEZMMkZYQ09OU1RfREJMKCAwLjk1MTA1NjUyKSAgICovCiNkZWZpbmUgICAgIEM1MiAgICAgICAoRjVDKDB4OWQ4MzlkYjApKSAgICAgIC8qIEZMMkZYQ09OU1RfREJMKC0xLjUzODg0MTgwLzIpICovCiNkZWZpbmUgICAgIEM1MyAgICAgICAoRjVDKDB4ZDE4MDUzY2UpKSAgICAgIC8qIEZMMkZYQ09OU1RfREJMKC0wLjM2MzI3MTI2KSAgICovCiNkZWZpbmUgICAgIEM1NCAgICAgICAoRjVDKDB4NDc4ZGRlNjQpKSAgICAgIC8qIEZMMkZYQ09OU1RfREJMKCAwLjU1OTAxNjk5KSAgICovCiNkZWZpbmUgICAgIEM1NSAgICAgICAoRjVDKDB4YjAwMDAwMDEpKSAgICAgIC8qIEZMMkZYQ09OU1RfREJMKC0xLjI1LzIpICAgICAgICovCgovKiBwZXJmb3JtcyB0aGUgRkZUIG9mIGxlbmd0aCA1IGFjY29yZGluZyB0byB0aGUgYWxnb3JpdGhtIGFmdGVyIHdpbm9ncmFkICovCnN0YXRpYyBGT1JDRUlOTElORSB2b2lkIGZmdDUoRklYUF9EQkwgKlJFU1RSSUNUIHBEYXQpCnsKICBGSVhQX0RCTCByMSxyMixyMyxyNDsKICBGSVhQX0RCTCBzMSxzMixzMyxzNDsKICBGSVhQX0RCTCB0OwoKICAvKiByZWFsIHBhcnQgKi8KICByMSAgICAgID0gcERhdFsyXSArIHBEYXRbOF07CiAgcjQgICAgICA9IHBEYXRbMl0gLSBwRGF0WzhdOwogIHIzICAgICAgPSBwRGF0WzRdICsgcERhdFs2XTsKICByMiAgICAgID0gcERhdFs0XSAtIHBEYXRbNl07CiAgdCAgICAgICA9IGZNdWx0KChyMS1yMyksIEM1NCk7CiAgcjEgICAgICA9IHIxICsgcjM7CiAgcERhdFswXSA9IHBEYXRbMF0gKyByMTsKICAvKiBCaXQgc2hpZnQgbGVmdCBiZWNhdXNlIG9mIHRoZSBjb25zdGFudCBDNTUgd2hpY2ggd2FzIHNjYWxlZCB3aXRoIHRoZSBmYWN0b3IgMC41IGJlY2F1c2Ugb2YgdGhlIHJlcHJlc2VudGF0aW9uIG9mCiAgICAgdGhlIHZhbHVlcyBhcyBmcmFjdHMgKi8KICByMSAgICAgID0gcERhdFswXSArIChmTXVsdERpdjIocjEsIEM1NSkgPDwoMikpOwogIHIzICAgICAgPSByMSAtIHQ7CiAgcjEgICAgICA9IHIxICsgdDsKICB0ICAgICAgID0gZk11bHQoKHI0ICsgcjIpLCBDNTEpOwogIC8qIEJpdCBzaGlmdCBsZWZ0IGJlY2F1c2Ugb2YgdGhlIGNvbnN0YW50IEM1NSB3aGljaCB3YXMgc2NhbGVkIHdpdGggdGhlIGZhY3RvciAwLjUgYmVjYXVzZSBvZiB0aGUgcmVwcmVzZW50YXRpb24gb2YKICAgICB0aGUgdmFsdWVzIGFzIGZyYWN0cyAqLwogIHI0ICAgICAgPSB0ICsgKGZNdWx0RGl2MihyNCwgQzUyKSA8PCgyKSk7CiAgcjIgICAgICA9IHQgKyBmTXVsdChyMiwgQzUzKTsKCiAgLyogaW1hZ2luYXJ5IHBhcnQgKi8KICBzMSAgICAgID0gcERhdFszXSArIHBEYXRbOV07CiAgczQgICAgICA9IHBEYXRbM10gLSBwRGF0WzldOwogIHMzICAgICAgPSBwRGF0WzVdICsgcERhdFs3XTsKICBzMiAgICAgID0gcERhdFs1XSAtIHBEYXRbN107CiAgdCAgICAgICA9IGZNdWx0KChzMSAtIHMzKSwgQzU0KTsKICBzMSAgICAgID0gczEgKyBzMzsKICBwRGF0WzFdID0gcERhdFsxXSArIHMxOwogIC8qIEJpdCBzaGlmdCBsZWZ0IGJlY2F1c2Ugb2YgdGhlIGNvbnN0YW50IEM1NSB3aGljaCB3YXMgc2NhbGVkIHdpdGggdGhlIGZhY3RvciAwLjUgYmVjYXVzZSBvZiB0aGUgcmVwcmVzZW50YXRpb24gb2YKICAgICB0aGUgdmFsdWVzIGFzIGZyYWN0cyAqLwogIHMxICAgICAgPSBwRGF0WzFdICsgKGZNdWx0RGl2MihzMSwgQzU1KSA8PCgyKSk7CiAgczMgICAgICA9IHMxIC0gdDsKICBzMSAgICAgID0gczEgKyB0OwogIHQgICAgICAgPSBmTXVsdCgoczQgKyBzMiksIEM1MSk7CiAgLyogQml0IHNoaWZ0IGxlZnQgYmVjYXVzZSBvZiB0aGUgY29uc3RhbnQgQzU1IHdoaWNoIHdhcyBzY2FsZWQgd2l0aCB0aGUgZmFjdG9yIDAuNSBiZWNhdXNlIG9mIHRoZSByZXByZXNlbnRhdGlvbiBvZgogICAgIHRoZSB2YWx1ZXMgYXMgZnJhY3RzICovCiAgczQgICAgICA9IHQgKyAoZk11bHREaXYyKHM0LCBDNTIpIDw8KDIpKTsKICBzMiAgICAgID0gdCArIGZNdWx0KHMyLCBDNTMpOwoKICAvKiBjb21iaW5hdGlvbiAqLwogIHBEYXRbMl0gPSByMSArIHMyOwogIHBEYXRbOF0gPSByMSAtIHMyOwogIHBEYXRbNF0gPSByMyAtIHM0OwogIHBEYXRbNl0gPSByMyArIHM0OwoKICBwRGF0WzNdID0gczEgLSByMjsKICBwRGF0WzldID0gczEgKyByMjsKICBwRGF0WzVdID0gczMgKyByNDsKICBwRGF0WzddID0gczMgLSByNDsKfQoKCgoKI2RlZmluZSBOMyAgICAgICAgICAgICAgICAgICAgMwojZGVmaW5lIE41ICAgICAgICAgICAgICAgICAgICA1CiNkZWZpbmUgTjYgICAgICAgICAgICAgICAgICAgIDYKI2RlZmluZSBOMTUgICAgICAgICAgICAgICAgICAgMTUKCi8qIFBlcmZvcm1zIHRoZSBGRlQgb2YgbGVuZ3RoIDE1LiBJdCBpcyBzcGxpdCBpbnRvIEZGVHMgb2YgbGVuZ3RoIDMgYW5kIGxlbmd0aCA1LiAqLwpzdGF0aWMgaW5saW5lIHZvaWQgZmZ0MTUoRklYUF9EQkwgKnBJbnB1dCkKewogIEZJWFBfREJMICBhRHN0WzIqTjE1XTsKICBGSVhQX0RCTCAgYURzdDFbMipOMTVdOwogIGludCAgICBpLGssbDsKCiAgLyogU29ydCBpbnB1dCB2ZWN0b3IgZm9yIGZmdCdzIG9mIGxlbmd0aCAzCiAgaW5wdXQzKDA6MikgICA9IFtpbnB1dCgwKSBpbnB1dCg1KSBpbnB1dCgxMCldOwogIGlucHV0MygzOjUpICAgPSBbaW5wdXQoMykgaW5wdXQoOCkgaW5wdXQoMTMpXTsKICBpbnB1dDMoNjo4KSAgID0gW2lucHV0KDYpIGlucHV0KDExKSBpbnB1dCgxKV07CiAgaW5wdXQzKDk6MTEpICA9IFtpbnB1dCg5KSBpbnB1dCgxNCkgaW5wdXQoNCldOwogIGlucHV0MygxMjoxNCkgPSBbaW5wdXQoMTIpIGlucHV0KDIpIGlucHV0KDcpXTsgKi8KICB7CiAgICBjb25zdCBGSVhQX0RCTCAqcFNyYyA9IHBJbnB1dDsKICAgIEZJWFBfREJMICpSRVNUUklDVCBwRHN0ID0gYURzdDsKICAgIC8qIE1lcmdlIDMgbG9vcHMgaW50byBvbmUsIHNraXAgY2FsbCBvZiBmZnQzICovCiAgICBmb3IoaT0wLGw9MCxrPTA7IGk8TjU7IGkrKywgays9NikKICAgIHsKICAgICAgcERzdFtrKzBdID0gcFNyY1tsXTsKICAgICAgcERzdFtrKzFdID0gcFNyY1tsKzFdOwogICAgICBsICs9IDIqTjU7CiAgICAgIGlmIChsID49ICgyKk4xNSkpCiAgICAgICAgICBsIC09ICgyKk4xNSk7CgogICAgICBwRHN0W2srMl0gPSBwU3JjW2xdOwogICAgICBwRHN0W2srM10gPSBwU3JjW2wrMV07CiAgICAgIGwgKz0gMipONTsKICAgICAgaWYgKGwgPj0gKDIqTjE1KSkKICAgICAgICAgIGwgLT0gKDIqTjE1KTsKICAgICAgcERzdFtrKzRdID0gcFNyY1tsXTsKICAgICAgcERzdFtrKzVdID0gcFNyY1tsKzFdOwogICAgICBsICs9ICgyKk41KSArICgyKk4zKTsKICAgICAgaWYgKGwgPj0gKDIqTjE1KSkKICAgICAgICAgIGwgLT0gKDIqTjE1KTsKCiAgICAgIC8qIGZmdDMgbWVyZ2VkIHdpdGggc2hpZnQgcmlnaHQgYnkgMiBsb29wICovCiAgICAgIEZJWFBfREJMIHIxLHIyLHIzOwogICAgICBGSVhQX0RCTCBzMSxzMjsKICAgICAgLyogcmVhbCBwYXJ0ICovCiAgICAgIHIxICAgICAgPSBwRHN0W2srMl0gKyBwRHN0W2srNF07CiAgICAgIHIyICAgICAgPSBmTXVsdCgocERzdFtrKzJdIC0gcERzdFtrKzRdKSwgQzMxKTsKICAgICAgczEgICAgICA9IHBEc3RbayswXTsKICAgICAgcERzdFtrKzBdID0gKHMxICsgcjEpPj4yOwogICAgICByMSAgICAgID0gczEgLSAocjE+PjEpOwoKICAgICAgLyogaW1hZ2luYXJ5IHBhcnQgKi8KICAgICAgczEgICAgICA9IHBEc3RbayszXSArIHBEc3Rbays1XTsKICAgICAgczIgICAgICA9IGZNdWx0KChwRHN0W2srM10gLSBwRHN0W2srNV0pLCBDMzEpOwogICAgICByMyAgICAgID0gcERzdFtrKzFdOwogICAgICBwRHN0W2srMV0gPSAocjMgKyBzMSk+PjI7CiAgICAgIHMxICAgICAgPSByMyAtIChzMT4+MSk7CgogICAgICAvKiBjb21iaW5hdGlvbiAqLwogICAgICBwRHN0W2srMl0gPSAocjEgLSBzMik+PjI7CiAgICAgIHBEc3Rbays0XSA9IChyMSArIHMyKT4+MjsKICAgICAgcERzdFtrKzNdID0gKHMxICsgcjIpPj4yOwogICAgICBwRHN0W2srNV0gPSAoczEgLSByMik+PjI7CiAgICB9CiAgfQogIC8qIFNvcnQgaW5wdXQgdmVjdG9yIGZvciBmZnQncyBvZiBsZW5ndGggNQogIGlucHV0NSgwOjQpICAgPSBbb3V0cHV0MygwKSBvdXRwdXQzKDMpIG91dHB1dDMoNikgb3V0cHV0Myg5KSBvdXRwdXQzKDEyKV07CiAgaW5wdXQ1KDU6OSkgICA9IFtvdXRwdXQzKDEpIG91dHB1dDMoNCkgb3V0cHV0Myg3KSBvdXRwdXQzKDEwKSBvdXRwdXQzKDEzKV07CiAgaW5wdXQ1KDEwOjE0KSA9IFtvdXRwdXQzKDIpIG91dHB1dDMoNSkgb3V0cHV0Myg4KSBvdXRwdXQzKDExKSBvdXRwdXQzKDE0KV07ICovCiAgLyogTWVyZ2UgMiBsb29wcyBpbnRvIG9uZSwgYnJpbmdzIGFib3V0IDEwJSAqLwogIHsKICAgIGNvbnN0IEZJWFBfREJMICpwU3JjID0gYURzdDsKICAgIEZJWFBfREJMICpSRVNUUklDVCBwRHN0ID0gYURzdDE7CiAgICBmb3IoaT0wLGw9MCxrPTA7IGk8TjM7IGkrKywgays9MTApCiAgICB7CiAgICAgIGwgPSAyKmk7CiAgICAgIHBEc3RbayswXSA9IHBTcmNbbCswXTsKICAgICAgcERzdFtrKzFdID0gcFNyY1tsKzFdOwogICAgICBwRHN0W2srMl0gPSBwU3JjW2wrMCsoMipOMyldOwogICAgICBwRHN0W2srM10gPSBwU3JjW2wrMSsoMipOMyldOwogICAgICBwRHN0W2srNF0gPSBwU3JjW2wrMCsoNCpOMyldOwogICAgICBwRHN0W2srNV0gPSBwU3JjW2wrMSsoNCpOMyldOwogICAgICBwRHN0W2srNl0gPSBwU3JjW2wrMCsoNipOMyldOwogICAgICBwRHN0W2srN10gPSBwU3JjW2wrMSsoNipOMyldOwogICAgICBwRHN0W2srOF0gPSBwU3JjW2wrMCsoOCpOMyldOwogICAgICBwRHN0W2srOV0gPSBwU3JjW2wrMSsoOCpOMyldOwogICAgICBmZnQ1KCZwRHN0W2tdKTsKICAgIH0KICB9CiAgLyogU29ydCBvdXRwdXQgdmVjdG9yIG9mIGxlbmd0aCAxNQogIG91dHB1dCA9IFtvdXQ1KDApICBvdXQ1KDYpICBvdXQ1KDEyKSBvdXQ1KDMpICBvdXQ1KDkpCiAgICAgICAgICAgIG91dDUoMTApIG91dDUoMSkgIG91dDUoNykgIG91dDUoMTMpIG91dDUoNCkKICAgICAgICAgICAgb3V0NSg1KSAgb3V0NSgxMSkgb3V0NSgyKSAgb3V0NSg4KSAgb3V0NSgxNCldOyAqLwogIC8qIG9wdGltaXplIGNsdW1zeSBsb29wLCBicmluZ3MgYWJvdXQgNSUgKi8KICB7CiAgICBjb25zdCBGSVhQX0RCTCAqcFNyYyA9IGFEc3QxOwogICAgRklYUF9EQkwgKlJFU1RSSUNUIHBEc3QgPSBwSW5wdXQ7CiAgICBmb3IoaT0wLGw9MCxrPTA7IGk8TjM7IGkrKywgays9MTApCiAgICB7CiAgICAgIHBEc3RbayswXSA9IHBTcmNbbF07CiAgICAgIHBEc3RbaysxXSA9IHBTcmNbbCsxXTsKICAgICAgbCArPSAoMipONik7CiAgICAgIGlmIChsID49ICgyKk4xNSkpCiAgICAgICAgICBsIC09ICgyKk4xNSk7CiAgICAgIHBEc3RbaysyXSA9IHBTcmNbbF07CiAgICAgIHBEc3RbayszXSA9IHBTcmNbbCsxXTsKICAgICAgbCArPSAoMipONik7CiAgICAgIGlmIChsID49ICgyKk4xNSkpCiAgICAgICAgICBsIC09ICgyKk4xNSk7CiAgICAgIHBEc3Rbays0XSA9IHBTcmNbbF07CiAgICAgIHBEc3Rbays1XSA9IHBTcmNbbCsxXTsKICAgICAgbCArPSAoMipONik7CiAgICAgIGlmIChsID49ICgyKk4xNSkpCiAgICAgICAgICBsIC09ICgyKk4xNSk7CiAgICAgIHBEc3Rbays2XSA9IHBTcmNbbF07CiAgICAgIHBEc3Rbays3XSA9IHBTcmNbbCsxXTsKICAgICAgbCArPSAoMipONik7CiAgICAgIGlmIChsID49ICgyKk4xNSkpCiAgICAgICAgICBsIC09ICgyKk4xNSk7CiAgICAgIHBEc3Rbays4XSA9IHBTcmNbbF07CiAgICAgIHBEc3Rbays5XSA9IHBTcmNbbCsxXTsKICAgICAgbCArPSAyOyAgICAvKiBubyBtb2R1bG8gY2hlY2sgbmVlZGVkLCBpdCBjYW5ub3Qgb2NjdXIgKi8KICAgIH0KICB9Cn0KCiNkZWZpbmUgV19QaUZPVVJUSCBTVEMoMHg1YTgyNzk5YSkKI2lmbmRlZiBTVU1ESUZGX1BJRk9VUlRICiNkZWZpbmUgU1VNRElGRl9QSUZPVVJUSChkaWZmLHN1bSxhLGIpIFwKICB7IFwKICAgIEZJWFBfREJMIHdhLCB3YjtcCiAgICB3YSA9IGZNdWx0RGl2MihhLCBXX1BpRk9VUlRIKTtcCiAgICB3YiA9IGZNdWx0RGl2MihiLCBXX1BpRk9VUlRIKTtcCiAgICBkaWZmID0gd2IgLSB3YTtcCiAgICBzdW0gID0gd2IgKyB3YTtcCiAgfQojZW5kaWYKCi8qIFRoaXMgdmVyc2lvbiBpcyBtb3JlIG92ZXJmbG93IHNhdmUsIGJ1dCBsZXNzIGN5Y2xlIG9wdGltYWwuICovCiNkZWZpbmUgU1VNRElGRl9FSUdUSCh4LCB5LCBpeCwgaXksIHZyLCB2aSwgdXIsIHVpKSBcCiAgdnIgPSAoeFsgMCArIGl4XT4+MSkgKyAoeFsxNiArIGl4XT4+MSk7ICAvKiBSZSBBICsgUmUgQiAqLyBcCiAgdmkgPSAoeFsgOCArIGl4XT4+MSkgKyAoeFsyNCArIGl4XT4+MSk7ICAgICAvKiBSZSBDICsgUmUgRCAqLyBcCiAgdXIgPSAoeFsgMSArIGl4XT4+MSkgKyAoeFsxNyArIGl4XT4+MSk7ICAvKiBJbSBBICsgSW0gQiAqLyBcCiAgdWkgPSAoeFsgOSArIGl4XT4+MSkgKyAoeFsyNSArIGl4XT4+MSk7ICAgICAvKiBJbSBDICsgSW0gRCAqLyBcCiAgeVsgMCArIGl5XSA9IHZyICsgdmk7ICAgICAvKiBSZSBBJyA9IFJlQSArIFJlQiArUmVDICsgUmVEICovICAgIFwKICB5WyA0ICsgaXldID0gdnIgLSB2aTsgICAgIC8qIFJlIEMnID0gLShSZUMrUmVEKSArIChSZUErUmVCKSAqLyAgXAogIHlbIDEgKyBpeV0gPSB1ciArIHVpOyAgICAgLyogSW0gQScgPSBzdW0gb2YgaW1hZyB2YWx1ZXMgKi8gICAgICBcCiAgeVsgNSArIGl5XSA9IHVyIC0gdWk7ICAgICAvKiBJbSBDJyA9IC1JbSBDIC1JbSBEICtJbSBBICtJbSBCICovIFwKICB2ciAtPSB4WzE2ICsgaXhdOyAgICAgICAgICAgICAgLyogUmUgQSAtIFJlIEIgKi8gXAogIHZpID0gdmkgLSB4WzI0ICsgaXhdOyAgICAgICAgICAvKiBSZSBDIC0gUmUgRCAqLyBcCiAgdXIgLT0geFsxNyArIGl4XTsgICAgICAgICAgICAgIC8qIEltIEEgLSBJbSBCICovIFwKICB1aSA9IHVpIC0geFsyNSArIGl4XTsgICAgICAgICAgLyogSW0gQyAtIEltIEQgKi8gXAogIHlbIDIgKyBpeV0gPSB1aSArIHZyOyAgICAgICAgICAvKiBSZSBCJyA9IEltIEMgLSBJbSBEICArIFJlIEEgLSBSZSBCICovIFwKICB5WyA2ICsgaXldID0gdnIgLSB1aTsgICAgICAgICAgLyogUmUgRCcgPSAtSW0gQyArIEltIEQgKyBSZSBBIC0gUmUgQiAqLyBcCiAgeVsgMyArIGl5XSA9IHVyIC0gdmk7ICAgICAgICAgIC8qIEltIEInPSAtUmUgQyArIFJlIEQgKyBJbSBBIC0gSW0gQiAqLyAgXAogIHlbIDcgKyBpeV0gPSB2aSArIHVyOyAgICAgICAgICAvKiBJbSBEJz0gUmUgQyAtIFJlIEQgKyBJbSBBIC0gSW0gQiAqLwoKc3RhdGljIGNvbnN0IEZJWFBfU1RQIGZmdDE2X3cxNlsyXSA9ICB7IFNUQ1AoMHg3NjQxYWYzZCwgMHgzMGZiYzU0ZCksIFNUQ1AoMHgzMGZiYzU0ZCwgMHg3NjQxYWYzZCkgfTsKCkxOS19TRUNUSU9OX0NPREVfTDEKaW5saW5lIHZvaWQgZmZ0XzE2KEZJWFBfREJMICpSRVNUUklDVCB4KQp7CiAgRklYUF9EQkwgdnIsIHZpLCB1ciwgdWk7CiAgRklYUF9EQkwgeVszMl07CgogIFNVTURJRkZfRUlHVEgoeCwgeSwgMCwgIDAsIHZyLCB2aSwgdXIsIHVpKTsKICBTVU1ESUZGX0VJR1RIKHgsIHksIDQsICA4LCB2ciwgdmksIHVyLCB1aSk7CiAgU1VNRElGRl9FSUdUSCh4LCB5LCAyLCAxNiwgdnIsIHZpLCB1ciwgdWkpOwogIFNVTURJRkZfRUlHVEgoeCwgeSwgNiwgMjQsIHZyLCB2aSwgdXIsIHVpKTsKCi8vIHh0MSA9ICAwCi8vIHh0MiA9ICA4CiAgdnIgPSB5WyA4XTsKICB2aSA9IHlbIDldOwogIHVyID0geVsgMF0+PjE7CiAgdWkgPSB5WyAxXT4+MTsKICB4WyAwXSA9IHVyICsgKHZyPj4xKTsKICB4WyAxXSA9IHVpICsgKHZpPj4xKTsKICB4WyA4XSA9IHVyIC0gKHZyPj4xKTsKICB4WyA5XSA9IHVpIC0gKHZpPj4xKTsKCi8vIHh0MSA9ICA0Ci8vIHh0MiA9IDEyCiAgdnIgPSB5WzEzXTsKICB2aSA9IHlbMTJdOwogIHVyID0geVsgNF0+PjE7CiAgdWkgPSB5WyA1XT4+MTsKICB4WyA0XSA9IHVyICsgKHZyPj4xKTsKICB4WyA1XSA9IHVpIC0gKHZpPj4xKTsKICB4WzEyXSA9IHVyIC0gKHZyPj4xKTsKICB4WzEzXSA9IHVpICsgKHZpPj4xKTsKCi8vIHh0MSA9IDE2Ci8vIHh0MiA9IDI0CiAgdnIgPSB5WzI0XTsKICB2aSA9IHlbMjVdOwogIHVyID0geVsxNl0+PjE7CiAgdWkgPSB5WzE3XT4+MTsKICB4WzE2XSA9IHVyICsgKHZyPj4xKTsKICB4WzE3XSA9IHVpICsgKHZpPj4xKTsKICB4WzI0XSA9IHVyIC0gKHZyPj4xKTsKICB4WzI1XSA9IHVpIC0gKHZpPj4xKTsKCi8vIHh0MSA9IDIwCi8vIHh0MiA9IDI4CiAgdnIgPSB5WzI5XTsKICB2aSA9IHlbMjhdOwogIHVyID0geVsyMF0+PjE7CiAgdWkgPSB5WzIxXT4+MTsKICB4WzIwXSA9IHVyICsgKHZyPj4xKTsKICB4WzIxXSA9IHVpIC0gKHZpPj4xKTsKICB4WzI4XSA9IHVyIC0gKHZyPj4xKTsKICB4WzI5XSA9IHVpICsgKHZpPj4xKTsKCiAgLy8geHQxID0gIDIKLy8geHQyID0gMTAKICBTVU1ESUZGX1BJRk9VUlRIKHZpLCB2ciwgeVsxMF0sIHlbMTFdKQogIC8vdnIgPSBmTXVsdERpdjIoKHlbMTFdICsgeVsxMF0pLFdfUGlGT1VSVEgpOwogIC8vdmkgPSBmTXVsdERpdjIoKHlbMTFdIC0geVsxMF0pLFdfUGlGT1VSVEgpOwogIHVyID0geVsgMl07CiAgdWkgPSB5WyAzXTsKICB4WyAyXSA9ICh1cj4+MSkgKyB2cjsKICB4WyAzXSA9ICh1aT4+MSkgKyB2aTsKICB4WzEwXSA9ICh1cj4+MSkgLSB2cjsKICB4WzExXSA9ICh1aT4+MSkgLSB2aTsKCi8vIHh0MSA9ICA2Ci8vIHh0MiA9IDE0CiAgU1VNRElGRl9QSUZPVVJUSCh2ciwgdmksIHlbMTRdLCB5WzE1XSkKICB1ciA9IHlbIDZdOwogIHVpID0geVsgN107CiAgeFsgNl0gPSAodXI+PjEpICsgdnI7CiAgeFsgN10gPSAodWk+PjEpIC0gdmk7CiAgeFsxNF0gPSAodXI+PjEpIC0gdnI7CiAgeFsxNV0gPSAodWk+PjEpICsgdmk7CgovLyB4dDEgPSAxOAovLyB4dDIgPSAyNgogIFNVTURJRkZfUElGT1VSVEgodmksIHZyLCB5WzI2XSwgeVsyN10pCiAgdXIgPSB5WzE4XTsKICB1aSA9IHlbMTldOwogIHhbMThdID0gKHVyPj4xKSArIHZyOwogIHhbMTldID0gKHVpPj4xKSArIHZpOwogIHhbMjZdID0gKHVyPj4xKSAtIHZyOwogIHhbMjddID0gKHVpPj4xKSAtIHZpOwoKLy8geHQxID0gMjIKLy8geHQyID0gMzAKICBTVU1ESUZGX1BJRk9VUlRIKHZyLCB2aSwgeVszMF0sIHlbMzFdKQogIHVyID0geVsyMl07CiAgdWkgPSB5WzIzXTsKICB4WzIyXSA9ICh1cj4+MSkgKyB2cjsKICB4WzIzXSA9ICh1aT4+MSkgLSB2aTsKICB4WzMwXSA9ICh1cj4+MSkgLSB2cjsKICB4WzMxXSA9ICh1aT4+MSkgKyB2aTsKCi8vIHh0MSA9ICAwCi8vIHh0MiA9IDE2CiAgdnIgPSB4WzE2XTsKICB2aSA9IHhbMTddOwogIHVyID0geFsgMF0+PjE7CiAgdWkgPSB4WyAxXT4+MTsKICB4WyAwXSA9IHVyICsgKHZyPj4xKTsKICB4WyAxXSA9IHVpICsgKHZpPj4xKTsKICB4WzE2XSA9IHVyIC0gKHZyPj4xKTsKICB4WzE3XSA9IHVpIC0gKHZpPj4xKTsKCi8vIHh0MSA9ICA4Ci8vIHh0MiA9IDI0CiAgdmkgPSB4WzI0XTsKICB2ciA9IHhbMjVdOwogIHVyID0geFsgOF0+PjE7CiAgdWkgPSB4WyA5XT4+MTsKICB4WyA4XSA9IHVyICsgKHZyPj4xKTsKICB4WyA5XSA9IHVpIC0gKHZpPj4xKTsKICB4WzI0XSA9IHVyIC0gKHZyPj4xKTsKICB4WzI1XSA9IHVpICsgKHZpPj4xKTsKCi8vIHh0MSA9ICAyCi8vIHh0MiA9IDE4CiAgY3BseE11bHREaXYyKCZ2aSwgJnZyLCB4WzE5XSwgeFsxOF0sIGZmdDE2X3cxNlswXSk7CiAgdXIgPSB4WyAyXTsKICB1aSA9IHhbIDNdOwogIHhbIDJdID0gKHVyPj4xKSArIHZyOwogIHhbIDNdID0gKHVpPj4xKSArIHZpOwogIHhbMThdID0gKHVyPj4xKSAtIHZyOwogIHhbMTldID0gKHVpPj4xKSAtIHZpOwoKLy8geHQxID0gMTAKLy8geHQyID0gMjYKICBjcGx4TXVsdERpdjIoJnZyLCAmdmksIHhbMjddLCB4WzI2XSwgZmZ0MTZfdzE2WzBdKTsKICB1ciA9IHhbMTBdOwogIHVpID0geFsxMV07CiAgeFsxMF0gPSAodXI+PjEpICsgdnI7CiAgeFsxMV0gPSAodWk+PjEpIC0gdmk7CiAgeFsyNl0gPSAodXI+PjEpIC0gdnI7CiAgeFsyN10gPSAodWk+PjEpICsgdmk7CgovLyB4dDEgPSAgNAovLyB4dDIgPSAyMAogIFNVTURJRkZfUElGT1VSVEgodmksIHZyLCB4WzIwXSwgeFsyMV0pCiAgdXIgPSB4WyA0XTsKICB1aSA9IHhbIDVdOwogIHhbIDRdID0gKHVyPj4xKSArIHZyOwogIHhbIDVdID0gKHVpPj4xKSArIHZpOwogIHhbMjBdID0gKHVyPj4xKSAtIHZyOwogIHhbMjFdID0gKHVpPj4xKSAtIHZpOwoKLy8geHQxID0gMTIKLy8geHQyID0gMjgKICBTVU1ESUZGX1BJRk9VUlRIKHZyLCB2aSwgeFsyOF0sIHhbMjldKQogIHVyID0geFsxMl07CiAgdWkgPSB4WzEzXTsKICB4WzEyXSA9ICh1cj4+MSkgKyB2cjsKICB4WzEzXSA9ICh1aT4+MSkgLSB2aTsKICB4WzI4XSA9ICh1cj4+MSkgLSB2cjsKICB4WzI5XSA9ICh1aT4+MSkgKyB2aTsKCi8vIHh0MSA9ICA2Ci8vIHh0MiA9IDIyCiAgY3BseE11bHREaXYyKCZ2aSwgJnZyLCB4WzIzXSwgeFsyMl0sIGZmdDE2X3cxNlsxXSk7CiAgdXIgPSB4WyA2XTsKICB1aSA9IHhbIDddOwogIHhbIDZdID0gKHVyPj4xKSArIHZyOwogIHhbIDddID0gKHVpPj4xKSArIHZpOwogIHhbMjJdID0gKHVyPj4xKSAtIHZyOwogIHhbMjNdID0gKHVpPj4xKSAtIHZpOwoKLy8geHQxID0gMTQKLy8geHQyID0gMzAKICBjcGx4TXVsdERpdjIoJnZyLCAmdmksIHhbMzFdLCB4WzMwXSwgZmZ0MTZfdzE2WzFdKTsKICB1ciA9IHhbMTRdOwogIHVpID0geFsxNV07CiAgeFsxNF0gPSAodXI+PjEpICsgdnI7CiAgeFsxNV0gPSAodWk+PjEpIC0gdmk7CiAgeFszMF0gPSAodXI+PjEpIC0gdnI7CiAgeFszMV0gPSAodWk+PjEpICsgdmk7Cn0KCiNpZm5kZWYgRlVOQ1RJT05fZmZ0XzMyCnN0YXRpYyBjb25zdCBGSVhQX1NUUCBmZnQzMl93MzJbNl0gPQp7CiAgU1RDUCAoMHg3NjQxYWYzZCwgMHgzMGZiYzU0ZCksIFNUQ1AoMHgzMGZiYzU0ZCwgMHg3NjQxYWYzZCksIFNUQ1AoMHg3ZDhhNWY0MCwgMHgxOGY4YjgzYyksCiAgU1RDUCAoMHg2YTZkOThhNCwgMHg0NzFjZWNlNyksIFNUQ1AoMHg0NzFjZWNlNywgMHg2YTZkOThhNCksIFNUQ1AoMHgxOGY4YjgzYywgMHg3ZDhhNWY0MCkKfTsKCkxOS19TRUNUSU9OX0NPREVfTDEKaW5saW5lIHZvaWQgZmZ0XzMyKEZJWFBfREJMICp4KQp7CgojZGVmaW5lIFdfUGlGT1VSVEggU1RDKDB4NWE4Mjc5OWEpCgogIEZJWFBfREJMIHZyLHZpLHVyLHVpOwogIEZJWFBfREJMIHlbNjRdOwoKICAvKgogICAqIDErMiBzdGFnZSByYWRpeCA0CiAgICovCgovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKICAvLyBpID0gMAogIHZyID0gKHhbIDBdICsgeFszMl0pPj4xOyAgLyogUmUgQSArIFJlIEIgKi8KICB2aSA9ICh4WzE2XSArIHhbNDhdKTsgICAgIC8qIFJlIEMgKyBSZSBEICovCiAgdXIgPSAoeFsgMV0gKyB4WzMzXSk+PjE7ICAvKiBJbSBBICsgSW0gQiAqLwogIHVpID0gKHhbMTddICsgeFs0OV0pOyAgICAgLyogSW0gQyArIEltIEQgKi8KCiAgeVsgMF0gPSB2ciArICh2aT4+MSk7ICAgICAvKiBSZSBBJyA9IFJlQSArIFJlQiArUmVDICsgUmVEICovCiAgeVsgNF0gPSB2ciAtICh2aT4+MSk7ICAgICAvKiBSZSBDJyA9IC0oUmVDK1JlRCkgKyAoUmVBK1JlQikgKi8KICB5WyAxXSA9IHVyICsgKHVpPj4xKTsgICAgIC8qIEltIEEnID0gc3VtIG9mIGltYWcgdmFsdWVzICovCiAgeVsgNV0gPSB1ciAtICh1aT4+MSk7ICAgICAvKiBJbSBDJyA9IC1JbSBDIC1JbSBEICtJbSBBICtJbSBCICovCgogIHZyIC09IHhbMzJdOyAgICAgICAgICAgICAgLyogUmUgQSAtIFJlIEIgKi8KICB2aSA9ICh2aT4+MSkgLSB4WzQ4XTsgICAgIC8qIFJlIEMgLSBSZSBEICovCiAgdXIgLT0geFszM107ICAgICAgICAgICAgICAvKiBJbSBBIC0gSW0gQiAqLwogIHVpID0gKHVpPj4xKSAtIHhbNDldOyAgICAgLyogSW0gQyAtIEltIEQgKi8KCiAgeVsgMl0gPSB1aSArIHZyOyAgICAgICAgICAvKiBSZSBCJyA9IEltIEMgLSBJbSBEICArIFJlIEEgLSBSZSBCICovCiAgeVsgNl0gPSB2ciAtIHVpOyAgICAgICAgICAvKiBSZSBEJyA9IC1JbSBDICsgSW0gRCArIFJlIEEgLSBSZSBCICovCiAgeVsgM10gPSB1ciAtIHZpOyAgICAgICAgICAvKiBJbSBCJz0gLVJlIEMgKyBSZSBEICsgSW0gQSAtIEltIEIgKi8KICB5WyA3XSA9IHZpICsgdXI7ICAgICAgICAgIC8qIEltIEQnPSBSZSBDIC0gUmUgRCArIEltIEEgLSBJbSBCICovCgogIC8vaT04CiAgdnIgPSAoeFsgOF0gKyB4WzQwXSk+PjE7ICAvKiBSZSBBICsgUmUgQiAqLwogIHZpID0gKHhbMjRdICsgeFs1Nl0pOyAgICAgLyogUmUgQyArIFJlIEQgKi8KICB1ciA9ICh4WyA5XSArIHhbNDFdKT4+MTsgIC8qIEltIEEgKyBJbSBCICovCiAgdWkgPSAoeFsyNV0gKyB4WzU3XSk7ICAgICAvKiBJbSBDICsgSW0gRCAqLwoKICB5WyA4XSA9IHZyICsgKHZpPj4xKTsgICAgIC8qIFJlIEEnID0gUmVBICsgUmVCICtSZUMgKyBSZUQgKi8KICB5WzEyXSA9IHZyIC0gKHZpPj4xKTsgICAgIC8qIFJlIEMnID0gLShSZUMrUmVEKSArIChSZUErUmVCKSAqLwogIHlbIDldID0gdXIgKyAodWk+PjEpOyAgICAgLyogSW0gQScgPSBzdW0gb2YgaW1hZyB2YWx1ZXMgKi8KICB5WzEzXSA9IHVyIC0gKHVpPj4xKTsgICAgIC8qIEltIEMnID0gLUltIEMgLUltIEQgK0ltIEEgK0ltIEIgKi8KCiAgdnIgLT0geFs0MF07ICAgICAgICAgICAgICAvKiBSZSBBIC0gUmUgQiAqLwogIHZpID0gKHZpPj4xKSAtIHhbNTZdOyAgICAgLyogUmUgQyAtIFJlIEQgKi8KICB1ciAtPSB4WzQxXTsgICAgICAgICAgICAgIC8qIEltIEEgLSBJbSBCICovCiAgdWkgPSAodWk+PjEpIC0geFs1N107ICAgICAvKiBJbSBDIC0gSW0gRCAqLwoKICB5WzEwXSA9IHVpICsgdnI7ICAgICAgICAgIC8qIFJlIEInID0gSW0gQyAtIEltIEQgICsgUmUgQSAtIFJlIEIgKi8KICB5WzE0XSA9IHZyIC0gdWk7ICAgICAgICAgIC8qIFJlIEQnID0gLUltIEMgKyBJbSBEICsgUmUgQSAtIFJlIEIgKi8KICB5WzExXSA9IHVyIC0gdmk7ICAgICAgICAgIC8qIEltIEInPSAtUmUgQyArIFJlIEQgKyBJbSBBIC0gSW0gQiAqLwogIHlbMTVdID0gdmkgKyB1cjsgICAgICAgICAgLyogSW0gRCc9IFJlIEMgLSBSZSBEICsgSW0gQSAtIEltIEIgKi8KCiAgLy9pPTE2CiAgdnIgPSAoeFsgNF0gKyB4WzM2XSk+PjE7ICAvKiBSZSBBICsgUmUgQiAqLwogIHZpID0gKHhbMjBdICsgeFs1Ml0pOyAgICAgLyogUmUgQyArIFJlIEQgKi8KICB1ciA9ICh4WyA1XSArIHhbMzddKT4+MTsgIC8qIEltIEEgKyBJbSBCICovCiAgdWkgPSAoeFsyMV0gKyB4WzUzXSk7ICAgICAvKiBJbSBDICsgSW0gRCAqLwoKICB5WzE2XSA9IHZyICsgKHZpPj4xKTsgICAgIC8qIFJlIEEnID0gUmVBICsgUmVCICtSZUMgKyBSZUQgKi8KICB5WzIwXSA9IHZyIC0gKHZpPj4xKTsgICAgIC8qIFJlIEMnID0gLShSZUMrUmVEKSArIChSZUErUmVCKSAqLwogIHlbMTddID0gdXIgKyAodWk+PjEpOyAgICAgLyogSW0gQScgPSBzdW0gb2YgaW1hZyB2YWx1ZXMgKi8KICB5WzIxXSA9IHVyIC0gKHVpPj4xKTsgICAgIC8qIEltIEMnID0gLUltIEMgLUltIEQgK0ltIEEgK0ltIEIgKi8KCiAgdnIgLT0geFszNl07ICAgICAgICAgICAgICAvKiBSZSBBIC0gUmUgQiAqLwogIHZpID0gKHZpPj4xKSAtIHhbNTJdOyAgICAgLyogUmUgQyAtIFJlIEQgKi8KICB1ciAtPSB4WzM3XTsgICAgICAgICAgICAgIC8qIEltIEEgLSBJbSBCICovCiAgdWkgPSAodWk+PjEpIC0geFs1M107ICAgICAvKiBJbSBDIC0gSW0gRCAqLwoKICB5WzE4XSA9IHVpICsgdnI7ICAgICAgICAgIC8qIFJlIEInID0gSW0gQyAtIEltIEQgICsgUmUgQSAtIFJlIEIgKi8KICB5WzIyXSA9IHZyIC0gdWk7ICAgICAgICAgIC8qIFJlIEQnID0gLUltIEMgKyBJbSBEICsgUmUgQSAtIFJlIEIgKi8KICB5WzE5XSA9IHVyIC0gdmk7ICAgICAgICAgIC8qIEltIEInPSAtUmUgQyArIFJlIEQgKyBJbSBBIC0gSW0gQiAqLwogIHlbMjNdID0gdmkgKyB1cjsgICAgICAgICAgLyogSW0gRCc9IFJlIEMgLSBSZSBEICsgSW0gQSAtIEltIEIgKi8KCiAgLy9pPTI0CiAgdnIgPSAoeFsxMl0gKyB4WzQ0XSk+PjE7ICAvKiBSZSBBICsgUmUgQiAqLwogIHZpID0gKHhbMjhdICsgeFs2MF0pOyAgICAgLyogUmUgQyArIFJlIEQgKi8KICB1ciA9ICh4WzEzXSArIHhbNDVdKT4+MTsgIC8qIEltIEEgKyBJbSBCICovCiAgdWkgPSAoeFsyOV0gKyB4WzYxXSk7ICAgICAvKiBJbSBDICsgSW0gRCAqLwoKICB5WzI0XSA9IHZyICsgKHZpPj4xKTsgICAgIC8qIFJlIEEnID0gUmVBICsgUmVCICtSZUMgKyBSZUQgKi8KICB5WzI4XSA9IHZyIC0gKHZpPj4xKTsgICAgIC8qIFJlIEMnID0gLShSZUMrUmVEKSArIChSZUErUmVCKSAqLwogIHlbMjVdID0gdXIgKyAodWk+PjEpOyAgICAgLyogSW0gQScgPSBzdW0gb2YgaW1hZyB2YWx1ZXMgKi8KICB5WzI5XSA9IHVyIC0gKHVpPj4xKTsgICAgIC8qIEltIEMnID0gLUltIEMgLUltIEQgK0ltIEEgK0ltIEIgKi8KCiAgdnIgLT0geFs0NF07ICAgICAgICAgICAgICAvKiBSZSBBIC0gUmUgQiAqLwogIHZpID0gKHZpPj4xKSAtIHhbNjBdOyAgICAgLyogUmUgQyAtIFJlIEQgKi8KICB1ciAtPSB4WzQ1XTsgICAgICAgICAgICAgIC8qIEltIEEgLSBJbSBCICovCiAgdWkgPSAodWk+PjEpIC0geFs2MV07ICAgICAvKiBJbSBDIC0gSW0gRCAqLwoKICB5WzI2XSA9IHVpICsgdnI7ICAgICAgICAgIC8qIFJlIEInID0gSW0gQyAtIEltIEQgICsgUmUgQSAtIFJlIEIgKi8KICB5WzMwXSA9IHZyIC0gdWk7ICAgICAgICAgIC8qIFJlIEQnID0gLUltIEMgKyBJbSBEICsgUmUgQSAtIFJlIEIgKi8KICB5WzI3XSA9IHVyIC0gdmk7ICAgICAgICAgIC8qIEltIEInPSAtUmUgQyArIFJlIEQgKyBJbSBBIC0gSW0gQiAqLwogIHlbMzFdID0gdmkgKyB1cjsgICAgICAgICAgLyogSW0gRCc9IFJlIEMgLSBSZSBEICsgSW0gQSAtIEltIEIgKi8KCiAgLy8gaSA9IDMyCiAgdnIgPSAoeFsgMl0gKyB4WzM0XSk+PjE7ICAvKiBSZSBBICsgUmUgQiAqLwogIHZpID0gKHhbMThdICsgeFs1MF0pOyAgICAgLyogUmUgQyArIFJlIEQgKi8KICB1ciA9ICh4WyAzXSArIHhbMzVdKT4+MTsgIC8qIEltIEEgKyBJbSBCICovCiAgdWkgPSAoeFsxOV0gKyB4WzUxXSk7ICAgICAvKiBJbSBDICsgSW0gRCAqLwoKICB5WzMyXSA9IHZyICsgKHZpPj4xKTsgICAgIC8qIFJlIEEnID0gUmVBICsgUmVCICtSZUMgKyBSZUQgKi8KICB5WzM2XSA9IHZyIC0gKHZpPj4xKTsgICAgIC8qIFJlIEMnID0gLShSZUMrUmVEKSArIChSZUErUmVCKSAqLwogIHlbMzNdID0gdXIgKyAodWk+PjEpOyAgICAgLyogSW0gQScgPSBzdW0gb2YgaW1hZyB2YWx1ZXMgKi8KICB5WzM3XSA9IHVyIC0gKHVpPj4xKTsgICAgIC8qIEltIEMnID0gLUltIEMgLUltIEQgK0ltIEEgK0ltIEIgKi8KCiAgdnIgLT0geFszNF07ICAgICAgICAgICAgICAvKiBSZSBBIC0gUmUgQiAqLwogIHZpID0gKHZpPj4xKSAtIHhbNTBdOyAgICAgLyogUmUgQyAtIFJlIEQgKi8KICB1ciAtPSB4WzM1XTsgICAgICAgICAgICAgIC8qIEltIEEgLSBJbSBCICovCiAgdWkgPSAodWk+PjEpIC0geFs1MV07ICAgICAvKiBJbSBDIC0gSW0gRCAqLwoKICB5WzM0XSA9IHVpICsgdnI7ICAgICAgICAgIC8qIFJlIEInID0gSW0gQyAtIEltIEQgICsgUmUgQSAtIFJlIEIgKi8KICB5WzM4XSA9IHZyIC0gdWk7ICAgICAgICAgIC8qIFJlIEQnID0gLUltIEMgKyBJbSBEICsgUmUgQSAtIFJlIEIgKi8KICB5WzM1XSA9IHVyIC0gdmk7ICAgICAgICAgIC8qIEltIEInPSAtUmUgQyArIFJlIEQgKyBJbSBBIC0gSW0gQiAqLwogIHlbMzldID0gdmkgKyB1cjsgICAgICAgICAgLyogSW0gRCc9IFJlIEMgLSBSZSBEICsgSW0gQSAtIEltIEIgKi8KCiAgLy9pPTQwCiAgdnIgPSAoeFsxMF0gKyB4WzQyXSk+PjE7ICAvKiBSZSBBICsgUmUgQiAqLwogIHZpID0gKHhbMjZdICsgeFs1OF0pOyAgICAgLyogUmUgQyArIFJlIEQgKi8KICB1ciA9ICh4WzExXSArIHhbNDNdKT4+MTsgIC8qIEltIEEgKyBJbSBCICovCiAgdWkgPSAoeFsyN10gKyB4WzU5XSk7ICAgICAvKiBJbSBDICsgSW0gRCAqLwoKICB5WzQwXSA9IHZyICsgKHZpPj4xKTsgICAgIC8qIFJlIEEnID0gUmVBICsgUmVCICtSZUMgKyBSZUQgKi8KICB5WzQ0XSA9IHZyIC0gKHZpPj4xKTsgICAgIC8qIFJlIEMnID0gLShSZUMrUmVEKSArIChSZUErUmVCKSAqLwogIHlbNDFdID0gdXIgKyAodWk+PjEpOyAgICAgLyogSW0gQScgPSBzdW0gb2YgaW1hZyB2YWx1ZXMgKi8KICB5WzQ1XSA9IHVyIC0gKHVpPj4xKTsgICAgIC8qIEltIEMnID0gLUltIEMgLUltIEQgK0ltIEEgK0ltIEIgKi8KCiAgdnIgLT0geFs0Ml07ICAgICAgICAgICAgICAvKiBSZSBBIC0gUmUgQiAqLwogIHZpID0gKHZpPj4xKSAtIHhbNThdOyAgICAgLyogUmUgQyAtIFJlIEQgKi8KICB1ciAtPSB4WzQzXTsgICAgICAgICAgICAgIC8qIEltIEEgLSBJbSBCICovCiAgdWkgPSAodWk+PjEpIC0geFs1OV07ICAgICAvKiBJbSBDIC0gSW0gRCAqLwoKICB5WzQyXSA9IHVpICsgdnI7ICAgICAgICAgIC8qIFJlIEInID0gSW0gQyAtIEltIEQgICsgUmUgQSAtIFJlIEIgKi8KICB5WzQ2XSA9IHZyIC0gdWk7ICAgICAgICAgIC8qIFJlIEQnID0gLUltIEMgKyBJbSBEICsgUmUgQSAtIFJlIEIgKi8KICB5WzQzXSA9IHVyIC0gdmk7ICAgICAgICAgIC8qIEltIEInPSAtUmUgQyArIFJlIEQgKyBJbSBBIC0gSW0gQiAqLwogIHlbNDddID0gdmkgKyB1cjsgICAgICAgICAgLyogSW0gRCc9IFJlIEMgLSBSZSBEICsgSW0gQSAtIEltIEIgKi8KCiAgLy9pPTQ4CiAgdnIgPSAoeFsgNl0gKyB4WzM4XSk+PjE7ICAvKiBSZSBBICsgUmUgQiAqLwogIHZpID0gKHhbMjJdICsgeFs1NF0pOyAgICAgLyogUmUgQyArIFJlIEQgKi8KICB1ciA9ICh4WyA3XSArIHhbMzldKT4+MTsgIC8qIEltIEEgKyBJbSBCICovCiAgdWkgPSAoeFsyM10gKyB4WzU1XSk7ICAgICAvKiBJbSBDICsgSW0gRCAqLwoKICB5WzQ4XSA9IHZyICsgKHZpPj4xKTsgICAgIC8qIFJlIEEnID0gUmVBICsgUmVCICtSZUMgKyBSZUQgKi8KICB5WzUyXSA9IHZyIC0gKHZpPj4xKTsgICAgIC8qIFJlIEMnID0gLShSZUMrUmVEKSArIChSZUErUmVCKSAqLwogIHlbNDldID0gdXIgKyAodWk+PjEpOyAgICAgLyogSW0gQScgPSBzdW0gb2YgaW1hZyB2YWx1ZXMgKi8KICB5WzUzXSA9IHVyIC0gKHVpPj4xKTsgICAgIC8qIEltIEMnID0gLUltIEMgLUltIEQgK0ltIEEgK0ltIEIgKi8KCiAgdnIgLT0geFszOF07ICAgICAgICAgICAgICAvKiBSZSBBIC0gUmUgQiAqLwogIHZpID0gKHZpPj4xKSAtIHhbNTRdOyAgICAgLyogUmUgQyAtIFJlIEQgKi8KICB1ciAtPSB4WzM5XTsgICAgICAgICAgICAgIC8qIEltIEEgLSBJbSBCICovCiAgdWkgPSAodWk+PjEpIC0geFs1NV07ICAgICAvKiBJbSBDIC0gSW0gRCAqLwoKICB5WzUwXSA9IHVpICsgdnI7ICAgICAgICAgIC8qIFJlIEInID0gSW0gQyAtIEltIEQgICsgUmUgQSAtIFJlIEIgKi8KICB5WzU0XSA9IHZyIC0gdWk7ICAgICAgICAgIC8qIFJlIEQnID0gLUltIEMgKyBJbSBEICsgUmUgQSAtIFJlIEIgKi8KICB5WzUxXSA9IHVyIC0gdmk7ICAgICAgICAgIC8qIEltIEInPSAtUmUgQyArIFJlIEQgKyBJbSBBIC0gSW0gQiAqLwogIHlbNTVdID0gdmkgKyB1cjsgICAgICAgICAgLyogSW0gRCc9IFJlIEMgLSBSZSBEICsgSW0gQSAtIEltIEIgKi8KCiAgLy9pPTU2CiAgdnIgPSAoeFsxNF0gKyB4WzQ2XSk+PjE7ICAvKiBSZSBBICsgUmUgQiAqLwogIHZpID0gKHhbMzBdICsgeFs2Ml0pOyAgICAgLyogUmUgQyArIFJlIEQgKi8KICB1ciA9ICh4WzE1XSArIHhbNDddKT4+MTsgIC8qIEltIEEgKyBJbSBCICovCiAgdWkgPSAoeFszMV0gKyB4WzYzXSk7ICAgICAvKiBJbSBDICsgSW0gRCAqLwoKICB5WzU2XSA9IHZyICsgKHZpPj4xKTsgICAgIC8qIFJlIEEnID0gUmVBICsgUmVCICtSZUMgKyBSZUQgKi8KICB5WzYwXSA9IHZyIC0gKHZpPj4xKTsgICAgIC8qIFJlIEMnID0gLShSZUMrUmVEKSArIChSZUErUmVCKSAqLwogIHlbNTddID0gdXIgKyAodWk+PjEpOyAgICAgLyogSW0gQScgPSBzdW0gb2YgaW1hZyB2YWx1ZXMgKi8KICB5WzYxXSA9IHVyIC0gKHVpPj4xKTsgICAgIC8qIEltIEMnID0gLUltIEMgLUltIEQgK0ltIEEgK0ltIEIgKi8KCiAgdnIgLT0geFs0Nl07ICAgICAgICAgICAgICAvKiBSZSBBIC0gUmUgQiAqLwogIHZpID0gKHZpPj4xKSAtIHhbNjJdOyAgICAgLyogUmUgQyAtIFJlIEQgKi8KICB1ciAtPSB4WzQ3XTsgICAgICAgICAgICAgIC8qIEltIEEgLSBJbSBCICovCiAgdWkgPSAodWk+PjEpIC0geFs2M107ICAgICAvKiBJbSBDIC0gSW0gRCAqLwoKICB5WzU4XSA9IHVpICsgdnI7ICAgICAgICAgIC8qIFJlIEInID0gSW0gQyAtIEltIEQgICsgUmUgQSAtIFJlIEIgKi8KICB5WzYyXSA9IHZyIC0gdWk7ICAgICAgICAgIC8qIFJlIEQnID0gLUltIEMgKyBJbSBEICsgUmUgQSAtIFJlIEIgKi8KICB5WzU5XSA9IHVyIC0gdmk7ICAgICAgICAgIC8qIEltIEInPSAtUmUgQyArIFJlIEQgKyBJbSBBIC0gSW0gQiAqLwogIHlbNjNdID0gdmkgKyB1cjsgICAgICAgICAgLyogSW0gRCc9IFJlIEMgLSBSZSBEICsgSW0gQSAtIEltIEIgKi8KCgogIEZJWFBfREJMICp4dCA9ICZ4WzBdOwogIEZJWFBfREJMICp5dCA9ICZ5WzBdOwoKICBpbnQgaiA9IDQ7CiAgZG8KICB7CiAgICB2ciA9IHl0WzhdOwogICAgdmkgPSB5dFs5XTsKICAgIHVyID0geXRbMF0+PjE7CiAgICB1aSA9IHl0WzFdPj4xOwogICAgeHRbIDBdID0gdXIgKyAodnI+PjEpOwogICAgeHRbIDFdID0gdWkgKyAodmk+PjEpOwogICAgeHRbIDhdID0gdXIgLSAodnI+PjEpOwogICAgeHRbIDldID0gdWkgLSAodmk+PjEpOwoKICAgIHZyID0geXRbMTNdOwogICAgdmkgPSB5dFsxMl07CiAgICB1ciA9IHl0WzRdPj4xOwogICAgdWkgPSB5dFs1XT4+MTsKICAgIHh0WyA0XSA9IHVyICsgKHZyPj4xKTsKICAgIHh0WyA1XSA9IHVpIC0gKHZpPj4xKTsKICAgIHh0WzEyXSA9IHVyIC0gKHZyPj4xKTsKICAgIHh0WzEzXSA9IHVpICsgKHZpPj4xKTsKCiAgICBTVU1ESUZGX1BJRk9VUlRIKHZpLCB2ciwgeXRbMTBdLCB5dFsxMV0pCiAgICB1ciA9IHl0WzJdOwogICAgdWkgPSB5dFszXTsKICAgIHh0WyAyXSA9ICh1cj4+MSkgKyB2cjsKICAgIHh0WyAzXSA9ICh1aT4+MSkgKyB2aTsKICAgIHh0WzEwXSA9ICh1cj4+MSkgLSB2cjsKICAgIHh0WzExXSA9ICh1aT4+MSkgLSB2aTsKCiAgICBTVU1ESUZGX1BJRk9VUlRIKHZyLCB2aSwgeXRbMTRdLCB5dFsxNV0pCiAgICB1ciA9IHl0WzZdOwogICAgdWkgPSB5dFs3XTsKCiAgICB4dFsgNl0gPSAodXI+PjEpICsgdnI7CiAgICB4dFsgN10gPSAodWk+PjEpIC0gdmk7CiAgICB4dFsxNF0gPSAodXI+PjEpIC0gdnI7CiAgICB4dFsxNV0gPSAodWk+PjEpICsgdmk7CiAgICB4dCArPSAxNjsKICAgIHl0ICs9IDE2OwogIH0gd2hpbGUgKC0taiAhPSAwKTsKCiAgdnIgPSB4WzE2XTsKICB2aSA9IHhbMTddOwogIHVyID0geFsgMF0+PjE7CiAgdWkgPSB4WyAxXT4+MTsKICB4WyAwXSA9IHVyICsgKHZyPj4xKTsKICB4WyAxXSA9IHVpICsgKHZpPj4xKTsKICB4WzE2XSA9IHVyIC0gKHZyPj4xKTsKICB4WzE3XSA9IHVpIC0gKHZpPj4xKTsKCiAgdmkgPSB4WzI0XTsKICB2ciA9IHhbMjVdOwogIHVyID0geFsgOF0+PjE7CiAgdWkgPSB4WyA5XT4+MTsKICB4WyA4XSA9IHVyICsgKHZyPj4xKTsKICB4WyA5XSA9IHVpIC0gKHZpPj4xKTsKICB4WzI0XSA9IHVyIC0gKHZyPj4xKTsKICB4WzI1XSA9IHVpICsgKHZpPj4xKTsKCiAgdnIgPSB4WzQ4XTsKICB2aSA9IHhbNDldOwogIHVyID0geFszMl0+PjE7CiAgdWkgPSB4WzMzXT4+MTsKICB4WzMyXSA9IHVyICsgKHZyPj4xKTsKICB4WzMzXSA9IHVpICsgKHZpPj4xKTsKICB4WzQ4XSA9IHVyIC0gKHZyPj4xKTsKICB4WzQ5XSA9IHVpIC0gKHZpPj4xKTsKCiAgdmkgPSB4WzU2XTsKICB2ciA9IHhbNTddOwogIHVyID0geFs0MF0+PjE7CiAgdWkgPSB4WzQxXT4+MTsKICB4WzQwXSA9IHVyICsgKHZyPj4xKTsKICB4WzQxXSA9IHVpIC0gKHZpPj4xKTsKICB4WzU2XSA9IHVyIC0gKHZyPj4xKTsKICB4WzU3XSA9IHVpICsgKHZpPj4xKTsKCiAgY3BseE11bHREaXYyKCZ2aSwgJnZyLCB4WzE5XSwgeFsxOF0sIGZmdDMyX3czMlswXSk7CiAgdXIgPSB4WyAyXTsKICB1aSA9IHhbIDNdOwogIHhbIDJdID0gKHVyPj4xKSArIHZyOwogIHhbIDNdID0gKHVpPj4xKSArIHZpOwogIHhbMThdID0gKHVyPj4xKSAtIHZyOwogIHhbMTldID0gKHVpPj4xKSAtIHZpOwoKICBjcGx4TXVsdERpdjIoJnZyLCAmdmksIHhbMjddLCB4WzI2XSwgZmZ0MzJfdzMyWzBdKTsKICB1ciA9IHhbMTBdOwogIHVpID0geFsxMV07CiAgeFsxMF0gPSAodXI+PjEpICsgdnI7CiAgeFsxMV0gPSAodWk+PjEpIC0gdmk7CiAgeFsyNl0gPSAodXI+PjEpIC0gdnI7CiAgeFsyN10gPSAodWk+PjEpICsgdmk7CgogIGNwbHhNdWx0RGl2MigmdmksICZ2ciwgeFs1MV0sIHhbNTBdLCBmZnQzMl93MzJbMF0pOwogIHVyID0geFszNF07CiAgdWkgPSB4WzM1XTsKICB4WzM0XSA9ICh1cj4+MSkgKyB2cjsKICB4WzM1XSA9ICh1aT4+MSkgKyB2aTsKICB4WzUwXSA9ICh1cj4+MSkgLSB2cjsKICB4WzUxXSA9ICh1aT4+MSkgLSB2aTsKCiAgY3BseE11bHREaXYyKCZ2ciwgJnZpLCB4WzU5XSwgeFs1OF0sIGZmdDMyX3czMlswXSk7CiAgdXIgPSB4WzQyXTsKICB1aSA9IHhbNDNdOwogIHhbNDJdID0gKHVyPj4xKSArIHZyOwogIHhbNDNdID0gKHVpPj4xKSAtIHZpOwogIHhbNThdID0gKHVyPj4xKSAtIHZyOwogIHhbNTldID0gKHVpPj4xKSArIHZpOwoKICBTVU1ESUZGX1BJRk9VUlRIKHZpLCB2ciwgeFsyMF0sIHhbMjFdKQogIHVyID0geFsgNF07CiAgdWkgPSB4WyA1XTsKICB4WyA0XSA9ICh1cj4+MSkgKyB2cjsKICB4WyA1XSA9ICh1aT4+MSkgKyB2aTsKICB4WzIwXSA9ICh1cj4+MSkgLSB2cjsKICB4WzIxXSA9ICh1aT4+MSkgLSB2aTsKCiAgU1VNRElGRl9QSUZPVVJUSCh2ciwgdmksIHhbMjhdLCB4WzI5XSkKICB1ciA9IHhbMTJdOwogIHVpID0geFsxM107CiAgeFsxMl0gPSAodXI+PjEpICsgdnI7CiAgeFsxM10gPSAodWk+PjEpIC0gdmk7CiAgeFsyOF0gPSAodXI+PjEpIC0gdnI7CiAgeFsyOV0gPSAodWk+PjEpICsgdmk7CgogIFNVTURJRkZfUElGT1VSVEgodmksIHZyLCB4WzUyXSwgeFs1M10pCiAgdXIgPSB4WzM2XTsKICB1aSA9IHhbMzddOwogIHhbMzZdID0gKHVyPj4xKSArIHZyOwogIHhbMzddID0gKHVpPj4xKSArIHZpOwogIHhbNTJdID0gKHVyPj4xKSAtIHZyOwogIHhbNTNdID0gKHVpPj4xKSAtIHZpOwoKICBTVU1ESUZGX1BJRk9VUlRIKHZyLCB2aSwgeFs2MF0sIHhbNjFdKQogIHVyID0geFs0NF07CiAgdWkgPSB4WzQ1XTsKICB4WzQ0XSA9ICh1cj4+MSkgKyB2cjsKICB4WzQ1XSA9ICh1aT4+MSkgLSB2aTsKICB4WzYwXSA9ICh1cj4+MSkgLSB2cjsKICB4WzYxXSA9ICh1aT4+MSkgKyB2aTsKCgogIGNwbHhNdWx0RGl2MigmdmksICZ2ciwgeFsyM10sIHhbMjJdLCBmZnQzMl93MzJbMV0pOwogIHVyID0geFsgNl07CiAgdWkgPSB4WyA3XTsKICB4WyA2XSA9ICh1cj4+MSkgKyB2cjsKICB4WyA3XSA9ICh1aT4+MSkgKyB2aTsKICB4WzIyXSA9ICh1cj4+MSkgLSB2cjsKICB4WzIzXSA9ICh1aT4+MSkgLSB2aTsKCiAgY3BseE11bHREaXYyKCZ2ciwgJnZpLCB4WzMxXSwgeFszMF0sIGZmdDMyX3czMlsxXSk7CiAgdXIgPSB4WzE0XTsKICB1aSA9IHhbMTVdOwogIHhbMTRdID0gKHVyPj4xKSArIHZyOwogIHhbMTVdID0gKHVpPj4xKSAtIHZpOwogIHhbMzBdID0gKHVyPj4xKSAtIHZyOwogIHhbMzFdID0gKHVpPj4xKSArIHZpOwoKICBjcGx4TXVsdERpdjIoJnZpLCAmdnIsIHhbNTVdLCB4WzU0XSwgZmZ0MzJfdzMyWzFdKTsKICB1ciA9IHhbMzhdOwogIHVpID0geFszOV07CiAgeFszOF0gPSAodXI+PjEpICsgdnI7CiAgeFszOV0gPSAodWk+PjEpICsgdmk7CiAgeFs1NF0gPSAodXI+PjEpIC0gdnI7CiAgeFs1NV0gPSAodWk+PjEpIC0gdmk7CgogIGNwbHhNdWx0RGl2MigmdnIsICZ2aSwgeFs2M10sIHhbNjJdLCBmZnQzMl93MzJbMV0pOwogIHVyID0geFs0Nl07CiAgdWkgPSB4WzQ3XTsKCiAgeFs0Nl0gPSAodXI+PjEpICsgdnI7CiAgeFs0N10gPSAodWk+PjEpIC0gdmk7CiAgeFs2Ml0gPSAodXI+PjEpIC0gdnI7CiAgeFs2M10gPSAodWk+PjEpICsgdmk7CgogIHZyID0geFszMl07CiAgdmkgPSB4WzMzXTsKICB1ciA9IHhbIDBdPj4xOwogIHVpID0geFsgMV0+PjE7CiAgeFsgMF0gPSB1ciArICh2cj4+MSk7CiAgeFsgMV0gPSB1aSArICh2aT4+MSk7CiAgeFszMl0gPSB1ciAtICh2cj4+MSk7CiAgeFszM10gPSB1aSAtICh2aT4+MSk7CgogIHZpID0geFs0OF07CiAgdnIgPSB4WzQ5XTsKICB1ciA9IHhbMTZdPj4xOwogIHVpID0geFsxN10+PjE7CiAgeFsxNl0gPSB1ciArICh2cj4+MSk7CiAgeFsxN10gPSB1aSAtICh2aT4+MSk7CiAgeFs0OF0gPSB1ciAtICh2cj4+MSk7CiAgeFs0OV0gPSB1aSArICh2aT4+MSk7CgogIGNwbHhNdWx0RGl2MigmdmksICZ2ciwgeFszNV0sIHhbMzRdLCBmZnQzMl93MzJbMl0pOwogIHVyID0geFsgMl07CiAgdWkgPSB4WyAzXTsKICB4WyAyXSA9ICh1cj4+MSkgKyB2cjsKICB4WyAzXSA9ICh1aT4+MSkgKyB2aTsKICB4WzM0XSA9ICh1cj4+MSkgLSB2cjsKICB4WzM1XSA9ICh1aT4+MSkgLSB2aTsKCiAgY3BseE11bHREaXYyKCZ2ciwgJnZpLCB4WzUxXSwgeFs1MF0sIGZmdDMyX3czMlsyXSk7CiAgdXIgPSB4WzE4XTsKICB1aSA9IHhbMTldOwogIHhbMThdID0gKHVyPj4xKSArIHZyOwogIHhbMTldID0gKHVpPj4xKSAtIHZpOwogIHhbNTBdID0gKHVyPj4xKSAtIHZyOwogIHhbNTFdID0gKHVpPj4xKSArIHZpOwoKICBjcGx4TXVsdERpdjIoJnZpLCAmdnIsIHhbMzddLCB4WzM2XSwgZmZ0MzJfdzMyWzBdKTsKICB1ciA9IHhbIDRdOwogIHVpID0geFsgNV07CiAgeFsgNF0gPSAodXI+PjEpICsgdnI7CiAgeFsgNV0gPSAodWk+PjEpICsgdmk7CiAgeFszNl0gPSAodXI+PjEpIC0gdnI7CiAgeFszN10gPSAodWk+PjEpIC0gdmk7CgogIGNwbHhNdWx0RGl2MigmdnIsICZ2aSwgeFs1M10sIHhbNTJdLCBmZnQzMl93MzJbMF0pOwogIHVyID0geFsyMF07CiAgdWkgPSB4WzIxXTsKICB4WzIwXSA9ICh1cj4+MSkgKyB2cjsKICB4WzIxXSA9ICh1aT4+MSkgLSB2aTsKICB4WzUyXSA9ICh1cj4+MSkgLSB2cjsKICB4WzUzXSA9ICh1aT4+MSkgKyB2aTsKCiAgY3BseE11bHREaXYyKCZ2aSwgJnZyLCB4WzM5XSwgeFszOF0sIGZmdDMyX3czMlszXSk7CiAgdXIgPSB4WyA2XTsKICB1aSA9IHhbIDddOwogIHhbIDZdID0gKHVyPj4xKSArIHZyOwogIHhbIDddID0gKHVpPj4xKSArIHZpOwogIHhbMzhdID0gKHVyPj4xKSAtIHZyOwogIHhbMzldID0gKHVpPj4xKSAtIHZpOwoKICBjcGx4TXVsdERpdjIoJnZyLCAmdmksIHhbNTVdLCB4WzU0XSwgZmZ0MzJfdzMyWzNdKTsKICB1ciA9IHhbMjJdOwogIHVpID0geFsyM107CiAgeFsyMl0gPSAodXI+PjEpICsgdnI7CiAgeFsyM10gPSAodWk+PjEpIC0gdmk7CiAgeFs1NF0gPSAodXI+PjEpIC0gdnI7CiAgeFs1NV0gPSAodWk+PjEpICsgdmk7CgogIFNVTURJRkZfUElGT1VSVEgodmksIHZyLCB4WzQwXSwgeFs0MV0pCiAgdXIgPSB4WyA4XTsKICB1aSA9IHhbIDldOwogIHhbIDhdID0gKHVyPj4xKSArIHZyOwogIHhbIDldID0gKHVpPj4xKSArIHZpOwogIHhbNDBdID0gKHVyPj4xKSAtIHZyOwogIHhbNDFdID0gKHVpPj4xKSAtIHZpOwoKICBTVU1ESUZGX1BJRk9VUlRIKHZyLCB2aSwgeFs1Nl0sIHhbNTddKQogIHVyID0geFsyNF07CiAgdWkgPSB4WzI1XTsKICB4WzI0XSA9ICh1cj4+MSkgKyB2cjsKICB4WzI1XSA9ICh1aT4+MSkgLSB2aTsKICB4WzU2XSA9ICh1cj4+MSkgLSB2cjsKICB4WzU3XSA9ICh1aT4+MSkgKyB2aTsKCiAgY3BseE11bHREaXYyKCZ2aSwgJnZyLCB4WzQzXSwgeFs0Ml0sIGZmdDMyX3czMls0XSk7CiAgdXIgPSB4WzEwXTsKICB1aSA9IHhbMTFdOwoKICB4WzEwXSA9ICh1cj4+MSkgKyB2cjsKICB4WzExXSA9ICh1aT4+MSkgKyB2aTsKICB4WzQyXSA9ICh1cj4+MSkgLSB2cjsKICB4WzQzXSA9ICh1aT4+MSkgLSB2aTsKCiAgY3BseE11bHREaXYyKCZ2ciwgJnZpLCB4WzU5XSwgeFs1OF0sIGZmdDMyX3czMls0XSk7CiAgdXIgPSB4WzI2XTsKICB1aSA9IHhbMjddOwogIHhbMjZdID0gKHVyPj4xKSArIHZyOwogIHhbMjddID0gKHVpPj4xKSAtIHZpOwogIHhbNThdID0gKHVyPj4xKSAtIHZyOwogIHhbNTldID0gKHVpPj4xKSArIHZpOwoKICBjcGx4TXVsdERpdjIoJnZpLCAmdnIsIHhbNDVdLCB4WzQ0XSwgZmZ0MzJfdzMyWzFdKTsKICB1ciA9IHhbMTJdOwogIHVpID0geFsxM107CiAgeFsxMl0gPSAodXI+PjEpICsgdnI7CiAgeFsxM10gPSAodWk+PjEpICsgdmk7CiAgeFs0NF0gPSAodXI+PjEpIC0gdnI7CiAgeFs0NV0gPSAodWk+PjEpIC0gdmk7CgogIGNwbHhNdWx0RGl2MigmdnIsICZ2aSwgeFs2MV0sIHhbNjBdLCBmZnQzMl93MzJbMV0pOwogIHVyID0geFsyOF07CiAgdWkgPSB4WzI5XTsKICB4WzI4XSA9ICh1cj4+MSkgKyB2cjsKICB4WzI5XSA9ICh1aT4+MSkgLSB2aTsKICB4WzYwXSA9ICh1cj4+MSkgLSB2cjsKICB4WzYxXSA9ICh1aT4+MSkgKyB2aTsKCiAgY3BseE11bHREaXYyKCZ2aSwgJnZyLCB4WzQ3XSwgeFs0Nl0sIGZmdDMyX3czMls1XSk7CiAgdXIgPSB4WzE0XTsKICB1aSA9IHhbMTVdOwogIHhbMTRdID0gKHVyPj4xKSArIHZyOwogIHhbMTVdID0gKHVpPj4xKSArIHZpOwogIHhbNDZdID0gKHVyPj4xKSAtIHZyOwogIHhbNDddID0gKHVpPj4xKSAtIHZpOwoKICBjcGx4TXVsdERpdjIoJnZyLCAmdmksIHhbNjNdLCB4WzYyXSwgZmZ0MzJfdzMyWzVdKTsKICB1ciA9IHhbMzBdOwogIHVpID0geFszMV07CiAgeFszMF0gPSAodXI+PjEpICsgdnI7CiAgeFszMV0gPSAodWk+PjEpIC0gdmk7CiAgeFs2Ml0gPSAodXI+PjEpIC0gdnI7CiAgeFs2M10gPSAodWk+PjEpICsgdmk7Cn0KI2VuZGlmIC8qICNpZm5kZWYgRlVOQ1RJT05fZmZ0XzMyICovCgoKLyoqCiAqIFxicmllZiBBcHBseSByb3RhdGlvbiB2ZWN0b3JzIHRvIGEgZGF0YSBidWZmZXIuCiAqIFxwYXJhbSBjbCBsZW5ndGggb2YgZWFjaCByb3cgb2YgaW5wdXQgZGF0YS4KICogXHBhcmFtIGwgdG90YWwgbGVuZ3RoIG9mIGlucHV0IGRhdGEuCiAqIFxwYXJhbSBwVmVjUmUgcmVhbCBwYXJ0IG9mIHJvdGF0aW9uIGNlb2ZmaWNpZW50IHZlY3Rvci4KICogXHBhcmFtIHBWZWNJbSBpbWFnaW5hcnkgcGFydCBvZiByb3RhdGlvbiBjZW9mZmljaWVudCB2ZWN0b3IuCiAqLwpzdGF0aWMgaW5saW5lIHZvaWQgZmZ0X2FwcGx5X3JvdF92ZWN0b3IoRklYUF9EQkwgKlJFU1RSSUNUIHBEYXRhLCBjb25zdCBpbnQgY2wsIGNvbnN0IGludCBsLCBjb25zdCBGSVhQX1NUQiAqcFZlY1JlLCBjb25zdCBGSVhQX1NUQiAqcFZlY0ltKQp7CiAgRklYUF9EQkwgcmUsIGltOwogIEZJWFBfU1RCIHZyZSwgdmltOwoKICBpbnQgaSwgYzsKCiAgZm9yKGk9MDsgaTxjbDsgaSsrKSB7CiAgICByZSAgPSBwRGF0YVsyKmldOwogICAgaW0gID0gcERhdGFbMippKzFdOwoKICAgIHBEYXRhWzIqaV0gICA9IHJlPj4yOyAvKiAqIDAuMjUgKi8KICAgIHBEYXRhWzIqaSsxXSA9IGltPj4yOyAvKiAqIDAuMjUgKi8KICB9CiAgZm9yKDsgaTxsOyBpKz1jbCkKICB7CiAgICByZSAgPSBwRGF0YVsyKmldOwogICAgaW0gID0gcERhdGFbMippKzFdOwoKICAgIHBEYXRhWzIqaV0gICA9IHJlPj4yOyAvKiAqIDAuMjUgKi8KICAgIHBEYXRhWzIqaSsxXSA9IGltPj4yOyAvKiAqIDAuMjUgKi8KCiAgICBmb3IgKGM9aSsxOyBjPGkrY2w7IGMrKykKICAgIHsKICAgICAgcmUgID0gcERhdGFbMipjXT4+MTsKICAgICAgaW0gID0gcERhdGFbMipjKzFdPj4xOwogICAgICB2cmUgPSAqcFZlY1JlKys7CiAgICAgIHZpbSA9ICpwVmVjSW0rKzsKCiAgICAgIGNwbHhNdWx0RGl2MigmcERhdGFbMipjKzFdLCAmcERhdGFbMipjXSwgaW0sIHJlLCB2cmUsIHZpbSk7CiAgICB9CiAgfQp9CgojZGVmaW5lIEZGVF9UV09fU1RBR0VfTUFDUk9fRU5BQkxFCgoKI2lmZGVmIEZGVF9UV09fU1RBR0VfTUFDUk9fRU5BQkxFCgojZGVmaW5lIGZmdE4yKHBJbnB1dCwgbGVuZ3RoLCBkaW0xLCBkaW0yLCBmZnRfZnVuYzEsIGZmdF9mdW5jMiwgUm90VmVjdG9yUmVhbCwgUm90VmVjdG9ySW1hZykgXAp7IFwKICBpbnQgICAgICAgaSwgajsgXAogXAogIENfQUxMT0NfU0NSQVRDSF9TVEFSVChhRHN0LCBGSVhQX0RCTCwgbGVuZ3RoKjIpOyBcCiAgQ19BTExPQ19TQ1JBVENIX1NUQVJUKGFEc3QyLCBGSVhQX0RCTCwgZGltMioyKTsgXAogXAogIEZES19BU1NFUlQobGVuZ3RoID09IGRpbTEqZGltMik7IFwKIFwKICAvKiBQZXJmb3JtIGRpbTIgdGltZXMgdGhlIGZmdCBvZiBsZW5ndGggZGltMS4gVGhlIGlucHV0IHNhbXBsZXMgYXJlIGF0IHRoZSBhZGRyZXNzIG9mIHBTcmMgYW5kIHRoZSBcCiAgb3V0cHV0IHNhbXBsZXMgYXJlIGF0IHRoZSBhZGRyZXNzIG9mIHBEc3QuIFRoZSBpbnB1dCB2ZWN0b3IgZm9yIHRoZSBmZnQgb2YgbGVuZ3RoIGRpbTEgaXMgYnVpbHQgXAogIG9mIHRoZSBpbnRlcmxlYXZlZCBzYW1wbGVzIGluIHBTcmMsIHRoZSBvdXRwdXQgc2FtcGxlcyBhcmUgc3RvcmVkIGNvbnNlY3V0aXZlbHkuIFwKICAqLyBcCiAgeyBcCiAgICBjb25zdCBGSVhQX0RCTCogcFNyYyA9IHBJbnB1dDsgXAogICAgRklYUF9EQkwgICpSRVNUUklDVCBwRHN0ID0gYURzdDsgXAogICAgXAogICAgZm9yKGk9MDsgaTxkaW0yOyBpKyspIFwKICAgIHsgXAogICAgICBmb3Ioaj0wOyBqPGRpbTE7IGorKykgXAogICAgICB7IFwKICAgICAgICBwRHN0WzIqal0gICA9IHBTcmNbMipqKmRpbTJdOyBcCiAgICAgICAgcERzdFsyKmorMV0gPSBwU3JjWzIqaipkaW0yKzFdOyBcCiAgICAgIH0gXAogICAgICBcCiAgICAgIGZmdF9mdW5jMShwRHN0KTsgXAogICAgICBwU3JjICs9IDI7IFwKICAgICAgcERzdCA9IHBEc3QgKyAyKmRpbTE7IFwKICAgIH0gXAogIH0gXAogIFwKICAvKiBQZXJmb3JtIHRoZSBtb2R1bGF0aW9uIG9mIHRoZSBvdXRwdXQgb2YgdGhlIGZmdCBvZiBsZW5ndGggZGltMSAqLyBcCiAgZmZ0X2FwcGx5X3JvdF92ZWN0b3IoYURzdCwgZGltMSwgbGVuZ3RoLCBSb3RWZWN0b3JSZWFsLCBSb3RWZWN0b3JJbWFnKTsgXAogIFwKICAvKiBQZXJmb3JtIGRpbTEgdGltZXMgdGhlIGZmdCBvZiBsZW5ndGggZGltMi4gVGhlIGlucHV0IHNhbXBsZXMgYXJlIGF0IHRoZSBhZGRyZXNzIG9mIGFEc3QgYW5kIHRoZSBcCiAgb3V0cHV0IHNhbXBsZXMgYXJlIGF0IHRoZSBhZGRyZXNzIG9mIHBJbnB1dC4gVGhlIGlucHV0IHZlY3RvciBmb3IgdGhlIGZmdCBvZiBsZW5ndGggZGltMiBpcyBidWlsdCBcCiAgb2YgdGhlIGludGVybGVhdmVkIHNhbXBsZXMgaW4gYURzdCwgdGhlIG91dHB1dCBzYW1wbGVzIGFyZSBzdG9yZWQgY29uc2VjdXRpdmVseSBhdCB0aGUgYWRkcmVzcyBcCiAgb2YgcElucHV0LiBcCiAgKi8gXAogIHsgXAogICAgY29uc3QgRklYUF9EQkwqIHBTcmMgICAgICAgPSBhRHN0OyBcCiAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgcERzdCAgICA9IGFEc3QyOyBcCiAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgcERzdE91dCA9IHBJbnB1dDsgXAogICAgXAogICAgZm9yKGk9MDsgaTxkaW0xOyBpKyspIFwKICAgIHsgXAogICAgICBmb3Ioaj0wOyBqPGRpbTI7IGorKykgXAogICAgICB7IFwKICAgICAgICBwRHN0WzIqal0gICA9IHBTcmNbMipqKmRpbTFdOyBcCiAgICAgICAgcERzdFsyKmorMV0gPSBwU3JjWzIqaipkaW0xKzFdOyBcCiAgICAgIH0gXAogICAgICBcCiAgICAgIGZmdF9mdW5jMihwRHN0KTsgXAogICAgICBcCiAgICAgIGZvcihqPTA7IGo8ZGltMjsgaisrKSBcCiAgICAgIHsgXAogICAgICAgIHBEc3RPdXRbMipqKmRpbTFdICAgPSBwRHN0WzIqal07IFwKICAgICAgICBwRHN0T3V0WzIqaipkaW0xKzFdID0gcERzdFsyKmorMV07IFwKICAgICAgfSBcCiAgICAgIHBTcmMgKz0gMjsgXAogICAgICBwRHN0T3V0ICs9IDI7IFwKICAgIH0gXAogIH0gXAogIFwKICBDX0FMTE9DX1NDUkFUQ0hfRU5EKGFEc3QyLCBGSVhQX0RCTCwgZGltMioyKTsgXAogIENfQUxMT0NfU0NSQVRDSF9FTkQoYURzdCwgRklYUF9EQkwsIGxlbmd0aCoyKTsgXAp9IFwKCiNlbHNlIC8qIEZGVF9UV09fU1RBR0VfTUFDUk9fRU5BQkxFICovCgovKiBzZWxlY3QgZWl0aGVyIHN3aXRjaCBjYXNlIG9mIGZ1bmN0aW9uIHBvaW50ZXIuICovCi8vI2RlZmluZSBGRlRfVFdPX1NUQUdFX1NXSVRDSF9DQVNFCgpzdGF0aWMgaW5saW5lIHZvaWQgZmZ0TjIoCiAgICAgICAgRklYUF9EQkwgKnBJbnB1dCwKICAgICAgICBjb25zdCBpbnQgbGVuZ3RoLAogICAgICAgIGNvbnN0IGludCBkaW0xLAogICAgICAgIGNvbnN0IGludCBkaW0yLAogICAgICAgIHZvaWQgKCogY29uc3QgZmZ0MSkoRklYUF9EQkwgKiksCiAgICAgICAgdm9pZCAoKiBjb25zdCBmZnQyKShGSVhQX0RCTCAqKSwKICAgICAgICBjb25zdCBGSVhQX1NUQiAqUm90VmVjdG9yUmVhbCwKICAgICAgICBjb25zdCBGSVhQX1NUQiAqUm90VmVjdG9ySW1hZwogICAgICAgICkKewogIC8qIFRoZSByZWFsIHBhcnQgb2YgdGhlIGlucHV0IHNhbXBsZXMgYXJlIGF0IHRoZSBhZGRyZXNzZXMgd2l0aCBldmVuIGluZGljZXMgYW5kIHRoZSBpbWFnaW5hcnkKICBwYXJ0IG9mIHRoZSBpbnB1dCBzYW1wbGVzIGFyZSBhdCB0aGUgYWRkcmVzc2VzIHdpdGggb2RkIGluZGljZXMuIFRoZSBvdXRwdXQgc2FtcGxlcyBhcmUgc3RvcmVkCiAgYXQgdGhlIGFkZHJlc3Mgb2YgcElucHV0CiAgKi8KICBGSVhQX0RCTCAgKnBTcmMsICpwRHN0LCAqcERzdE91dDsKICBpbnQgICAgICAgaSwgajsKCiAgQ19BTExPQ19TQ1JBVENIX1NUQVJUKGFEc3QsIEZJWFBfREJMLCBsZW5ndGgqMik7CiAgQ19BTExPQ19TQ1JBVENIX1NUQVJUKGFEc3QyLCBGSVhQX0RCTCwgZGltMioyKTsKICAgICAKICBGREtfQVNTRVJUKGxlbmd0aCA9PSBkaW0xKmRpbTIpOwoKICAvKiBQZXJmb3JtIGRpbTIgdGltZXMgdGhlIGZmdCBvZiBsZW5ndGggZGltMS4gVGhlIGlucHV0IHNhbXBsZXMgYXJlIGF0IHRoZSBhZGRyZXNzIG9mIHBTcmMgYW5kIHRoZQogIG91dHB1dCBzYW1wbGVzIGFyZSBhdCB0aGUgYWRkcmVzcyBvZiBwRHN0LiBUaGUgaW5wdXQgdmVjdG9yIGZvciB0aGUgZmZ0IG9mIGxlbmd0aCBkaW0xIGlzIGJ1aWx0CiAgb2YgdGhlIGludGVybGVhdmVkIHNhbXBsZXMgaW4gcFNyYywgdGhlIG91dHB1dCBzYW1wbGVzIGFyZSBzdG9yZWQgY29uc2VjdXRpdmVseS4KICAqLwogIHBTcmMgPSBwSW5wdXQ7CiAgcERzdCA9IGFEc3Q7CiAgZm9yKGk9MDsgaTxsZW5ndGgvZGltMTsgaSsrKQogIHsKICAgIGZvcihqPTA7IGo8bGVuZ3RoL2RpbTI7IGorKykKICAgIHsKICAgICAgcERzdFsyKmpdICAgPSBwU3JjWzIqaipkaW0yXTsKICAgICAgcERzdFsyKmorMV0gPSBwU3JjWzIqaipkaW0yKzFdOwogICAgfQoKICAgIC8qIGZmdCBvZiBzaXplIGRpbTEgKi8KI2lmbmRlZiBGRlRfVFdPX1NUQUdFX1NXSVRDSF9DQVNFCiAgICBmZnQxKHBEc3QpOwojZWxzZQogICAgc3dpdGNoIChkaW0xKSB7CiAgICAgIGNhc2UgMzogZmZ0MyhwRHN0KTsgYnJlYWs7CiAgICAgIGNhc2UgNDogZmZ0XzQocERzdCk7IGJyZWFrOwogICAgICBjYXNlIDU6IGZmdDUocERzdCk7IGJyZWFrOwogICAgICBjYXNlIDg6IGZmdF84KHBEc3QpOyBicmVhazsKICAgICAgY2FzZSAxNTogZmZ0MTUocERzdCk7IGJyZWFrOwogICAgICBjYXNlIDE2OiBmZnRfMTYocERzdCk7IGJyZWFrOwogICAgICBjYXNlIDMyOiBmZnRfMzIocERzdCk7IGJyZWFrOwogICAgICAvKmNhc2UgNjQ6IGZmdF82NChwRHN0KTsgYnJlYWs7Ki8KICAgICAgY2FzZSAxMjg6IGZmdF8xMjgocERzdCk7IGJyZWFrOwogICAgfQojZW5kaWYKICAgIHBTcmMgKz0gMjsKICAgIHBEc3QgPSBwRHN0ICsgMipsZW5ndGgvZGltMjsKICB9CgogIC8qIFBlcmZvcm0gdGhlIG1vZHVsYXRpb24gb2YgdGhlIG91dHB1dCBvZiB0aGUgZmZ0IG9mIGxlbmd0aCBkaW0xICovCiAgcFNyYz1hRHN0OwogIGZmdF9hcHBseV9yb3RfdmVjdG9yKHBTcmMsIGxlbmd0aC9kaW0yLCBsZW5ndGgsIFJvdFZlY3RvclJlYWwsIFJvdFZlY3RvckltYWcpOwoKICAvKiBQZXJmb3JtIGRpbTEgdGltZXMgdGhlIGZmdCBvZiBsZW5ndGggZGltMi4gVGhlIGlucHV0IHNhbXBsZXMgYXJlIGF0IHRoZSBhZGRyZXNzIG9mIGFEc3QgYW5kIHRoZQogIG91dHB1dCBzYW1wbGVzIGFyZSBhdCB0aGUgYWRkcmVzcyBvZiBwSW5wdXQuIFRoZSBpbnB1dCB2ZWN0b3IgZm9yIHRoZSBmZnQgb2YgbGVuZ3RoIGRpbTIgaXMgYnVpbHQKICBvZiB0aGUgaW50ZXJsZWF2ZWQgc2FtcGxlcyBpbiBhRHN0LCB0aGUgb3V0cHV0IHNhbXBsZXMgYXJlIHN0b3JlZCBjb25zZWN1dGl2ZWx5IGF0IHRoZSBhZGRyZXNzCiAgb2YgcElucHV0LgogICovCiAgcFNyYyAgICA9IGFEc3Q7CiAgcERzdCAgICA9IGFEc3QyOwogIHBEc3RPdXQgPSBwSW5wdXQ7CiAgZm9yKGk9MDsgaTxsZW5ndGgvZGltMjsgaSsrKQogIHsKICAgIGZvcihqPTA7IGo8bGVuZ3RoL2RpbTE7IGorKykKICAgIHsKICAgICAgcERzdFsyKmpdICAgPSBwU3JjWzIqaipkaW0xXTsKICAgICAgcERzdFsyKmorMV0gPSBwU3JjWzIqaipkaW0xKzFdOwogICAgfQoKI2lmbmRlZiBGRlRfVFdPX1NUQUdFX1NXSVRDSF9DQVNFCiAgICBmZnQyKHBEc3QpOwojZWxzZQogICAgc3dpdGNoIChkaW0yKSB7CiAgICAgIGNhc2UgMzogZmZ0MyhwRHN0KTsgYnJlYWs7CiAgICAgIGNhc2UgNDogZmZ0XzQocERzdCk7IGJyZWFrOwogICAgICBjYXNlIDU6IGZmdDUocERzdCk7IGJyZWFrOwogICAgICBjYXNlIDg6IGZmdF84KHBEc3QpOyBicmVhazsKICAgICAgY2FzZSAxNTogZmZ0MTUocERzdCk7IGJyZWFrOwogICAgICBjYXNlIDE2OiBmZnRfMTYocERzdCk7IGJyZWFrOwogICAgICBjYXNlIDMyOiBmZnRfMzIocERzdCk7IGJyZWFrOwogICAgICAvKmNhc2UgNjQ6IGZmdF82NChwRHN0KTsgYnJlYWs7Ki8KICAgICAgY2FzZSAxMjg6IGZmdF8xMjgocERzdCk7IGJyZWFrOwogICAgfQojZW5kaWYKCiAgICBmb3Ioaj0wOyBqPGxlbmd0aC9kaW0xOyBqKyspCiAgICB7CiAgICAgIHBEc3RPdXRbMipqKmRpbTFdICAgPSBwRHN0WzIqal07CiAgICAgIHBEc3RPdXRbMipqKmRpbTErMV0gPSBwRHN0WzIqaisxXTsKICAgIH0KICAgIHBTcmMgKz0gMjsKICAgIHBEc3RPdXQgKz0gMjsKICB9CgogIENfQUxMT0NfU0NSQVRDSF9FTkQoYURzdDIsIEZJWFBfREJMLCBkaW0yKjIpOwogIENfQUxMT0NfU0NSQVRDSF9FTkQoYURzdCwgRklYUF9EQkwsIGxlbmd0aCoyKTsKfQoKI2VuZGlmIC8qIEZGVF9UV09fU1RBR0VfTUFDUk9fRU5BQkxFICovCgoKCgoKCgoKCgoKCiNkZWZpbmUgU0NBTEVGQUNUT1I2MCAgICAgICAgIDUKLyoqClRoZSBmdW5jdGlvbiBwZXJmb3JtcyB0aGUgZmZ0IG9mIGxlbmd0aCA2MC4gSXQgaXMgc3BsaXR0ZXQgaW50byBmZnQncyBvZiBsZW5ndGggNCBhbmQgZmZ0J3Mgb2YKbGVuZ3RoIDE1LiBCZXR3ZWVuIHRoZSBmZnQncyBhIG1vZG9sYXRpb24gaXMgY2FsY3VsYXRlZC4KKi8Kc3RhdGljIGlubGluZSB2b2lkIGZmdDYwKEZJWFBfREJMICpwSW5wdXQsIElOVCAqcFNjYWxlZmFjdG9yKQp7CiAgZmZ0TjIoCiAgICAgICAgICBwSW5wdXQsIDYwLCA0LCAxNSwgCiAgICAgICAgICBmZnRfNCwgZmZ0MTUsCiAgICAgICAgICBSb3RWZWN0b3JSZWFsNjAsIFJvdFZlY3RvckltYWc2MAogICAgICAgICAgKTsKICAqcFNjYWxlZmFjdG9yICs9IFNDQUxFRkFDVE9SNjA7Cn0KCgoKLyogRmFsbGJhY2sgaW1wbGVtZW50YXRpb24gaW4gY2FzZSBvZiBubyBiZXR0ZXIgaW1wbGVtZW50YXRpb24gYXZhaWxhYmxlLiAqLwoKI2RlZmluZSBTQ0FMRUZBQ1RPUjI0MCAgICAgICAgNwoKLyoqClRoZSBmdW5jdGlvbiBwZXJmb3JtcyB0aGUgZmZ0IG9mIGxlbmd0aCAyNDAuIEl0IGlzIHNwbGl0dGV0IGludG8gZmZ0J3Mgb2YgbGVuZ3RoIDE2IGFuZCBmZnQncyBvZgpsZW5ndGggMTUuIEJldHdlZW4gdGhlIGZmdCdzIGEgbW9kdWxhdGlvbiBpcyBjYWxjdWxhdGVkLgoqLwpzdGF0aWMgaW5saW5lIHZvaWQgZmZ0MjQwKEZJWFBfREJMICpwSW5wdXQsIElOVCAqcFNjYWxlZmFjdG9yKQp7CiAgZmZ0TjIoCiAgICAgICAgICBwSW5wdXQsIDI0MCwgMTYsIDE1LCAKICAgICAgICAgIGZmdF8xNiwgZmZ0MTUsCiAgICAgICAgICBSb3RWZWN0b3JSZWFsMjQwLCBSb3RWZWN0b3JJbWFnMjQwCiAgICAgICAgICApOwogICpwU2NhbGVmYWN0b3IgKz0gU0NBTEVGQUNUT1IyNDA7Cn0KCgojZGVmaW5lIFNDQUxFRkFDVE9SNDgwICAgICAgICA4CiNkZWZpbmUgTjMyICAgICAgICAgICAgICAgICAgIDMyCiNkZWZpbmUgVEFCTEVfU0laRV8xNiAgICAgICAgKDMyLzIpCgovKioKVGhlIGZ1bmN0aW9uIHBlcmZvcm1zIHRoZSBmZnQgb2YgbGVuZ3RoIDQ4MC4gSXQgaXMgc3BsaXR0ZXQgaW50byBmZnQncyBvZiBsZW5ndGggMzIgYW5kIGZmdCdzIG9mCmxlbmd0aCAxNS4gQmV0d2VlbiB0aGUgZmZ0J3MgYSBtb2R1bGF0aW9uIGlzIGNhbGN1bGF0ZWQuCiovCnN0YXRpYyBpbmxpbmUgdm9pZCBmZnQ0ODAoRklYUF9EQkwgKnBJbnB1dCwgSU5UICpwU2NhbGVmYWN0b3IpCnsKICBmZnROMigKICAgICAgICAgIHBJbnB1dCwgNDgwLCAzMiwgMTUsIAogICAgICAgICAgZmZ0XzMyLCBmZnQxNSwKICAgICAgICAgIFJvdFZlY3RvclJlYWw0ODAsIFJvdFZlY3RvckltYWc0ODAKICAgICAgICAgICk7CiAgKnBTY2FsZWZhY3RvciArPSBTQ0FMRUZBQ1RPUjQ4MDsKfQoKdm9pZCBmZnQoaW50IGxlbmd0aCwgRklYUF9EQkwgKnBJbnB1dCwgSU5UICpwU2NhbGVmYWN0b3IpCnsKICBpZiAobGVuZ3RoID09IDMyKQogIHsKICAgICAgZmZ0XzMyKHBJbnB1dCk7CiAgICAgICpwU2NhbGVmYWN0b3IgKz0gU0NBTEVGQUNUT1IzMjsKICB9CiAgZWxzZQogIHsKICAKICBzd2l0Y2ggKGxlbmd0aCkgewogICAgY2FzZSAxNjoKICAgICAgZmZ0XzE2KHBJbnB1dCk7CiAgICAgICpwU2NhbGVmYWN0b3IgKz0gU0NBTEVGQUNUT1IxNjsKICAgICAgYnJlYWs7CiAgICBjYXNlIDg6CiAgICAgIGZmdF84KHBJbnB1dCk7CiAgICAgICpwU2NhbGVmYWN0b3IgKz0gU0NBTEVGQUNUT1I4OwogICAgICBicmVhazsKICAgIGNhc2UgMzoKICAgICAgZmZ0MyhwSW5wdXQpOwogICAgICBicmVhazsKICAgIGNhc2UgNDoKICAgICAgZmZ0XzQocElucHV0KTsKICAgICAgKnBTY2FsZWZhY3RvciArPSBTQ0FMRUZBQ1RPUjQ7CiAgICAgIGJyZWFrOwogICAgY2FzZSA1OgogICAgICBmZnQ1KHBJbnB1dCk7CiAgICAgIGJyZWFrOwogICAgY2FzZSAxNToKICAgICAgZmZ0MTUocElucHV0KTsKICAgICAgKnBTY2FsZWZhY3RvciArPSAyOwogICAgICBicmVhazsKICAgIGNhc2UgNjA6CiAgICAgIGZmdDYwKHBJbnB1dCwgcFNjYWxlZmFjdG9yKTsKICAgICAgYnJlYWs7CiAgICBjYXNlIDY0OgogICAgICBkaXRfZmZ0KHBJbnB1dCwgNiwgU2luZVRhYmxlNTEyLCA1MTIpOwogICAgICAqcFNjYWxlZmFjdG9yICs9IFNDQUxFRkFDVE9SNjQ7CiAgICAgIGJyZWFrOwogICAgY2FzZSAyNDA6CiAgICAgIGZmdDI0MChwSW5wdXQsIHBTY2FsZWZhY3Rvcik7CiAgICAgIGJyZWFrOwogICAgY2FzZSAyNTY6CiAgICAgIGRpdF9mZnQocElucHV0LCA4LCBTaW5lVGFibGU1MTIsIDUxMik7CiAgICAgICpwU2NhbGVmYWN0b3IgKz0gU0NBTEVGQUNUT1IyNTY7CiAgICAgIGJyZWFrOwogICAgY2FzZSA0ODA6CiAgICAgIGZmdDQ4MChwSW5wdXQsIHBTY2FsZWZhY3Rvcik7CiAgICAgIGJyZWFrOwogICAgY2FzZSA1MTI6CiAgICAgIGRpdF9mZnQocElucHV0LCA5LCBTaW5lVGFibGU1MTIsIDUxMik7CiAgICAgICpwU2NhbGVmYWN0b3IgKz0gU0NBTEVGQUNUT1I1MTI7CiAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgRkRLX0FTU0VSVCgwKTsgLyogRkZUIGxlbmd0aCBub3Qgc3VwcG9ydGVkISAqLwogICAgICBicmVhazsKICB9CiAgfQp9CgoKdm9pZCBpZmZ0KGludCBsZW5ndGgsIEZJWFBfREJMICpwSW5wdXQsIElOVCAqc2NhbGVmYWN0b3IpCnsKICBzd2l0Y2ggKGxlbmd0aCkgewogICAgZGVmYXVsdDoKICAgICAgRkRLX0FTU0VSVCgwKTsgLyogSUZGVCBsZW5ndGggbm90IHN1cHBvcnRlZCEgKi8KICAgICAgYnJlYWs7CiAgfQp9CgoK