Ci8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAoKqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAxLiAgICBJTlRST0RVQ1RJT04KVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwp0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCgpBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQppbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydApvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KClBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwppbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCnRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCnRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwpzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCgpDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAphcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCgoyLiAgICBDT1BZUklHSFQgTElDRU5TRQoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CnBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKCllvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCnlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCgpZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCllvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgoKVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dApwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCgpZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCnNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgoKWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCiJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCgozLiAgICBOTyBQQVRFTlQgTElDRU5TRQoKTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCkFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCnJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KCllvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZApieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCgo0LiAgICBESVNDTEFJTUVSCgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwpvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgpDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCmluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCm9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCmFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgoKNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgoKRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCkF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCkFtIFdvbGZzbWFudGVsIDMzCjkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Cgp3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCmFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgRkRLIFBDTSB1dGlscyBtb2R1bGUgICoqKioqKioqKioqKioqKioqKioqKioqKioqCgogICBBdXRob3Iocyk6ICAgQ2hyaXN0aWFuIEdyaWViZWwKICAgRGVzY3JpcHRpb246IERlZmluZXMgZnVuY3Rpb25zIHRoYXQgcGVyZm9ybSBkb3dubWl4aW5nIG9yIGEgc2ltcGxlIGNoYW5uZWwKICAgICAgICAgICAgICAgIGV4cGFuc2lvbiBpbiB0aGUgUENNIHRpbWUgZG9tYWluLgoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiNpbmNsdWRlICJwY211dGlsc19saWIuaCIKCiNpbmNsdWRlICJnZW5lcmljU3Rkcy5oIgojaW5jbHVkZSAiZml4cG9pbnRfbWF0aC5oIgojaW5jbHVkZSAiRkRLX2NvcmUuaCIKCgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgogKiAgR0xPQkFMIFNFVFRJTkdTIChHRlIpOiAgKgogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KI2RlZmluZSBEU0VfTUVUQURBVEFfRU5BQkxFICAgICAgICAgIC8qITwgRW5hYmxlIHRoaXMgdG8gc3VwcG9ydCBNUEVHL0VUU0kgRFZCIGFuY2lsbGFyeSBkYXRhIGZvcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVyIGFzc2lzdGVkIGRvd25taXhpbmcgb2YgTVBFRy00IEFBQyBhbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBFRy0xLzIgbGF5ZXIgMiBzdHJlYW1zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KI2RlZmluZSBQQ0VfTUVUQURBVEFfRU5BQkxFICAgICAgICAgIC8qITwgRW5hYmxlIHRoaXMgdG8gc3VwcG9ydCBNUEVHIG1hdHJpeCBtaXhkb3duIHdpdGggYQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2VmZmljaWVudCBjYXJyaWVkIGluIHRoZSBQQ0UuICAgICAgICAgICAgICAgICAgICAgICAqLwoKI2RlZmluZSBQQ01fRE1YX01BWF9JTl9DSEFOTkVMUyAgICAgICAgICAoIDggKSAgIC8qIE5laXRoZXIgdGhlIG1heGltdW0gbnVtYmVyIG9mIGlucHV0IG5vciB0aGUgbWF4aW11bSBudW1iZXIgb2Ygb3V0cHV0IGNoYW5uZWxzIC4uLiAqLwojZGVmaW5lIFBDTV9ETVhfTUFYX09VVF9DSEFOTkVMUyAgICAgICAgICggOCApICAgLyogLi4uIG11c3QgZXhjZWVkIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjaGFubmVscyB0aGF0IHRoZSBmcmFtZXdvcmsgY2FuIGhhbmRsZS4gKi8KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCiAqICAgIFNQRUNJRklDIFNFVFRJTkdTOiAgICAqCiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwojZGVmaW5lIFBDTV9DSEFOTkVMX0VYVEVOU0lPTl9FTkFCTEUgICAgICAgICAgICAgLyohPCBBbGxvdyBtb2R1bGUgdG8gZHVwbGljYXRlIG1vbm8gc2lnbmFscyBvciBhZGQgemVybyBjaGFubmVscyB0byBhY2hpZXZlIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNpcmVkIG51bWJlciBvZiBvdXRwdXQgY2hhbm5lbHMuICovCgojZGVmaW5lIFBDTV9ETVhfREZMVF9NQVhfT1VUX0NIQU5ORUxTICAgICggNiApICAgLyohPCBUaGUgbWF4aW11bSBudW1iZXIgb2Ygb3V0cHV0IGNoYW5uZWxzLiBJZiB0aGUgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIDAgdGhlIG1vZHVsZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGF1dG9tYXRpY2FsbHkgY3JlYXRlIGEgbWl4ZG93biBmb3IgYWxsIGlucHV0IHNpZ25hbHMgd2l0aCBtb3JlIGNoYW5uZWxzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYW4gc3BlY2lmaWVkLiAqLwojZGVmaW5lIFBDTV9ETVhfREZMVF9NSU5fT1VUX0NIQU5ORUxTICAgICggMCApICAgLyohPCBUaGUgbWluaW11bSBudW1iZXIgb2Ygb3V0cHV0IGNoYW5uZWxzLiBJZiB0aGUgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIDAgdGhlIG1vZHVsZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGRvIGNoYW5uZWwgZXh0ZW5zaW9uIGF1dG9tYXRpY2FsbHkgZm9yIGFsbCBpbnB1dCBzaWduYWxzIHdpdGggbGVzcyBjaGFubmVscwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGFuIHNwZWNpZmllZC4gKi8KI2RlZmluZSBQQ01fRE1YX01BWF9ERUxBWV9GUkFNRVMgICAgICAgICAoIDEgKSAgIC8qITwgVGhlIG1heGltdW0gZGVsYXkgZnJhbWVzIHRvIGFsaWduIHRoZSBiaXRzdHJlYW1zIHBheWxvYWQgd2l0aCB0aGUgUENNIG91dHB1dC4gKi8KI2RlZmluZSBQQ01fRE1YX0RGTFRfRVhQSVJZX0ZSQU1FICAgICAgICAoIDUwICkgIC8qITwgSWYgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIDAgdGhlIG1peGRvd24gY29lZmZpY2llbnRzIHdpbGwgZXhwaXJlIGJ5IGRlZmF1bHQgYWZ0ZXIgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpdmVuIG51bWJlciBvZiBmcmFtZXMuIFRoZSB2YWx1ZSA1MCBjb3JyZXNwb25kcyB0byBhdCBsZWFzdCA1MDBtcyAoRkwgOTYwIEAgOTZrSHopICovCi8qICNkZWZpbmUgUENNRE1YX0RFQlVHICovCgovKiBEZXJpdmVkIHNldHRpbmc6CiAqICAgTm8gbmVlZCB0byBlZGl0IGJleW9uZCB0aGlzIGxpbmUuICovCiNpZiBkZWZpbmVkKERTRV9NRVRBREFUQV9FTkFCTEUpIHx8IGRlZmluZWQoUENFX01FVEFEQVRBX0VOQUJMRSkgfHwgZGVmaW5lZChBUklCX01JWERPV05fRU5BQkxFKQogI2RlZmluZSBQQ01fRE9XTk1JWF9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgLyohPCBHZW5lcmFsbHkgZW5hYmxlIGRvd24gbWl4aW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwojZW5kaWYKI2lmIChQQ01fRE1YX01BWF9JTl9DSEFOTkVMUyA+IDIpIHx8IChQQ01fRE1YX01BWF9PVVRfQ0hBTk5FTFMgPiAyKQogI2RlZmluZSBQQ01fRE1YX01BWF9DSEFOTkVMUyAgICAgICAgICAgICggOCApCiAjZGVmaW5lIFBDTV9ETVhfTUFYX0NIQU5ORUxfR1JPVVBTICAgICAgKCA0ICkKICNkZWZpbmUgUENNX0RNWF9NQVhfQ0hBTk5FTFNfUEVSX0dST1VQICBQQ01fRE1YX01BWF9DSEFOTkVMUyAgIC8qIEFsbCBjaGFubmVscyBjYW4gYmUgaW4gb25lIGdyb3VwICovCiNlbHNlCiAjZGVmaW5lIFBDTV9ETVhfTUFYX0NIQU5ORUxTICAgICAgICAgICAgKCAzICkgICAvKiBOZWVkIHRvIGFkZCAxIGJlY2F1c2UgdGhlcmUgYXJlIHRocmVlIGNoYW5uZWwgcG9zaXRpb25zIGluIGZpcnN0IGNoYW5uZWwgZ3JvdXAuICovCiAjZGVmaW5lIFBDTV9ETVhfTUFYX0NIQU5ORUxfR1JPVVBTICAgICAgKCAxICkgICAvKiBPbmx5IGZyb250IGNoYW5uZWxzIHN1cHBvcnRlZC4gKi8KICNkZWZpbmUgUENNX0RNWF9NQVhfQ0hBTk5FTFNfUEVSX0dST1VQICAoIDIgKSAgIC8qIFRoZSBtYXhpbXVtIG92ZXIgYWxsIGNoYW5uZWwgZ3JvdXBzICovCiNlbmRpZgojaWYgKFBDTV9ETVhfTUFYX0lOX0NIQU5ORUxTID4gUENNX0RNWF9NQVhfT1VUX0NIQU5ORUxTKQogI2RlZmluZSBQQ01fRE1YX01BWF9JT19DSEFOTkVMUyAgUENNX0RNWF9NQVhfSU5fQ0hBTk5FTFMKI2Vsc2UKICNkZWZpbmUgUENNX0RNWF9NQVhfSU9fQ0hBTk5FTFMgIFBDTV9ETVhfTUFYX09VVF9DSEFOTkVMUwojZW5kaWYKCi8qIERlY29kZXIgbGlicmFyeSBpbmZvICovCiNkZWZpbmUgUENNRE1YX0xJQl9WTDAgMgojZGVmaW5lIFBDTURNWF9MSUJfVkwxIDQKI2RlZmluZSBQQ01ETVhfTElCX1ZMMiAyCiNkZWZpbmUgUENNRE1YX0xJQl9USVRMRSAiUENNIERvd25taXggTGliIgojZGVmaW5lIFBDTURNWF9MSUJfQlVJTERfREFURSBfX0RBVEVfXwojZGVmaW5lIFBDTURNWF9MSUJfQlVJTERfVElNRSBfX1RJTUVfXwoKCi8qIEZpeGVkIGFuZCB1bmlxdWUgY2hhbm5lbCBncm91cCBpbmRpY2VzLgogKiBUaGUgbGFzdCBncm91cCBpbmRleCBoYXMgdG8gYmUgc21hbGxlciB0aGFuIFBDTV9ETVhfTUFYX0NIQU5ORUxfR1JPVVBTLiAqLwojZGVmaW5lIENIX0dST1VQX0ZST05UICggMCApCiNkZWZpbmUgQ0hfR1JPVVBfU0lERSAgKCAxICkKI2RlZmluZSBDSF9HUk9VUF9SRUFSICAoIDIgKQojZGVmaW5lIENIX0dST1VQX0xGRSAgICggMyApCgovKiBUaGUgb3JkZXJpbmcgb2YgdGhlIGZvbGxvd2luZyBmaXhlZCBjaGFubmVsIGxhYmVscyBoYXMgdG8gYmUgaW4gTVBFRy00IHN0eWxlLgogKiBGcm9tIHRoZSBjZW50ZXIgdG8gdGhlIGJhY2sgd2l0aCBsZWZ0IGFuZCByaWdodCBjaGFubmVsIGludGVybGVhdmVkIChzdGFydGluZyB3aXRoIGxlZnQpLgogKiBUaGUgbGFzdCBjaGFubmVsIGxhYmVsIGluZGV4IGhhcyB0byBiZSBzbWFsbGVyIHRoYW4gUENNX0RNWF9NQVhfQ0hBTk5FTFMuICovCiNkZWZpbmUgQ0VOVEVSX0ZST05UX0NIQU5ORUwgICAgKCAwICkgICAgIC8qIEMgICovCiNkZWZpbmUgTEVGVF9GUk9OVF9DSEFOTkVMICAgICAgKCAxICkgICAgIC8qIEwgICovCiNkZWZpbmUgUklHSFRfRlJPTlRfQ0hBTk5FTCAgICAgKCAyICkgICAgIC8qIFIgICovCiNkZWZpbmUgTEVGVF9SRUFSX0NIQU5ORUwgICAgICAgKCAzICkgICAgIC8qIExyIChha2EgbGVmdCBiYWNrIGNoYW5uZWwpIG9yIGNlbnRlciBiYWNrIGNoYW5uZWwgKi8KI2RlZmluZSBSSUdIVF9SRUFSX0NIQU5ORUwgICAgICAoIDQgKSAgICAgLyogUnIgKGFrYSByaWdodCBiYWNrIGNoYW5uZWwpICovCiNkZWZpbmUgTE9XX0ZSRVFVRU5DWV9DSEFOTkVMICAgKCA1ICkgICAgIC8qIExmICovCiNkZWZpbmUgTEVGVF9NVUxUSVBSUFNfQ0hBTk5FTCAgKCA2ICkgICAgIC8qIExlZnQgbXVsdGlwdXJwb3NlIGNoYW5uZWwgKi8KI2RlZmluZSBSSUdIVF9NVUxUSVBSUFNfQ0hBTk5FTCAoIDcgKSAgICAgLyogUmlnaHQgbXVsdGlwdXJwb3NlIGNoYW5uZWwgKi8KCi8qIE1vcmUgY29uc3RhbnRzICovCiNkZWZpbmUgT05FX0NIQU5ORUwgICAgICAgICAgICAgKCAxICkKI2RlZmluZSBUV09fQ0hBTk5FTCAgICAgICAgICAgICAoIDIgKQojZGVmaW5lIFNJWF9DSEFOTkVMICAgICAgICAgICAgICggNiApCiNkZWZpbmUgRUlHSFRfQ0hBTk5FTCAgICAgICAgICAgKCA4ICkKCiNkZWZpbmUgUENNRE1YX0FfSURYX0RFRkFVTFQgICAgKCAyICkKI2RlZmluZSBQQ01ETVhfQl9JRFhfREVGQVVMVCAgICAoIDIgKQojZGVmaW5lIFBDTURNWF9MRkVfSURYX0RFRkFVTFQgICggMTUgKQojZGVmaW5lIFBDTURNWF9HQUlOXzVfREVGQVVMVCAgICggMCApCiNkZWZpbmUgUENNRE1YX0dBSU5fMl9ERUZBVUxUICAgKCAwICkKCiNkZWZpbmUgUENNRE1YX01BWF9IRUFEUk9PTSAgICAgKCAzICkgICAgIC8qIERlZmluZXMgdGhlIG1heGltdW0gUENNIHNjYWxpbmcgaGVhZHJvb20gdGhhdCBjYW4gYmUgZG9uZSBieSBhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3Rwcm9jZXNzaW5nIHN0ZXAuIFRoaXMgdmFsdWUgbXVzdCBiZSBncmVhdGVyIG9yIGVxdWFsIHRvIDAuICovCgojZGVmaW5lIEZBTFNFICAwCiNkZWZpbmUgVFJVRSAgIDEKI2RlZmluZSBJTiAgICAgMAojZGVmaW5lIE9VVCAgICAxCgovKiBUeXBlIGRlZmluaXRpb25zOiAqLwojaWZuZGVmIERNWF9ISUdIX1BSRUNJU0lPTl9FTkFCTEUKICNkZWZpbmUgRklYUF9ETVggICAgICAgICAgRklYUF9TR0wKICNkZWZpbmUgRlhfRE1YMkZYX0RCTCh4KSAgRlhfU0dMMkZYX0RCTCgoRklYUF9TR0wpKHgpKQogI2RlZmluZSBGWF9EQkwyRlhfRE1YKHgpICBGWF9EQkwyRlhfU0dMKHgpCiAjZGVmaW5lIEZMMkZYQ09OU1RfRE1YKHgpIEZMMkZYQ09OU1RfU0dMKHgpCiAjZGVmaW5lIE1BWFZBTF9ETVggICAgICAgIE1BWFZBTF9TR0wKICNkZWZpbmUgRlhfRE1YMlNIUlQoeCkgICAgKChTSE9SVCkoeCkpCiAjZGVmaW5lIEZYX0RNWDJGTCh4KSAgICAgIEZYX0RCTDJGTChGWF9ETVgyRlhfREJMKHgpKQojZWxzZQogI2RlZmluZSBGSVhQX0RNWCAgICAgICAgICBGSVhQX0RCTAogI2RlZmluZSBGWF9ETVgyRlhfREJMKHgpICAoKEZJWFBfREJMKSh4KSkKICNkZWZpbmUgRlhfREJMMkZYX0RNWCh4KSAgKChGSVhQX0RCTCkoeCkKICNkZWZpbmUgRkwyRlhDT05TVF9ETVgoeCkgRkwyRlhDT05TVF9EQkwoeCkKICNkZWZpbmUgTUFYVkFMX0RNWCAgICAgICAgTUFYVkFMX0RCTAogI2RlZmluZSBGWF9ETVgyU0hSVCh4KSAgICAoKFNIT1JUKSgoeCk+PkZSQUNUX0JJVFMpKQogI2RlZmluZSBGWF9ETVgyRkwoeCkgICAgICBGWF9EQkwyRkwoeCkKI2VuZGlmCgovKiBUaGUgbnVtYmVyIG9mIGNoYW5uZWxzIHBvc2l0aW9ucyBmb3IgZWFjaCBncm91cCBpbiB0aGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24uCiAqIFNlZSB0aGUgY2hhbm5lbCBsYWJlbHMgYWJvdmUuICovCnN0YXRpYyBjb25zdCBVQ0hBUiBtYXhDaEluR3JwW1BDTV9ETVhfTUFYX0NIQU5ORUxfR1JPVVBTXSA9IHsKI2lmIChQQ01fRE1YX01BWF9DSEFOTkVMUyA+IDMpCiAgMywgMCwgMiwgMQojZWxzZQogIFBDTV9ETVhfTUFYX0NIQU5ORUxTX1BFUl9HUk9VUAojZW5kaWYKfTsKCi8qIExpc3Qgb2YgcGFja2VkIGNoYW5uZWwgbW9kZXMgKi8KdHlwZWRlZiBlbnVtCnsgLyogQ0hfTU9ERV88bnVtRnJvbnRDaD5fPG51bVNpZGVDaD5fPG51bUJhY2tDaD5fPG51bUxmQ2g+ICovCiAgQ0hfTU9ERV9VTkRFRklORUQgPSAweDAwMDAsCiAgLyogMSBjaGFubmVsICovCiAgQ0hfTU9ERV8xXzBfMF8wICAgPSAweDAwMDEsICAgLyogY2hDZmcgMSAqLwogIC8qIDIgY2hhbm5lbHMgKi8KICBDSF9NT0RFXzJfMF8wXzAgICA9IDB4MDAwMiwgICAvKiBjaENmZyAyICovCiAgLyogMyBjaGFubmVscyAqLwogIENIX01PREVfM18wXzBfMCAgID0gMHgwMDAzLCAgIC8qIGNoQ2ZnIDMgKi8KICBDSF9NT0RFXzJfMF8xXzAgICA9IDB4MDEwMiwKICBDSF9NT0RFXzJfMF8wXzEgICA9IDB4MTAwMiwKICAvKiA0IGNoYW5uZWxzICovCiAgQ0hfTU9ERV8zXzBfMV8wICAgPSAweDAxMDMsICAgLyogY2hDZmcgNCAqLwogIENIX01PREVfMl8wXzJfMCAgID0gMHgwMjAyLAogIENIX01PREVfMl8wXzFfMSAgID0gMHgxMTAyLAogIENIX01PREVfNF8wXzBfMCAgID0gMHgwMDA0LAogIC8qIDUgY2hhbm5lbHMgKi8KICBDSF9NT0RFXzNfMF8yXzAgICA9IDB4MDIwMywgICAvKiBjaENmZyA1ICovCiAgQ0hfTU9ERV8yXzBfMl8xICAgPSAweDEyMDIsCiAgQ0hfTU9ERV8zXzBfMV8xICAgPSAweDExMDMsCiAgQ0hfTU9ERV8zXzJfMF8wICAgPSAweDAwMjMsCiAgQ0hfTU9ERV81XzBfMF8wICAgPSAweDAwMDUsCiAgLyogNiBjaGFubmVscyAqLwogIENIX01PREVfM18wXzJfMSAgID0gMHgxMjAzLCAgIC8qIGNoQ2ZnIDYgKi8KICBDSF9NT0RFXzNfMl8wXzEgICA9IDB4MTAyMywKICBDSF9NT0RFXzNfMl8xXzAgICA9IDB4MDEyMywKICBDSF9NT0RFXzVfMF8xXzAgICA9IDB4MDEwNSwKICBDSF9NT0RFXzZfMF8wXzAgICA9IDB4MDAwNiwKICAvKiA3IGNoYW5uZWxzICovCiAgQ0hfTU9ERV8yXzJfMl8xICAgPSAweDEyMjIsCiAgQ0hfTU9ERV8zXzBfM18xICAgPSAweDEzMDMsICAgLyogY2hDZmcgMTEgKi8KICBDSF9NT0RFXzNfMl8xXzEgICA9IDB4MTEyMywKICBDSF9NT0RFXzNfMl8yXzAgICA9IDB4MDIyMywKICBDSF9NT0RFXzNfMF8yXzIgICA9IDB4MjIwMywKICBDSF9NT0RFXzVfMF8yXzAgICA9IDB4MDIwNSwKICBDSF9NT0RFXzVfMF8xXzEgICA9IDB4MTEwNSwKICBDSF9NT0RFXzdfMF8wXzAgICA9IDB4MDAwNywKICAvKiA4IGNoYW5uZWxzICovCiAgQ0hfTU9ERV8zXzJfMl8xICAgPSAweDEyMjMsCiAgQ0hfTU9ERV8zXzBfNF8xICAgPSAweDE0MDMsICAgLyogY2hDZmcgMTIgKi8KICBDSF9NT0RFXzVfMF8yXzEgICA9IDB4MTIwNSwgICAvKiBjaENmZyA3ICsgMTQgKi8KICBDSF9NT0RFXzVfMl8xXzAgICA9IDB4MDEyNSwKICBDSF9NT0RFXzNfMl8xXzIgICA9IDB4MjEyMywKICBDSF9NT0RFXzJfMl8yXzIgICA9IDB4MjIyMiwKICBDSF9NT0RFXzNfMF8zXzIgICA9IDB4MjMwMywKICBDSF9NT0RFXzhfMF8wXzAgICA9IDB4MDAwOAoKfSBQQ01fRE1YX0NIQU5ORUxfTU9ERTsKCgovKiBUaGVzZSBhcmUgdGhlIGNoYW5uZWwgY29uZmlndXJhdGlvbnMgbGlua2VkIHRvCiAgIHRoZSBudW1iZXIgb2Ygb3V0cHV0IGNoYW5uZWxzIGdpdmUgYnkgdGhlIHVzZXI6ICovCnN0YXRpYyBjb25zdCBQQ01fRE1YX0NIQU5ORUxfTU9ERSBvdXRDaE1vZGVUYWJsZVtQQ01fRE1YX01BWF9DSEFOTkVMUysxXSA9CnsKICBDSF9NT0RFX1VOREVGSU5FRCwKICBDSF9NT0RFXzFfMF8wXzAsICAvKiAxIGNoYW5uZWwgICovCiAgQ0hfTU9ERV8yXzBfMF8wLCAgLyogMiBjaGFubmVscyAqLwogIENIX01PREVfM18wXzBfMCAgIC8qIDMgY2hhbm5lbHMgKi8KI2lmIChQQ01fRE1YX01BWF9DSEFOTkVMUyA+IDMpCiAsQ0hfTU9ERV8zXzBfMV8wLCAgLyogNCBjaGFubmVscyAqLwogIENIX01PREVfM18wXzJfMCwgIC8qIDUgY2hhbm5lbHMgKi8KICBDSF9NT0RFXzNfMF8yXzEsICAvKiA2IGNoYW5uZWxzICovCiAgQ0hfTU9ERV8zXzBfM18xLCAgLyogNyBjaGFubmVscyAqLwogIENIX01PREVfM18wXzRfMSAgIC8qIDggY2hhbm5lbHMgKi8KI2VuZGlmCn07CgpzdGF0aWMgY29uc3QgRklYUF9ETVggYWJNaXhMdmxWYWx1ZVRhYls4XSA9CnsKICBGTDJGWENPTlNUX0RNWCgwLjUwMGYpLCAgIC8qIHNjYWxlZCBieSAxICovCiAgRkwyRlhDT05TVF9ETVgoMC44NDFmKSwKICBGTDJGWENPTlNUX0RNWCgwLjcwN2YpLAogIEZMMkZYQ09OU1RfRE1YKDAuNTk2ZiksCiAgRkwyRlhDT05TVF9ETVgoMC41MDBmKSwKICBGTDJGWENPTlNUX0RNWCgwLjQyMmYpLAogIEZMMkZYQ09OU1RfRE1YKDAuMzU1ZiksCiAgRkwyRlhDT05TVF9ETVgoMC4wZikKfTsKCnN0YXRpYyBjb25zdCBGSVhQX0RNWCBsZmVNaXhMdmxWYWx1ZVRhYlsxNl0gPQp7IC8qICAgICAgICAgICAgIHZhbHVlLCAgICAgICAgc2NhbGUgKi8KICBGTDJGWENPTlNUX0RNWCgwLjc5MDVmKSwgIC8qICAgICAyICovCiAgRkwyRlhDT05TVF9ETVgoMC41MDAwZiksICAvKiAgICAgMiAqLwogIEZMMkZYQ09OU1RfRE1YKDAuODM5NWYpLCAgLyogICAgIDEgKi8KICBGTDJGWENPTlNUX0RNWCgwLjcwNjVmKSwgIC8qICAgICAxICovCiAgRkwyRlhDT05TVF9ETVgoMC41OTQ1ZiksICAvKiAgICAgMSAqLwogIEZMMkZYQ09OU1RfRE1YKDAuNTAwZiksICAgLyogICAgIDEgKi8KICBGTDJGWENPTlNUX0RNWCgwLjg0MWYpLCAgIC8qICAgICAwICovCiAgRkwyRlhDT05TVF9ETVgoMC43MDdmKSwgICAvKiAgICAgMCAqLwogIEZMMkZYQ09OU1RfRE1YKDAuNTk2ZiksICAgLyogICAgIDAgKi8KICBGTDJGWENPTlNUX0RNWCgwLjUwMGYpLCAgIC8qICAgICAwICovCiAgRkwyRlhDT05TVF9ETVgoMC4zMTZmKSwgICAvKiAgICAgMCAqLwogIEZMMkZYQ09OU1RfRE1YKDAuMTc4ZiksICAgLyogICAgIDAgKi8KICBGTDJGWENPTlNUX0RNWCgwLjEwMGYpLCAgIC8qICAgICAwICovCiAgRkwyRlhDT05TVF9ETVgoMC4wMzJmKSwgICAvKiAgICAgMCAqLwogIEZMMkZYQ09OU1RfRE1YKDAuMDEwZiksICAgLyogICAgIDAgKi8KICBGTDJGWENPTlNUX0RNWCgwLjAwMGYpICAgIC8qICAgICAwICovCn07CgoKCiNpZmRlZiBQQ0VfTUVUQURBVEFfRU5BQkxFCiAgLyogTVBFRyBtYXRyaXggbWl4ZG93bjoKICAgICAgU2V0IDE6ICBMJyA9ICgxICsgMl4tMC41ICsgQSApXi0xICogW0wgKyBDICogMl4tMC41ICsgQSAqIExzXTsKICAgICAgICAgICAgICBSJyA9ICgxICsgMl4tMC41ICsgQSApXi0xICogW1IgKyBDICogMl4tMC41ICsgQSAqIFJzXTsKCiAgICAgIFNldCAyOiAgTCcgPSAoMSArIDJeLTAuNSArIDJBICleLTEgKiBbTCArIEMgKiAyXi0wLjUgLSBBICogKExzICsgUnMpXTsKICAgICAgICAgICAgICBSJyA9ICgxICsgMl4tMC41ICsgMkEgKV4tMSAqIFtSICsgQyAqIDJeLTAuNSArIEEgKiAoTHMgKyBScyldOwoKICAgICAgTSA9ICgzICsgMkEpXi0xICogW0wgKyBDICsgUiArIEEqKExzICsgUnMpXTsKICAqLwogIHN0YXRpYyBjb25zdCBGSVhQX0RNWCBtcGVnTWl4RG93bklkeDJDb2VmWzRdID0KICB7CiAgICBGTDJGWENPTlNUX0RNWCgwLjcwNzEwNjc4ZiksCiAgICBGTDJGWENPTlNUX0RNWCgwLjVmKSwKICAgIEZMMkZYQ09OU1RfRE1YKDAuMzUzNTUzMzlmKSwKICAgIEZMMkZYQ09OU1RfRE1YKDAuMGYpCiAgfTsKCiAgc3RhdGljIGNvbnN0IEZJWFBfU0dMIG1wZWdNaXhEb3duSWR4MlByZUZhY3RbM11bNF0gPQogIHsgeyAgLyogU2V0IDE6ICovCiAgICBGTDJGWENPTlNUX0RNWCgwLjQxNDIxMzU2MjM3MzA5NTBmKSwKICAgIEZMMkZYQ09OU1RfRE1YKDAuNDUzMDgxODM5MzIxOTcyOGYpLAogICAgRkwyRlhDT05TVF9ETVgoMC40ODUyODEzNzQyMzg1NzAzZiksCiAgICBGTDJGWENPTlNUX0RNWCgwLjU4NTc4NjQzNzYyNjkwNTBmKQogIH0seyAgLyogU2V0IDI6ICovCiAgICBGTDJGWENPTlNUX0RNWCgwLjMyMDM3NzI0MTAxNzA0MDdmKSwKICAgIEZMMkZYQ09OU1RfRE1YKDAuMzY5Mzk4MDYyNTE4MTI5M2YpLAogICAgRkwyRlhDT05TVF9ETVgoMC40MTQyMTM1NjIzNzMwOTUwZiksCiAgICBGTDJGWENPTlNUX0RNWCgwLjU4NTc4NjQzNzYyNjkwNTBmKQogIH0seyAgLyogTW9ubyBETVggc2V0OiAqLwogICAgRkwyRlhDT05TVF9ETVgoMC4yMjY1NDA5MTk2NjA5ODY0ZiksCiAgICBGTDJGWENPTlNUX0RNWCgwLjI1ZiksCiAgICBGTDJGWENPTlNUX0RNWCgwLjI2OTc1MjE0MzM4OTgxNzlmKSwKICAgIEZMMkZYQ09OU1RfRE1YKDAuMzMzMzMzMzMzMzMzMzMzM2YpIH0KICB9OwojZW5kaWYgIC8qIFBDRV9NRVRBREFUQV9FTkFCTEUgKi8KCgojZGVmaW5lIFRZUEVfTk9ORSAgICAgICggMHgwICkKI2RlZmluZSBUWVBFX0RTRV9EQVRBICAoIDB4MSApCiNkZWZpbmUgVFlQRV9QQ0VfREFUQSAgKCAweDIgKQoKdHlwZWRlZiBzdHJ1Y3QKewogIFVJTlQgICB0eXBlRmxhZ3M7CiAgLyogRnJvbSBEU0UgKi8KICBVQ0hBUiAgY0xldklkeDsKICBVQ0hBUiAgc0xldklkeDsKICBVQ0hBUiAgZG1peElkeEE7CiAgVUNIQVIgIGRtaXhJZHhCOwogIFVDSEFSICBkbWl4SWR4TGZlOwogIFVDSEFSICBkbXhHYWluSWR4MjsKICBVQ0hBUiAgZG14R2FpbklkeDU7CiNpZmRlZiBQQ0VfTUVUQURBVEFfRU5BQkxFCiAgLyogRnJvbSBQQ0UgKi8KICBVQ0hBUiAgbWF0cml4TWl4ZG93bklkeDsKI2VuZGlmCiAgLyogQXR0cmlidXRlczogKi8KICBTQ0hBUiAgcHNldWRvU3Vycm91bmQ7ICAgICAgICAgICAgICAgLyohPCBJZiBzZXQgdG8gMSB0aGUgc2lnbmFsIGlzIHBzZXVkbyBzdXJyb3VuZCBjb21wYXRpYmxlLiBUaGUgdmFsdWUgMCB0ZWxscwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgaXQgaXMgbm90LiBJZiB0aGUgdmFsdWUgaXMgLTEgdGhlIGluZm9ybWF0aW9uIGlzIG5vdCBhdmFpbGFibGUuICAqLwogIFVJTlQgICBleHBpcnlDb3VudDsgICAgICAgICAgICAgICAgICAvKiE8IENvdW50ZXIgdG8gbW9uaXRvciB0aGUgbGlmZSB0aW1lIG9mIGEgbWV0YSBkYXRhIHNldC4gKi8KCn0gRE1YX0JTX01FVEFfREFUQTsKCi8qIERlZmF1bHQgbWV0YWRhdGEgKi8Kc3RhdGljIGNvbnN0IERNWF9CU19NRVRBX0RBVEEgIGRmbHRNZXRhRGF0YSA9IHsKICAwLCAyLCAyLCAyLCAyLCAxNSwgMCwgMCwKI2lmZGVmIFBDRV9NRVRBREFUQV9FTkFCTEUKICAwLAojZW5kaWYKICAtMSwgMAp9OwoKLyogRHluYW1pYyAodXNlcikgcGFyYW1zOgogICAgIFNlZSB0aGUgZGVmaW5pdGlvbiBvZiBQQ01ETVhfUEFSQU0gZm9yIGRldGFpbHMgb24gdGhlIHNwZWNpZmljIGZpZWxkcy4gKi8KdHlwZWRlZiBzdHJ1Y3QKewogIFVJTlQgICBleHBpcnlGcmFtZTsgICAgICAgICAgICAgICAgICAgLyohPCBMaW5rZWQgdG8gRE1YX0JTX0RBVEFfRVhQSVJZX0ZSQU1FICAgICAgICovCiAgRFVBTF9DSEFOTkVMX01PREUgZHVhbENoYW5uZWxNb2RlOyAgICAvKiE8IExpbmtlZCB0byBETVhfRFVBTF9DSEFOTkVMX01PREUgICAgICAgICAgKi8KICBQU0VVRE9fU1VSUk9VTkRfTU9ERSBwc2V1ZG9TdXJyTW9kZTsgIC8qITwgTGlua2VkIHRvIERNWF9QU0VVRE9fU1VSUk9VTkRfTU9ERSAgICAgICAqLwogIFNIT1JUICBudW1PdXRDaGFubmVsc01pbjsgICAgICAgICAgICAgLyohPCBMaW5rZWQgdG8gTUlOX05VTUJFUl9PRl9PVVRQVVRfQ0hBTk5FTFMgICovCiAgU0hPUlQgIG51bU91dENoYW5uZWxzTWF4OyAgICAgICAgICAgICAvKiE8IExpbmtlZCB0byBNQVhfTlVNQkVSX09GX09VVFBVVF9DSEFOTkVMUyAgKi8KICBVQ0hBUiAgZnJhbWVEZWxheTsgICAgICAgICAgICAgICAgICAgIC8qITwgTGlua2VkIHRvIERNWF9CU19EQVRBX0RFTEFZICAgICAgICAgICAgICAqLwoKfSBQQ01fRE1YX1VTRVJfUEFSQU1TOwoKLyogTW9kdWxlcyBtYWluIGRhdGEgc3RydWN0dXJlOiAqLwpzdHJ1Y3QgUENNX0RNWF9JTlNUQU5DRQp7CiAgLyogTWV0YWRhdGEgKi8KICBETVhfQlNfTUVUQV9EQVRBICAgICBic01ldGFEYXRhW1BDTV9ETVhfTUFYX0RFTEFZX0ZSQU1FUysxXTsKICBQQ01fRE1YX1VTRVJfUEFSQU1TICB1c2VyUGFyYW1zOwoKICBVQ0hBUiAgYXBwbHlQcm9jZXNzaW5nOyAgICAgICAgICAgICAgLyohPCBGbGFnIHRvIGVuLS9kaXNhYmxlIG1vZHVsZXMgcHJvY2Vzc2luZy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgbWF4IGNoYW5uZWwgbGltaXRpbmcgaXMgZG9uZSBpbmRlcGVuZGVudGx5LiAqLwp9OwoKLyogTWVtb3J5IGFsbG9jYXRpb24gbWFjcm8gKi8KQ19BTExPQ19NRU1fU1RBVElDKFBjbURteEluc3RhbmNlLCBzdHJ1Y3QgUENNX0RNWF9JTlNUQU5DRSwgMSkKCgovKiogRXZhbHVhdGUgYSBnaXZlbiBjaGFubmVsIGNvbmZpZ3VyYXRpb24gYW5kIGV4dHJhY3QgYSBwYWNrZWQgY2hhbm5lbCBtb2RlLiBJbiBhZGRpdGlvbiB0aGUKICogIGZ1bmN0aW9uIGdlbmVyYXRlcyBhIGNoYW5uZWwgb2Zmc2V0IHRhYmxlIGZvciB0aGUgbWFwcGluZyB0byB0aGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24uCiAqICBUaGlzIGZ1bmN0aW9uIGlzIHRoZSBpbnZlcnNlIHRvIHRoZSBnZXRDaGFubmVsRGVzY3JpcHRpb24oKSByb3V0aW5lLgogKiBAcGFyYW0gW2luXSBUaGUgdG90YWwgbnVtYmVyIG9mIGNoYW5uZWxzIG9mIHRoZSBnaXZlbiBjb25maWd1cmF0aW9uLgogKiBAcGFyYW0gW2luXSBBcnJheSBob2xkaW5nIHRoZSBjb3JyZXNwb25kaW5nIGNoYW5uZWwgdHlwZXMgZm9yIGVhY2ggY2hhbm5lbC4KICogQHBhcmFtIFtpbl0gQXJyYXkgaG9sZGluZyB0aGUgY29ycmVzcG9uZGluZyBjaGFubmVsIHR5cGUgaW5kaWNlcyBmb3IgZWFjaCBjaGFubmVsLgogKiBAcGFyYW0gW291dF0gQXJyYXkgd2hlcmUgdGhlIGJ1ZmZlciBvZmZzZXRzIGZvciBlYWNoIGNoYW5uZWwgYXJlIHN0b3JlZCBpbnRvLgogKiBAcGFyYW0gW291dF0gVGhlIGdlbmVyYXRlZCBwYWNrZWQgY2hhbm5lbCBtb2RlIHRoYXQgcmVwcmVzZW50cyB0aGUgZ2l2ZW4gaW5wdXQgY29uZmlndXJhdGlvbi4KICogQHJldHVybnMgUmV0dXJucyBhbiBlcnJvciBjb2RlLgogKiovCnN0YXRpYwpQQ01ETVhfRVJST1IgZ2V0Q2hhbm5lbE1vZGUgKAogICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICBudW1DaGFubmVscywgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbiAqLwogICAgICAgIGNvbnN0IEFVRElPX0NIQU5ORUxfVFlQRSBjaGFubmVsVHlwZVtdLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbiAqLwogICAgICAgIGNvbnN0IFVDSEFSICAgICAgICAgICAgICBjaGFubmVsSW5kaWNlc1tdLCAgICAgICAgICAgICAgICAgICAgICAvKiBpbiAqLwogICAgICAgIFVDSEFSICAgICAgICAgICAgICAgICAgICBvZmZzZXRUYWJsZVtQQ01fRE1YX01BWF9DSEFOTkVMU10sICAgICAvKiBvdXQgKi8KICAgICAgICBQQ01fRE1YX0NIQU5ORUxfTU9ERSAgICAqY2hNb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb3V0ICovCiAgICAgICkKewogIFVDSEFSIGNoSWR4W1BDTV9ETVhfTUFYX0NIQU5ORUxfR1JPVVBTXVtQQ01fRE1YX01BWF9DSEFOTkVMU19QRVJfR1JPVVBdOwogIFVDSEFSIG51bUNoSW5HcnBbUENNX0RNWF9NQVhfQ0hBTk5FTF9HUk9VUFNdOyAvKiBUb3RhbCBudW0gb2YgY2hhbm5lbHMgcGVyIGdyb3VwIG9mIHRoZSBpbnB1dCBjb25maWcgKi8KICBVQ0hBUiBudW1DaEZyZWVbUENNX0RNWF9NQVhfQ0hBTk5FTF9HUk9VUFNdOyAgLyogTnVtYmVyIG9mIGZyZWUgc2xvdHMgcGVyIGdyb3VwIGluIHRoZSBpbnRlcm5hbCByZXByLiAqLwogIFVDSEFSIGhhcmRUb1BsYWNlW1BDTV9ETVhfTUFYX0NIQU5ORUxTXTsgICAgICAvKiBMaXN0IG9mIGNoYW5uZWxzIG5vdCBtYXRjaGluZyB0aGUgaW50ZXJuYWwgcmVwci4gKi8KICBVQ0hBUiBoMnBTb3J0SWR4W1BDTV9ETVhfTUFYX0NIQU5ORUxTXTsKICBQQ01ETVhfRVJST1IgZXJyID0gUENNRE1YX09LOwogIGludCAgIGNoLCBncnBJZHg7CiAgaW50ICAgbnVtQ2hUb1BsYWNlID0gMDsKCiAgRkRLX0FTU0VSVChjaGFubmVsVHlwZSAhPSBOVUxMKTsKICBGREtfQVNTRVJUKGNoYW5uZWxJbmRpY2VzICE9IE5VTEwpOwogIEZES19BU1NFUlQob2Zmc2V0VGFibGUgIT0gTlVMTCk7CiAgRkRLX0FTU0VSVChjaE1vZGUgIT0gTlVMTCk7CgogIC8qIEZvciBkZXRhaWxzIHNlZSBJU08vSUVDIDEzODE4LTc6MjAwNShFKSwgOC41LjMgQ2hhbm5lbCBjb25maWd1cmF0aW9uICovCiAgRkRLbWVtY2xlYXIobnVtQ2hJbkdycCwgUENNX0RNWF9NQVhfQ0hBTk5FTF9HUk9VUFMqc2l6ZW9mKFVDSEFSKSk7CiAgRkRLbWVtc2V0KG9mZnNldFRhYmxlLCAyNTUsIFBDTV9ETVhfTUFYX0NIQU5ORUxTKnNpemVvZihVQ0hBUikpOwogIEZES21lbXNldChjaElkeCwgMjU1LCBQQ01fRE1YX01BWF9DSEFOTkVMX0dST1VQUypQQ01fRE1YX01BWF9DSEFOTkVMU19QRVJfR1JPVVAqc2l6ZW9mKFVDSEFSKSk7CiAgRkRLbWVtc2V0KGhhcmRUb1BsYWNlLCAyNTUsIFBDTV9ETVhfTUFYX0NIQU5ORUxTKnNpemVvZihVQ0hBUikpOwogIEZES21lbXNldChoMnBTb3J0SWR4LCAyNTUsIFBDTV9ETVhfTUFYX0NIQU5ORUxTKnNpemVvZihVQ0hBUikpOwogIC8qIEdldCB0aGUgcmVzdHJpY3Rpb25zIG9mIHRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiAqLwogIEZES21lbWNweShudW1DaEZyZWUsIG1heENoSW5HcnAsIFBDTV9ETVhfTUFYX0NIQU5ORUxfR1JPVVBTKnNpemVvZihVQ0hBUikpOwoKICAqY2hNb2RlID0gQ0hfTU9ERV9VTkRFRklORUQ7CgogIC8qIENhdGVnb3JpemUgY2hhbm5lbHMgKi8KICBmb3IgKGNoID0gMDsgY2ggPCBudW1DaGFubmVsczsgY2ggKz0gMSkgewogICAgVUNIQVIgY2hHcnBJZHggPSBjaGFubmVsSW5kaWNlc1tjaF07CiAgICBpbnQgaSA9IDAsIGo7CgogICAgc3dpdGNoIChjaGFubmVsVHlwZVtjaF0pIHsKICAgIGNhc2UgQUNUX0ZST05UX1RPUDoKICAgICAgY2hHcnBJZHggKz0gbnVtQ2hJbkdycFtDSF9HUk9VUF9GUk9OVF07ICAvKiBBcHBlbmQgYWZ0ZXIgbm9ybWFsIHBsYWluICovCiAgICBjYXNlIEFDVF9GUk9OVDoKICAgICAgZ3JwSWR4ID0gQ0hfR1JPVVBfRlJPTlQ7CiAgICAgIGJyZWFrOwojaWYgKFBDTV9ETVhfTUFYX0NIQU5ORUxfR1JPVVBTID4gMSkKICAgIGNhc2UgQUNUX1NJREVfVE9QOgogICAgICBjaEdycElkeCArPSBudW1DaEluR3JwW0NIX0dST1VQX1NJREVdOyAgIC8qIEFwcGVuZCBhZnRlciBub3JtYWwgcGxhaW4gKi8KICAgIGNhc2UgQUNUX1NJREU6CiAgICAgIGdycElkeCA9IENIX0dST1VQX1NJREU7CiAgICAgIGJyZWFrOwogICAgY2FzZSBBQ1RfQkFDS19UT1A6CiAgICAgIGNoR3JwSWR4ICs9IG51bUNoSW5HcnBbQ0hfR1JPVVBfUkVBUl07ICAgLyogQXBwZW5kIGFmdGVyIG5vcm1hbCBwbGFpbiAqLwogICAgY2FzZSBBQ1RfQkFDSzoKICAgICAgZ3JwSWR4ID0gQ0hfR1JPVVBfUkVBUjsKICAgICAgYnJlYWs7CiAgICBjYXNlIEFDVF9MRkU6CiAgICAgIGdycElkeCA9IENIX0dST1VQX0xGRTsKICAgICAgYnJlYWs7CiNlbmRpZgogICAgZGVmYXVsdDoKICAgICAgLyogRm91bmQgYSBjaGFubmVsIHRoYXQgY2FuIG5vdCBiZSBjYXRlZ29yaXplZCEgTW9zdCBsaWtlbHkgZHVlIHRvIGNvcnJ1cHQgaW5wdXQgc2lnbmFsbGluZy4KICAgICAgICAgVGhlIHJlc2N1ZSBzdHJhdGVneSBpcyB0byBhcHBlbmQgaXQgdG8gdGhlIGZyb250IGNoYW5uZWxzICg9PiBpZ25vcmUgaW5kZXgpLgogICAgICAgICBUaGlzIGNvdWxkIGNhdXNlIHN0cmFuZ2UgYmVoYXZpb3VyIHNvIHJldHVybiBhbiBlcnJvciB0byBzaWduYWwgaXQuICovCiAgICAgIGVyciA9IFBDTURNWF9JTlZBTElEX01PREU7CiAgICAgIGdycElkeCA9IENIX0dST1VQX0ZST05UOwogICAgICBjaEdycElkeCA9IG51bUNoYW5uZWxzICsgbnVtQ2hUb1BsYWNlOwogICAgICBudW1DaFRvUGxhY2UgKz0gMTsKICAgICAgYnJlYWs7CiAgICB9CgogICAgaWYgKG51bUNoSW5HcnBbZ3JwSWR4XSA8IFBDTV9ETVhfTUFYX0NIQU5ORUxTX1BFUl9HUk9VUCkgewogICAgICAvKiBTb3J0IGNoYW5uZWxzIGJ5IGluZGV4ICovCiAgICAgIHdoaWxlICggKGkgPCBudW1DaEluR3JwW2dycElkeF0pICYmIChjaEdycElkeCA+IGNoYW5uZWxJbmRpY2VzW2NoSWR4W2dycElkeF1baV1dKSApIHsKICAgICAgICBpICs9IDE7CiAgICAgIH0KICAgICAgZm9yIChqID0gbnVtQ2hJbkdycFtncnBJZHhdOyBqID4gaTsgaiAtPSAxKSB7CiAgICAgICAgY2hJZHhbZ3JwSWR4XVtqXSA9IGNoSWR4W2dycElkeF1bai0xXTsKICAgICAgfQogICAgICBjaElkeFtncnBJZHhdW2ldID0gY2g7CiAgICAgIG51bUNoSW5HcnBbZ3JwSWR4XSArPSAxOwogICAgfQogIH0KCiNpZiAoUENNX0RNWF9NQVhfQ0hBTk5FTF9HUk9VUFMgPiAxKQogIEZES19BU1NFUlQoIChudW1DaEluR3JwW0NIX0dST1VQX0ZST05UXStudW1DaEluR3JwW0NIX0dST1VQX1NJREVdCiAgICAgICAgICAgICAgK251bUNoSW5HcnBbQ0hfR1JPVVBfUkVBUl0rbnVtQ2hJbkdycFtDSF9HUk9VUF9MRkVdKSA9PSBudW1DaGFubmVscyk7CiNlbHNlCiAgRkRLX0FTU0VSVCggbnVtQ2hJbkdycFtDSF9HUk9VUF9GUk9OVF0gPT0gbnVtQ2hhbm5lbHMgKTsKI2VuZGlmCgogIC8qIENvbXBvc2UgY2hhbm5lbCBvZmZzZXQgdGFibGU6CiAgICogTWFwIGFsbCBjaGFubmVscyB0byB0aGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24uICovCiAgbnVtQ2hUb1BsYWNlID0gMDsKCiAgLyogTm9uLXN5bW1ldHJpYyBjaGFubmVscyAqLwogIGlmIChudW1DaEluR3JwW0NIX0dST1VQX0ZST05UXSAmIDB4MSkgewogICAgLyogT2RkIG51bWJlciBvZiBmcm9udCBjaGFubmVscyAtPiB3ZSBoYXZlIGEgY2VudGVyIGNoYW5uZWwuCiAgICAgICBJbiBNUEVHLTQgdGhlIGNlbnRlciBoYXMgdGhlIGluZGV4IDAuICovCiAgICBvZmZzZXRUYWJsZVtDRU5URVJfRlJPTlRfQ0hBTk5FTF0gPSBjaElkeFtDSF9HUk9VUF9GUk9OVF1bMF07CiAgICBudW1DaEZyZWVbQ0hfR1JPVVBfRlJPTlRdIC09IDE7CiAgfQoKICBmb3IgKGdycElkeCA9IDA7IGdycElkeCA8IFBDTV9ETVhfTUFYX0NIQU5ORUxfR1JPVVBTOyBncnBJZHggKz0gMSkgewogICAgaW50IGNoTWFwUG9zID0gMDsKICAgIGNoID0gMDsgIC8qIEluZGV4IG9mIGNoYW5uZWwgd2l0aGluIHRoZSBzcGVjaWZpYyBncm91cCAqLwoKICAgIHN3aXRjaCAoZ3JwSWR4KSB7CiAgICBjYXNlIENIX0dST1VQX0ZST05UOgogICAgICBjaE1hcFBvcyA9IExFRlRfRlJPTlRfQ0hBTk5FTDsKICAgICAgY2ggPSBudW1DaEluR3JwW2dycElkeF0gJiAweDE7CiAgICAgIGJyZWFrOwojaWYgKFBDTV9ETVhfTUFYX0NIQU5ORUxfR1JPVVBTID4gMSkKICAgIGNhc2UgQ0hfR1JPVVBfU0lERToKICAgICAgYnJlYWs7CiAgICBjYXNlIENIX0dST1VQX1JFQVI6CiAgICAgIGNoTWFwUG9zID0gTEVGVF9SRUFSX0NIQU5ORUw7CiAgICAgIGJyZWFrOwogICAgY2FzZSBDSF9HUk9VUF9MRkU6CiAgICAgIGNoTWFwUG9zID0gTE9XX0ZSRVFVRU5DWV9DSEFOTkVMOwogICAgICBicmVhazsKI2VuZGlmCiAgICBkZWZhdWx0OgogICAgICBGREtfQVNTRVJUKDApOwogICAgICBjb250aW51ZTsKICAgIH0KCiAgICAvKiBNYXAgYWxsIGNoYW5uZWxzIG9mIHRoZSBncm91cCAqLwogICAgZm9yICggOyBjaCA8IG51bUNoSW5HcnBbZ3JwSWR4XTsgY2ggKz0gMSkgewogICAgICBpZiAobnVtQ2hGcmVlW2dycElkeF0gPiAwKSB7CiAgICAgICAgb2Zmc2V0VGFibGVbY2hNYXBQb3NdID0gY2hJZHhbZ3JwSWR4XVtjaF07CiAgICAgICAgY2hNYXBQb3MgKz0gMTsKICAgICAgICBudW1DaEZyZWVbZ3JwSWR4XSAtPSAxOwogICAgICB9IGVsc2UgewogICAgICAgIC8qIEFkZCB0byB0aGUgbGlzdCBvZiBoYXJkc2hpcCBjYXNlcyBjb25zaWRlcmluZyBhIE1QRUctbGlrZSBzb3J0aW5nIG9yZGVyOiAqLwogICAgICAgIGludCBwb3MsIHNvcnRJZHggPSBncnBJZHgqUENNX0RNWF9NQVhfQ0hBTk5FTFNfUEVSX0dST1VQICsgY2hhbm5lbEluZGljZXNbY2hJZHhbZ3JwSWR4XVtjaF1dOwogICAgICAgIGZvciAocG9zID0gbnVtQ2hUb1BsYWNlOyBwb3MgPiAwOyBwb3MgLT0gMSkgewogICAgICAgICAgaWYgKGgycFNvcnRJZHhbcG9zLTFdID4gc29ydElkeCkgewogICAgICAgICAgICBoYXJkVG9QbGFjZVtwb3NdID0gaGFyZFRvUGxhY2VbcG9zLTFdOwogICAgICAgICAgICBoMnBTb3J0SWR4W3Bvc10gPSBoMnBTb3J0SWR4W3Bvcy0xXTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8qIEluc2VydCBjaGFubmVsIGF0IHRoZSBjdXJyZW50IGluZGV4L3Bvc2l0aW9uICovCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBoYXJkVG9QbGFjZVtwb3NdID0gY2hJZHhbZ3JwSWR4XVtjaF07CiAgICAgICAgaDJwU29ydElkeFtwb3NdID0gc29ydElkeDsKICAgICAgICBudW1DaFRvUGxhY2UgKz0gMTsKICAgICAgfQogICAgfQogIH0KCiAgeyAvKiBBc3NpZ24gdGhlIGhhcmRzaGlwIGNhc2VzICovCiAgICBpbnQgY2hNYXBQb3MgPSAwOwogICAgaW50IG1hcHBpbmdIZWF0ID0gMDsKICAgIGZvciAoY2ggPSAwOyBjaCA8IG51bUNoVG9QbGFjZTsgY2grPTEpIHsKICAgICAgaW50IGNoQXNzaWduZWQgPSAwOwoKICAgICAgLyogSnVzdCBhc3NpZ25pbmcgdGhlIGNoYW5uZWxzIHRvIHRoZSBuZXh0IGJlc3Qgc2xvdCBjYW4gbGVhZCB0byB1bmRlc2lyZWQgcmVzdWx0cyAoZXNwZWNpYWxseSBmb3IgeC94LzEueAogICAgICAgICBjb25maWd1cmF0aW9ucykuIFRodXMgdXNlIHRoZSBNUEVHLWxpa2Ugc29ydGluZyBpbmRleCB0byBmaW5kIHRoZSBiZXN0IGZpdHRpbmcgc2xvdCBmb3IgZWFjaCBjaGFubmVsLgogICAgICAgICBJZiB0aGlzIGlzIG5vdCBwb3NzaWJsZSB0aGUgc29ydGluZyBpbmRleCB3aWxsIGJlIGlnbm9yZWQgKG1hcHBpbmdIZWF0ID49IDIpLiAqLwogICAgICBmb3IgKCA7IGNoTWFwUG9zIDwgUENNX0RNWF9NQVhfQ0hBTk5FTFM7IGNoTWFwUG9zKz0xKSB7CiAgICAgICAgaWYgKG9mZnNldFRhYmxlW2NoTWFwUG9zXSA9PSAyNTUpIHsKICAgICAgICAgIGludCBwcnZTb3J0SWR4ID0gMDsKICAgICAgICAgIGludCBueHRTb3J0SWR4ID0gKENIX0dST1VQX0xGRSsxKSpQQ01fRE1YX01BWF9DSEFOTkVMU19QRVJfR1JPVVA7CgogICAgICAgICAgaWYgKG1hcHBpbmdIZWF0IDwgMikgewogICAgICAgICAgICBpZiAoY2hNYXBQb3MgPCBMRUZUX1JFQVJfQ0hBTk5FTCkgewogICAgICAgICAgICAgIC8qIEdvdCBmcm9udCBjaGFubmVsIHNsb3QgKi8KICAgICAgICAgICAgICBwcnZTb3J0SWR4ID0gQ0hfR1JPVVBfRlJPTlQqUENNX0RNWF9NQVhfQ0hBTk5FTFNfUEVSX0dST1VQICsgY2hNYXBQb3MgLSBDRU5URVJfRlJPTlRfQ0hBTk5FTDsKICAgICAgICAgICAgICBueHRTb3J0SWR4ID0gQ0hfR1JPVVBfU0lERSAqUENNX0RNWF9NQVhfQ0hBTk5FTFNfUEVSX0dST1VQOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGNoTWFwUG9zIDwgTE9XX0ZSRVFVRU5DWV9DSEFOTkVMKSB7CiAgICAgICAgICAgICAgLyogR290IGJhY2sgY2hhbm5lbCBzbG90ICovCiAgICAgICAgICAgICAgcHJ2U29ydElkeCA9IENIX0dST1VQX1JFQVIqUENNX0RNWF9NQVhfQ0hBTk5FTFNfUEVSX0dST1VQICsgY2hNYXBQb3MgLSBMRUZUX1JFQVJfQ0hBTk5FTDsKICAgICAgICAgICAgICBueHRTb3J0SWR4ID0gQ0hfR1JPVVBfTEZFICpQQ01fRE1YX01BWF9DSEFOTkVMU19QRVJfR1JPVVA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoY2hNYXBQb3MgPCBMRUZUX01VTFRJUFJQU19DSEFOTkVMKSB7CiAgICAgICAgICAgICAgLyogR290IGxmZSBjaGFubmVsIHNsb3QgKi8KICAgICAgICAgICAgICBwcnZTb3J0SWR4ID0gIENIX0dST1VQX0xGRSAgICpQQ01fRE1YX01BWF9DSEFOTkVMU19QRVJfR1JPVVAgKyBjaE1hcFBvcyAtIExPV19GUkVRVUVOQ1lfQ0hBTk5FTDsKICAgICAgICAgICAgICBueHRTb3J0SWR4ID0gKENIX0dST1VQX0xGRSsxKSpQQ01fRE1YX01BWF9DSEFOTkVMU19QRVJfR1JPVVA7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KCiAgICAgICAgICAvKiBBc3NpZ24gdGhlIGNoYW5uZWwgb25seSBpZiBpdHMgc29ydCBpbmRleCBpcyB3aXRoaW4gdGhlIHJhbmdlICovCiAgICAgICAgICBpZiAoIChoMnBTb3J0SWR4W2NoXSA+PSBwcnZTb3J0SWR4KQogICAgICAgICAgICAmJiAoaDJwU29ydElkeFtjaF0gPCAgbnh0U29ydElkeCkgKSB7CiAgICAgICAgICAgIG9mZnNldFRhYmxlW2NoTWFwUG9zKytdID0gaGFyZFRvUGxhY2VbY2hdOwogICAgICAgICAgICBjaEFzc2lnbmVkID0gMTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChjaEFzc2lnbmVkID09IDApIHsKICAgICAgICBjaE1hcFBvcyA9IDA7CiAgICAgICAgY2ggLT0gMTsKICAgICAgICBtYXBwaW5nSGVhdCArPSAxOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICB9CiAgfQoKICAvKiBDb21wb3NlIHRoZSBjaGFubmVsIG1vZGUgKi8KICAqY2hNb2RlID0gKFBDTV9ETVhfQ0hBTk5FTF9NT0RFKSggKG51bUNoSW5HcnBbQ0hfR1JPVVBfRlJPTlRdICYgMHhGKQojaWYgKFBDTV9ETVhfTUFYX0NIQU5ORUxfR1JPVVBTID4gMSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKG51bUNoSW5HcnBbQ0hfR1JPVVBfU0lERV0gICYgMHhGKSA8PCAgNAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAobnVtQ2hJbkdycFtDSF9HUk9VUF9SRUFSXSAgJiAweEYpIDw8ICA4CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IChudW1DaEluR3JwW0NIX0dST1VQX0xGRV0gICAmIDB4RikgPDwgMTIKI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwoKICByZXR1cm4gZXJyOwp9CgoKLyoqIEdlbmVyYXRlIGEgY2hhbm5lbCBvZmZzZXQgdGFibGUgYW5kIGNvbXBsZXRlIGNoYW5uZWwgZGVzY3JpcHRpb24gZm9yIGEgZ2l2ZW4gKHBhY2tlZCkgY2hhbm5lbCBtb2RlLgogKiAgVGhpcyBmdW5jdGlvbiBpcyB0aGUgaW52ZXJzZSB0byB0aGUgZ2V0Q2hhbm5lbE1vZGUoKSByb3V0aW5lIGJ1dCBkb2VzIG5vdCBzdXBwb3J0IHdlaXJkIGNoYW5uZWwKICogIGNvbmZpZ3VyYXRpb25zLiBBbGwgY2hhbm5lbHMgaGF2ZSB0byBiZSBpbiB0aGUgbm9ybWFsIGhlaWdodCBsYXllciBhbmQgdGhlcmUgbXVzdCBub3QgYmUgbW9yZQogKiAgY2hhbm5lbHMgaW4gZWFjaCBncm91cCB0aGFuIGdpdmVuIGJ5IG1heENoSW5HcnAuCiAqIEBwYXJhbSBbaW5dIFRoZSBwYWNrZWQgY2hhbm5lbCBtb2RlIG9mIHRoZSBjb25maWd1cmF0aW9uIHRvIGJlIHByb2Nlc3NlZC4KICogQHBhcmFtIFtpbl0gQXJyYXkgY29udGFpbmluZyB0aGUgY2hhbm5lbCBtYXBwaW5nIHRvIGJlIHVzZWQgKEZyb20gTVBFRyBQQ0Ugb3JkZXJpbmcgdG8gd2hhdGV2ZXIgaXMgcmVxdWlyZWQpLgogKiBAcGFyYW0gW291dF0gQXJyYXkgd2hlcmUgY29ycmVzcG9uZGluZyBjaGFubmVsIHR5cGVzIGZvciBlYWNoIGNoYW5uZWxzIGFyZSBzdG9yZWQgaW50by4KICogQHBhcmFtIFtvdXRdIEFycmF5IHdoZXJlIGNvcnJlc3BvbmRpbmcgY2hhbm5lbCB0eXBlIGluZGljZXMgZm9yIGVhY2ggb3V0cHV0IGNoYW5uZWwgYXJlIHN0b3JlZCBpbnRvLgogKiBAcGFyYW0gW291dF0gQXJyYXkgd2hlcmUgdGhlIGJ1ZmZlciBvZmZzZXRzIGZvciBlYWNoIGNoYW5uZWwgYXJlIHN0b3JlZCBpbnRvLgogKiBAcmV0dXJucyBOb25lLgogKiovCnN0YXRpYwp2b2lkIGdldENoYW5uZWxEZXNjcmlwdGlvbiAoCiAgICAgICAgY29uc3QgUENNX0RNWF9DSEFOTkVMX01PREUgIGNoTW9kZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbiAqLwogICAgICAgIGNvbnN0IFVDSEFSICAgICAgICAgICAgICAgICBjaGFubmVsTWFwcGluZ1tdWzhdLCAgICAgICAgICAgICAgICAgICAgLyogaW4gKi8KICAgICAgICBBVURJT19DSEFOTkVMX1RZUEUgICAgICAgICAgY2hhbm5lbFR5cGVbXSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG91dCAqLwogICAgICAgIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsSW5kaWNlc1tdLCAgICAgICAgICAgICAgICAgICAgICAgLyogb3V0ICovCiAgICAgICAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldFRhYmxlW1BDTV9ETVhfTUFYX0NIQU5ORUxTXSAgICAgICAvKiBvdXQgKi8KICAgICAgKQp7CiAgY29uc3QgVUNIQVIgKnBDaGFubmVsTWFwOwogIGludCAgIGdycElkeCwgY2ggPSAwLCBudW1DaGFubmVscyA9IDA7CiAgVUNIQVIgbnVtQ2hJbkdycFtQQ01fRE1YX01BWF9DSEFOTkVMX0dST1VQU107CgogIEZES19BU1NFUlQoY2hhbm5lbFR5cGUgIT0gTlVMTCk7CiAgRkRLX0FTU0VSVChjaGFubmVsSW5kaWNlcyAhPSBOVUxMKTsKICBGREtfQVNTRVJUKGNoYW5uZWxNYXBwaW5nICE9IE5VTEwpOwogIEZES19BU1NFUlQob2Zmc2V0VGFibGUgIT0gTlVMTCk7CgogIC8qIEluaXQgb3V0cHV0IGFycmF5cyAqLwogIEZES21lbWNsZWFyKGNoYW5uZWxUeXBlLCAgICBQQ01fRE1YX01BWF9JT19DSEFOTkVMUypzaXplb2YoQVVESU9fQ0hBTk5FTF9UWVBFKSk7CiAgRkRLbWVtY2xlYXIoY2hhbm5lbEluZGljZXMsIFBDTV9ETVhfTUFYX0lPX0NIQU5ORUxTKnNpemVvZihVQ0hBUikpOwogIEZES21lbXNldChvZmZzZXRUYWJsZSwgMjU1LCBQQ01fRE1YX01BWF9DSEFOTkVMUypzaXplb2YoVUNIQVIpKTsKCiAgLyogRXh0cmFjdCB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzIHBlciBncm91cCAqLwogIG51bUNoSW5HcnBbQ0hfR1JPVVBfRlJPTlRdID0gIGNoTW9kZSAgICAgICAgJiAweEY7CiNpZiAoUENNX0RNWF9NQVhfQ0hBTk5FTF9HUk9VUFMgPiAxKQogIG51bUNoSW5HcnBbQ0hfR1JPVVBfU0lERV0gID0gKGNoTW9kZSA+PiAgNCkgJiAweEY7CiAgbnVtQ2hJbkdycFtDSF9HUk9VUF9SRUFSXSAgPSAoY2hNb2RlID4+ICA4KSAmIDB4RjsKICBudW1DaEluR3JwW0NIX0dST1VQX0xGRV0gICA9IChjaE1vZGUgPj4gMTIpICYgMHhGOwojZW5kaWYKCiAgLyogU3VtbWVyaXplIHRvIGdldCB0aGUgdG90YWwgbnVtYmVyIG9mIGNoYW5uZWxzICovCiAgZm9yIChncnBJZHggPSAwOyBncnBJZHggPCBQQ01fRE1YX01BWF9DSEFOTkVMX0dST1VQUzsgZ3JwSWR4ICs9IDEpIHsKICAgIG51bUNoYW5uZWxzICs9IG51bUNoSW5HcnBbZ3JwSWR4XTsKICB9CgogIC8qIEdldCB0aGUgYXBwcm9wcmlhdGUgY2hhbm5lbCBtYXAgKi8KICBzd2l0Y2ggKGNoTW9kZSkgewogIGNhc2UgQ0hfTU9ERV8xXzBfMF8wOgogIGNhc2UgQ0hfTU9ERV8yXzBfMF8wOgogIGNhc2UgQ0hfTU9ERV8zXzBfMF8wOgogIGNhc2UgQ0hfTU9ERV8zXzBfMV8wOgogIGNhc2UgQ0hfTU9ERV8zXzBfMl8wOgogIGNhc2UgQ0hfTU9ERV8zXzBfMl8xOgogICAgcENoYW5uZWxNYXAgPSBjaGFubmVsTWFwcGluZ1tudW1DaGFubmVsc107CiAgICBicmVhazsKICBjYXNlIENIX01PREVfM18wXzNfMToKICAgIHBDaGFubmVsTWFwID0gY2hhbm5lbE1hcHBpbmdbMTFdOwogICAgYnJlYWs7CiAgY2FzZSBDSF9NT0RFXzNfMF80XzE6CiAgICBwQ2hhbm5lbE1hcCA9IGNoYW5uZWxNYXBwaW5nWzEyXTsKICAgIGJyZWFrOwogIGNhc2UgQ0hfTU9ERV81XzBfMl8xOgogICAgcENoYW5uZWxNYXAgPSBjaGFubmVsTWFwcGluZ1s3XTsKICAgIGJyZWFrOwogIGRlZmF1bHQ6CiAgICAvKiBmYWxsYmFjayAqLwogICAgcENoYW5uZWxNYXAgPSBjaGFubmVsTWFwcGluZ1swXTsKICAgIGJyZWFrOwogIH0KCiAgLyogQ29tcG9zZSBjaGFubmVsIG9mZnNldCB0YWJsZSAqLwoKICAvKiBOb24tc3ltbWV0cmljIGNoYW5uZWxzICovCiAgaWYgKG51bUNoSW5HcnBbQ0hfR1JPVVBfRlJPTlRdICYgMHgxKSB7CiAgICAvKiBPZGQgbnVtYmVyIG9mIGZyb250IGNoYW5uZWxzIC0+IHdlIGhhdmUgYSBjZW50ZXIgY2hhbm5lbC4KICAgICAgIEluIE1QRUctNCB0aGUgY2VudGVyIGhhcyB0aGUgaW5kZXggMC4gKi8KICAgIGludCBtYXBwZWRJZHggPSBwQ2hhbm5lbE1hcFtjaF07CiAgICBvZmZzZXRUYWJsZVtDRU5URVJfRlJPTlRfQ0hBTk5FTF0gPSBtYXBwZWRJZHg7CiAgICBjaGFubmVsVHlwZVttYXBwZWRJZHhdICAgID0gQUNUX0ZST05UOwogICAgY2hhbm5lbEluZGljZXNbbWFwcGVkSWR4XSA9IDA7CiAgICBjaCArPSAxOwogIH0KCiAgZm9yIChncnBJZHggPSAwOyBncnBJZHggPCBQQ01fRE1YX01BWF9DSEFOTkVMX0dST1VQUzsgZ3JwSWR4ICs9IDEpIHsKICAgIEFVRElPX0NIQU5ORUxfVFlQRSB0eXBlID0gQUNUX05PTkU7CiAgICBpbnQgY2hNYXBQb3MgPSAwLCBtYXhDaGFubmVscyA9IDA7CiAgICBpbnQgY2hJZHggPSAwOyAgLyogSW5kZXggb2YgY2hhbm5lbCB3aXRoaW4gdGhlIHNwZWNpZmljIGdyb3VwICovCgogICAgc3dpdGNoIChncnBJZHgpIHsKICAgIGNhc2UgQ0hfR1JPVVBfRlJPTlQ6CiAgICAgIHR5cGUgPSBBQ1RfRlJPTlQ7CiAgICAgIGNoTWFwUG9zID0gTEVGVF9GUk9OVF9DSEFOTkVMOwogICAgICBtYXhDaGFubmVscyA9IDM7CiAgICAgIGNoSWR4ID0gbnVtQ2hJbkdycFtncnBJZHhdICYgMHgxOwogICAgICBicmVhazsKI2lmIChQQ01fRE1YX01BWF9DSEFOTkVMX0dST1VQUyA+IDEpCiAgICBjYXNlIENIX0dST1VQX1NJREU6CiAgICAgIC8qIEFsd2F5cyBtYXAgc2lkZSBjaGFubmVscyB0byB0aGUgbXVsdGlwdXJwb3NlIGdyb3VwLiAqLwogICAgICB0eXBlID0gQUNUX1NJREU7CiAgICAgIGNoTWFwUG9zID0gTEVGVF9NVUxUSVBSUFNfQ0hBTk5FTDsKICAgICAgYnJlYWs7CiAgICBjYXNlIENIX0dST1VQX1JFQVI6CiAgICAgIHR5cGUgPSBBQ1RfQkFDSzsKICAgICAgY2hNYXBQb3MgPSBMRUZUX1JFQVJfQ0hBTk5FTDsKICAgICAgbWF4Q2hhbm5lbHMgPSAyOwogICAgICBicmVhazsKICAgIGNhc2UgQ0hfR1JPVVBfTEZFOgogICAgICB0eXBlID0gQUNUX0xGRTsKICAgICAgY2hNYXBQb3MgPSBMT1dfRlJFUVVFTkNZX0NIQU5ORUw7CiAgICAgIG1heENoYW5uZWxzID0gMTsKICAgICAgYnJlYWs7CiNlbmRpZgogICAgZGVmYXVsdDoKICAgICAgYnJlYWs7CiAgICB9CgogICAgLyogTWFwIGFsbCBjaGFubmVscyBpbiB0aGlzIGdyb3VwICovCiAgICBmb3IgKCA7IGNoSWR4IDwgbnVtQ2hJbkdycFtncnBJZHhdOyBjaElkeCArPSAxKSB7CiAgICAgIGludCBtYXBwZWRJZHggPSBwQ2hhbm5lbE1hcFtjaF07CiAgICAgIGlmIChjaElkeCA9PSBtYXhDaGFubmVscykgewogICAgICAgIC8qIE5vIHNwYWNlIGxlZnQgaW4gdGhpcyBjaGFubmVsIGdyb3VwIQogICAgICAgICAgIFVzZSB0aGUgbXVsdGlwdXJwb3NlIGdyb3VwIGluc3RlYWQ6ICovCiAgICAgICAgY2hNYXBQb3MgPSBMRUZUX01VTFRJUFJQU19DSEFOTkVMOwogICAgICB9CiAgICAgIG9mZnNldFRhYmxlW2NoTWFwUG9zXSAgICAgPSBtYXBwZWRJZHg7CiAgICAgIGNoYW5uZWxUeXBlW21hcHBlZElkeF0gICAgPSB0eXBlOwogICAgICBjaGFubmVsSW5kaWNlc1ttYXBwZWRJZHhdID0gY2hJZHg7CiAgICAgIGNoTWFwUG9zICs9IDE7CiAgICAgIGNoICs9IDE7CiAgICB9CiAgfQp9CgovKiogUHJpdmF0ZSBoZWxwZXIgZnVuY3Rpb24gZm9yIGRvd25taXggbWF0cml4IG1hbmlwdWxhdGlvbiB0aGF0IGluaXRpYWxpemVzCiAqICBvbmUgcm93IGluIGEgZ2l2ZW4gZG93bm1peCBtYXRyaXggKGNvcnJlc3BvbmRpbmcgdG8gb25lIG91dHB1dCBjaGFubmVsKS4KICogQHBhcmFtIFtpbm91dF0gUG9pbnRlciB0byBmaXhlZC1wb2ludCBwYXJ0cyBvZiB0aGUgZG93bm1peCBtYXRyaXguCiAqIEBwYXJhbSBbaW5vdXRdIFBvaW50ZXIgdG8gc2NhbGUgZmFjdG9yIG1hdHJpeCBhc3NvY2lhdGVkIHRvIHRoZSBkb3dubWl4IGZhY3RvcnMuCiAqIEBwYXJhbSBbaW5dICAgIEluZGV4IG9mIGNoYW5uZWwgKHJvdykgdG8gYmUgaW5pdGlhbGl6ZWQuCiAqIEByZXR1cm5zICAgICAgIE5vdGhpbmcgdG8gcmV0dXJuLgogKiovCnN0YXRpYwp2b2lkIGRteEluaXRDaGFubmVsKAogICAgICAgIEZJWFBfRE1YICAgICAgICAgICAgbWl4RmFjdG9yc1tQQ01fRE1YX01BWF9DSEFOTkVMU11bUENNX0RNWF9NQVhfQ0hBTk5FTFNdLAogICAgICAgIElOVCAgICAgICAgICAgICAgICAgbWl4U2NhbGVzW1BDTV9ETVhfTUFYX0NIQU5ORUxTXVtQQ01fRE1YX01BWF9DSEFOTkVMU10sCiAgICAgICAgY29uc3QgdW5zaWduZWQgaW50ICBvdXRDaAogICAgICAgKQp7CiAgdW5zaWduZWQgaW50IGluQ2g7CiAgZm9yIChpbkNoPTA7IGluQ2ggPCBQQ01fRE1YX01BWF9DSEFOTkVMUzsgaW5DaCs9MSkgewogICAgaWYgKGluQ2ggPT0gb3V0Q2gpIHsKICAgICAgbWl4RmFjdG9yc1tvdXRDaF1baW5DaF0gPSBGTDJGWENPTlNUX0RNWCgwLjVmKTsKICAgICAgbWl4U2NhbGVzW291dENoXVtpbkNoXSAgPSAxOwogICAgfSBlbHNlIHsKICAgICAgbWl4RmFjdG9yc1tvdXRDaF1baW5DaF0gPSBGTDJGWENPTlNUX0RNWCgwLjBmKTsKICAgICAgbWl4U2NhbGVzW291dENoXVtpbkNoXSAgPSAwOwogICAgfQogIH0KfQoKLyoqIFByaXZhdGUgaGVscGVyIGZ1bmN0aW9uIGZvciBkb3dubWl4IG1hdHJpeCBtYW5pcHVsYXRpb24gdGhhdCBkb2VzIGEgcmVzZXQKICogIG9mIG9uZSByb3cgaW4gYSBnaXZlbiBkb3dubWl4IG1hdHJpeCAoY29ycmVzcG9uZGluZyB0byBvbmUgb3V0cHV0IGNoYW5uZWwpLgogKiBAcGFyYW0gW2lub3V0XSBQb2ludGVyIHRvIGZpeGVkLXBvaW50IHBhcnRzIG9mIHRoZSBkb3dubWl4IG1hdHJpeC4KICogQHBhcmFtIFtpbm91dF0gUG9pbnRlciB0byBzY2FsZSBmYWN0b3IgbWF0cml4IGFzc29jaWF0ZWQgdG8gdGhlIGRvd25taXggZmFjdG9ycy4KICogQHBhcmFtIFtpbl0gICAgSW5kZXggb2YgY2hhbm5lbCAocm93KSB0byBiZSBjbGVhcmVkL3Jlc2V0LgogKiBAcmV0dXJucyAgICAgICBOb3RoaW5nIHRvIHJldHVybi4KICoqLwpzdGF0aWMKdm9pZCBkbXhDbGVhckNoYW5uZWwoCiAgICAgICAgRklYUF9ETVggICAgICAgICAgICBtaXhGYWN0b3JzW1BDTV9ETVhfTUFYX0NIQU5ORUxTXVtQQ01fRE1YX01BWF9DSEFOTkVMU10sCiAgICAgICAgSU5UICAgICAgICAgICAgICAgICBtaXhTY2FsZXNbUENNX0RNWF9NQVhfQ0hBTk5FTFNdW1BDTV9ETVhfTUFYX0NIQU5ORUxTXSwKICAgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgIG91dENoCiAgICAgICApCnsKICBGREttZW1jbGVhcigmbWl4RmFjdG9yc1tvdXRDaF0sIFBDTV9ETVhfTUFYX0NIQU5ORUxTKnNpemVvZihGSVhQX0RNWCkpOwogIEZES21lbWNsZWFyKCZtaXhTY2FsZXNbb3V0Q2hdLCAgUENNX0RNWF9NQVhfQ0hBTk5FTFMqc2l6ZW9mKElOVCkpOwp9CgovKiogUHJpdmF0ZSBoZWxwZXIgZnVuY3Rpb24gZm9yIGRvd25taXggbWF0cml4IG1hbmlwdWxhdGlvbiB0aGF0IGFwcGxpZXMgYSBzb3VyY2UgY2hhbm5lbCAocm93KQogKiAgc2NhbGVkIGJ5IGEgZ2l2ZW4gbWl4IGZhY3RvciB0byBhIGRlc3RpbmF0aW9uIGNoYW5uZWwgKHJvdykgaW4gYSBnaXZlbiBkb3dubWl4IG1hdHJpeC4KICogIEV4aXN0aW5nIG1peCBmYWN0b3JzIG9mIHRoZSBkZXN0aW5hdGlvbiBjaGFubmVsIChyb3cpIHdpbGwgZ2V0IG92ZXJ3cml0dGVuLgogKiBAcGFyYW0gW2lub3V0XSBQb2ludGVyIHRvIGZpeGVkLXBvaW50IHBhcnRzIG9mIHRoZSBkb3dubWl4IG1hdHJpeC4KICogQHBhcmFtIFtpbm91dF0gUG9pbnRlciB0byBzY2FsZSBmYWN0b3IgbWF0cml4IGFzc29jaWF0ZWQgdG8gdGhlIGRvd25taXggZmFjdG9ycy4KICogQHBhcmFtIFtpbl0gICAgSW5kZXggb2Ygc291cmNlIGNoYW5uZWwgKHJvdykuCiAqIEBwYXJhbSBbaW5dICAgIEluZGV4IG9mIGRlc3RpbmF0aW9uIGNoYW5uZWwgKHJvdykuCiAqIEBwYXJhbSBbaW5dICAgIEZpeGVkLXBvaW50IHBhcnQgb2YgbWl4IGZhY3RvciB0byBiZSBhcHBsaWVkLgogKiBAcGFyYW0gW2luXSAgICBTY2FsZSBmYWN0b3Igb2YgbWl4IGZhY3RvciB0byBiZSBhcHBsaWVkLgogKiBAcmV0dXJucyAgICAgICBOb3RoaW5nIHRvIHJldHVybi4KICoqLwpzdGF0aWMKdm9pZCBkbXhTZXRDaGFubmVsKAogICAgICAgIEZJWFBfRE1YICAgICAgICAgICAgbWl4RmFjdG9yc1tQQ01fRE1YX01BWF9DSEFOTkVMU11bUENNX0RNWF9NQVhfQ0hBTk5FTFNdLAogICAgICAgIElOVCAgICAgICAgICAgICAgICAgbWl4U2NhbGVzW1BDTV9ETVhfTUFYX0NIQU5ORUxTXVtQQ01fRE1YX01BWF9DSEFOTkVMU10sCiAgICAgICAgY29uc3QgdW5zaWduZWQgaW50ICBkc3RDaCwKICAgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgIHNyY0NoLAogICAgICAgIGNvbnN0IEZJWFBfRE1YICAgICAgZmFjdG9yLAogICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgc2NhbGUKICAgICAgICkKewogIGludCBjaDsKICBmb3IgKGNoPTA7IGNoIDwgUENNX0RNWF9NQVhfQ0hBTk5FTFM7IGNoKz0xKSB7CiAgICBpZiAobWl4RmFjdG9yc1tzcmNDaF1bY2hdICE9IChGSVhQX0RNWCkwKSB7CiAgICAgIG1peEZhY3RvcnNbZHN0Q2hdW2NoXSA9IEZYX0RCTDJGWF9ETVgoZk11bHQobWl4RmFjdG9yc1tzcmNDaF1bY2hdLCBmYWN0b3IpKTsKICAgICAgbWl4U2NhbGVzW2RzdENoXVtjaF0gID0gbWl4U2NhbGVzW3NyY0NoXVtjaF0gKyBzY2FsZTsKICAgIH0KICB9Cn0KCi8qKiBQcml2YXRlIGhlbHBlciBmdW5jdGlvbiBmb3IgZG93bm1peCBtYXRyaXggbWFuaXB1bGF0aW9uIHRoYXQgYWRkcyBhIHNvdXJjZSBjaGFubmVsIChyb3cpCiAqICBzY2FsZWQgYnkgYSBnaXZlbiBtaXggZmFjdG9yIHRvIGEgZGVzdGluYXRpb24gY2hhbm5lbCAocm93KSBpbiBhIGdpdmVuIGRvd25taXggbWF0cml4LgogKiBAcGFyYW0gW2lub3V0XSBQb2ludGVyIHRvIGZpeGVkLXBvaW50IHBhcnRzIG9mIHRoZSBkb3dubWl4IG1hdHJpeC4KICogQHBhcmFtIFtpbm91dF0gUG9pbnRlciB0byBzY2FsZSBmYWN0b3IgbWF0cml4IGFzc29jaWF0ZWQgdG8gdGhlIGRvd25taXggZmFjdG9ycy4KICogQHBhcmFtIFtpbl0gICAgSW5kZXggb2Ygc291cmNlIGNoYW5uZWwgKHJvdykuCiAqIEBwYXJhbSBbaW5dICAgIEluZGV4IG9mIGRlc3RpbmF0aW9uIGNoYW5uZWwgKHJvdykuCiAqIEBwYXJhbSBbaW5dICAgIEZpeGVkLXBvaW50IHBhcnQgb2YgbWl4IGZhY3RvciB0byBiZSBhcHBsaWVkLgogKiBAcGFyYW0gW2luXSAgICBTY2FsZSBmYWN0b3Igb2YgbWl4IGZhY3RvciB0byBiZSBhcHBsaWVkLgogKiBAcmV0dXJucyAgICAgICBOb3RoaW5nIHRvIHJldHVybi4KICoqLwpzdGF0aWMKdm9pZCBkbXhBZGRDaGFubmVsKAogICAgICAgIEZJWFBfRE1YICAgICAgICAgICAgbWl4RmFjdG9yc1tQQ01fRE1YX01BWF9DSEFOTkVMU11bUENNX0RNWF9NQVhfQ0hBTk5FTFNdLAogICAgICAgIElOVCAgICAgICAgICAgICAgICAgbWl4U2NhbGVzW1BDTV9ETVhfTUFYX0NIQU5ORUxTXVtQQ01fRE1YX01BWF9DSEFOTkVMU10sCiAgICAgICAgY29uc3QgdW5zaWduZWQgaW50ICBkc3RDaCwKICAgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgIHNyY0NoLAogICAgICAgIGNvbnN0IEZJWFBfRE1YICAgICAgZmFjdG9yLAogICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgc2NhbGUKICAgICAgICkKewogIGludCBjaDsKICBmb3IgKGNoPTA7IGNoIDwgUENNX0RNWF9NQVhfQ0hBTk5FTFM7IGNoKz0xKSB7CiAgICBGSVhQX0RCTCBhZGRGYWN0ID0gZk11bHQobWl4RmFjdG9yc1tzcmNDaF1bY2hdLCBmYWN0b3IpOwogICAgaWYgKGFkZEZhY3QgIT0gKEZJWFBfRE1YKTApIHsKICAgICAgSU5UIG5ld1NjYWxlID0gbWl4U2NhbGVzW3NyY0NoXVtjaF0gKyBzY2FsZTsKICAgICAgaWYgKG1peEZhY3RvcnNbZHN0Q2hdW2NoXSAhPSAoRklYUF9ETVgpMCkgewogICAgICAgIGlmIChuZXdTY2FsZSA+IG1peFNjYWxlc1tkc3RDaF1bY2hdKSB7CiAgICAgICAgICBtaXhGYWN0b3JzW2RzdENoXVtjaF0gPj49IG5ld1NjYWxlIC0gbWl4U2NhbGVzW2RzdENoXVtjaF07CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGFkZEZhY3QgPj49IG1peFNjYWxlc1tkc3RDaF1bY2hdIC0gbmV3U2NhbGU7CiAgICAgICAgICBuZXdTY2FsZSAgPSBtaXhTY2FsZXNbZHN0Q2hdW2NoXTsKICAgICAgICB9CiAgICAgIH0KICAgICAgbWl4RmFjdG9yc1tkc3RDaF1bY2hdICs9IEZYX0RCTDJGWF9ETVgoYWRkRmFjdCk7CiAgICAgIG1peFNjYWxlc1tkc3RDaF1bY2hdICAgPSBuZXdTY2FsZTsKICAgIH0KICB9Cn0KCgovKiogUHJpdmF0ZSBmdW5jdGlvbiB0aGF0IGNyZWF0ZXMgYSBkb3dubWl4IGZhY3RvciBtYXRyaXggZGVwZW5kaW5nIG9uIHRoZSBpbnB1dCBhbmQgb3V0cHV0CiAqICBjb25maWd1cmF0aW9uLCB0aGUgdXNlciBwYXJhbWV0ZXJzIGFzIHdlbGwgYXMgdGhlIGdpdmVuIG1ldGFkYXRhLiBUaGlzIGZ1bmN0aW9uIGlzIHRoZSBtb2R1bGVzCiAqICBicmFpbiBhbmQgaG9sZCBhbGwgZG93bm1peCBhbGdvcml0aG1zLgogKiBAcGFyYW0gW2luXSAgRmxhZyB0aGF0IGluZGljYXRlcyBpZiBpbkNoTW9kZSBob2xkcyBhIHJlYWwgKHBhY2tlZCkgY2hhbm5lbCBtb2RlIG9yIGhhcyBiZWVuCiAgICAgICAgICAgICAgICBjb252ZXJ0ZWQgdG8gYSBNUEVHLTQgY2hhbm5lbCBjb25maWd1cmF0aW9uIGluZGV4LgogKiBAcGFyYW0gW2luXSAgRGVwZW5kZW50IG9uIHRoZSBpbk1vZGVJc0NmZyBmbGFnIHRoaXMgZmllbGQgaGFuZHMgaW4gYSAocGFja2VkKSBjaGFubmVsIG1vZGUgb3IKICAgICAgICAgICAgICAgIHRoZSBjb3JyZXNwb25kaW5nIE1QRUctNCBjaGFubmVsIGNvbmZpZ3VyYXRpb24gaW5kZXgub2YgdGhlIGlucHV0IGNvbmZpZ3VyYXRpb24uCiAqIEBwYXJhbSBbaW5dICBUaGUgKHBhY2tlZCkgY2hhbm5lbCBtb2RlIG9mIHRoZSBvdXRwdXQgY29uZmlndXJhdGlvbi4KICogQHBhcmFtIFtpbl0gIFBvaW50ZXIgdG8gc3RydWN0dXJlIGhvbGRpbmcgYWxsIGN1cnJlbnQgdXNlciBwYXJhbWV0ZXIuCiAqIEBwYXJhbSBbaW5dICBQb2ludGVyIHRvIGZpZWxkIGhvbGRpbmcgYWxsIGN1cnJlbnQgbWV0YSBkYXRhLgogKiBAcGFyYW0gW291dF0gUG9pbnRlciB0byBmaXhlZC1wb2ludCBwYXJ0cyBvZiB0aGUgZG93bm1peCBtYXRyaXguIE5vcm1hbGl6ZWQgdG8gb25lIHNjYWxlIGZhY3Rvci4KICogQHBhcmFtIFtvdXRdIFRoZSBjb21tb24gc2NhbGUgZmFjdG9yIG9mIHRoZSBkb3dubWl4IG1hdHJpeC4KICogQHJldHVybnMgICAgIEFuIGVycm9yIGNvZGUuCiAqKi8Kc3RhdGljClBDTURNWF9FUlJPUiBnZXRNaXhGYWN0b3JzICgKICAgICAgICBjb25zdCBVQ0hBUiAgICAgICAgICAgICAgICAgaW5Nb2RlSXNDZmcsCiAgICAgICAgUENNX0RNWF9DSEFOTkVMX01PREUgICAgICAgIGluQ2hNb2RlLAogICAgICAgIGNvbnN0IFBDTV9ETVhfQ0hBTk5FTF9NT0RFICBvdXRDaE1vZGUsCiAgICAgICAgY29uc3QgUENNX0RNWF9VU0VSX1BBUkFNUyAgKnBQYXJhbXMsCiAgICAgICAgY29uc3QgRE1YX0JTX01FVEFfREFUQSAgICAgKnBNZXRhRGF0YSwKICAgICAgICBGSVhQX0RNWCAgICAgICAgICAgICAgICAgICAgbWl4RmFjdG9yc1tQQ01fRE1YX01BWF9DSEFOTkVMU11bUENNX0RNWF9NQVhfQ0hBTk5FTFNdLAogICAgICAgIElOVCAgICAgICAgICAgICAgICAgICAgICAgICpwT3V0U2NhbGUKICAgICAgKQp7CiAgUENNRE1YX0VSUk9SIGVyciA9IFBDTURNWF9PSzsKICBJTlQgIG1peFNjYWxlc1tQQ01fRE1YX01BWF9DSEFOTkVMU11bUENNX0RNWF9NQVhfQ0hBTk5FTFNdOwogIElOVCAgbWF4U2NhbGUgPSAwOwogIGludCAgbnVtSW5DaGFubmVsLCBudW1PdXRDaGFubmVsOwogIHVuc2lnbmVkIGludCAgb3V0Q2gsIGluQ2gsIGluQ2hDZmcgPSAwOwogIHVuc2lnbmVkIGludCAgdmFsaWRbUENNX0RNWF9NQVhfQ0hBTk5FTFNdID0geyAwIH07CgogIEZES19BU1NFUlQocE1ldGFEYXRhICAhPSBOVUxMKTsKICBGREtfQVNTRVJUKG1peEZhY3RvcnMgIT0gTlVMTCk7CiAgLyogQ2hlY2sgb24gYSBzdXBwb3J0ZWQgb3V0cHV0IGNvbmZpZ3VyYXRpb24gKi8KICBGREtfQVNTRVJUKCAob3V0Q2hNb2RlID09IENIX01PREVfMV8wXzBfMCkKICAgICAgICAgICB8fCAob3V0Q2hNb2RlID09IENIX01PREVfMl8wXzBfMCkKICAgICAgICAgICB8fCAob3V0Q2hNb2RlID09IENIX01PREVfM18wXzJfMSkgKTsKCiAgaWYgKGluTW9kZUlzQ2ZnKSB7CiAgICAvKiBXb3JrYXJvdW5kIGZvciB0aGUgYW1iaWd1aXR5IG9mIHRoZSBpbnRlcm5hbCBjaGFubmVsIG1vZGVzLgogICAgICAgQ29udmVydCBjaGFubmVsIGNvbmZpZyB0byBjaGFubmVsIG1vZGU6ICovCiAgICBpbkNoQ2ZnICA9ICh1bnNpZ25lZCBpbnQpaW5DaE1vZGU7CiAgICBzd2l0Y2ggKGluQ2hDZmcpIHsKICAgIGNhc2UgMTogY2FzZSAyOiBjYXNlIDM6CiNpZiAoUENNX0RNWF9NQVhfQ0hBTk5FTFMgPiAzKQogICAgY2FzZSA0OiBjYXNlIDU6IGNhc2UgNjoKI2VuZGlmCiAgICAgIGluQ2hNb2RlID0gb3V0Q2hNb2RlVGFibGVbaW5DaENmZ107CiAgICAgIGJyZWFrOwogICAgY2FzZSAxMToKICAgICAgaW5DaE1vZGUgPSBDSF9NT0RFXzNfMF8zXzE7CiAgICAgIGJyZWFrOwogICAgY2FzZSAxMjoKICAgICAgaW5DaE1vZGUgPSBDSF9NT0RFXzNfMF80XzE7CiAgICAgIGJyZWFrOwogICAgY2FzZSA3OiBjYXNlIDE0OgogICAgICBpbkNoTW9kZSA9IENIX01PREVfNV8wXzJfMTsKICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICBGREtfQVNTRVJUKDApOwogICAgfQogIH0KCiAgLyogRXh0cmFjdCB0aGUgdG90YWwgbnVtYmVyIG9mIGlucHV0IGNoYW5uZWxzICovCiAgbnVtSW5DaGFubmVsICA9ICAoaW5DaE1vZGUmMHhGKQogICAgICAgICAgICAgICAgKyAoKGluQ2hNb2RlPj4gNCkmMHhGKQogICAgICAgICAgICAgICAgKyAoKGluQ2hNb2RlPj4gOCkmMHhGKQogICAgICAgICAgICAgICAgKyAoKGluQ2hNb2RlPj4xMikmMHhGKTsKICAvKiBFeHRyYWN0IHRoZSB0b3RhbCBudW1iZXIgb2Ygb3V0cHV0IGNoYW5uZWxzICovCiAgbnVtT3V0Q2hhbm5lbCA9ICAob3V0Q2hNb2RlJjB4RikKICAgICAgICAgICAgICAgICsgKChvdXRDaE1vZGU+PiA0KSYweEYpCiAgICAgICAgICAgICAgICArICgob3V0Q2hNb2RlPj4gOCkmMHhGKQogICAgICAgICAgICAgICAgKyAoKG91dENoTW9kZT4+MTIpJjB4Rik7CgogIC8qIE1QRUcgYW1tZW5kbWVudCA0IGFrYSBFVFNJIG1ldGFkYXRhIGFuZCBmYWxsYmFjayBtb2RlOiAqLwoKCiAgLyogQ3JlYXRlIGlkZW50aXR5IERNWCBtYXRyaXg6ICovCiAgZm9yIChvdXRDaD0wOyBvdXRDaCA8IFBDTV9ETVhfTUFYX0NIQU5ORUxTOyBvdXRDaCs9MSkgewogICAgZG14SW5pdENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgb3V0Q2ggKTsKICB9CiAgaWYgKCgoaW5DaE1vZGU+PjEyKSYweEYpID09IDApIHsKICAgIC8qIENsZWFyIGVtcHR5IG9yIHdyb25nbHkgbWFwcGVkIGlucHV0IGNoYW5uZWwgKi8KICAgIGRteENsZWFyQ2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBMT1dfRlJFUVVFTkNZX0NIQU5ORUwgKTsKICB9CgogIC8qIEZJUlNUIFNUQUdFOiAqLwogIGlmIChudW1JbkNoYW5uZWwgPiBTSVhfQ0hBTk5FTCkKICB7IC8qIEFsd2F5cyB1c2UgTVBFRyBlcXVhdGlvbnMgZWl0aGVyIHdpdGggbWV0YSBkYXRhIG9yIHdpdGggZGVmYXVsdCB2YWx1ZXMuICovCiAgICBGSVhQX0RNWCAgZE1peEZhY3RBLCBkTWl4RmFjdEI7CiAgICBJTlQgICAgICAgZE1peFNjYWxlQSwgZE1peFNjYWxlQjsKICAgIGludCAgICAgICBpc1ZhbGlkQ2ZnID0gVFJVRTsKCiAgICAvKiBHZXQgZmFjdG9ycyBmcm9tIG1ldGEgZGF0YSAqLwogICAgZE1peEZhY3RBICA9IGFiTWl4THZsVmFsdWVUYWJbcE1ldGFEYXRhLT5kbWl4SWR4QV07CiAgICBkTWl4U2NhbGVBID0gKHBNZXRhRGF0YS0+ZG1peElkeEE9PTApID8gMSA6IDA7CiAgICBkTWl4RmFjdEIgID0gYWJNaXhMdmxWYWx1ZVRhYltwTWV0YURhdGEtPmRtaXhJZHhCXTsKICAgIGRNaXhTY2FsZUIgPSAocE1ldGFEYXRhLT5kbWl4SWR4Qj09MCkgPyAxIDogMDsKCiAgICAvKiBDaGVjayBpZiBpbnB1dCBpcyBpbiB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQgY29uZmlndXJhdGlvbnMgKi8KICAgIHN3aXRjaCAoaW5DaE1vZGUpIHsKICAgIGNhc2UgQ0hfTU9ERV8zXzBfM18xOiAgIC8qIGNoQ2ZnIDExICovCiAgICAgIC8qIDYuMWNoOiAgQycgPSBDOyAgTCcgPSBMOyAgUicgPSBSOyAgTEZFJyA9IExGRTsKICAgICAgICAgICAgICAgICBMcycgPSBMcypkbWl4X2FfaWR4ICsgQ3MqZG1peF9iX2lkeDsKICAgICAgICAgICAgICAgICBScycgPSBScypkbWl4X2FfaWR4ICsgQ3MqZG1peF9iX2lkeDsgKi8KICAgICAgZG14Q2xlYXJDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIFJJR0hUX01VTFRJUFJQU19DSEFOTkVMICk7ICAvKiBjbGVhciBlbXB0eSBpbnB1dCBjaGFubmVsICovCiAgICAgIGRteFNldENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgTEVGVF9SRUFSX0NIQU5ORUwsICBMRUZUX1JFQVJfQ0hBTk5FTCwgICAgICBkTWl4RmFjdEEsIGRNaXhTY2FsZUEgKTsKICAgICAgZG14U2V0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBMRUZUX1JFQVJfQ0hBTk5FTCwgIExFRlRfTVVMVElQUlBTX0NIQU5ORUwsIGRNaXhGYWN0QiwgZE1peFNjYWxlQiApOwogICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIFJJR0hUX1JFQVJfQ0hBTk5FTCwgUklHSFRfUkVBUl9DSEFOTkVMLCAgICAgZE1peEZhY3RBLCBkTWl4U2NhbGVBICk7CiAgICAgIGRteFNldENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgUklHSFRfUkVBUl9DSEFOTkVMLCBMRUZUX01VTFRJUFJQU19DSEFOTkVMLCBkTWl4RmFjdEIsIGRNaXhTY2FsZUIgKTsKICAgICAgYnJlYWs7CiAgICBjYXNlIENIX01PREVfM18yXzFfMDoKICAgIGNhc2UgQ0hfTU9ERV8zXzJfMV8xOiAgIC8qIGNoQ2ZnIDExIGJ1dCB3aXRoIHNpZGUgY2hhbm5lbHMgKi8KICAgICAgLyogNi4xY2g6ICBDJyA9IEM7ICBMJyA9IEw7ICBSJyA9IFI7ICBMRkUnID0gTEZFOwogICAgICAgICAgICAgICAgIExzJyA9IExzKmRtaXhfYV9pZHggKyBDcypkbWl4X2JfaWR4OwogICAgICAgICAgICAgICAgIFJzJyA9IFJzKmRtaXhfYV9pZHggKyBDcypkbWl4X2JfaWR4OyAqLwogICAgICBkbXhDbGVhckNoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgUklHSFRfUkVBUl9DSEFOTkVMICk7ICAvKiBjbGVhciBlbXB0eSBpbnB1dCBjaGFubmVsICovCiAgICAgIGRteFNldENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgUklHSFRfUkVBUl9DSEFOTkVMLCBMRUZUX1JFQVJfQ0hBTk5FTCwgICAgICAgZE1peEZhY3RCLCBkTWl4U2NhbGVCICk7CiAgICAgIGRteFNldENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgUklHSFRfUkVBUl9DSEFOTkVMLCBSSUdIVF9NVUxUSVBSUFNfQ0hBTk5FTCwgZE1peEZhY3RBLCBkTWl4U2NhbGVBICk7CiAgICAgIGRteFNldENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgTEVGVF9SRUFSX0NIQU5ORUwsICBMRUZUX1JFQVJfQ0hBTk5FTCwgICAgICAgZE1peEZhY3RCLCBkTWl4U2NhbGVCICk7CiAgICAgIGRteFNldENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgTEVGVF9SRUFSX0NIQU5ORUwsICBMRUZUX01VTFRJUFJQU19DSEFOTkVMLCAgZE1peEZhY3RBLCBkTWl4U2NhbGVBICk7CiAgICAgIGlzVmFsaWRDZmcgPSBGQUxTRTsKICAgICAgZXJyID0gUENNRE1YX0lOVkFMSURfTU9ERTsKICAgICAgYnJlYWs7CiAgICBjYXNlIENIX01PREVfNV8yXzFfMDoKICAgIGNhc2UgQ0hfTU9ERV81XzBfMV8wOgogICAgY2FzZSBDSF9NT0RFXzVfMF8xXzE6CiAgICAgIC8qICAgICAgICAgTHMnID0gQ3MqZG1peF9hX2lkeDsKICAgICAgICAgICAgICAgICBScycgPSBDcypkbWl4X2FfaWR4OyAqLwogICAgICBkbXhDbGVhckNoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgUklHSFRfUkVBUl9DSEFOTkVMICk7ICAvKiBjbGVhciBlbXB0eSBpbnB1dCBjaGFubmVsICovCiAgICAgIGRteFNldENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgUklHSFRfUkVBUl9DSEFOTkVMLCBMRUZUX1JFQVJfQ0hBTk5FTCwgZE1peEZhY3RBLCBkTWl4U2NhbGVBICk7CiAgICAgIGRteFNldENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgTEVGVF9SRUFSX0NIQU5ORUwsICBMRUZUX1JFQVJfQ0hBTk5FTCwgZE1peEZhY3RBLCBkTWl4U2NhbGVBICk7CiAgICAgIGlzVmFsaWRDZmcgPSBGQUxTRTsKICAgICAgZXJyID0gUENNRE1YX0lOVkFMSURfTU9ERTsKICAgICAgYnJlYWs7CiAgICBjYXNlIENIX01PREVfM18wXzRfMTogICAvKiBjaENmZyAxMiAqLwogICAgICAvKiA3LjFjaCBTdXJyb3VuZCBCYWNrOiAgQycgPSBDOyAgTCcgPSBMOyAgUicgPSBSOyAgTEZFJyA9IExGRTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExzJyA9IExzKmRtaXhfYV9pZHggKyBMc3IqZG1peF9iX2lkeDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJzJyA9IFJzKmRtaXhfYV9pZHggKyBSc3IqZG1peF9iX2lkeDsgKi8KICAgICAgZG14U2V0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBMRUZUX1JFQVJfQ0hBTk5FTCwgIExFRlRfUkVBUl9DSEFOTkVMLCAgICAgICBkTWl4RmFjdEEsIGRNaXhTY2FsZUEgKTsKICAgICAgZG14U2V0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBMRUZUX1JFQVJfQ0hBTk5FTCwgIExFRlRfTVVMVElQUlBTX0NIQU5ORUwsICBkTWl4RmFjdEIsIGRNaXhTY2FsZUIgKTsKICAgICAgZG14U2V0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9SRUFSX0NIQU5ORUwsIFJJR0hUX1JFQVJfQ0hBTk5FTCwgICAgICBkTWl4RmFjdEEsIGRNaXhTY2FsZUEgKTsKICAgICAgZG14U2V0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9SRUFSX0NIQU5ORUwsIFJJR0hUX01VTFRJUFJQU19DSEFOTkVMLCBkTWl4RmFjdEIsIGRNaXhTY2FsZUIgKTsKICAgICAgYnJlYWs7CiAgICBjYXNlIENIX01PREVfNV8wXzJfMTogICAvKiBjaENmZyA3IHx8IDE0ICovCiAgICAgIGlmIChpbkNoQ2ZnID09IDE0KSB7CiAgICAgICAgLyogNy4xY2ggRnJvbnQgSGVpZ2h0OiAgQycgPSBDOyAgTHMnID0gTHM7ICBScycgPSBSczsgIExGRScgPSBMRkU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCcgPSBMKmRtaXhfYV9pZHggKyBMdipkbWl4X2JfaWR4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFInID0gUipkbWl4X2FfaWR4ICsgUnYqZG1peF9iX2lkeDsgKi8KICAgICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIExFRlRfRlJPTlRfQ0hBTk5FTCwgIExFRlRfRlJPTlRfQ0hBTk5FTCwgICAgICBkTWl4RmFjdEEsIGRNaXhTY2FsZUEgKTsKICAgICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIExFRlRfRlJPTlRfQ0hBTk5FTCwgIExFRlRfTVVMVElQUlBTX0NIQU5ORUwsICBkTWl4RmFjdEIsIGRNaXhTY2FsZUIgKTsKICAgICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIFJJR0hUX0ZST05UX0NIQU5ORUwsIFJJR0hUX0ZST05UX0NIQU5ORUwsICAgICBkTWl4RmFjdEEsIGRNaXhTY2FsZUEgKTsKICAgICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIFJJR0hUX0ZST05UX0NIQU5ORUwsIFJJR0hUX01VTFRJUFJQU19DSEFOTkVMLCBkTWl4RmFjdEIsIGRNaXhTY2FsZUIgKTsKICAgICAgfSBlbHNlIHsKICAgICAgICAvKiA3LjFjaCBGcm9udDogIExzJyA9IExzOyAgUnMnID0gUnM7ICBMRkUnID0gTEZFOwogICAgICAgICAgICAgICAgICAgICAgICAgQycgPSBDICsgKExjK1JjKSpkbWl4X2FfaWR4OwogICAgICAgICAgICAgICAgICAgICAgICAgTCcgPSBMICsgTGMqZG1peF9iX2lkeDsKICAgICAgICAgICAgICAgICAgICAgICAgIFInID0gUiArIFJjKmRtaXhfYl9pZHg7CiAgICAgICAgICAgICAgICAgICAgICAgICBDQVVUSU9OOiBMK1IgYXJlIG5vdCBhdCAoTVBFRykgaW5kZXggMSsyLiAqLwogICAgICAgIGRteFNldENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgQ0VOVEVSX0ZST05UX0NIQU5ORUwsIExFRlRfRlJPTlRfQ0hBTk5FTCwgICAgICBkTWl4RmFjdEEsIGRNaXhTY2FsZUEgKTsKICAgICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIENFTlRFUl9GUk9OVF9DSEFOTkVMLCBSSUdIVF9GUk9OVF9DSEFOTkVMLCAgICAgZE1peEZhY3RBLCBkTWl4U2NhbGVBICk7CiAgICAgICAgZG14U2V0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBMRUZUX0ZST05UX0NIQU5ORUwsICAgTEVGVF9GUk9OVF9DSEFOTkVMLCAgICAgIGRNaXhGYWN0QiwgZE1peFNjYWxlQiApOwogICAgICAgIGRteFNldENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgTEVGVF9GUk9OVF9DSEFOTkVMLCAgIExFRlRfTVVMVElQUlBTX0NIQU5ORUwsICBGTDJGWENPTlNUX0RNWCgwLjVmKSwgMSApOwogICAgICAgIGRteFNldENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgUklHSFRfRlJPTlRfQ0hBTk5FTCwgIFJJR0hUX0ZST05UX0NIQU5ORUwsICAgICBkTWl4RmFjdEIsIGRNaXhTY2FsZUIgKTsKICAgICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIFJJR0hUX0ZST05UX0NIQU5ORUwsICBSSUdIVF9NVUxUSVBSUFNfQ0hBTk5FTCwgRkwyRlhDT05TVF9ETVgoMC41ZiksIDEgKTsKICAgICAgfQogICAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgIC8qIE5vdGhpbmcgdG8gZG8uIEp1c3QgdXNlIHRoZSBpZGVudGl0eSBtYXRyaXguICovCiAgICAgIGlzVmFsaWRDZmcgPSBGQUxTRTsKICAgICAgZXJyID0gUENNRE1YX0lOVkFMSURfTU9ERTsKICAgICAgYnJlYWs7CiAgICB9CgogICAgLyogQWRkIGFkZGl0aW9uYWwgRE1YIGdhaW4gKi8KICAgIGlmICggKGlzVmFsaWRDZmcgPT0gVFJVRSkKICAgICAgJiYgKHBNZXRhRGF0YS0+ZG14R2FpbklkeDUgIT0gMCkpCiAgICB7IC8qIEFwcGx5IERNWCBnYWluIDUgKi8KICAgICAgRklYUF9ETVggZG14R2FpbjsKICAgICAgSU5UICAgICAgZG14U2NhbGU7CiAgICAgIElOVCAgICAgIHNpZ24gPSAocE1ldGFEYXRhLT5kbXhHYWluSWR4NSAmIDB4NDApID8gLTEgOiAxOwogICAgICBJTlQgICAgICB2YWwgID0gcE1ldGFEYXRhLT5kbXhHYWluSWR4NSAmIDB4M0Y7CgogICAgICAvKiAxMF4oZG14X2dhaW5fNS84MCkgKi8KICAgICAgZG14R2FpbiA9IEZYX0RCTDJGWF9ETVgoIGZMZFBvdygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkwyRlhDT05TVF9EQkwoMC44MzA0ODIwMjM3MjE4NDFmKSwgMiwgIC8qIGxvZzIoMTApICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGSVhQX0RCTCkoc2lnbip2YWwqKExPTkcpRkwyRlhDT05TVF9EQkwoMC4wMTI1ZikpLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkbXhTY2FsZSApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAvKiBDdXJyZW50bHkgb25seSBwb3NpdGl2ZSBzY2FsZSBmYWN0b3JzIHN1cHBvcnRlZCEgKi8KICAgICAgaWYgKGRteFNjYWxlIDwgMCkgewogICAgICAgIGRteEdhaW4gPj49IC1kbXhTY2FsZTsKICAgICAgICBkbXhTY2FsZSAgPSAgMDsKICAgICAgfQoKICAgICAgZG14U2V0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBDRU5URVJfRlJPTlRfQ0hBTk5FTCwgIENFTlRFUl9GUk9OVF9DSEFOTkVMLCAgZG14R2FpbiwgZG14U2NhbGUgKTsKICAgICAgZG14U2V0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBMRUZUX0ZST05UX0NIQU5ORUwsICAgIExFRlRfRlJPTlRfQ0hBTk5FTCwgICAgZG14R2FpbiwgZG14U2NhbGUgKTsKICAgICAgZG14U2V0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9GUk9OVF9DSEFOTkVMLCAgIFJJR0hUX0ZST05UX0NIQU5ORUwsICAgZG14R2FpbiwgZG14U2NhbGUgKTsKICAgICAgZG14U2V0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBMRUZUX1JFQVJfQ0hBTk5FTCwgICAgIExFRlRfUkVBUl9DSEFOTkVMLCAgICAgZG14R2FpbiwgZG14U2NhbGUgKTsKICAgICAgZG14U2V0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9SRUFSX0NIQU5ORUwsICAgIFJJR0hUX1JFQVJfQ0hBTk5FTCwgICAgZG14R2FpbiwgZG14U2NhbGUgKTsKICAgICAgZG14U2V0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBMT1dfRlJFUVVFTkNZX0NIQU5ORUwsIExPV19GUkVRVUVOQ1lfQ0hBTk5FTCwgZG14R2FpbiwgZG14U2NhbGUgKTsKICAgIH0KCiAgICAvKiBNYXJrIHRoZSBvdXRwdXQgY2hhbm5lbHMgKi8KICAgIHZhbGlkW0NFTlRFUl9GUk9OVF9DSEFOTkVMXSAgPSAxOwogICAgdmFsaWRbTEVGVF9GUk9OVF9DSEFOTkVMXSAgICA9IDE7CiAgICB2YWxpZFtSSUdIVF9GUk9OVF9DSEFOTkVMXSAgID0gMTsKICAgIHZhbGlkW0xFRlRfUkVBUl9DSEFOTkVMXSAgICAgPSAxOwogICAgdmFsaWRbUklHSFRfUkVBUl9DSEFOTkVMXSAgICA9IDE7CiAgICB2YWxpZFtMT1dfRlJFUVVFTkNZX0NIQU5ORUxdID0gMTsKCiAgICAvKiBVcGRhdGUgY2hhbm5lbCBtb2RlIGZvciB0aGUgbmV4dCBzdGFnZSAqLwogICAgaW5DaE1vZGUgPSBDSF9NT0RFXzNfMF8yXzE7CiAgfQoKICAvKiBTRUNPTkQgU1RBR0U6ICovCiAgaWYgKG51bU91dENoYW5uZWwgPD0gVFdPX0NIQU5ORUwpIHsKICAgIC8qIENyZWF0ZSBETVggbWF0cml4IGFjY29yZGluZyB0byBpbnB1dCBjb25maWd1cmF0aW9uICovCiAgICBzd2l0Y2ggKGluQ2hNb2RlKSB7CiAgICBjYXNlIENIX01PREVfMl8wXzBfMDogICAvKiBjaENmZyAyICovCiAgICAgIC8qIEFwcGx5IHRoZSBkdWFsIGNoYW5uZWwgbW9kZS4gKi8KICAgICAgc3dpdGNoIChwUGFyYW1zLT5kdWFsQ2hhbm5lbE1vZGUpIHsKICAgICAgY2FzZSBDSDFfTU9ERTogIC8qIEwnID0gMC43MDcgKiBDaDE7CiAgICAgICAgICAgICAgICAgICAgICAgICBSJyA9IDAuNzA3ICogQ2gxOyAqLwogICAgICAgIGRteFNldENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgTEVGVF9GUk9OVF9DSEFOTkVMLCAgTEVGVF9GUk9OVF9DSEFOTkVMLCAgRkwyRlhDT05TVF9ETVgoMC43MDdmKSwgMCApOwogICAgICAgIGRteFNldENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgUklHSFRfRlJPTlRfQ0hBTk5FTCwgTEVGVF9GUk9OVF9DSEFOTkVMLCAgRkwyRlhDT05TVF9ETVgoMC43MDdmKSwgMCApOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIENIMl9NT0RFOiAgLyogTCcgPSAwLjcwNyAqIENoMjsKICAgICAgICAgICAgICAgICAgICAgICAgIFInID0gMC43MDcgKiBDaDI7ICovCiAgICAgICAgZG14U2V0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBMRUZUX0ZST05UX0NIQU5ORUwsICBSSUdIVF9GUk9OVF9DSEFOTkVMLCBGTDJGWENPTlNUX0RNWCgwLjcwN2YpLCAwICk7CiAgICAgICAgZG14U2V0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9GUk9OVF9DSEFOTkVMLCBSSUdIVF9GUk9OVF9DSEFOTkVMLCBGTDJGWENPTlNUX0RNWCgwLjcwN2YpLCAwICk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgTUlYRURfTU9ERTogIC8qIEwnID0gMC41KkNoMSArIDAuNSpDaDI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgIFInID0gMC41KkNoMSArIDAuNSpDaDI7ICovCiAgICAgICAgZG14U2V0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBMRUZUX0ZST05UX0NIQU5ORUwsICBMRUZUX0ZST05UX0NIQU5ORUwsICBGTDJGWENPTlNUX0RNWCgwLjVmKSwgMCApOwogICAgICAgIGRteEFkZENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgTEVGVF9GUk9OVF9DSEFOTkVMLCAgUklHSFRfRlJPTlRfQ0hBTk5FTCwgRkwyRlhDT05TVF9ETVgoMC41ZiksIDAgKTsKICAgICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIFJJR0hUX0ZST05UX0NIQU5ORUwsIExFRlRfRlJPTlRfQ0hBTk5FTCwgIEZMMkZYQ09OU1RfRE1YKDAuNWYpLCAwICk7CiAgICAgICAgZG14QWRkQ2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9GUk9OVF9DSEFOTkVMLCBSSUdIVF9GUk9OVF9DSEFOTkVMLCBGTDJGWENPTlNUX0RNWCgwLjVmKSwgMCApOwogICAgICAgIGJyZWFrOwogICAgICBkZWZhdWx0OgogICAgICBjYXNlIFNURVJFT19NT0RFOgogICAgICAgIC8qIE5vdGhpbmcgdG8gZG8gKi8KICAgICAgICBicmVhazsKICAgICAgfQogICAgICBicmVhazsKICAgIGNhc2UgQ0hfTU9ERV8yXzBfMV8wOgogICAgICAvKiBMJyA9IEwgKyAwLjcwNypTOwogICAgICAgICBSJyA9IFIgKyAwLjcwNypTOyAqLwogICAgICBkbXhBZGRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIExFRlRfRlJPTlRfQ0hBTk5FTCwgIExFRlRfUkVBUl9DSEFOTkVMLCAgIEZMMkZYQ09OU1RfRE1YKDAuNzA3ZiksIDAgKTsKICAgICAgZG14QWRkQ2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9GUk9OVF9DSEFOTkVMLCBMRUZUX1JFQVJfQ0hBTk5FTCwgICBGTDJGWENPTlNUX0RNWCgwLjcwN2YpLCAwICk7CiAgICAgIGJyZWFrOwogICAgY2FzZSBDSF9NT0RFXzNfMF8wXzA6ICAgLyogY2hDZmcgMyAqLwogICAgICAvKiBMJyA9IEwgKyAwLjcwNypDOwogICAgICAgICBSJyA9IFIgKyAwLjcwNypDOyAqLwogICAgICBkbXhBZGRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIExFRlRfRlJPTlRfQ0hBTk5FTCwgIENFTlRFUl9GUk9OVF9DSEFOTkVMLCBGTDJGWENPTlNUX0RNWCgwLjcwN2YpLCAwICk7CiAgICAgIGRteEFkZENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgUklHSFRfRlJPTlRfQ0hBTk5FTCwgQ0VOVEVSX0ZST05UX0NIQU5ORUwsIEZMMkZYQ09OU1RfRE1YKDAuNzA3ZiksIDAgKTsKICAgICAgYnJlYWs7CiAgICBjYXNlIENIX01PREVfM18wXzFfMDogICAvKiBjaENmZyA0ICovCiAgICAgIC8qIEwnID0gTCArIDAuNzA3KkMgKyAwLjcwNypTOwogICAgICAgICBSJyA9IFIgKyAwLjcwNypDICsgMC43MDcqUzsgKi8KICAgICAgZG14QWRkQ2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBMRUZUX0ZST05UX0NIQU5ORUwsICBDRU5URVJfRlJPTlRfQ0hBTk5FTCwgRkwyRlhDT05TVF9ETVgoMC43MDdmKSwgMCApOwogICAgICBkbXhBZGRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIExFRlRfRlJPTlRfQ0hBTk5FTCwgIExFRlRfUkVBUl9DSEFOTkVMLCAgICBGTDJGWENPTlNUX0RNWCgwLjcwN2YpLCAwICk7CiAgICAgIGRteEFkZENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgUklHSFRfRlJPTlRfQ0hBTk5FTCwgQ0VOVEVSX0ZST05UX0NIQU5ORUwsIEZMMkZYQ09OU1RfRE1YKDAuNzA3ZiksIDAgKTsKICAgICAgZG14QWRkQ2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9GUk9OVF9DSEFOTkVMLCBMRUZUX1JFQVJfQ0hBTk5FTCwgICAgRkwyRlhDT05TVF9ETVgoMC43MDdmKSwgMCApOwogICAgICBicmVhazsKICAgIGNhc2UgQ0hfTU9ERV8zXzBfMl8wOiAgIC8qIGNoQ2ZnIDUgKi8KICAgIGNhc2UgQ0hfTU9ERV8zXzBfMl8xOiAgIC8qIGNoQ2ZnIDYgKi8KICAgICAgLyogTVBFRyArIElUVSArIERMQgogICAgICAgICBCdXQgYmVjYXVzZSB0aGUgZGVmYXVsdCBkb3dubWl4IGVxdWF0aW9ucyBhbmQgY29lZmZpY2llbnRzIGFyZSBlcXVhbCB3ZSBzdGljayB0byBNUEVHLiAqLwogICAgICBpZiAoICAocE1ldGFEYXRhLT50eXBlRmxhZ3MgJiBUWVBFX0RTRV9EQVRBKQogICAgICAgIHx8ICEocE1ldGFEYXRhLT50eXBlRmxhZ3MgJiBUWVBFX1BDRV9EQVRBKSApCiAgICAgIHsKICAgICAgICBGSVhQX0RNWCAgY01peEx2bCwgc01peEx2bCwgbE1peEx2bDsKICAgICAgICBJTlQgICAgICAgY01peFNjYWxlLCBzTWl4U2NhbGUsIGxNaXhTY2FsZTsKCiAgICAgICAgLyogR2V0IGZhY3RvcnMgZnJvbSBtZXRhIGRhdGEgKi8KICAgICAgICBjTWl4THZsICAgPSBhYk1peEx2bFZhbHVlVGFiW3BNZXRhRGF0YS0+Y0xldklkeF07CiAgICAgICAgY01peFNjYWxlID0gKHBNZXRhRGF0YS0+Y0xldklkeD09MCkgPyAxIDogMDsKICAgICAgICBzTWl4THZsICAgPSBhYk1peEx2bFZhbHVlVGFiW3BNZXRhRGF0YS0+c0xldklkeF07CiAgICAgICAgc01peFNjYWxlID0gKHBNZXRhRGF0YS0+c0xldklkeD09MCkgPyAxIDogMDsKICAgICAgICBsTWl4THZsICAgPSBsZmVNaXhMdmxWYWx1ZVRhYltwTWV0YURhdGEtPmRtaXhJZHhMZmVdOwogICAgICAgIGlmIChwTWV0YURhdGEtPmRtaXhJZHhMZmUgPD0gMSkgewogICAgICAgICAgbE1peFNjYWxlID0gMjsKICAgICAgICB9IGVsc2UgaWYgKHBNZXRhRGF0YS0+ZG1peElkeExmZSA8PSA1KSB7CiAgICAgICAgICBsTWl4U2NhbGUgPSAxOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBsTWl4U2NhbGUgPSAwOwogICAgICAgIH0KICAgICAgICAvKiBTZXR1cCB0aGUgRE1YIG1hdHJpeCAqLwogICAgICAgIGlmICggKHBQYXJhbXMtPnBzZXVkb1N1cnJNb2RlID09IEZPUkNFX1BTX0RNWCkKICAgICAgICAgIHx8ICgocFBhcmFtcy0+cHNldWRvU3Vyck1vZGUgPT0gQVVUT19QU19ETVgpICYmIChwTWV0YURhdGEtPnBzZXVkb1N1cnJvdW5kPT0xKSkpCiAgICAgICAgeyAvKiBMJyA9IEwgKyBDKmNsZXYgLSAoTHMrUnMpKnNsZXYgKyBMRkUqbGZsZXY7CiAgICAgICAgICAgICBSJyA9IFIgKyBDKmNsZXYgKyAoTHMrUnMpKnNsZXYgKyBMRkUqbGZsZXY7ICovCiAgICAgICAgICBkbXhBZGRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIExFRlRfRlJPTlRfQ0hBTk5FTCwgIENFTlRFUl9GUk9OVF9DSEFOTkVMLCAgY01peEx2bCwgY01peFNjYWxlICk7CiAgICAgICAgICBkbXhBZGRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIExFRlRfRlJPTlRfQ0hBTk5FTCwgIExFRlRfUkVBUl9DSEFOTkVMLCAgICAtc01peEx2bCwgc01peFNjYWxlICk7CiAgICAgICAgICBkbXhBZGRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIExFRlRfRlJPTlRfQ0hBTk5FTCwgIFJJR0hUX1JFQVJfQ0hBTk5FTCwgICAtc01peEx2bCwgc01peFNjYWxlICk7CiAgICAgICAgICBkbXhBZGRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIExFRlRfRlJPTlRfQ0hBTk5FTCwgIExPV19GUkVRVUVOQ1lfQ0hBTk5FTCwgbE1peEx2bCwgbE1peFNjYWxlICk7CiAgICAgICAgICBkbXhBZGRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIFJJR0hUX0ZST05UX0NIQU5ORUwsIENFTlRFUl9GUk9OVF9DSEFOTkVMLCAgY01peEx2bCwgY01peFNjYWxlICk7CiAgICAgICAgICBkbXhBZGRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIFJJR0hUX0ZST05UX0NIQU5ORUwsIExFRlRfUkVBUl9DSEFOTkVMLCAgICAgc01peEx2bCwgc01peFNjYWxlICk7CiAgICAgICAgICBkbXhBZGRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIFJJR0hUX0ZST05UX0NIQU5ORUwsIFJJR0hUX1JFQVJfQ0hBTk5FTCwgICAgc01peEx2bCwgc01peFNjYWxlICk7CiAgICAgICAgICBkbXhBZGRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIFJJR0hUX0ZST05UX0NIQU5ORUwsIExPV19GUkVRVUVOQ1lfQ0hBTk5FTCwgbE1peEx2bCwgbE1peFNjYWxlICk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7IC8qIEwnID0gTCArIEMqY2xldiArIExzKnNsZXYgKyBMRkUqbGxldjsKICAgICAgICAgICAgIFInID0gUiArIEMqY2xldiArIFJzKnNsZXYgKyBMRkUqbGxldjsgKi8KICAgICAgICAgIGRteEFkZENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgTEVGVF9GUk9OVF9DSEFOTkVMLCAgQ0VOVEVSX0ZST05UX0NIQU5ORUwsICBjTWl4THZsLCBjTWl4U2NhbGUgKTsKICAgICAgICAgIGRteEFkZENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgTEVGVF9GUk9OVF9DSEFOTkVMLCAgTEVGVF9SRUFSX0NIQU5ORUwsICAgICBzTWl4THZsLCBzTWl4U2NhbGUgKTsKICAgICAgICAgIGRteEFkZENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgTEVGVF9GUk9OVF9DSEFOTkVMLCAgTE9XX0ZSRVFVRU5DWV9DSEFOTkVMLCBsTWl4THZsLCBsTWl4U2NhbGUgKTsKICAgICAgICAgIGRteEFkZENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgUklHSFRfRlJPTlRfQ0hBTk5FTCwgQ0VOVEVSX0ZST05UX0NIQU5ORUwsICBjTWl4THZsLCBjTWl4U2NhbGUgKTsKICAgICAgICAgIGRteEFkZENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgUklHSFRfRlJPTlRfQ0hBTk5FTCwgUklHSFRfUkVBUl9DSEFOTkVMLCAgICBzTWl4THZsLCBzTWl4U2NhbGUgKTsKICAgICAgICAgIGRteEFkZENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgUklHSFRfRlJPTlRfQ0hBTk5FTCwgTE9XX0ZSRVFVRU5DWV9DSEFOTkVMLCBsTWl4THZsLCBsTWl4U2NhbGUgKTsKICAgICAgICB9CgogICAgICAgIC8qIEFkZCBhZGRpdGlvbmFsIERNWCBnYWluICovCiAgICAgICAgaWYgKCBwTWV0YURhdGEtPmRteEdhaW5JZHgyICE9IDAgKQogICAgICAgIHsgLyogQXBwbHkgRE1YIGdhaW4gMiAqLwogICAgICAgICAgRklYUF9ETVggZG14R2FpbjsKICAgICAgICAgIElOVCAgICAgIGRteFNjYWxlOwogICAgICAgICAgSU5UICAgICAgc2lnbiA9IChwTWV0YURhdGEtPmRteEdhaW5JZHgyICYgMHg0MCkgPyAtMSA6IDE7CiAgICAgICAgICBJTlQgICAgICB2YWwgID0gcE1ldGFEYXRhLT5kbXhHYWluSWR4MiAmIDB4M0Y7CgogICAgICAgICAgLyogMTBeKGRteF9nYWluXzIvODApICovCiAgICAgICAgICBkbXhHYWluID0gRlhfREJMMkZYX0RNWCggZkxkUG93KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkwyRlhDT05TVF9EQkwoMC44MzA0ODIwMjM3MjE4NDFmKSwgMiwgIC8qIGxvZzIoMTApICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRklYUF9EQkwpKHNpZ24qdmFsKihMT05HKUZMMkZYQ09OU1RfREJMKDAuMDEyNWYpKSwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRteFNjYWxlICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgLyogQ3VycmVudGx5IG9ubHkgcG9zaXRpdmUgc2NhbGUgZmFjdG9ycyBzdXBwb3J0ZWQhICovCiAgICAgICAgICBpZiAoZG14U2NhbGUgPCAwKSB7CiAgICAgICAgICAgIGRteEdhaW4gPj49IC1kbXhTY2FsZTsKICAgICAgICAgICAgZG14U2NhbGUgID0gIDA7CiAgICAgICAgICB9CgogICAgICAgICAgZG14U2V0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBMRUZUX0ZST05UX0NIQU5ORUwsICBMRUZUX0ZST05UX0NIQU5ORUwsICBkbXhHYWluLCBkbXhTY2FsZSApOwogICAgICAgICAgZG14U2V0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9GUk9OVF9DSEFOTkVMLCBSSUdIVF9GUk9OVF9DSEFOTkVMLCBkbXhHYWluLCBkbXhTY2FsZSApOwogICAgICAgIH0KICAgICAgfQojaWZkZWYgUENFX01FVEFEQVRBX0VOQUJMRQogICAgICBlbHNlIHsKICAgICAgICBGSVhQX0RNWCAgZmxldiwgY2xldiwgc2xldkxMLCBzbGV2TFIsIHNsZXZSTCwgc2xldlJSOwogICAgICAgIEZJWFBfRE1YICBtdHJ4TWl4RHduQ29lZiA9IG1wZWdNaXhEb3duSWR4MkNvZWZbcE1ldGFEYXRhLT5tYXRyaXhNaXhkb3duSWR4XTsKCiAgICAgICAgaWYgKCAocFBhcmFtcy0+cHNldWRvU3Vyck1vZGUgPT0gRk9SQ0VfUFNfRE1YKQogICAgICAgICAgfHwgKChwUGFyYW1zLT5wc2V1ZG9TdXJyTW9kZSA9PSBBVVRPX1BTX0RNWCkgJiYgKHBNZXRhRGF0YS0+cHNldWRvU3Vycm91bmQ9PTEpKSkKICAgICAgICB7IC8qIDMvMiBpbnB1dDogTCcgPSAoMS43MDcrMipBKV4tMSAqIFtMKzAuNzA3KkMtQSpMcy1BKlJzXTsKICAgICAgICAgICAgICAgICAgICAgICAgUicgPSAoMS43MDcrMipBKV4tMSAqIFtSKzAuNzA3KkMrQSpMcytBKlJzXTsgKi8KICAgICAgICAgIGZsZXYgPSBtcGVnTWl4RG93bklkeDJQcmVGYWN0WzFdW3BNZXRhRGF0YS0+bWF0cml4TWl4ZG93bklkeF07CiAgICAgICAgICBzbGV2UlIgPSBzbGV2UkwgPSBGWF9EQkwyRlhfRE1YKGZNdWx0KGZsZXYsIG10cnhNaXhEd25Db2VmKSk7CiAgICAgICAgICBzbGV2TEwgPSBzbGV2TFIgPSAtc2xldlJMOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgIC8qIDMvMiBpbnB1dDogTCcgPSAoMS43MDcrQSleLTEgKiBbTCswLjcwNypDK0EqTHNdOwogICAgICAgICAgICAgICAgICAgICAgICBSJyA9ICgxLjcwNytBKV4tMSAqIFtSKzAuNzA3KkMrQSpSc107ICovCiAgICAgICAgICBmbGV2ID0gbXBlZ01peERvd25JZHgyUHJlRmFjdFswXVtwTWV0YURhdGEtPm1hdHJpeE1peGRvd25JZHhdOwogICAgICAgICAgc2xldlJSID0gc2xldkxMID0gRlhfREJMMkZYX0RNWChmTXVsdChmbGV2LCBtdHJ4TWl4RHduQ29lZikpOwogICAgICAgICAgc2xldkxSID0gc2xldlJMID0gKEZJWFBfU0dMKTA7CiAgICAgICAgfQogICAgICAgIC8qIGNvbW1vbiBmYWN0b3IgKi8KICAgICAgICBjbGV2ICA9IEZYX0RCTDJGWF9ETVgoZk11bHQoZmxldiwgbXBlZ01peERvd25JZHgyQ29lZlswXSAvKiAwLjcwNyAqLykpOwoKICAgICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIExFRlRfRlJPTlRfQ0hBTk5FTCwgIExFRlRfRlJPTlRfQ0hBTk5FTCwgICBmbGV2LCAgIDAgKTsKICAgICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIExFRlRfRlJPTlRfQ0hBTk5FTCwgIENFTlRFUl9GUk9OVF9DSEFOTkVMLCBjbGV2LCAgIDAgKTsKICAgICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIExFRlRfRlJPTlRfQ0hBTk5FTCwgIExFRlRfUkVBUl9DSEFOTkVMLCAgICBzbGV2TEwsIDAgKTsKICAgICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIExFRlRfRlJPTlRfQ0hBTk5FTCwgIFJJR0hUX1JFQVJfQ0hBTk5FTCwgICBzbGV2TFIsIDAgKTsKCiAgICAgICAgZG14U2V0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9GUk9OVF9DSEFOTkVMLCBSSUdIVF9GUk9OVF9DSEFOTkVMLCAgZmxldiwgICAwICk7CiAgICAgICAgZG14U2V0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9GUk9OVF9DSEFOTkVMLCBDRU5URVJfRlJPTlRfQ0hBTk5FTCwgY2xldiwgICAwICk7CiAgICAgICAgZG14U2V0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9GUk9OVF9DSEFOTkVMLCBMRUZUX1JFQVJfQ0hBTk5FTCwgICAgc2xldlJMLCAwICk7CiAgICAgICAgZG14U2V0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9GUk9OVF9DSEFOTkVMLCBSSUdIVF9SRUFSX0NIQU5ORUwsICAgc2xldlJSLCAwICk7CiAgICAgIH0KI2VuZGlmICAvKiBQQ0VfTUVUQURBVEFfRU5BQkxFICovCiAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgLyogVGhpcyBjb25maWd1cmF0aW9uIGRvZXMgbm90IGZpdCB0byBhbnkga25vd24gZG93bm1peCBlcXVhdGlvbiEgKi8KICAgICAgZXJyID0gUENNRE1YX0lOVkFMSURfTU9ERTsKICAgICAgYnJlYWs7CiAgICB9CiAgICAvKiBNYXJrIHRoZSBvdXRwdXQgY2hhbm5lbHMgKi8KICAgIEZES21lbWNsZWFyKHZhbGlkLCBQQ01fRE1YX01BWF9DSEFOTkVMUypzaXplb2YodW5zaWduZWQgaW50KSk7CiAgICB2YWxpZFtMRUZUX0ZST05UX0NIQU5ORUxdICA9IDE7CiAgICB2YWxpZFtSSUdIVF9GUk9OVF9DSEFOTkVMXSA9IDE7CiAgICAvKiBVcGRhdGUgY2hhbm5lbCBtb2RlIGZvciB0aGUgbmV4dCBzdGFnZSAqLwogICAgaW5DaE1vZGUgPSBDSF9NT0RFXzJfMF8wXzA7CiAgfQoKICBpZiAobnVtT3V0Q2hhbm5lbCA9PSBPTkVfQ0hBTk5FTCkgewogICAgRklYUF9ETVggbW9ub01peExldmVsOwogICAgSU5UICAgICAgbW9ub01peFNjYWxlOwoKI2lmZGVmIFBDRV9NRVRBREFUQV9FTkFCTEUKICAgIGlmICggIChwTWV0YURhdGEtPnR5cGVGbGFncyAmIFRZUEVfUENFX0RBVEEpCiAgICAgICYmICEocE1ldGFEYXRhLT50eXBlRmxhZ3MgJiBUWVBFX0RTRV9EQVRBKSApCiAgICB7IC8qIEMnID0gKDMrMipBKV4tMSAqIFtDK0wrUitBKkxzK0ErUnNdOyAqLwogICAgICBtb25vTWl4TGV2ZWwgPSBtcGVnTWl4RG93bklkeDJQcmVGYWN0WzJdW3BNZXRhRGF0YS0+bWF0cml4TWl4ZG93bklkeF07CiAgICAgIG1vbm9NaXhTY2FsZSA9IDA7CgogICAgICBkbXhDbGVhckNoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgQ0VOVEVSX0ZST05UX0NIQU5ORUwgKTsKICAgICAgbWl4RmFjdG9yc1tDRU5URVJfRlJPTlRfQ0hBTk5FTF1bQ0VOVEVSX0ZST05UX0NIQU5ORUxdID0gbW9ub01peExldmVsOwogICAgICBtaXhGYWN0b3JzW0NFTlRFUl9GUk9OVF9DSEFOTkVMXVtMRUZUX0ZST05UX0NIQU5ORUxdICAgPSBtb25vTWl4TGV2ZWw7CiAgICAgIG1peEZhY3RvcnNbQ0VOVEVSX0ZST05UX0NIQU5ORUxdW1JJR0hUX0ZST05UX0NIQU5ORUxdICA9IG1vbm9NaXhMZXZlbDsKICAgICAgbW9ub01peExldmVsID0gRlhfREJMMkZYX0RNWChmTXVsdChtb25vTWl4TGV2ZWwsIG1wZWdNaXhEb3duSWR4MkNvZWZbcE1ldGFEYXRhLT5tYXRyaXhNaXhkb3duSWR4XSkpOwogICAgICBtaXhGYWN0b3JzW0NFTlRFUl9GUk9OVF9DSEFOTkVMXVtMRUZUX1JFQVJfQ0hBTk5FTF0gICAgPSBtb25vTWl4TGV2ZWw7CiAgICAgIG1peEZhY3RvcnNbQ0VOVEVSX0ZST05UX0NIQU5ORUxdW1JJR0hUX1JFQVJfQ0hBTk5FTF0gICA9IG1vbm9NaXhMZXZlbDsKICAgIH0KICAgIGVsc2UKI2VuZGlmCiAgICB7IC8qIEMnID0gTCArIFI7IFtkZWZhdWx0XSAqLwogICAgICBtb25vTWl4TGV2ZWwgPSBGTDJGWENPTlNUX0RNWCgwLjVmKTsKICAgICAgbW9ub01peFNjYWxlID0gMTsKICAgICAgZG14Q2xlYXJDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIENFTlRFUl9GUk9OVF9DSEFOTkVMICk7ICAvKiBDIGlzIG5vdCBpbiB0aGUgbWl4ICovCiAgICAgIGRteFNldENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgQ0VOVEVSX0ZST05UX0NIQU5ORUwsIExFRlRfRlJPTlRfQ0hBTk5FTCwgIG1vbm9NaXhMZXZlbCwgbW9ub01peFNjYWxlICk7CiAgICAgIGRteEFkZENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgQ0VOVEVSX0ZST05UX0NIQU5ORUwsIFJJR0hUX0ZST05UX0NIQU5ORUwsIG1vbm9NaXhMZXZlbCwgbW9ub01peFNjYWxlICk7CiAgICB9CgogICAgLyogTWFyayB0aGUgb3V0cHV0IGNoYW5uZWwgKi8KICAgIEZES21lbWNsZWFyKHZhbGlkLCBQQ01fRE1YX01BWF9DSEFOTkVMUypzaXplb2YodW5zaWduZWQgaW50KSk7CiAgICB2YWxpZFtDRU5URVJfRlJPTlRfQ0hBTk5FTF0gPSAxOwogIH0KCiNkZWZpbmUgTUFYX1NFQVJDSF9TVEFSVF9WQUwgICggLTcgKQoKICB7CiAgICBMT05HIGNoU3VtW1BDTV9ETVhfTUFYX0NIQU5ORUxTXTsKICAgIElOVCAgY2hTdW1NYXggPSBNQVhfU0VBUkNIX1NUQVJUX1ZBTDsKCiAgICAvKiBEZXRlcm1pbmUgdGhlIGN1cnJlbnQgbWF4aW11bSBzY2FsZSBmYWN0b3IgKi8KICAgIGZvciAob3V0Q2g9MDsgb3V0Q2ggPCBQQ01fRE1YX01BWF9DSEFOTkVMUzsgb3V0Q2grPTEpIHsKICAgICAgaWYgKHZhbGlkW291dENoXSE9MCkgewogICAgICAgIGZvciAoaW5DaD0wOyBpbkNoIDwgUENNX0RNWF9NQVhfQ0hBTk5FTFM7IGluQ2grPTEpIHsKICAgICAgICAgIGlmIChtaXhTY2FsZXNbb3V0Q2hdW2luQ2hdID4gbWF4U2NhbGUpCiAgICAgICAgICB7IC8qIFN0b3JlIHRoZSBuZXcgbWF4aW11bSAqLwogICAgICAgICAgICBtYXhTY2FsZSA9IG1peFNjYWxlc1tvdXRDaF1baW5DaF07CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgLyogSW5kaXZpZHVhbHkgYW5hbHlzZSBvdXRwdXQgY2hhbmFsIGxldmVscyAqLwogICAgZm9yIChvdXRDaD0wOyBvdXRDaCA8IFBDTV9ETVhfTUFYX0NIQU5ORUxTOyBvdXRDaCs9MSkgewogICAgICBjaFN1bVtvdXRDaF0gPSBNQVhfU0VBUkNIX1NUQVJUX1ZBTDsKICAgICAgaWYgKHZhbGlkW291dENoXSE9MCkgewogICAgICAgIGludCAgb3ZyZmx3UHJvdFNjYWxlID0gMDsKCiAgICAgICAgLyogQWNjdW11bGF0ZSBhbGwgZmFjdG9ycyBmb3IgZWFjaCBvdXRwdXQgY2hhbm5lbCAqLwogICAgICAgIGNoU3VtW291dENoXSA9IDA7CiAgICAgICAgZm9yIChpbkNoPTA7IGluQ2ggPCBQQ01fRE1YX01BWF9DSEFOTkVMUzsgaW5DaCs9MSkgewogICAgICAgICAgU0hPUlQgYWRkRmFjdCA9IEZYX0RNWDJTSFJUKG1peEZhY3RvcnNbb3V0Q2hdW2luQ2hdKTsKICAgICAgICAgIGlmICggbWl4U2NhbGVzW291dENoXVtpbkNoXSA8PSBtYXhTY2FsZSApIHsKICAgICAgICAgICAgYWRkRmFjdCA+Pj0gbWF4U2NhbGUgLSBtaXhTY2FsZXNbb3V0Q2hdW2luQ2hdOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgYWRkRmFjdCA8PD0gbWl4U2NhbGVzW291dENoXVtpbkNoXSAtIG1heFNjYWxlOwogICAgICAgICAgfQogICAgICAgICAgY2hTdW1bb3V0Q2hdICs9IGFkZEZhY3Q7CiAgICAgICAgfQogICAgICAgIGlmIChjaFN1bVtvdXRDaF0gPiAoTE9ORylNQVhWQUxfU0dMKSB7CiAgICAgICAgICB3aGlsZSAoY2hTdW1bb3V0Q2hdID4gKExPTkcpTUFYVkFMX1NHTCkgewogICAgICAgICAgICBvdnJmbHdQcm90U2NhbGUgKz0gMTsKICAgICAgICAgICAgY2hTdW1bb3V0Q2hdID4+PSAxOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoY2hTdW1bb3V0Q2hdID4gMCkgewogICAgICAgICAgd2hpbGUgKChjaFN1bVtvdXRDaF08PDEpIDw9IChMT05HKU1BWFZBTF9TR0wpIHsKICAgICAgICAgICAgb3ZyZmx3UHJvdFNjYWxlIC09IDE7CiAgICAgICAgICAgIGNoU3VtW291dENoXSA8PD0gMTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyogU3RvcmUgdGhlIGRpZmZlcmVudGlhbCBzY2FsaW5nIGluIHRoZSBzYW1lIGFycmF5ICovCiAgICAgICAgY2hTdW1bb3V0Q2hdID0gb3ZyZmx3UHJvdFNjYWxlOwogICAgICB9CiAgICB9CgogICAgZm9yIChvdXRDaD0wOyBvdXRDaCA8IFBDTV9ETVhfTUFYX0NIQU5ORUxTOyBvdXRDaCs9MSkgewogICAgICBpZiAoICh2YWxpZFtvdXRDaF0gIT0gMCkKICAgICAgICAmJiAoY2hTdW1bb3V0Q2hdID4gY2hTdW1NYXgpICkKICAgICAgeyAvKiBTdG9yZSB0aGUgbmV3IG1heGltdW0gKi8KICAgICAgICBjaFN1bU1heCA9IGNoU3VtW291dENoXTsKICAgICAgfQogICAgfQogICAgbWF4U2NhbGUgPSBGREttYXgobWF4U2NhbGUrY2hTdW1NYXgsIDApOwoKICAgIC8qIE5vcm1hbGl6ZSBhbGwgZmFjdG9ycyAqLwogICAgZm9yIChvdXRDaD0wOyBvdXRDaCA8IFBDTV9ETVhfTUFYX0NIQU5ORUxTOyBvdXRDaCs9MSkgewogICAgICBpZiAodmFsaWRbb3V0Q2hdIT0wKSB7CiAgICAgICAgZm9yIChpbkNoPTA7IGluQ2ggPCBQQ01fRE1YX01BWF9DSEFOTkVMUzsgaW5DaCs9MSkgewogICAgICAgICAgaWYgKG1peEZhY3RvcnNbb3V0Q2hdW2luQ2hdICE9IChGSVhQX0RNWCkwKSB7CiAgICAgICAgICAgIGlmICggbWl4U2NhbGVzW291dENoXVtpbkNoXSA8PSBtYXhTY2FsZSApIHsKICAgICAgICAgICAgICBtaXhGYWN0b3JzW291dENoXVtpbkNoXSA+Pj0gbWF4U2NhbGUgLSBtaXhTY2FsZXNbb3V0Q2hdW2luQ2hdOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIG1peEZhY3RvcnNbb3V0Q2hdW2luQ2hdIDw8PSBtaXhTY2FsZXNbb3V0Q2hdW2luQ2hdIC0gbWF4U2NhbGU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbWl4U2NhbGVzW291dENoXVtpbkNoXSA9IG1heFNjYWxlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KCgogIC8qIHJldHVybiB0aGUgc2NhbGUgZmFjdG9yICovCiAgKnBPdXRTY2FsZSA9IG1heFNjYWxlOwoKICByZXR1cm4gKGVycik7Cn0KCgovKiogT3BlbiBhbmQgaW5pdGlhbGl6ZSBhbiBpbnN0YW5jZSBvZiB0aGUgUENNIGRvd25taXggbW9kdWxlCiAqIEBwYXJhbSBbb3V0XSBQb2ludGVyIHRvIGEgYnVmZmVyIHJlY2VpdmluZyB0aGUgaGFuZGxlIG9mIHRoZSBuZXcgaW5zdGFuY2UuCiAqIEByZXR1cm5zIFJldHVybnMgYW4gZXJyb3IgY29kZS4KICoqLwpQQ01ETVhfRVJST1IgcGNtRG14X09wZW4gKAogICAgSEFORExFX1BDTV9ET1dOTUlYICpwU2VsZgogICkKewogIEhBTkRMRV9QQ01fRE9XTk1JWCBzZWxmOwogIAogIGlmIChwU2VsZiA9PSBOVUxMKSB7CiAgICByZXR1cm4gKFBDTURNWF9JTlZBTElEX0hBTkRMRSk7CiAgfQoKICAqcFNlbGYgPSBOVUxMOwoKICBzZWxmID0gKEhBTkRMRV9QQ01fRE9XTk1JWCkgR2V0UGNtRG14SW5zdGFuY2UoIDAgKTsKICBpZiAoc2VsZiA9PSBOVUxMKSB7CiAgICByZXR1cm4gKFBDTURNWF9PVVRfT0ZfTUVNT1JZKTsKICB9CgogIC8qIFJlc2V0IHRoZSBmdWxsIGluc3RhbmNlICovCiAgcGNtRG14X1Jlc2V0KCBzZWxmLCBQQ01ETVhfUkVTRVRfRlVMTCApOwoKICAqcFNlbGYgPSBzZWxmOwoKICByZXR1cm4gKFBDTURNWF9PSyk7Cn0KCgovKiogUmVzZXQgYWxsIHN0YXRpYyB2YWx1ZXMgbGlrZSBlLmcuIG1peGRvd24gY29lZmZpY2llbnRzLgogKiBAcGFyYW0gW2luXSBIYW5kbGUgb2YgUENNIGRvd25taXggbW9kdWxlIGluc3RhbmNlLgogKiBAcGFyYW0gW2luXSBGbGFncyB0ZWxsaW5nIHdoaWNoIHBhcnRzIG9mIHRoZSBtb2R1bGUgc2hhbGwgYmUgcmVzZXQuCiAqIEByZXR1cm5zIFJldHVybnMgYW4gZXJyb3IgY29kZS4KICoqLwpQQ01ETVhfRVJST1IgcGNtRG14X1Jlc2V0ICgKICAgIEhBTkRMRV9QQ01fRE9XTk1JWCAgc2VsZiwKICAgIFVJTlQgICAgICAgICAgICAgICAgZmxhZ3MKICApCnsKICBpZiAoc2VsZiA9PSBOVUxMKSB7IHJldHVybiAoUENNRE1YX0lOVkFMSURfSEFORExFKTsgfQoKICBpZiAoZmxhZ3MgJiBQQ01ETVhfUkVTRVRfUEFSQU1TKSB7CiAgICBQQ01fRE1YX1VTRVJfUEFSQU1TICpwUGFyYW1zID0gJnNlbGYtPnVzZXJQYXJhbXM7CgogICAgcFBhcmFtcy0+ZHVhbENoYW5uZWxNb2RlICAgPSBTVEVSRU9fTU9ERTsKICAgIHBQYXJhbXMtPnBzZXVkb1N1cnJNb2RlICAgID0gTkVWRVJfRE9fUFNfRE1YOwogICAgcFBhcmFtcy0+bnVtT3V0Q2hhbm5lbHNNYXggPSBQQ01fRE1YX0RGTFRfTUFYX09VVF9DSEFOTkVMUzsKICAgIHBQYXJhbXMtPm51bU91dENoYW5uZWxzTWluID0gUENNX0RNWF9ERkxUX01JTl9PVVRfQ0hBTk5FTFM7CiAgICBwUGFyYW1zLT5mcmFtZURlbGF5ICAgICAgICA9IDA7CiAgICBwUGFyYW1zLT5leHBpcnlGcmFtZSAgICAgICA9IFBDTV9ETVhfREZMVF9FWFBJUllfRlJBTUU7CgogICAgc2VsZi0+YXBwbHlQcm9jZXNzaW5nICAgICAgPSAwOwogIH0KCiAgaWYgKGZsYWdzICYgUENNRE1YX1JFU0VUX0JTX0RBVEEpIHsKICAgIGludCBzbG90OwogICAgLyogSW5pdCBhbGwgc2xvdHMgd2l0aCBhIGRlZmF1bHQgc2V0ICovCiAgICBmb3IgKHNsb3QgPSAwOyBzbG90IDw9IFBDTV9ETVhfTUFYX0RFTEFZX0ZSQU1FUzsgc2xvdCArPSAxKSB7CiAgICAgIEZES21lbWNweSgmc2VsZi0+YnNNZXRhRGF0YVtzbG90XSwgJmRmbHRNZXRhRGF0YSwgc2l6ZW9mKERNWF9CU19NRVRBX0RBVEEpKTsKICAgIH0KICB9CgogIHJldHVybiAoUENNRE1YX09LKTsKfQoKCi8qKiBTZXQgb25lIHBhcmFtZXRlciBmb3Igb25lIGluc3RhbmNlIG9mIHRoZSBQQ00gZG93bm1peCBtb2R1bGUuCiAqIEBwYXJhbSBbaW5dIEhhbmRsZSBvZiBQQ00gZG93bm1peCBtb2R1bGUgaW5zdGFuY2UuCiAqIEBwYXJhbSBbaW5dIFBhcmFtZXRlciB0byBiZSBzZXQuCiAqIEBwYXJhbSBbaW5dIFBhcmFtZXRlciB2YWx1ZS4KICogQHJldHVybnMgUmV0dXJucyBhbiBlcnJvciBjb2RlLgogKiovClBDTURNWF9FUlJPUiBwY21EbXhfU2V0UGFyYW0gKAogICAgSEFORExFX1BDTV9ET1dOTUlYICBzZWxmLAogICAgY29uc3QgUENNRE1YX1BBUkFNICBwYXJhbSwKICAgIGNvbnN0IElOVCAgICAgICAgICAgdmFsdWUKICApCnsKICBzd2l0Y2ggKHBhcmFtKQogIHsKICBjYXNlIERNWF9CU19EQVRBX0VYUElSWV9GUkFNRToKICAgIGlmIChzZWxmID09IE5VTEwpCiAgICAgIHJldHVybiAoUENNRE1YX0lOVkFMSURfSEFORExFKTsKICAgIHNlbGYtPnVzZXJQYXJhbXMuZXhwaXJ5RnJhbWUgPSAodmFsdWUgPiAwKSA/IChVSU5UKXZhbHVlIDogMDsKICAgIGJyZWFrOwoKICBjYXNlIERNWF9CU19EQVRBX0RFTEFZOgogICAgaWYgKCAodmFsdWUgPiBQQ01fRE1YX01BWF9ERUxBWV9GUkFNRVMpCiAgICAgIHx8ICh2YWx1ZSA8IDApICkgewogICAgICByZXR1cm4gKFBDTURNWF9VTkFCTEVfVE9fU0VUX1BBUkFNKTsKICAgIH0KICAgIGlmIChzZWxmID09IE5VTEwpIHsKICAgICAgcmV0dXJuIChQQ01ETVhfSU5WQUxJRF9IQU5ETEUpOwogICAgfQogICAgc2VsZi0+dXNlclBhcmFtcy5mcmFtZURlbGF5ID0gKFVDSEFSKXZhbHVlOwogICAgYnJlYWs7CgogIGNhc2UgTUlOX05VTUJFUl9PRl9PVVRQVVRfQ0hBTk5FTFM6CiAgICBzd2l0Y2ggKHZhbHVlKSB7ICAvKiBzdXBwb3J0ZWQgb3V0cHV0IGNoYW5uZWxzICovCiAgICBjYXNlIC0xOiBjYXNlIDA6IGNhc2UgT05FX0NIQU5ORUw6IGNhc2UgVFdPX0NIQU5ORUw6CiNpZiAoUENNX0RNWF9NQVhfT1VUX0NIQU5ORUxTID49IDYpCiAgICBjYXNlIFNJWF9DSEFOTkVMOgojZW5kaWYKI2lmIChQQ01fRE1YX01BWF9PVVRfQ0hBTk5FTFMgPj0gOCkKICAgIGNhc2UgRUlHSFRfQ0hBTk5FTDoKI2VuZGlmCiAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgcmV0dXJuIChQQ01ETVhfVU5BQkxFX1RPX1NFVF9QQVJBTSk7CiAgICB9CiAgICBpZiAoc2VsZiA9PSBOVUxMKQogICAgICByZXR1cm4gKFBDTURNWF9JTlZBTElEX0hBTkRMRSk7CiAgICAvKiBTdG9yZSB0aGUgbmV3IHZhbHVlICovCiAgICBzZWxmLT51c2VyUGFyYW1zLm51bU91dENoYW5uZWxzTWluID0gKHZhbHVlID4gMCkgPyB2YWx1ZSA6IC0xOwogICAgaWYgKCAodmFsdWUgPiAwKQogICAgICAmJiAoc2VsZi0+dXNlclBhcmFtcy5udW1PdXRDaGFubmVsc01heCA+IDApCiAgICAgICYmICh2YWx1ZSA+IHNlbGYtPnVzZXJQYXJhbXMubnVtT3V0Q2hhbm5lbHNNYXgpICkKICAgIHsgLyogTUlOID4gTUFYIHdvdWxkIGJlIGFuIGludmFsaWQgc3RhdGUuIFRodXMgc2V0IE1BWCA9IE1JTiBpbiB0aGlzIGNhc2UuICovCiAgICAgIHNlbGYtPnVzZXJQYXJhbXMubnVtT3V0Q2hhbm5lbHNNYXggPSBzZWxmLT51c2VyUGFyYW1zLm51bU91dENoYW5uZWxzTWluOwogICAgfQogICAgYnJlYWs7CgogIGNhc2UgTUFYX05VTUJFUl9PRl9PVVRQVVRfQ0hBTk5FTFM6CiAgICBzd2l0Y2ggKHZhbHVlKSB7ICAvKiBzdXBwb3J0ZWQgb3V0cHV0IGNoYW5uZWxzICovCiAgICBjYXNlIC0xOiBjYXNlIDA6IGNhc2UgT05FX0NIQU5ORUw6IGNhc2UgVFdPX0NIQU5ORUw6CiNpZiAoUENNX0RNWF9NQVhfT1VUX0NIQU5ORUxTID49IDYpCiAgICBjYXNlIFNJWF9DSEFOTkVMOgojZW5kaWYKI2lmIChQQ01fRE1YX01BWF9PVVRfQ0hBTk5FTFMgPj0gOCkKICAgIGNhc2UgRUlHSFRfQ0hBTk5FTDoKI2VuZGlmCiAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgcmV0dXJuIChQQ01ETVhfVU5BQkxFX1RPX1NFVF9QQVJBTSk7CiAgICB9CiAgICBpZiAoc2VsZiA9PSBOVUxMKQogICAgICByZXR1cm4gKFBDTURNWF9JTlZBTElEX0hBTkRMRSk7CiAgICAvKiBTdG9yZSB0aGUgbmV3IHZhbHVlICovCiAgICBzZWxmLT51c2VyUGFyYW1zLm51bU91dENoYW5uZWxzTWF4ID0gKHZhbHVlID4gMCkgPyB2YWx1ZSA6IC0xOwogICAgaWYgKCAodmFsdWUgPiAwKQogICAgICAmJiAodmFsdWUgPCBzZWxmLT51c2VyUGFyYW1zLm51bU91dENoYW5uZWxzTWluKSApCiAgICB7IC8qIE1BWCA8IE1JTiB3b3VsZCBiZSBhbiBpbnZhbGlkIHN0YXRlLiBUaHVzIHNldCBNSU4gPSBNQVggaW4gdGhpcyBjYXNlLiAqLwogICAgICBzZWxmLT51c2VyUGFyYW1zLm51bU91dENoYW5uZWxzTWluID0gc2VsZi0+dXNlclBhcmFtcy5udW1PdXRDaGFubmVsc01heDsKICAgIH0KICAgIGJyZWFrOwoKICBjYXNlIERNWF9EVUFMX0NIQU5ORUxfTU9ERToKICAgIHN3aXRjaCAoKERVQUxfQ0hBTk5FTF9NT0RFKXZhbHVlKSB7CiAgICBjYXNlIFNURVJFT19NT0RFOgogICAgY2FzZSBDSDFfTU9ERToKICAgIGNhc2UgQ0gyX01PREU6CiAgICBjYXNlIE1JWEVEX01PREU6CiAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgcmV0dXJuIChQQ01ETVhfVU5BQkxFX1RPX1NFVF9QQVJBTSk7CiAgICB9CiAgICBpZiAoc2VsZiA9PSBOVUxMKQogICAgICByZXR1cm4gKFBDTURNWF9JTlZBTElEX0hBTkRMRSk7CiAgICBzZWxmLT51c2VyUGFyYW1zLmR1YWxDaGFubmVsTW9kZSA9IChEVUFMX0NIQU5ORUxfTU9ERSl2YWx1ZTsKICAgIHNlbGYtPmFwcGx5UHJvY2Vzc2luZyA9IDE7ICAvKiBGb3JjZSBwcm9jZXNzaW5nICovCiAgICBicmVhazsKCiAgY2FzZSBETVhfUFNFVURPX1NVUlJPVU5EX01PREU6CiAgICBzd2l0Y2ggKChQU0VVRE9fU1VSUk9VTkRfTU9ERSl2YWx1ZSkgewogICAgY2FzZSBORVZFUl9ET19QU19ETVg6CiAgICBjYXNlIEFVVE9fUFNfRE1YOgogICAgY2FzZSBGT1JDRV9QU19ETVg6CiAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgcmV0dXJuIChQQ01ETVhfVU5BQkxFX1RPX1NFVF9QQVJBTSk7CiAgICB9CiAgICBpZiAoc2VsZiA9PSBOVUxMKQogICAgICByZXR1cm4gKFBDTURNWF9JTlZBTElEX0hBTkRMRSk7CiAgICBzZWxmLT51c2VyUGFyYW1zLnBzZXVkb1N1cnJNb2RlID0gKFBTRVVET19TVVJST1VORF9NT0RFKXZhbHVlOwogICAgYnJlYWs7CgogIGRlZmF1bHQ6CiAgICByZXR1cm4gKFBDTURNWF9VTktOT1dOX1BBUkFNKTsKICB9CgogIHJldHVybiAoUENNRE1YX09LKTsKfQoKLyoqIEdldCBvbmUgcGFyYW1ldGVyIHZhbHVlIG9mIG9uZSBQQ00gZG93bm1peCBtb2R1bGUgaW5zdGFuY2UuCiAqIEBwYXJhbSBbaW5dIEhhbmRsZSBvZiBQQ00gZG93bm1peCBtb2R1bGUgaW5zdGFuY2UuCiAqIEBwYXJhbSBbaW5dIFBhcmFtZXRlciB0byBiZSBzZXQuCiAqIEBwYXJhbSBbb3V0XSBQb2ludGVyIHRvIGJ1ZmZlciByZWNlaXZpbmcgdGhlIHBhcmFtZXRlciB2YWx1ZS4KICogQHJldHVybnMgUmV0dXJucyBhbiBlcnJvciBjb2RlLgogKiovClBDTURNWF9FUlJPUiBwY21EbXhfR2V0UGFyYW0gKAogICAgSEFORExFX1BDTV9ET1dOTUlYICBzZWxmLAogICAgY29uc3QgUENNRE1YX1BBUkFNICBwYXJhbSwKICAgIElOVCAqIGNvbnN0ICAgICAgICAgcFZhbHVlCiAgKQp7CiAgUENNX0RNWF9VU0VSX1BBUkFNUyAqcFVzclBhcmFtczsKCiAgaWYgKCAoc2VsZiA9PSBOVUxMKQogICAgfHwgKHBWYWx1ZSA9PSBOVUxMKSApIHsKICAgIHJldHVybiAoUENNRE1YX0lOVkFMSURfSEFORExFKTsKICB9CiAgcFVzclBhcmFtcyA9ICZzZWxmLT51c2VyUGFyYW1zOwoKICBzd2l0Y2ggKHBhcmFtKQogIHsKICBjYXNlIERNWF9CU19EQVRBX0VYUElSWV9GUkFNRToKICAgICpwVmFsdWUgPSAoSU5UKXBVc3JQYXJhbXMtPmV4cGlyeUZyYW1lOwogICAgYnJlYWs7CiAgY2FzZSBETVhfQlNfREFUQV9ERUxBWToKICAgICpwVmFsdWUgPSAoSU5UKXBVc3JQYXJhbXMtPmZyYW1lRGVsYXk7CiAgICBicmVhazsKICBjYXNlIE1JTl9OVU1CRVJfT0ZfT1VUUFVUX0NIQU5ORUxTOgogICAgKnBWYWx1ZSA9IChJTlQpcFVzclBhcmFtcy0+bnVtT3V0Q2hhbm5lbHNNaW47CiAgICBicmVhazsKICBjYXNlIE1BWF9OVU1CRVJfT0ZfT1VUUFVUX0NIQU5ORUxTOgogICAgKnBWYWx1ZSA9IChJTlQpcFVzclBhcmFtcy0+bnVtT3V0Q2hhbm5lbHNNYXg7CiAgICBicmVhazsKICBjYXNlIERNWF9EVUFMX0NIQU5ORUxfTU9ERToKICAgICpwVmFsdWUgPSAoSU5UKXBVc3JQYXJhbXMtPmR1YWxDaGFubmVsTW9kZTsKICAgIGJyZWFrOwogIGNhc2UgRE1YX1BTRVVET19TVVJST1VORF9NT0RFOgogICAgKnBWYWx1ZSA9IChJTlQpcFVzclBhcmFtcy0+cHNldWRvU3Vyck1vZGU7CiAgICBicmVhazsKICBkZWZhdWx0OgogICAgcmV0dXJuIChQQ01ETVhfVU5LTk9XTl9QQVJBTSk7CiAgfQoKICByZXR1cm4gKFBDTURNWF9PSyk7Cn0KCgojaWZkZWYgRFNFX01FVEFEQVRBX0VOQUJMRQoKI2RlZmluZSBNQVhfRFNFX0FOQ19CWVRFUyAgICAgICAoIDE2ICkgICAgLyogMTUgYnl0ZXMgKi8KI2RlZmluZSBBTkNfREFUQV9TWU5DX0JZVEUgICAgICAoIDB4QkMgKSAgLyogYW5jaWxsYXJ5IGRhdGEgc3luYyBieXRlLiAqLwoKLyoKICogUmVhZCBETVggbWV0YS1kYXRhIGZyb20gYSBkYXRhIHN0cmVhbSBlbGVtZW50LgogKi8KUENNRE1YX0VSUk9SIHBjbURteF9QYXJzZSAoCiAgICBIQU5ETEVfUENNX0RPV05NSVggIHNlbGYsCiAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSAgaEJzLAogICAgVUlOVCAgYW5jRGF0YUJpdHMsCiAgICBpbnQgICAgaXNNcGVnMgogICkKewogIFBDTURNWF9FUlJPUiBlcnJvclN0YXR1cyA9IFBDTURNWF9PSzsKICBETVhfQlNfTUVUQV9EQVRBICpwQnNNZXRhRGF0YSA9ICZzZWxmLT5ic01ldGFEYXRhWzBdOwoKICBpbnQgICBza2lwNERteCA9IDAsIHNraXA0RXh0ID0gMDsKICBpbnQgICBkbXhMdmxBdmFpbCA9IDAsIGV4dERhdGFBdmFpbCA9IDA7CiAgaW50ICAgZm91bmROZXdEYXRhID0gMDsKICBVSU5UICBtaW5BbmNCaXRzID0gKChpc01wZWcyKSA/IDUgOiAzKSo4OwoKICBpZiAoIChzZWxmID09IE5VTEwpCiAgICB8fCAoaEJzICA9PSBOVUxMKSApIHsgcmV0dXJuIChQQ01ETVhfSU5WQUxJRF9IQU5ETEUpOyB9CgogIGFuY0RhdGFCaXRzID0gRkRLZ2V0VmFsaWRCaXRzKGhCcyk7CgogIC8qIHNhbml0eSBjaGVja3MgKi8KICBpZiAoIChhbmNEYXRhQml0cyA8IG1pbkFuY0JpdHMpCiAgICB8fCAoYW5jRGF0YUJpdHMgPiBGREtnZXRWYWxpZEJpdHMoaEJzKSkgKSB7CiAgICByZXR1cm4gKFBDTURNWF9DT1JSVVBUX0FOQ19EQVRBKTsKICB9CgogIHBCc01ldGFEYXRhID0gJnNlbGYtPmJzTWV0YURhdGFbMF07CgogIGlmIChpc01wZWcyKSB7CiAgICAvKiBza2lwIERWRCBhbmNpbGxhcnkgZGF0YSAqLwogICAgRkRLcHVzaEZvcihoQnMsIDE2KTsKICB9CgogIC8qIGNoZWNrIHN5bmMgd29yZCAqLwogIGlmIChGREtyZWFkQml0cyhoQnMsOCkgIT0gQU5DX0RBVEFfU1lOQ19CWVRFKSB7CiAgICByZXR1cm4gKFBDTURNWF9DT1JSVVBUX0FOQ19EQVRBKTsKICB9CgogIC8qIHNraXAgTVBFRyBhdWRpbyB0eXBlIGFuZCBEb2xieSBzdXJyb3VuZCBtb2RlICovCiAgRkRLcHVzaEZvcihoQnMsIDQpOwoKICBpZiAoaXNNcGVnMikgewogICAgLyogaW50IG51bUFuY0J5dGVzID0gKi8gRkRLcmVhZEJpdHMoaEJzLCA0KTsKICAgIC8qIGFkdmFuY2VkIGR5bmFtaWMgcmFuZ2UgY29udHJvbCAqLwogICAgaWYgKEZES3JlYWRCaXQoaEJzKSkgc2tpcDREbXggKz0gMjQ7CiAgICAvKiBkaWFsb2cgbm9ybWFsaXphdGlvbiAqLwogICAgaWYgKEZES3JlYWRCaXQoaEJzKSkgc2tpcDREbXggKz0gODsKICAgIC8qIHJlcHJvZHVjdGlvbl9sZXZlbCAqLwogICAgaWYgKEZES3JlYWRCaXQoaEJzKSkgc2tpcDREbXggKz0gODsKICB9IGVsc2UgewogICAgRkRLcHVzaEZvcihoQnMsIDIpOyAgIC8qIGRyYyBwcmVzZW50YXRpb24gbW9kZSAqLwogICAgcEJzTWV0YURhdGEtPnBzZXVkb1N1cnJvdW5kID0gRkRLcmVhZEJpdChoQnMpOwogICAgRkRLcHVzaEZvcihoQnMsIDQpOyAgIC8qIHJlc2VydmVkIGJpdHMgKi8KICB9CgogIC8qIGRvd25taXhpbmcgbGV2ZWxzIE1QRUd4IHN0YXR1cyAqLwogIGRteEx2bEF2YWlsICA9IEZES3JlYWRCaXQoaEJzKTsKCiAgaWYgKGlzTXBlZzIpIHsKICAgIC8qIHNjYWxlIGZhY3RvciBDUkMgc3RhdHVzICovCiAgICBpZiAoRkRLcmVhZEJpdChoQnMpKSBza2lwNEV4dCArPSAxNjsKICB9IGVsc2UgewogICAgLyogYW5jaWxsYXJ5IGRhdGEgZXh0ZW5zaW9uIHN0YXR1cyAqLwogICAgZXh0RGF0YUF2YWlsID0gRkRLcmVhZEJpdChoQnMpOwogIH0KCiAgLyogYXVkaW8gY29kaW5nIGFuZCBjb21wcmVzc2lvbiBzdGF0dXMgKi8KICBpZiAoRkRLcmVhZEJpdChoQnMpKSBza2lwNEV4dCArPSAxNjsKICAvKiBjb2Fyc2UgZ3JhaW4gdGltZWNvZGUgc3RhdHVzICovCiAgaWYgKEZES3JlYWRCaXQoaEJzKSkgc2tpcDRFeHQgKz0gMTY7CiAgLyogZmluZSBncmFpbiB0aW1lY29kZSBzdGF0dXMgKi8KICBpZiAoRkRLcmVhZEJpdChoQnMpKSBza2lwNEV4dCArPSAxNjsKCiAgLyogc2tpcCB0aGUgdXNlbGVzcyBkYXRhIHRvIGdldCB0byB0aGUgRE1YIGxldmVscyAqLwogIEZES3B1c2hGb3IoaEJzLCBza2lwNERteCk7CgogIC8qIGRvd25taXhfbGV2ZWxzX01QRUdYICovCiAgaWYgKGRteEx2bEF2YWlsKQogIHsKICAgIGlmIChGREtyZWFkQml0KGhCcykpIHsgIC8qIGNlbnRlcl9taXhfbGV2ZWxfb24gKi8KICAgICAgcEJzTWV0YURhdGEtPmNMZXZJZHggPSBGREtyZWFkQml0cyhoQnMsIDMpOwogICAgICBmb3VuZE5ld0RhdGEgPSAxOwogICAgfSBlbHNlIHsKICAgICAgRkRLcmVhZEJpdHMoaEJzLCAzKTsKICAgIH0KICAgIGlmIChGREtyZWFkQml0KGhCcykpIHsgIC8qIHN1cnJvdW5kX21peF9sZXZlbF9vbiAqLwogICAgICBwQnNNZXRhRGF0YS0+c0xldklkeCA9IEZES3JlYWRCaXRzKGhCcywgMyk7CiAgICAgIGZvdW5kTmV3RGF0YSA9IDE7CiAgICB9IGVsc2UgewogICAgICBGREtyZWFkQml0cyhoQnMsIDMpOwogICAgfQogIH0KCiAgLyogc2tpcCB0aGUgdXNlbGVzcyBkYXRhIHRvIGdldCB0byB0aGUgYW5jaWxsYXJ5IGRhdGEgZXh0ZW5zaW9uICovCiAgRkRLcHVzaEZvcihoQnMsIHNraXA0RXh0KTsKCiAgLyogYW5jIGRhdGEgZXh0ZW5zaW9uIChNUEVHLTQgb25seSkgKi8KICBpZiAoZXh0RGF0YUF2YWlsKSB7CiAgICBpbnQgZXh0RG14THZsU3QsIGV4dERteEdhaW5TdCwgZXh0RG14TGZlU3Q7CgogICAgRkRLcmVhZEJpdChoQnMpOyAgICAgICAgLyogcmVzZXJ2ZWQgYml0ICovCiAgICBleHREbXhMdmxTdCAgPSBGREtyZWFkQml0KGhCcyk7CiAgICBleHREbXhHYWluU3QgPSBGREtyZWFkQml0KGhCcyk7CiAgICBleHREbXhMZmVTdCAgPSBGREtyZWFkQml0KGhCcyk7CiAgICBGREtyZWFkQml0cyhoQnMsIDQpOyAgICAvKiByZXNlcnZlZCBiaXRzICovCgogICAgaWYgKGV4dERteEx2bFN0KSB7CiAgICAgIHBCc01ldGFEYXRhLT5kbWl4SWR4QSA9IEZES3JlYWRCaXRzKGhCcywgMyk7CiAgICAgIHBCc01ldGFEYXRhLT5kbWl4SWR4QiA9IEZES3JlYWRCaXRzKGhCcywgMyk7CiAgICAgIEZES3JlYWRCaXRzKGhCcywgMik7ICAvKiByZXNlcnZlZCBiaXRzICovCiAgICAgIGZvdW5kTmV3RGF0YSA9IDE7CiAgICB9CiAgICBpZiAoZXh0RG14R2FpblN0KSB7CiAgICAgIHBCc01ldGFEYXRhLT5kbXhHYWluSWR4NSA9IEZES3JlYWRCaXRzKGhCcywgNyk7CiAgICAgIEZES3JlYWRCaXQoaEJzKTsgICAgICAvKiByZXNlcnZlZCBiaXQgKi8KICAgICAgcEJzTWV0YURhdGEtPmRteEdhaW5JZHgyID0gRkRLcmVhZEJpdHMoaEJzLCA3KTsKICAgICAgRkRLcmVhZEJpdChoQnMpOyAgICAgIC8qIHJlc2VydmVkIGJpdCAqLwogICAgICBmb3VuZE5ld0RhdGEgPSAxOwogICAgfQogICAgaWYgKGV4dERteExmZVN0KSB7CiAgICAgIHBCc01ldGFEYXRhLT5kbWl4SWR4TGZlID0gRkRLcmVhZEJpdHMoaEJzLCA0KTsKICAgICAgRkRLcmVhZEJpdHMoaEJzLCA0KTsgIC8qIHJlc2VydmVkIGJpdHMgKi8KICAgICAgZm91bmROZXdEYXRhID0gMTsKICAgIH0KICB9CgogIC8qIGZpbmFsIHNhbml0eSBjaGVjayBvbiB0aGUgYW1vdW50IG9mIHJlYWQgZGF0YSAqLwogIGlmICgoSU5UKUZES2dldFZhbGlkQml0cyhoQnMpIDwgMCkgewogICAgZXJyb3JTdGF0dXMgPSBQQ01ETVhfQ09SUlVQVF9BTkNfREFUQTsKICB9CgogIGlmICggKGVycm9yU3RhdHVzICA9PSBQQ01ETVhfT0spCiAgICAmJiAoZm91bmROZXdEYXRhID09IDEpICkgewogICAgLyogYW5ub3VuY2UgbmV3IGRhdGEgKi8KICAgIHBCc01ldGFEYXRhLT50eXBlRmxhZ3MgfD0gVFlQRV9EU0VfREFUQTsKICAgIC8qIHJlc2V0IGV4cGlyeSBjb3VudGVyICovCiAgICBwQnNNZXRhRGF0YS0+ZXhwaXJ5Q291bnQgPSAwOwogIH0KCiAgcmV0dXJuIChlcnJvclN0YXR1cyk7Cn0KCi8qCiAqIFJlYWQgRE1YIG1ldGEtZGF0YSBmcm9tIGEgZGF0YSBzdHJlYW0gZWxlbWVudC4KICovClBDTURNWF9FUlJPUiBwY21EbXhfUmVhZER2YkFuY0RhdGEgKAogICAgSEFORExFX1BDTV9ET1dOTUlYICBzZWxmLAogICAgVUNIQVIgKnBBbmNEYXRhQnVmLAogICAgVUlOVCAgIGFuY0RhdGFCeXRlcywKICAgIGludCAgICBpc01wZWcyCiAgKQp7CiAgRkRLX0JJVFNUUkVBTSBiczsKICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMgPSAmYnM7CiAgUENNRE1YX0VSUk9SIGVycm9yU3RhdHVzID0gUENNRE1YX09LOwoKICBpZiAoc2VsZiA9PSBOVUxMKSB7IHJldHVybiAoUENNRE1YX0lOVkFMSURfSEFORExFKTsgfQoKICAvKiBzYW5pdHkgY2hlY2tzICovCiAgaWYgKCAocEFuY0RhdGFCdWYgPT0gTlVMTCkKICAgIHx8IChhbmNEYXRhQnl0ZXMgPT0gMCkgKSB7CiAgICByZXR1cm4gKFBDTURNWF9DT1JSVVBUX0FOQ19EQVRBKTsKICB9CgogIEZES2luaXRCaXRTdHJlYW0gKGhCcywgcEFuY0RhdGFCdWYsIE1BWF9EU0VfQU5DX0JZVEVTLCBhbmNEYXRhQnl0ZXMqOCwgQlNfUkVBREVSKTsKCiAgZXJyb3JTdGF0dXMgPSBwY21EbXhfUGFyc2UgKAogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLAogICAgICAgICAgICAgICAgICAgICAgICBoQnMsCiAgICAgICAgICAgICAgICAgICAgICAgIGFuY0RhdGFCeXRlcyo4LAogICAgICAgICAgICAgICAgICAgICAgICBpc01wZWcyICk7CgogIHJldHVybiAoZXJyb3JTdGF0dXMpOwp9CiNlbmRpZiAgLyogRFNFX01FVEFEQVRBX0VOQUJMRSAqLwoKI2lmZGVmIFBDRV9NRVRBREFUQV9FTkFCTEUKLyoqIFNldCB0aGUgbWF0cml4IG1peGRvd24gaW5mb3JtYXRpb24gZXh0cmFjdGVkIGZyb20gdGhlIFBDRSBvZiBhbiBBQUMgYml0c3RyZWFtLgogKiAgTm90ZTogQ2FsbCBvbmx5IGlmIG1hdHJpeF9taXhkb3duX2lkeF9wcmVzZW50IGlzIHRydWUuCiAqIEBwYXJhbSBbaW5dIEhhbmRsZSBvZiBQQ00gZG93bm1peCBtb2R1bGUgaW5zdGFuY2UuCiAqIEBwYXJhbSBbaW5dIFRoZSAyIGJpdCBtYXRyaXggbWl4ZG93biBpbmRleCBleHRyYWN0ZWQgZnJvbSBQQ0UuCiAqIEBwYXJhbSBbaW5dIFRoZSBwc2V1ZG8gc3Vycm91bmQgZW5hYmxlIGZsYWcgZXh0cmFjdGVkIGZyb20gUENFLgogKiBAcmV0dXJucyBSZXR1cm5zIGFuIGVycm9yIGNvZGUuCiAqKi8KUENNRE1YX0VSUk9SIHBjbURteF9TZXRNYXRyaXhNaXhkb3duRnJvbVBjZSAoCiAgICBIQU5ETEVfUENNX0RPV05NSVggIHNlbGYsCiAgICBpbnQgICAgICAgICAgICAgICAgIG1hdHJpeE1peGRvd25QcmVzZW50LAogICAgaW50ICAgICAgICAgICAgICAgICBtYXRyaXhNaXhkb3duSWR4LAogICAgaW50ICAgICAgICAgICAgICAgICBwc2V1ZG9TdXJyb3VuZEVuYWJsZQogICkKewogIERNWF9CU19NRVRBX0RBVEEgKnBCc01ldGFEYXRhID0gJnNlbGYtPmJzTWV0YURhdGFbMF07CgogIGlmIChzZWxmID09IE5VTEwpIHsKICAgIHJldHVybiAoUENNRE1YX0lOVkFMSURfSEFORExFKTsKICB9CgogIGlmIChtYXRyaXhNaXhkb3duUHJlc2VudCkgewogICAgcEJzTWV0YURhdGEtPnBzZXVkb1N1cnJvdW5kID0gcHNldWRvU3Vycm91bmRFbmFibGU7CiAgICBwQnNNZXRhRGF0YS0+bWF0cml4TWl4ZG93bklkeCA9IG1hdHJpeE1peGRvd25JZHggJiAweDAzOwogICAgcEJzTWV0YURhdGEtPnR5cGVGbGFncyB8PSBUWVBFX1BDRV9EQVRBOwogICAgLyogUmVzZXQgZXhwaXJ5IGNvdW50ZXIgKi8KICAgIHBCc01ldGFEYXRhLT5leHBpcnlDb3VudCA9IDA7CiAgfQoKICByZXR1cm4gKFBDTURNWF9PSyk7Cn0KI2VuZGlmICAvKiBQQ0VfTUVUQURBVEFfRU5BQkxFICovCgoKLyoqIEFwcGx5IGRvd24gb3IgdXAgbWl4aW5nLgogKiBAcGFyYW0gW2luXSAgICBIYW5kbGUgb2YgUENNIGRvd25taXggbW9kdWxlIGluc3RhbmNlLgogKiBAcGFyYW0gW2lub3V0XSBQb2ludGVyIHRvIGJ1ZmZlciB0aGF0IGhvbGQgdGhlIHRpbWUgZG9tYWluIHNpZ25hbC4KICogQHBhcmFtIFtpbl0gICAgUG9pbnRlciB3aGVyZSB0aGUgYW1vdW50IG9mIG91dHB1dCBzYW1wbGVzIGlzIHJldHVybmVkIGludG8uCiAqIEBwYXJhbSBbaW5vdXRdIFBvaW50ZXIgd2hlcmUgdGhlIGFtb3VudCBvZiBvdXRwdXQgY2hhbm5lbHMgaXMgcmV0dXJuZWQgaW50by4KICogQHBhcmFtIFtpbl0gICAgRmxhZyB3aGljaCBpbmRpY2F0ZXMgaWYgb3V0cHV0IHRpbWUgZGF0YSBhcmUgd3JpdHRlcm4gaW50ZXJsZWF2ZWQgb3IgYXMgc3Vic2VxdWVudCBibG9ja3MuCiAqIEBwYXJhbSBbaW5vdXRdIEFycmF5IHdoZXJlIHRoZSBjb3JyZXNwb25kaW5nIGNoYW5uZWwgdHlwZSBmb3IgZWFjaCBvdXRwdXQgYXVkaW8gY2hhbm5lbCBpcyBzdG9yZWQgaW50by4KICogQHBhcmFtIFtpbm91dF0gQXJyYXkgd2hlcmUgdGhlIGNvcnJlc3BvbmRpbmcgY2hhbm5lbCB0eXBlIGluZGV4IGZvciBlYWNoIG91dHB1dCBhdWRpbyBjaGFubmVsIGlzIHN0b3JlZCBpbnRvLgogKiBAcGFyYW0gW2luXSAgICBBcnJheSBjb250YWluaW5nIHRoZSBvdXQgY2hhbm5lbCBtYXBwaW5nIHRvIGJlIHVzZWQgKEZyb20gTVBFRyBQQ0Ugb3JkZXJpbmcgdG8gd2hhdGV2ZXIgaXMgcmVxdWlyZWQpLgogKiBAcGFyYW0gW291dF0gICBQb2ludGVyIG9uIGEgZmllbGQgcmVjZWl2aW5nIHRoZSBzY2FsZSBmYWN0b3IgdGhhdCBoYXMgdG8gYmUgYXBwbGllZCBvbiBhbGwgc2FtcGxlcyBhZnRlcndhcmRzLgogKiAgICAgICAgICAgICAgICBJZiB0aGUgaGFuZGVkIHBvaW50ZXIgaXMgTlVMTCBzY2FsaW5nIGlzIGRvbmUgaW50ZXJuYWxseS4KICogQHJldHVybnMgUmV0dXJucyBhbiBlcnJvciBjb2RlLgogKiovClBDTURNWF9FUlJPUiBwY21EbXhfQXBwbHlGcmFtZSAoCiAgICAgICAgSEFORExFX1BDTV9ET1dOTUlYICAgICAgc2VsZiwKICAgICAgICBJTlRfUENNICAgICAgICAgICAgICAgICpwUGNtQnVmLAogICAgICAgIFVJTlQgICAgICAgICAgICAgICAgICAgIGZyYW1lU2l6ZSwKICAgICAgICBJTlQgICAgICAgICAgICAgICAgICAgICpuQ2hhbm5lbHMsCiAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgZkludGVybGVhdmVkLAogICAgICAgIEFVRElPX0NIQU5ORUxfVFlQRSAgICAgIGNoYW5uZWxUeXBlW10sCiAgICAgICAgVUNIQVIgICAgICAgICAgICAgICAgICAgY2hhbm5lbEluZGljZXNbXSwKICAgICAgICBjb25zdCBVQ0hBUiAgICAgICAgICAgICBjaGFubmVsTWFwcGluZ1tdWzhdLAogICAgICAgIElOVCAgICAgICAgICAgICAgICAgICAgKnBEbXhPdXRTY2FsZQogICkKewogIFBDTV9ETVhfVVNFUl9QQVJBTVMgICpwUGFyYW0gPSBOVUxMOwogIFBDTURNWF9FUlJPUiAgZXJyb3JTdGF0dXMgPSBQQ01ETVhfT0s7CiAgRFVBTF9DSEFOTkVMX01PREUgIGR1YWxDaGFubmVsTW9kZTsKICBQQ01fRE1YX0NIQU5ORUxfTU9ERSAgaW5DaE1vZGU7CiAgUENNX0RNWF9DSEFOTkVMX01PREUgIG91dENoTW9kZTsKICBJTlQgICBkZXZOdWxsOyAgLyogSnVzdCBhIGR1bW15IHRvIGF2b2lkIGEgbG90IG9mIGJyYW5jaGVzIGluIHRoZSBjb2RlICovCiAgaW50ICAgbnVtT3V0Q2hhbm5lbHMsIG51bUluQ2hhbm5lbHM7CiAgaW50ICAgaW5TdHJpZGUsIG91dFN0cmlkZSwgb2Zmc2V0OwogIGludCAgIGRteE1heFNjYWxlLCBkbXhTY2FsZTsKICBpbnQgICBjaCwgc2xvdDsKICBVQ0hBUiBpbk9mZnNldFRhYmxlW1BDTV9ETVhfTUFYX0NIQU5ORUxTXTsKCiAgRE1YX0JTX01FVEFfREFUQSAgYnNNZXRhRGF0YTsKCiAgaWYgKCAoc2VsZiAgICAgICAgICAgPT0gTlVMTCkKICAgIHx8IChuQ2hhbm5lbHMgICAgICA9PSBOVUxMKQogICAgfHwgKGNoYW5uZWxUeXBlICAgID09IE5VTEwpCiAgICB8fCAoY2hhbm5lbEluZGljZXMgPT0gTlVMTCkKICAgIHx8IChjaGFubmVsTWFwcGluZyA9PSBOVUxMKSApIHsKICAgIHJldHVybiAoUENNRE1YX0lOVkFMSURfSEFORExFKTsKICB9CgogIC8qIEluaXQgdGhlIG91dHB1dCBzY2FsaW5nICovCiAgZG14U2NhbGUgPSAwOwogIGlmIChwRG14T3V0U2NhbGUgIT0gTlVMTCkgewogICAgLyogQXZvaWQgZmluYWwgc2NhbGluZyBpbnRlcm5hbGx5IGFuZCBoYW5kIGl0IHRvIHRoZSBvdXRzaWRlIHdvcmxkLiAqLwogICAgKnBEbXhPdXRTY2FsZSA9IDA7CiAgICBkbXhNYXhTY2FsZSA9IFBDTURNWF9NQVhfSEVBRFJPT007CiAgfSBlbHNlIHsKICAgIC8qIEFwcGx5IHRoZSBzY2FsaW5nIGludGVybmFsbHkuICovCiAgICBwRG14T3V0U2NhbGUgPSAmZGV2TnVsbDsgIC8qIHJlZGlyZWN0IHRvIHRlbXBvcmFsIHN0YWNrIG1lbW9yeSAqLwogICAgZG14TWF4U2NhbGUgPSAwOwogIH0KCiAgcFBhcmFtID0gJnNlbGYtPnVzZXJQYXJhbXM7CiAgbnVtSW5DaGFubmVscyA9ICpuQ2hhbm5lbHM7CgogIC8qIFBlcmZvcm0gc29tZSBpbnB1dCBzYW5pdHkgY2hlY2tzICovCiAgaWYgKHBQY21CdWYgPT0gTlVMTCkgICAgIHsgcmV0dXJuIChQQ01ETVhfSU5WQUxJRF9BUkdVTUVOVCk7IH0KICBpZiAoZnJhbWVTaXplID09IDApICAgICAgeyByZXR1cm4gKFBDTURNWF9JTlZBTElEX0FSR1VNRU5UKTsgfQogIGlmICggKG51bUluQ2hhbm5lbHMgPT0gMCkKICAgIHx8IChudW1JbkNoYW5uZWxzID4gUENNX0RNWF9NQVhfSU5fQ0hBTk5FTFMpICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gKFBDTURNWF9JTlZBTElEX0FSR1VNRU5UKTsgfQoKICAvKiBDaGVjayBvbiBtaXNjb25maWd1cmF0aW9uICovCiAgRkRLX0FTU0VSVCggKHBQYXJhbS0+bnVtT3V0Q2hhbm5lbHNNYXggPD0gMCkgXAogICAgICAgICAgIHx8IChwUGFyYW0tPm51bU91dENoYW5uZWxzTWF4ID49IHBQYXJhbS0+bnVtT3V0Q2hhbm5lbHNNaW4pKTsKCiAgLyogRGV0ZXJtaW5lIGlmIHRoZSBtb2R1bGUgaGFzIHRvIGRvIHByb2Nlc3NpbmcgKi8KICBpZiAoICAgKHNlbGYtPmFwcGx5UHJvY2Vzc2luZyA9PSAwKQogICAgJiYgICgocFBhcmFtLT5udW1PdXRDaGFubmVsc01heCA8PSAwKQogICAgICB8fCAocFBhcmFtLT5udW1PdXRDaGFubmVsc01heCA+PSBudW1JbkNoYW5uZWxzKSkKICAgICYmICAgKHBQYXJhbS0+bnVtT3V0Q2hhbm5lbHNNaW4gPD0gbnVtSW5DaGFubmVscykgKSB7CiAgICAvKiBOb3RoaW5nIHRvIGRvICovCiAgICByZXR1cm4gKGVycm9yU3RhdHVzKTsKICB9CgogIC8qIERldGVybWluZSB0aGUgbnVtYmVyIG9mIG91dHB1dCBjaGFubmVscyAqLwogIGlmICggKHBQYXJhbS0+bnVtT3V0Q2hhbm5lbHNNYXggPiAwKQogICAgJiYgKG51bUluQ2hhbm5lbHMgPiBwUGFyYW0tPm51bU91dENoYW5uZWxzTWF4KSApIHsKICAgIG51bU91dENoYW5uZWxzID0gcFBhcmFtLT5udW1PdXRDaGFubmVsc01heDsKICB9CiAgZWxzZSBpZiAobnVtSW5DaGFubmVscyA8IHBQYXJhbS0+bnVtT3V0Q2hhbm5lbHNNaW4pIHsKICAgIG51bU91dENoYW5uZWxzID0gcFBhcmFtLT5udW1PdXRDaGFubmVsc01pbjsKICB9CiAgZWxzZSB7CiAgICBudW1PdXRDaGFubmVscyA9IG51bUluQ2hhbm5lbHM7CiAgfQoKICBkdWFsQ2hhbm5lbE1vZGUgPSBwUGFyYW0tPmR1YWxDaGFubmVsTW9kZTsKCiAgLyogQW5hbHlzZSBpbnB1dCBjaGFubmVsIGNvbmZpZ3VyYXRpb24gYW5kIGdldCBjaGFubmVsIG9mZnNldAogICAqIHRhYmxlIHRoYXQgY2FuIGJlIGFjY2Vzc2VkIHdpdGggdGhlIGZpeGVkIGNoYW5uZWwgbGFiZWxzLiAqLwogIGVycm9yU3RhdHVzID0gZ2V0Q2hhbm5lbE1vZGUoCiAgICAgICAgICAgICAgICAgICBudW1JbkNoYW5uZWxzLAogICAgICAgICAgICAgICAgICAgY2hhbm5lbFR5cGUsCiAgICAgICAgICAgICAgICAgICBjaGFubmVsSW5kaWNlcywKICAgICAgICAgICAgICAgICAgIGluT2Zmc2V0VGFibGUsCiAgICAgICAgICAgICAgICAgICZpbkNoTW9kZQogICAgICAgICAgICAgICAgICk7CiAgaWYgKCBQQ01ETVhfSVNfRkFUQUxfRVJST1IoZXJyb3JTdGF0dXMpCiAgICB8fCAoaW5DaE1vZGUgPT0gQ0hfTU9ERV9VTkRFRklORUQpICkgewogICAgLyogV2UgZG9uJ3QgbmVlZCB0byByZXN0b3JlIGJlY2F1c2UgdGhlIGNoYW5uZWwKICAgICAgIGNvbmZpZ3VyYXRpb24gaGFzIG5vdCBiZWVuIGNoYW5nZWQuIEp1c3QgZXhpdC4gKi8KICAgIHJldHVybiAoUENNRE1YX0lOVkFMSURfQ0hfQ09ORklHKTsKICB9CgogIC8qIFNldCBpbnB1dCBzdHJpZGUgYW5kIG9mZnNldCAqLwogIGlmIChmSW50ZXJsZWF2ZWQpIHsKICAgIGluU3RyaWRlICA9IG51bUluQ2hhbm5lbHM7CiAgICBvZmZzZXQgPSAxOyAgICAgICAgICAgICAgICAvKiBDaGFubmVsIHNwZWNpZmljIG9mZnNldCBmYWN0b3IgKi8KICB9IGVsc2UgewogICAgaW5TdHJpZGUgID0gMTsKICAgIG9mZnNldCA9IGZyYW1lU2l6ZTsgICAgICAgIC8qIENoYW5uZWwgc3BlY2lmaWMgb2Zmc2V0IGZhY3RvciAqLwogIH0KCiAgLyogUmVzZXQgZG93bm1peCBtZXRhIGRhdGEgaWYgbmVjZXNzYXJ5ICovCiAgaWYgKCAocFBhcmFtLT5leHBpcnlGcmFtZSA+IDApCiAgICAmJiAoKytzZWxmLT5ic01ldGFEYXRhWzBdLmV4cGlyeUNvdW50ID4gcFBhcmFtLT5leHBpcnlGcmFtZSkgKQogIHsgLyogVGhlIG1ldGFkYXRhIHJlYWQgZnJvbSBiaXRzdHJlYW0gaXMgdG9vIG9sZC4gKi8KICAgIFBDTURNWF9FUlJPUiBlcnIgPSBwY21EbXhfUmVzZXQoc2VsZiwgUENNRE1YX1JFU0VUX0JTX0RBVEEpOwogICAgRkRLX0FTU0VSVChlcnIgPT0gUENNRE1YX09LKTsKICB9CiAgRkRLbWVtY3B5KCZic01ldGFEYXRhLCAmc2VsZi0+YnNNZXRhRGF0YVtwUGFyYW0tPmZyYW1lRGVsYXldLCBzaXplb2YoRE1YX0JTX01FVEFfREFUQSkpOwogIC8qIE1haW50YWluIGRlbGF5IGxpbmUgKi8KICBmb3IgKHNsb3QgPSBwUGFyYW0tPmZyYW1lRGVsYXk7IHNsb3QgPiAwOyBzbG90IC09IDEpIHsKICAgIEZES21lbWNweSgmc2VsZi0+YnNNZXRhRGF0YVtzbG90XSwgJnNlbGYtPmJzTWV0YURhdGFbc2xvdC0xXSwgc2l6ZW9mKERNWF9CU19NRVRBX0RBVEEpKTsKICB9CgogIC8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLwojaWZkZWYgUENNX0RPV05NSVhfRU5BQkxFCiAgaWYgKCBudW1JbkNoYW5uZWxzID4gbnVtT3V0Q2hhbm5lbHMgKQogIHsgLyogQXBwbHkgZG93bm1peCAqLwogICAgSU5UX1BDTSAgKnBJblBjbVtQQ01fRE1YX01BWF9JTl9DSEFOTkVMU10gPSB7IE5VTEwgfTsKICAgIElOVF9QQ00gICpwT3V0UGNtW1BDTV9ETVhfTUFYX09VVF9DSEFOTkVMU10gPSB7IE5VTEwgfTsKICAgIEZJWFBfRE1YICBtaXhGYWN0b3JzW1BDTV9ETVhfTUFYX0NIQU5ORUxTXVtQQ01fRE1YX01BWF9DSEFOTkVMU107CiAgICBVQ0hBUiAgICAgb3V0T2Zmc2V0VGFibGVbUENNX0RNWF9NQVhfQ0hBTk5FTFNdOwogICAgVUlOVCAgICAgIHNhbXBsZTsKICAgIGludCAgICAgICBjaENmZyA9IDA7CiAgICBpbnQgICAgICAgYnlwU2NhbGUgPSAwOwoKI2lmIChQQ01fRE1YX01BWF9JTl9DSEFOTkVMUyA+PSA3KQogICAgaWYgKG51bUluQ2hhbm5lbHMgPiBTSVhfQ0hBTk5FTCkgewogICAgICBBVURJT19DSEFOTkVMX1RZUEUgbXVsdGlQdXJwb3NlQ2hUeXBlWzJdOwoKICAgICAgLyogR2V0IHRoZSB0eXBlIG9mIHRoZSBtdWx0aXB1cnBvc2UgY2hhbm5lbHMgKi8KICAgICAgbXVsdGlQdXJwb3NlQ2hUeXBlWzBdID0gY2hhbm5lbFR5cGVbaW5PZmZzZXRUYWJsZVtMRUZUX01VTFRJUFJQU19DSEFOTkVMXV07CiAgICAgIG11bHRpUHVycG9zZUNoVHlwZVsxXSA9IGNoYW5uZWxUeXBlW2luT2Zmc2V0VGFibGVbUklHSFRfTVVMVElQUlBTX0NIQU5ORUxdXTsKCiAgICAgIC8qIENoZWNrIGlmIHRoZSBpbnB1dCBjb25maWd1cmF0aW9uIGlzIG9uZSBkZWZpbmVkIGluIHRoZSBzdGFuZGFyZC4gKi8KICAgICAgc3dpdGNoIChpbkNoTW9kZSkgewogICAgICBjYXNlIENIX01PREVfNV8wXzJfMTogIC8qIGNoQ2ZnIDcgfHwgMTQgKi8KICAgICAgICAvKiBGdXJ0aGVyIGFuYWx5c2UgdGhlIGlucHV0IGNvbmZpZyB0byBkaXN0aW5ndWlzaCB0aGUgdHdvIENIX01PREVfNV8wXzJfMSBjb25maWdzLiAqLwogICAgICAgIGlmICggKG11bHRpUHVycG9zZUNoVHlwZVswXSA9PSBBQ1RfRlJPTlRfVE9QKQogICAgICAgICAgJiYgKG11bHRpUHVycG9zZUNoVHlwZVsxXSA9PSBBQ1RfRlJPTlRfVE9QKSApIHsKICAgICAgICAgIGNoQ2ZnID0gMTQ7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNoQ2ZnID0gNzsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgQ0hfTU9ERV8zXzBfM18xOiAgLyogY2hDZmcgMTEgKi8KICAgICAgICBjaENmZyA9IDExOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIENIX01PREVfM18wXzRfMTogIC8qIGNoQ2ZnIDEyICovCiAgICAgICAgY2hDZmcgPSAxMjsKICAgICAgICBicmVhazsKICAgICAgZGVmYXVsdDoKICAgICAgICBjaENmZyA9IDA7ICAvKiBOb3QgYSBrbm93biBjb25maWcgKi8KICAgICAgICBicmVhazsKICAgICAgfQogICAgfQojZW5kaWYKCiAgICAvKiBTZXQgdGhpcyBzdGFnZXMgb3V0cHV0IHN0cmlkZSBhbmQgY2hhbm5lbCBtb2RlOiAqLwogICAgb3V0U3RyaWRlID0gKGZJbnRlcmxlYXZlZCkgPyBudW1PdXRDaGFubmVscyA6IDE7CiAgICBvdXRDaE1vZGUgPSBvdXRDaE1vZGVUYWJsZVtudW1PdXRDaGFubmVsc107CgogICAgLyogR2V0IGNoYW5uZWwgZGVzY3JpcHRpb24gYW5kIGNoYW5uZWwgbWFwcGluZyBmb3IgdGhlIGRlc2lyZWQgb3V0cHV0IGNvbmZpZ3VyYXRpb24uICovCiAgICBnZXRDaGFubmVsRGVzY3JpcHRpb24oCiAgICAgICAgICAgIG91dENoTW9kZSwKICAgICAgICAgICAgY2hhbm5lbE1hcHBpbmcsCiAgICAgICAgICAgIGNoYW5uZWxUeXBlLAogICAgICAgICAgICBjaGFubmVsSW5kaWNlcywKICAgICAgICAgICAgb3V0T2Zmc2V0VGFibGUKICAgICAgICAgICApOwogICAgLyogTm93IHRoZXJlIGlzIG5vIHdheSBiYWNrIGJlY2F1c2Ugd2UgbW9kaWZpZWQgdGhlIGNoYW5uZWwgY29uZmlndXJhdGlvbiEgKi8KCiAgICAvKiBDcmVhdGUgdGhlIERNWCBtYXRyaXggKi8KICAgIGVycm9yU3RhdHVzID0gZ2V0TWl4RmFjdG9ycyAoCiAgICAgICAgICAgICAgICAgICAgICAgKGNoQ2ZnPjApID8gMSA6IDAsCiAgICAgICAgICAgICAgICAgICAgICAgKGNoQ2ZnPjApID8gKFBDTV9ETVhfQ0hBTk5FTF9NT0RFKWNoQ2ZnIDogaW5DaE1vZGUsCiAgICAgICAgICAgICAgICAgICAgICAgb3V0Q2hNb2RlLAogICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICZic01ldGFEYXRhLAogICAgICAgICAgICAgICAgICAgICAgIG1peEZhY3RvcnMsCiAgICAgICAgICAgICAgICAgICAgICAmZG14U2NhbGUKICAgICAgICAgICAgICAgICAgICAgKTsKICAgIC8qIE5vIGZhdGFsIGVycm9ycyBjYW4gb2NjdXIgaGVyZS4gVGhlIGZ1bmN0aW9uIGlzIGRlc2lnbmVkIHRvIGFsd2F5cyByZXR1cm4gYSB2YWxpZCBtYXRyaXguCiAgICAgICBUaGUgZXJyb3IgY29kZSBpcyB1c2VkIHRvIHNpZ25hbCBjb25maWd1cmF0aW9ucyBhbmQgbWF0cmljZXMgdGhhdCBhcmUgbm90IGNvbmZvcm0gdG8gYW55IHN0YW5kYXJkLiAqLwoKICAgIC8qIERldGVybWluZSB0aGUgZmluYWwgc2NhbGluZyAqLwogICAgYnlwU2NhbGUgPSBGREttaW4oZG14TWF4U2NhbGUsIGRteFNjYWxlKTsKICAgICpwRG14T3V0U2NhbGUgKz0gYnlwU2NhbGU7CiAgICBkbXhTY2FsZSAtPSBieXBTY2FsZTsKCiAgICB7IC8qIFNldCBjaGFubmVsIHBvaW50ZXIgZm9yIGlucHV0LiBSZW1vdmUgZW1wdHkgY29scy4gKi8KICAgICAgaW50IGluQ2gsIG91dENoLCBtYXBbUENNX0RNWF9NQVhfQ0hBTk5FTFNdOwogICAgICBjaCA9IDA7CiAgICAgIGZvciAoaW5DaD0wOyBpbkNoIDwgUENNX0RNWF9NQVhfQ0hBTk5FTFM7IGluQ2grPTEpIHsKICAgICAgICBpZiAoaW5PZmZzZXRUYWJsZVtpbkNoXSAhPSAyNTUpIHsKICAgICAgICAgIHBJblBjbVtjaF0gPSAmcFBjbUJ1Zltpbk9mZnNldFRhYmxlW2luQ2hdKm9mZnNldF07CiAgICAgICAgICBtYXBbY2grK10gID0gaW5DaDsKICAgICAgICB9CiAgICAgIH0KICAgICAgRkRLX0FTU0VSVChjaCA9PSBudW1JbkNoYW5uZWxzKTsKCiAgICAgIC8qIFJlbW92ZSB1bnVzZWQgY29scyBmcm9tIGZhY3RvciBtYXRyaXggKi8KICAgICAgZm9yIChpbkNoPTA7IGluQ2ggPCBudW1JbkNoYW5uZWxzOyBpbkNoKz0xKSB7CiAgICAgICAgaWYgKGluQ2ggIT0gbWFwW2luQ2hdKSB7CiAgICAgICAgICBpbnQgb3V0Q2g7CiAgICAgICAgICBmb3IgKG91dENoPTA7IG91dENoIDwgUENNX0RNWF9NQVhfQ0hBTk5FTFM7IG91dENoKz0xKSB7CiAgICAgICAgICAgIG1peEZhY3RvcnNbb3V0Q2hdW2luQ2hdID0gbWl4RmFjdG9yc1tvdXRDaF1bbWFwW2luQ2hdXTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qIFNldCBjaGFubmVsIHBvaW50ZXIgZm9yIG91dHB1dC4gUmVtb3ZlIGVtcHR5IGNvbHMuICovCiAgICAgIGNoID0gMDsKICAgICAgZm9yIChvdXRDaD0wOyBvdXRDaCA8IFBDTV9ETVhfTUFYX0NIQU5ORUxTOyBvdXRDaCs9MSkgewogICAgICAgIGlmIChvdXRPZmZzZXRUYWJsZVtvdXRDaF0gIT0gMjU1KSB7CiAgICAgICAgICBwT3V0UGNtW2NoXSA9ICZwUGNtQnVmW291dE9mZnNldFRhYmxlW291dENoXSpvZmZzZXRdOwogICAgICAgICAgbWFwW2NoKytdICA9IG91dENoOwogICAgICAgIH0KICAgICAgfQogICAgICBGREtfQVNTRVJUKGNoID09IG51bU91dENoYW5uZWxzKTsKCiAgICAgIC8qIFJlbW92ZSB1bnVzZWQgcm93cyBmcm9tIGZhY3RvciBtYXRyaXggKi8KICAgICAgZm9yIChvdXRDaD0wOyBvdXRDaCA8IG51bU91dENoYW5uZWxzOyBvdXRDaCs9MSkgewogICAgICAgIGlmIChvdXRDaCAhPSBtYXBbb3V0Q2hdKSB7CiAgICAgICAgICBGREttZW1jcHkoJm1peEZhY3RvcnNbb3V0Q2hdLCAmbWl4RmFjdG9yc1ttYXBbb3V0Q2hdXSwgUENNX0RNWF9NQVhfQ0hBTk5FTFMqc2l6ZW9mKEZJWFBfRE1YKSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgLyogU2FtcGxlIHByb2Nlc3NpbmcgbG9vcCAqLwogICAgZm9yIChzYW1wbGUgPSAwOyBzYW1wbGUgPCBmcmFtZVNpemU7IHNhbXBsZSsrKQogICAgewogICAgICBGSVhQX1BDTSB0SW5bUENNX0RNWF9NQVhfSU5fQ0hBTk5FTFNdOwogICAgICBGSVhQX0RCTCB0T3V0W1BDTV9ETVhfTUFYX09VVF9DSEFOTkVMU10gPSB7IChGSVhQX0RCTCkwIH07CiAgICAgIGludCBpbkNoLCBvdXRDaDsKCiAgICAgIC8qIFByZWxvYWQgYWxsIGlucHV0IHNhbXBsZXMgKi8KICAgICAgZm9yIChpbkNoPTA7IGluQ2ggPCBudW1JbkNoYW5uZWxzOyBpbkNoKz0xKSB7CiAgICAgICAgdEluW2luQ2hdID0gKEZJWFBfUENNKSpwSW5QY21baW5DaF07CiAgICAgICAgcEluUGNtW2luQ2hdICs9IGluU3RyaWRlOwogICAgICB9CiAgICAgIC8qIEFwcGx5IGRvd25taXggY29lZmZpY2llbnRzIHRvIGlucHV0IHNhbXBsZXMgYW5kIGFjY3VtdWxhdGUgZm9yIG91dHB1dCAqLwogICAgICBmb3IgKG91dENoPTA7IG91dENoIDwgbnVtT3V0Q2hhbm5lbHM7IG91dENoKz0xKSB7CiAgICAgICAgZm9yIChpbkNoPTA7IGluQ2ggPCBudW1JbkNoYW5uZWxzOyBpbkNoKz0xKSB7CiAgICAgICAgICB0T3V0W291dENoXSArPSBmTXVsdCh0SW5baW5DaF0sIG1peEZhY3RvcnNbb3V0Q2hdW2luQ2hdKTsKICAgICAgICB9CiAgICAgICAgLyogV3JpdGUgc2FtcGxlICovCiNpZiAoU0FNUExFX0JJVFMgPT0gREZSQUNUX0JJVFMpCiAgICAgICAgKnBPdXRQY21bb3V0Q2hdID0gKElOVF9QQ00pU0FUVVJBVEVfTEVGVF9TSElGVCh0T3V0W291dENoXSwgZG14U2NhbGUsIFNBTVBMRV9CSVRTKTsKI2Vsc2UKICAgICAgICAqcE91dFBjbVtvdXRDaF0gPSAoSU5UX1BDTSlTQVRVUkFURV9SSUdIVF9TSElGVCh0T3V0W291dENoXSwgREZSQUNUX0JJVFMtU0FNUExFX0JJVFMtZG14U2NhbGUsIFNBTVBMRV9CSVRTKTsKI2VuZGlmCiAgICAgICAgcE91dFBjbVtvdXRDaF0gKz0gb3V0U3RyaWRlOwogICAgICB9CiAgICB9CgogICAgLyogVXBkYXRlIHRoZSBudW1iZXIgb2Ygb3V0cHV0IGNoYW5uZWxzICovCiAgICAqbkNoYW5uZWxzID0gbnVtT3V0Q2hhbm5lbHM7CgogIH0gLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLwogIGVsc2UKI2VuZGlmIC8qIFBDTV9ET1dOTUlYX0VOQUJMRSAqLwojaWZkZWYgUENNX0NIQU5ORUxfRVhURU5TSU9OX0VOQUJMRQogIGlmICggbnVtSW5DaGFubmVscyA8IG51bU91dENoYW5uZWxzICkKICB7IC8qIEFwcGx5IHJ1ZGltZW50YXJ5IHVwbWl4ICovCiAgICAvKiBTZXQgdXAgY2hhbm5lbCBwb2ludGVyICovCiAgICBVSU5UICAgICBzYW1wbGU7CiAgICBVQ0hBUiAgICBvdXRPZmZzZXRUYWJsZVtQQ01fRE1YX01BWF9DSEFOTkVMU107CgogICAgLyogRklSU1QgU1RBR0UKICAgICAgICAgQ3JlYXRlIGEgc3RlcmVvL2R1YWwgY2hhbm5lbCBzaWduYWwgKi8KICAgIGlmIChudW1JbkNoYW5uZWxzID09IE9ORV9DSEFOTkVMKQogICAgewogICAgICBJTlRfUENNICAqcEluUGNtW1BDTV9ETVhfTUFYX0NIQU5ORUxTXTsKICAgICAgSU5UX1BDTSAgKnBPdXRMRiwgKnBPdXRSRjsKCiAgICAgIC8qIFNldCB0aGlzIHN0YWdlcyBvdXRwdXQgc3RyaWRlIGFuZCBjaGFubmVsIG1vZGU6ICovCiAgICAgIG91dFN0cmlkZSA9IChmSW50ZXJsZWF2ZWQpID8gVFdPX0NIQU5ORUwgOiAxOwogICAgICBvdXRDaE1vZGUgPSBvdXRDaE1vZGVUYWJsZVtUV09fQ0hBTk5FTF07CgogICAgICAvKiBHZXQgY2hhbm5lbCBkZXNjcmlwdGlvbiBhbmQgY2hhbm5lbCBtYXBwaW5nIGZvciB0aGlzCiAgICAgICAqIHN0YWdlcyBudW1iZXIgb2Ygb3V0cHV0IGNoYW5uZWxzIChhbHdheXMgU1RFUkVPKS4gKi8KICAgICAgZ2V0Q2hhbm5lbERlc2NyaXB0aW9uKAogICAgICAgICAgICAgIG91dENoTW9kZSwKICAgICAgICAgICAgICBjaGFubmVsTWFwcGluZywKICAgICAgICAgICAgICBjaGFubmVsVHlwZSwKICAgICAgICAgICAgICBjaGFubmVsSW5kaWNlcywKICAgICAgICAgICAgICBvdXRPZmZzZXRUYWJsZQogICAgICAgICAgICAgKTsKICAgICAgLyogTm93IHRoZXJlIGlzIG5vIHdheSBiYWNrIGJlY2F1c2Ugd2UgbW9kaWZpZWQgdGhlIGNoYW5uZWwgY29uZmlndXJhdGlvbiEgKi8KCiAgICAgIC8qIFNldCBpbnB1dCBjaGFubmVsIHBvaW50ZXIuIFRoZSBmaXJzdCBjaGFubmVsIGlzIGFsd2F5cyBhdCBpbmRleCAwLiAqLwogICAgICBwSW5QY21bQ0VOVEVSX0ZST05UX0NIQU5ORUxdID0gJnBQY21CdWZbKGZyYW1lU2l6ZS0xKSppblN0cmlkZV07ICAvKiBDb25zaWRlcmluZyBpbnB1dCBtYXBwaW5nIGNvdWxkIGxlYWQgdG8gYSBpbnZhbGlkIHBvaW50ZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVyZSBpZiB0aGUgY2hhbm5lbCBpcyBub3QgZGVjbGFyZWQgdG8gYmUgYSBmcm9udCBjaGFubmVsLiAqLwoKICAgICAgLyogU2V0IG91dHB1dCBjaGFubmVsIHBvaW50ZXIgKGZvciB0aGlzIHN0YWdlKS4gKi8KICAgICAgcE91dExGID0gJnBQY21CdWZbb3V0T2Zmc2V0VGFibGVbTEVGVF9GUk9OVF9DSEFOTkVMXSpvZmZzZXQrKGZyYW1lU2l6ZS0xKSpvdXRTdHJpZGVdOwogICAgICBwT3V0UkYgPSAmcFBjbUJ1ZltvdXRPZmZzZXRUYWJsZVtSSUdIVF9GUk9OVF9DSEFOTkVMXSpvZmZzZXQrKGZyYW1lU2l6ZS0xKSpvdXRTdHJpZGVdOwoKICAgICAgLyogMS8wIGlucHV0OiAqLwogICAgICBmb3IgKHNhbXBsZSA9IDA7IHNhbXBsZSA8IGZyYW1lU2l6ZTsgc2FtcGxlKyspIHsKICAgICAgICAvKiBMJyA9IEM7ICBSJyA9IEM7ICovCiAgICAgICAgKnBPdXRMRiA9ICpwT3V0UkYgPSAqcEluUGNtW0NFTlRFUl9GUk9OVF9DSEFOTkVMXTsKCiAgICAgICAgcEluUGNtW0NFTlRFUl9GUk9OVF9DSEFOTkVMXSAtPSBpblN0cmlkZTsKICAgICAgICBwT3V0TEYgLT0gb3V0U3RyaWRlOyBwT3V0UkYgLT0gb3V0U3RyaWRlOwogICAgICB9CgogICAgICAvKiBQcmVwYXJlIGZvciBuZXh0IHN0YWdlOiAqLwogICAgICBpblN0cmlkZSA9IG91dFN0cmlkZTsKICAgICAgaW5DaE1vZGUgPSBvdXRDaE1vZGU7CiAgICAgIEZES21lbWNweShpbk9mZnNldFRhYmxlLCBvdXRPZmZzZXRUYWJsZSwgUENNX0RNWF9NQVhfQ0hBTk5FTFMqc2l6ZW9mKFVDSEFSKSk7CiAgICB9CgojaWYgKFBDTV9ETVhfTUFYX09VVF9DSEFOTkVMUyA+IDIpCiAgICAvKiBTRUNPTkQgU1RBR0UKICAgICAgICAgRXh0ZW5kIHdpdGggemVybyBjaGFubmVscyB0byBhY2hpZXZlZCB0aGUgZGVzaXJlZCBudW1iZXIgb2Ygb3V0cHV0IGNoYW5uZWxzLiAqLwogICAgaWYgKG51bU91dENoYW5uZWxzID4gVFdPX0NIQU5ORUwpCiAgICB7CiAgICAgIElOVF9QQ00gKnBJbltQQ01fRE1YX01BWF9DSEFOTkVMU10gID0geyBOVUxMIH07CiAgICAgIElOVF9QQ00gKnBPdXRbUENNX0RNWF9NQVhfQ0hBTk5FTFNdID0geyBOVUxMIH07CiAgICAgIEFVRElPX0NIQU5ORUxfVFlQRSAgaW5DaFR5cGVzW1BDTV9ETVhfTUFYX0NIQU5ORUxTXTsKICAgICAgVUNIQVIgICAgaW5DaEluZGljZXNbUENNX0RNWF9NQVhfQ0hBTk5FTFNdOwogICAgICBVQ0hBUiAgICBudW1DaFBlckdycFsyXVtQQ01fRE1YX01BWF9DSEFOTkVMX0dST1VQU107CiAgICAgIGludCAgICAgIG5Db250ZW50Q2ggPSAwOyAgLyogTnVtYmVyIG9mIGNoYW5uZWxzIHdpdGggY29udGVudCAqLwogICAgICBpbnQgICAgICBuRW1wdHlDaCA9IDA7ICAgIC8qIE51bWJlciBvZiBjaGFubmVscyB3aXRoIGNvbnRlbnQgKi8KICAgICAgaW50ICAgICAgY2gsIGNoR3JwLCBpc0NvbXBhdGlibGUgPSAxOwoKICAgICAgLyogRG8gbm90IGNoYW5nZSB0aGUgc2lnbmFsbGluZyB3aGljaCBpcyB0aGUgY2hhbm5lbCB0eXBlcyBhbmQgaW5kaWNlcy4KICAgICAgICAgSnVzdCByZW9yZGVyIGFuZCBhZGQgY2hhbm5lbHMuIFNvIGZpcnN0IHNhdmUgdGhlIGlucHV0IHNpZ25hbGxpbmcuICovCiAgICAgIEZES21lbWNweShpbkNoVHlwZXMsIGNoYW5uZWxUeXBlLCBQQ01fRE1YX01BWF9DSEFOTkVMUypzaXplb2YoQVVESU9fQ0hBTk5FTF9UWVBFKSk7CiAgICAgIEZES21lbWNweShpbkNoSW5kaWNlcywgY2hhbm5lbEluZGljZXMsIFBDTV9ETVhfTUFYX0NIQU5ORUxTKnNpemVvZihVQ0hBUikpOwoKICAgICAgLyogU2V0IHRoaXMgc3RhZ2VzIG91dHB1dCBzdHJpZGUgYW5kIGNoYW5uZWwgbW9kZTogKi8KICAgICAgb3V0U3RyaWRlID0gKGZJbnRlcmxlYXZlZCkgPyBudW1PdXRDaGFubmVscyA6IDE7CiAgICAgIG91dENoTW9kZSA9IG91dENoTW9kZVRhYmxlW251bU91dENoYW5uZWxzXTsKCiAgICAgIC8qIENoZWNrIGlmIGlucHV0IGNoYW5uZWwgY29uZmlnIGNhbiBiZSBlYXNpbHkgbWFwcGVkIHRvIHRoZSBkZXNpcmVkIG91dHB1dCBjb25maWcuICovCiAgICAgIGZvciAoY2hHcnAgPSAwOyBjaEdycCA8IFBDTV9ETVhfTUFYX0NIQU5ORUxfR1JPVVBTOyBjaEdycCArPSAxKSB7CiAgICAgICAgbnVtQ2hQZXJHcnBbSU5dW2NoR3JwXSA9IChpbkNoTW9kZSA+PiAoY2hHcnAqNCkpICYgMHhGOwogICAgICAgIG51bUNoUGVyR3JwW09VVF1bY2hHcnBdID0gKG91dENoTW9kZSA+PiAoY2hHcnAqNCkpICYgMHhGOwoKICAgICAgICBpZiAobnVtQ2hQZXJHcnBbSU5dW2NoR3JwXSA+IG51bUNoUGVyR3JwW09VVF1bY2hHcnBdKSB7CiAgICAgICAgICBpc0NvbXBhdGlibGUgPSAwOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CgogICAgICBpZiAoIGlzQ29tcGF0aWJsZSApIHsKICAgICAgICAvKiBHZXQgbmV3IGNoYW5uZWwgZGVzY3JpcHRpb24gYW5kIGNoYW5uZWwKICAgICAgICAgKiBtYXBwaW5nIGZvciB0aGUgZGVzaXJlZCBvdXRwdXQgY2hhbm5lbCBtb2RlLiAqLwogICAgICAgIGdldENoYW5uZWxEZXNjcmlwdGlvbigKICAgICAgICAgICAgICAgIG91dENoTW9kZSwKICAgICAgICAgICAgICAgIGNoYW5uZWxNYXBwaW5nLAogICAgICAgICAgICAgICAgY2hhbm5lbFR5cGUsCiAgICAgICAgICAgICAgICBjaGFubmVsSW5kaWNlcywKICAgICAgICAgICAgICAgIG91dE9mZnNldFRhYmxlCiAgICAgICAgICAgICAgICk7CiAgICAgICAgLyogSWYgdGhlIGlucHV0IGNvbmZpZyBoYXMgYSBiYWNrIGNlbnRlciBjaGFubmVsIGJ1dCB0aGUgb3V0cHV0CiAgICAgICAgICAgY29uZmlnIGhhcyBub3QsIGNvcHkgaXQgdG8gbGVmdCBhbmQgcmlnaHQgKGlmIGF2YWlsYWJsZSkuICovCiAgICAgICAgaWYgKCAgKG51bUNoUGVyR3JwW0lOXVtDSF9HUk9VUF9SRUFSXSUyKQogICAgICAgICAgJiYgIShudW1DaFBlckdycFtPVVRdW0NIX0dST1VQX1JFQVJdJTIpICkgewogICAgICAgICAgaWYgKG51bUNoUGVyR3JwW0lOXVtDSF9HUk9VUF9SRUFSXSA9PSAxKSB7CiAgICAgICAgICAgIGluT2Zmc2V0VGFibGVbUklHSFRfUkVBUl9DSEFOTkVMXSA9IGluT2Zmc2V0VGFibGVbTEVGVF9SRUFSX0NIQU5ORUxdOwogICAgICAgICAgfSBlbHNlIGlmIChudW1DaFBlckdycFtJTl1bQ0hfR1JPVVBfUkVBUl0gPT0gMykgewogICAgICAgICAgICBpbk9mZnNldFRhYmxlW1JJR0hUX01VTFRJUFJQU19DSEFOTkVMXSA9IGluT2Zmc2V0VGFibGVbTEVGVF9NVUxUSVBSUFNfQ0hBTk5FTF07CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGVsc2UgewogICAgICAgIC8qIEp1c3QgY29weSBhbmQgZXh0ZW5kIHRoZSBvcmlnaW5hbCBjb25maWcgKi8KICAgICAgICBGREttZW1jcHkob3V0T2Zmc2V0VGFibGUsIGluT2Zmc2V0VGFibGUsIFBDTV9ETVhfTUFYX0NIQU5ORUxTKnNpemVvZihVQ0hBUikpOwogICAgICB9CgogICAgICAvKiBTZXQgSS9PIGNoYW5uZWwgcG9pbnRlci4KICAgICAgICAgTm90ZTogVGhlIGZvbGxvd2luZyBhc3NpZ25tZW50IGFsZ29yaXRobSBjbGVhcnMgdGhlIGNoYW5uZWwgb2Zmc2V0IHRhYmxlcy4KICAgICAgICAgICAgICAgVGh1cyB0aGV5IGNhbiBub3QgYmUgdXNlZCBhZnRlcndhcmRzLiAqLwogICAgICBmb3IgKGNoID0gMDsgY2ggPCBQQ01fRE1YX01BWF9DSEFOTkVMUzsgY2grPTEpIHsKICAgICAgICBpZiAoIChvdXRPZmZzZXRUYWJsZVtjaF0gPCAyNTUpCiAgICAgICAgICAmJiAoaW5PZmZzZXRUYWJsZVtjaF0gPCAyNTUpICkKICAgICAgICB7IC8qIFNldCBJL08gcG9pbnRlcjogKi8KICAgICAgICAgIHBJbltuQ29udGVudENoXSA9ICZwUGNtQnVmW2luT2Zmc2V0VGFibGVbY2hdKm9mZnNldCsoZnJhbWVTaXplLTEpKmluU3RyaWRlXTsKICAgICAgICAgIHBPdXRbbkNvbnRlbnRDaF0gPSAmcFBjbUJ1ZltvdXRPZmZzZXRUYWJsZVtjaF0qb2Zmc2V0KyhmcmFtZVNpemUtMSkqb3V0U3RyaWRlXTsKICAgICAgICAgIC8qIFVwZGF0ZSBzaWduYWxsaW5nICovCiAgICAgICAgICBjaGFubmVsVHlwZVtvdXRPZmZzZXRUYWJsZVtjaF1dID0gaW5DaFR5cGVzW2luT2Zmc2V0VGFibGVbY2hdXTsKICAgICAgICAgIGNoYW5uZWxJbmRpY2VzW291dE9mZnNldFRhYmxlW2NoXV0gPSBpbkNoSW5kaWNlc1tpbk9mZnNldFRhYmxlW2NoXV07CiAgICAgICAgICBpbk9mZnNldFRhYmxlW2NoXSA9IDI1NTsKICAgICAgICAgIG91dE9mZnNldFRhYmxlW2NoXSA9IDI1NTsKICAgICAgICAgIG5Db250ZW50Q2ggKz0gMTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKCBpc0NvbXBhdGlibGUgKSB7CiAgICAgICAgLyogQXNzaWduIHRoZSByZW1haW5pbmcgaW5wdXQgY2hhbm5lbHMuCiAgICAgICAgICAgVGhpcyBpcyBqdXN0IGEgc2FmZXR5IGFwcGxpYW5jZS4gV2Ugc2hvdWxkIG5ldmVyIG5lZWQgaXQuICovCiAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgUENNX0RNWF9NQVhfQ0hBTk5FTFM7IGNoKz0xKSB7CiAgICAgICAgICBpZiAoaW5PZmZzZXRUYWJsZVtjaF0gPCAyNTUpIHsKICAgICAgICAgICAgaW50ICBvdXRDaDsKICAgICAgICAgICAgZm9yIChvdXRDaCA9IDAgOyBvdXRDaCA8IFBDTV9ETVhfTUFYX0NIQU5ORUxTOyBvdXRDaCArPSAxKSB7CiAgICAgICAgICAgICAgaWYgKG91dE9mZnNldFRhYmxlW291dENoXSA8IDI1NSkgewogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qIFNldCBJL08gcG9pbnRlcjogKi8KICAgICAgICAgICAgcEluW25Db250ZW50Q2hdID0gJnBQY21CdWZbaW5PZmZzZXRUYWJsZVtjaF0qb2Zmc2V0KyhmcmFtZVNpemUtMSkqaW5TdHJpZGVdOwogICAgICAgICAgICBwT3V0W25Db250ZW50Q2hdID0gJnBQY21CdWZbb3V0T2Zmc2V0VGFibGVbb3V0Q2hdKm9mZnNldCsoZnJhbWVTaXplLTEpKm91dFN0cmlkZV07CiAgICAgICAgICAgIC8qIFVwZGF0ZSBzaWduYWxsaW5nICovCiAgICAgICAgICAgIGNoYW5uZWxUeXBlW291dE9mZnNldFRhYmxlW291dENoXV0gPSBpbkNoVHlwZXNbaW5PZmZzZXRUYWJsZVtjaF1dOwogICAgICAgICAgICBjaGFubmVsSW5kaWNlc1tvdXRPZmZzZXRUYWJsZVtvdXRDaF1dID0gaW5DaEluZGljZXNbaW5PZmZzZXRUYWJsZVtjaF1dOwogICAgICAgICAgICBpbk9mZnNldFRhYmxlW2NoXSA9IDI1NTsKICAgICAgICAgICAgb3V0T2Zmc2V0VGFibGVbb3V0Q2hdID0gMjU1OwogICAgICAgICAgICBuQ29udGVudENoICs9IDE7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qIFNldCB0aGUgcmVtYWluaW5nIG91dHB1dCBjaGFubmVsIHBvaW50ZXIgKi8KICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBQQ01fRE1YX01BWF9DSEFOTkVMUzsgY2grPTEpIHsKICAgICAgICAgIGlmIChvdXRPZmZzZXRUYWJsZVtjaF0gPCAyNTUpIHsKICAgICAgICAgICAgcE91dFtuQ29udGVudENoK25FbXB0eUNoXSA9ICZwUGNtQnVmW291dE9mZnNldFRhYmxlW2NoXSpvZmZzZXQrKGZyYW1lU2l6ZS0xKSpvdXRTdHJpZGVdOwogICAgICAgICAgICAvKiBFeHBhbmQgb3V0cHV0IHNpZ25hbGxpbmcgKi8KICAgICAgICAgICAgY2hhbm5lbFR5cGVbb3V0T2Zmc2V0VGFibGVbY2hdXSA9IEFDVF9OT05FOwogICAgICAgICAgICBjaGFubmVsSW5kaWNlc1tvdXRPZmZzZXRUYWJsZVtjaF1dID0gbkVtcHR5Q2g7CiAgICAgICAgICAgIG91dE9mZnNldFRhYmxlW2NoXSA9IDI1NTsKICAgICAgICAgICAgbkVtcHR5Q2ggKz0gMTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgZWxzZSB7CiAgICAgICAgLyogU2V0IHRoZSByZW1haW5pbmcgb3V0cHV0IGNoYW5uZWwgcG9pbnRlciAqLwogICAgICAgIGZvciAoY2ggPSBuQ29udGVudENoOyBjaCA8IG51bU91dENoYW5uZWxzOyBjaCs9MSkgewogICAgICAgICAgcE91dFtjaF0gPSAmcFBjbUJ1ZltjaCpvZmZzZXQrKGZyYW1lU2l6ZS0xKSpvdXRTdHJpZGVdOwogICAgICAgICAgLyogRXhwYW5kIG91dHB1dCBzaWduYWxsaW5nICovCiAgICAgICAgICBjaGFubmVsVHlwZVtjaF0gPSBBQ1RfTk9ORTsKICAgICAgICAgIGNoYW5uZWxJbmRpY2VzW2NoXSA9IG5FbXB0eUNoOwogICAgICAgICAgbkVtcHR5Q2ggKz0gMTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qIEZpcnN0IGNvcHkgdGhlIGNoYW5uZWxzIHRoYXQgaGF2ZSBzaWduYWwgKi8KICAgICAgZm9yIChzYW1wbGUgPSAwOyBzYW1wbGUgPCBmcmFtZVNpemU7IHNhbXBsZSs9MSkgewogICAgICAgIElOVF9QQ00gdEluW1BDTV9ETVhfTUFYX0NIQU5ORUxTXTsKICAgICAgICAvKiBSZWFkIGFsbCBjaGFubmVsIHNhbXBsZXMgKi8KICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBuQ29udGVudENoOyBjaCs9MSkgewogICAgICAgICAgdEluW2NoXSA9ICpwSW5bY2hdOwogICAgICAgICAgcEluW2NoXSAtPSBpblN0cmlkZTsKICAgICAgICB9CiAgICAgICAgLyogV3JpdGUgYWxsIGNoYW5uZWwgc2FtcGxlcyAqLwogICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IG5Db250ZW50Q2g7IGNoKz0xKSB7CiAgICAgICAgICAqcE91dFtjaF0gPSB0SW5bY2hdOwogICAgICAgICAgcE91dFtjaF0gLT0gb3V0U3RyaWRlOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyogQ2xlYXIgYWxsIHRoZSBvdGhlciBjaGFubmVscyAqLwogICAgICBmb3IgKHNhbXBsZSA9IDA7IHNhbXBsZSA8IGZyYW1lU2l6ZTsgc2FtcGxlKyspIHsKICAgICAgICBmb3IgKGNoID0gbkNvbnRlbnRDaDsgY2ggPCBudW1PdXRDaGFubmVsczsgY2grPTEpIHsKICAgICAgICAgICpwT3V0W2NoXSA9IChJTlRfUENNKTA7CiAgICAgICAgICBwT3V0W2NoXSAtPSBvdXRTdHJpZGU7CiAgICAgICAgfQogICAgICB9CiAgICB9CiNlbmRpZiAgLyogaWYgKFBDTV9ETVhfTUFYX09VVF9DSEFOTkVMUyA+IDIpICovCgogICAgLyogdXBkYXRlIHRoZSBudW1iZXIgb2Ygb3V0cHV0IGNoYW5uZWxzICovCiAgICAqbkNoYW5uZWxzID0gbnVtT3V0Q2hhbm5lbHM7CiAgfSAvKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCiAgZWxzZQojZW5kaWYgLyogUENNX0NIQU5ORUxfRVhURU5TSU9OX0VOQUJMRSAqLwogIGlmICggbnVtSW5DaGFubmVscyA9PSBudW1PdXRDaGFubmVscyApCiAgewogICAgLyogRG9uJ3QgbmVlZCB0byBjaGFuZ2UgdGhlIGNoYW5uZWwgZGVzY3JpcHRpb24gaGVyZSAqLwoKICAgIHN3aXRjaCAobnVtSW5DaGFubmVscykKICAgIHsKICAgIGNhc2UgMjoKICAgICAgeyAvKiBTZXQgdXAgY2hhbm5lbCBwb2ludGVyICovCiAgICAgICAgSU5UX1BDTSAgKnBJblBjbVtQQ01fRE1YX01BWF9DSEFOTkVMU107CiAgICAgICAgSU5UX1BDTSAgKnBPdXRMLCAqcE91dFI7CiAgICAgICAgRklYUF9ETVggIGZsZXY7CgogICAgICAgIFVJTlQgc2FtcGxlOwogICAgICAgIGludCBpblN0cmlkZSwgb3V0U3RyaWRlLCBvZmZzZXQ7CgogICAgICAgIGlmIChmSW50ZXJsZWF2ZWQpIHsKICAgICAgICAgIGluU3RyaWRlICA9IG51bUluQ2hhbm5lbHM7CiAgICAgICAgICBvdXRTdHJpZGUgPSAyOyAgLyogZml4ZWQgISEhIChiZWxvdyBzdGVyZW8gaXMgZG9ud21peGVkIHRvIG1vbm8gaWYgcmVxdWlyZWQgKi8KICAgICAgICAgIG9mZnNldCA9IDE7IC8qIENoYW5uZWwgc3BlY2lmaWMgb2Zmc2V0IGZhY3RvciAqLwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpblN0cmlkZSAgPSAxOwogICAgICAgICAgb3V0U3RyaWRlID0gMTsKICAgICAgICAgIG9mZnNldCA9IGZyYW1lU2l6ZTsgIC8qIENoYW5uZWwgc3BlY2lmaWMgb2Zmc2V0IGZhY3RvciAqLwogICAgICAgIH0KCiAgICAgICAgLyogU2V0IGlucHV0IGNoYW5uZWwgcG9pbnRlciAqLwogICAgICAgIHBJblBjbVtMRUZUX0ZST05UX0NIQU5ORUxdICA9ICZwUGNtQnVmW2luT2Zmc2V0VGFibGVbTEVGVF9GUk9OVF9DSEFOTkVMXSpvZmZzZXRdOwogICAgICAgIHBJblBjbVtSSUdIVF9GUk9OVF9DSEFOTkVMXSA9ICZwUGNtQnVmW2luT2Zmc2V0VGFibGVbUklHSFRfRlJPTlRfQ0hBTk5FTF0qb2Zmc2V0XTsKCiAgICAgICAgLyogU2V0IG91dHB1dCBjaGFubmVsIHBvaW50ZXIgKHNhbWUgYXMgaW5wdXQpICovCiAgICAgICAgcE91dEwgID0gIHBJblBjbVtMRUZUX0ZST05UX0NIQU5ORUxdOwogICAgICAgIHBPdXRSICA9ICBwSW5QY21bUklHSFRfRlJPTlRfQ0hBTk5FTF07CgogICAgICAgIC8qIFNldCBkb3dubWl4IGxldmVsczogKi8KICAgICAgICBmbGV2ID0gRkwyRlhDT05TVF9ETVgoMC43MDcxMDY3OGYpOwogICAgICAgIC8qIDIvMCBpbnB1dDogKi8KICAgICAgICBzd2l0Y2ggKGR1YWxDaGFubmVsTW9kZSkKICAgICAgICB7CiAgICAgICAgY2FzZSBDSDFfTU9ERTogIC8qIEwnID0gMC43MDcgKiBDaDE7ICBSJyA9IDAuNzA3ICogQ2gxICovCiAgICAgICAgICBmb3IgKHNhbXBsZSA9IDA7IHNhbXBsZSA8IGZyYW1lU2l6ZTsgc2FtcGxlKyspIHsKICAgICAgICAgICAgKnBPdXRMID0gKnBPdXRSID0KICAgICAgICAgICAgICAoSU5UX1BDTSlTQVRVUkFURV9SSUdIVF9TSElGVChmTXVsdCgoRklYUF9QQ00pKnBJblBjbVtMRUZUX0ZST05UX0NIQU5ORUxdLCBmbGV2KSwgREZSQUNUX0JJVFMtU0FNUExFX0JJVFMsIFNBTVBMRV9CSVRTKTsKCiAgICAgICAgICAgIHBJblBjbVtMRUZUX0ZST05UX0NIQU5ORUxdICs9IGluU3RyaWRlOwogICAgICAgICAgICBwT3V0TCArPSBvdXRTdHJpZGU7IHBPdXRSICs9IG91dFN0cmlkZTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgQ0gyX01PREU6ICAvKiBMJyA9IDAuNzA3ICogQ2gyOyAgUicgPSAwLjcwNyAqIENoMiAqLwogICAgICAgICAgZm9yIChzYW1wbGUgPSAwOyBzYW1wbGUgPCBmcmFtZVNpemU7IHNhbXBsZSsrKSB7CiAgICAgICAgICAgICpwT3V0TCA9ICpwT3V0UiA9CiAgICAgICAgICAgICAgKElOVF9QQ00pU0FUVVJBVEVfUklHSFRfU0hJRlQoZk11bHQoKEZJWFBfUENNKSpwSW5QY21bUklHSFRfRlJPTlRfQ0hBTk5FTF0sIGZsZXYpLCBERlJBQ1RfQklUUy1TQU1QTEVfQklUUywgU0FNUExFX0JJVFMpOwoKICAgICAgICAgICAgcEluUGNtW1JJR0hUX0ZST05UX0NIQU5ORUxdICs9IGluU3RyaWRlOwogICAgICAgICAgICBwT3V0TCArPSBvdXRTdHJpZGU7IHBPdXRSICs9IG91dFN0cmlkZTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgTUlYRURfTU9ERTogIC8qIEwnID0gMC41KkNoMSArIDAuNSpDaDI7ICBSJyA9IDAuNSpDaDEgKyAwLjUqQ2gyICovCiAgICAgICAgICBmb3IgKHNhbXBsZSA9IDA7IHNhbXBsZSA8IGZyYW1lU2l6ZTsgc2FtcGxlKyspIHsKICAgICAgICAgICAgKnBPdXRMID0gKnBPdXRSID0gKCpwSW5QY21bTEVGVF9GUk9OVF9DSEFOTkVMXSA+PiAxKSArICgqcEluUGNtW1JJR0hUX0ZST05UX0NIQU5ORUxdID4+IDEpOwoKICAgICAgICAgICAgcEluUGNtW0xFRlRfRlJPTlRfQ0hBTk5FTF0gKz0gaW5TdHJpZGU7ICBwSW5QY21bUklHSFRfRlJPTlRfQ0hBTk5FTF0gKz0gaW5TdHJpZGU7CiAgICAgICAgICAgIHBPdXRMICs9IG91dFN0cmlkZTsgcE91dFIgKz0gb3V0U3RyaWRlOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICBjYXNlIFNURVJFT19NT0RFOgogICAgICAgICAgLyogbm90aGluZyB0byBkbyAqLwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICAgIGJyZWFrOwoKICAgIGRlZmF1bHQ6CiAgICAgIC8qIG5vdGhpbmcgdG8gZG8gKi8KICAgICAgYnJlYWs7CiAgICB9CiAgfQoKICByZXR1cm4gKGVycm9yU3RhdHVzKTsKfQoKCi8qKiBDbG9zZSBhbiBpbnN0YW5jZSBvZiB0aGUgUENNIGRvd25taXggbW9kdWxlLgogKiBAcGFyYW0gW2lub3V0XSBQb2ludGVyIHRvIGEgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIGhhbmRsZSBvZiB0aGUgaW5zdGFuY2UuCiAqIEByZXR1cm5zIFJldHVybnMgYW4gZXJyb3IgY29kZS4KICoqLwpQQ01ETVhfRVJST1IgcGNtRG14X0Nsb3NlICgKICAgIEhBTkRMRV9QQ01fRE9XTk1JWCAqcFNlbGYKICApCnsKICBpZiAocFNlbGYgPT0gTlVMTCkgewogICAgcmV0dXJuIChQQ01ETVhfSU5WQUxJRF9IQU5ETEUpOwogIH0KCiAgRnJlZVBjbURteEluc3RhbmNlKCBwU2VsZiApOwogICpwU2VsZiA9IE5VTEw7CgogIHJldHVybiAoUENNRE1YX09LKTsKfQoKCi8qKiBHZXQgbGlicmFyeSBpbmZvIGZvciB0aGlzIG1vZHVsZS4KICogQHBhcmFtIFtvdXRdIFBvaW50ZXIgdG8gYW4gYWxsb2NhdGVkIExJQl9JTkZPIHN0cnVjdHVyZS4KICogQHJldHVybnMgUmV0dXJucyBhbiBlcnJvciBjb2RlLgogKi8KUENNRE1YX0VSUk9SIHBjbURteF9HZXRMaWJJbmZvKCBMSUJfSU5GTyAqaW5mbyApCnsKICBpbnQgaTsKCiAgaWYgKGluZm8gPT0gTlVMTCkgewogICAgcmV0dXJuIFBDTURNWF9JTlZBTElEX0FSR1VNRU5UOwogIH0KCiAgLyogU2VhcmNoIGZvciBuZXh0IGZyZWUgdGFiICovCiAgZm9yIChpID0gMDsgaSA8IEZES19NT0RVTEVfTEFTVDsgaSsrKSB7CiAgICBpZiAoaW5mb1tpXS5tb2R1bGVfaWQgPT0gRkRLX05PTkUpIGJyZWFrOwogIH0KICBpZiAoaSA9PSBGREtfTU9EVUxFX0xBU1QpIHsKICAgIHJldHVybiBQQ01ETVhfVU5LTk9XTjsKICB9CgogIC8qIEFkZCB0aGUgbGlicmFyeSBpbmZvICovCiAgaW5mb1tpXS5tb2R1bGVfaWQgID0gRkRLX1BDTURNWDsKICBpbmZvW2ldLnZlcnNpb24gICAgPSBMSUJfVkVSU0lPTihQQ01ETVhfTElCX1ZMMCwgUENNRE1YX0xJQl9WTDEsIFBDTURNWF9MSUJfVkwyKTsKICBMSUJfVkVSU0lPTl9TVFJJTkcoaW5mbytpKTsKICBpbmZvW2ldLmJ1aWxkX2RhdGUgPSBQQ01ETVhfTElCX0JVSUxEX0RBVEU7CiAgaW5mb1tpXS5idWlsZF90aW1lID0gUENNRE1YX0xJQl9CVUlMRF9USU1FOwogIGluZm9baV0udGl0bGUgICAgICA9IFBDTURNWF9MSUJfVElUTEU7CgogIC8qIFNldCBmbGFncyAqLwogIGluZm9baV0uZmxhZ3MgPSAwCiNpZmRlZiBQQ01fRE9XTk1JWF9FTkFCTEUKICAgICAgfCBDQVBGX0RNWF9CTElORCAgIC8qIEF0IGxlYXN0IGJsaW5kIGRvd25taXhpbmcgaXMgcG9zc2libGUgKi8KICNpZmRlZiBQQ0VfTUVUQURBVEFfRU5BQkxFCiAgICAgIHwgQ0FQRl9ETVhfUENFICAgICAvKiBHdWlkZWQgZG93bm1peCB3aXRoIGRhdGEgZnJvbSBNUEVHLTIvNCBQcm9ncmFtIENvbmZpZyBFbGVtZW50cyAoUENFKS4gKi8KICAjaWZkZWYgQVJJQl9NSVhET1dOX0VOQUJMRQogICAgICB8IENBUEZfRE1YX0FSSUIgICAgLyogUENFIGd1aWRlZCBkb3dubWl4IHdpdGggc2xpZ2h0bHkgZGlmZmVyZW50IGVxdWF0aW9ucyBhbmQgbGV2ZWxzLiAqLwogICNlbmRpZgogI2VuZGlmIC8qIFBDRV9NRVRBREFUQV9FTkFCTEUgKi8KICNpZmRlZiBEU0VfTUVUQURBVEFfRU5BQkxFCiAgICAgIHwgQ0FQRl9ETVhfRFZCICAgICAvKiBHdWlkZWQgZG93bm1peCB3aXRoIGRhdGEgZnJvbSBEVkIgYW5jaWxsYXJ5IGRhdGEgZmllbGRzLiAqLwogI2VuZGlmCiNlbmRpZiAvKiBQQ01fRE9XTk1JWF9FTkFCTEUgKi8KI2lmZGVmIFBDTV9DSEFOTkVMX0VYVEVOU0lPTl9FTkFCTEUKICAgICAgfCBDQVBGX0RNWF9DSF9FWFAgIC8qIFNpbXBsZSB1cG1peGluZyBieSBkdWJsaWNhdGluZyBjaGFubmVscyBvciBhZGRpbmcgemVybyBjaGFubmVscy4gKi8KI2VuZGlmCiAgICAgIDsKCiAgLyogQWRkIGxpYiBpbmZvIGZvciBGREsgdG9vbHMgKGlmIG5vdCB5ZXQgZG9uZSkuICovCiAgRkRLX3Rvb2xzR2V0TGliSW5mbyhpbmZvKTsKCiAgcmV0dXJuIFBDTURNWF9PSzsKfQoKCgo=