Ci8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAoKqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE1IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAxLiAgICBJTlRST0RVQ1RJT04KVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwp0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCgpBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQppbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydApvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KClBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwppbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCnRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCnRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwpzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCgpDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAphcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCgoyLiAgICBDT1BZUklHSFQgTElDRU5TRQoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CnBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKCllvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCnlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCgpZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCllvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgoKVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dApwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCgpZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCnNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgoKWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCiJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCgozLiAgICBOTyBQQVRFTlQgTElDRU5TRQoKTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCkFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCnJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KCllvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZApieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCgo0LiAgICBESVNDTEFJTUVSCgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwpvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgpDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCmluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCm9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCmFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgoKNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgoKRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCkF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCkFtIFdvbGZzbWFudGVsIDMzCjkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Cgp3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCmFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKiEKICBcZmlsZQogIFxicmllZiAgRW52ZWxvcGUgZXh0cmFjdGlvbiAgCiAgVGhlIGZ1bmN0aW9ucyBwcm92aWRlZCBieSB0aGlzIG1vZHVsZSBhcmUgbW9zdGx5IGNhbGxlZCBieSBhcHBseVNCUigpLiBBZnRlciBpdCBpcwogIGRldGVybWluZWQgdGhhdCB0aGVyZSBpcyB2YWxpZCBTQlIgZGF0YSwgc2JyR2V0SGVhZGVyRGF0YSgpIG1pZ2h0IGJlIGNhbGxlZCBpZiB0aGUgY3VycmVudAogIFNCUiBkYXRhIGNvbnRhaW5zIGFuIFxyZWYgU0JSX0hFQURFUl9FTEVNRU5UIGFzIG9wcG9zZWQgdG8gYSBccmVmIFNCUl9TVEFOREFSRF9FTEVNRU5ULiBUaGlzIGZ1bmN0aW9uCiAgbWF5IHJldHVybiB2YXJpb3VzIGVycm9yIGNvZGVzIGFzIGRlZmluZWQgaW4gI1NCUl9IRUFERVJfU1RBVFVTIC4gTW9zdCBpbXBvcnRhbnRseSBpdCByZXR1cm5zIEhFQURFUl9SRVNFVCB3aGVuIGRlY29kZXIKICBzZXR0aW5ncyBuZWVkIHRvIGJlIHJlY2FsY3VsYXRlZCBhY2NvcmRpbmcgdG8gdGhlIFNCUiBzcGVjaWZpY2F0aW9ucy4gSW4gdGhhdCBjYXNlIGFwcGx5U0JSKCkKICB3aWxsIGluaXRpYXRpdGUgdGhlIHJlcXVpcmVkIHJlLWNvbmZpZ3VyYXRpb24uCgogIFRoZSBoZWFkZXIgZGF0YSBpcyBzdG9yZWQgaW4gYSAjU0JSX0hFQURFUl9EQVRBIHN0cnVjdHVyZS4KCiAgVGhlIGFjdHVhbCBTQlIgZGF0YSBmb3IgdGhlIGN1cnJlbnQgZnJhbWUgaXMgZGVjb2RlZCBpbnRvIFNCUl9GUkFNRV9EQVRBIHN0dWN0dXJlcyBieSBzYnJHZXRDaGFubmVsUGFpckVsZW1lbnQoKQogIFtmb3Igc3RlcmVvIHN0cmVhbXNdIGFuZCBzYnJHZXRTaW5nbGVDaGFubmVsRWxlbWVudCgpIFtmb3IgbW9ubyBzdHJlYW1zXS4gVGhlcmUgaXMgbm8gZnJhY3Rpb25hbCBhcml0aG1ldGljIGludm9sdmVkLgoKICBPbmNlIHRoZSBpbmZvcm1hdGlvbiBpcyBleHRyYWN0ZWQsIHRoZSBkYXRhIG5lZWRzIHRvIGJlIGZ1cnRoZXIgcHJlcGFyZWQgYmVmb3JlIHRoZSBhY3R1YWwgZGVjb2RpbmcgcHJvY2Vzcy4KICBUaGlzIGlzIGRvbmUgaW4gZGVjb2RlU2JyRGF0YSgpLgoKICBcc2EgRGVzY3JpcHRpb24gb2YgYnVmZmVyIG1hbmFnZW1lbnQgaW4gYXBwbHlTQlIoKS4gXHJlZiBkb2N1bWVudGF0aW9uT3ZlcnZpZXcKCiAgPGgxPkFib3V0IHRoZSBTQlIgZGF0YSBmb3JtYXQ6PC9oMT4KCiAgRWFjaCBmcmFtZSBpbmNsdWRlcyBTQlIgZGF0YSAoc2lkZSBjaGFpbiBpbmZvcm1hdGlvbiksIGFuZCBjYW4gYmUgZWl0aGVyIHRoZSBccmVmIFNCUl9IRUFERVJfRUxFTUVOVCBvciB0aGUgXHJlZiBTQlJfU1RBTkRBUkRfRUxFTUVOVC4KICBQYXJ0cyBvZiB0aGUgZGF0YSBjYW4gYmUgcHJvdGVjdGVkIGJ5IGEgQ1JDIGNoZWNrc3VtLgoKICBcYW5jaG9yIFNCUl9IRUFERVJfRUxFTUVOVCA8aDI+VGhlIFNCUl9IRUFERVJfRUxFTUVOVDwvaDI+CgogIFRoZSBTQlJfSEVBREVSX0VMRU1FTlQgY2FuIGJlIHRyYW5zbWl0dGVkIHdpdGggZXZlcnkgZnJhbWUsIGhvd2V2ZXIsIGl0IHR5cGljYWxseSBpcyBzZW5kIGV2ZXJ5IHNlY29uZCBvciBzby4gSXQgY29udGFpbnMgZnVuZGFtZW50YWwKICBpbmZvcm1hdGlvbiBzdWNoIGFzIFNCUiBzYW1wbGluZyBmcmVxdWVuY3kgYW5kIGZyZXF1ZW5jeSByYW5nZSBhcyB3ZWxsIGFzIGNvbnRyb2wgc2lnbmFscyB0aGF0IGRvIG5vdCByZXF1aXJlIGZyZXF1ZW50IGNoYW5nZXMuIEl0IGFsc28KICBpbmNsdWRlcyB0aGUgXHJlZiBTQlJfU1RBTkRBUkRfRUxFTUVOVC4KCiAgRGVwZW5kaW5nIG9uIHRoZSBjaGFuZ2VzIGJldHdlZW4gdGhlIGluZm9ybWF0aW9uIGluIGEgY3VycmVudCBTQlJfSEVBREVSX0VMRU1FTlQgYW5kIHRoZSBwcmV2aW91cyBTQlJfSEVBREVSX0VMRU1FTlQsIHRoZSBTQlIgZGVjb2RlciBtaWdodCBuZWVkCiAgdG8gYmUgcmVzZXQgYW5kIHJlY29uZmlndXJlZCAoZS5nLiBuZXcgdGFibGVzIG5lZWQgdG8gYmUgY2FsY3VsYXRlZCkuCgogIFxhbmNob3IgU0JSX1NUQU5EQVJEX0VMRU1FTlQgPGgyPlRoZSBTQlJfU1RBTkRBUkRfRUxFTUVOVDwvaDI+CgogIFRoaXMgZGF0YSBjYW4gYmUgc3ViZGl2aWRlZCBpbnRvICJzaWRlIGluZm8iIGFuZCAicmF3IGRhdGEiLCB3aGVyZSBzaWRlIGluZm8gaXMgZGVmaW5lZCBhcyBzaWduYWxzIG5lZWRlZCB0byBkZWNvZGUgdGhlIHJhdyBkYXRhCiAgYW5kIHNvbWUgZGVjb2RlciB0dW5pbmcgc2lnbmFscy4gUmF3IGRhdGEgaXMgcmVmZXJyZWQgdG8gYXMgUENNIGFuZCBIdWZmbWFuIGNvZGVkIGVudmVsb3BlIGFuZCBub2lzZSBmbG9vciBlc3RpbWF0ZXMuIFRoZSBzaWRlIGluZm8gYWxzbwogIGluY2x1ZGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSB0aW1lLWZyZXF1ZW5jeSBncmlkIGZvciB0aGUgY3VycmVudCBmcmFtZS4KCiAgXHNhIFxyZWYgZG9jdW1lbnRhdGlvbk92ZXJ2aWV3CiovCgojaW5jbHVkZSAiZW52X2V4dHIuaCIKCiNpbmNsdWRlICJzYnJfcmFtLmgiCiNpbmNsdWRlICJzYnJfcm9tLmgiCiNpbmNsdWRlICJodWZmX2RlYy5oIgoKCiNpbmNsdWRlICJwc2JpdGRlYy5oIgoKI2RlZmluZSBEUk1fUEFSQU1FVFJJQ19TVEVSRU8gICAwCiNkZWZpbmUgRVhURU5TSU9OX0lEX1BTX0NPRElORyAgMgoKCnN0YXRpYyBpbnQgZXh0cmFjdEZyYW1lSW5mbyAoSEFORExFX0ZES19CSVRTVFJFQU0gICBoQnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9IRUFERVJfREFUQSBoSGVhZGVyRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0ZSQU1FX0RBVEEgIGhfZnJhbWVfZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UICAgICAgICAgICAgIG5yT2ZDaGFubmVscywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UICAgICAgICAgICAgIGZsYWdzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwoKCnN0YXRpYyBpbnQgc2JyR2V0RW52ZWxvcGUgKEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgaEhlYWRlckRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfRlJBTUVfREFUQSAgaF9mcmFtZV9kYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSAgIGhCcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCBmbGFncyk7CgpzdGF0aWMgdm9pZCBzYnJHZXREaXJlY3Rpb25Db250cm9sRGF0YSAoSEFORExFX1NCUl9GUkFNRV9EQVRBIGhGcmFtZURhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMpOwoKc3RhdGljIHZvaWQgc2JyR2V0Tm9pc2VGbG9vckRhdGEgKEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgaEhlYWRlckRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0ZSQU1FX0RBVEEgIGhfZnJhbWVfZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNICAgaEJzKTsKCnN0YXRpYyBpbnQgY2hlY2tGcmFtZUluZm8gKEZSQU1FX0lORk8gKnBGcmFtZUluZm8sIGludCBudW1iZXJPZlRpbWVTbG90cywgaW50IG92ZXJsYXAsIGludCB0aW1lU3RlcCk7CgpTQlJfRVJST1IKaW5pdEhlYWRlckRhdGEgKAogICAgICAgIEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgIGhIZWFkZXJEYXRhLAogICAgICAgIGNvbnN0IGludCAgICAgICAgICAgICAgIHNhbXBsZVJhdGVJbiwKICAgICAgICBjb25zdCBpbnQgICAgICAgICAgICAgICBzYW1wbGVSYXRlT3V0LAogICAgICAgIGNvbnN0IGludCAgICAgICAgICAgICAgIHNhbXBsZXNQZXJGcmFtZSwKICAgICAgICBjb25zdCBVSU5UICAgICAgICAgICAgICBmbGFncwogICAgICAgICkKewogIEhBTkRMRV9GUkVRX0JBTkRfREFUQSBoRnJlcSA9ICZoSGVhZGVyRGF0YS0+ZnJlcUJhbmREYXRhOwogIFNCUl9FUlJPUiBzYnJFcnJvciA9IFNCUkRFQ19PSzsKICBpbnQgbnVtQW5hbHlzaXNCYW5kczsKCiAgaWYgKCBzYW1wbGVSYXRlSW4gPT0gc2FtcGxlUmF0ZU91dCApIHsKICAgIGhIZWFkZXJEYXRhLT5zYnJQcm9jU21wbFJhdGUgPSBzYW1wbGVSYXRlT3V0PDwxOwogICAgbnVtQW5hbHlzaXNCYW5kcyA9IDMyOwogIH0gZWxzZSB7CiAgICBoSGVhZGVyRGF0YS0+c2JyUHJvY1NtcGxSYXRlID0gc2FtcGxlUmF0ZU91dDsKICAgIGlmICggKHNhbXBsZVJhdGVPdXQ+PjEpID09IHNhbXBsZVJhdGVJbikgewogICAgICAvKiAxOjIgKi8KICAgICAgbnVtQW5hbHlzaXNCYW5kcyA9IDMyOwogICAgfSBlbHNlIGlmICggKHNhbXBsZVJhdGVPdXQ+PjIpID09IHNhbXBsZVJhdGVJbiApIHsKICAgICAgLyogMTo0ICovCiAgICAgIG51bUFuYWx5c2lzQmFuZHMgPSAzMjsKICAgIH0gZWxzZSBpZiAoIChzYW1wbGVSYXRlT3V0KjMpPj4zID09IChzYW1wbGVSYXRlSW4qOCk+PjMgKSB7CiAgICAgIC8qIDM6OCwgMy80IGNvcmUgZnJhbWUgbGVuZ3RoICovCiAgICAgIG51bUFuYWx5c2lzQmFuZHMgPSAyNDsKICAgIH0gZWxzZSB7CiAgICAgIHNickVycm9yID0gU0JSREVDX1VOU1VQUE9SVEVEX0NPTkZJRzsKICAgICAgZ290byBiYWlsOwogICAgfQogIH0KCiAgLyogRmlsbCBpbiBkZWZhdWx0IHZhbHVlcyBmaXJzdCAqLwogIGhIZWFkZXJEYXRhLT5zeW5jU3RhdGUgICAgICAgICAgPSBTQlJfTk9UX0lOSVRJQUxJWkVEOwogIGhIZWFkZXJEYXRhLT5zdGF0dXMgICAgICAgICAgICAgPSAwOwogIGhIZWFkZXJEYXRhLT5mcmFtZUVycm9yRmxhZyAgICAgPSAwOwoKICBoSGVhZGVyRGF0YS0+YnNfaW5mby5hbXBSZXNvbHV0aW9uICAgICA9IDE7CiAgaEhlYWRlckRhdGEtPmJzX2luZm8ueG92ZXJfYmFuZCAgICAgICAgPSAwOwogIGhIZWFkZXJEYXRhLT5ic19pbmZvLnNicl9wcmVwcm9jZXNzaW5nID0gMDsKCiAgaEhlYWRlckRhdGEtPmJzX2RhdGEuc3RhcnRGcmVxICAgICAgID0gNTsKICBoSGVhZGVyRGF0YS0+YnNfZGF0YS5zdG9wRnJlcSAgICAgICAgPSAwOwogIGhIZWFkZXJEYXRhLT5ic19kYXRhLmZyZXFTY2FsZSAgICAgICA9IDI7CiAgaEhlYWRlckRhdGEtPmJzX2RhdGEuYWx0ZXJTY2FsZSAgICAgID0gMTsKICBoSGVhZGVyRGF0YS0+YnNfZGF0YS5ub2lzZV9iYW5kcyAgICAgPSAyOwogIGhIZWFkZXJEYXRhLT5ic19kYXRhLmxpbWl0ZXJCYW5kcyAgICA9IDI7CiAgaEhlYWRlckRhdGEtPmJzX2RhdGEubGltaXRlckdhaW5zICAgID0gMjsKICBoSGVhZGVyRGF0YS0+YnNfZGF0YS5pbnRlcnBvbEZyZXEgICAgPSAxOwogIGhIZWFkZXJEYXRhLT5ic19kYXRhLnNtb290aGluZ0xlbmd0aCA9IDE7CgogIGhIZWFkZXJEYXRhLT50aW1lU3RlcCA9IChmbGFncyAmIFNCUkRFQ19FTERfR1JJRCkgPyAxIDogMjsKCiAgLyogU2V0dXAgcG9pbnRlcnMgdG8gZnJlcXVlbmN5IGJhbmQgdGFibGVzICovCiAgaEZyZXEtPmZyZXFCYW5kVGFibGVbMF0gID0gaEZyZXEtPmZyZXFCYW5kVGFibGVMbzsKICBoRnJlcS0+ZnJlcUJhbmRUYWJsZVsxXSA9IGhGcmVxLT5mcmVxQmFuZFRhYmxlSGk7CgogIC8qIFBhdGNoIHNvbWUgZW50cmllcyAqLwogIGlmIChzYW1wbGVSYXRlT3V0ID4gMjQwMDApIHsgICAgLyogVHJpZ2dlciBhbiBlcnJvciBpZiBTQlIgaXMgZ29pbmcgdG8gYmUgcHJvY2Vzc2VkIHdpdGhvdXQgICAgICovCiAgICBoSGVhZGVyRGF0YS0+YnNfZGF0YS5zdGFydEZyZXEgPSA3OyAgIC8qICAgaGF2aW5nIHJlYWQgdGhlc2UgZnJlcXVlbmN5IHZhbHVlcyBmcm9tIGJpdCBzdHJlYW0gYmVmb3JlLiAqLwogICAgaEhlYWRlckRhdGEtPmJzX2RhdGEuc3RvcEZyZXEgID0gMzsKICB9CgogIC8qIE9uZSBTQlIgdGltZXNsb3QgY29ycmVzcG9uZHMgdG8gdGhlIGFtb3VudCBvZiBzYW1wbGVzIGVxdWFsIHRvIHRoZSBhbW91bnQgb2YgYW5hbHlzaXMgYmFuZHMsIGRpdmlkZWQgYnkgdGhlIHRpbWVzdGVwLiAqLwogIGhIZWFkZXJEYXRhLT5udW1iZXJUaW1lU2xvdHMgPSAoc2FtcGxlc1BlckZyYW1lL251bUFuYWx5c2lzQmFuZHMpID4+IChoSGVhZGVyRGF0YS0+dGltZVN0ZXAgLSAxKTsKICBpZiAoaEhlYWRlckRhdGEtPm51bWJlclRpbWVTbG90cyA+ICgxNikpIHsKICAgIHNickVycm9yID0gU0JSREVDX1VOU1VQUE9SVEVEX0NPTkZJRzsKICB9CgogIGhIZWFkZXJEYXRhLT5udW1iZXJPZkFuYWx5c2lzQmFuZHMgPSBudW1BbmFseXNpc0JhbmRzOwoKYmFpbDoKICByZXR1cm4gc2JyRXJyb3I7Cn0KCgovKiEKICBcYnJpZWYgICBJbml0aWFsaXplIHRoZSBTQlJfUFJFVl9GUkFNRV9EQVRBIHN0cnVjdAoqLwp2b2lkCmluaXRTYnJQcmV2RnJhbWVEYXRhIChIQU5ETEVfU0JSX1BSRVZfRlJBTUVfREFUQSBoX3ByZXZfZGF0YSwgLyohPCBoYW5kbGUgdG8gc3RydWN0IFNCUl9QUkVWX0ZSQU1FX0RBVEEgKi8KICAgICAgICAgICAgICAgICAgICAgIGludCB0aW1lU2xvdHMpICAgICAgICAgICAgICAgICAgICAgICAgICAvKiE8IEZyYW1lbGVuZ3RoIGluIFNCUi10aW1lc2xvdHMgKi8KewogIGludCBpOwoKICAvKiBTZXQgcHJldmlvdXMgZW5lcmd5IGFuZCBub2lzZSBsZXZlbHMgdG8gMCBmb3IgdGhlIGNhc2UKICAgICB0aGF0IGRlY29kaW5nIHN0YXJ0cyBpbiB0aGUgbWlkZGxlIG9mIGEgYml0c3RyZWFtICovCiAgZm9yIChpPTA7IGkgPCBNQVhfRlJFUV9DT0VGRlM7IGkrKykKICAgIGhfcHJldl9kYXRhLT5zZmJfbnJnX3ByZXZbaV0gPSAoRklYUF9EQkwpMDsKICBmb3IgKGk9MDsgaSA8IE1BWF9OT0lTRV9DT0VGRlM7IGkrKykKICAgIGhfcHJldl9kYXRhLT5wcmV2Tm9pc2VMZXZlbFtpXSA9IChGSVhQX0RCTCkwOwogIGZvciAoaT0wOyBpIDwgTUFYX0lOVkZfQkFORFM7IGkrKykKICAgIGhfcHJldl9kYXRhLT5zYnJfaW52Zl9tb2RlW2ldID0gSU5WRl9PRkY7CgogIGhfcHJldl9kYXRhLT5zdG9wUG9zID0gdGltZVNsb3RzOwogIGhfcHJldl9kYXRhLT5jb3VwbGluZyA9IENPVVBMSU5HX09GRjsKICBoX3ByZXZfZGF0YS0+YW1wUmVzID0gMDsKfQoKCi8qIQogIFxicmllZiAgIFJlYWQgaGVhZGVyIGRhdGEgZnJvbSBiaXRzdHJlYW0KCiAgXHJldHVybiAgZXJyb3Igc3RhdHVzIC0gMCBpZiBvawoqLwpTQlJfSEVBREVSX1NUQVRVUwpzYnJHZXRIZWFkZXJEYXRhIChIQU5ETEVfU0JSX0hFQURFUl9EQVRBIGhIZWFkZXJEYXRhLAogICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSAgIGhCcywKICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCAgICAgICAgICAgICBmbGFncywKICAgICAgICAgICAgICAgICAgY29uc3QgaW50ICAgICAgICAgICAgICBmSXNTYnJEYXRhKQp7CiAgU0JSX0hFQURFUl9EQVRBX0JTICpwQnNEYXRhOwogIFNCUl9IRUFERVJfREFUQV9CUyBsYXN0SGVhZGVyOwogIFNCUl9IRUFERVJfREFUQV9CU19JTkZPIGxhc3RJbmZvOwogIGludCBoZWFkZXJFeHRyYTE9MCwgaGVhZGVyRXh0cmEyPTA7CgogIC8qIENvcHkgU0JSIGJpdCBzdHJlYW0gaGVhZGVyIHRvIHRlbXBvcmFyeSBoZWFkZXIgKi8KICBsYXN0SGVhZGVyID0gaEhlYWRlckRhdGEtPmJzX2RhdGE7CiAgbGFzdEluZm8gICA9IGhIZWFkZXJEYXRhLT5ic19pbmZvOwoKICAvKiBSZWFkIG5ldyBoZWFkZXIgZnJvbSBiaXRzdHJlYW0gKi8KICB7CiAgICBwQnNEYXRhID0gJmhIZWFkZXJEYXRhLT5ic19kYXRhOwogIH0KCiAgewogICAgaEhlYWRlckRhdGEtPmJzX2luZm8uYW1wUmVzb2x1dGlvbiA9IEZES3JlYWRCaXRzIChoQnMsIDEpOwogIH0KCiAgcEJzRGF0YS0+c3RhcnRGcmVxID0gRkRLcmVhZEJpdHMgKGhCcywgNCk7CiAgcEJzRGF0YS0+c3RvcEZyZXEgPSBGREtyZWFkQml0cyAoaEJzLCA0KTsKCiAgewogICAgaEhlYWRlckRhdGEtPmJzX2luZm8ueG92ZXJfYmFuZCA9IEZES3JlYWRCaXRzIChoQnMsIDMpOwogICAgRkRLcmVhZEJpdHMgKGhCcywgMik7CiAgfQoKICBoZWFkZXJFeHRyYTEgPSBGREtyZWFkQml0cyAoaEJzLCAxKTsKICBoZWFkZXJFeHRyYTIgPSBGREtyZWFkQml0cyAoaEJzLCAxKTsKCiAgLyogSGFuZGxlIGV4dHJhIGhlYWRlciBpbmZvcm1hdGlvbiAqLwogIGlmKCBoZWFkZXJFeHRyYTEpIAogIHsKICAgIHBCc0RhdGEtPmZyZXFTY2FsZSA9IEZES3JlYWRCaXRzIChoQnMsIDIpOwogICAgcEJzRGF0YS0+YWx0ZXJTY2FsZSA9IEZES3JlYWRCaXRzIChoQnMsIDEpOwogICAgcEJzRGF0YS0+bm9pc2VfYmFuZHMgPSBGREtyZWFkQml0cyAoaEJzLCAyKTsKICB9CiAgZWxzZSB7CiAgICBwQnNEYXRhLT5mcmVxU2NhbGUgICA9IDI7CiAgICBwQnNEYXRhLT5hbHRlclNjYWxlICA9IDE7CiAgICBwQnNEYXRhLT5ub2lzZV9iYW5kcyA9IDI7CiAgfQoKICBpZiAoaGVhZGVyRXh0cmEyKSB7CiAgICBwQnNEYXRhLT5saW1pdGVyQmFuZHMgPSBGREtyZWFkQml0cyAoaEJzLCAyKTsKICAgIHBCc0RhdGEtPmxpbWl0ZXJHYWlucyA9IEZES3JlYWRCaXRzIChoQnMsIDIpOwogICAgcEJzRGF0YS0+aW50ZXJwb2xGcmVxID0gRkRLcmVhZEJpdHMgKGhCcywgMSk7CiAgICBwQnNEYXRhLT5zbW9vdGhpbmdMZW5ndGggPSBGREtyZWFkQml0cyAoaEJzLCAxKTsKICB9CiAgZWxzZSB7CiAgICBwQnNEYXRhLT5saW1pdGVyQmFuZHMgICAgPSAyOwogICAgcEJzRGF0YS0+bGltaXRlckdhaW5zICAgID0gMjsKICAgIHBCc0RhdGEtPmludGVycG9sRnJlcSAgICA9IDE7CiAgICBwQnNEYXRhLT5zbW9vdGhpbmdMZW5ndGggPSAxOwogIH0KCiAgLyogTG9vayBmb3IgbmV3IHNldHRpbmdzLiBJRUMgMTQ0OTYtMywgNC42LjE4LjMuMSAqLwogIGlmKGhIZWFkZXJEYXRhLT5zeW5jU3RhdGUgPCBTQlJfSEVBREVSIHx8CiAgICAgbGFzdEhlYWRlci5zdGFydEZyZXEgICAhPSBwQnNEYXRhLT5zdGFydEZyZXEgICB8fAogICAgIGxhc3RIZWFkZXIuc3RvcEZyZXEgICAgIT0gcEJzRGF0YS0+c3RvcEZyZXEgICAgfHwKICAgICBsYXN0SGVhZGVyLmZyZXFTY2FsZSAgICE9IHBCc0RhdGEtPmZyZXFTY2FsZSAgIHx8CiAgICAgbGFzdEhlYWRlci5hbHRlclNjYWxlICAhPSBwQnNEYXRhLT5hbHRlclNjYWxlICB8fAogICAgIGxhc3RIZWFkZXIubm9pc2VfYmFuZHMgIT0gcEJzRGF0YS0+bm9pc2VfYmFuZHMgfHwKICAgICBsYXN0SW5mby54b3Zlcl9iYW5kICAgICE9IGhIZWFkZXJEYXRhLT5ic19pbmZvLnhvdmVyX2JhbmQpIHsKICAgIHJldHVybiBIRUFERVJfUkVTRVQ7IC8qIE5ldyBzZXR0aW5ncyAqLwogIH0KCiAgcmV0dXJuIEhFQURFUl9PSzsKfQoKLyohCiAgXGJyaWVmICAgR2V0IG1pc3NpbmcgaGFybW9uaWNzIHBhcmFtZXRlcnMgKG9ubHkgdXNlZCBmb3IgQUFDK1NCUikKCiAgXHJldHVybiAgZXJyb3Igc3RhdHVzIC0gMCBpZiBvawoqLwppbnQKc2JyR2V0U3ludGhldGljQ29kZWREYXRhKEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgaEhlYWRlckRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0ZSQU1FX0RBVEEgIGhGcmFtZURhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSAgIGhCcykKewogIGludCBpLCBiaXRzUmVhZCA9IDA7CgogIGludCBmbGFnID0gRkRLcmVhZEJpdHMoaEJzLDEpOwogIGJpdHNSZWFkKys7CgogIGlmKGZsYWcpewogICAgZm9yKGk9MDtpPGhIZWFkZXJEYXRhLT5mcmVxQmFuZERhdGEublNmYlsxXTtpKyspewogICAgICBoRnJhbWVEYXRhLT5hZGRIYXJtb25pY3NbaV0gID0gRkRLcmVhZEJpdHMgKGhCcywgMSApOwogICAgICBiaXRzUmVhZCsrOwogICAgfQogIH0KICBlbHNlIHsKICAgIGZvcihpPTA7IGk8TUFYX0ZSRVFfQ09FRkZTOyBpKyspCiAgICAgIGhGcmFtZURhdGEtPmFkZEhhcm1vbmljc1tpXSAgPSAwOwogIH0KICByZXR1cm4oYml0c1JlYWQpOwp9CgovKiEKICBcYnJpZWYgICAgICBSZWFkcyBleHRlbnNpb24gZGF0YSBmcm9tIHRoZSBiaXRzdHJlYW0KCiAgVGhlIGJpdHN0cmVhbSBmb3JtYXQgYWxsb3dzIHVwIHRvIDQga2luZHMgb2YgZXh0ZW5kZWQgZGF0YSBlbGVtZW50LgogIEV4dGVuZGVkIGRhdGEgbWF5IGNvbnRhaW4gc2V2ZXJhbCBlbGVtZW50cywgZWFjaCBpZGVudGlmaWVkIGJ5IGEgMi1iaXQtSUQuCiAgU28gZmFyLCBubyBleHRlbmRlZCBkYXRhIGVsZW1lbnRzIGFyZSBkZWZpbmVkIGhlbmNlIHRoZSBmaXJzdCAyIHBhcmFtZXRlcnMKICBhcmUgdW51c2VkLiBUaGUgZGF0YSBzaG91bGQgYmUgc2tpcHBlZCBpbiBvcmRlciB0byB1cGRhdGUgdGhlIG51bWJlcgogIG9mIHJlYWQgYml0cyBmb3IgdGhlIGNvbnNpc3RlbmN5IGNoZWNrIGluIGFwcGx5U0JSKCkuCiovCnN0YXRpYyBpbnQgIGV4dHJhY3RFeHRlbmRlZERhdGEoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9IRUFERVJfREFUQSBoSGVhZGVyRGF0YSwgICAgLyohPCBoYW5kbGUgdG8gU0JSIGhlYWRlciAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNICAgaEJzICAgICAgICAgICAgIC8qITwgSGFuZGxlIHRvIHRoZSBiaXQgYnVmZmVyICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsSEFORExFX1BTX0RFQyBoUGFyYW1ldHJpY1N0ZXJlb0RlYyAgICAgLyohPCBQYXJhbWV0cmljIFN0ZXJlbyBEZWNvZGVyICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7CiAgSU5UIG5CaXRzTGVmdDsKICBpbnQgZXh0ZW5kZWRfZGF0YTsKICBpbnQgaSwgZnJhbWVPayA9IDE7CgoKICBleHRlbmRlZF9kYXRhID0gRkRLcmVhZEJpdHMoaEJzLCAxKTsKCiAgaWYgKGV4dGVuZGVkX2RhdGEpIHsKICAgIGludCBjbnQ7CiAgICBpbnQgYlBzUmVhZCA9IDA7CgogICAgY250ID0gRkRLcmVhZEJpdHMoaEJzLCA0KTsKICAgIGlmIChjbnQgPT0gKDE8PDQpLTEpCiAgICAgIGNudCArPSBGREtyZWFkQml0cyhoQnMsIDgpOwoKCiAgICBuQml0c0xlZnQgPSA4ICogY250OwoKICAgIC8qIHNhbml0eSBjaGVjayBmb3IgY250ICovCiAgICBpZiAobkJpdHNMZWZ0ID4gKElOVClGREtnZXRWYWxpZEJpdHMoaEJzKSkgewogICAgICAvKiBsaW1pdCBuQml0c0xlZnQgKi8KICAgICAgbkJpdHNMZWZ0ID0gKElOVClGREtnZXRWYWxpZEJpdHMoaEJzKTsKICAgICAgLyogc2V0IGZyYW1lIGVycm9yICovCiAgICAgIGZyYW1lT2sgPSAwOwogICAgfQoKICAgIHdoaWxlIChuQml0c0xlZnQgPiA3KSB7CiAgICAgIGludCBleHRlbnNpb25faWQgPSBGREtyZWFkQml0cyhoQnMsIDIpOwogICAgICBuQml0c0xlZnQgLT0gMjsKCiAgICAgIHN3aXRjaChleHRlbnNpb25faWQpIHsKCgoKICAgICAgICBjYXNlIEVYVEVOU0lPTl9JRF9QU19DT0RJTkc6CgogICAgICAgIC8qIFJlYWQgUFMgZGF0YSBmcm9tIGJpdHN0cmVhbSAqLwoKICAgICAgICBpZiAoaFBhcmFtZXRyaWNTdGVyZW9EZWMgIT0gTlVMTCkgewogICAgICAgICAgaWYoYlBzUmVhZCAmJiAhaFBhcmFtZXRyaWNTdGVyZW9EZWMtPmJzRGF0YVtoUGFyYW1ldHJpY1N0ZXJlb0RlYy0+YnNSZWFkU2xvdF0ubXBlZy5iUHNIZWFkZXJWYWxpZCkgewogICAgICAgICAgICBjbnQgPSBuQml0c0xlZnQgPj4gMzsgLyogbnVtYmVyIG9mIHJlbWFpbmluZyBieXRlcyAqLwogICAgICAgICAgICBmb3IgKGk9MDsgaTxjbnQ7IGkrKykKICAgICAgICAgICAgICBGREtyZWFkQml0cyhoQnMsIDgpOwogICAgICAgICAgICBuQml0c0xlZnQgLT0gY250ICogODsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIG5CaXRzTGVmdCAtPSBSZWFkUHNEYXRhKGhQYXJhbWV0cmljU3RlcmVvRGVjLCBoQnMsIG5CaXRzTGVmdCk7CiAgICAgICAgICAgIGJQc1JlYWQgPSAxOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgICAvKiBwYXJhbWV0cmljIHN0ZXJlbyBkZXRlY3RlZCwgY291bGQgc2V0IGNoYW5uZWxNb2RlIGFjY29yZGluZ2x5IGhlcmUgICovCiAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAvKiAiVGhlIHVzYWdlIG9mIHRoaXMgcGFyYW1ldHJpYyBzdGVyZW8gZXh0ZW5zaW9uIHRvIEhFLUFBQyBpcyAgICAgICAgICovCiAgICAgICAgICAvKiBzaWduYWxsZWQgaW1wbGljaXRseSBpbiB0aGUgYml0c3RyZWFtLiBIZW5jZSwgaWYgYW4gc2JyX2V4dGVuc2lvbigpICovCiAgICAgICAgICAvKiB3aXRoIGJzX2V4dGVuc2lvbl9pZD09RVhURU5TSU9OX0lEX1BTIGlzIGZvdW5kIGluIHRoZSBTQlIgcGFydCBvZiAgICovCiAgICAgICAgICAvKiB0aGUgYml0c3RyZWFtLCBhIGRlY29kZXIgc3VwcG9ydGluZyB0aGUgY29tYmluYXRpb24gb2YgU0JSIGFuZCBQUyAgICovCiAgICAgICAgICAvKiBzaGFsbCBvcGVyYXRlIHRoZSBQUyB0b29sIHRvIGdlbmVyYXRlIGEgc3RlcmVvIG91dHB1dCBzaWduYWwuIiAgICAgICovCiAgICAgICAgICAvKiBzb3VyY2U6IElTTy9JRUMgMTQ0OTYtMzoyMDAxL0ZEQU0gMjoyMDA0KEUpICAgICAgICAgICAgICAgICAgICAgICAgICovCgogICAgICAgIGJyZWFrOwoKCiAgICAgIGRlZmF1bHQ6CiAgICAgICAgY250ID0gbkJpdHNMZWZ0ID4+IDM7IC8qIG51bWJlciBvZiByZW1haW5pbmcgYnl0ZXMgKi8KICAgICAgICBmb3IgKGk9MDsgaTxjbnQ7IGkrKykKICAgICAgICAgIEZES3JlYWRCaXRzKGhCcywgOCk7CiAgICAgICAgbkJpdHNMZWZ0IC09IGNudCAqIDg7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KCiAgICBpZiAobkJpdHNMZWZ0IDwgMCkgewogICAgICBmcmFtZU9rID0gMDsKICAgICAgZ290byBiYWlsOwogICAgfQogICAgZWxzZSB7CiAgICAgIC8qIFJlYWQgZmlsbCBiaXRzIGZvciBieXRlIGFsaWdubWVudCAqLwogICAgICBGREtyZWFkQml0cyhoQnMsIG5CaXRzTGVmdCk7CiAgICB9CiAgfQoKYmFpbDoKICByZXR1cm4gKGZyYW1lT2spOwp9CgoKLyohCiAgXGJyaWVmICAgUmVhZCBiaXRzdHJlYW0gZWxlbWVudHMgb2Ygb25lIGNoYW5uZWwKCiAgXHJldHVybiAgU2JyRnJhbWVPSzogIDE9b2ssIDA9ZXJyb3IKKi8KaW50CnNickdldFNpbmdsZUNoYW5uZWxFbGVtZW50IChIQU5ETEVfU0JSX0hFQURFUl9EQVRBIGhIZWFkZXJEYXRhLCAgICAgICAgICAvKiE8IFN0YXRpYyBjb250cm9sIGRhdGEgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfRlJBTUVfREFUQSAgaEZyYW1lRGF0YSwgICAgICAgICAgIC8qITwgQ29udHJvbCBkYXRhIG9mIGN1cnJlbnQgZnJhbWUgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNICAgaEJzLCAgICAgICAgICAgICAgICAgIC8qITwgSGFuZGxlIHRvIHN0cnVjdCBCSVRfQlVGICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfUFNfREVDICAgICAgICAgIGhQYXJhbWV0cmljU3RlcmVvRGVjLCAvKiE8IEhhbmRsZSB0byBQUyBkZWNvZGVyICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UICAgICAgICAgICAgIGZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ICAgICAgICAgICAgICBvdmVybGFwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICkKewogIGludCBpOwoKCiAgaEZyYW1lRGF0YS0+Y291cGxpbmcgPSBDT1VQTElOR19PRkY7CgogIHsKICAgIC8qIFJlc2VydmVkIGJpdHMgKi8KICAgIGlmIChGREtyZWFkQml0cyhoQnMsIDEpKSB7ICAvKiBic19kYXRhX2V4dHJhICovCiAgICAgIEZES3JlYWRCaXRzKGhCcywgNCk7CiAgICAgIGlmIChmbGFncyAmIFNCUkRFQ19TWU5UQVhfU0NBTCkgewogICAgICAgIEZES3JlYWRCaXRzKGhCcywgNCk7CiAgICAgIH0KICAgIH0KICB9CgogIGlmIChmbGFncyAmIFNCUkRFQ19TWU5UQVhfU0NBTCkgewogICAgRkRLcmVhZEJpdHMgKGhCcywgMSk7ICAgICAvKiBic19jb3VwbGluZyAqLwogIH0KCiAgLyoKICAgIEdyaWQgY29udHJvbAogICovCiAgaWYgKCAhZXh0cmFjdEZyYW1lSW5mbyAoIGhCcywgaEhlYWRlckRhdGEsIGhGcmFtZURhdGEsIDEsIGZsYWdzKSApCiAgIHJldHVybiAwOwoKICBpZiAoICFjaGVja0ZyYW1lSW5mbyAoJmhGcmFtZURhdGEtPmZyYW1lSW5mbywgaEhlYWRlckRhdGEtPm51bWJlclRpbWVTbG90cywgb3ZlcmxhcCwgaEhlYWRlckRhdGEtPnRpbWVTdGVwKSApCiAgICByZXR1cm4gMDsKCgogIC8qCiAgICBGZXRjaCBkb21haW4gdmVjdG9ycyAodGltZSBvciBmcmVxdWVuY3kgZGlyZWN0aW9uIGZvciBkZWx0YS1jb2RpbmcpCiAgKi8KICBzYnJHZXREaXJlY3Rpb25Db250cm9sRGF0YSAoaEZyYW1lRGF0YSwgaEJzKTsKCiAgZm9yIChpPTA7IGk8aEhlYWRlckRhdGEtPmZyZXFCYW5kRGF0YS5uSW52ZkJhbmRzOyBpKyspIHsKICAgIGhGcmFtZURhdGEtPnNicl9pbnZmX21vZGVbaV0gPQogICAgICAoSU5WRl9NT0RFKSBGREtyZWFkQml0cyAoaEJzLCAyKTsKICB9CgoKCiAgLyogcmF3IGRhdGEgKi8KICBpZiAoICFzYnJHZXRFbnZlbG9wZSAoaEhlYWRlckRhdGEsIGhGcmFtZURhdGEsIGhCcywgZmxhZ3MpICkKICAgIHJldHVybiAwOwoKCiAgc2JyR2V0Tm9pc2VGbG9vckRhdGEgKGhIZWFkZXJEYXRhLCBoRnJhbWVEYXRhLCBoQnMpOwoKICBzYnJHZXRTeW50aGV0aWNDb2RlZERhdGEoaEhlYWRlckRhdGEsIGhGcmFtZURhdGEsIGhCcyk7CgogIHsKICAgIC8qIHNiciBleHRlbmRlZCBkYXRhICovCiAgICBpZiAoISBleHRyYWN0RXh0ZW5kZWREYXRhKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEhlYWRlckRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLGhQYXJhbWV0cmljU3RlcmVvRGVjCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApKSB7CiAgICAgIHJldHVybiAwOwogICAgfQogIH0KCiAgcmV0dXJuIDE7Cn0KCgoKLyohCiAgXGJyaWVmICAgICAgUmVhZCBiaXRzdHJlYW0gZWxlbWVudHMgb2YgYSBjaGFubmVsIHBhaXIKICBccmV0dXJuICAgICBTYnJGcmFtZU9LCiovCmludApzYnJHZXRDaGFubmVsUGFpckVsZW1lbnQgKEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgaEhlYWRlckRhdGEsICAgIC8qITwgU3RhdGljIGNvbnRyb2wgZGF0YSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfRlJBTUVfREFUQSAgaEZyYW1lRGF0YUxlZnQsIC8qITwgRHluYW1pYyBjb250cm9sIGRhdGEgZm9yIGZpcnN0IGNoYW5uZWwgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0ZSQU1FX0RBVEEgIGhGcmFtZURhdGFSaWdodCwvKiE8IER5bmFtaWMgY29udHJvbCBkYXRhIGZvciBzZWNvbmQgY2hhbm5lbCAqLwogICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNICAgaEJzLCAgICAgICAgICAgIC8qITwgaGFuZGxlIHRvIHN0cnVjdCBCSVRfQlVGICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUlOVCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgb3ZlcmxhcCApCnsKICBpbnQgaSwgYml0OwoKCiAgLyogUmVzZXJ2ZWQgYml0cyAqLwogIGlmIChGREtyZWFkQml0cyhoQnMsIDEpKSB7ICAvKiBic19kYXRhX2V4dHJhICovCiAgICBGREtyZWFkQml0cyhoQnMsIDQpOwogICAgRkRLcmVhZEJpdHMoaEJzLCA0KTsKICB9CgogIC8qIFJlYWQgY291cGxpbmcgZmxhZyAqLwogIGJpdCA9IEZES3JlYWRCaXRzIChoQnMsIDEpOwoKICBpZiAoYml0KSB7CiAgICBoRnJhbWVEYXRhTGVmdC0+Y291cGxpbmcgPSBDT1VQTElOR19MRVZFTDsKICAgIGhGcmFtZURhdGFSaWdodC0+Y291cGxpbmcgPSBDT1VQTElOR19CQUw7CiAgfQogIGVsc2UgewogICAgaEZyYW1lRGF0YUxlZnQtPmNvdXBsaW5nID0gQ09VUExJTkdfT0ZGOwogICAgaEZyYW1lRGF0YVJpZ2h0LT5jb3VwbGluZyA9IENPVVBMSU5HX09GRjsKICB9CgoKICAvKgogICAgR3JpZCBjb250cm9sCiAgKi8KICBpZiAoICFleHRyYWN0RnJhbWVJbmZvIChoQnMsIGhIZWFkZXJEYXRhLCBoRnJhbWVEYXRhTGVmdCwgMiwgZmxhZ3MpICkKICAgIHJldHVybiAwOwoKICBpZiAoICFjaGVja0ZyYW1lSW5mbyAoJmhGcmFtZURhdGFMZWZ0LT5mcmFtZUluZm8sIGhIZWFkZXJEYXRhLT5udW1iZXJUaW1lU2xvdHMsIG92ZXJsYXAsIGhIZWFkZXJEYXRhLT50aW1lU3RlcCkgKQogICAgcmV0dXJuIDA7CgogIGlmIChoRnJhbWVEYXRhTGVmdC0+Y291cGxpbmcpIHsKICAgIEZES21lbWNweSAoJmhGcmFtZURhdGFSaWdodC0+ZnJhbWVJbmZvLCAmaEZyYW1lRGF0YUxlZnQtPmZyYW1lSW5mbywgc2l6ZW9mKEZSQU1FX0lORk8pKTsKICAgIGhGcmFtZURhdGFSaWdodC0+YW1wUmVzb2x1dGlvbkN1cnJlbnRGcmFtZSA9IGhGcmFtZURhdGFMZWZ0LT5hbXBSZXNvbHV0aW9uQ3VycmVudEZyYW1lOwogIH0KICBlbHNlIHsKICAgIGlmICggIWV4dHJhY3RGcmFtZUluZm8gKGhCcywgaEhlYWRlckRhdGEsIGhGcmFtZURhdGFSaWdodCwgMiwgZmxhZ3MpICkKICAgICAgcmV0dXJuIDA7CgogICAgaWYgKCAhY2hlY2tGcmFtZUluZm8gKCZoRnJhbWVEYXRhUmlnaHQtPmZyYW1lSW5mbywgaEhlYWRlckRhdGEtPm51bWJlclRpbWVTbG90cywgb3ZlcmxhcCwgaEhlYWRlckRhdGEtPnRpbWVTdGVwKSApCiAgICAgIHJldHVybiAwOwogIH0KCiAgLyoKICAgIEZldGNoIGRvbWFpbiB2ZWN0b3JzICh0aW1lIG9yIGZyZXF1ZW5jeSBkaXJlY3Rpb24gZm9yIGRlbHRhLWNvZGluZykKICAqLwogIHNickdldERpcmVjdGlvbkNvbnRyb2xEYXRhIChoRnJhbWVEYXRhTGVmdCwgaEJzKTsKICBzYnJHZXREaXJlY3Rpb25Db250cm9sRGF0YSAoaEZyYW1lRGF0YVJpZ2h0LCBoQnMpOwoKICBmb3IgKGk9MDsgaTxoSGVhZGVyRGF0YS0+ZnJlcUJhbmREYXRhLm5JbnZmQmFuZHM7IGkrKykgewogICAgaEZyYW1lRGF0YUxlZnQtPnNicl9pbnZmX21vZGVbaV0gPSAoSU5WRl9NT0RFKSBGREtyZWFkQml0cyAoaEJzLCAyKTsKICB9CgogIGlmIChoRnJhbWVEYXRhTGVmdC0+Y291cGxpbmcpIHsKICAgIGZvciAoaT0wOyBpPGhIZWFkZXJEYXRhLT5mcmVxQmFuZERhdGEubkludmZCYW5kczsgaSsrKSB7CiAgICAgIGhGcmFtZURhdGFSaWdodC0+c2JyX2ludmZfbW9kZVtpXSA9IGhGcmFtZURhdGFMZWZ0LT5zYnJfaW52Zl9tb2RlW2ldOwogICAgfQoKCiAgICBpZiAoICFzYnJHZXRFbnZlbG9wZSAoaEhlYWRlckRhdGEsIGhGcmFtZURhdGFMZWZ0LCBoQnMsIGZsYWdzKSApIHsKICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgc2JyR2V0Tm9pc2VGbG9vckRhdGEgKGhIZWFkZXJEYXRhLCBoRnJhbWVEYXRhTGVmdCwgaEJzKTsKCiAgICBpZiAoICFzYnJHZXRFbnZlbG9wZSAoaEhlYWRlckRhdGEsIGhGcmFtZURhdGFSaWdodCwgaEJzLCBmbGFncykgKSB7CiAgICAgIHJldHVybiAwOwogICAgfQogIH0KICBlbHNlIHsKCiAgICBmb3IgKGk9MDsgaTxoSGVhZGVyRGF0YS0+ZnJlcUJhbmREYXRhLm5JbnZmQmFuZHM7IGkrKykgewogICAgICBoRnJhbWVEYXRhUmlnaHQtPnNicl9pbnZmX21vZGVbaV0gPSAoSU5WRl9NT0RFKSBGREtyZWFkQml0cyAoaEJzLCAyKTsKICAgIH0KCgoKICAgIGlmICggIXNickdldEVudmVsb3BlIChoSGVhZGVyRGF0YSwgaEZyYW1lRGF0YUxlZnQsIGhCcywgZmxhZ3MpICkKICAgICAgcmV0dXJuIDA7CgogICAgaWYgKCAhc2JyR2V0RW52ZWxvcGUgKGhIZWFkZXJEYXRhLCBoRnJhbWVEYXRhUmlnaHQsIGhCcywgZmxhZ3MpICkKICAgICAgcmV0dXJuIDA7CgogICAgc2JyR2V0Tm9pc2VGbG9vckRhdGEgKGhIZWFkZXJEYXRhLCBoRnJhbWVEYXRhTGVmdCwgaEJzKTsKCiAgfQogIHNickdldE5vaXNlRmxvb3JEYXRhIChoSGVhZGVyRGF0YSwgaEZyYW1lRGF0YVJpZ2h0LCBoQnMpOwoKICBzYnJHZXRTeW50aGV0aWNDb2RlZERhdGEoaEhlYWRlckRhdGEsIGhGcmFtZURhdGFMZWZ0LCBoQnMpOwogIHNickdldFN5bnRoZXRpY0NvZGVkRGF0YShoSGVhZGVyRGF0YSwgaEZyYW1lRGF0YVJpZ2h0LCBoQnMpOwoKICB7CiAgICBpZiAoISBleHRyYWN0RXh0ZW5kZWREYXRhKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEhlYWRlckRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLE5VTEwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICApICkgewogICAgICByZXR1cm4gMDsKICAgIH0KICB9CgogIHJldHVybiAxOwp9CgoKCgovKiEKICBcYnJpZWYgICBSZWFkIGRpcmVjdGlvbiBjb250cm9sIGRhdGEgZnJvbSBiaXRzdHJlYW0KKi8Kdm9pZApzYnJHZXREaXJlY3Rpb25Db250cm9sRGF0YSAoSEFORExFX1NCUl9GUkFNRV9EQVRBIGhfZnJhbWVfZGF0YSwgLyohPCBoYW5kbGUgdG8gc3RydWN0IFNCUl9GUkFNRV9EQVRBICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSAgaEJzKSAgICAgICAgICAvKiE8IGhhbmRsZSB0byBzdHJ1Y3QgQklUX0JVRiAqLwp7CiAgaW50IGk7CgogIGZvciAoaSA9IDA7IGkgPCBoX2ZyYW1lX2RhdGEtPmZyYW1lSW5mby5uRW52ZWxvcGVzOyBpKyspIHsKICAgIGhfZnJhbWVfZGF0YS0+ZG9tYWluX3ZlY1tpXSA9IEZES3JlYWRCaXRzIChoQnMsIDEpOwogIH0KCiAgZm9yIChpID0gMDsgaSA8IGhfZnJhbWVfZGF0YS0+ZnJhbWVJbmZvLm5Ob2lzZUVudmVsb3BlczsgaSsrKSB7CiAgICBoX2ZyYW1lX2RhdGEtPmRvbWFpbl92ZWNfbm9pc2VbaV0gPSBGREtyZWFkQml0cyAoaEJzLCAxKTsKICB9Cn0KCgoKLyohCiAgXGJyaWVmICAgUmVhZCBub2lzZS1mbG9vci1sZXZlbCBkYXRhIGZyb20gYml0c3RyZWFtCiovCnZvaWQKc2JyR2V0Tm9pc2VGbG9vckRhdGEgKEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgaEhlYWRlckRhdGEsICAvKiE8IFN0YXRpYyBjb250cm9sIGRhdGEgKi8KICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfRlJBTUVfREFUQSAgaF9mcmFtZV9kYXRhLCAvKiE8IGhhbmRsZSB0byBzdHJ1Y3QgU0JSX0ZSQU1FX0RBVEEgKi8KICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNICAgaEJzKSAgICAgICAgICAvKiE8IGhhbmRsZSB0byBzdHJ1Y3QgQklUX0JVRiAqLwp7CiAgaW50IGksajsKICBpbnQgZGVsdGE7CiAgQ09VUExJTkdfTU9ERSBjb3VwbGluZzsKICBpbnQgbm9Ob2lzZUJhbmRzID0gaEhlYWRlckRhdGEtPmZyZXFCYW5kRGF0YS5uTmZiOwoKICBIdWZmbWFuIGhjYl9ub2lzZUY7CiAgSHVmZm1hbiBoY2Jfbm9pc2U7CiAgaW50IGVudkRhdGFUYWJsZUNvbXBGYWN0b3I7CgogIGNvdXBsaW5nID0gaF9mcmFtZV9kYXRhLT5jb3VwbGluZzsKCgogIC8qCiAgICBTZWxlY3QgaHVmZm1hbiBjb2RlYm9vayBkZXBlbmRpbmcgb24gY291cGxpbmcgbW9kZQogICovCiAgaWYgKGNvdXBsaW5nID09IENPVVBMSU5HX0JBTCkgewogICAgaGNiX25vaXNlID0gKEh1ZmZtYW4pJkZES19zYnJEZWNvZGVyX3Nicl9odWZmQm9va19Ob2lzZUJhbGFuY2UxMVQ7CiAgICBoY2Jfbm9pc2VGID0gKEh1ZmZtYW4pJkZES19zYnJEZWNvZGVyX3Nicl9odWZmQm9va19FbnZCYWxhbmNlMTFGOyAgLyogInNicl9odWZmQm9va19Ob2lzZUJhbGFuY2UxMUYiICovCiAgICBlbnZEYXRhVGFibGVDb21wRmFjdG9yID0gMTsKICB9CiAgZWxzZSB7CiAgICBoY2Jfbm9pc2UgPSAoSHVmZm1hbikmRkRLX3NickRlY29kZXJfc2JyX2h1ZmZCb29rX05vaXNlTGV2ZWwxMVQ7CiAgICBoY2Jfbm9pc2VGID0gKEh1ZmZtYW4pJkZES19zYnJEZWNvZGVyX3Nicl9odWZmQm9va19FbnZMZXZlbDExRjsgICAgLyogInNicl9odWZmQm9va19Ob2lzZUxldmVsMTFGIiAqLwogICAgZW52RGF0YVRhYmxlQ29tcEZhY3RvciA9IDA7CiAgfQoKICAvKgogICAgUmVhZCByYXcgbm9pc2UtZW52ZWxvcGUgZGF0YQogICovCiAgZm9yIChpPTA7IGk8aF9mcmFtZV9kYXRhLT5mcmFtZUluZm8ubk5vaXNlRW52ZWxvcGVzOyBpKyspIHsKCgogICAgaWYgKGhfZnJhbWVfZGF0YS0+ZG9tYWluX3ZlY19ub2lzZVtpXSA9PSAwKSB7CiAgICAgIGlmIChjb3VwbGluZyA9PSBDT1VQTElOR19CQUwpIHsKICAgICAgICBoX2ZyYW1lX2RhdGEtPnNick5vaXNlRmxvb3JMZXZlbFtpKm5vTm9pc2VCYW5kc10gPQogICAgICAgICAgKEZJWFBfU0dMKSAoKChpbnQpRkRLcmVhZEJpdHMgKGhCcywgNSkpIDw8IGVudkRhdGFUYWJsZUNvbXBGYWN0b3IpOwogICAgICB9CiAgICAgIGVsc2UgewogICAgICAgIGhfZnJhbWVfZGF0YS0+c2JyTm9pc2VGbG9vckxldmVsW2kqbm9Ob2lzZUJhbmRzXSA9CiAgICAgICAgICAoRklYUF9TR0wpIChpbnQpRkRLcmVhZEJpdHMgKGhCcywgNSk7CiAgICAgIH0KCiAgICAgIGZvciAoaiA9IDE7IGogPCBub05vaXNlQmFuZHM7IGorKykgewogICAgICAgIGRlbHRhID0gRGVjb2RlSHVmZm1hbkNXKGhjYl9ub2lzZUYsIGhCcyk7CiAgICAgICAgaF9mcmFtZV9kYXRhLT5zYnJOb2lzZUZsb29yTGV2ZWxbaSpub05vaXNlQmFuZHMral0gPSAoRklYUF9TR0wpIChkZWx0YSA8PCBlbnZEYXRhVGFibGVDb21wRmFjdG9yKTsKICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgIGZvciAoaiA9IDA7IGogPCBub05vaXNlQmFuZHM7IGorKykgewogICAgICAgIGRlbHRhID0gRGVjb2RlSHVmZm1hbkNXKGhjYl9ub2lzZSwgaEJzKTsKICAgICAgICBoX2ZyYW1lX2RhdGEtPnNick5vaXNlRmxvb3JMZXZlbFtpKm5vTm9pc2VCYW5kcytqXSA9IChGSVhQX1NHTCkgKGRlbHRhIDw8IGVudkRhdGFUYWJsZUNvbXBGYWN0b3IpOwogICAgICB9CiAgICB9CiAgfQp9CgoKLyohCiAgXGJyaWVmICAgUmVhZCBlbnZlbG9wZSBkYXRhIGZyb20gYml0c3RyZWFtCiovCnN0YXRpYyBpbnQKc2JyR2V0RW52ZWxvcGUgKEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgaEhlYWRlckRhdGEsICAvKiE8IFN0YXRpYyBjb250cm9sIGRhdGEgKi8KICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfRlJBTUVfREFUQSAgaF9mcmFtZV9kYXRhLCAvKiE8IGhhbmRsZSB0byBzdHJ1Y3QgU0JSX0ZSQU1FX0RBVEEgKi8KICAgICAgICAgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNICAgaEJzLCAgICAgICAgICAvKiE8IGhhbmRsZSB0byBzdHJ1Y3QgQklUX0JVRiAqLwogICAgICAgICAgICAgICAgY29uc3QgVUlOVCAgICAgICAgICAgICBmbGFncykKewogIGludCBpLCBqOwogIFVDSEFSIG5vX2JhbmRbTUFYX0VOVkVMT1BFU107CiAgaW50IGRlbHRhID0gMDsKICBpbnQgb2Zmc2V0ID0gMDsKICBDT1VQTElOR19NT0RFIGNvdXBsaW5nID0gaF9mcmFtZV9kYXRhLT5jb3VwbGluZzsKICBpbnQgYW1wUmVzID0gaEhlYWRlckRhdGEtPmJzX2luZm8uYW1wUmVzb2x1dGlvbjsKICBpbnQgbkVudmVsb3BlcyA9IGhfZnJhbWVfZGF0YS0+ZnJhbWVJbmZvLm5FbnZlbG9wZXM7CiAgaW50IGVudkRhdGFUYWJsZUNvbXBGYWN0b3I7CiAgaW50IHN0YXJ0X2JpdHMsIHN0YXJ0X2JpdHNfYmFsYW5jZTsKICBIdWZmbWFuIGhjYl90LCBoY2JfZjsKCiAgaF9mcmFtZV9kYXRhLT5uU2NhbGVGYWN0b3JzID0gMDsKCiAgaWYgKCAoaF9mcmFtZV9kYXRhLT5mcmFtZUluZm8uZnJhbWVDbGFzcyA9PSAwKSAmJiAobkVudmVsb3BlcyA9PSAxKSApIHsKICAgIGlmIChmbGFncyAmIFNCUkRFQ19FTERfR1JJRCkKICAgICAgYW1wUmVzID0gaF9mcmFtZV9kYXRhLT5hbXBSZXNvbHV0aW9uQ3VycmVudEZyYW1lOwogICAgZWxzZQogICAgICBhbXBSZXMgPSAwOwogIH0KICBoX2ZyYW1lX2RhdGEtPmFtcFJlc29sdXRpb25DdXJyZW50RnJhbWUgPSBhbXBSZXM7CgogIC8qCiAgICBTZXQgbnVtYmVyIG9mIGJpdHMgZm9yIGZpcnN0IHZhbHVlIGRlcGVuZGluZyBvbiBhbXBsaXR1ZGUgcmVzb2x1dGlvbgogICovCiAgaWYoYW1wUmVzID09IDEpCiAgewogICAgc3RhcnRfYml0cyA9IDY7CiAgICBzdGFydF9iaXRzX2JhbGFuY2UgPSA1OwogIH0KICBlbHNlCiAgewogICAgc3RhcnRfYml0cyA9IDc7CiAgICBzdGFydF9iaXRzX2JhbGFuY2UgPSA2OwogIH0KCiAgLyoKICAgIENhbGN1bGF0ZSBudW1iZXIgb2YgdmFsdWVzIGZvciBlYWNoIGVudmVsb3BlIGFuZCBhbGx0b2dldGhlcgogICovCiAgZm9yIChpID0gMDsgaSA8IG5FbnZlbG9wZXM7IGkrKykgewogICAgbm9fYmFuZFtpXSA9IGhIZWFkZXJEYXRhLT5mcmVxQmFuZERhdGEublNmYltoX2ZyYW1lX2RhdGEtPmZyYW1lSW5mby5mcmVxUmVzW2ldXTsKICAgIGhfZnJhbWVfZGF0YS0+blNjYWxlRmFjdG9ycyArPSBub19iYW5kW2ldOwogIH0KICBpZiAoaF9mcmFtZV9kYXRhLT5uU2NhbGVGYWN0b3JzID4gTUFYX05VTV9FTlZFTE9QRV9WQUxVRVMpCiAgICByZXR1cm4gMDsKCiAgLyoKICAgIFNlbGVjdCBIdWZmbWFuIGNvZGVib29rIGRlcGVuZGluZyBvbiBjb3VwbGluZyBtb2RlIGFuZCBhbXBsaXR1ZGUgcmVzb2x1dGlvbgogICovCiAgaWYgKGNvdXBsaW5nID09IENPVVBMSU5HX0JBTCkgewogICAgZW52RGF0YVRhYmxlQ29tcEZhY3RvciA9IDE7CiAgICBpZiAoYW1wUmVzID09IDApIHsKICAgICAgaGNiX3QgPSAoSHVmZm1hbikmRkRLX3NickRlY29kZXJfc2JyX2h1ZmZCb29rX0VudkJhbGFuY2UxMFQ7CiAgICAgIGhjYl9mID0gKEh1ZmZtYW4pJkZES19zYnJEZWNvZGVyX3Nicl9odWZmQm9va19FbnZCYWxhbmNlMTBGOwogICAgfQogICAgZWxzZSB7CiAgICAgIGhjYl90ID0gKEh1ZmZtYW4pJkZES19zYnJEZWNvZGVyX3Nicl9odWZmQm9va19FbnZCYWxhbmNlMTFUOwogICAgICBoY2JfZiA9IChIdWZmbWFuKSZGREtfc2JyRGVjb2Rlcl9zYnJfaHVmZkJvb2tfRW52QmFsYW5jZTExRjsKICAgIH0KICB9CiAgZWxzZSB7CiAgICBlbnZEYXRhVGFibGVDb21wRmFjdG9yID0gMDsKICAgIGlmIChhbXBSZXMgPT0gMCkgewogICAgICBoY2JfdCA9IChIdWZmbWFuKSZGREtfc2JyRGVjb2Rlcl9zYnJfaHVmZkJvb2tfRW52TGV2ZWwxMFQ7CiAgICAgIGhjYl9mID0gKEh1ZmZtYW4pJkZES19zYnJEZWNvZGVyX3Nicl9odWZmQm9va19FbnZMZXZlbDEwRjsKICAgIH0KICAgIGVsc2UgewogICAgICBoY2JfdCA9IChIdWZmbWFuKSZGREtfc2JyRGVjb2Rlcl9zYnJfaHVmZkJvb2tfRW52TGV2ZWwxMVQ7CiAgICAgIGhjYl9mID0gKEh1ZmZtYW4pJkZES19zYnJEZWNvZGVyX3Nicl9odWZmQm9va19FbnZMZXZlbDExRjsKICAgIH0KICB9CgogIC8qCiAgICBOb3cgcmVhZCByYXcgZW52ZWxvcGUgZGF0YQogICovCiAgZm9yIChqID0gMCwgb2Zmc2V0ID0gMDsgaiA8IG5FbnZlbG9wZXM7IGorKykgewoKCiAgICBpZiAoaF9mcmFtZV9kYXRhLT5kb21haW5fdmVjW2pdID09IDApIHsKICAgICAgaWYgKGNvdXBsaW5nID09IENPVVBMSU5HX0JBTCkgewogICAgICAgIGhfZnJhbWVfZGF0YS0+aUVudmVsb3BlW29mZnNldF0gPQogICAgICAgICAgKEZJWFBfU0dMKSAoKCAoaW50KUZES3JlYWRCaXRzKGhCcywgc3RhcnRfYml0c19iYWxhbmNlKSkgPDwgZW52RGF0YVRhYmxlQ29tcEZhY3Rvcik7CiAgICAgIH0KICAgICAgZWxzZSB7CiAgICAgICAgaF9mcmFtZV9kYXRhLT5pRW52ZWxvcGVbb2Zmc2V0XSA9CiAgICAgICAgICAoRklYUF9TR0wpIChpbnQpRkRLcmVhZEJpdHMgKGhCcywgc3RhcnRfYml0cyk7CiAgICAgIH0KICAgIH0KCiAgICBmb3IgKGkgPSAoMSAtIGhfZnJhbWVfZGF0YS0+ZG9tYWluX3ZlY1tqXSk7IGkgPCBub19iYW5kW2pdOyBpKyspIHsKCiAgICAgIGlmIChoX2ZyYW1lX2RhdGEtPmRvbWFpbl92ZWNbal0gPT0gMCkgewogICAgICAgIGRlbHRhID0gRGVjb2RlSHVmZm1hbkNXKGhjYl9mLCBoQnMpOwogICAgICB9CiAgICAgIGVsc2UgewogICAgICAgIGRlbHRhID0gRGVjb2RlSHVmZm1hbkNXKGhjYl90LCBoQnMpOwogICAgICB9CgogICAgICBoX2ZyYW1lX2RhdGEtPmlFbnZlbG9wZVtvZmZzZXQgKyBpXSA9IChGSVhQX1NHTCkgKGRlbHRhIDw8IGVudkRhdGFUYWJsZUNvbXBGYWN0b3IpOwogICAgfQogICAgb2Zmc2V0ICs9IG5vX2JhbmRbal07CiAgfQoKI2lmIEVOVl9FWFBfRlJBQ1QKICAvKiBDb252ZXJ0IGZyb20gaW50IHRvIHNjYWxlZCBmcmFjdCAoRU5WX0VYUF9GUkFDVCBiaXRzIGZvciB0aGUgZnJhY3Rpb25hbCBwYXJ0KSAqLwogIGZvciAoaSA9IDA7IGkgPCBoX2ZyYW1lX2RhdGEtPm5TY2FsZUZhY3RvcnM7IGkrKykgewogICAgaF9mcmFtZV9kYXRhLT5pRW52ZWxvcGVbaV0gPDw9IEVOVl9FWFBfRlJBQ1Q7CiAgfQojZW5kaWYKCiAgcmV0dXJuIDE7Cn0KCgovL3N0YXRpYyBjb25zdCBGUkFNRV9JTkZPIHZfZnJhbWVfaW5mbzFfOCA9IHsgMCwgMSwgezAsIDh9LCB7MX0sIC0xLCAxLCB7MCwgOH0gfTsKc3RhdGljIGNvbnN0IEZSQU1FX0lORk8gdl9mcmFtZV9pbmZvMl84ID0geyAwLCAyLCB7MCwgNCwgOH0sIHsxLCAxfSwgLTEsIDIsIHswLCA0LCA4fSB9OwpzdGF0aWMgY29uc3QgRlJBTUVfSU5GTyB2X2ZyYW1lX2luZm80XzggPSB7IDAsIDQsIHswLCAyLCA0LCA2LCA4fSwgezEsIDEsIDEsIDF9LCAtMSwgMiwgezAsIDQsIDh9IH07CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiEKICBcYnJpZWYgICAgR2VuZXJhdGVzIGZyYW1lIGluZm8gZm9yIEZJWEZJWG9ubHkgZnJhbWUgY2xhc3MgdXNlZCBmb3IgbG93IGRlbGF5IHZlcnNpb24KCiAgXHJldHVybiAgIG5vdGhpbmcKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBzdGF0aWMgdm9pZCBnZW5lcmF0ZUZpeEZpeE9ubHkgKCBGUkFNRV9JTkZPICpoU2JyRnJhbWVJbmZvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRyYW5Qb3NJbnRlcm5hbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1iZXJUaW1lU2xvdHMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCnsKICAgIGludCBuRW52LCBpLCB0cmFuSWR4OwogICAgY29uc3QgaW50ICpwVGFibGU7CgogICAgc3dpdGNoIChudW1iZXJUaW1lU2xvdHMpIHsKICAgICAgICBjYXNlIDg6CiAgICAgICAgICAgIHBUYWJsZSA9IEZES19zYnJEZWNvZGVyX2VudmVsb3BlVGFibGVfOFt0cmFuUG9zSW50ZXJuYWxdOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDE1OgogICAgICAgICAgICBwVGFibGUgPSBGREtfc2JyRGVjb2Rlcl9lbnZlbG9wZVRhYmxlXzE1W3RyYW5Qb3NJbnRlcm5hbF07CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMTY6CiAgICAgICAgICAgIHBUYWJsZSA9IEZES19zYnJEZWNvZGVyX2VudmVsb3BlVGFibGVfMTZbdHJhblBvc0ludGVybmFsXTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgRkRLX0FTU0VSVCgwKTsKICAgIH0KCiAgICAvKiBsb29rIG51bWJlciBvZiBlbnZlbG9wZXMgaW4gdGFibGUgKi8KICAgIG5FbnYgPSBwVGFibGVbMF07CiAgICAvKiBsb29rIHVwIGVudmVsb3BlIGRpc3RyaWJ1dGlvbiBpbiB0YWJsZSAqLwogICAgZm9yIChpPTE7IGk8bkVudjsgaSsrKQogICAgICAgIGhTYnJGcmFtZUluZm8tPmJvcmRlcnNbaV0gPSBwVGFibGVbaSsyXTsKICAgIC8qIG9wZW4gYW5kIGNsb3NlIGZyYW1lIGJvcmRlciAqLwogICAgaFNickZyYW1lSW5mby0+Ym9yZGVyc1swXSAgICA9IDA7CiAgICBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzW25FbnZdID0gbnVtYmVyVGltZVNsb3RzOwogICAgaFNickZyYW1lSW5mby0+bkVudmVsb3BlcyA9IG5FbnY7CgogICAvKiB0cmFuc2llbnQgaWR4ICovCiAgICB0cmFuSWR4ID0gaFNickZyYW1lSW5mby0+dHJhbkVudiA9IHBUYWJsZVsxXTsKCiAgICAvKiBhZGQgbm9pc2UgZmxvb3JzICovCiAgICBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzTm9pc2VbMF0gPSAwOwogICAgaFNickZyYW1lSW5mby0+Ym9yZGVyc05vaXNlWzFdID0gaFNickZyYW1lSW5mby0+Ym9yZGVyc1t0cmFuSWR4P3RyYW5JZHg6MV07CiAgICBoU2JyRnJhbWVJbmZvLT5ib3JkZXJzTm9pc2VbMl0gPSBudW1iZXJUaW1lU2xvdHM7CiAgICAvKiBuRW52IGlzIGFsd2F5cyA+IDEsIHNvIG5Ob2lzZUVudmVsb3BlcyBpcyBhbHdheXMgMiAoSUVDIDE0NDk2LTMgNC42LjE5LjMuMikgKi8KICAgIGhTYnJGcmFtZUluZm8tPm5Ob2lzZUVudmVsb3BlcyA9IDI7Cn0KCi8qIQogIFxicmllZiAgRXh0cmFjdHMgTG93RGVsYXlTQlIgY29udHJvbCBkYXRhIGZyb20gdGhlIGJpdHN0cmVhbS4KCiAgXHJldHVybiB6ZXJvIGZvciBiaXRzdHJlYW0gZXJyb3IsIG9uZSBmb3IgY29ycmVjdC4KKi8Kc3RhdGljIGludApleHRyYWN0TG93RGVsYXlHcmlkIChIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0QnVmLCAgICAgICAgICAvKiE8IGJpdGJ1ZmZlciBoYW5kbGUgKi8KICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9IRUFERVJfREFUQSBoSGVhZGVyRGF0YSwKICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9GUkFNRV9EQVRBIGhfZnJhbWVfZGF0YSwgLyohPCBjb250YWlucyB0aGUgRlJBTUVfSU5GTyBzdHJ1Y3QgdG8gYmUgZmlsbGVkICovCiAgICAgICAgICAgICAgICAgICAgIGludCB0aW1lU2xvdHMKICAgICAgICAgICAgICAgICAgICApCnsKICBGUkFNRV9JTkZPICogcEZyYW1lSW5mbyA9ICZoX2ZyYW1lX2RhdGEtPmZyYW1lSW5mbzsKICBJTlQgbnVtYmVyVGltZVNsb3RzID0gaEhlYWRlckRhdGEtPm51bWJlclRpbWVTbG90czsKICBJTlQgdGVtcCA9IDAsIGs7CgogICAgICAvKiBGSVhGSVhvbmx5IGZyYW1pbmcgY2FzZSAqLwogICAgICBoX2ZyYW1lX2RhdGEtPmZyYW1lSW5mby5mcmFtZUNsYXNzID0gMDsKCiAgICAgIC8qIGdldCB0aGUgdHJhbnNpZW50IHBvc2l0aW9uIGZyb20gdGhlIGJpdHN0cmVhbSAqLwogICAgICBzd2l0Y2ggKHRpbWVTbG90cyl7CiAgICAgICAgY2FzZSA4OgogICAgICAgICAgLyogM2JpdCB0cmFuc2llbnQgcG9zaXRpb24gKHRlbXA9ezA7Li47N30pICovCiAgICAgICAgICB0ZW1wID0gRkRLcmVhZEJpdHMoIGhCaXRCdWYsIDMpOwogICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgMTY6CiAgICAgICAgY2FzZSAxNToKICAgICAgICAgIC8qIDRiaXQgdHJhbnNpZW50IHBvc2l0aW9uICh0ZW1wPXswOy4uOzE1fSkgKi8KICAgICAgICAgIHRlbXAgPSBGREtyZWFkQml0cyggaEJpdEJ1ZiwgNCk7CiAgICAgICAgICBicmVhazsKCiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgIHJldHVybiAwOwogICAgICB9CgogICAgICAvKiBjYWxjdWxhdGUgYm9yZGVycyBhY2NvcmRpbmcgdG8gdGhlIHRyYW5zaWVudCBwb3NpdGlvbiAqLwogICAgICBnZW5lcmF0ZUZpeEZpeE9ubHkgKCBwRnJhbWVJbmZvLAogICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wLAogICAgICAgICAgICAgICAgICAgICAgICAgICBudW1iZXJUaW1lU2xvdHMKICAgICAgICAgICAgICAgICAgICAgICAgICk7CgogICAgICAvKiBkZWNvZGUgZnJlcSByZXM6ICovCiAgICAgIGZvciAoayA9IDA7IGsgPCBwRnJhbWVJbmZvLT5uRW52ZWxvcGVzOyBrKyspIHsKICAgICAgICAgIHBGcmFtZUluZm8tPmZyZXFSZXNba10gPSAoVUNIQVIpIEZES3JlYWRCaXRzIChoQml0QnVmLCAxKTsgLyogZiA9IEYgWzEgYml0c10gKi8gICAgICAgICAgCiAgICAgIH0KCgogIHJldHVybiAxOwp9CgovKiEKICBcYnJpZWYgICBFeHRyYWN0IHRoZSBmcmFtZSBpbmZvcm1hdGlvbiAoc3RydWN0dXJlIEZSQU1FX0lORk8pIGZyb20gdGhlIGJpdHN0cmVhbQogIFxyZXR1cm4gIFplcm8gZm9yIGJpdHN0cmVhbSBlcnJvciwgb25lIGZvciBjb3JyZWN0LgoqLwppbnQKZXh0cmFjdEZyYW1lSW5mbyAoIEhBTkRMRV9GREtfQklUU1RSRUFNICAgaEJzLCAgICAgICAgICAvKiE8IGJpdGJ1ZmZlciBoYW5kbGUgKi8KICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgaEhlYWRlckRhdGEsICAvKiE8IFN0YXRpYyBjb250cm9sIGRhdGEgKi8KICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfRlJBTUVfREFUQSAgaF9mcmFtZV9kYXRhLCAvKiE8IHBvaW50ZXIgdG8gbWVtb3J5IHdoZXJlIHRoZSBmcmFtZS1pbmZvIHdpbGwgYmUgc3RvcmVkICovCiAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UICAgICAgICAgICAgIG5yT2ZDaGFubmVscywKICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJTlQgICAgICAgICAgICAgZmxhZ3MKICAgICAgICAgICAgICAgICApCnsKICBGUkFNRV9JTkZPICogcEZyYW1lSW5mbyA9ICZoX2ZyYW1lX2RhdGEtPmZyYW1lSW5mbzsKICBpbnQgbnVtYmVyVGltZVNsb3RzID0gaEhlYWRlckRhdGEtPm51bWJlclRpbWVTbG90czsKICBpbnQgcG9pbnRlcl9iaXRzID0gMCwgbkVudiA9IDAsIGIgPSAwLCBib3JkZXIsIGksIG4gPSAwLAogICAgaywgcCwgYUwsIGFSLCBuTCwgblIsCiAgICB0ZW1wID0gMCwgc3RhdGljRnJlcVJlczsKICBVQ0hBUiBmcmFtZUNsYXNzOwoKICBpZiAoZmxhZ3MgJiBTQlJERUNfRUxEX0dSSUQpIHsKICAgICAgLyogQ09ERUNfQUFDTEQgKExEK1NCUikgb25seSB1c2VzIHRoZSBub3JtYWwgMCBHcmlkIGZvciBub24tdHJhbnNpZW50IEZyYW1lcyBhbmQgdGhlIExvd0RlbGF5R3JpZCBmb3IgdHJhbnNpZW50IEZyYW1lcyAqLwogICAgICBmcmFtZUNsYXNzID0gRkRLcmVhZEJpdHMgKGhCcywgMSk7IC8qIGZyYW1lQ2xhc3MgPSBbMSBiaXRdICovCiAgICAgIGlmICggZnJhbWVDbGFzcyA9PSAxICkgewogICAgICAgIC8qIGlmIGZyYW1lQ2xhc3MgPT0gMSwgZXh0cmFjdCBMb3dEZWxheVNickdyaWQsIG90aGVyd2lzZSBleHRyYWN0IG5vcm1hbCBTQlItR3JpZCBmb3IgRklYSUZYICovCiAgICAgICAgLyogZXh0cmFjdCB0aGUgQUFDTEQtU2JyLUdyaWQgKi8KICAgICAgICBwRnJhbWVJbmZvLT5mcmFtZUNsYXNzID0gZnJhbWVDbGFzczsKICAgICAgICBleHRyYWN0TG93RGVsYXlHcmlkIChoQnMsIGhIZWFkZXJEYXRhLCBoX2ZyYW1lX2RhdGEsIG51bWJlclRpbWVTbG90cyk7CiAgICAgICAgcmV0dXJuIDE7CiAgICAgIH0KICB9IGVsc2UKICB7CiAgICBmcmFtZUNsYXNzID0gRkRLcmVhZEJpdHMgKGhCcywgMik7IC8qIGZyYW1lQ2xhc3MgPSBDIFsyIGJpdHNdICovCiAgfQoKCiAgc3dpdGNoIChmcmFtZUNsYXNzKSB7CiAgY2FzZSAwOgogICAgdGVtcCA9IEZES3JlYWRCaXRzIChoQnMsIDIpOyAgICAgLyogRSBbMiBiaXRzIF0gKi8KICAgIG5FbnYgPSAoaW50KSAoMSA8PCB0ZW1wKTsgICAgLyogRSAtPiBlICovCgogICAgaWYgKChmbGFncyAmIFNCUkRFQ19FTERfR1JJRCkgJiYgKG5FbnYgPT0gMSkpCiAgICAgIGhfZnJhbWVfZGF0YS0+YW1wUmVzb2x1dGlvbkN1cnJlbnRGcmFtZSA9IEZES3JlYWRCaXRzKCBoQnMsIDEpOyAvKiBuZXcgRUxEIFN5bnRheCAwNy0xMS0wOSAqLwoKICAgIHN0YXRpY0ZyZXFSZXMgPSBGREtyZWFkQml0cyAoaEJzLCAxKTsKCiAgICB7CiAgICAgIGlmIChuRW52ID4gTUFYX0VOVkVMT1BFU19IRUFBQykKICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICBiID0gbkVudiArIDE7CiAgICBzd2l0Y2ggKG5FbnYpIHsKICAgIGNhc2UgMToKICAgICAgc3dpdGNoIChudW1iZXJUaW1lU2xvdHMpIHsKICAgICAgICBjYXNlIDE1OgogICAgICAgICAgRkRLbWVtY3B5IChwRnJhbWVJbmZvLCAmRkRLX3NickRlY29kZXJfc2JyX2ZyYW1lX2luZm8xXzE1LCBzaXplb2YoRlJBTUVfSU5GTykpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAxNjoKICAgICAgICAgIEZES21lbWNweSAocEZyYW1lSW5mbywgJkZES19zYnJEZWNvZGVyX3Nicl9mcmFtZV9pbmZvMV8xNiwgc2l6ZW9mKEZSQU1FX0lORk8pKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICBGREtfQVNTRVJUKDApOwogICAgICB9CiAgICAgIGJyZWFrOwogICAgY2FzZSAyOgogICAgICBzd2l0Y2ggKG51bWJlclRpbWVTbG90cykgewogICAgICAgIGNhc2UgMTU6CiAgICAgICAgICBGREttZW1jcHkgKHBGcmFtZUluZm8sICZGREtfc2JyRGVjb2Rlcl9zYnJfZnJhbWVfaW5mbzJfMTUsIHNpemVvZihGUkFNRV9JTkZPKSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDE2OgogICAgICAgICAgRkRLbWVtY3B5IChwRnJhbWVJbmZvLCAmRkRLX3NickRlY29kZXJfc2JyX2ZyYW1lX2luZm8yXzE2LCBzaXplb2YoRlJBTUVfSU5GTykpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgIEZES19BU1NFUlQoMCk7CiAgICAgIH0KICAgICAgYnJlYWs7CiAgICBjYXNlIDQ6CiAgICAgIHN3aXRjaCAobnVtYmVyVGltZVNsb3RzKSB7CiAgICAgICAgY2FzZSAxNToKICAgICAgICAgIEZES21lbWNweSAocEZyYW1lSW5mbywgJkZES19zYnJEZWNvZGVyX3Nicl9mcmFtZV9pbmZvNF8xNSwgc2l6ZW9mKEZSQU1FX0lORk8pKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMTY6CiAgICAgICAgICBGREttZW1jcHkgKHBGcmFtZUluZm8sICZGREtfc2JyRGVjb2Rlcl9zYnJfZnJhbWVfaW5mbzRfMTYsIHNpemVvZihGUkFNRV9JTkZPKSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgRkRLX0FTU0VSVCgwKTsKICAgICAgfQogICAgICBicmVhazsKICAgIGNhc2UgODoKI2lmIChNQVhfRU5WRUxPUEVTID49IDgpCiAgICAgIHN3aXRjaCAobnVtYmVyVGltZVNsb3RzKSB7CiAgICAgICAgY2FzZSAxNToKICAgICAgICAgIEZES21lbWNweSAocEZyYW1lSW5mbywgJkZES19zYnJEZWNvZGVyX3Nicl9mcmFtZV9pbmZvOF8xNSwgc2l6ZW9mKEZSQU1FX0lORk8pKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMTY6CiAgICAgICAgICBGREttZW1jcHkgKHBGcmFtZUluZm8sICZGREtfc2JyRGVjb2Rlcl9zYnJfZnJhbWVfaW5mbzhfMTYsIHNpemVvZihGUkFNRV9JTkZPKSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgRkRLX0FTU0VSVCgwKTsKICAgICAgfQogICAgICBicmVhazsKI2Vsc2UKICAgICAgcmV0dXJuIDA7CiNlbmRpZgogICAgfQogICAgLyogQXBwbHkgY29ycmVjdCBmcmVxUmVzIChIaWdoIGlzIGRlZmF1bHQpICovCiAgICBpZiAoIXN0YXRpY0ZyZXFSZXMpIHsKICAgICAgZm9yIChpID0gMDsgaSA8IG5FbnYgOyBpKyspCiAgICAgICAgcEZyYW1lSW5mby0+ZnJlcVJlc1tpXSA9IDA7CiAgICB9CgogICAgYnJlYWs7CiAgY2FzZSAxOgogIGNhc2UgMjoKICAgIHRlbXAgPSBGREtyZWFkQml0cyAoaEJzLCAyKTsgIC8qIEEgWzIgYml0c10gKi8KCiAgICBuICAgID0gRkRLcmVhZEJpdHMgKGhCcywgMik7ICAvKiBuID0gTiBbMiBiaXRzXSAqLwoKICAgIG5FbnYgPSBuICsgMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICMgZW52ZWxvcGVzICovCiAgICBiID0gbkVudiArIDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAjIGJvcmRlcnMgICAqLwoKICAgIGJyZWFrOwogIH0KCiAgc3dpdGNoIChmcmFtZUNsYXNzKSB7CiAgY2FzZSAxOgogICAgLyogRGVjb2RlIGJvcmRlcnM6ICovCiAgICBwRnJhbWVJbmZvLT5ib3JkZXJzWzBdID0gMDsgICAgICAgICAgICAgICAvKiBmaXJzdCBib3JkZXIgICAgICAgICAgKi8KICAgIGJvcmRlciA9IHRlbXAgKyBudW1iZXJUaW1lU2xvdHM7ICAgICAgICAgIC8qIEEgLT4gYVIgICAgICAgICAgICAgICAqLwogICAgaSA9IGItMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZnJhbWUgaW5mbyBpbmRleCBmb3IgbGFzdCBib3JkZXIgKi8KICAgIHBGcmFtZUluZm8tPmJvcmRlcnNbaV0gPSBib3JkZXI7ICAgICAgICAgIC8qIGxhc3QgYm9yZGVyICAgICAgICAgICAgICAgICAgICAgICovCgogICAgZm9yIChrID0gMDsgayA8IG47IGsrKykgewogICAgICB0ZW1wID0gRkRLcmVhZEJpdHMgKGhCcywgMik7LyogUiBbMiBiaXRzXSAqLwogICAgICBib3JkZXIgLT0gKDIgKiB0ZW1wICsgMik7ICAgICAgICAgICAgICAgLyogUiAtPiByICAgICAgICAgICAgICAgICovCiAgICAgIHBGcmFtZUluZm8tPmJvcmRlcnNbLS1pXSA9IGJvcmRlcjsKICAgIH0KCgogICAgLyogRGVjb2RlIHBvaW50ZXI6ICovCiAgICBwb2ludGVyX2JpdHMgPSBERlJBQ1RfQklUUyAtIDEgLSBDb3VudExlYWRpbmdCaXRzKChGSVhQX0RCTCkobisxKSk7CiAgICBwID0gRkRLcmVhZEJpdHMgKGhCcywgcG9pbnRlcl9iaXRzKTsgICAgIC8qIHAgPSBQIFtwb2ludGVyX2JpdHMgYml0c10gKi8KCiAgICBpZiAocCA+IG4rMSkKICAgICAgcmV0dXJuIDA7CgogICAgcEZyYW1lSW5mby0+dHJhbkVudiA9IHAgPyBuICsgMiAtIHAgOiAtMTsKCgogICAgLyogRGVjb2RlIGZyZXEgcmVzOiAqLwogICAgZm9yIChrID0gbjsgayA+PSAwOyBrLS0pIHsKICAgICAgcEZyYW1lSW5mby0+ZnJlcVJlc1trXSA9IEZES3JlYWRCaXRzIChoQnMsIDEpOyAvKiBmID0gRiBbMSBiaXRzXSAqLwogICAgfQoKCiAgICAvKiBDYWxjdWxhdGUgbm9pc2UgZmxvb3IgbWlkZGxlIGJvcmRlcjogKi8KICAgIGlmIChwID09IDAgfHwgcCA9PSAxKQogICAgICBwRnJhbWVJbmZvLT5ib3JkZXJzTm9pc2VbMV0gPSBwRnJhbWVJbmZvLT5ib3JkZXJzW25dOwogICAgZWxzZQogICAgICBwRnJhbWVJbmZvLT5ib3JkZXJzTm9pc2VbMV0gPSBwRnJhbWVJbmZvLT5ib3JkZXJzW3BGcmFtZUluZm8tPnRyYW5FbnZdOwoKICAgIGJyZWFrOwoKICBjYXNlIDI6CiAgICAvKiBEZWNvZGUgYm9yZGVyczogKi8KICAgIGJvcmRlciA9IHRlbXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEEgLT4gYUwgKi8KICAgIHBGcmFtZUluZm8tPmJvcmRlcnNbMF0gPSBib3JkZXI7ICAgICAgICAgIC8qIGZpcnN0IGJvcmRlciAqLwoKICAgIGZvciAoayA9IDE7IGsgPD0gbjsgaysrKSB7CiAgICAgIHRlbXAgPSBGREtyZWFkQml0cyAoaEJzLCAyKTsvKiBSIFsyIGJpdHNdICovCiAgICAgIGJvcmRlciArPSAoMiAqIHRlbXAgKyAyKTsgICAgICAgICAgICAgICAvKiBSIC0+IHIgICAgICAgICAgICAgICAgKi8KICAgICAgcEZyYW1lSW5mby0+Ym9yZGVyc1trXSA9IGJvcmRlcjsKICAgIH0KICAgIHBGcmFtZUluZm8tPmJvcmRlcnNba10gPSBudW1iZXJUaW1lU2xvdHM7IC8qIGxhc3QgYm9yZGVyICovCgoKICAgIC8qIERlY29kZSBwb2ludGVyOiAqLwogICAgcG9pbnRlcl9iaXRzID0gREZSQUNUX0JJVFMgLSAxIC0gQ291bnRMZWFkaW5nQml0cygoRklYUF9EQkwpKG4rMSkpOwogICAgcCA9IEZES3JlYWRCaXRzIChoQnMsIHBvaW50ZXJfYml0cyk7ICAgICAvKiBwID0gUCBbcG9pbnRlcl9iaXRzIGJpdHNdICovCiAgICBpZiAocCA+IG4rMSkKICAgICAgcmV0dXJuIDA7CgogICAgaWYgKHAgPT0gMCB8fCBwID09IDEpCiAgICAgIHBGcmFtZUluZm8tPnRyYW5FbnYgPSAtMTsKICAgIGVsc2UKICAgICAgcEZyYW1lSW5mby0+dHJhbkVudiA9IHAgLSAxOwoKCgogICAgLyogRGVjb2RlIGZyZXEgcmVzOiAqLwogICAgZm9yIChrID0gMDsgayA8PSBuOyBrKyspIHsKICAgICAgcEZyYW1lSW5mby0+ZnJlcVJlc1trXSA9IEZES3JlYWRCaXRzKGhCcywgMSk7IC8qIGYgPSBGIFsxIGJpdHNdICovCiAgICB9CgoKCiAgICAvKiBDYWxjdWxhdGUgbm9pc2UgZmxvb3IgbWlkZGxlIGJvcmRlcjogKi8KICAgIHN3aXRjaCAocCkgewogICAgY2FzZSAwOgogICAgICBwRnJhbWVJbmZvLT5ib3JkZXJzTm9pc2VbMV0gPSBwRnJhbWVJbmZvLT5ib3JkZXJzWzFdOwogICAgICBicmVhazsKICAgIGNhc2UgMToKICAgICAgcEZyYW1lSW5mby0+Ym9yZGVyc05vaXNlWzFdID0gcEZyYW1lSW5mby0+Ym9yZGVyc1tuXTsKICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICBwRnJhbWVJbmZvLT5ib3JkZXJzTm9pc2VbMV0gPSBwRnJhbWVJbmZvLT5ib3JkZXJzW3BGcmFtZUluZm8tPnRyYW5FbnZdOwogICAgICBicmVhazsKICAgIH0KCiAgICBicmVhazsKCiAgY2FzZSAzOgogICAgLyogdl9jdHJsU2lnbmFsID0gW2ZyYW1lQ2xhc3MsYUwsYVIsbkwsblIsdl9yTCx2X3JSLHAsdl9mTFJdOyAqLwoKICAgIGFMID0gRkRLcmVhZEJpdHMgKGhCcywgMik7ICAgICAgIC8qIEFMIFsyIGJpdHNdLCBBTCAtPiBhTCAqLwoKICAgIGFSID0gRkRLcmVhZEJpdHMgKGhCcywgMikgKyBudW1iZXJUaW1lU2xvdHM7ICAgICAvKiBBUiBbMiBiaXRzXSwgQVIgLT4gYVIgKi8KCiAgICBuTCA9IEZES3JlYWRCaXRzIChoQnMsIDIpOyAgICAgICAvKiBuTCA9IE5MIFsyIGJpdHNdICovCgogICAgblIgPSBGREtyZWFkQml0cyAoaEJzLCAyKTsgICAgICAgLyogblIgPSBOUiBbMiBiaXRzXSAqLwoKCgogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgIENhbGN1bGF0ZSBoZWxwIHZhcmlhYmxlcwogICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgogICAgLyogZ2VuZXJhbDogKi8KICAgIG5FbnYgPSBuTCArIG5SICsgMTsgICAgICAgICAgICAvKiAjIGVudmVsb3BlcyAqLwogICAgaWYgKG5FbnYgPiBNQVhfRU5WRUxPUEVTKQogICAgICByZXR1cm4gMDsKICAgIGIgPSBuRW52ICsgMTsgICAgICAgICAgICAgICAgICAvKiAjIGJvcmRlcnMgICAqLwoKCgogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgIERlY29kZSBlbnZlbG9wZXMKICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKCiAgICAvKiBMLWJvcmRlcnM6ICAgKi8KICAgIGJvcmRlciAgICAgICAgICAgID0gYUw7ICAgICAgICAgICAgICAgICAgIC8qIGZpcnN0IGJvcmRlciAqLwogICAgcEZyYW1lSW5mby0+Ym9yZGVyc1swXSA9IGJvcmRlcjsKCiAgICBmb3IgKGsgPSAxOyBrIDw9IG5MOyBrKyspIHsKICAgICAgdGVtcCA9IEZES3JlYWRCaXRzIChoQnMsIDIpOy8qIFIgWzIgYml0c10gKi8KICAgICAgYm9yZGVyICs9ICgyICogdGVtcCArIDIpOyAgICAgICAgICAgICAgIC8qIFIgLT4gciAgICAgICAgICAgICAgICAqLwogICAgICBwRnJhbWVJbmZvLT5ib3JkZXJzW2tdID0gYm9yZGVyOwogICAgfQoKCiAgICAvKiBSLWJvcmRlcnM6ICAqLwogICAgYm9yZGVyID0gYVI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGFzdCBib3JkZXIgKi8KICAgIGkgICAgICA9IG5FbnY7CgogICAgcEZyYW1lSW5mby0+Ym9yZGVyc1tpXSA9IGJvcmRlcjsKCiAgICBmb3IgKGsgPSAwOyBrIDwgblI7IGsrKykgewogICAgICB0ZW1wID0gRkRLcmVhZEJpdHMgKGhCcywgMik7LyogUiBbMiBiaXRzXSAqLwogICAgICBib3JkZXIgLT0gKDIgKiB0ZW1wICsgMik7ICAgICAgICAgICAgICAgLyogUiAtPiByICAgICAgICAgICAgICAgICovCiAgICAgIHBGcmFtZUluZm8tPmJvcmRlcnNbLS1pXSA9IGJvcmRlcjsKICAgIH0KCgogICAgLyogZGVjb2RlIHBvaW50ZXI6ICovCiAgICBwb2ludGVyX2JpdHMgPSBERlJBQ1RfQklUUyAtIDEgLSBDb3VudExlYWRpbmdCaXRzKChGSVhQX0RCTCkobkwrblIrMSkpOwogICAgcCA9IEZES3JlYWRCaXRzIChoQnMsIHBvaW50ZXJfYml0cyk7ICAgICAvKiBwID0gUCBbcG9pbnRlcl9iaXRzIGJpdHNdICovCgogICAgaWYgKHAgPiBuTCtuUisxKQogICAgICByZXR1cm4gMDsKCiAgICBwRnJhbWVJbmZvLT50cmFuRW52ID0gcCA/IGIgLSBwIDogLTE7CgoKCiAgICAvKiBkZWNvZGUgZnJlcSByZXM6ICovCiAgICBmb3IgKGsgPSAwOyBrIDwgbkVudjsgaysrKSB7CiAgICAgIHBGcmFtZUluZm8tPmZyZXFSZXNba10gPSBGREtyZWFkQml0cyhoQnMsIDEpOyAvKiBmID0gRiBbMSBiaXRzXSAqLwogICAgfQoKCgogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgIERlY29kZSBub2lzZSBmbG9vcnMKICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgcEZyYW1lSW5mby0+Ym9yZGVyc05vaXNlWzBdID0gYUw7CgogICAgaWYgKG5FbnYgPT0gMSkgewogICAgICAvKiAxIG5vaXNlIGZsb29yIGVudmVsb3BlOiAqLwogICAgICBwRnJhbWVJbmZvLT5ib3JkZXJzTm9pc2VbMV0gPSBhUjsKICAgIH0KICAgIGVsc2UgewogICAgICAvKiAyIG5vaXNlIGZsb29yIGVudmVsb3BlcyAqLwogICAgICBpZiAocCA9PSAwIHx8IHAgPT0gMSkKICAgICAgICBwRnJhbWVJbmZvLT5ib3JkZXJzTm9pc2VbMV0gPSBwRnJhbWVJbmZvLT5ib3JkZXJzW25FbnYgLSAxXTsKICAgICAgZWxzZQogICAgICAgIHBGcmFtZUluZm8tPmJvcmRlcnNOb2lzZVsxXSA9IHBGcmFtZUluZm8tPmJvcmRlcnNbcEZyYW1lSW5mby0+dHJhbkVudl07CiAgICAgIHBGcmFtZUluZm8tPmJvcmRlcnNOb2lzZVsyXSA9IGFSOwogICAgfQogICAgYnJlYWs7CiAgfQoKCiAgLyoKICAgIFN0b3JlIG51bWJlciBvZiBlbnZlbG9wZXMsIG5vaXNlIGZsb29yIGVudmVsb3BlcyBhbmQgZnJhbWUgY2xhc3MKICAqLwogIHBGcmFtZUluZm8tPm5FbnZlbG9wZXMgPSBuRW52OwoKICBpZiAobkVudiA9PSAxKQogICAgcEZyYW1lSW5mby0+bk5vaXNlRW52ZWxvcGVzID0gMTsKICBlbHNlCiAgICBwRnJhbWVJbmZvLT5uTm9pc2VFbnZlbG9wZXMgPSAyOwoKICBwRnJhbWVJbmZvLT5mcmFtZUNsYXNzID0gZnJhbWVDbGFzczsKCiAgaWYgKHBGcmFtZUluZm8tPmZyYW1lQ2xhc3MgPT0gMiB8fCBwRnJhbWVJbmZvLT5mcmFtZUNsYXNzID09IDEpIHsKICAgIC8qIGNhbGN1bGF0ZSBub2lzZSBmbG9vciBmaXJzdCBhbmQgbGFzdCBib3JkZXJzOiAqLwogICAgcEZyYW1lSW5mby0+Ym9yZGVyc05vaXNlWzBdID0gcEZyYW1lSW5mby0+Ym9yZGVyc1swXTsKICAgIHBGcmFtZUluZm8tPmJvcmRlcnNOb2lzZVtwRnJhbWVJbmZvLT5uTm9pc2VFbnZlbG9wZXNdID0gcEZyYW1lSW5mby0+Ym9yZGVyc1tuRW52XTsKICB9CgoKICByZXR1cm4gMTsKfQoKCi8qIQogIFxicmllZiAgIENoZWNrIGlmIHRoZSBmcmFtZUluZm8gdmVjdG9yIGhhcyByZWFzb25hYmxlIHZhbHVlcy4KICBccmV0dXJuICBaZXJvIGZvciBlcnJvciwgb25lIGZvciBjb3JyZWN0CiovCnN0YXRpYyBpbnQKY2hlY2tGcmFtZUluZm8gKEZSQU1FX0lORk8gKiBwRnJhbWVJbmZvLCAvKiE8IHBvaW50ZXIgdG8gZnJhbWVJbmZvICovCiAgICAgICAgICAgICAgICBpbnQgbnVtYmVyT2ZUaW1lU2xvdHMsICAgLyohPCBRTUYgdGltZSBzbG90cyBwZXIgZnJhbWUgKi8KICAgICAgICAgICAgICAgIGludCBvdmVybGFwLCAgICAgICAgICAgICAvKiE8IEFtb3VudCBvZiBvdmVybGFwIFFNRiB0aW1lIHNsb3RzICovCiAgICAgICAgICAgICAgICBpbnQgdGltZVN0ZXApICAgICAgICAgICAgLyohPCBRTUYgc2xvdHMgdG8gU0JSIHNsb3RzIHN0ZXAgZmFjdG9yICovCnsKICBpbnQgbWF4UG9zLGksajsKICBpbnQgc3RhcnRQb3M7CiAgaW50IHN0b3BQb3M7CiAgaW50IHRyYW5FbnY7CiAgaW50IHN0YXJ0UG9zTm9pc2U7CiAgaW50IHN0b3BQb3NOb2lzZTsKICBpbnQgbkVudmVsb3BlcyA9IHBGcmFtZUluZm8tPm5FbnZlbG9wZXM7CiAgaW50IG5Ob2lzZUVudmVsb3BlcyA9IHBGcmFtZUluZm8tPm5Ob2lzZUVudmVsb3BlczsKCiAgaWYobkVudmVsb3BlcyA8IDEgfHwgbkVudmVsb3BlcyA+IE1BWF9FTlZFTE9QRVMpCiAgICByZXR1cm4gMDsKCiAgaWYobk5vaXNlRW52ZWxvcGVzID4gTUFYX05PSVNFX0VOVkVMT1BFUykKICAgIHJldHVybiAwOwoKICBzdGFydFBvcyAgICAgICAgPSBwRnJhbWVJbmZvLT5ib3JkZXJzWzBdOwogIHN0b3BQb3MgICAgICAgICA9IHBGcmFtZUluZm8tPmJvcmRlcnNbbkVudmVsb3Blc107CiAgdHJhbkVudiAgICAgICAgID0gcEZyYW1lSW5mby0+dHJhbkVudjsKICBzdGFydFBvc05vaXNlICAgPSBwRnJhbWVJbmZvLT5ib3JkZXJzTm9pc2VbMF07CiAgc3RvcFBvc05vaXNlICAgID0gcEZyYW1lSW5mby0+Ym9yZGVyc05vaXNlW25Ob2lzZUVudmVsb3Blc107CgogIGlmIChvdmVybGFwIDwgMCB8fCBvdmVybGFwID4gKDYpKSB7CiAgICByZXR1cm4gMDsKICB9CiAgaWYgKHRpbWVTdGVwIDwgMSB8fCB0aW1lU3RlcCA+IDIpIHsKICAgIHJldHVybiAwOwogIH0KICBtYXhQb3MgPSBudW1iZXJPZlRpbWVTbG90cyArIChvdmVybGFwL3RpbWVTdGVwKTsKCiAgLyogQ2hlY2sgdGhhdCB0aGUgc3RhcnQgYW5kIHN0b3AgcG9zaXRpb25zIG9mIHRoZSBmcmFtZSBhcmUgcmVhc29uYWJsZSB2YWx1ZXMuICovCiAgaWYoIChzdGFydFBvcyA8IDApIHx8IChzdGFydFBvcyA+PSBzdG9wUG9zKSApCiAgICByZXR1cm4gMDsKICBpZiggc3RhcnRQb3MgPiBtYXhQb3MtbnVtYmVyT2ZUaW1lU2xvdHMgKSAvKiBGaXJzdCBlbnYuIG11c3Qgc3RhcnQgaW4gb3IgZGlyZWN0bHkgYWZ0ZXIgdGhlIG92ZXJsYXAgYnVmZmVyICovCiAgICByZXR1cm4gMDsKICBpZiggc3RvcFBvcyA8IG51bWJlck9mVGltZVNsb3RzICkgLyogT25lIGNvbXBsZXRlIGZyYW1lIG11c3QgYmUgcmVhZHkgZm9yIG91dHB1dCBhZnRlciBwcm9jZXNzaW5nICovCiAgICByZXR1cm4gMDsKICBpZihzdG9wUG9zID4gbWF4UG9zKQogICAgcmV0dXJuIDA7CgogIC8qIENoZWNrIHRoYXQgdGhlICBzdGFydCBib3JkZXIgZm9yIGV2ZXJ5IGVudmVsb3BlIGlzIHN0cmljdGx5IGxhdGVyIGluIHRpbWUgKi8KICBmb3IoaT0wO2k8bkVudmVsb3BlcztpKyspIHsKICAgIGlmKHBGcmFtZUluZm8tPmJvcmRlcnNbaV0gPj0gcEZyYW1lSW5mby0+Ym9yZGVyc1tpKzFdKQogICAgICByZXR1cm4gMDsKICB9CgogIC8qIENoZWNrIHRoYXQgdGhlIGVudmVsb3BlIHRvIGJlIHNob3J0ZW5lZCBpcyBhY3R1YWxseSBhbW9uZyB0aGUgZW52ZWxvcGVzICovCiAgaWYodHJhbkVudj5uRW52ZWxvcGVzKQogICAgcmV0dXJuIDA7CgoKICAvKiBDaGVjayB0aGUgbm9pc2UgYm9yZGVycyAqLwogIGlmKG5FbnZlbG9wZXM9PTEgJiYgbk5vaXNlRW52ZWxvcGVzPjEpCiAgICByZXR1cm4gMDsKCiAgaWYoc3RhcnRQb3MgIT0gc3RhcnRQb3NOb2lzZSB8fCBzdG9wUG9zICE9IHN0b3BQb3NOb2lzZSkKICAgIHJldHVybiAwOwoKCiAgLyogQ2hlY2sgdGhhdCB0aGUgIHN0YXJ0IGJvcmRlciBmb3IgZXZlcnkgbm9pc2UtZW52ZWxvcGUgaXMgc3RyaWN0bHkgbGF0ZXIgaW4gdGltZSovCiAgZm9yKGk9MDsgaTxuTm9pc2VFbnZlbG9wZXM7IGkrKykgewogICAgaWYocEZyYW1lSW5mby0+Ym9yZGVyc05vaXNlW2ldID49IHBGcmFtZUluZm8tPmJvcmRlcnNOb2lzZVtpKzFdKQogICAgICByZXR1cm4gMDsKICB9CgogIC8qIENoZWNrIHRoYXQgZXZlcnkgbm9pc2UgYm9yZGVyIGlzIHRoZSBzYW1lIGFzIGFuIGVudmVsb3BlIGJvcmRlciovCiAgZm9yKGk9MDsgaTxuTm9pc2VFbnZlbG9wZXM7IGkrKykgewogICAgc3RhcnRQb3NOb2lzZSA9IHBGcmFtZUluZm8tPmJvcmRlcnNOb2lzZVtpXTsKCiAgICBmb3Ioaj0wOyBqPG5FbnZlbG9wZXM7IGorKykgewogICAgICBpZihwRnJhbWVJbmZvLT5ib3JkZXJzW2pdID09IHN0YXJ0UG9zTm9pc2UpCiAgICAgICAgYnJlYWs7CiAgICB9CiAgICBpZihqPT1uRW52ZWxvcGVzKQogICAgICByZXR1cm4gMDsKICB9CgogIHJldHVybiAxOwp9Cg==