Ci8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAoKqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAxLiAgICBJTlRST0RVQ1RJT04KVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwp0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCgpBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQppbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydApvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KClBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwppbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCnRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCnRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwpzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCgpDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAphcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCgoyLiAgICBDT1BZUklHSFQgTElDRU5TRQoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CnBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKCllvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCnlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCgpZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCllvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgoKVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dApwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCgpZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCnNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgoKWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCiJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCgozLiAgICBOTyBQQVRFTlQgTElDRU5TRQoKTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCkFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCnJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KCllvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZApieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCgo0LiAgICBESVNDTEFJTUVSCgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwpvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgpDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCmluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCm9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCmFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgoKNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgoKRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCkF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCkFtIFdvbGZzbWFudGVsIDMzCjkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Cgp3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCmFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKioqKioqKioqKioqKioqKioqKioqKioqKiAgRmFzdCBNUEVHIEFBQyBBdWRpbyBFbmNvZGVyICAqKioqKioqKioqKioqKioqKioqKioqCgogICBJbml0aWFsIGF1dGhvcjogICAgICAgQS4gR3JvZXNjaGVsCiAgIGNvbnRlbnRzL2Rlc2NyaXB0aW9uOiBjaGFubmVsIG1hcHBpbmcgZnVuY3Rpb25hbGl0eQoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKI2luY2x1ZGUgImNoYW5uZWxfbWFwLmgiCiNpbmNsdWRlICJiaXRlbmMuaCIKI2luY2x1ZGUgInBzeV9jb25zdC5oIgojaW5jbHVkZSAicWNfZGF0YS5oIgojaW5jbHVkZSAiYWFjRW5jX3JhbS5oIgoKCi8qIGNoYW5uZWxfYXNzaWdubWVudCB0cmVhdHMgdGhlIHJlbGF0aW9uc2hpcCBvZiBJbnB1dCBmaWxlIGNoYW5uZWxzCiAgIHRvIHRoZSBlbmNvZGVyIGNoYW5uZWxzLgogICBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHRoZSB1c3VhbCBvcmRlciBpbiBSSUZGIGZpbGVzICgud2F2KQogICBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgZWxlbWVudHMgb3JkZXIgaW4gdGhlIGNvZGVyIGdpdmVuCiAgIGJ5IFRhYmxlIDguMSAoaW1wbGljaXQgc3BlYWtlciBtYXBwaW5nKSBvZiB0aGUgQUFDIHN0YW5kYXJkLgoKICAgSW4gbW9ubyBhbmQgc3RlcmVvIGNhc2UsIHRoaXMgaXMgdHJpdmlhbC4KICAgSW4gbWMgY2FzZSwgaXQgbG9va3MgbGlrZSB0aGlzOgoKICAgQ2hhbm5lbCAgICAgICAgIElucHV0IGZpbGUgICAgICAgY29kZXIgY2hhbgo1Y2g6CiAgIGZyb250IGNlbnRlciAgICAyICAgICAgICAgICAgICAgIDAgKFNDRSBjaGFubmVsKQogICBsZWZ0IGNlbnRlciAgICAgMCAgICAgICAgICAgICAgICAxICgxc3Qgb2YgMXN0IENQRSkKICAgcmlnaHQgY2VudGVyICAgIDEgICAgICAgICAgICAgICAgMiAoMm5kIG9mIDFzdCBDUEUpCiAgIGxlZnQgc3Vycm91bmQgICAzICAgICAgICAgICAgICAgIDMgKDFzdCBvZiAybmQgQ1BFKQogICByaWdodCBzdXJyb3VuZCAgNCAgICAgICAgICAgICAgICA0ICgybmQgb2YgMm5kIENQRSkKCjUuMWNoOgogICBmcm9udCBjZW50ZXIgICAgMiAgICAgICAgICAgICAgICAwIChTQ0UgY2hhbm5lbCkKICAgbGVmdCBjZW50ZXIgICAgIDAgICAgICAgICAgICAgICAgMSAoMXN0IG9mIDFzdCBDUEUpCiAgIHJpZ2h0IGNlbnRlciAgICAxICAgICAgICAgICAgICAgIDIgKDJuZCBvZiAxc3QgQ1BFKQogICBsZWZ0IHN1cnJvdW5kICAgNCAgICAgICAgICAgICAgICAzICgxc3Qgb2YgMm5kIENQRSkKICAgcmlnaHQgc3Vycm91bmQgIDUgICAgICAgICAgICAgICAgNCAoMm5kIG9mIDJuZCBDUEUpCiAgIExGRSAgICAgICAgICAgICAzICAgICAgICAgICAgICAgIDUgKExGRSkKKi8KCnR5cGVkZWYgc3RydWN0IHsKCiAgQ0hBTk5FTF9NT0RFICBlbmNvZGVyTW9kZTsKICBJTlQgICAgICAgICAgIGNoYW5uZWxfYXNzaWdubWVudFsvKig4KSovMTJdOwoKfSBDSEFOTkVMX0FTU0lHTk1FTlRfSU5GT19UQUI7CgoKc3RhdGljIGNvbnN0IENIQU5ORUxfQVNTSUdOTUVOVF9JTkZPX1RBQiBhc3NpZ25tZW50SW5mb1RhYk1wZWdbXSA9CnsKICAgICB7IE1PREVfSU5WQUxJRCwgICAgICAgICAgICAgICAgIHstMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMX0gfSwgIC8qICBpbnZhbGlkICAgKi8KICAgICB7IE1PREVfMSwgICAgICAgICAgICAgICAgICAgICAgIHsgMCwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMX0gfSwgIC8qICBtb25vICAgICAgKi8KICAgICB7IE1PREVfMiwgICAgICAgICAgICAgICAgICAgICAgIHsgMCwgMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMX0gfSwgIC8qICBzdGVyZW8gICAgKi8KICAgICB7IE1PREVfMV8yLCAgICAgICAgICAgICAgICAgICAgIHsgMCwgMSwgMiwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMX0gfSwgIC8qICAzY2ggICAgICAgKi8KICAgICB7IE1PREVfMV8yXzEsICAgICAgICAgICAgICAgICAgIHsgMCwgMSwgMiwgMywtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMX0gfSwgIC8qICA0Y2ggICAgICAgKi8KICAgICB7IE1PREVfMV8yXzIsICAgICAgICAgICAgICAgICAgIHsgMCwgMSwgMiwgMywgNCwtMSwtMSwtMSwtMSwtMSwtMSwtMX0gfSwgIC8qICA1Y2ggICAgICAgKi8KICAgICB7IE1PREVfMV8yXzJfMSwgICAgICAgICAgICAgICAgIHsgMCwgMSwgMiwgMywgNCwgNSwtMSwtMSwtMSwtMSwtMSwtMX0gfSwgIC8qICA1LjFjaCAgICAgKi8KICAgICB7IE1PREVfMV8yXzJfMl8xLCAgICAgICAgICAgICAgIHsgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywtMSwtMSwtMSwtMX0gfSwgIC8qICA3LjFjaCAgICAgKi8KICAgICB7IE1PREVfN18xX1JFQVJfU1VSUk9VTkQsICAgICAgIHsgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywtMSwtMSwtMSwtMX0gfSwgIC8qICA3LjFjaCAgICAgKi8KICAgICB7IE1PREVfN18xX0ZST05UX0NFTlRFUiwgICAgICAgIHsgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywtMSwtMSwtMSwtMX0gfSAgIC8qICA3LjFjaCAgICAgKi8KfTsKCnN0YXRpYyBjb25zdCBDSEFOTkVMX0FTU0lHTk1FTlRfSU5GT19UQUIgYXNzaWdubWVudEluZm9UYWJXYXZbXSA9CnsKICAgICB7IE1PREVfSU5WQUxJRCwgICAgICAgICAgICAgICAgIHstMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMX0gfSwgIC8qICBpbnZhbGlkICAgKi8KICAgICB7IE1PREVfMSwgICAgICAgICAgICAgICAgICAgICAgIHsgMCwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMX0gfSwgIC8qICBtb25vICAgICAgKi8KICAgICB7IE1PREVfMiwgICAgICAgICAgICAgICAgICAgICAgIHsgMCwgMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMX0gfSwgIC8qICBzdGVyZW8gICAgKi8KICAgICB7IE1PREVfMV8yLCAgICAgICAgICAgICAgICAgICAgIHsgMiwgMCwgMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMX0gfSwgIC8qICAzY2ggICAgICAgKi8KICAgICB7IE1PREVfMV8yXzEsICAgICAgICAgICAgICAgICAgIHsgMiwgMCwgMSwgMywtMSwtMSwtMSwtMSwtMSwtMSwtMSwtMX0gfSwgIC8qICA0Y2ggICAgICAgKi8KICAgICB7IE1PREVfMV8yXzIsICAgICAgICAgICAgICAgICAgIHsgMiwgMCwgMSwgMywgNCwtMSwtMSwtMSwtMSwtMSwtMSwtMX0gfSwgIC8qICA1Y2ggICAgICAgKi8KICAgICB7IE1PREVfMV8yXzJfMSwgICAgICAgICAgICAgICAgIHsgMiwgMCwgMSwgNCwgNSwgMywtMSwtMSwtMSwtMSwtMSwtMX0gfSwgIC8qICA1LjFjaCAgICAgKi8KICAgICB7IE1PREVfMV8yXzJfMl8xLCAgICAgICAgICAgICAgIHsgMiwgNiwgNywgMCwgMSwgNCwgNSwgMywtMSwtMSwtMSwtMX0gfSwgIC8qICA3LjFjaCAgICAgKi8KICAgICB7IE1PREVfN18xX1JFQVJfU1VSUk9VTkQsICAgICAgIHsgMiwgMCwgMSwgNiwgNywgNCwgNSwgMywtMSwtMSwtMSwtMX0gfSwgIC8qICA3LjFjaCAgICAgKi8KICAgICB7IE1PREVfN18xX0ZST05UX0NFTlRFUiwgICAgICAgIHsgMiwgNiwgNywgMCwgMSwgNCwgNSwgMywtMSwtMSwtMSwtMX0gfSwgIC8qICA3LjFjaCAgICAgKi8KfTsKCi8qIENoYW5uZWwgbW9kZSBjb25maWd1cmF0aW9uIHRhYiBwcm92aWRlcywKICAgY29ycmVzcG9uZGluZyBudW1iZXIgb2YgY2hhbm5lbHMgYW5kIGVsZW1lbnRzCiovCnN0YXRpYyBjb25zdCBDSEFOTkVMX01PREVfQ09ORklHX1RBQiBjaGFubmVsTW9kZUNvbmZpZ1tdID0KewogICB7IE1PREVfMSwgICAgICAgICAgICAgICAgICAgICAgICAxLCAgMSwgIDEgfSwgICAvKiBTQ0UgICAgICAgICAgICAgICAgICovCiAgIHsgTU9ERV8yLCAgICAgICAgICAgICAgICAgICAgICAgIDIsICAyLCAgMSB9LCAgIC8qIENQRSAgICAgICAgICAgICAgICAgKi8KICAgeyBNT0RFXzFfMiwgICAgICAgICAgICAgICAgICAgICAgMywgIDMsICAyIH0sICAgLyogU0NFLENQRSAgICAgICAgICAgICAqLwogICB7IE1PREVfMV8yXzEsICAgICAgICAgICAgICAgICAgICA0LCAgNCwgIDMgfSwgICAvKiBTQ0UsQ1BFLFNDRSAgICAgICAgICovCiAgIHsgTU9ERV8xXzJfMiwgICAgICAgICAgICAgICAgICAgIDUsICA1LCAgMyB9LCAgIC8qIFNDRSxDUEUsQ1BFICAgICAgICAgKi8KICAgeyBNT0RFXzFfMl8yXzEsICAgICAgICAgICAgICAgICAgNiwgIDUsICA0IH0sICAgLyogU0NFLENQRSxDUEUsTEZFICAgICAqLwogICB7IE1PREVfMV8yXzJfMl8xLCAgICAgICAgICAgICAgICA4LCAgNywgIDUgfSwgICAvKiBTQ0UsQ1BFLENQRSxDUEUsTEZFICovCiAgIHsgTU9ERV83XzFfUkVBUl9TVVJST1VORCwgICAgICAgIDgsICA3LCAgNSB9LAogICB7IE1PREVfN18xX0ZST05UX0NFTlRFUiwgICAgICAgICA4LCAgNywgIDUgfSwKfTsKCiNkZWZpbmUgTUFYX01PREVTIChzaXplb2YoYXNzaWdubWVudEluZm9UYWJXYXYpL3NpemVvZihDSEFOTkVMX0FTU0lHTk1FTlRfSU5GT19UQUIpKQoKY29uc3QgSU5UKiBGREthYWNFbmNfZ2V0Q2hhbm5lbEFzc2lnbm1lbnQoQ0hBTk5FTF9NT0RFIGVuY01vZGUsIENIQU5ORUxfT1JERVIgY28pCnsKICBjb25zdCBDSEFOTkVMX0FTU0lHTk1FTlRfSU5GT19UQUIgKnBUYWI7CiAgaW50IGk7CgogIGlmIChjbyA9PSBDSF9PUkRFUl9NUEVHKQogICAgcFRhYiA9IGFzc2lnbm1lbnRJbmZvVGFiTXBlZzsKICBlbHNlCiAgICBwVGFiID0gYXNzaWdubWVudEluZm9UYWJXYXY7CgogIGZvcihpPU1BWF9NT0RFUy0xOyBpPjA7IGktLSkgewogICAgaWYgKGVuY01vZGU9PSBwVGFiW2ldLmVuY29kZXJNb2RlKSB7CiAgICAgIGJyZWFrOwogICAgfQogIH0KICByZXR1cm4gKHBUYWJbaV0uY2hhbm5lbF9hc3NpZ25tZW50KTsKfQoKQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX0RldGVybWluZUVuY29kZXJNb2RlKENIQU5ORUxfTU9ERSogbW9kZSwgSU5UIG5DaGFubmVscykKewogIElOVCBpOwogIENIQU5ORUxfTU9ERSBlbmNNb2RlID0gTU9ERV9JTlZBTElEOwoKICBpZiAoKm1vZGU9PU1PREVfVU5LTk9XTikgewogICAgZm9yIChpPTA7IGk8KElOVClzaXplb2YoY2hhbm5lbE1vZGVDb25maWcpLyhJTlQpc2l6ZW9mKENIQU5ORUxfTU9ERV9DT05GSUdfVEFCKTsgaSsrKSB7CiAgICAgIGlmIChjaGFubmVsTW9kZUNvbmZpZ1tpXS5uQ2hhbm5lbHM9PW5DaGFubmVscykgewogICAgICAgICAgZW5jTW9kZSA9IGNoYW5uZWxNb2RlQ29uZmlnW2ldLmVuY01vZGU7CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgKm1vZGUgPSBlbmNNb2RlOwogIH0KICBlbHNlIHsKICAgIC8qIGNoZWNrIGlmIHZhbGlkIGNoYW5uZWwgY29uZmlndXJhdGlvbiAqLwogICAgaWYgKEZES2FhY0VuY19HZXRDaGFubmVsTW9kZUNvbmZpZ3VyYXRpb24oKm1vZGUpLT5uQ2hhbm5lbHM9PW5DaGFubmVscykgewogICAgICAgIGVuY01vZGUgPSAqbW9kZTsKICAgIH0KICB9CgogIGlmIChlbmNNb2RlPT1NT0RFX0lOVkFMSUQpIHsKICAgIHJldHVybiBBQUNfRU5DX1VOU1VQUE9SVEVEX0NIQU5ORUxDT05GSUc7CiAgfQoKICByZXR1cm4gQUFDX0VOQ19PSzsKfQoKc3RhdGljIElOVCBGREthYWNFbmNfaW5pdEVsZW1lbnQgKEVMRU1FTlRfSU5GTyogZWxJbmZvLCBNUDRfRUxFTUVOVF9JRCBlbFR5cGUsIElOVCogY250LCBDSEFOTkVMX01PREUgbW9kZSwgQ0hBTk5FTF9PUkRFUiBjbywgSU5UKiBpdF9jbnQsIGNvbnN0IEZJWFBfREJMIHJlbEJpdHMpIHsKCiAgSU5UIGVycm9yPTA7CiAgSU5UIGNvdW50ZXIgPSpjbnQ7CgogIGNvbnN0IElOVCAqYXNzaWduID0gRkRLYWFjRW5jX2dldENoYW5uZWxBc3NpZ25tZW50KG1vZGUsIGNvKTsKCiAgZWxJbmZvLT5lbFR5cGU9ZWxUeXBlOwogIGVsSW5mby0+cmVsYXRpdmVCaXRzID0gcmVsQml0czsKCiAgc3dpdGNoKGVsSW5mby0+ZWxUeXBlKSB7CiAgY2FzZSBJRF9TQ0U6IGNhc2UgSURfTEZFOiBjYXNlIElEX0NDRToKICAgIGVsSW5mby0+bkNoYW5uZWxzSW5FbD0xOwogICAgZWxJbmZvLT5DaGFubmVsSW5kZXhbMF09YXNzaWduW2NvdW50ZXIrK107CiAgICBlbEluZm8tPmluc3RhbmNlVGFnPWl0X2NudFtlbFR5cGVdKys7CgogICAgYnJlYWs7CiAgY2FzZSBJRF9DUEU6CiAgICBlbEluZm8tPm5DaGFubmVsc0luRWw9MjsKICAgIGVsSW5mby0+Q2hhbm5lbEluZGV4WzBdPWFzc2lnbltjb3VudGVyKytdOwogICAgZWxJbmZvLT5DaGFubmVsSW5kZXhbMV09YXNzaWduW2NvdW50ZXIrK107CiAgICBlbEluZm8tPmluc3RhbmNlVGFnPWl0X2NudFtlbFR5cGVdKys7CiAgICBicmVhazsKICBjYXNlIElEX0RTRToKICAgIGVsSW5mby0+bkNoYW5uZWxzSW5FbD0wOwogICAgZWxJbmZvLT5DaGFubmVsSW5kZXhbMF09MDsKICAgIGVsSW5mby0+Q2hhbm5lbEluZGV4WzFdPTA7CiAgICBlbEluZm8tPmluc3RhbmNlVGFnPWl0X2NudFtlbFR5cGVdKys7CiAgICBicmVhazsKICBkZWZhdWx0OiBlcnJvcj0xOwogIH07CiAgKmNudCA9IGNvdW50ZXI7CiAgcmV0dXJuIGVycm9yOwoKfQoKQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX0luaXRDaGFubmVsTWFwcGluZyhDSEFOTkVMX01PREUgbW9kZSwgQ0hBTk5FTF9PUkRFUiBjbywgQ0hBTk5FTF9NQVBQSU5HKiBjbSkKewogIElOVCBjb3VudD0wOyAvKiBjb3VudCB0aHJvdWdoIGNvZGVyIGNoYW5uZWxzICovCiAgSU5UIGl0X2NudFtJRF9FTkQrMV07CiAgSU5UIGk7CgogIGZvciAoaT0wOyBpPElEX0VORDsgaSsrKQogICAgaXRfY250W2ldPTA7CgogIEZES21lbWNsZWFyKGNtLCBzaXplb2YoQ0hBTk5FTF9NQVBQSU5HKSk7CgogIC8qIGluaXQgY2hhbm5lbCBtYXBwaW5nKi8KICBmb3IgKGk9MDsgaTwoSU5UKXNpemVvZihjaGFubmVsTW9kZUNvbmZpZykvKElOVClzaXplb2YoQ0hBTk5FTF9NT0RFX0NPTkZJR19UQUIpOyBpKyspIHsKICAgIGlmIChjaGFubmVsTW9kZUNvbmZpZ1tpXS5lbmNNb2RlPT1tb2RlKQogICAgewogICAgICAgIGNtLT5lbmNNb2RlICAgICAgPSBjaGFubmVsTW9kZUNvbmZpZ1tpXS5lbmNNb2RlOwogICAgICAgIGNtLT5uQ2hhbm5lbHMgICAgPSBjaGFubmVsTW9kZUNvbmZpZ1tpXS5uQ2hhbm5lbHM7CiAgICAgICAgY20tPm5DaGFubmVsc0VmZiA9IGNoYW5uZWxNb2RlQ29uZmlnW2ldLm5DaGFubmVsc0VmZjsKICAgICAgICBjbS0+bkVsZW1lbnRzICAgID0gY2hhbm5lbE1vZGVDb25maWdbaV0ubkVsZW1lbnRzOwoKICAgICAgICBicmVhazsKICAgIH0KICB9CgogIC8qIGluaXQgZWxlbWVudCBpbmZvIHN0cnVjdCAqLwogIHN3aXRjaChtb2RlKSB7CiAgICBjYXNlIE1PREVfMToKICAgICAgLyogKG1vbm8pIHNjZSAgKi8KICAgICAgRkRLYWFjRW5jX2luaXRFbGVtZW50KCZjbS0+ZWxJbmZvWzBdLCBJRF9TQ0UsICZjb3VudCwgbW9kZSwgY28sIGl0X2NudCwgKEZJWFBfREJMKU1BWFZBTF9EQkwpOwogICAgICBicmVhazsKICAgIGNhc2UgTU9ERV8yOgogICAgICAvKiAoc3RlcmVvKSBjcGUgKi8KICAgICAgRkRLYWFjRW5jX2luaXRFbGVtZW50KCZjbS0+ZWxJbmZvWzBdLCBJRF9DUEUsICZjb3VudCwgbW9kZSwgY28sIGl0X2NudCwgKEZJWFBfREJMKU1BWFZBTF9EQkwpOwogICAgICBicmVhazsKCiAgICBjYXNlIE1PREVfMV8yOgogICAgICAvKiBzY2UgKyBjcGUgKi8KICAgICAgRkRLYWFjRW5jX2luaXRFbGVtZW50KCZjbS0+ZWxJbmZvWzBdLCBJRF9TQ0UsICZjb3VudCwgbW9kZSwgY28sIGl0X2NudCwgRkwyRlhDT05TVF9EQkwoMC40ZikpOwogICAgICBGREthYWNFbmNfaW5pdEVsZW1lbnQoJmNtLT5lbEluZm9bMV0sIElEX0NQRSwgJmNvdW50LCBtb2RlLCBjbywgaXRfY250LCBGTDJGWENPTlNUX0RCTCgwLjZmKSk7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgTU9ERV8xXzJfMToKICAgICAgLyogc2NlICsgY3BlICsgc2NlICovCiAgICAgIEZES2FhY0VuY19pbml0RWxlbWVudCgmY20tPmVsSW5mb1swXSwgSURfU0NFLCAmY291bnQsIG1vZGUsIGNvLCBpdF9jbnQsIEZMMkZYQ09OU1RfREJMKDAuM2YpKTsKICAgICAgRkRLYWFjRW5jX2luaXRFbGVtZW50KCZjbS0+ZWxJbmZvWzFdLCBJRF9DUEUsICZjb3VudCwgbW9kZSwgY28sIGl0X2NudCwgRkwyRlhDT05TVF9EQkwoMC40ZikpOwogICAgICBGREthYWNFbmNfaW5pdEVsZW1lbnQoJmNtLT5lbEluZm9bMl0sIElEX1NDRSwgJmNvdW50LCBtb2RlLCBjbywgaXRfY250LCBGTDJGWENPTlNUX0RCTCgwLjNmKSk7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgTU9ERV8xXzJfMjoKICAgICAgLyogc2NlICsgY3BlICsgY3BlICovCiAgICAgIEZES2FhY0VuY19pbml0RWxlbWVudCgmY20tPmVsSW5mb1swXSwgSURfU0NFLCAmY291bnQsIG1vZGUsIGNvLCBpdF9jbnQsIEZMMkZYQ09OU1RfREJMKDAuMjZmKSk7CiAgICAgIEZES2FhY0VuY19pbml0RWxlbWVudCgmY20tPmVsSW5mb1sxXSwgSURfQ1BFLCAmY291bnQsIG1vZGUsIGNvLCBpdF9jbnQsIEZMMkZYQ09OU1RfREJMKDAuMzdmKSk7CiAgICAgIEZES2FhY0VuY19pbml0RWxlbWVudCgmY20tPmVsSW5mb1syXSwgSURfQ1BFLCAmY291bnQsIG1vZGUsIGNvLCBpdF9jbnQsIEZMMkZYQ09OU1RfREJMKDAuMzdmKSk7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgTU9ERV8xXzJfMl8xOgogICAgICAvKiAoNS4xKSBzY2UgKyBjcGUgKyBjcGUgKyBsZmUgKi8KICAgICAgRkRLYWFjRW5jX2luaXRFbGVtZW50KCZjbS0+ZWxJbmZvWzBdLCBJRF9TQ0UsICZjb3VudCwgbW9kZSwgY28sIGl0X2NudCwgRkwyRlhDT05TVF9EQkwoMC4yNGYpKTsKICAgICAgRkRLYWFjRW5jX2luaXRFbGVtZW50KCZjbS0+ZWxJbmZvWzFdLCBJRF9DUEUsICZjb3VudCwgbW9kZSwgY28sIGl0X2NudCwgRkwyRlhDT05TVF9EQkwoMC4zNWYpKTsKICAgICAgRkRLYWFjRW5jX2luaXRFbGVtZW50KCZjbS0+ZWxJbmZvWzJdLCBJRF9DUEUsICZjb3VudCwgbW9kZSwgY28sIGl0X2NudCwgRkwyRlhDT05TVF9EQkwoMC4zNWYpKTsKICAgICAgRkRLYWFjRW5jX2luaXRFbGVtZW50KCZjbS0+ZWxJbmZvWzNdLCBJRF9MRkUsICZjb3VudCwgbW9kZSwgY28sIGl0X2NudCwgRkwyRlhDT05TVF9EQkwoMC4wNmYpKTsKICAgICAgYnJlYWs7CgogICAgY2FzZSBNT0RFXzFfMl8yXzJfMToKICAgIGNhc2UgTU9ERV83XzFfUkVBUl9TVVJST1VORDoKICAgIGNhc2UgTU9ERV83XzFfRlJPTlRfQ0VOVEVSOgogICAgICAvKiAoNy4xKSBzY2UgKyBjcGUgKyBjcGUgKyBjcGUgKyBsZmUgKi8KICAgICAgRkRLYWFjRW5jX2luaXRFbGVtZW50KCZjbS0+ZWxJbmZvWzBdLCBJRF9TQ0UsICZjb3VudCwgbW9kZSwgY28sIGl0X2NudCwgRkwyRlhDT05TVF9EQkwoMC4xOGYpKTsKICAgICAgRkRLYWFjRW5jX2luaXRFbGVtZW50KCZjbS0+ZWxJbmZvWzFdLCBJRF9DUEUsICZjb3VudCwgbW9kZSwgY28sIGl0X2NudCwgRkwyRlhDT05TVF9EQkwoMC4yNmYpKTsKICAgICAgRkRLYWFjRW5jX2luaXRFbGVtZW50KCZjbS0+ZWxJbmZvWzJdLCBJRF9DUEUsICZjb3VudCwgbW9kZSwgY28sIGl0X2NudCwgRkwyRlhDT05TVF9EQkwoMC4yNmYpKTsKICAgICAgRkRLYWFjRW5jX2luaXRFbGVtZW50KCZjbS0+ZWxJbmZvWzNdLCBJRF9DUEUsICZjb3VudCwgbW9kZSwgY28sIGl0X2NudCwgRkwyRlhDT05TVF9EQkwoMC4yNmYpKTsKICAgICAgRkRLYWFjRW5jX2luaXRFbGVtZW50KCZjbS0+ZWxJbmZvWzRdLCBJRF9MRkUsICZjb3VudCwgbW9kZSwgY28sIGl0X2NudCwgRkwyRlhDT05TVF9EQkwoMC4wNGYpKTsKICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICAvLypjaE1hcD0wOwogICAgICByZXR1cm4gQUFDX0VOQ19VTlNVUFBPUlRFRF9DSEFOTkVMQ09ORklHOwogIH07CgoKICBGREtfQVNTRVJUKGNtLT5uRWxlbWVudHM8PSg4KSk7CgoKICByZXR1cm4gQUFDX0VOQ19PSzsKfQoKQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX0luaXRFbGVtZW50Qml0cyhRQ19TVEFURSAqaFFDLAogICAgICAgICAgICAgICAgICAgIENIQU5ORUxfTUFQUElORyAqY20sCiAgICAgICAgICAgICAgICAgICAgSU5UIGJpdHJhdGVUb3QsCiAgICAgICAgICAgICAgICAgICAgSU5UIGF2ZXJhZ2VCaXRzVG90LAogICAgICAgICAgICAgICAgICAgIElOVCBtYXhDaGFubmVsQml0cykKewogIGludCBzY19iclRvdCA9IENvdW50TGVhZGluZ0JpdHMoYml0cmF0ZVRvdCk7CgogIHN3aXRjaChjbS0+ZW5jTW9kZSkgewogIGNhc2UgTU9ERV8xOgogICAgaFFDLT5lbGVtZW50Qml0c1swXS0+Y2hCaXRyYXRlRWwgICAgICA9IGJpdHJhdGVUb3Q7CgogICAgaFFDLT5lbGVtZW50Qml0c1swXS0+bWF4Qml0c0VsICAgICAgICA9IG1heENoYW5uZWxCaXRzOwoKICAgIGhRQy0+ZWxlbWVudEJpdHNbMF0tPnJlbGF0aXZlQml0c0VsICAgPSBjbS0+ZWxJbmZvWzBdLnJlbGF0aXZlQml0czsKICAgIGJyZWFrOwoKICBjYXNlIE1PREVfMjoKICAgIGhRQy0+ZWxlbWVudEJpdHNbMF0tPmNoQml0cmF0ZUVsICAgICAgPSBiaXRyYXRlVG90Pj4xOwoKICAgIGhRQy0+ZWxlbWVudEJpdHNbMF0tPm1heEJpdHNFbCAgICAgICAgPSAyKm1heENoYW5uZWxCaXRzOwoKICAgIGhRQy0+ZWxlbWVudEJpdHNbMF0tPnJlbGF0aXZlQml0c0VsICAgPSBjbS0+ZWxJbmZvWzBdLnJlbGF0aXZlQml0czsKICAgIGJyZWFrOwogIGNhc2UgTU9ERV8xXzI6IHsKICAgIGhRQy0+ZWxlbWVudEJpdHNbMF0tPnJlbGF0aXZlQml0c0VsID0gY20tPmVsSW5mb1swXS5yZWxhdGl2ZUJpdHM7CiAgICBoUUMtPmVsZW1lbnRCaXRzWzFdLT5yZWxhdGl2ZUJpdHNFbCA9IGNtLT5lbEluZm9bMV0ucmVsYXRpdmVCaXRzOwogICAgRklYUF9EQkwgc2NlUmF0ZSA9IGNtLT5lbEluZm9bMF0ucmVsYXRpdmVCaXRzOwogICAgRklYUF9EQkwgY3BlUmF0ZSA9IGNtLT5lbEluZm9bMV0ucmVsYXRpdmVCaXRzOwoKICAgIGhRQy0+ZWxlbWVudEJpdHNbMF0tPmNoQml0cmF0ZUVsICAgICAgPSBmTXVsdChzY2VSYXRlLCAoRklYUF9EQkwpKGJpdHJhdGVUb3Q8PHNjX2JyVG90KSk+PnNjX2JyVG90OwogICAgaFFDLT5lbGVtZW50Qml0c1sxXS0+Y2hCaXRyYXRlRWwgICAgICA9IGZNdWx0KGNwZVJhdGUsIChGSVhQX0RCTCkoYml0cmF0ZVRvdDw8c2NfYnJUb3QpKT4+KHNjX2JyVG90KzEpOwoKICAgIGhRQy0+ZWxlbWVudEJpdHNbMF0tPm1heEJpdHNFbCAgICAgICAgPSBtYXhDaGFubmVsQml0czsKICAgIGhRQy0+ZWxlbWVudEJpdHNbMV0tPm1heEJpdHNFbCAgICAgICAgPSAyKm1heENoYW5uZWxCaXRzOwogICAgYnJlYWs7CiAgfQogIGNhc2UgTU9ERV8xXzJfMTogewogICAgLyogc2NlICsgY3BlICsgc2NlICovCiAgICBoUUMtPmVsZW1lbnRCaXRzWzBdLT5yZWxhdGl2ZUJpdHNFbCA9IGNtLT5lbEluZm9bMF0ucmVsYXRpdmVCaXRzOwogICAgaFFDLT5lbGVtZW50Qml0c1sxXS0+cmVsYXRpdmVCaXRzRWwgPSBjbS0+ZWxJbmZvWzFdLnJlbGF0aXZlQml0czsKICAgIGhRQy0+ZWxlbWVudEJpdHNbMl0tPnJlbGF0aXZlQml0c0VsID0gY20tPmVsSW5mb1syXS5yZWxhdGl2ZUJpdHM7CiAgICBGSVhQX0RCTCBzY2UxUmF0ZSA9IGNtLT5lbEluZm9bMF0ucmVsYXRpdmVCaXRzOwogICAgRklYUF9EQkwgY3BlUmF0ZSAgPSBjbS0+ZWxJbmZvWzFdLnJlbGF0aXZlQml0czsKICAgIEZJWFBfREJMIHNjZTJSYXRlID0gY20tPmVsSW5mb1syXS5yZWxhdGl2ZUJpdHM7CgogICAgaFFDLT5lbGVtZW50Qml0c1swXS0+Y2hCaXRyYXRlRWwgICAgICA9IGZNdWx0KHNjZTFSYXRlLCAoRklYUF9EQkwpKGJpdHJhdGVUb3Q8PHNjX2JyVG90KSk+PnNjX2JyVG90OwogICAgaFFDLT5lbGVtZW50Qml0c1sxXS0+Y2hCaXRyYXRlRWwgICAgICA9IGZNdWx0KGNwZVJhdGUsICAoRklYUF9EQkwpKGJpdHJhdGVUb3Q8PHNjX2JyVG90KSk+PihzY19iclRvdCsxKTsKICAgIGhRQy0+ZWxlbWVudEJpdHNbMl0tPmNoQml0cmF0ZUVsICAgICAgPSBmTXVsdChzY2UyUmF0ZSwgKEZJWFBfREJMKShiaXRyYXRlVG90PDxzY19iclRvdCkpPj5zY19iclRvdDsKCiAgICBoUUMtPmVsZW1lbnRCaXRzWzBdLT5tYXhCaXRzRWwgICAgICAgID0gbWF4Q2hhbm5lbEJpdHM7CiAgICBoUUMtPmVsZW1lbnRCaXRzWzFdLT5tYXhCaXRzRWwgICAgICAgID0gMiptYXhDaGFubmVsQml0czsKICAgIGhRQy0+ZWxlbWVudEJpdHNbMl0tPm1heEJpdHNFbCAgICAgICAgPSBtYXhDaGFubmVsQml0czsKICAgIGJyZWFrOwogIH0KICBjYXNlIE1PREVfMV8yXzI6IHsKICAgIC8qIHNjZSArIGNwZSArIGNwZSAqLwogICAgaFFDLT5lbGVtZW50Qml0c1swXS0+cmVsYXRpdmVCaXRzRWwgPSBjbS0+ZWxJbmZvWzBdLnJlbGF0aXZlQml0czsKICAgIGhRQy0+ZWxlbWVudEJpdHNbMV0tPnJlbGF0aXZlQml0c0VsID0gY20tPmVsSW5mb1sxXS5yZWxhdGl2ZUJpdHM7CiAgICBoUUMtPmVsZW1lbnRCaXRzWzJdLT5yZWxhdGl2ZUJpdHNFbCA9IGNtLT5lbEluZm9bMl0ucmVsYXRpdmVCaXRzOwogICAgRklYUF9EQkwgc2NlUmF0ZSAgPSBjbS0+ZWxJbmZvWzBdLnJlbGF0aXZlQml0czsKICAgIEZJWFBfREJMIGNwZTFSYXRlID0gY20tPmVsSW5mb1sxXS5yZWxhdGl2ZUJpdHM7CiAgICBGSVhQX0RCTCBjcGUyUmF0ZSA9IGNtLT5lbEluZm9bMl0ucmVsYXRpdmVCaXRzOwoKICAgIGhRQy0+ZWxlbWVudEJpdHNbMF0tPmNoQml0cmF0ZUVsICAgICAgPSBmTXVsdChzY2VSYXRlLCAgKEZJWFBfREJMKShiaXRyYXRlVG90PDxzY19iclRvdCkpPj5zY19iclRvdDsKICAgIGhRQy0+ZWxlbWVudEJpdHNbMV0tPmNoQml0cmF0ZUVsICAgICAgPSBmTXVsdChjcGUxUmF0ZSwgKEZJWFBfREJMKShiaXRyYXRlVG90PDxzY19iclRvdCkpPj4oc2NfYnJUb3QrMSk7CiAgICBoUUMtPmVsZW1lbnRCaXRzWzJdLT5jaEJpdHJhdGVFbCAgICAgID0gZk11bHQoY3BlMlJhdGUsIChGSVhQX0RCTCkoYml0cmF0ZVRvdDw8c2NfYnJUb3QpKT4+KHNjX2JyVG90KzEpOwoKICAgIGhRQy0+ZWxlbWVudEJpdHNbMF0tPm1heEJpdHNFbCAgICAgICAgPSBtYXhDaGFubmVsQml0czsKICAgIGhRQy0+ZWxlbWVudEJpdHNbMV0tPm1heEJpdHNFbCAgICAgICAgPSAyKm1heENoYW5uZWxCaXRzOwogICAgaFFDLT5lbGVtZW50Qml0c1syXS0+bWF4Qml0c0VsICAgICAgICA9IDIqbWF4Q2hhbm5lbEJpdHM7CiAgICBicmVhazsKICB9CgogIGNhc2UgTU9ERV8xXzJfMl8xOiB7CiAgICAvKiAoNS4xKSBzY2UgKyBjcGUgKyBjcGUgKyBsZmUgKi8KICAgIGhRQy0+ZWxlbWVudEJpdHNbMF0tPnJlbGF0aXZlQml0c0VsID0gY20tPmVsSW5mb1swXS5yZWxhdGl2ZUJpdHM7CiAgICBoUUMtPmVsZW1lbnRCaXRzWzFdLT5yZWxhdGl2ZUJpdHNFbCA9IGNtLT5lbEluZm9bMV0ucmVsYXRpdmVCaXRzOwogICAgaFFDLT5lbGVtZW50Qml0c1syXS0+cmVsYXRpdmVCaXRzRWwgPSBjbS0+ZWxJbmZvWzJdLnJlbGF0aXZlQml0czsKICAgIGhRQy0+ZWxlbWVudEJpdHNbM10tPnJlbGF0aXZlQml0c0VsID0gY20tPmVsSW5mb1szXS5yZWxhdGl2ZUJpdHM7CiAgICBGSVhQX0RCTCBzY2VSYXRlICA9IGNtLT5lbEluZm9bMF0ucmVsYXRpdmVCaXRzOwogICAgRklYUF9EQkwgY3BlMVJhdGUgPSBjbS0+ZWxJbmZvWzFdLnJlbGF0aXZlQml0czsKICAgIEZJWFBfREJMIGNwZTJSYXRlID0gY20tPmVsSW5mb1syXS5yZWxhdGl2ZUJpdHM7CiAgICBGSVhQX0RCTCBsZmVSYXRlICA9IGNtLT5lbEluZm9bM10ucmVsYXRpdmVCaXRzOwoKICAgIGludCBtYXhCaXRzVG90ID0gbWF4Q2hhbm5lbEJpdHMgKiA1OyAvKiBMRkUgZG9lcyBub3QgYWRkIHRvIGJpdCByZXNlcnZvaXIgKi8KICAgIGludCBzYyA9IENvdW50TGVhZGluZ0JpdHMoZml4TWF4KG1heENoYW5uZWxCaXRzLGF2ZXJhZ2VCaXRzVG90KSk7CiAgICBpbnQgbWF4TGZlQml0cyA9IChpbnQpIEZES21heCAoIChJTlQpKChmTXVsdChsZmVSYXRlLChGSVhQX0RCTCkobWF4Q2hhbm5lbEJpdHM8PHNjKSk+PnNjKTw8MSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJTlQpKChmTXVsdChGTDJGWENPTlNUX0RCTCgxLjFmLzIuZiksZk11bHQobGZlUmF0ZSwoRklYUF9EQkwpKGF2ZXJhZ2VCaXRzVG90PDxzYykpKTw8MSk+PnNjKSApOwoKICAgIG1heENoYW5uZWxCaXRzID0gKG1heEJpdHNUb3QgLSBtYXhMZmVCaXRzKTsKICAgIHNjID0gQ291bnRMZWFkaW5nQml0cyhtYXhDaGFubmVsQml0cyk7CgogICAgbWF4Q2hhbm5lbEJpdHMgPSBmTXVsdCgoRklYUF9EQkwpbWF4Q2hhbm5lbEJpdHM8PHNjLEdldEludkludCg1KSk+PnNjOwoKICAgIGhRQy0+ZWxlbWVudEJpdHNbMF0tPmNoQml0cmF0ZUVsICAgICAgPSBmTXVsdChzY2VSYXRlLCAgKEZJWFBfREJMKShiaXRyYXRlVG90PDxzY19iclRvdCkpPj5zY19iclRvdDsKICAgIGhRQy0+ZWxlbWVudEJpdHNbMV0tPmNoQml0cmF0ZUVsICAgICAgPSBmTXVsdChjcGUxUmF0ZSwgKEZJWFBfREJMKShiaXRyYXRlVG90PDxzY19iclRvdCkpPj4oc2NfYnJUb3QrMSk7CiAgICBoUUMtPmVsZW1lbnRCaXRzWzJdLT5jaEJpdHJhdGVFbCAgICAgID0gZk11bHQoY3BlMlJhdGUsIChGSVhQX0RCTCkoYml0cmF0ZVRvdDw8c2NfYnJUb3QpKT4+KHNjX2JyVG90KzEpOwogICAgaFFDLT5lbGVtZW50Qml0c1szXS0+Y2hCaXRyYXRlRWwgICAgICA9IGZNdWx0KGxmZVJhdGUsICAoRklYUF9EQkwpKGJpdHJhdGVUb3Q8PHNjX2JyVG90KSk+PnNjX2JyVG90OwoKICAgIGhRQy0+ZWxlbWVudEJpdHNbMF0tPm1heEJpdHNFbCAgICAgICAgPSBtYXhDaGFubmVsQml0czsKICAgIGhRQy0+ZWxlbWVudEJpdHNbMV0tPm1heEJpdHNFbCAgICAgICAgPSAyKm1heENoYW5uZWxCaXRzOwogICAgaFFDLT5lbGVtZW50Qml0c1syXS0+bWF4Qml0c0VsICAgICAgICA9IDIqbWF4Q2hhbm5lbEJpdHM7CiAgICBoUUMtPmVsZW1lbnRCaXRzWzNdLT5tYXhCaXRzRWwgICAgICAgID0gbWF4TGZlQml0czsKCiAgICBicmVhazsKICB9CiAgY2FzZSBNT0RFXzdfMV9SRUFSX1NVUlJPVU5EOgogIGNhc2UgTU9ERV83XzFfRlJPTlRfQ0VOVEVSOgogIGNhc2UgTU9ERV8xXzJfMl8yXzE6IHsKICAgIGludCBjcGUzSWR4ID0gMzsKICAgIGludCBsZmVJZHggID0gNDsKCiAgICAvKiAoNy4xKSBzY2UgKyBjcGUgKyBjcGUgKyBjcGUgKyBsZmUgKi8KICAgIEZJWFBfREJMIHNjZVJhdGUgID0gaFFDLT5lbGVtZW50Qml0c1swXS0+cmVsYXRpdmVCaXRzRWwgPSBjbS0+ZWxJbmZvWzBdLnJlbGF0aXZlQml0czsKICAgIEZJWFBfREJMIGNwZTFSYXRlID0gaFFDLT5lbGVtZW50Qml0c1sxXS0+cmVsYXRpdmVCaXRzRWwgPSBjbS0+ZWxJbmZvWzFdLnJlbGF0aXZlQml0czsKICAgIEZJWFBfREJMIGNwZTJSYXRlID0gaFFDLT5lbGVtZW50Qml0c1syXS0+cmVsYXRpdmVCaXRzRWwgPSBjbS0+ZWxJbmZvWzJdLnJlbGF0aXZlQml0czsKICAgIEZJWFBfREJMIGNwZTNSYXRlID0gaFFDLT5lbGVtZW50Qml0c1tjcGUzSWR4XS0+cmVsYXRpdmVCaXRzRWwgPSBjbS0+ZWxJbmZvW2NwZTNJZHhdLnJlbGF0aXZlQml0czsKICAgIEZJWFBfREJMIGxmZVJhdGUgID0gaFFDLT5lbGVtZW50Qml0c1tsZmVJZHhdLT5yZWxhdGl2ZUJpdHNFbCA9IGNtLT5lbEluZm9bbGZlSWR4XS5yZWxhdGl2ZUJpdHM7CgogICAgaW50IG1heEJpdHNUb3QgPSBtYXhDaGFubmVsQml0cyAqIDc7IC8qIExGRSBkb2VzIG5vdCBhZGQgdG8gYml0IHJlc2Vydm9pciAqLwogICAgaW50IHNjID0gQ291bnRMZWFkaW5nQml0cyhmaXhNYXgobWF4Q2hhbm5lbEJpdHMsYXZlcmFnZUJpdHNUb3QpKTsKICAgIGludCBtYXhMZmVCaXRzID0gKGludCkgRkRLbWF4ICggKElOVCkoKGZNdWx0KGxmZVJhdGUsKEZJWFBfREJMKShtYXhDaGFubmVsQml0czw8c2MpKT4+c2MpPDwxKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKElOVCkoKGZNdWx0KEZMMkZYQ09OU1RfREJMKDEuMWYvMi5mKSxmTXVsdChsZmVSYXRlLChGSVhQX0RCTCkoYXZlcmFnZUJpdHNUb3Q8PHNjKSkpPDwxKT4+c2MpICk7CgogICAgbWF4Q2hhbm5lbEJpdHMgPSAobWF4Qml0c1RvdCAtIG1heExmZUJpdHMpIC8gNzsKCiAgICBoUUMtPmVsZW1lbnRCaXRzWzBdLT5jaEJpdHJhdGVFbCA9IGZNdWx0KHNjZVJhdGUsICAoRklYUF9EQkwpKGJpdHJhdGVUb3Q8PHNjX2JyVG90KSk+PnNjX2JyVG90OwogICAgaFFDLT5lbGVtZW50Qml0c1sxXS0+Y2hCaXRyYXRlRWwgPSBmTXVsdChjcGUxUmF0ZSwgKEZJWFBfREJMKShiaXRyYXRlVG90PDxzY19iclRvdCkpPj4oc2NfYnJUb3QrMSk7CiAgICBoUUMtPmVsZW1lbnRCaXRzWzJdLT5jaEJpdHJhdGVFbCA9IGZNdWx0KGNwZTJSYXRlLCAoRklYUF9EQkwpKGJpdHJhdGVUb3Q8PHNjX2JyVG90KSk+PihzY19iclRvdCsxKTsKICAgIGhRQy0+ZWxlbWVudEJpdHNbY3BlM0lkeF0tPmNoQml0cmF0ZUVsID0gZk11bHQoY3BlM1JhdGUsIChGSVhQX0RCTCkoYml0cmF0ZVRvdDw8c2NfYnJUb3QpKT4+KHNjX2JyVG90KzEpOwogICAgaFFDLT5lbGVtZW50Qml0c1tsZmVJZHhdLT5jaEJpdHJhdGVFbCA9IGZNdWx0KGxmZVJhdGUsICAoRklYUF9EQkwpKGJpdHJhdGVUb3Q8PHNjX2JyVG90KSk+PnNjX2JyVG90OwoKICAgIGhRQy0+ZWxlbWVudEJpdHNbMF0tPm1heEJpdHNFbCA9IG1heENoYW5uZWxCaXRzOwogICAgaFFDLT5lbGVtZW50Qml0c1sxXS0+bWF4Qml0c0VsID0gMiptYXhDaGFubmVsQml0czsKICAgIGhRQy0+ZWxlbWVudEJpdHNbMl0tPm1heEJpdHNFbCA9IDIqbWF4Q2hhbm5lbEJpdHM7CiAgICBoUUMtPmVsZW1lbnRCaXRzW2NwZTNJZHhdLT5tYXhCaXRzRWwgPSAyKm1heENoYW5uZWxCaXRzOwogICAgaFFDLT5lbGVtZW50Qml0c1tsZmVJZHhdLT5tYXhCaXRzRWwgPSBtYXhMZmVCaXRzOwogICAgYnJlYWs7CiAgfQogIGRlZmF1bHQ6CiAgICByZXR1cm4gQUFDX0VOQ19VTlNVUFBPUlRFRF9DSEFOTkVMQ09ORklHOwogIH0KCiAgcmV0dXJuIEFBQ19FTkNfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiBmdW5jdGlvbjogICAgR2V0TW9ub1N0ZXJlb01PREUoY29uc3QgQ0hBTk5FTF9NT0RFIG1vZGUpICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogZGVzY3JpcHRpb246IERldGVybWluZXMgZW5jb2RlciBzZXR0aW5nIGZyb20gY2hhbm5lbCBtb2RlLiAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgTXVsdGljaGFubmVsIG1vZGVzIGFyZSBtYXBwZWQgdG8gbW9ubyBvciBzdGVyZW8gbW9kZXMgICAgICAgICAgICovCi8qICAgICAgICAgICAgICByZXR1cm5zIE1PREVfTU9OTyBpbiBjYXNlIG9mIG1vbm8sICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgTU9ERV9TVEVSRU8gaW4gY2FzZSBvZiBzdGVyZW8gICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICBNT0RFX0lOVkFMSUQgaW4gY2FzZSBvZiBlcnJvciAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogaW5wdXQ6ICAgICAgIENIQU5ORUxfTU9ERSBtb2RlOiBFbmNvZGVyIG1vZGUgKHNlZSBxY19kYXRhLmgpLiAgICAgICAgICAgICAgICAqLwovKiBvdXRwdXQ6ICAgICAgcmV0dXJuOiBDTV9TVEVSRU9fTU9ERSBtb25vU3RlcmVvU2V0dGluZyAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAoTU9ERV9JTlZBTElEOiBlcnJvciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICBNT0RFX01PTk86ICAgIG1vbm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgIE1PREVfU1RFUkVPOiAgc3RlcmVvKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogbWlzYzogICAgICAgIE5vIG1lbW9yeSBpcyBhbGxvY2F0ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCkVMRU1FTlRfTU9ERSBGREthYWNFbmNfR2V0TW9ub1N0ZXJlb01vZGUoY29uc3QgQ0hBTk5FTF9NT0RFIG1vZGUpewoKICBFTEVNRU5UX01PREUgbW9ub1N0ZXJlb1NldHRpbmcgPSBFTF9NT0RFX0lOVkFMSUQ7CgogIHN3aXRjaChtb2RlKXsKICBjYXNlIE1PREVfMTogICAgICAgIC8qIG1vbm8gc2V0dXBzICovCiAgICBtb25vU3RlcmVvU2V0dGluZyA9IEVMX01PREVfTU9OTzsKICAgIGJyZWFrOwogIGNhc2UgTU9ERV8yOiAgICAgICAgLyogc3RlcmVvIHNldHVwcyAqLwogIGNhc2UgTU9ERV8xXzI6CiAgY2FzZSBNT0RFXzFfMl8xOgogIGNhc2UgTU9ERV8xXzJfMjoKICBjYXNlIE1PREVfMV8yXzJfMToKICBjYXNlIE1PREVfMV8yXzJfMl8xOgogIGNhc2UgTU9ERV83XzFfUkVBUl9TVVJST1VORDoKICBjYXNlIE1PREVfN18xX0ZST05UX0NFTlRFUjoKICAgIG1vbm9TdGVyZW9TZXR0aW5nID0gRUxfTU9ERV9TVEVSRU87CiAgICBicmVhazsKICBkZWZhdWx0OiAgICAgICAgICAgIC8qIGVycm9yICovCiAgICBtb25vU3RlcmVvU2V0dGluZyA9IEVMX01PREVfSU5WQUxJRDsKICAgIGJyZWFrOwogIH0KCiAgcmV0dXJuIG1vbm9TdGVyZW9TZXR0aW5nOwp9Cgpjb25zdCBDSEFOTkVMX01PREVfQ09ORklHX1RBQiogRkRLYWFjRW5jX0dldENoYW5uZWxNb2RlQ29uZmlndXJhdGlvbihjb25zdCBDSEFOTkVMX01PREUgbW9kZSkKewogIElOVCBpOwogIGNvbnN0IENIQU5ORUxfTU9ERV9DT05GSUdfVEFCICpjbV9jb25maWcgPSBOVUxMOwoKICAvKiBnZXQgY2hhbm5lbCBtb2RlIGNvbmZpZyAqLwogIGZvciAoaT0wOyBpPChJTlQpc2l6ZW9mKGNoYW5uZWxNb2RlQ29uZmlnKS8oSU5UKXNpemVvZihDSEFOTkVMX01PREVfQ09ORklHX1RBQik7IGkrKykgewogICAgaWYgKGNoYW5uZWxNb2RlQ29uZmlnW2ldLmVuY01vZGU9PW1vZGUpCiAgICB7CiAgICAgICAgY21fY29uZmlnID0gJmNoYW5uZWxNb2RlQ29uZmlnW2ldOwogICAgICAgIGJyZWFrOwogICAgfQogIH0KICByZXR1cm4gY21fY29uZmlnOwp9Cg==