Ci8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAoKqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAxLiAgICBJTlRST0RVQ1RJT04KVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwp0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCgpBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQppbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydApvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KClBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwppbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCnRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCnRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwpzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCgpDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAphcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCgoyLiAgICBDT1BZUklHSFQgTElDRU5TRQoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CnBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKCllvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCnlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCgpZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCllvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgoKVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dApwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCgpZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCnNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgoKWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCiJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCgozLiAgICBOTyBQQVRFTlQgTElDRU5TRQoKTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCkFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCnJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KCllvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZApieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCgo0LiAgICBESVNDTEFJTUVSCgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwpvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgpDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCmluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCm9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCmFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgoKNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgoKRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCkF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCkFtIFdvbGZzbWFudGVsIDMzCjkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Cgp3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCmFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKiEKICBcZmlsZQogIFxicmllZiAgTG93IFBvd2VyIFByb2ZpbGUgVHJhbnNwb3NlciwgIAogIFRoaXMgbW9kdWxlIHByb3ZpZGVzIHRoZSB0cmFuc3Bvc2VyLiBUaGUgbWFpbiBlbnRyeSBwb2ludCBpcyBscHBUcmFuc3Bvc2VyKCkuIFRoZSBmdW5jdGlvbiBnZW5lcmF0ZXMKICBoaWdoIGZyZXF1ZW5jeSBjb250ZW50IGJ5IGNvcHlpbmcgZGF0YSBmcm9tIHRoZSBsb3cgYmFuZCAocHJvdmlkZWQgYnkgY29yZSBjb2RlYykgaW50byB0aGUgaGlnaCBiYW5kLgogIFRoaXMgcHJvY2VzcyBpcyBhbHNvIHJlZmVycmVkIHRvIGFzICJwYXRjaGluZyIuIFRoZSBmdW5jdGlvbiBhbHNvIGltcGxlbWVudHMgc3BlY3RyYWwgd2hpdGVuaW5nIGJ5IG1lYW5zIG9mCiAgaW52ZXJzZSBmaWx0ZXJpbmcgYmFzZWQgb24gTFBDIGNvZWZmaWNpZW50cy4KCiAgVG9nZXRoZXIgd2l0aCB0aGUgUU1GIGZpbHRlcmJhbmsgdGhlIHRyYW5zcG9zZXIgY2FuIGJlIHRlc3RlZCB1c2luZyBhIHN1cHBsaWVkIHRlc3QgcHJvZ3JhbS4gU2VlIG1haW5fYXVkaW8uY3BwIGZvciBkZXRhaWxzLgogIFRoaXMgbW9kdWxlIGRvZXMgdXNlIGZyYWN0aW9uYWwgYXJpdGhtZXRpYyBhbmQgdGhlIGFjY3VyYWN5IG9mIHRoZSBjb21wdXRhdGlvbnMgaGFzIGFuIGltcGFjdCBvbiB0aGUgb3ZlcmFsbCBzb3VuZCBxdWFsaXR5LgogIFRoZSBtb2R1bGUgYWxzbyBuZWVkcyB0byB0YWtlIGludG8gYWNjb3VudCB0aGUgZGlmZmVyZW50IHNjYWxpbmcgb2Ygc3BlY3RyYWwgZGF0YS4KCiAgXHNhIGxwcFRyYW5zcG9zZXIoKSwgbWFpbl9hdWRpby5jcHAsIHNicl9zY2FsZS5oLCBccmVmIGRvY3VtZW50YXRpb25PdmVydmlldwoqLwoKI2luY2x1ZGUgImxwcF90cmFuLmgiCgojaW5jbHVkZSAic2JyX3JhbS5oIgojaW5jbHVkZSAic2JyX3JvbS5oIgoKI2luY2x1ZGUgImdlbmVyaWNTdGRzLmgiCiNpbmNsdWRlICJhdXRvY29ycjJuZC5oIgoKCgojaWYgZGVmaW5lZChfX2FybV9fKQojaW5jbHVkZSAiYXJtL2xwcF90cmFuX2FybS5jcHAiCiNlbmRpZgoKCgojZGVmaW5lIExQQ19TQ0FMRV9GQUNUT1IgIDIKCgovKiEKICoKICogXGJyaWVmIEdldCBiYW5kd2lkdGggZXhwYW5zaW9uIGZhY3RvciBmcm9tIGZpbHRlcmluZyBsZXZlbAogKgogKiBSZXR1cm5zIGEgZmlsdGVyIHBhcmFtZXRlciAoYmFuZHdpZHRoIGV4cGFuc2lvbiBmYWN0b3IpIGRlcGVuZGluZyBvbgogKiB0aGUgZGVzaXJlZCBmaWx0ZXJpbmcgbGV2ZWwgc2lnbmFsbGVkIGluIHRoZSBiaXRzdHJlYW0uCiAqIFdoZW4gc3dpdGNoaW5nIHRoZSBmaWx0ZXJpbmcgbGV2ZWwgZnJvbSBMT1cgdG8gT0ZGLCBhbiBhZGRpdGlvbmFsCiAqIGxldmVsIGlzIGJlaW5nIGluc2VydGVkIHRvIGFjaGlldmUgYSBzbW9vdGggdHJhbnNpdGlvbi4KICovCgojaWZuZGVmIEZVTkNUSU9OX21hcEludmZNb2RlCnN0YXRpYyBGSVhQX0RCTAptYXBJbnZmTW9kZSAoSU5WRl9NT0RFIG1vZGUsCiAgICAgICAgICAgICBJTlZGX01PREUgcHJldk1vZGUsCiAgICAgICAgICAgICBXSElURU5JTkdfRkFDVE9SUyB3aEZhY3RvcnMpCnsKICBzd2l0Y2ggKG1vZGUpIHsKICBjYXNlIElOVkZfTE9XX0xFVkVMOgogICAgaWYocHJldk1vZGUgPT0gSU5WRl9PRkYpCiAgICAgIHJldHVybiB3aEZhY3RvcnMudHJhbnNpdGlvbkxldmVsOwogICAgZWxzZQogICAgICByZXR1cm4gd2hGYWN0b3JzLmxvd0xldmVsOwoKICBjYXNlIElOVkZfTUlEX0xFVkVMOgogICAgcmV0dXJuIHdoRmFjdG9ycy5taWRMZXZlbDsKCiAgY2FzZSBJTlZGX0hJR0hfTEVWRUw6CiAgICByZXR1cm4gd2hGYWN0b3JzLmhpZ2hMZXZlbDsKCiAgZGVmYXVsdDoKICAgIGlmKHByZXZNb2RlID09IElOVkZfTE9XX0xFVkVMKQogICAgICByZXR1cm4gd2hGYWN0b3JzLnRyYW5zaXRpb25MZXZlbDsKICAgIGVsc2UKICAgICAgcmV0dXJuIHdoRmFjdG9ycy5vZmY7CiAgfQp9CiNlbmRpZiAvKiAjaWZuZGVmIEZVTkNUSU9OX21hcEludmZNb2RlICovCgovKiEKICoKICogXGJyaWVmIFBlcmZvcm0gaW52ZXJzZSBmaWx0ZXJpbmcgbGV2ZWwgZW1waGFzaXMKICoKICogUmV0cmlldmUgYmFuZHdpZHRoIGV4cGFuc2lvbiBmYWN0b3IgYW5kIGFwcGx5IHNtb290aGluZyBmb3IgZWFjaCBmaWx0ZXIgYmFuZAogKgogKi8KCiNpZm5kZWYgRlVOQ1RJT05faW52ZXJzZUZpbHRlcmluZ0xldmVsRW1waGFzaXMKc3RhdGljIHZvaWQKaW52ZXJzZUZpbHRlcmluZ0xldmVsRW1waGFzaXMoSEFORExFX1NCUl9MUFBfVFJBTlMgaExwcFRyYW5zLC8qITwgSGFuZGxlIG9mIGxwcCB0cmFuc3Bvc2VyICAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiBuSW52ZkJhbmRzLCAgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2YgYmFuZHMgZm9yIGludmVyc2UgZmlsdGVyaW5nICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVkZfTU9ERSAqc2JyX2ludmZfbW9kZSwgICAgICAvKiE8IEN1cnJlbnQgaW52ZXJzZSBmaWx0ZXJpbmcgbW9kZXMgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5WRl9NT0RFICpzYnJfaW52Zl9tb2RlX3ByZXYsIC8qITwgUHJldmlvdXMgaW52ZXJzZSBmaWx0ZXJpbmcgbW9kZXMgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKiBid1ZlY3RvciAgICAgICAgICAgIC8qITwgUmVzdWx0aW5nIGZpbHRlcmluZyBsZXZlbHMgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQp7CiAgZm9yKGludCBpID0gMDsgaSA8IG5JbnZmQmFuZHM7IGkrKykgewogICAgRklYUF9EQkwgYWNjdTsKICAgIEZJWFBfREJMIGJ3VG1wID0gbWFwSW52Zk1vZGUgKHNicl9pbnZmX21vZGVbaV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJfaW52Zl9tb2RlX3ByZXZbaV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoTHBwVHJhbnMtPnBTZXR0aW5ncy0+d2hGYWN0b3JzKTsKCiAgICBpZihid1RtcCA8IGhMcHBUcmFucy0+YndWZWN0b3JPbGRbaV0pIHsKICAgICAgYWNjdSA9IGZNdWx0RGl2MihGTDJGWENPTlNUX0RCTCgwLjc1ZiksYndUbXApICsKICAgICAgICAgICAgIGZNdWx0RGl2MihGTDJGWENPTlNUX0RCTCgwLjI1ZiksaExwcFRyYW5zLT5id1ZlY3Rvck9sZFtpXSk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgYWNjdSA9IGZNdWx0RGl2MihGTDJGWENPTlNUX0RCTCgwLjkwNjI1ZiksYndUbXApICsKICAgICAgICAgICAgIGZNdWx0RGl2MihGTDJGWENPTlNUX0RCTCgwLjA5Mzc1ZiksaExwcFRyYW5zLT5id1ZlY3Rvck9sZFtpXSk7CiAgICB9CgogICAgaWYgKGFjY3UgPCAgRkwyRlhDT05TVF9EQkwoMC4wMTU2MjVmKT4+MSkKICAgICAgYndWZWN0b3JbaV0gPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKICAgIGVsc2UKICAgICAgYndWZWN0b3JbaV0gPSBmaXhNaW4oYWNjdTw8MSxGTDJGWENPTlNUX0RCTCgwLjk5NjA5Mzc1ZikpOwogIH0KfQojZW5kaWYgLyogI2lmbmRlZiBGVU5DVElPTl9pbnZlcnNlRmlsdGVyaW5nTGV2ZWxFbXBoYXNpcyAqLwoKLyogUmVzdWx0aW5nIGF1dG9jb3JyZWxhdGlvbiBkZXRlcm1pbmFudCBleHBvbmVudCAqLwojZGVmaW5lIEFDREVUX0VYUCAoMiooREZSQUNUX0JJVFMrc2JyU2NhbGVGYWN0b3ItPmxiX3NjYWxlKzEwLWFjLmRldF9zY2FsZSkpCiNkZWZpbmUgQUNfRVhQICgtc2JyU2NhbGVGYWN0b3ItPmxiX3NjYWxlK0xQQ19TQ0FMRV9GQUNUT1IpCiNkZWZpbmUgQUxQSEFfRVhQICgtc2JyU2NhbGVGYWN0b3ItPmxiX3NjYWxlK0xQQ19TQ0FMRV9GQUNUT1IrMSkKLyogUmVzdWx0aW5nIHRyYW5zcG9zZWQgUU1GIHZhbHVlcyBleHBvbmVudCAxNiBiaXQgbm9ybWFsaXplZCBzYW1wbGViaXRzIGFzc3VtZWQuICovCiNkZWZpbmUgUU1GT1VUX0VYUCAoKFNBTVBMRV9CSVRTLTE1KS1zYnJTY2FsZUZhY3Rvci0+bGJfc2NhbGUpCgovKiEKICoKICogXGJyaWVmIFBlcmZvcm0gdHJhbnNwb3NpdGlvbiBieSBwYXRjaGluZyBvZiBzdWJiYW5kIHNhbXBsZXMuCiAqIFRoaXMgZnVuY3Rpb24gc2VydmVzIGFzIHRoZSBtYWluIGVudHJ5IHBvaW50IGludG8gdGhlIG1vZHVsZS4gVGhlIGZ1bmN0aW9uIGRldGVybWluZXMgdGhlIGFyZWFzIGZvciB0aGUKICogcGF0Y2hpbmcgcHJvY2VzcyAodGhlc2UgYXJlIHRoZSBzb3VyY2UgcmFuZ2UgYXMgd2VsbCBhcyB0aGUgdGFyZ2V0IHJhbmdlKSBhbmQgaW1wbGVtZW50cyBzcGVjdHJhbCB3aGl0ZW5pbmcKICogYnkgbWVhbnMgb2YgaW52ZXJzZSBmaWx0ZXJpbmcuIFRoZSBmdW5jdGlvbiBhdXRvQ29ycmVsYXRpb24ybmQoKSBpcyBhbiBhdXhpbGlhcnkgZnVuY3Rpb24gZm9yIGNhbGN1bGF0aW5nIHRoZQogKiBMUEMgY29lZmZpY2llbnRzIGZvciB0aGUgZmlsdGVyaW5nLiAgVGhlIGFjdHVhbCBjYWxjdWxhdGlvbiBvZiB0aGUgTFBDIGNvZWZmaWNpZW50cyBhbmQgdGhlIGltcGxlbWVudGF0aW9uCiAqIG9mIHRoZSBmaWx0ZXJpbmcgYXJlIGRvbmUgYXMgcGFydCBvZiBscHBUcmFuc3Bvc2VyKCkuCiAqCiAqIE5vdGUgdGhhdCB0aGUgZmlsdGVyaW5nIGlzIGRvbmUgb24gYWxsIGF2YWlsYWJsZSBRTUYgc3Vic2FtcGxlcywgd2hlcmVhcyB0aGUgcGF0Y2hpbmcgaXMgb25seSBkb25lIG9uIHRob3NlIFFNRgogKiBzdWJzYW1wbGVzIHRoYXQgd2lsbCBiZSB1c2VkIGluIHRoZSBuZXh0IFFNRiBzeW50aGVzaXMuIFRoZSBmaWx0ZXJpbmcgaXMgYWxzbyBpbXBsZW1lbnRlZCBiZWZvcmUgdGhlIHBhdGNoaW5nCiAqIGluY2x1ZGVzIGZ1cnRoZXIgZGVwZW5kZW5jaWVzIG9uIHBhcmFtZXRlcnMgZnJvbSB0aGUgU0JSIGRhdGEuCiAqCiAqLwoKdm9pZCBscHBUcmFuc3Bvc2VyIChIQU5ETEVfU0JSX0xQUF9UUkFOUyBoTHBwVHJhbnMsICAgIC8qITwgSGFuZGxlIG9mIGxwcCB0cmFuc3Bvc2VyICAqLwogICAgICAgICAgICAgICAgICAgIFFNRl9TQ0FMRV9GQUNUT1IgICpzYnJTY2FsZUZhY3RvciwgLyohPCBTY2FsaW5nIGZhY3RvcnMgKi8KICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqKnFtZkJ1ZmZlclJlYWwsICAgICAgICAgIC8qITwgUG9pbnRlciB0byBwb2ludGVyIHRvIHJlYWwgcGFydCBvZiBzdWJiYW5kIHNhbXBsZXMgKHNvdXJjZSkgKi8KCiAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKmRlZ3JlZUFsaWFzLCAgICAgICAgICAgICAvKiE8IFZlY3RvciBmb3IgcmVzdWx0cyBvZiBhbGlhc2luZyBlc3RpbWF0aW9uICovCiAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKipxbWZCdWZmZXJJbWFnLCAgICAgICAgICAvKiE8IFBvaW50ZXIgdG8gcG9pbnRlciB0byBpbWFnaW5hcnkgcGFydCBvZiBzdWJiYW5kIHNhbXBsZXMgKHNvdXJjZSkgKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgdXNlTFAsCiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHRpbWVTdGVwLCAgICAgICAgICAgICAgICAvKiE8IFRpbWUgc3RlcCBvZiBlbnZlbG9wZSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBmaXJzdFNsb3RPZmZzLCAgICAgICAgICAgLyohPCBTdGFydCBwb3NpdGlvbiBpbiB0aW1lICovCiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGxhc3RTbG90T2ZmcywgICAgICAgICAgICAvKiE8IE51bWJlciBvZiBvdmVybGFwLXNsb3RzIGludG8gbmV4dCBmcmFtZSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBuSW52ZkJhbmRzLCAgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2YgYmFuZHMgZm9yIGludmVyc2UgZmlsdGVyaW5nICovCiAgICAgICAgICAgICAgICAgICAgSU5WRl9NT0RFICpzYnJfaW52Zl9tb2RlLCAgICAgICAgICAvKiE8IEN1cnJlbnQgaW52ZXJzZSBmaWx0ZXJpbmcgbW9kZXMgKi8KICAgICAgICAgICAgICAgICAgICBJTlZGX01PREUgKnNicl9pbnZmX21vZGVfcHJldiAgICAgIC8qITwgUHJldmlvdXMgaW52ZXJzZSBmaWx0ZXJpbmcgbW9kZXMgKi8KICAgICAgICAgICAgICAgICAgICApCnsKICBJTlQgICAgYndJbmRleFtNQVhfTlVNX1BBVENIRVNdOwogIEZJWFBfREJMICBid1ZlY3RvcltNQVhfTlVNX1BBVENIRVNdOyAgICAgICAvKiE8IHBvbGUgbW92aW5nIGZhY3RvcnMgKi8KCiAgaW50ICAgIGk7CiAgaW50ICAgIGxvQmFuZCwgc3RhcnQsIHN0b3A7CiAgVFJBTlNQT1NFUl9TRVRUSU5HUyAqcFNldHRpbmdzID0gaExwcFRyYW5zLT5wU2V0dGluZ3M7CiAgUEFUQ0hfUEFSQU0gKnBhdGNoUGFyYW0gPSBwU2V0dGluZ3MtPnBhdGNoUGFyYW07CiAgaW50ICAgIHBhdGNoOwoKICBGSVhQX1NHTCAgYWxwaGFyW0xQQ19PUkRFUl0sIGEwciwgYTFyOwogIEZJWFBfU0dMICBhbHBoYWlbTFBDX09SREVSXSwgYTBpPTAsIGExaT0wOwogIEZJWFBfU0dMICBidyA9IEZMMkZYQ09OU1RfU0dMKDAuMGYpOwoKICBpbnQgICAgYXV0b0NvcnJMZW5ndGg7CgogIEZJWFBfREJMIGsxLCBrMV9iZWxvdz0wLCBrMV9iZWxvdzI9MDsKCiAgQUNPUlJfQ09FRlMgYWM7CiAgaW50ICAgIHN0YXJ0U2FtcGxlOwogIGludCAgICBzdG9wU2FtcGxlOwogIGludCAgICBzdG9wU2FtcGxlQ2xlYXI7CgogIGludCBjb21Mb3dCYW5kU2NhbGU7CiAgaW50IG92TG93QmFuZFNoaWZ0OwogIGludCBsb3dCYW5kU2hpZnQ7Ci8qICBpbnQgb3ZIaWdoQmFuZFNoaWZ0OyovCiAgaW50IHRhcmdldFN0b3BCYW5kOwoKCiAgYWxwaGFpWzBdID0gRkwyRlhDT05TVF9TR0woMC4wZik7CiAgYWxwaGFpWzFdID0gRkwyRlhDT05TVF9TR0woMC4wZik7CgoKICBzdGFydFNhbXBsZSA9IGZpcnN0U2xvdE9mZnMgKiB0aW1lU3RlcDsKICBzdG9wU2FtcGxlICA9IHBTZXR0aW5ncy0+bkNvbHMgKyBsYXN0U2xvdE9mZnMgKiB0aW1lU3RlcDsKCgogIGludmVyc2VGaWx0ZXJpbmdMZXZlbEVtcGhhc2lzKGhMcHBUcmFucywgbkludmZCYW5kcywgc2JyX2ludmZfbW9kZSwgc2JyX2ludmZfbW9kZV9wcmV2LCBid1ZlY3Rvcik7CgogIHN0b3BTYW1wbGVDbGVhciA9IHN0b3BTYW1wbGU7CgogIGF1dG9Db3JyTGVuZ3RoID0gcFNldHRpbmdzLT5uQ29scyArIHBTZXR0aW5ncy0+b3ZlcmxhcDsKCiAgLyogU2V0IHVwcGVyIHN1YmJhbmRzIHRvIHplcm86CiAgICAgVGhpcyBpcyByZXF1aXJlZCBpbiBjYXNlIHRoYXQgdGhlIHBhdGNoZXMgZG8gbm90IGNvdmVyIHRoZSBjb21wbGV0ZSBoaWdoYmFuZAogICAgIChiZWNhdXNlIHRoZSBsYXN0IHBhdGNoIHdvdWxkIGJlIHRvbyBzaG9ydCkuCiAgICAgUG9zc2libGUgb3B0aW1pemF0aW9uOiBDbGVhcmluZyBiYW5kcyB1cCB0byB1c2Igd291bGQgYmUgc3VmZmljaWVudCBoZXJlLiAqLwogIHRhcmdldFN0b3BCYW5kID0gcGF0Y2hQYXJhbVtwU2V0dGluZ3MtPm5vT2ZQYXRjaGVzLTFdLnRhcmdldFN0YXJ0QmFuZAogICAgICAgICAgICAgICAgICsgcGF0Y2hQYXJhbVtwU2V0dGluZ3MtPm5vT2ZQYXRjaGVzLTFdLm51bUJhbmRzSW5QYXRjaDsKCiAgaW50IG1lbVNpemUgPSAoKDY0KSAtIHRhcmdldFN0b3BCYW5kKSAqIHNpemVvZihGSVhQX0RCTCk7CgogIGlmICghdXNlTFApIHsKICAgIGZvciAoaSA9IHN0YXJ0U2FtcGxlOyBpIDwgc3RvcFNhbXBsZUNsZWFyOyBpKyspIHsKICAgICAgRkRLbWVtY2xlYXIoJnFtZkJ1ZmZlclJlYWxbaV1bdGFyZ2V0U3RvcEJhbmRdLCBtZW1TaXplKTsKICAgICAgRkRLbWVtY2xlYXIoJnFtZkJ1ZmZlckltYWdbaV1bdGFyZ2V0U3RvcEJhbmRdLCBtZW1TaXplKTsKICAgIH0KICB9IGVsc2UKICBmb3IgKGkgPSBzdGFydFNhbXBsZTsgaSA8IHN0b3BTYW1wbGVDbGVhcjsgaSsrKSB7CiAgICBGREttZW1jbGVhcigmcW1mQnVmZmVyUmVhbFtpXVt0YXJnZXRTdG9wQmFuZF0sIG1lbVNpemUpOwogIH0KCiAgLyogaW5pdCBid0luZGV4IGZvciBlYWNoIHBhdGNoICovCiAgRkRLbWVtY2xlYXIoYndJbmRleCwgcFNldHRpbmdzLT5ub09mUGF0Y2hlcypzaXplb2YoSU5UKSk7CgogIC8qCiAgICBDYWxjIGNvbW1vbiBsb3cgYmFuZCBzY2FsZSBmYWN0b3IKICAqLwogIGNvbUxvd0JhbmRTY2FsZSA9IGZpeE1pbihzYnJTY2FsZUZhY3Rvci0+b3ZfbGJfc2NhbGUsc2JyU2NhbGVGYWN0b3ItPmxiX3NjYWxlKTsKCiAgb3ZMb3dCYW5kU2hpZnQgPSAgc2JyU2NhbGVGYWN0b3ItPm92X2xiX3NjYWxlIC0gY29tTG93QmFuZFNjYWxlOwogIGxvd0JhbmRTaGlmdCAgID0gIHNiclNjYWxlRmFjdG9yLT5sYl9zY2FsZSAtIGNvbUxvd0JhbmRTY2FsZTsKICAvKiAgb3ZIaWdoQmFuZFNoaWZ0ID0gZmlyc3RTbG90T2ZmcyA9PSAwID8gb3ZMb3dCYW5kU2hpZnQ6MDsqLwoKICAvKiBvdXRlciBsb29wIG92ZXIgYmFuZHMgdG8gZG8gYW5hbHlzaXMgb25seSBvbmNlIGZvciBlYWNoIGJhbmQgKi8KCiAgaWYgKCF1c2VMUCkgewogICAgc3RhcnQgPSBwU2V0dGluZ3MtPmxiU3RhcnRQYXRjaGluZzsKICAgIHN0b3AgPSBwU2V0dGluZ3MtPmxiU3RvcFBhdGNoaW5nOwogIH0gZWxzZQogIHsKICAgIHN0YXJ0ID0gZml4TWF4KDEsIHBTZXR0aW5ncy0+bGJTdGFydFBhdGNoaW5nIC0gMik7CiAgICBzdG9wID0gcGF0Y2hQYXJhbVswXS50YXJnZXRTdGFydEJhbmQ7CiAgfQoKCiAgZm9yICggbG9CYW5kID0gc3RhcnQ7IGxvQmFuZCA8ICBzdG9wOyBsb0JhbmQrKyApIHsKCiAgICBGSVhQX0RCTCAgbG93QmFuZFJlYWxbKCgoMTAyNCkvKDMyKSkrKDYpKStMUENfT1JERVJdOwogICAgRklYUF9EQkwgKnBsb3dCYW5kUmVhbCA9IGxvd0JhbmRSZWFsOwogICAgRklYUF9EQkwgKipwcW1mQnVmZmVyUmVhbCA9IHFtZkJ1ZmZlclJlYWw7CiAgICBGSVhQX0RCTCAgbG93QmFuZEltYWdbKCgoMTAyNCkvKDMyKSkrKDYpKStMUENfT1JERVJdOwogICAgRklYUF9EQkwgKnBsb3dCYW5kSW1hZyA9IGxvd0JhbmRJbWFnOwogICAgRklYUF9EQkwgKipwcW1mQnVmZmVySW1hZyA9IHFtZkJ1ZmZlckltYWc7CiAgICBpbnQgcmVzZXRMUENDb2VmZnM9MDsKICAgIGludCBkeW5hbWljU2NhbGUgPSBERlJBQ1RfQklUUy0xLUxQQ19TQ0FMRV9GQUNUT1I7CiAgICBpbnQgYWNEZXRTY2FsZSA9IDA7IC8qIHNjYWxpbmcgb2YgYXV0b2NvcnJlbGF0aW9uIGRldGVybWluYW50ICovCgogICAgZm9yKGk9MDtpPExQQ19PUkRFUjtpKyspewogICAgICAqcGxvd0JhbmRSZWFsKysgPSBoTHBwVHJhbnMtPmxwY0ZpbHRlclN0YXRlc1JlYWxbaV1bbG9CYW5kXTsKICAgICAgaWYgKCF1c2VMUCkKICAgICAgICAqcGxvd0JhbmRJbWFnKysgPSBoTHBwVHJhbnMtPmxwY0ZpbHRlclN0YXRlc0ltYWdbaV1bbG9CYW5kXTsKICAgIH0KCiAgICAvKgogICAgICBUYWtlIG9sZCBzbG9wZSBsZW5ndGggcW1mIHNsb3Qgc291cmNlIHZhbHVlcyBvdXQgb2YgKG92ZXJsYXApcW1mIGJ1ZmZlcgogICAgKi8KICAgIGlmICghdXNlTFApIHsKICAgICAgZm9yKGk9MDtpPHBTZXR0aW5ncy0+bkNvbHMrcFNldHRpbmdzLT5vdmVybGFwO2krKyl7CiAgICAgICAgKnBsb3dCYW5kUmVhbCsrID0gKCpwcW1mQnVmZmVyUmVhbCsrKVtsb0JhbmRdOwogICAgICAgICpwbG93QmFuZEltYWcrKyA9ICgqcHFtZkJ1ZmZlckltYWcrKylbbG9CYW5kXTsKICAgICAgfQogICAgfSBlbHNlCiAgICB7CiAgICAgIC8qIHBTZXR0aW5ncy0+b3ZlcmxhcCBpcyBhbHdheXMgZXZlbiAqLwogICAgICBGREtfQVNTRVJUKChwU2V0dGluZ3MtPm92ZXJsYXAgJiAxKSA9PSAwKTsKCiAgICAgIGZvcihpPTA7aTwoKHBTZXR0aW5ncy0+b3ZlcmxhcCtwU2V0dGluZ3MtPm5Db2xzKT4+MSk7aSsrKSB7CiAgICAgICAgKnBsb3dCYW5kUmVhbCsrID0gKCpwcW1mQnVmZmVyUmVhbCsrKVtsb0JhbmRdOwogICAgICAgICpwbG93QmFuZFJlYWwrKyA9ICgqcHFtZkJ1ZmZlclJlYWwrKylbbG9CYW5kXTsKICAgICAgfQogICAgICBpZiAocFNldHRpbmdzLT5uQ29scyAmIDEpIHsKICAgICAgICAqcGxvd0JhbmRSZWFsKysgPSAoKnBxbWZCdWZmZXJSZWFsKyspW2xvQmFuZF07CiAgICAgIH0KICAgIH0KCiAgICAvKgogICAgICBEZXRlcm1pbmUgZHluYW1pYyBzY2FsaW5nIHZhbHVlLgogICAgICovCiAgICBkeW5hbWljU2NhbGUgPSBmaXhNaW4oZHluYW1pY1NjYWxlLCBnZXRTY2FsZWZhY3Rvcihsb3dCYW5kUmVhbCwgTFBDX09SREVSK3BTZXR0aW5ncy0+b3ZlcmxhcCkgKyBvdkxvd0JhbmRTaGlmdCk7CiAgICBkeW5hbWljU2NhbGUgPSBmaXhNaW4oZHluYW1pY1NjYWxlLCBnZXRTY2FsZWZhY3RvcigmbG93QmFuZFJlYWxbTFBDX09SREVSK3BTZXR0aW5ncy0+b3ZlcmxhcF0sIHBTZXR0aW5ncy0+bkNvbHMpICsgbG93QmFuZFNoaWZ0KTsKICAgIGlmICghdXNlTFApIHsKICAgICAgZHluYW1pY1NjYWxlID0gZml4TWluKGR5bmFtaWNTY2FsZSwgZ2V0U2NhbGVmYWN0b3IobG93QmFuZEltYWcsIExQQ19PUkRFUitwU2V0dGluZ3MtPm92ZXJsYXApICsgb3ZMb3dCYW5kU2hpZnQpOwogICAgICBkeW5hbWljU2NhbGUgPSBmaXhNaW4oZHluYW1pY1NjYWxlLCBnZXRTY2FsZWZhY3RvcigmbG93QmFuZEltYWdbTFBDX09SREVSK3BTZXR0aW5ncy0+b3ZlcmxhcF0sIHBTZXR0aW5ncy0+bkNvbHMpICsgbG93QmFuZFNoaWZ0KTsKICAgIH0KICAgIGR5bmFtaWNTY2FsZSA9IGZpeE1heCgwLCBkeW5hbWljU2NhbGUtMSk7IC8qIG9uZSBhZGRpdGlvbmFsIGJpdCBoZWFkcm9vbSB0byBwcmV2ZW50IC0xLjAgKi8KCiAgICAvKgogICAgICBTY2FsZSB0ZW1wb3JhbCBRTUYgYnVmZmVyLgogICAgICovCiAgICBzY2FsZVZhbHVlcygmbG93QmFuZFJlYWxbMF0sIExQQ19PUkRFUitwU2V0dGluZ3MtPm92ZXJsYXAsIGR5bmFtaWNTY2FsZS1vdkxvd0JhbmRTaGlmdCk7CiAgICBzY2FsZVZhbHVlcygmbG93QmFuZFJlYWxbTFBDX09SREVSK3BTZXR0aW5ncy0+b3ZlcmxhcF0sIHBTZXR0aW5ncy0+bkNvbHMsIGR5bmFtaWNTY2FsZS1sb3dCYW5kU2hpZnQpOwoKICAgIGlmICghdXNlTFApIHsKICAgICAgc2NhbGVWYWx1ZXMoJmxvd0JhbmRJbWFnWzBdLCBMUENfT1JERVIrcFNldHRpbmdzLT5vdmVybGFwLCBkeW5hbWljU2NhbGUtb3ZMb3dCYW5kU2hpZnQpOwogICAgICBzY2FsZVZhbHVlcygmbG93QmFuZEltYWdbTFBDX09SREVSK3BTZXR0aW5ncy0+b3ZlcmxhcF0sIHBTZXR0aW5ncy0+bkNvbHMsIGR5bmFtaWNTY2FsZS1sb3dCYW5kU2hpZnQpOwogICAgfQoKCiAgICAgIGlmICghdXNlTFApIHsKICAgICAgICBhY0RldFNjYWxlICs9IGF1dG9Db3JyMm5kX2NwbHgoJmFjLCBsb3dCYW5kUmVhbCtMUENfT1JERVIsIGxvd0JhbmRJbWFnK0xQQ19PUkRFUiwgYXV0b0NvcnJMZW5ndGgpOwogICAgICB9CiAgICAgIGVsc2UKICAgICAgewogICAgICAgIGFjRGV0U2NhbGUgKz0gYXV0b0NvcnIybmRfcmVhbCgmYWMsIGxvd0JhbmRSZWFsK0xQQ19PUkRFUiwgYXV0b0NvcnJMZW5ndGgpOwogICAgICB9CgogICAgICAvKiBFeGFtaW5lIGR5bmFtaWMgb2YgZGV0ZXJtaW5hbnQgaW4gYXV0b2NvcnJlbGF0aW9uLiAqLwogICAgICBhY0RldFNjYWxlICs9IDIqKGNvbUxvd0JhbmRTY2FsZSArIGR5bmFtaWNTY2FsZSk7CiAgICAgIGFjRGV0U2NhbGUgKj0gMjsgICAgICAgICAgICAgIC8qIHR3byB0aW1lcyByZWZsZWN0aW9uIGNvZWZmaWNlbnQgc2NhbGluZyAqLwogICAgICBhY0RldFNjYWxlICs9IGFjLmRldF9zY2FsZTsgICAvKiBhYyBzY2FsaW5nIG9mIGRldGVybWluYW50ICovCgogICAgICAvKiBJbiBjYXNlIG9mIGRldGVybWluYW50IDwgMTBeLTM4LCByZXNldExQQ0NvZWZmcz0xIGhhcyB0byBiZSBlbmZvcmNlZC4gKi8KICAgICAgaWYgKGFjRGV0U2NhbGU+MTI2ICkgewogICAgICAgIHJlc2V0TFBDQ29lZmZzID0gMTsKICAgICAgfQoKCiAgICBhbHBoYXJbMV0gPSBGTDJGWENPTlNUX1NHTCgwLjBmKTsKICAgIGlmICghdXNlTFApCiAgICAgIGFscGhhaVsxXSA9IEZMMkZYQ09OU1RfU0dMKDAuMGYpOwoKICAgIGlmIChhYy5kZXQgIT0gRkwyRlhDT05TVF9EQkwoMC4wZikpIHsKICAgICAgRklYUF9EQkwgdG1wLGFic1RtcCxhYnNEZXQ7CgogICAgICBhYnNEZXQgPSBmaXhwX2FicyhhYy5kZXQpOwoKICAgICAgaWYgKCF1c2VMUCkgewogICAgICAgIHRtcCA9ICggZk11bHREaXYyKGFjLnIwMXIsYWMucjEycikgPj4gKExQQ19TQ0FMRV9GQUNUT1ItMSkgKSAtCiAgICAgICAgICAgICAgKCAoZk11bHREaXYyKGFjLnIwMWksYWMucjEyaSkgKyBmTXVsdERpdjIoYWMucjAycixhYy5yMTFyKSkgPj4gKExQQ19TQ0FMRV9GQUNUT1ItMSkgKTsKICAgICAgfSBlbHNlCiAgICAgIHsKICAgICAgICB0bXAgPSAoIGZNdWx0RGl2MihhYy5yMDFyLGFjLnIxMnIpID4+IChMUENfU0NBTEVfRkFDVE9SLTEpICkgLQogICAgICAgICAgICAgICggZk11bHREaXYyKGFjLnIwMnIsYWMucjExcikgPj4gKExQQ19TQ0FMRV9GQUNUT1ItMSkgKTsKICAgICAgfQogICAgICBhYnNUbXAgPSBmaXhwX2Ficyh0bXApOwoKICAgICAgLyoKICAgICAgICBRdWljayBjaGVjazogaXMgZmlyc3QgZmlsdGVyIGNvZWZmID49IDEoNCkKICAgICAgICovCiAgICAgIHsKICAgICAgICBJTlQgc2NhbGU7CiAgICAgICAgRklYUF9EQkwgcmVzdWx0ID0gZkRpdk5vcm0oYWJzVG1wLCBhYnNEZXQsICZzY2FsZSk7CiAgICAgICAgc2NhbGUgPSBzY2FsZSthYy5kZXRfc2NhbGU7CgogICAgICAgIGlmICggKHNjYWxlID4gMCkgJiYgKHJlc3VsdCA+PSAoRklYUF9EQkwpTUFYVkFMX0RCTD4+c2NhbGUpICkgewogICAgICAgICAgcmVzZXRMUENDb2VmZnMgPSAxOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgIGFscGhhclsxXSA9IEZYX0RCTDJGWF9TR0woc2NhbGVWYWx1ZShyZXN1bHQsc2NhbGUpKTsKICAgICAgICAgIGlmKCh0bXA8RkwyRlhfREJMKDAuMGYpKSBeIChhYy5kZXQ8RkwyRlhfREJMKDAuMGYpKSkgewogICAgICAgICAgICBhbHBoYXJbMV0gPSAtYWxwaGFyWzFdOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgaWYgKCF1c2VMUCkKICAgICAgewogICAgICAgIHRtcCA9ICAoIGZNdWx0RGl2MihhYy5yMDFpLGFjLnIxMnIpID4+IChMUENfU0NBTEVfRkFDVE9SLTEpICkgKwogICAgICAgICAgICAgICAoIChmTXVsdERpdjIoYWMucjAxcixhYy5yMTJpKSAtIChGSVhQX0RCTClmTXVsdERpdjIoYWMucjAyaSxhYy5yMTFyKSkgPj4gKExQQ19TQ0FMRV9GQUNUT1ItMSkgKSA7CgogICAgICAgIGFic1RtcCA9IGZpeHBfYWJzKHRtcCk7CgogICAgICAgIC8qCiAgICAgICAgUXVpY2sgY2hlY2s6IGlzIHNlY29uZCBmaWx0ZXIgY29lZmYgPj0gMSg0KQogICAgICAgICovCiAgICAgICAgewogICAgICAgICAgSU5UIHNjYWxlOwogICAgICAgICAgRklYUF9EQkwgcmVzdWx0ID0gZkRpdk5vcm0oYWJzVG1wLCBhYnNEZXQsICZzY2FsZSk7CiAgICAgICAgICBzY2FsZSA9IHNjYWxlK2FjLmRldF9zY2FsZTsKCiAgICAgICAgICBpZiAoIChzY2FsZSA+IDApICYmIChyZXN1bHQgPj0gLypGTDJGWENPTlNUX0RCTCgxLmYpKi8gKEZJWFBfREJMKU1BWFZBTF9EQkw+PnNjYWxlKSApIHsKICAgICAgICAgICAgcmVzZXRMUENDb2VmZnMgPSAxOwogICAgICAgICAgfQogICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGFscGhhaVsxXSA9IEZYX0RCTDJGWF9TR0woc2NhbGVWYWx1ZShyZXN1bHQsc2NhbGUpKTsKICAgICAgICAgICAgaWYoKHRtcDxGTDJGWF9EQkwoMC4wZikpIF4gKGFjLmRldDxGTDJGWF9EQkwoMC4wZikpKSB7CiAgICAgICAgICAgICAgYWxwaGFpWzFdID0gLWFscGhhaVsxXTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIGFscGhhclswXSA9ICBGTDJGWENPTlNUX1NHTCgwLjBmKTsKICAgIGlmICghdXNlTFApCiAgICAgIGFscGhhaVswXSA9IEZMMkZYQ09OU1RfU0dMKDAuMGYpOwoKICAgIGlmICggYWMucjExciAhPSBGTDJGWENPTlNUX0RCTCgwLjBmKSApIHsKCiAgICAgIC8qIGFjLnIxMXIgaXMgYWx3YXlzID49MCAqLwogICAgICBGSVhQX0RCTCB0bXAsYWJzVG1wOwoKICAgICAgaWYgKCF1c2VMUCkgewogICAgICAgIHRtcCA9IChhYy5yMDFyPj4oTFBDX1NDQUxFX0ZBQ1RPUisxKSkgKwogICAgICAgICAgICAgIChmTXVsdERpdjIoYWxwaGFyWzFdLGFjLnIxMnIpICsgZk11bHREaXYyKGFscGhhaVsxXSxhYy5yMTJpKSk7CiAgICAgIH0gZWxzZQogICAgICB7CiAgICAgICAgaWYoYWMucjAxcj49RkwyRlhDT05TVF9EQkwoMC4wZikpCiAgICAgICAgICB0bXAgPSAoYWMucjAxcj4+KExQQ19TQ0FMRV9GQUNUT1IrMSkpICsgZk11bHREaXYyKGFscGhhclsxXSxhYy5yMTJyKTsKICAgICAgICBlbHNlCiAgICAgICAgICB0bXAgPSAtKCgtYWMucjAxcik+PihMUENfU0NBTEVfRkFDVE9SKzEpKSArIGZNdWx0RGl2MihhbHBoYXJbMV0sYWMucjEycik7CiAgICAgIH0KCiAgICAgIGFic1RtcCA9IGZpeHBfYWJzKHRtcCk7CgogICAgICAvKgogICAgICAgIFF1aWNrIGNoZWNrOiBpcyBmaXJzdCBmaWx0ZXIgY29lZmYgPj0gMSg0KQogICAgICAqLwoKICAgICAgaWYgKGFic1RtcCA+PSAoYWMucjExcj4+MSkpIHsKICAgICAgICByZXNldExQQ0NvZWZmcz0xOwogICAgICB9CiAgICAgIGVsc2UgewogICAgICAgIElOVCBzY2FsZTsKICAgICAgICBGSVhQX0RCTCByZXN1bHQgPSBmRGl2Tm9ybShhYnNUbXAsIGZpeHBfYWJzKGFjLnIxMXIpLCAmc2NhbGUpOwogICAgICAgIGFscGhhclswXSA9ICBGWF9EQkwyRlhfU0dMKHNjYWxlVmFsdWUocmVzdWx0LHNjYWxlKzEpKTsKCiAgICAgICAgaWYoKHRtcD5GTDJGWF9EQkwoMC4wZikpIF4gKGFjLnIxMXI8RkwyRlhfREJMKDAuMGYpKSkKICAgICAgICAgIGFscGhhclswXSA9IC1hbHBoYXJbMF07CiAgICAgIH0KCiAgICAgIGlmICghdXNlTFApCiAgICAgIHsKICAgICAgICB0bXAgPSAoYWMucjAxaT4+KExQQ19TQ0FMRV9GQUNUT1IrMSkpICsKICAgICAgICAgICAgICAoZk11bHREaXYyKGFscGhhaVsxXSxhYy5yMTJyKSAtIGZNdWx0RGl2MihhbHBoYXJbMV0sYWMucjEyaSkpOwoKICAgICAgICBhYnNUbXAgPSBmaXhwX2Ficyh0bXApOwoKICAgICAgICAvKgogICAgICAgIFF1aWNrIGNoZWNrOiBpcyBzZWNvbmQgZmlsdGVyIGNvZWZmID49IDEoNCkKICAgICAgICAqLwogICAgICAgIGlmIChhYnNUbXAgPj0gKGFjLnIxMXI+PjEpKSB7CiAgICAgICAgICByZXNldExQQ0NvZWZmcz0xOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgIElOVCBzY2FsZTsKICAgICAgICAgIEZJWFBfREJMIHJlc3VsdCA9IGZEaXZOb3JtKGFic1RtcCwgZml4cF9hYnMoYWMucjExciksICZzY2FsZSk7CiAgICAgICAgICBhbHBoYWlbMF0gPSBGWF9EQkwyRlhfU0dMKHNjYWxlVmFsdWUocmVzdWx0LHNjYWxlKzEpKTsKICAgICAgICAgIGlmKCh0bXA+RkwyRlhfREJMKDAuMGYpKSBeIChhYy5yMTFyPEZMMkZYX0RCTCgwLjBmKSkpCiAgICAgICAgICAgIGFscGhhaVswXSA9IC1hbHBoYWlbMF07CiAgICAgICAgfQogICAgICB9CiAgICB9CgoKICAgIGlmICghdXNlTFApCiAgICB7CiAgICAgIC8qIE5vdyBjaGVjayB0aGUgcXVhZHJhdGljIGNyaXRlcmlhICovCiAgICAgIGlmKCAoZk11bHREaXYyKGFscGhhclswXSxhbHBoYXJbMF0pICsgZk11bHREaXYyKGFscGhhaVswXSxhbHBoYWlbMF0pKSA+PSBGTDJGWENPTlNUX0RCTCgwLjVmKSApCiAgICAgICAgcmVzZXRMUENDb2VmZnM9MTsKICAgICAgaWYoIChmTXVsdERpdjIoYWxwaGFyWzFdLGFscGhhclsxXSkgKyBmTXVsdERpdjIoYWxwaGFpWzFdLGFscGhhaVsxXSkpID49IEZMMkZYQ09OU1RfREJMKDAuNWYpICkKICAgICAgICByZXNldExQQ0NvZWZmcz0xOwogICAgfQoKICAgIGlmKHJlc2V0TFBDQ29lZmZzKXsKICAgICAgYWxwaGFyWzBdID0gRkwyRlhDT05TVF9TR0woMC4wZik7CiAgICAgIGFscGhhclsxXSA9IEZMMkZYQ09OU1RfU0dMKDAuMGYpOwogICAgICBpZiAoIXVzZUxQKQogICAgICB7CiAgICAgICAgYWxwaGFpWzBdID0gRkwyRlhDT05TVF9TR0woMC4wZik7CiAgICAgICAgYWxwaGFpWzFdID0gRkwyRlhDT05TVF9TR0woMC4wZik7CiAgICAgIH0KICAgIH0KCiAgICBpZiAodXNlTFApCiAgICB7CgogICAgICAvKiBBbGlhc2luZyBkZXRlY3Rpb24gKi8KICAgICAgaWYoYWMucjExcj09RkwyRlhDT05TVF9EQkwoMC4wZikpIHsKICAgICAgICBrMSA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwogICAgICB9CiAgICAgIGVsc2UgewogICAgICAgIGlmICggZml4cF9hYnMoYWMucjAxcikgPj0gZml4cF9hYnMoYWMucjExcikgKSB7CiAgICAgICAgICBpZiAoIGZNdWx0RGl2MihhYy5yMDFyLGFjLnIxMXIpIDwgRkwyRlhfREJMKDAuMGYpKSB7CiAgICAgICAgICAgIGsxID0gKEZJWFBfREJMKU1BWFZBTF9EQkwgLypGTDJGWENPTlNUX1NHTCgxLjBmKSovOwogICAgICAgICAgfWVsc2UgewogICAgICAgICAgICAvKiBTaW5jZSB0aGlzIHZhbHVlIGlzIHNxdWFyZWQgbGF0ZXIsIGl0IG11c3Qgbm90IGV2ZXIgYmVjb21lIC0xLjBmLiAqLwogICAgICAgICAgICBrMSA9IChGSVhQX0RCTCkoTUlOVkFMX0RCTCsxKSAvKkZMMkZYQ09OU1RfU0dMKC0xLjBmKSovOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgIElOVCBzY2FsZTsKICAgICAgICAgIEZJWFBfREJMIHJlc3VsdCA9IGZEaXZOb3JtKGZpeHBfYWJzKGFjLnIwMXIpLCBmaXhwX2FicyhhYy5yMTFyKSwgJnNjYWxlKTsKICAgICAgICAgIGsxID0gc2NhbGVWYWx1ZShyZXN1bHQsc2NhbGUpOwoKICAgICAgICAgIGlmKCEoKGFjLnIwMXI8RkwyRlhfREJMKDAuMGYpKSBeIChhYy5yMTFyPEZMMkZYX0RCTCgwLjBmKSkpKSB7CiAgICAgICAgICAgIGsxID0gLWsxOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBpZihsb0JhbmQgPiAxKXsKICAgICAgICAvKiBDaGVjayBpZiB0aGUgZ2FpbiBzaG91bGQgYmUgbG9ja2VkICovCiAgICAgICAgRklYUF9EQkwgZGVnID0gLypGTDJGWENPTlNUX0RCTCgxLjBmKSovIChGSVhQX0RCTClNQVhWQUxfREJMIC0gZlBvdzIoazFfYmVsb3cpOwogICAgICAgIGRlZ3JlZUFsaWFzW2xvQmFuZF0gPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKICAgICAgICBpZiAoKChsb0JhbmQgJiAxKSA9PSAwKSAmJiAoazEgPCBGTDJGWENPTlNUX0RCTCgwLjBmKSkpewogICAgICAgICAgaWYgKGsxX2JlbG93IDwgRkwyRlhDT05TVF9EQkwoMC4wZikpIHsgICAgICAgICAvKiAyLUNoIEFsaWFzaW5nIERldGVjdGlvbiAqLwogICAgICAgICAgICBkZWdyZWVBbGlhc1tsb0JhbmRdID0gKEZJWFBfREJMKU1BWFZBTF9EQkwgLypGTDJGWENPTlNUX0RCTCgxLjBmKSovOwogICAgICAgICAgICBpZiAoIGsxX2JlbG93MiA+IEZMMkZYQ09OU1RfREJMKDAuMGYpICkgeyAgICAvKiAzLUNoIEFsaWFzaW5nIERldGVjdGlvbiAqLwogICAgICAgICAgICAgIGRlZ3JlZUFsaWFzW2xvQmFuZC0xXSA9IGRlZzsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgZWxzZSBpZiAoIGsxX2JlbG93MiA+IEZMMkZYQ09OU1RfREJMKDAuMGYpICkgeyAvKiAzLUNoIEFsaWFzaW5nIERldGVjdGlvbiAqLwogICAgICAgICAgICBkZWdyZWVBbGlhc1tsb0JhbmRdICAgPSBkZWc7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICgoKGxvQmFuZCAmIDEpID09IDEpICYmIChrMSA+IEZMMkZYQ09OU1RfREJMKDAuMGYpKSl7CiAgICAgICAgICBpZiAoazFfYmVsb3cgPiBGTDJGWENPTlNUX0RCTCgwLjBmKSkgeyAgICAgICAgIC8qIDItQ0ggQWxpYXNpbmcgRGV0ZWN0aW9uICovCiAgICAgICAgICAgIGRlZ3JlZUFsaWFzW2xvQmFuZF0gPSAoRklYUF9EQkwpTUFYVkFMX0RCTCAvKkZMMkZYQ09OU1RfREJMKDEuMGYpKi87CiAgICAgICAgICAgIGlmICggazFfYmVsb3cyIDwgRkwyRlhDT05TVF9EQkwoMC4wZikgKSB7ICAgIC8qIDMtQ0ggQWxpYXNpbmcgRGV0ZWN0aW9uICovCiAgICAgICAgICAgICAgZGVncmVlQWxpYXNbbG9CYW5kLTFdID0gZGVnOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBlbHNlIGlmICggazFfYmVsb3cyIDwgRkwyRlhDT05TVF9EQkwoMC4wZikgKSB7IC8qIDMtQ0ggQWxpYXNpbmcgRGV0ZWN0aW9uICovCiAgICAgICAgICAgIGRlZ3JlZUFsaWFzW2xvQmFuZF0gICA9IGRlZzsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgLyogcmVtZW1iZXIgazEgdmFsdWVzIG9mIHRoZSAyIFFNRiBjaGFubmVscyBiZWxvdyB0aGUgY3VycmVudCBjaGFubmVsICovCiAgICAgIGsxX2JlbG93MiA9IGsxX2JlbG93OwogICAgICBrMV9iZWxvdyA9IGsxOwogICAgfQoKICAgIHBhdGNoID0gMDsKCiAgICB3aGlsZSAoIHBhdGNoIDwgcFNldHRpbmdzLT5ub09mUGF0Y2hlcyApIHsgLyogaW5uZXIgbG9vcCBvdmVyIGV2ZXJ5IHBhdGNoICovCgogICAgICBpbnQgaGlCYW5kID0gbG9CYW5kICsgcGF0Y2hQYXJhbVtwYXRjaF0udGFyZ2V0QmFuZE9mZnM7CgogICAgICBpZiAoIGxvQmFuZCA8IHBhdGNoUGFyYW1bcGF0Y2hdLnNvdXJjZVN0YXJ0QmFuZAogICAgICAgICAgIHx8IGxvQmFuZCA+PSBwYXRjaFBhcmFtW3BhdGNoXS5zb3VyY2VTdG9wQmFuZAogICAgICAgICAgIC8vfHwgaGlCYW5kID49IGhMcHBUcmFucy0+cFNldHRpbmdzLT5ub0NoYW5uZWxzCiAgICAgICAgICAgKSB7CiAgICAgICAgLyogTG93YmFuZCBub3QgaW4gY3VycmVudCBwYXRjaCAtIHByb2NlZWQgKi8KICAgICAgICBwYXRjaCsrOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CgogICAgICBGREtfQVNTRVJUKCBoaUJhbmQgPCAoNjQpICk7CgogICAgICAvKiBid0luZGV4W3BhdGNoXSBpcyBhbHJlYWR5IGluaXRpYWxpemVkIHdpdGggdmFsdWUgZnJvbSBwcmV2aW91cyBiYW5kIGluc2lkZSB0aGlzIHBhdGNoICovCiAgICAgIHdoaWxlIChoaUJhbmQgPj0gcFNldHRpbmdzLT5id0JvcmRlcnNbYndJbmRleFtwYXRjaF1dKQogICAgICAgIGJ3SW5kZXhbcGF0Y2hdKys7CgoKICAgICAgLyoKICAgICAgICBGaWx0ZXIgU3RlcCAyOiBhZGQgdGhlIGxlZnQgc2xvcGUgd2l0aCB0aGUgY3VycmVudCBmaWx0ZXIgdG8gdGhlIGJ1ZmZlcgogICAgICAgICAgICAgICAgICAgICAgIHB1cmUgc291cmNlIHZhbHVlcyBhcmUgYWxyZWFkeSBpbiB0aGVyZQogICAgICAqLwogICAgICBidyA9IEZYX0RCTDJGWF9TR0woYndWZWN0b3JbYndJbmRleFtwYXRjaF1dKTsKCiAgICAgIGEwciA9IEZYX0RCTDJGWF9TR0woZk11bHQoYncsYWxwaGFyWzBdKSk7IC8qIEFwcGx5IGN1cnJlbnQgYmFuZHdpZHRoIGV4cGFuc2lvbiBmYWN0b3IgKi8KCgogICAgICBpZiAoIXVzZUxQKQogICAgICAgIGEwaSA9IEZYX0RCTDJGWF9TR0woZk11bHQoYncsYWxwaGFpWzBdKSk7CiAgICAgIGJ3ID0gIEZYX0RCTDJGWF9TR0woZlBvdzIoYncpKTsKICAgICAgYTFyID0gRlhfREJMMkZYX1NHTChmTXVsdChidyxhbHBoYXJbMV0pKTsKICAgICAgaWYgKCF1c2VMUCkKICAgICAgICBhMWkgPSBGWF9EQkwyRlhfU0dMKGZNdWx0KGJ3LGFscGhhaVsxXSkpOwoKCgogICAgICAvKgogICAgICAgIEZpbHRlciBTdGVwIDM6IGluc2VydCB0aGUgbWlkZGxlIHBhcnQgd2hpY2ggd29uJ3QgYmUgd2luZG93ZWQKICAgICAgKi8KCiAgICAgIGlmICggYncgPD0gRkwyRlhDT05TVF9TR0woMC4wZikgKSB7CiAgICAgICAgaWYgKCF1c2VMUCkgewogICAgICAgICAgaW50IGRlc2NhbGUgPSBmaXhNaW4oREZSQUNUX0JJVFMtMSwgKExQQ19TQ0FMRV9GQUNUT1IrZHluYW1pY1NjYWxlKSk7CiAgICAgICAgICBmb3IoaSA9IHN0YXJ0U2FtcGxlOyBpIDwgc3RvcFNhbXBsZTsgaSsrICkgewogICAgICAgICAgICBxbWZCdWZmZXJSZWFsW2ldW2hpQmFuZF0gPSBsb3dCYW5kUmVhbFtMUENfT1JERVIraV0+PmRlc2NhbGU7CiAgICAgICAgICAgIHFtZkJ1ZmZlckltYWdbaV1baGlCYW5kXSA9IGxvd0JhbmRJbWFnW0xQQ19PUkRFUitpXT4+ZGVzY2FsZTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UKICAgICAgICB7CiAgICAgICAgICBpbnQgZGVzY2FsZSA9IGZpeE1pbihERlJBQ1RfQklUUy0xLCAoTFBDX1NDQUxFX0ZBQ1RPUitkeW5hbWljU2NhbGUpKTsKICAgICAgICAgIGZvcihpID0gc3RhcnRTYW1wbGU7IGkgPCBzdG9wU2FtcGxlOyBpKysgKSB7CiAgICAgICAgICAgIHFtZkJ1ZmZlclJlYWxbaV1baGlCYW5kXSA9IGxvd0JhbmRSZWFsW0xQQ19PUkRFUitpXT4+ZGVzY2FsZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgZWxzZSB7ICAvKiBidyA8PSAwICovCgogICAgICAgIGlmICghdXNlTFApIHsKICAgICAgICAgIGludCBkZXNjYWxlID0gZml4TWluKERGUkFDVF9CSVRTLTEsIChMUENfU0NBTEVfRkFDVE9SK2R5bmFtaWNTY2FsZSkpOwojaWZkZWYgRlVOQ1RJT05fTFBQVFJBTlNQT1NFUl9mdW5jMQogICAgICAgICAgbHBwVHJhbnNwb3Nlcl9mdW5jMShsb3dCYW5kUmVhbCtMUENfT1JERVIrc3RhcnRTYW1wbGUsbG93QmFuZEltYWcrTFBDX09SREVSK3N0YXJ0U2FtcGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxbWZCdWZmZXJSZWFsK3N0YXJ0U2FtcGxlLHFtZkJ1ZmZlckltYWcrc3RhcnRTYW1wbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3BTYW1wbGUtc3RhcnRTYW1wbGUsIChpbnQpIGhpQmFuZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHluYW1pY1NjYWxlLGRlc2NhbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEwciwgYTBpLCBhMXIsIGExaSk7CiNlbHNlCiAgICAgICAgICBmb3IoaSA9IHN0YXJ0U2FtcGxlOyBpIDwgc3RvcFNhbXBsZTsgaSsrICkgewogICAgICAgICAgICBGSVhQX0RCTCBhY2N1MSwgYWNjdTI7CgogICAgICAgICAgICBhY2N1MSA9IChmTXVsdERpdjIoYTByLGxvd0JhbmRSZWFsW0xQQ19PUkRFUitpLTFdKSAtIGZNdWx0RGl2MihhMGksbG93QmFuZEltYWdbTFBDX09SREVSK2ktMV0pICsKICAgICAgICAgICAgICAgICAgICAgZk11bHREaXYyKGExcixsb3dCYW5kUmVhbFtMUENfT1JERVIraS0yXSkgLSBmTXVsdERpdjIoYTFpLGxvd0JhbmRJbWFnW0xQQ19PUkRFUitpLTJdKSk+PmR5bmFtaWNTY2FsZTsKICAgICAgICAgICAgYWNjdTIgPSAoZk11bHREaXYyKGEwaSxsb3dCYW5kUmVhbFtMUENfT1JERVIraS0xXSkgKyBmTXVsdERpdjIoYTByLGxvd0JhbmRJbWFnW0xQQ19PUkRFUitpLTFdKSArCiAgICAgICAgICAgICAgICAgICAgIGZNdWx0RGl2MihhMWksbG93QmFuZFJlYWxbTFBDX09SREVSK2ktMl0pICsgZk11bHREaXYyKGExcixsb3dCYW5kSW1hZ1tMUENfT1JERVIraS0yXSkpPj5keW5hbWljU2NhbGU7CgogICAgICAgICAgICBxbWZCdWZmZXJSZWFsW2ldW2hpQmFuZF0gPSAobG93QmFuZFJlYWxbTFBDX09SREVSK2ldPj5kZXNjYWxlKSArIChhY2N1MTw8MSk7CiAgICAgICAgICAgIHFtZkJ1ZmZlckltYWdbaV1baGlCYW5kXSA9IChsb3dCYW5kSW1hZ1tMUENfT1JERVIraV0+PmRlc2NhbGUpICsgKGFjY3UyPDwxKTsKICAgICAgICAgIH0KI2VuZGlmCiAgICAgICAgfSBlbHNlCiAgICAgICAgewogICAgICAgICAgaW50IGRlc2NhbGUgPSBmaXhNaW4oREZSQUNUX0JJVFMtMSwgKExQQ19TQ0FMRV9GQUNUT1IrZHluYW1pY1NjYWxlKSk7CgogICAgICAgICAgRkRLX0FTU0VSVChkeW5hbWljU2NhbGUgPj0gMCk7CiAgICAgICAgICBmb3IoaSA9IHN0YXJ0U2FtcGxlOyBpIDwgc3RvcFNhbXBsZTsgaSsrICkgewogICAgICAgICAgICBGSVhQX0RCTCBhY2N1MTsKCiAgICAgICAgICAgIGFjY3UxID0gKGZNdWx0RGl2MihhMHIsbG93QmFuZFJlYWxbTFBDX09SREVSK2ktMV0pICsgZk11bHREaXYyKGExcixsb3dCYW5kUmVhbFtMUENfT1JERVIraS0yXSkpPj5keW5hbWljU2NhbGU7CgogICAgICAgICAgICBxbWZCdWZmZXJSZWFsW2ldW2hpQmFuZF0gPSAobG93QmFuZFJlYWxbTFBDX09SREVSK2ldPj5kZXNjYWxlKSArIChhY2N1MTw8MSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9IC8qIGJ3IDw9IDAgKi8KCiAgICAgIHBhdGNoKys7CgogICAgfSAgLyogaW5uZXIgbG9vcCBvdmVyIHBhdGNoZXMgKi8KCiAgICAgLyoKICAgICAqIHN0b3JlIHRoZSB1bm1vZGlmaWVkIGZpbHRlciBjb2VmZmljaWVudHMgaWYgdGhlcmUgaXMKICAgICAqIGFuIG92ZXJsYXBwaW5nIGVudmVsb3BlCiAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgoKICB9ICAvKiBvdXRlciBsb29wIG92ZXIgYmFuZHMgKGxvQmFuZCkgKi8KCiAgaWYgKHVzZUxQKQogIHsKICAgIGZvciAoIGxvQmFuZCA9IHBTZXR0aW5ncy0+bGJTdGFydFBhdGNoaW5nOyBsb0JhbmQgPCAgcFNldHRpbmdzLT5sYlN0b3BQYXRjaGluZzsgbG9CYW5kKysgKSB7CiAgICAgIHBhdGNoID0gMDsKICAgICAgd2hpbGUgKCBwYXRjaCA8IHBTZXR0aW5ncy0+bm9PZlBhdGNoZXMgKSB7CgogICAgICAgIFVDSEFSIGhpQmFuZCA9IGxvQmFuZCArIHBhdGNoUGFyYW1bcGF0Y2hdLnRhcmdldEJhbmRPZmZzOwoKICAgICAgICBpZiAoIGxvQmFuZCA8IHBhdGNoUGFyYW1bcGF0Y2hdLnNvdXJjZVN0YXJ0QmFuZAogICAgICAgICAgfHwgbG9CYW5kID49IHBhdGNoUGFyYW1bcGF0Y2hdLnNvdXJjZVN0b3BCYW5kCiAgICAgICAgICB8fCBoaUJhbmQgPj0gKDY0KSAgICAgICAgICAgICAgLyogSGlnaGJhbmQgb3V0IG9mIHJhbmdlIChiaXRlcnJvcikgKi8KICAgICAgICAgICkgewogICAgICAgICAgLyogTG93YmFuZCBub3QgaW4gY3VycmVudCBwYXRjaCBvciBoaWdoYmFuZCBvdXQgb2YgcmFuZ2UgKG1pZ2h0IGJlIGNhdXNlZCBieSBiaXRlcnJvcnMpLSBwcm9jZWVkICovCiAgICAgICAgICBwYXRjaCsrOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQoKICAgICAgICBpZihoaUJhbmQgIT0gcGF0Y2hQYXJhbVtwYXRjaF0udGFyZ2V0U3RhcnRCYW5kKQogICAgICAgICAgZGVncmVlQWxpYXNbaGlCYW5kXSA9IGRlZ3JlZUFsaWFzW2xvQmFuZF07CgogICAgICAgIHBhdGNoKys7CiAgICAgIH0KICAgIH0vKiBlbmQgIGZvciBsb29wICovCiAgfQoKIGZvciAoaSA9IDA7IGkgPCBuSW52ZkJhbmRzOyBpKysgKSB7CiAgIGhMcHBUcmFucy0+YndWZWN0b3JPbGRbaV0gPSBid1ZlY3RvcltpXTsKIH0KCiAgLyoKICAgIHNldCBoaWdoIGJhbmQgc2NhbGUgZmFjdG9yCiAgKi8KICBzYnJTY2FsZUZhY3Rvci0+aGJfc2NhbGUgPSBjb21Mb3dCYW5kU2NhbGUtKExQQ19TQ0FMRV9GQUNUT1IpOwoKfQoKLyohCiAqCiAqIFxicmllZiBJbml0aWFsaXplIG9uZSBsb3cgcG93ZXIgdHJhbnNwb3NlciBpbnN0YW5jZQogKgogKgogKi8KU0JSX0VSUk9SCmNyZWF0ZUxwcFRyYW5zcG9zZXIgKEhBTkRMRV9TQlJfTFBQX1RSQU5TIGhzLCAvKiE8IEhhbmRsZSBvZiBsb3cgcG93ZXIgdHJhbnNwb3NlciAgKi8KICAgICAgICAgICAgICAgICAgICAgVFJBTlNQT1NFUl9TRVRUSU5HUyAqcFNldHRpbmdzLCAvKiE8IFBvaW50ZXIgdG8gc2V0dGluZ3MgKi8KICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ICBoaWdoQmFuZFN0YXJ0U2IsIC8qITwgPyAqLwogICAgICAgICAgICAgICAgICAgICBVQ0hBUiAqdl9rX21hc3RlciwgICAgICAgICAvKiE8IE1hc3RlciB0YWJsZSAqLwogICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgbnVtTWFzdGVyLCAgICAgICAvKiE8IFZhbGlkIGVudHJpZXMgaW4gbWFzdGVyIHRhYmxlICovCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCB1c2IsICAgICAgICAgICAgIC8qITwgSGlnaGJhbmQgYXJlYSBzdG9wIHN1YmJhbmQgKi8KICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHRpbWVTbG90cywgICAgICAgLyohPCBOdW1iZXIgb2YgdGltZSBzbG90cyAqLwogICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgbkNvbHMsICAgICAgICAgICAvKiE8IE51bWJlciBvZiBjb2x1bXMgKGNvZGVjIHFtZiBiYW5rKSAqLwogICAgICAgICAgICAgICAgICAgICBVQ0hBUiAqbm9pc2VCYW5kVGFibGUsICAgICAvKiE8IE1hcHBpbmcgb2YgU0JSIG5vaXNlIGJhbmRzIHRvIFFNRiBiYW5kcyAqLwogICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgIG5vTm9pc2VCYW5kcywgICAvKiE8IE51bWJlciBvZiBub2lzZSBiYW5kcyAqLwogICAgICAgICAgICAgICAgICAgICBVSU5UICAgZnMsICAgICAgICAgICAgICAgICAvKiE8IFNhbXBsZSBGcmVxdWVuY3kgKi8KICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGNoYW4sICAgICAgICAgICAgLyohPCBDaGFubmVsIG51bWJlciAqLwogICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgb3ZlcmxhcAogICAgICAgICAgICAgICAgICAgICApCnsKICAvKiBGQiBpbnZlcnNlIGZpbHRlcmluZyBzZXR0aW5ncyAqLwogIGhzLT5wU2V0dGluZ3MgPSBwU2V0dGluZ3M7CgogIHBTZXR0aW5ncy0+bkNvbHMgPSBuQ29sczsKICBwU2V0dGluZ3MtPm92ZXJsYXAgPSBvdmVybGFwOwoKICBzd2l0Y2ggKHRpbWVTbG90cykgewoKICBjYXNlIDE1OgogIGNhc2UgMTY6CiAgICBicmVhazsKCiAgZGVmYXVsdDoKICAgIHJldHVybiBTQlJERUNfVU5TVVBQT1JURURfQ09ORklHOyAvKiBVbmltcGxlbWVudGVkICovCiAgfQoKICBpZiAoY2hhbj09MCkgewogICAgLyogSW5pdCBjb21tb24gZGF0YSBvbmx5IG9uY2UgKi8KICAgIGhzLT5wU2V0dGluZ3MtPm5Db2xzID0gbkNvbHM7CgogICAgcmV0dXJuIHJlc2V0THBwVHJhbnNwb3NlciAoaHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWdoQmFuZFN0YXJ0U2IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2X2tfbWFzdGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtTWFzdGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9pc2VCYW5kVGFibGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub05vaXNlQmFuZHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcyk7CiAgfQogIHJldHVybiBTQlJERUNfT0s7Cn0KCgpzdGF0aWMgaW50IGZpbmRDbG9zZXN0RW50cnkoVUNIQVIgZ29hbFNiLCBVQ0hBUiAqdl9rX21hc3RlciwgVUNIQVIgbnVtTWFzdGVyLCBVQ0hBUiBkaXJlY3Rpb24pCnsKICBpbnQgaW5kZXg7CgogIGlmKCBnb2FsU2IgPD0gdl9rX21hc3RlclswXSApCiAgICByZXR1cm4gdl9rX21hc3RlclswXTsKCiAgaWYoIGdvYWxTYiA+PSB2X2tfbWFzdGVyW251bU1hc3Rlcl0gKQogICAgcmV0dXJuIHZfa19tYXN0ZXJbbnVtTWFzdGVyXTsKCiAgaWYoZGlyZWN0aW9uKSB7CiAgICBpbmRleCA9IDA7CiAgICB3aGlsZSggdl9rX21hc3RlcltpbmRleF0gPCBnb2FsU2IgKSB7CiAgICAgIGluZGV4Kys7CiAgICB9CiAgfSBlbHNlIHsKICAgIGluZGV4ID0gbnVtTWFzdGVyOwogICAgd2hpbGUoIHZfa19tYXN0ZXJbaW5kZXhdID4gZ29hbFNiICkgewogICAgICBpbmRleC0tOwogICAgfQogIH0KCiAgcmV0dXJuIHZfa19tYXN0ZXJbaW5kZXhdOwp9CgoKLyohCiAqCiAqIFxicmllZiBSZXNldCBtZW1vcnkgZm9yIG9uZSBscHAgdHJhbnNwb3NlciBpbnN0YW5jZQogKgogKiBccmV0dXJuIFNCUkRFQ19PSyBvbiBzdWNjZXNzLCBTQlJERUNfVU5TVVBQT1JURURfQ09ORklHIG9uIGVycm9yCiAqLwpTQlJfRVJST1IKcmVzZXRMcHBUcmFuc3Bvc2VyIChIQU5ETEVfU0JSX0xQUF9UUkFOUyBoTHBwVHJhbnMsICAvKiE8IEhhbmRsZSBvZiBscHAgdHJhbnNwb3NlciAgKi8KICAgICAgICAgICAgICAgICAgICBVQ0hBUiAgaGlnaEJhbmRTdGFydFNiLCAgICAgICAgICAvKiE8IEhpZ2ggYmFuZCBhcmVhOiBzdGFydCBzdWJiYW5kICovCiAgICAgICAgICAgICAgICAgICAgVUNIQVIgKnZfa19tYXN0ZXIsICAgICAgICAgICAgICAgLyohPCBNYXN0ZXIgdGFibGUgKi8KICAgICAgICAgICAgICAgICAgICBVQ0hBUiAgbnVtTWFzdGVyLCAgICAgICAgICAgICAgICAvKiE8IFZhbGlkIGVudHJpZXMgaW4gbWFzdGVyIHRhYmxlICovCiAgICAgICAgICAgICAgICAgICAgVUNIQVIgKm5vaXNlQmFuZFRhYmxlLCAgICAgICAgICAgLyohPCBNYXBwaW5nIG9mIFNCUiBub2lzZSBiYW5kcyB0byBRTUYgYmFuZHMgKi8KICAgICAgICAgICAgICAgICAgICBVQ0hBUiAgbm9Ob2lzZUJhbmRzLCAgICAgICAgICAgICAvKiE8IE51bWJlciBvZiBub2lzZSBiYW5kcyAqLwogICAgICAgICAgICAgICAgICAgIFVDSEFSICB1c2IsICAgICAgICAgICAgICAgICAgICAgIC8qITwgSGlnaCBiYW5kIGFyZWE6IHN0b3Agc3ViYmFuZCAqLwogICAgICAgICAgICAgICAgICAgIFVJTlQgICBmcyAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgU0JSIG91dHB1dCBzYW1wbGluZyBmcmVxdWVuY3kgKi8KICAgICAgICAgICAgICAgICAgICApCnsKICBUUkFOU1BPU0VSX1NFVFRJTkdTICpwU2V0dGluZ3MgPSBoTHBwVHJhbnMtPnBTZXR0aW5nczsKICBQQVRDSF9QQVJBTSAgKnBhdGNoUGFyYW0gPSBwU2V0dGluZ3MtPnBhdGNoUGFyYW07CgogIGludCBpLCBwYXRjaDsKICBpbnQgdGFyZ2V0U3RvcEJhbmQ7CiAgaW50IHNvdXJjZVN0YXJ0QmFuZDsKICBpbnQgcGF0Y2hEaXN0YW5jZTsKICBpbnQgbnVtQmFuZHNJblBhdGNoOwoKICBpbnQgbHNiID0gdl9rX21hc3RlclswXTsgICAgICAgICAgICAgICAgIC8qIFN0YXJ0IHN1YmJhbmQgZXhwcmVzc2VkIGluICJub24tY3JpdGljYWwiIHNhbXBsaW5nIHRlcm1zKi8KICBpbnQgeG92ZXJPZmZzZXQgPSBoaWdoQmFuZFN0YXJ0U2IgLSBsc2I7IC8qIENhbGN1bGF0ZSBkaXN0YW5jZSBpbiBRTUYgYmFuZHMgYmV0d2VlbiBrMCBhbmQga3ggKi8KICBpbnQgc3RhcnRGcmVxSHo7CgogIGludCBkZXNpcmVkQm9yZGVyOwoKICB1c2IgPSBmaXhNaW4odXNiLCB2X2tfbWFzdGVyW251bU1hc3Rlcl0pOyAvKiBBdm9pZCBlbmRsZXNzIGxvb3BzIChjb21wYXJlIHdpdGggZmxvYXQgY29kZSkuICovCgogIC8qCiAgICogUGxhdXNpYmlsaXR5IGNoZWNrCiAgICovCgogIGlmICggbHNiIC0gU0hJRlRfU1RBUlRfU0IgPCA0ICkgewogICAgcmV0dXJuIFNCUkRFQ19VTlNVUFBPUlRFRF9DT05GSUc7CiAgfQoKCiAgLyoKICAgKiBJbml0aWFsaXplIHRoZSBwYXRjaGluZyBwYXJhbWV0ZXIKICAgKi8KICAvKiBJU08vSUVDIDE0NDk2LTMgKEZpZ3VyZSA0LjQ4KTogZ29hbFNiID0gcm91bmQoIDIuMDQ4ZTYgLyBmcyApICovCiAgZGVzaXJlZEJvcmRlciAgICA9ICgoKDIwNDgwMDAqMikgLyBmcykgKyAxKSA+PiAxOwoKICBkZXNpcmVkQm9yZGVyID0gZmluZENsb3Nlc3RFbnRyeShkZXNpcmVkQm9yZGVyLCB2X2tfbWFzdGVyLCBudW1NYXN0ZXIsIDEpOyAvKiBBZGFwdCByZWdpb24gdG8gbWFzdGVyLXRhYmxlICovCgogIC8qIEZpcnN0IHBhdGNoICovCiAgc291cmNlU3RhcnRCYW5kID0gU0hJRlRfU1RBUlRfU0IgKyB4b3Zlck9mZnNldDsKICB0YXJnZXRTdG9wQmFuZCA9IGxzYiArIHhvdmVyT2Zmc2V0OyAvKiB1cHBlckJhbmQgKi8KCiAgLyogRXZlbiAob2RkKSBudW1iZXJlZCBjaGFubmVsIG11c3QgYmUgcGF0Y2hlZCB0byBldmVuIChvZGQpIG51bWJlcmVkIGNoYW5uZWwgKi8KICBwYXRjaCA9IDA7CiAgd2hpbGUodGFyZ2V0U3RvcEJhbmQgPCB1c2IpIHsKCiAgICAvKiBUb28gbWFueSBwYXRjaGVzPwogICAgICAgQWxsb3cgTUFYX05VTV9QQVRDSEVTKzEgcGF0Y2hlcyBoZXJlLgogICAgICAgd2UgbmVlZCB0byBjaGVjayBsYXRlciBhZ2Fpbiwgc2luY2UgcGF0Y2ggbWlnaHQgYmUgdGhlIGhpZ2hlc3QgcGF0Y2gKICAgICAgIEFORCBjb250YWluIGxlc3MgdGhhbiAzIGJhbmRzID0+IGFjdHVhbCBudW1iZXIgb2YgcGF0Y2hlcyB3aWxsIGJlIHJlZHVjZWQgYnkgMS4KICAgICovCiAgICBpZiAocGF0Y2ggPiBNQVhfTlVNX1BBVENIRVMpIHsKICAgICAgcmV0dXJuIFNCUkRFQ19VTlNVUFBPUlRFRF9DT05GSUc7CiAgICB9CgogICAgcGF0Y2hQYXJhbVtwYXRjaF0uZ3VhcmRTdGFydEJhbmQgPSB0YXJnZXRTdG9wQmFuZDsKICAgIHBhdGNoUGFyYW1bcGF0Y2hdLnRhcmdldFN0YXJ0QmFuZCA9IHRhcmdldFN0b3BCYW5kOwoKICAgIG51bUJhbmRzSW5QYXRjaCA9IGRlc2lyZWRCb3JkZXIgLSB0YXJnZXRTdG9wQmFuZDsgICAgICAgICAgICAgICAgICAgLyogR2V0IHRoZSBkZXNpcmVkIHJhbmdlIG9mIHRoZSBwYXRjaCAqLwoKICAgIGlmICggbnVtQmFuZHNJblBhdGNoID49IGxzYiAtIHNvdXJjZVN0YXJ0QmFuZCApIHsKICAgICAgLyogRGVzaXJlZCBudW1iZXIgYmFuZHMgYXJlIG5vdCBhdmFpbGFibGUgLT4gcGF0Y2ggd2hvbGUgc291cmNlIHJhbmdlICovCiAgICAgIHBhdGNoRGlzdGFuY2UgICA9IHRhcmdldFN0b3BCYW5kIC0gc291cmNlU3RhcnRCYW5kOyAgICAgICAgLyogR2V0IHRoZSB0YXJnZXRPZmZzZXQgKi8KICAgICAgcGF0Y2hEaXN0YW5jZSAgID0gcGF0Y2hEaXN0YW5jZSAmIH4xOyAgICAgICAgICAgICAgICAgICAgICAvKiBSb3VuZGluZyBvZmYgb2RkIG51bWJlcnMgYW5kIG1ha2UgYWxsIGV2ZW4gKi8KICAgICAgbnVtQmFuZHNJblBhdGNoID0gbHNiIC0gKHRhcmdldFN0b3BCYW5kIC0gcGF0Y2hEaXN0YW5jZSk7ICAvKiBVcGRhdGUgbnVtYmVyIG9mIGJhbmRzIHRvIGJlIHBhdGNoZWQgKi8KICAgICAgbnVtQmFuZHNJblBhdGNoID0gZmluZENsb3Nlc3RFbnRyeSh0YXJnZXRTdG9wQmFuZCArIG51bUJhbmRzSW5QYXRjaCwgdl9rX21hc3RlciwgbnVtTWFzdGVyLCAwKSAtCiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFN0b3BCYW5kOyAgLyogQWRhcHQgcmVnaW9uIHRvIG1hc3Rlci10YWJsZSAqLwogICAgfQoKICAgIC8qIERlc2lyZWQgbnVtYmVyIGJhbmRzIGFyZSBhdmFpbGFibGUgLT4gZ2V0IHRoZSBtaW5pbWFsIGV2ZW4gcGF0Y2hpbmcgZGlzdGFuY2UgKi8KICAgIHBhdGNoRGlzdGFuY2UgICA9IG51bUJhbmRzSW5QYXRjaCArIHRhcmdldFN0b3BCYW5kIC0gbHNiOyAgLyogR2V0IG1pbmltYWwgZGlzdGFuY2UgKi8KICAgIHBhdGNoRGlzdGFuY2UgICA9IChwYXRjaERpc3RhbmNlICsgMSkgJiB+MTsgICAgICAgICAgICAgICAgLyogUm91bmRpbmcgdXAgb2RkIG51bWJlcnMgYW5kIG1ha2UgYWxsIGV2ZW4gKi8KCiAgICBpZiAobnVtQmFuZHNJblBhdGNoID4gMCkgewogICAgICBwYXRjaFBhcmFtW3BhdGNoXS5zb3VyY2VTdGFydEJhbmQgPSB0YXJnZXRTdG9wQmFuZCAtIHBhdGNoRGlzdGFuY2U7CiAgICAgIHBhdGNoUGFyYW1bcGF0Y2hdLnRhcmdldEJhbmRPZmZzICA9IHBhdGNoRGlzdGFuY2U7CiAgICAgIHBhdGNoUGFyYW1bcGF0Y2hdLm51bUJhbmRzSW5QYXRjaCA9IG51bUJhbmRzSW5QYXRjaDsKICAgICAgcGF0Y2hQYXJhbVtwYXRjaF0uc291cmNlU3RvcEJhbmQgID0gcGF0Y2hQYXJhbVtwYXRjaF0uc291cmNlU3RhcnRCYW5kICsgbnVtQmFuZHNJblBhdGNoOwoKICAgICAgdGFyZ2V0U3RvcEJhbmQgKz0gcGF0Y2hQYXJhbVtwYXRjaF0ubnVtQmFuZHNJblBhdGNoOwogICAgICBwYXRjaCsrOwogICAgfQoKICAgIC8qIEFsbCBwYXRjaGVzIGJ1dCBmaXJzdCAqLwogICAgc291cmNlU3RhcnRCYW5kID0gU0hJRlRfU1RBUlRfU0I7CgogICAgLyogQ2hlY2sgaWYgd2UgYXJlIGNsb3NlIHRvIGRlc2lyZWRCb3JkZXIgKi8KICAgIGlmKCBkZXNpcmVkQm9yZGVyIC0gdGFyZ2V0U3RvcEJhbmQgPCAzKSAgLyogTVBFRyBkb2MgKi8KICAgIHsKICAgICAgZGVzaXJlZEJvcmRlciA9IHVzYjsKICAgIH0KCiAgfQoKICBwYXRjaC0tOwoKICAvKiBJZiBoaWdoZXN0IHBhdGNoIGNvbnRhaW5zIGxlc3MgdGhhbiB0aHJlZSBzdWJiYW5kOiBza2lwIGl0ICovCiAgaWYgKCAocGF0Y2g+MCkgJiYgKHBhdGNoUGFyYW1bcGF0Y2hdLm51bUJhbmRzSW5QYXRjaCA8IDMpICkgewogICAgcGF0Y2gtLTsKICAgIHRhcmdldFN0b3BCYW5kID0gcGF0Y2hQYXJhbVtwYXRjaF0udGFyZ2V0U3RhcnRCYW5kICsgcGF0Y2hQYXJhbVtwYXRjaF0ubnVtQmFuZHNJblBhdGNoOwogIH0KCiAgLyogbm93IGNoZWNrIGlmIHdlIGRvbid0IGhhdmUgb25lIHRvbyBtYW55ICovCiAgaWYgKHBhdGNoID49IE1BWF9OVU1fUEFUQ0hFUykgewogICAgcmV0dXJuIFNCUkRFQ19VTlNVUFBPUlRFRF9DT05GSUc7CiAgfQoKICBwU2V0dGluZ3MtPm5vT2ZQYXRjaGVzID0gcGF0Y2ggKyAxOwoKICAvKiBDaGVjayBsb3dlc3QgYW5kIGhpZ2hlc3Qgc291cmNlIHN1YmJhbmQgKi8KICBwU2V0dGluZ3MtPmxiU3RhcnRQYXRjaGluZyA9IHRhcmdldFN0b3BCYW5kOwogIHBTZXR0aW5ncy0+bGJTdG9wUGF0Y2hpbmcgID0gMDsKICBmb3IgKCBwYXRjaCA9IDA7IHBhdGNoIDwgcFNldHRpbmdzLT5ub09mUGF0Y2hlczsgcGF0Y2grKyApIHsKICAgIHBTZXR0aW5ncy0+bGJTdGFydFBhdGNoaW5nID0gZml4TWluKCBwU2V0dGluZ3MtPmxiU3RhcnRQYXRjaGluZywgcGF0Y2hQYXJhbVtwYXRjaF0uc291cmNlU3RhcnRCYW5kICk7CiAgICBwU2V0dGluZ3MtPmxiU3RvcFBhdGNoaW5nICA9IGZpeE1heCggcFNldHRpbmdzLT5sYlN0b3BQYXRjaGluZywgcGF0Y2hQYXJhbVtwYXRjaF0uc291cmNlU3RvcEJhbmQgKTsKICB9CgogIGZvcihpID0gMCA7IGkgPCBub05vaXNlQmFuZHM7IGkrKyl7CiAgICBwU2V0dGluZ3MtPmJ3Qm9yZGVyc1tpXSA9IG5vaXNlQmFuZFRhYmxlW2krMV07CiAgfQoKICAvKgogICAqIENob29zZSB3aGl0ZW5pbmcgZmFjdG9ycwogICAqLwoKICBzdGFydEZyZXFIeiA9ICggKGxzYiArIHhvdmVyT2Zmc2V0KSpmcyApID4+IDc7ICAvKiBTaGlmdCBkb2VzIGEgZGl2aXNpb24gYnkgMiooNjQpICovCgogIGZvciggaSA9IDE7IGkgPCBOVU1fV0hGQUNUT1JfVEFCTEVfRU5UUklFUzsgaSsrICkKICB7CiAgICBpZiggc3RhcnRGcmVxSHogPCBGREtfc2JyRGVjb2Rlcl9zYnJfd2hGYWN0b3JzSW5kZXhbaV0pCiAgICAgIGJyZWFrOwogIH0KICBpLS07CgogIHBTZXR0aW5ncy0+d2hGYWN0b3JzLm9mZiA9IEZES19zYnJEZWNvZGVyX3Nicl93aEZhY3RvcnNUYWJsZVtpXVswXTsKICBwU2V0dGluZ3MtPndoRmFjdG9ycy50cmFuc2l0aW9uTGV2ZWwgPSBGREtfc2JyRGVjb2Rlcl9zYnJfd2hGYWN0b3JzVGFibGVbaV1bMV07CiAgcFNldHRpbmdzLT53aEZhY3RvcnMubG93TGV2ZWwgPSBGREtfc2JyRGVjb2Rlcl9zYnJfd2hGYWN0b3JzVGFibGVbaV1bMl07CiAgcFNldHRpbmdzLT53aEZhY3RvcnMubWlkTGV2ZWwgPSBGREtfc2JyRGVjb2Rlcl9zYnJfd2hGYWN0b3JzVGFibGVbaV1bM107CiAgcFNldHRpbmdzLT53aEZhY3RvcnMuaGlnaExldmVsID0gRkRLX3NickRlY29kZXJfc2JyX3doRmFjdG9yc1RhYmxlW2ldWzRdOwoKICByZXR1cm4gU0JSREVDX09LOwp9Cg==