Ci8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAoKqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAxLiAgICBJTlRST0RVQ1RJT04KVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwp0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCgpBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQppbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydApvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KClBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwppbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCnRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCnRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwpzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCgpDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAphcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCgoyLiAgICBDT1BZUklHSFQgTElDRU5TRQoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CnBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKCllvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCnlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCgpZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCllvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgoKVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dApwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCgpZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCnNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgoKWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCiJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCgozLiAgICBOTyBQQVRFTlQgTElDRU5TRQoKTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCkFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCnJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KCllvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZApieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCgo0LiAgICBESVNDTEFJTUVSCgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwpvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgpDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCmluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCm9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCmFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgoKNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgoKRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCkF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCkFtIFdvbGZzbWFudGVsIDMzCjkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Cgp3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCmFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAoqCiAqICAgZmlsZW5hbWU6IGxkZmlsdGJhbmsuYwogKiAgIHByb2plY3QgOiBNUEVHLTQgQXVkaW8gRGVjb2RlcgogKiAgIGNvbnRlbnRzL2Rlc2NyaXB0aW9uOiBsb3cgZGVsYXkgZmlsdGVyYmFuawogKgpcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKI2luY2x1ZGUgImxkZmlsdGJhbmsuaCIKCgojaW5jbHVkZSAiYWFjX3JvbS5oIgojaW5jbHVkZSAiZGN0LmgiCiNpbmNsdWRlICJGREtfdG9vbHNfcm9tLmgiCiNpbmNsdWRlICJtZGN0LmgiCgojZGVmaW5lIExERkJfSEVBRFJPT00gMgoKc3RhdGljIHZvaWQgbXVsdEUyX0RpbnZGX2ZkayhJTlRfUENNICpvdXRwdXQsIEZJWFBfREJMKiB4LCBjb25zdCBGSVhQX1dUQiogZmIsIEZJWFBfREJMKiB6LCBjb25zdCBpbnQgTiwgY29uc3QgaW50ICBzdHJpZGUpCnsKICBpbnQgaSwgc2NhbGU7CgogIC8qICBzY2FsZSBmb3IgRklYUF9EQkwgLT4gSU5UX1BDTSBjb252ZXJzaW9uLiAqLwogIHNjYWxlID0gKERGUkFDVF9CSVRTIC0gU0FNUExFX0JJVFMpIC0gTERGQl9IRUFEUk9PTTsKCiAgZm9yKGk9MDtpPE4vNDtpKyspCiAgewogICAgRklYUF9EQkwgejAsIHoyLCB0bXA7CgogICAgejIgPSB4W04vMitpXTsKICAgIHowID0gejIgKyAoIGZNdWx0RGl2Mih6W04vMitpXSwgZmJbMipOICsgaV0pID4+ICgtV1RTMi0xKSApOwoKICAgIHpbTi8yK2ldID0geFtOLzItMS1pXSArICggZk11bHREaXYyKHpbTiArIGldLCBmYlsyKk4gKyBOLzIgKyBpXSkgPj4gKC1XVFMyLTEpICk7CgogICAgdG1wID0gKCBmTXVsdERpdjIoeltOLzIraV0sIGZiW04rTi8yLTEtaV0pICsgZk11bHREaXYyKHpbaV0sIGZiW04rTi8yK2ldKSApIDsKCiNpZiAoU0FNUExFX0JJVFMgPD0gMTYpCiAgICBGREtfQVNTRVJUKCAoLVdUUzEtMSArIHNjYWxlKSA+PSAwKTsKICAgIG91dHB1dFsoTiozLzQtMS1pKSpzdHJpZGVdID0gKElOVF9QQ00pU0FUVVJBVEVfUklHSFRfU0hJRlQodG1wLCAtV1RTMS0xICsgc2NhbGUsIFNBTVBMRV9CSVRTKTsKI2Vsc2UKICAgIEZES19BU1NFUlQoIChXVFMxKzEgLSBzY2FsZSkgPj0gMCk7CiAgICBvdXRwdXRbKE4qMy80LTEtaSkqc3RyaWRlXSA9IChJTlRfUENNKVNBVFVSQVRFX0xFRlRfU0hJRlQodG1wLCBXVFMxKzEgLSBzY2FsZSwgU0FNUExFX0JJVFMpOwojZW5kaWYKCiAgICB6W2ldID0gejA7CiAgICB6W04gKyBpXSA9IHoyOwogIH0KCiAgZm9yKGk9Ti80O2k8Ti8yO2krKykKICB7CiAgICBGSVhQX0RCTCB6MCwgejIsIHRtcDAsIHRtcDE7CgogICAgejIgPSB4W04vMitpXTsKICAgIHowID0gejIgKyAoIGZNdWx0RGl2Mih6W04vMitpXSwgZmJbMipOICsgaV0pID4+ICgtV1RTMi0xKSApOwoKICAgIHpbTi8yK2ldID0geFtOLzItMS1pXSArICggZk11bHREaXYyKHpbTiArIGldLCBmYlsyKk4gKyBOLzIgKyBpXSkgPj4gKC1XVFMyLTEpICk7CgogICAgdG1wMCA9ICggZk11bHREaXYyKHpbTi8yK2ldLCBmYltOLzItMS1pXSkgICArIGZNdWx0RGl2Mih6W2ldLCBmYltOLzIraV0pICAgKSA7CiAgICB0bXAxID0gKCBmTXVsdERpdjIoeltOLzIraV0sIGZiW04rTi8yLTEtaV0pICsgZk11bHREaXYyKHpbaV0sIGZiW04rTi8yK2ldKSApIDsKCiNpZiAoU0FNUExFX0JJVFMgPD0gMTYpCiAgICBGREtfQVNTRVJUKCAoLVdUUzAtMSArIHNjYWxlKSA+PSAwKTsKICAgIG91dHB1dFsoaS1OLzQpKnN0cmlkZV0gICAgID0gKElOVF9QQ00pU0FUVVJBVEVfUklHSFRfU0hJRlQodG1wMCwgLVdUUzAtMSArIHNjYWxlLCBTQU1QTEVfQklUUyk7CiAgICBvdXRwdXRbKE4qMy80LTEtaSkqc3RyaWRlXSA9IChJTlRfUENNKVNBVFVSQVRFX1JJR0hUX1NISUZUKHRtcDEsIC1XVFMxLTEgKyBzY2FsZSwgU0FNUExFX0JJVFMpOwojZWxzZQogICAgRkRLX0FTU0VSVCggKFdUUzArMSAtIHNjYWxlKSA+PSAwKTsKICAgIG91dHB1dFsoaS1OLzQpKnN0cmlkZV0gICAgID0gKElOVF9QQ00pU0FUVVJBVEVfTEVGVF9TSElGVCh0bXAwLCBXVFMwKzEgLSBzY2FsZSwgU0FNUExFX0JJVFMpOwogICAgb3V0cHV0WyhOKjMvNC0xLWkpKnN0cmlkZV0gPSAoSU5UX1BDTSlTQVRVUkFURV9MRUZUX1NISUZUKHRtcDEsIFdUUzErMSAtIHNjYWxlLCBTQU1QTEVfQklUUyk7CiNlbmRpZgogICAgeltpXSA9IHowOwogICAgeltOICsgaV0gPSB6MjsKICB9CgogIC8qIEV4Y2hhbmdlIHF1YXJ0ZXIgcGFydHMgb2YgeCB0byBicmluZyB0aGVtIGluIHRoZSAicmlnaHQiIG9yZGVyICovCiAgZm9yKGk9MDtpPE4vNDtpKyspCiAgewogICAgRklYUF9EQkwgdG1wMCA9IGZNdWx0RGl2Mih6W2ldLCBmYltOLzIraV0pOwoKI2lmIChTQU1QTEVfQklUUyA8PSAxNikKICAgIEZES19BU1NFUlQoICgtV1RTMC0xICsgc2NhbGUpID49IDApOwogICAgb3V0cHV0WyhOKjMvNCArIGkpKnN0cmlkZV0gPSAoSU5UX1BDTSlTQVRVUkFURV9SSUdIVF9TSElGVCh0bXAwLCAtV1RTMC0xICsgc2NhbGUsIFNBTVBMRV9CSVRTKTsKI2Vsc2UKICAgIEZES19BU1NFUlQoIChXVFMwKzEgLSBzY2FsZSkgPj0gMCk7CiAgICBvdXRwdXRbKE4qMy80ICsgaSkqc3RyaWRlXSA9IChJTlRfUENNKVNBVFVSQVRFX0xFRlRfU0hJRlQodG1wMCwgV1RTMCsxIC0gc2NhbGUsIFNBTVBMRV9CSVRTKTsKI2VuZGlmCiAgfQp9CgppbnQgSW52TWRjdFRyYW5zZm9ybUxvd0RlbGF5X2ZkayAoRklYUF9EQkwgKm1kY3REYXRhLCBjb25zdCBpbnQgbWRjdERhdGFfZSwgSU5UX1BDTSAqb3V0cHV0LCBGSVhQX0RCTCAqZnNfYnVmZmVyLCBjb25zdCBpbnQgc3RyaWRlLCBjb25zdCBpbnQgTikgewoKICBjb25zdCBGSVhQX1dUQiAqY29lZjsKICBGSVhQX0RCTCBnYWluID0gKEZJWFBfREJMKTA7CiAgaW50IHNjYWxlID0gbWRjdERhdGFfZSArIE1EQ1RfT1VUX0hFQURST09NIC0gTERGQl9IRUFEUk9PTTsgLyogVGhlIExERkJfSEVBRFJPT00gaXMgY29tcGVuc2F0ZWQgaW5zaWRlIG11bHRFMl9EaW52Rl9mZGsoKSBiZWxvdyAqLwoKICAvKiBTZWxlY3QgTEQgd2luZG93IHNsb3BlICovCiAgaWYgKE4gPT0gNTEyKQogICAgY29lZiA9IChGSVhQX1dUQiopTG93RGVsYXlTeW50aGVzaXM1MTI7CiAgZWxzZQogICAgY29lZiA9IChGSVhQX1dUQiopTG93RGVsYXlTeW50aGVzaXM0ODA7CgogIC8qCiAgICAgQXBwbHkgZXhwb25lbnQgYW5kIDEvTiBmYWN0b3IuCiAgICAgTm90ZTogInNjYWxlIiBpcyBvZmYgYnkgb25lIGJlY2F1c2UgZm9yIExEX01EQ1QgdGhlIHdpbmRvdyBsZW5ndGggaXMgdHdpY2UKICAgICB0aGUgd2luZG93IGxlbmd0aCBvZiBhIHJlZ3VsYXIgTURDVC4gVGhpcyBpcyBjb3JyZWN0ZWQgaW5zaWRlIG11bHRFMl9EaW52Rl9mZGsoKS4KICAgICBSZWZlciB0byBJU08vSUVDIDE0NDk2LTM6MjAwOSBwYWdlIDI3NywgY2hhcHRlciA0LjYuMjAuMiAiTG93IERlbGF5IFdpbmRvdyIuCiAgICovCiAgaW1kY3RfZ2FpbigmZ2FpbiwgJnNjYWxlLCBOKTsKCiAgZGN0X0lWKG1kY3REYXRhLCBOLCAmc2NhbGUpOwoKICBpZiAoZ2FpbiAhPSAoRklYUF9EQkwpMCkgewogICAgc2NhbGVWYWx1ZXNXaXRoRmFjdG9yKG1kY3REYXRhLCBnYWluLCBOLCBzY2FsZSk7CiAgfSBlbHNlIHsKICAgIHNjYWxlVmFsdWVzKG1kY3REYXRhLCBOLCBzY2FsZSk7CiAgfQoKICAvKiBTaW5jZSBhbGwgZXhwb25lbnQgYW5kIGZhY3RvcnMgaGF2ZSBiZWVuIGFwcGxpZWQsIGN1cnJlbnQgZXhwb25lbnQgaXMgemVyby4gKi8KICBtdWx0RTJfRGludkZfZmRrKG91dHB1dCwgbWRjdERhdGEsIGNvZWYsIGZzX2J1ZmZlciwgTiwgc3RyaWRlKTsKCiAgcmV0dXJuICgxKTsKfQoKCgoK