Ci8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAoKqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAxLiAgICBJTlRST0RVQ1RJT04KVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwp0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCgpBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQppbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydApvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KClBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwppbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCnRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCnRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwpzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCgpDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAphcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCgoyLiAgICBDT1BZUklHSFQgTElDRU5TRQoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CnBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKCllvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCnlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCgpZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCllvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgoKVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dApwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCgpZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCnNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgoKWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCiJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCgozLiAgICBOTyBQQVRFTlQgTElDRU5TRQoKTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCkFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCnJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KCllvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZApieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCgo0LiAgICBESVNDTEFJTUVSCgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwpvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgpDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCmluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCm9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCmFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgoKNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgoKRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCkF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCkFtIFdvbGZzbWFudGVsIDMzCjkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Cgp3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCmFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKiEKICBcZmlsZQogIFxicmllZiAgRW52ZWxvcGUgZXh0cmFjdGlvbiBwcm90b3R5cGVzICAKKi8KCiNpZm5kZWYgX19FTlZFTE9QRV9FWFRSQUNUSU9OX0gKI2RlZmluZSBfX0VOVkVMT1BFX0VYVFJBQ1RJT05fSAoKI2luY2x1ZGUgInNicmRlY29kZXIuaCIKCiNpbmNsdWRlICJGREtfYml0c3RyZWFtLmgiCiNpbmNsdWRlICJscHBfdHJhbi5oIgoKI2luY2x1ZGUgInBzZGVjLmgiCgojZGVmaW5lIEVOVl9FWFBfRlJBQ1QgMAovKiE8IFNoaWZ0IHJhdyBlbnZlbG9wZSBkYXRhIHRvIHN1cHBvcnQgZnJhY3Rpb25hbCBudW1iZXJzLgogIENhbiBiZSBzZXQgdG8gOCBpbnN0ZWFkIG9mIDAgdG8gZW5oYW5jZSBhY2N1cmFjeSBkdXJpbmcgY29uY2VhbG1lbnQuCiAgVGhpcyBpcyBub3QgcmVxdWlyZWQgZm9yIGNvbmZvcm1hbmNlIGFuZCAjcmVxdWFudGl6ZUVudmVsb3BlRGF0YSgpIHdpbGwKICBiZWNvbWUgbW9yZSBleHBlbnNpdmUuCiovCgojZGVmaW5lIEVYUF9CSVRTIDYKLyohPCBTaXplIG9mIGV4cG9uZW50LXBhcnQgb2YgYSBwc2V1ZG8gZmxvYXQgZW52ZWxvcGUgdmFsdWUgKHNob3VsZCBiZSBhdCBsZWFzdCA2KS4KICBUaGUgcmVtYWluaW5nIGJpdHMgaW4gZWFjaCB3b3JkIGFyZSB1c2VkIGZvciB0aGUgbWFudGlzc2EgKHNob3VsZCBiZSBhdCBsZWFzdCAxMCkuCiAgVGhpcyBmb3JtYXQgaXMgdXNlZCBpbiB0aGUgYXJyYXlzIGlFbnZlbG9wZVtdIGFuZCBzYnJOb2lzZUZsb29yTGV2ZWxbXQogIGluIHRoZSBGUkFNRV9EQVRBIHN0cnVjdCB3aGljaCBtdXN0IGZpdCBpbiBhIGNlcnRhaW4gcGFydCBvZiB0aGUgb3V0cHV0IGJ1ZmZlcgogIChTZWUgYnVmZmVyIG1hbmFnZW1lbnQgaW4gc2JyX2RlYy5jcHApLgogIEV4cG9uZW50cyBhbmQgbWFudGlzc2FzIGNvdWxkIGFsc28gYmUgc3RvcmVkIGluIHNlcGFyYXRlIGFycmF5cy4KICBBY2Nlc3NpbmcgdGhlIGV4cG9uZW50IG9yIHRoZSBtYW50aXNzYSB3b3VsZCBiZSBzaW1wbGlmaWVkIGFuZCB0aGUgbWFza3MgI01BU0tfRQogIHJlc3AuICNNQVNLX00gd291bGQgICBubyBsb25nZXIgYmUgcmVxdWlyZWQuCiovCgojZGVmaW5lIE1BU0tfTSAoKCgxIDw8IChGUkFDVF9CSVRTIC0gRVhQX0JJVFMpKSAtIDEpIDw8IEVYUF9CSVRTKSAgLyohPCBNYXNrIGZvciBleHRyYWN0aW5nIHRoZSBtYW50aXNzYSBvZiBhIHBzZXVkbyBmbG9hdCBlbnZlbG9wZSB2YWx1ZSAqLwojZGVmaW5lIE1BU0tfRSAoKDEgPDwgRVhQX0JJVFMpIC0gMSkgICAgICAgICAgIC8qITwgTWFzayBmb3IgZXh0cmFjdGluZyB0aGUgZXhwb25lbnQgb2YgYSBwc2V1ZG8gZmxvYXQgZW52ZWxvcGUgdmFsdWUgKi8KCiNkZWZpbmUgU0lHTl9FWFQgKCAoKFNDSEFSKS0xKSBeIE1BU0tfRSkgICAgICAgIC8qITwgYSBDSEFSLWNvbnN0YW50IHdpdGggYWxsIGJpdHMgYWJvdmUgb3VyIHNpZ24tYml0IHNldCAqLwojZGVmaW5lIFJPVU5ESU5HICggKEZJWFBfU0dMKSgxPDwoRVhQX0JJVFMtMSkpICkgLyohPCAwLjUtb2Zmc2V0IGZvciByb3VuZGluZyB0aGUgbWFudGlzc2Egb2YgYSBwc2V1ZG8tZmxvYXQgZW52ZWxvcGUgdmFsdWUgKi8KI2RlZmluZSBOUkdfRVhQX09GRlNFVCAgMTYgICAgICAgICAgICAgICAgICAgICAvKiE8IFdpbGwgYmUgYWRkZWQgdG8gdGhlIHJlZmVyZW5jZSBlbmVyZ3kncyBleHBvbmVudCB0byBwcmV2ZW50IG5lZ2F0aXZlIG51bWJlcnMgKi8KI2RlZmluZSBOT0lTRV9FWFBfT0ZGU0VUICAzOCAgICAgICAgICAgICAgICAgICAvKiE8IFdpbGwgYmUgYWRkZWQgdG8gdGhlIG5vaXNlIGxldmVsIGV4cG9uZW50IHRvIHByZXZlbnQgbmVnYXRpdmUgbnVtYmVycyAqLwoKdHlwZWRlZiBlbnVtCnsKICBIRUFERVJfTk9UX1BSRVNFTlQsCiAgSEVBREVSX09LLAogIEhFQURFUl9SRVNFVAp9ClNCUl9IRUFERVJfU1RBVFVTOwoKdHlwZWRlZiBlbnVtCnsKICBTQlJfTk9UX0lOSVRJQUxJWkVELAogIFVQU0FNUExJTkcsCiAgU0JSX0hFQURFUiwKICBTQlJfQUNUSVZFCn0KU0JSX1NZTkNfU1RBVEU7CgoKdHlwZWRlZiBlbnVtCnsKICBDT1VQTElOR19PRkYgPSAwLAogIENPVVBMSU5HX0xFVkVMLAogIENPVVBMSU5HX0JBTAp9CkNPVVBMSU5HX01PREU7Cgp0eXBlZGVmIHN0cnVjdAp7CiAgVUNIQVIgblNmYlsyXTsgICAgICAgICAgIC8qITwgTnVtYmVyIG9mIFNCUi1iYW5kcyBmb3IgbG93IGFuZCBoaWdoIGZyZXEtcmVzb2x1dGlvbiAqLwogIFVDSEFSIG5OZmI7ICAgICAgICAgICAgICAvKiE8IEFjdHVhbCBudW1iZXIgb2Ygbm9pc2UgYmFuZHMgdG8gcmVhZCBmcm9tIHRoZSBiaXRzdHJlYW0qLwogIFVDSEFSIG51bU1hc3RlcjsgICAgICAgICAvKiE8IE51bWJlciBvZiBTQlItYmFuZHMgaW4gdl9rX21hc3RlciAqLwogIFVDSEFSIGxvd1N1YmJhbmQ7ICAgICAgICAvKiE8IFFNRi1iYW5kIHdoZXJlIFNCUiBmcmVxdWVuY3kgcmFuZ2Ugc3RhcnRzICovCiAgVUNIQVIgaGlnaFN1YmJhbmQ7ICAgICAgIC8qITwgUU1GLWJhbmQgd2hlcmUgU0JSIGZyZXF1ZW5jeSByYW5nZSBlbmRzICovCiAgVUNIQVIgbGltaXRlckJhbmRUYWJsZVtNQVhfTlVNX0xJTUlURVJTKzFdOyAvKiE8IExpbWl0ZXIgYmFuZCB0YWJsZS4gKi8KICBVQ0hBUiBub0xpbWl0ZXJCYW5kczsgICAgLyohPCBOdW1iZXIgb2YgbGltaXRlciBiYW5kcy4gKi8KICBVQ0hBUiBuSW52ZkJhbmRzOyAgICAgICAgLyohPCBOdW1iZXIgb2YgYmFuZHMgZm9yIGludmVyc2UgZmlsdGVyaW5nICovCiAgVUNIQVIgKmZyZXFCYW5kVGFibGVbMl07IC8qITwgUG9pbnRlcnMgdG8gZnJlcUJhbmRUYWJsZUxvIGFuZCBmcmVxQmFuZFRhYmxlSGkgKi8KICBVQ0hBUiBmcmVxQmFuZFRhYmxlTG9bTUFYX0ZSRVFfQ09FRkZTLzIrMV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBNYXBwaW5nIG9mIFNCUiBiYW5kcyB0byBRTUYgYmFuZHMgZm9yIGxvdyBmcmVxdWVuY3kgcmVzb2x1dGlvbiAqLwogIFVDSEFSIGZyZXFCYW5kVGFibGVIaVtNQVhfRlJFUV9DT0VGRlMrMV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBNYXBwaW5nIG9mIFNCUiBiYW5kcyB0byBRTUYgYmFuZHMgZm9yIGhpZ2ggZnJlcXVlbmN5IHJlc29sdXRpb24gKi8KICBVQ0hBUiBmcmVxQmFuZFRhYmxlTm9pc2VbTUFYX05PSVNFX0NPRUZGUysxXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IE1hcHBpbmcgb2YgU0JSIG5vaXNlIGJhbmRzIHRvIFFNRiBiYW5kcyAqLwogIFVDSEFSIHZfa19tYXN0ZXJbTUFYX0ZSRVFfQ09FRkZTKzFdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgTWFzdGVyIEJhbmRUYWJsZSB3aGljaCBmcmVxQmFuZFRhYmxlIGlzIGRlcml2ZWQgZnJvbSAqLwp9CkZSRVFfQkFORF9EQVRBOwoKdHlwZWRlZiBGUkVRX0JBTkRfREFUQSAqSEFORExFX0ZSRVFfQkFORF9EQVRBOwoKI2RlZmluZSBTQlJERUNfRUxEX0dSSUQgICAgICAgIDEKI2RlZmluZSBTQlJERUNfU1lOVEFYX1NDQUwgICAgIDIKI2RlZmluZSBTQlJERUNfU1lOVEFYX1VTQUMgICAgIDQKI2RlZmluZSBTQlJERUNfU1lOVEFYX1JTVkQ1MCAgIDgKI2RlZmluZSBTQlJERUNfTE9XX1BPV0VSICAgICAgMTYgIC8qIEZsYWcgaW5kaWNhdGluZyB0aGF0IExvdyBQb3dlciBRTUYgbW9kZSBzaGFsbCBiZSB1c2VkLiAqLwojZGVmaW5lIFNCUkRFQ19QU19ERUNPREVEICAgICAzMiAgLyogRmxhZyBpbmRpY2F0aW5nIHRoYXQgUFMgd2FzIGRlY29kZWQgYW5kIHJlbmRlcmVkLiAqLwojZGVmaW5lIFNCUkRFQ19MRF9NUFNfUU1GICAgIDUxMiAgLyogRmxhZyBpbmRpY2F0aW5nIHRoYXQgdGhlIExELU1QUyBRTUYgc2hhbGwgYmUgdXNlZC4gKi8KI2RlZmluZSBTQlJERUNfRkxVU0ggICAgICAgMTYzODQgIC8qIEZsYWcgaXMgdXNlZCB0byBmbHVzaCBhbGwgZWxlbWVudHMgaW4gdXNlLiAqLwojZGVmaW5lIFNCUkRFQ19GT1JDRV9SRVNFVCAzMjc2OCAgLyogRmxhZyBpcyB1c2VkIHRvIGZvcmNlIGEgcmVzZXQgb2YgYWxsIGVsZW1lbnRzIGluIHVzZS4gKi8KCiNkZWZpbmUgU0JSREVDX0hEUl9TVEFUX1JFU0VUICAxCiNkZWZpbmUgU0JSREVDX0hEUl9TVEFUX1VQREFURSAyCgp0eXBlZGVmIHN0cnVjdCB7CiAgVUNIQVIgYW1wUmVzb2x1dGlvbjsgICAgICAgLyohPCBBbXBsaXR1ZGUgcmVzb2x1dGlvbiBvZiBlbnZlbG9wZSB2YWx1ZXMgKDA6IDEuNWRCLCAxOiAzZEIpICovCiAgVUNIQVIgeG92ZXJfYmFuZDsgICAgICAgICAgLyohPCBTdGFydCBpbmRleCBpbiAjdl9rX21hc3RlcltdIHVzZWQgZm9yIGR5bmFtaWMgY3Jvc3NvdmVyIGZyZXF1ZW5jeSAqLwogIFVDSEFSIHNicl9wcmVwcm9jZXNzaW5nOyAgIC8qITwgU0JSIHByZXdoaXRlbmluZyBmbGFnLiAqLwp9IFNCUl9IRUFERVJfREFUQV9CU19JTkZPOwoKdHlwZWRlZiBzdHJ1Y3QgewogIC8qIENoYW5nZXMgaW4gdGhlc2UgdmFyaWFibGVzIGNhdXNlcyBhIHJlc2V0IG9mIHRoZSBkZWNvZGVyICovCiAgVUNIQVIgc3RhcnRGcmVxOyAgICAgICAgICAgLyohPCBJbmRleCBmb3IgU0JSIHN0YXJ0IGZyZXF1ZW5jeSAqLwogIFVDSEFSIHN0b3BGcmVxOyAgICAgICAgICAgIC8qITwgSW5kZXggZm9yIFNCUiBoaWdoZXN0IGZyZXF1ZW5jeSAqLwogIFVDSEFSIGZyZXFTY2FsZTsgICAgICAgICAgIC8qITwgMDogbGluZWFyIHNjYWxlLCAgMS0zIGxvZ2FyaXRobWljIHNjYWxlcyAqLwogIFVDSEFSIGFsdGVyU2NhbGU7ICAgICAgICAgIC8qITwgRmxhZyBmb3IgY29hcnNlciBmcmVxdWVuY3kgcmVzb2x1dGlvbiAqLwogIFVDSEFSIG5vaXNlX2JhbmRzOyAgICAgICAgIC8qITwgTm9pc2UgYmFuZHMgcGVyIG9jdGF2ZSwgcmVhZCBmcm9tIGJpdHN0cmVhbSovCgogIC8qIGRvbid0IHJlcXVpcmUgcmVzZXQgKi8KICBVQ0hBUiBsaW1pdGVyQmFuZHM7ICAgICAgICAvKiE8IEluZGV4IGZvciBudW1iZXIgb2YgbGltaXRlciBiYW5kcyBwZXIgb2N0YXZlICovCiAgVUNIQVIgbGltaXRlckdhaW5zOyAgICAgICAgLyohPCBJbmRleCB0byBzZWxlY3QgZ2FpbiBsaW1pdCAqLwogIFVDSEFSIGludGVycG9sRnJlcTsgICAgICAgIC8qITwgU2VsZWN0IGdhaW4gY2FsY3VsYXRpb24gbWV0aG9kICgxOiBwZXIgUU1GIGNoYW5uZWwsIDA6IHBlciBTQlIgYmFuZCkgKi8KICBVQ0hBUiBzbW9vdGhpbmdMZW5ndGg7ICAgICAvKiE8IFNtb290aGluZyBvZiBnYWlucyBvdmVyIHRpbWUgKDA6IG9uICAxOiBvZmYpICovCgp9IFNCUl9IRUFERVJfREFUQV9CUzsKCnR5cGVkZWYgc3RydWN0CnsKICBTQlJfU1lOQ19TVEFURSBzeW5jU3RhdGU7ICAgIC8qITwgVGhlIGN1cnJlbnQgaW5pdGlhbGl6YXRpb24gc3RhdHVzIG9mIHRoZSBoZWFkZXIgKi8KCiAgVUNIQVIgc3RhdHVzOyAgICAgICAgICAgICAgICAvKiE8IEZsYWdzIGZpZWxkIHVzZWQgZm9yIHNpZ25hbGluZyBhIHJlc2V0IHJpZ2h0IGJlZm9yZSB0aGUgcHJvY2Vzc2luZyBzdGFydHMgYW5kIGFuIHVwZGF0ZSBmcm9tIGNvbmZpZyAoZS5nLiBBU0MpLiAqLwogIFVDSEFSIGZyYW1lRXJyb3JGbGFnOyAgICAgICAgLyohPCBGcmFtZSBkYXRhIHZhbGlkIGZsYWcuIENBVVRJT046IFRoaXMgdmFyaWFibGUgd2lsbCBiZSBvdmVyd3JpdHRlbiBieSB0aGUgZmxhZyBzdG9yZWQgaW4gdGhlIGVsZW1lbnQgc3RydWN0dXJlLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIG9mIHRoZSBmcmFtZSBkZWxheS4gVGhlcmUgaXQgbWlnaHQgaGFwcGVuIHRoYXQgZGlmZmVyZW50IHNsb3RzIHVzZSB0aGUgc2FtZSBoZWFkZXIuICovCiAgVUNIQVIgbnVtYmVyVGltZVNsb3RzOyAgICAgICAvKiE8IEFBQzogMTYsMTUgKi8KICBVQ0hBUiBudW1iZXJPZkFuYWx5c2lzQmFuZHM7IC8qITwgTnVtYmVyIG9mIFFNRiBhbmFseXNpcyBiYW5kcyAqLwogIFVDSEFSIHRpbWVTdGVwOyAgICAgICAgICAgICAgLyohPCBUaW1lIHJlc29sdXRpb24gb2YgU0JSIGluIFFNRi1zbG90cyAqLwogIFVJTlQgIHNiclByb2NTbXBsUmF0ZTsgICAgICAgLyohPCBTQlIgcHJvY2Vzc2luZyBzYW1wbGluZyBmcmVxdWVuY3kgKCE9IE91dHB1dFNhbXBsaW5nUmF0ZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhbHdheXM6IENvcmVTYW1wbGluZ1JhdGUgKiBVcFNhbXBsaW5nRmFjdG9yOyBldmVuIGluIHNpbmdsZSByYXRlIG1vZGUpICovCgogIFNCUl9IRUFERVJfREFUQV9CUyAgICAgIGJzX2RhdGE7ICAvKiE8IGN1cnJlbnQgU0JSIGhlYWRlci4gKi8KICBTQlJfSEVBREVSX0RBVEFfQlNfSU5GTyBic19pbmZvOyAgLyohPCBTQlIgaW5mby4gKi8KCiAgRlJFUV9CQU5EX0RBVEEgZnJlcUJhbmREYXRhOyAgLyohPCBQb2ludGVyIHRvIHN0cnVjdCAjRlJFUV9CQU5EX0RBVEEgKi8KfQpTQlJfSEVBREVSX0RBVEE7Cgp0eXBlZGVmIFNCUl9IRUFERVJfREFUQSAqSEFORExFX1NCUl9IRUFERVJfREFUQTsKCgp0eXBlZGVmIHN0cnVjdAp7CiAgVUNIQVIgZnJhbWVDbGFzczsgICAgICAgICAgICAgICAvKiE8IFNlbGVjdCBncmlkIHR5cGUgKi8KICBVQ0hBUiBuRW52ZWxvcGVzOyAgICAgICAgICAgICAgIC8qITwgTnVtYmVyIG9mIGVudmVsb3BlcyAqLwogIFVDSEFSIGJvcmRlcnNbTUFYX0VOVkVMT1BFUysxXTsgLyohPCBFbnZlbG9wZSBib3JkZXJzIChpbiBTQlItdGltZXNsb3RzLCBlLmcuIG1wM1BSTzogMC4uMTEpICovCiAgVUNIQVIgZnJlcVJlc1tNQVhfRU5WRUxPUEVTXTsgICAvKiE8IEZyZXF1ZW5jeSByZXNvbHV0aW9uIGZvciBlYWNoIGVudmVsb3BlICgwPWxvdywgMT1oaWdoKSAqLwogIFNDSEFSICB0cmFuRW52OyAgICAgICAgICAgICAgICAgLyohPCBUcmFuc2llbnQgZW52ZWxvcGUsIC0xIGlmIG5vbmUgKi8KICBVQ0hBUiBuTm9pc2VFbnZlbG9wZXM7ICAgICAgICAgIC8qITwgTnVtYmVyIG9mIG5vaXNlIGVudmVsb3BlcyAqLwogIFVDSEFSIGJvcmRlcnNOb2lzZVtNQVhfTk9JU0VfRU5WRUxPUEVTKzFdOy8qITwgYm9yZGVycyBvZiBub2lzZSBlbnZlbG9wZXMgKi8KfQpGUkFNRV9JTkZPOwoKCnR5cGVkZWYgc3RydWN0CnsKICBGSVhQX1NHTCBzZmJfbnJnX3ByZXZbTUFYX0ZSRVFfQ09FRkZTXTsgICAgLyohPCBQcmV2aW91cyBlbnZlbG9wZSAocmVxdWlyZWQgZm9yIGRpZmZlcmVudGlhbC1jb2RlZCB2YWx1ZXMpICovCiAgRklYUF9TR0wgcHJldk5vaXNlTGV2ZWxbTUFYX05PSVNFX0NPRUZGU107IC8qITwgUHJldmlvdXMgbm9pc2UgZW52ZWxvcGUgKHJlcXVpcmVkIGZvciBkaWZmZXJlbnRpYWwtY29kZWQgdmFsdWVzKSAqLwogIENPVVBMSU5HX01PREUgY291cGxpbmc7ICAgICAgICAgICAgICAgICAgICAvKiE8IFN0ZXJlby1tb2RlIG9mIHByZXZpb3VzIGZyYW1lICovCiAgSU5WRl9NT0RFIHNicl9pbnZmX21vZGVbTUFYX0lOVkZfQkFORFNdOyAgIC8qITwgUHJldmlvdXMgc3RyZW5ndGggb2YgZmlsdGVyaW5nIGluIHRyYW5zcG9zZXIgKi8KICBVQ0hBUiBhbXBSZXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBQcmV2aW91cyBhbXBsaXR1ZGUgcmVzb2x1dGlvbiAoMDogMS41ZEIsIDE6IDNkQikgKi8KICBVQ0hBUiBzdG9wUG9zOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBQb3NpdGlvbiBpbiB0aW1lIHdoZXJlIGxhc3QgZW52ZWxvcGUgZW5kZWQgKi8KICBVQ0hBUiBmcmFtZUVycm9yRmxhZzsgICAgICAgICAgICAgICAgICAgICAgLyohPCBQcmV2aW91cyBmcmFtZSBzdGF0dXMgKi8KfQpTQlJfUFJFVl9GUkFNRV9EQVRBOwoKdHlwZWRlZiBTQlJfUFJFVl9GUkFNRV9EQVRBICpIQU5ETEVfU0JSX1BSRVZfRlJBTUVfREFUQTsKCgp0eXBlZGVmIHN0cnVjdAp7CiAgaW50IG5TY2FsZUZhY3RvcnM7ICAgICAgICAgICAgICAgICAgICAvKiE8IHRvdGFsIG51bWJlciBvZiBzY2FsZWZhY3RvcnMgaW4gZnJhbWUgKi8KCiAgRlJBTUVfSU5GTyBmcmFtZUluZm87ICAgICAgICAgICAgICAgICAvKiE8IHRpbWUgZ3JpZCBmb3IgY3VycmVudCBmcmFtZSAqLwogIFVDSEFSIGRvbWFpbl92ZWNbTUFYX0VOVkVMT1BFU107ICAgICAgLyohPCBCaXRmaWVsZCBjb250YWluaW5nIGRpcmVjdGlvbiBvZiBkZWx0YS1jb2RpbmcgZm9yIGVhY2ggZW52ZWxvcGUgKDA6ZnJlcXVlbmN5LCAxOnRpbWUpICovCiAgVUNIQVIgZG9tYWluX3ZlY19ub2lzZVtNQVhfTk9JU0VfRU5WRUxPUEVTXTsgLyohPCBTYW1lIGFzIGFib3ZlLCBidXQgZm9yIG5vaXNlIGVudmVsb3BlcyAqLwoKICBJTlZGX01PREUgc2JyX2ludmZfbW9kZVtNQVhfSU5WRl9CQU5EU107IC8qITwgU3RyZW5ndGggb2YgZmlsdGVyaW5nIGluIHRyYW5zcG9zZXIgKi8KICBDT1VQTElOR19NT0RFIGNvdXBsaW5nOyAgICAgICAgICAgICAgICAgIC8qITwgU3RlcmVvLW1vZGUgKi8KICBpbnQgYW1wUmVzb2x1dGlvbkN1cnJlbnRGcmFtZTsgICAgICAgICAgIC8qITwgQW1wbGl0dWRlIHJlc29sdXRpb24gb2YgZW52ZWxvcGUgdmFsdWVzICgwOiAxLjVkQiwgMTogM2RCKSAqLwoKICBVQ0hBUiBhZGRIYXJtb25pY3NbTUFYX0ZSRVFfQ09FRkZTXTsgICAgIC8qITwgRmxhZ3MgZm9yIHN5bnRoZXRpYyBzaW5lIGFkZGl0aW9uICovCgogIEZJWFBfU0dMIGlFbnZlbG9wZVtNQVhfTlVNX0VOVkVMT1BFX1ZBTFVFU107ICAgICAgIC8qITwgRW52ZWxvcGUgZGF0YSAqLwogIEZJWFBfU0dMIHNick5vaXNlRmxvb3JMZXZlbFtNQVhfTlVNX05PSVNFX1ZBTFVFU107IC8qITwgTm9pc2UgZW52ZWxvcGUgZGF0YSAqLwp9ClNCUl9GUkFNRV9EQVRBOwoKdHlwZWRlZiBTQlJfRlJBTUVfREFUQSAqSEFORExFX1NCUl9GUkFNRV9EQVRBOwoKdm9pZCBpbml0U2JyUHJldkZyYW1lRGF0YSAoSEFORExFX1NCUl9QUkVWX0ZSQU1FX0RBVEEgaF9wcmV2X2RhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aW1lU2xvdHMpOwoKCmludCBzYnJHZXRTaW5nbGVDaGFubmVsRWxlbWVudCAoSEFORExFX1NCUl9IRUFERVJfREFUQSBoSGVhZGVyRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0ZSQU1FX0RBVEEgIGhGcmFtZURhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gICBoQml0QnVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9QU19ERUMgaFBhcmFtZXRyaWNTdGVyZW9EZWMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCAgICAgICAgICAgICBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgICAgICAgICAgICAgIG92ZXJsYXAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CgppbnQgc2JyR2V0Q2hhbm5lbFBhaXJFbGVtZW50IChIQU5ETEVfU0JSX0hFQURFUl9EQVRBIGhIZWFkZXJEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0ZSQU1FX0RBVEEgIGhGcmFtZURhdGFMZWZ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0ZSQU1FX0RBVEEgIGhGcmFtZURhdGFSaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gICBoQml0QnVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UICAgICAgICAgICAgIGZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgICAgICAgICAgICAgIG92ZXJsYXApOwoKU0JSX0hFQURFUl9TVEFUVVMKc2JyR2V0SGVhZGVyRGF0YSAoSEFORExFX1NCUl9IRUFERVJfREFUQSBoZWFkZXJEYXRhLAogICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSAgIGhCaXRCdWYsCiAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgICAgICAgICAgICAgZmxhZ3MsCiAgICAgICAgICAgICAgICAgIGNvbnN0IGludCAgICAgICAgICAgICAgZklzU2JyRGF0YSk7CgovKiEKICBcYnJpZWYgICAgIEluaXRpYWxpemUgU0JSIGhlYWRlciBkYXRhCgogIENvcHkgZGVmYXVsdCB2YWx1ZXMgdG8gdGhlIGhlYWRlciBkYXRhIHN0cnVjdCBhbmQgcGF0Y2ggc29tZSBlbnRyaWVzCiAgZGVwZW5kaW5nIG9uIHRoZSBjb3JlIGNvZGVjLgoqLwpTQlJfRVJST1IKaW5pdEhlYWRlckRhdGEgKAogICAgICAgIEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgIGhIZWFkZXJEYXRhLAogICAgICAgIGNvbnN0IGludCAgICAgICAgICAgICAgIHNhbXBsZVJhdGVJbiwKICAgICAgICBjb25zdCBpbnQgICAgICAgICAgICAgICBzYW1wbGVSYXRlT3V0LAogICAgICAgIGNvbnN0IGludCAgICAgICAgICAgICAgIHNhbXBsZXNQZXJGcmFtZSwKICAgICAgICBjb25zdCBVSU5UICAgICAgICAgICAgICBmbGFncwogICAgICAgICk7CiNlbmRpZgo=