Ci8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAoKqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAxLiAgICBJTlRST0RVQ1RJT04KVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwp0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCgpBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQppbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydApvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KClBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwppbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCnRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCnRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwpzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCgpDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAphcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCgoyLiAgICBDT1BZUklHSFQgTElDRU5TRQoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CnBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKCllvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCnlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCgpZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCllvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgoKVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dApwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCgpZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCnNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgoKWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCiJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCgozLiAgICBOTyBQQVRFTlQgTElDRU5TRQoKTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCkFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCnJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KCllvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZApieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCgo0LiAgICBESVNDTEFJTUVSCgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwpvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgpDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCmluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCm9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCmFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgoKNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgoKRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCkF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCkFtIFdvbGZzbWFudGVsIDMzCjkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Cgp3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCmFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogTVBFRyBBdWRpbyBFbmNvZGVyICoqKioqKioqKioqKioqKioqKioqKioqKioqCgogICBJbml0aWFsIGF1dGhvcjoKICAgY29udGVudHMvZGVzY3JpcHRpb246IENSQyBjYWxjdWxhdGlvbgoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKI2luY2x1ZGUgIkZES19jcmMuaCIKCgoKLyotLS0tLS0tLS0tLS0tLS0tIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgovKioKICogXGJyaWVmICBUaGlzIHRhYmxlIGRlZmluZXMgcHJlY2FsY3VsYXRlZCBsb29rdXAgdGFibGVzIGZvciBjcmMgcG9seW5vbSAgeF4xNiArIHheMTUgKyB4XjIgKyB4XjAuCiAqLwpzdGF0aWMgY29uc3QgVVNIT1JUIGNyY0xvb2t1cF8xNl8xNV8yXzBbMjU2XSA9CnsKICAweDAwMDAsIDB4ODAwNSwgMHg4MDBmLCAweDAwMGEsIDB4ODAxYiwgMHgwMDFlLCAweDAwMTQsIDB4ODAxMSwKICAweDgwMzMsIDB4MDAzNiwgMHgwMDNjLCAweDgwMzksIDB4MDAyOCwgMHg4MDJkLCAweDgwMjcsIDB4MDAyMiwKICAweDgwNjMsIDB4MDA2NiwgMHgwMDZjLCAweDgwNjksIDB4MDA3OCwgMHg4MDdkLCAweDgwNzcsIDB4MDA3MiwKICAweDAwNTAsIDB4ODA1NSwgMHg4MDVmLCAweDAwNWEsIDB4ODA0YiwgMHgwMDRlLCAweDAwNDQsIDB4ODA0MSwKICAweDgwYzMsIDB4MDBjNiwgMHgwMGNjLCAweDgwYzksIDB4MDBkOCwgMHg4MGRkLCAweDgwZDcsIDB4MDBkMiwKICAweDAwZjAsIDB4ODBmNSwgMHg4MGZmLCAweDAwZmEsIDB4ODBlYiwgMHgwMGVlLCAweDAwZTQsIDB4ODBlMSwKICAweDAwYTAsIDB4ODBhNSwgMHg4MGFmLCAweDAwYWEsIDB4ODBiYiwgMHgwMGJlLCAweDAwYjQsIDB4ODBiMSwKICAweDgwOTMsIDB4MDA5NiwgMHgwMDljLCAweDgwOTksIDB4MDA4OCwgMHg4MDhkLCAweDgwODcsIDB4MDA4MiwKICAweDgxODMsIDB4MDE4NiwgMHgwMThjLCAweDgxODksIDB4MDE5OCwgMHg4MTlkLCAweDgxOTcsIDB4MDE5MiwKICAweDAxYjAsIDB4ODFiNSwgMHg4MWJmLCAweDAxYmEsIDB4ODFhYiwgMHgwMWFlLCAweDAxYTQsIDB4ODFhMSwKICAweDAxZTAsIDB4ODFlNSwgMHg4MWVmLCAweDAxZWEsIDB4ODFmYiwgMHgwMWZlLCAweDAxZjQsIDB4ODFmMSwKICAweDgxZDMsIDB4MDFkNiwgMHgwMWRjLCAweDgxZDksIDB4MDFjOCwgMHg4MWNkLCAweDgxYzcsIDB4MDFjMiwKICAweDAxNDAsIDB4ODE0NSwgMHg4MTRmLCAweDAxNGEsIDB4ODE1YiwgMHgwMTVlLCAweDAxNTQsIDB4ODE1MSwKICAweDgxNzMsIDB4MDE3NiwgMHgwMTdjLCAweDgxNzksIDB4MDE2OCwgMHg4MTZkLCAweDgxNjcsIDB4MDE2MiwKICAweDgxMjMsIDB4MDEyNiwgMHgwMTJjLCAweDgxMjksIDB4MDEzOCwgMHg4MTNkLCAweDgxMzcsIDB4MDEzMiwKICAweDAxMTAsIDB4ODExNSwgMHg4MTFmLCAweDAxMWEsIDB4ODEwYiwgMHgwMTBlLCAweDAxMDQsIDB4ODEwMSwKICAweDgzMDMsIDB4MDMwNiwgMHgwMzBjLCAweDgzMDksIDB4MDMxOCwgMHg4MzFkLCAweDgzMTcsIDB4MDMxMiwKICAweDAzMzAsIDB4ODMzNSwgMHg4MzNmLCAweDAzM2EsIDB4ODMyYiwgMHgwMzJlLCAweDAzMjQsIDB4ODMyMSwKICAweDAzNjAsIDB4ODM2NSwgMHg4MzZmLCAweDAzNmEsIDB4ODM3YiwgMHgwMzdlLCAweDAzNzQsIDB4ODM3MSwKICAweDgzNTMsIDB4MDM1NiwgMHgwMzVjLCAweDgzNTksIDB4MDM0OCwgMHg4MzRkLCAweDgzNDcsIDB4MDM0MiwKICAweDAzYzAsIDB4ODNjNSwgMHg4M2NmLCAweDAzY2EsIDB4ODNkYiwgMHgwM2RlLCAweDAzZDQsIDB4ODNkMSwKICAweDgzZjMsIDB4MDNmNiwgMHgwM2ZjLCAweDgzZjksIDB4MDNlOCwgMHg4M2VkLCAweDgzZTcsIDB4MDNlMiwKICAweDgzYTMsIDB4MDNhNiwgMHgwM2FjLCAweDgzYTksIDB4MDNiOCwgMHg4M2JkLCAweDgzYjcsIDB4MDNiMiwKICAweDAzOTAsIDB4ODM5NSwgMHg4MzlmLCAweDAzOWEsIDB4ODM4YiwgMHgwMzhlLCAweDAzODQsIDB4ODM4MSwKICAweDAyODAsIDB4ODI4NSwgMHg4MjhmLCAweDAyOGEsIDB4ODI5YiwgMHgwMjllLCAweDAyOTQsIDB4ODI5MSwKICAweDgyYjMsIDB4MDJiNiwgMHgwMmJjLCAweDgyYjksIDB4MDJhOCwgMHg4MmFkLCAweDgyYTcsIDB4MDJhMiwKICAweDgyZTMsIDB4MDJlNiwgMHgwMmVjLCAweDgyZTksIDB4MDJmOCwgMHg4MmZkLCAweDgyZjcsIDB4MDJmMiwKICAweDAyZDAsIDB4ODJkNSwgMHg4MmRmLCAweDAyZGEsIDB4ODJjYiwgMHgwMmNlLCAweDAyYzQsIDB4ODJjMSwKICAweDgyNDMsIDB4MDI0NiwgMHgwMjRjLCAweDgyNDksIDB4MDI1OCwgMHg4MjVkLCAweDgyNTcsIDB4MDI1MiwKICAweDAyNzAsIDB4ODI3NSwgMHg4MjdmLCAweDAyN2EsIDB4ODI2YiwgMHgwMjZlLCAweDAyNjQsIDB4ODI2MSwKICAweDAyMjAsIDB4ODIyNSwgMHg4MjJmLCAweDAyMmEsIDB4ODIzYiwgMHgwMjNlLCAweDAyMzQsIDB4ODIzMSwKICAweDgyMTMsIDB4MDIxNiwgMHgwMjFjLCAweDgyMTksIDB4MDIwOCwgMHg4MjBkLCAweDgyMDcsIDB4MDIwMgp9OwoKLyoqCiAqIFxicmllZiAgVGhpcyB0YWJsZSBkZWZpbmVzIHByZWNhbGN1bGF0ZWQgbG9va3VwIHRhYmxlcyBmb3IgY3JjIHBvbHlub20gIHheMTYgKyB4XjEyICsgeF41ICsgeF4wLgogKi8Kc3RhdGljIGNvbnN0IFVTSE9SVCBjcmNMb29rdXBfMTZfMTJfNV8wWzI1Nl0gPQp7CiAgMHgwMDAwLCAweDEwMjEsIDB4MjA0MiwgMHgzMDYzLCAweDQwODQsIDB4NTBhNSwgMHg2MGM2LCAweDcwZTcsCiAgMHg4MTA4LCAweDkxMjksIDB4YTE0YSwgMHhiMTZiLCAweGMxOGMsIDB4ZDFhZCwgMHhlMWNlLCAweGYxZWYsCiAgMHgxMjMxLCAweDAyMTAsIDB4MzI3MywgMHgyMjUyLCAweDUyYjUsIDB4NDI5NCwgMHg3MmY3LCAweDYyZDYsCiAgMHg5MzM5LCAweDgzMTgsIDB4YjM3YiwgMHhhMzVhLCAweGQzYmQsIDB4YzM5YywgMHhmM2ZmLCAweGUzZGUsCiAgMHgyNDYyLCAweDM0NDMsIDB4MDQyMCwgMHgxNDAxLCAweDY0ZTYsIDB4NzRjNywgMHg0NGE0LCAweDU0ODUsCiAgMHhhNTZhLCAweGI1NGIsIDB4ODUyOCwgMHg5NTA5LCAweGU1ZWUsIDB4ZjVjZiwgMHhjNWFjLCAweGQ1OGQsCiAgMHgzNjUzLCAweDI2NzIsIDB4MTYxMSwgMHgwNjMwLCAweDc2ZDcsIDB4NjZmNiwgMHg1Njk1LCAweDQ2YjQsCiAgMHhiNzViLCAweGE3N2EsIDB4OTcxOSwgMHg4NzM4LCAweGY3ZGYsIDB4ZTdmZSwgMHhkNzlkLCAweGM3YmMsCiAgMHg0OGM0LCAweDU4ZTUsIDB4Njg4NiwgMHg3OGE3LCAweDA4NDAsIDB4MTg2MSwgMHgyODAyLCAweDM4MjMsCiAgMHhjOWNjLCAweGQ5ZWQsIDB4ZTk4ZSwgMHhmOWFmLCAweDg5NDgsIDB4OTk2OSwgMHhhOTBhLCAweGI5MmIsCiAgMHg1YWY1LCAweDRhZDQsIDB4N2FiNywgMHg2YTk2LCAweDFhNzEsIDB4MGE1MCwgMHgzYTMzLCAweDJhMTIsCiAgMHhkYmZkLCAweGNiZGMsIDB4ZmJiZiwgMHhlYjllLCAweDliNzksIDB4OGI1OCwgMHhiYjNiLCAweGFiMWEsCiAgMHg2Y2E2LCAweDdjODcsIDB4NGNlNCwgMHg1Y2M1LCAweDJjMjIsIDB4M2MwMywgMHgwYzYwLCAweDFjNDEsCiAgMHhlZGFlLCAweGZkOGYsIDB4Y2RlYywgMHhkZGNkLCAweGFkMmEsIDB4YmQwYiwgMHg4ZDY4LCAweDlkNDksCiAgMHg3ZTk3LCAweDZlYjYsIDB4NWVkNSwgMHg0ZWY0LCAweDNlMTMsIDB4MmUzMiwgMHgxZTUxLCAweDBlNzAsCiAgMHhmZjlmLCAweGVmYmUsIDB4ZGZkZCwgMHhjZmZjLCAweGJmMWIsIDB4YWYzYSwgMHg5ZjU5LCAweDhmNzgsCiAgMHg5MTg4LCAweDgxYTksIDB4YjFjYSwgMHhhMWViLCAweGQxMGMsIDB4YzEyZCwgMHhmMTRlLCAweGUxNmYsCiAgMHgxMDgwLCAweDAwYTEsIDB4MzBjMiwgMHgyMGUzLCAweDUwMDQsIDB4NDAyNSwgMHg3MDQ2LCAweDYwNjcsCiAgMHg4M2I5LCAweDkzOTgsIDB4YTNmYiwgMHhiM2RhLCAweGMzM2QsIDB4ZDMxYywgMHhlMzdmLCAweGYzNWUsCiAgMHgwMmIxLCAweDEyOTAsIDB4MjJmMywgMHgzMmQyLCAweDQyMzUsIDB4NTIxNCwgMHg2Mjc3LCAweDcyNTYsCiAgMHhiNWVhLCAweGE1Y2IsIDB4OTVhOCwgMHg4NTg5LCAweGY1NmUsIDB4ZTU0ZiwgMHhkNTJjLCAweGM1MGQsCiAgMHgzNGUyLCAweDI0YzMsIDB4MTRhMCwgMHgwNDgxLCAweDc0NjYsIDB4NjQ0NywgMHg1NDI0LCAweDQ0MDUsCiAgMHhhN2RiLCAweGI3ZmEsIDB4ODc5OSwgMHg5N2I4LCAweGU3NWYsIDB4Zjc3ZSwgMHhjNzFkLCAweGQ3M2MsCiAgMHgyNmQzLCAweDM2ZjIsIDB4MDY5MSwgMHgxNmIwLCAweDY2NTcsIDB4NzY3NiwgMHg0NjE1LCAweDU2MzQsCiAgMHhkOTRjLCAweGM5NmQsIDB4ZjkwZSwgMHhlOTJmLCAweDk5YzgsIDB4ODllOSwgMHhiOThhLCAweGE5YWIsCiAgMHg1ODQ0LCAweDQ4NjUsIDB4NzgwNiwgMHg2ODI3LCAweDE4YzAsIDB4MDhlMSwgMHgzODgyLCAweDI4YTMsCiAgMHhjYjdkLCAweGRiNWMsIDB4ZWIzZiwgMHhmYjFlLCAweDhiZjksIDB4OWJkOCwgMHhhYmJiLCAweGJiOWEsCiAgMHg0YTc1LCAweDVhNTQsIDB4NmEzNywgMHg3YTE2LCAweDBhZjEsIDB4MWFkMCwgMHgyYWIzLCAweDNhOTIsCiAgMHhmZDJlLCAweGVkMGYsIDB4ZGQ2YywgMHhjZDRkLCAweGJkYWEsIDB4YWQ4YiwgMHg5ZGU4LCAweDhkYzksCiAgMHg3YzI2LCAweDZjMDcsIDB4NWM2NCwgMHg0YzQ1LCAweDNjYTIsIDB4MmM4MywgMHgxY2UwLCAweDBjYzEsCiAgMHhlZjFmLCAweGZmM2UsIDB4Y2Y1ZCwgMHhkZjdjLCAweGFmOWIsIDB4YmZiYSwgMHg4ZmQ5LCAweDlmZjgsCiAgMHg2ZTE3LCAweDdlMzYsIDB4NGU1NSwgMHg1ZTc0LCAweDJlOTMsIDB4M2ViMiwgMHgwZWQxLCAweDFlZjAKfTsKCgovKi0tLS0tLS0tLS0tLS0tLSBmdW5jdGlvbiBkZWNsYXJhdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKc3RhdGljIGlubGluZSBJTlQgY2FsY0NyY19CaXRzKAogICAgICAgIFVTSE9SVCAqIGNvbnN0ICAgICAgICAgICAgICAgICAgcENyYywKICAgICAgICBVU0hPUlQgICAgICAgICAgICAgICAgICAgICAgICAgIGNyY01hc2ssCiAgICAgICAgVVNIT1JUICAgICAgICAgICAgICAgICAgICAgICAgICBjcmNQb2x5LAogICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNICAgICAgICAgICAgaEJzLAogICAgICAgIElOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbkJpdHMKICAgICAgICApOwoKc3RhdGljIGlubGluZSBJTlQgY2FsY0NyY19CeXRlcygKICAgICAgICBVU0hPUlQgKiBjb25zdCAgICAgICAgICAgICAgICAgIHBDcmMsCiAgICAgICAgY29uc3QgVVNIT1JUICogICAgICAgICAgICAgICAgICBwQ3JjTG9va3VwLAogICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNICAgICAgICAgICAgaEJzLAogICAgICAgIElOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbkJ5dGVzCiAgICAgICAgKTsKCnN0YXRpYyB2b2lkIGNyY0NhbGMoCiAgICAgICAgSEFORExFX0ZES19DUkNJTkZPICAgICAgICAgICAgICBoQ3JjSW5mbywKICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSAgICAgICAgICAgIGhCcywKICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgICAgICAgIHJlZwogICAgICAgICk7CgoKLyotLS0tLS0tLS0tLS0tIGZ1bmN0aW9uIGRlZmluaXRpb25zIC0tLS0tLS0tLS0tLS0tLS0qLwoKdm9pZCBGREtjcmNJbml0KAogICAgICAgIEhBTkRMRV9GREtfQ1JDSU5GTyAgICAgICAgICAgICAgaENyY0luZm8sCiAgICAgICAgY29uc3QgVUlOVCAgICAgICAgICAgICAgICAgICAgICBjcmNQb2x5LAogICAgICAgIGNvbnN0IFVJTlQgICAgICAgICAgICAgICAgICAgICAgY3JjU3RhcnRWYWx1ZSwKICAgICAgICBjb25zdCBVSU5UICAgICAgICAgICAgICAgICAgICAgIGNyY0xlbgogICAgICAgICkKewogIC8qIGNyYyBwb2x5bm9tIGV4YW1wbGU6CiAgeF4xNiArIHheMTUgKyB4XjIgKyB4XjAgICAgICAgICgxKSAxMDAwIDAwMDAgMDAwMCAwMTAxIC0+IDB4ODAwNQogIHheMTYgKyB4XjEyICsgeF41ICsgeF4wICAgICAgICAoMSkgMDAwMSAwMDAwIDAwMTAgMDAwMSAtPiAweDEwMjEKICB4XjggKyB4XjQgKyB4XjMgKyB4XjIgKyB4XjAgICAgICAgICAgICAgICgxKSAwMDAxIDExMDEgLT4gMHgwMDFkICovCgogIGhDcmNJbmZvLT5jcmNMZW4gICAgID0gY3JjTGVuOwogIGhDcmNJbmZvLT5jcmNQb2x5ICAgID0gY3JjUG9seTsKICBoQ3JjSW5mby0+c3RhcnRWYWx1ZSA9IGNyY1N0YXJ0VmFsdWU7CiAgaENyY0luZm8tPmNyY01hc2sgICAgPSAoY3JjTGVuKSA/ICgxPDwoY3JjTGVuLTEpKSA6IDA7CgogIEZES2NyY1Jlc2V0KGhDcmNJbmZvKTsKCiAgaENyY0luZm8tPnBDcmNMb29rdXAgPSAwOwoKICBpZiAoaENyY0luZm8tPmNyY0xlbj09MTYpIHsKICAgIHN3aXRjaCAoIGNyY1BvbHkgKSB7CiAgICAgIGNhc2UgMHg4MDA1OgogICAgICAgIGhDcmNJbmZvLT5wQ3JjTG9va3VwID0gY3JjTG9va3VwXzE2XzE1XzJfMDsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAweDEwMjE6CiAgICAgICAgaENyY0luZm8tPnBDcmNMb29rdXAgPSBjcmNMb29rdXBfMTZfMTJfNV8wOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIDB4MDAxZDoKICAgICAgZGVmYXVsdDoKICAgICAgICAvKiBubyBsb29rdXAgdGFibGUgKi8KICAgICAgICBoQ3JjSW5mby0+cENyY0xvb2t1cCA9IDA7CiAgICB9CiAgfQoKCn0KCnZvaWQgRkRLY3JjUmVzZXQoSEFORExFX0ZES19DUkNJTkZPIGhDcmNJbmZvKQp7CiAgaW50IGk7CgogIGhDcmNJbmZvLT5jcmNWYWx1ZSA9IGhDcmNJbmZvLT5zdGFydFZhbHVlOwoKICBmb3IoaT0wO2k8TUFYX0NSQ19SRUdTO2krKykgewogICAgaENyY0luZm8tPmNyY1JlZ0RhdGFbaV0uaXNBY3RpdmUgPSAwOwogIH0KICBoQ3JjSW5mby0+cmVnU3RhcnQgPSAwOwogIGhDcmNJbmZvLT5yZWdTdG9wICA9IDA7Cn0KCklOVCBGREtjcmNTdGFydFJlZygKICAgICAgICBIQU5ETEVfRkRLX0NSQ0lORk8gICAgICAgICAgICAgIGhDcmNJbmZvLAogICAgICAgIGNvbnN0IEhBTkRMRV9GREtfQklUU1RSRUFNICAgICAgaEJzLAogICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgICAgICAgbUJpdHMKICAgICAgICApCnsKICBpbnQgcmVnID0gaENyY0luZm8tPnJlZ1N0YXJ0OwoKICBGREtfQVNTRVJUKGhDcmNJbmZvLT5jcmNSZWdEYXRhW3JlZ10uaXNBY3RpdmU9PTApOwogIGhDcmNJbmZvLT5jcmNSZWdEYXRhW3JlZ10uaXNBY3RpdmUgICAgICA9IDE7CiAgaENyY0luZm8tPmNyY1JlZ0RhdGFbcmVnXS5tYXhCaXRzICAgICAgID0gbUJpdHM7CiAgaENyY0luZm8tPmNyY1JlZ0RhdGFbcmVnXS52YWxpZEJpdHMgICAgID0gRkRLZ2V0VmFsaWRCaXRzKGhCcykgOwogIGhDcmNJbmZvLT5jcmNSZWdEYXRhW3JlZ10uYml0QnVmQ250Qml0cyA9IDA7CgogIGhDcmNJbmZvLT5yZWdTdGFydCA9IChoQ3JjSW5mby0+cmVnU3RhcnQrMSklTUFYX0NSQ19SRUdTOwoKICByZXR1cm4gKHJlZyk7Cn0KCklOVCBGREtjcmNFbmRSZWcoCiAgICAgICAgSEFORExFX0ZES19DUkNJTkZPICAgICAgICAgICAgICBoQ3JjSW5mbywKICAgICAgICBjb25zdCBIQU5ETEVfRkRLX0JJVFNUUkVBTSAgICAgIGhCcywKICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgICAgICAgIHJlZwogICAgICAgICkKewogIEZES19BU1NFUlQoKHJlZz09KElOVCloQ3JjSW5mby0+cmVnU3RvcCkmJihoQ3JjSW5mby0+Y3JjUmVnRGF0YVtyZWddLmlzQWN0aXZlPT0xKSk7CgogIGlmIChoQnMtPkNvbmZpZ0NhY2hlPT1CU19XUklURVIpIHsKICAgIGhDcmNJbmZvLT5jcmNSZWdEYXRhW3JlZ10uYml0QnVmQ250Qml0cyA9IEZES2dldFZhbGlkQml0cyhoQnMpIC0gaENyY0luZm8tPmNyY1JlZ0RhdGFbcmVnXS52YWxpZEJpdHM7CiAgfQogIGVsc2UgewogICAgaENyY0luZm8tPmNyY1JlZ0RhdGFbcmVnXS5iaXRCdWZDbnRCaXRzID0gaENyY0luZm8tPmNyY1JlZ0RhdGFbcmVnXS52YWxpZEJpdHMgLSBGREtnZXRWYWxpZEJpdHMoaEJzKTsKICB9CgogIGlmIChoQ3JjSW5mby0+Y3JjUmVnRGF0YVtyZWddLm1heEJpdHMgPT0gMCkgewogICAgaENyY0luZm8tPmNyY1JlZ0RhdGFbcmVnXS5tYXhCaXRzID0gaENyY0luZm8tPmNyY1JlZ0RhdGFbcmVnXS5iaXRCdWZDbnRCaXRzOwogIH0KCiAgY3JjQ2FsYyggaENyY0luZm8sIGhCcywgcmVnKTsKCiAgaENyY0luZm8tPmNyY1JlZ0RhdGFbcmVnXS5pc0FjdGl2ZSA9IDA7CiAgaENyY0luZm8tPnJlZ1N0b3AgPSAoaENyY0luZm8tPnJlZ1N0b3ArMSklTUFYX0NSQ19SRUdTOwoKICByZXR1cm4gMDsKfQoKVVNIT1JUIEZES2NyY0dldENSQygKICAgICAgICBjb25zdCBIQU5ETEVfRkRLX0NSQ0lORk8gICAgICAgIGhDcmNJbmZvCiAgICAgICAgKQp7CiAgcmV0dXJuICggaENyY0luZm8tPmNyY1ZhbHVlICYgKCgoaENyY0luZm8tPmNyY01hc2stMSk8PDEpKzEpICk7Cn0KCi8qKgogKiBcYnJpZWYgIENhbGN1bGF0ZSBjcmMgYml0cy4KICoKICogQ2FsY3VsYXRlIGNyYyBzdGFydGluZyBhdCBjdXJyZW50IGJpdHN0cmVhbSBwb3N0aW9uIG92ZXIgbkJpdHMuCiAqCiAqIFxwYXJhbSBwQ3JjICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byBhbiBvdXRseWluZyBhbGxvY2F0ZWQgY3JjIGluZm8gc3RydWN0dXJlLgogKiBccGFyYW0gY3JjTWFzayAgICAgICAgICAgICAgIENyY01hc2sgaW4gdXNlLgogKiBccGFyYW0gY3JjUG9seSAgICAgICAgICAgICAgIENyYyBwb2x5bm9tIGluIHVzZS4KICogXHBhcmFtIGhCcyAgICAgICAgICAgICAgICAgICBIYW5kbGUgdG8gY3VycmVudCBiaXQgYnVmZmVyIHN0cnVjdHVyZS4KICogXHBhcmFtIG5CaXRzICAgICAgICAgICAgICAgICBOdW1iZXIgb2YgcHJvY2Vzc2luZyBiaXRzLgogKgogKiBccmV0dXJuICBOdW1iZXIgb2YgcHJvY2Vzc2VkIGJpdHMuCiAqLwpzdGF0aWMgaW5saW5lIElOVCBjYWxjQ3JjX0JpdHMoCiAgICAgICAgVVNIT1JUICogY29uc3QgICAgICAgICAgICAgICAgICBwQ3JjLAogICAgICAgIFVTSE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgY3JjTWFzaywKICAgICAgICBVU0hPUlQgICAgICAgICAgICAgICAgICAgICAgICAgIGNyY1BvbHksCiAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gICAgICAgICAgICBoQnMsCiAgICAgICAgSU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuQml0cwogICAgICAgICkKewogIGludCBpOwogIFVTSE9SVCBjcmMgPSAqcENyYzsgLyogZ2V0IGNyYyB2YWx1ZSAqLwoKICBpZiAoaEJzIT1OVUxMKSB7CiAgICBmb3IgKGkgPSAwOyAoaSA8IG5CaXRzKTsgaSsrKSB7CiAgICAgIFVTSE9SVCB0bXAgPSBGREtyZWFkQml0cyhoQnMsMSk7ICAgICAvLyBwcm9jZXNzIHNpbmdsZSBiaXQKICAgICAgdG1wIF49ICggKGNyYyAmIGNyY01hc2spID8gMSA6IDAgKTsKICAgICAgdG1wICo9IGNyY1BvbHk7CiAgICAgIGNyYyA8PD0gMTsKICAgICAgY3JjIF49IHRtcDsKICAgIH0KICB9CiAgZWxzZSB7CiAgICBmb3IgKGkgPSAwOyAoaSA8IG5CaXRzKTsgaSsrKSB7CiAgICAgIFVTSE9SVCB0bXAgPSAwOyAgICAgLy8gcHJvY2VzcyBzaW5nbGUgYml0CiAgICAgIHRtcCBePSAoIChjcmMgJiBjcmNNYXNrKSA/IDEgOiAwICk7CiAgICAgIHRtcCAqPSBjcmNQb2x5OwogICAgICBjcmMgPDw9IDE7CiAgICAgIGNyYyBePSB0bXA7CiAgICB9CiAgfQogICpwQ3JjID0gY3JjOyAvKiB1cGRhdGUgY3JjIHZhbHVlICovCgogIHJldHVybiBuQml0czsKfQoKLyoqCiAqIFxicmllZiAgQ2FsY3VsYXRlIGNyYyBieXRlcy4KICoKICogQ2FsY3VsYXRlIGNyYyBzdGFydGluZyBhdCBjdXJyZW50IGJpdHN0cmVhbSBwb3N0aW9uIG92ZXIgbkJ5dGVzLgogKgogKiBccGFyYW0gcENyYyAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gYW4gb3V0bHlpbmcgYWxsb2NhdGVkIGNyYyBpbmZvIHN0cnVjdHVyZS4KICogXHBhcmFtIHBDcmNMb29rdXAgICAgICAgICAgICBQb2ludGVyIHRvIGxvb2t1cCB0YWJsZSB1c2VkIGZvciBmYXN0IGNyYyBjYWxjdWxhdGlvbi4KICogXHBhcmFtIGhCcyAgICAgICAgICAgICAgICAgICBIYW5kbGUgdG8gY3VycmVudCBiaXQgYnVmZmVyIHN0cnVjdHVyZS4KICogXHBhcmFtIG5CaXRzICAgICAgICAgICAgICAgICBOdW1iZXIgb2YgcHJvY2Vzc2luZyBieXRlcy4KICoKICogXHJldHVybiAgTnVtYmVyIG9mIHByb2Nlc3NlZCBiaXRzLgogKi8Kc3RhdGljIGlubGluZSBJTlQgY2FsY0NyY19CeXRlcygKICAgICAgICBVU0hPUlQgKiBjb25zdCAgICAgICAgICAgICAgICAgIHBDcmMsCiAgICAgICAgY29uc3QgVVNIT1JUICogICAgICAgICAgICAgICAgICBwQ3JjTG9va3VwLAogICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNICAgICAgICAgICAgaEJzLAogICAgICAgIElOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbkJ5dGVzCiAgICAgICAgKQp7CiAgaW50IGk7CiAgVVNIT1JUIGNyYyA9ICpwQ3JjOyAvKiBnZXQgY3JjIHZhbHVlICovCgogIGlmIChoQnMhPU5VTEwpIHsKICAgIGZvciAoaT0wOyBpPG5CeXRlczsgaSsrKSB7CiAgICAgIGNyYyA9IChjcmM8PDgpXnBDcmNMb29rdXBbKChjcmM+PjgpXigoVUNIQVIpRkRLcmVhZEJpdHMoaEJzLDgpKSkmMHhGRl07CiAgICB9CiAgfQogIGVsc2UgewogICAgZm9yIChpPTA7IGk8bkJ5dGVzOyBpKyspIHsKICAgICAgY3JjID0gKGNyYzw8OClecENyY0xvb2t1cFsoKGNyYz4+OCleKChVQ0hBUikwKSkmMHhGRl07CiAgICB9CiAgfQoKICAqcENyYyA9IGNyYzsgLyogdXBkYXRlIGNyYyB2YWx1ZSAqLwoKICByZXR1cm4gKGkpOwp9CgovKioKICogXGJyaWVmICBDYWxjdWxhdGUgY3JjLgogKgogKiBDYWxjdWxhdGUgY3JjLiBMZW5naHQgZGVwZW5kcyBvbiBtQml0cyBwYXJhbWV0ZXIgaW4gRkRLY3JjU3RhcnRSZWcoKSBjb25maWd1cmF0aW9uLgogKgogKiBccGFyYW0gaENyY0luZm8gICAgICAgICAgICAgIFBvaW50ZXIgdG8gYW4gb3V0bHlpbmcgYWxsb2NhdGVkIGNyYyBpbmZvIHN0cnVjdHVyZS4KICogXHBhcmFtIGhCcyAgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIGN1cnJlbnQgYml0IGJ1ZmZlciBzdHJ1Y3R1cmUuCiAqIFxwYXJhbSByZWcgICAgICAgICAgICAgICAgICAgQ3JjIHJlZ2lvbiBJRC4KICoKICogXHJldHVybiAgTnVtYmVyIG9mIHByb2Nlc3NlZCBiaXRzLgogKi8Kc3RhdGljIHZvaWQgY3JjQ2FsYygKICAgICAgICBIQU5ETEVfRkRLX0NSQ0lORk8gICAgICAgICAgICAgIGhDcmNJbmZvLAogICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNICAgICAgICAgICAgaEJzLAogICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgICAgICAgcmVnCiAgICAgICAgKQp7CiAgVVNIT1JUIGNyYyA9IGhDcmNJbmZvLT5jcmNWYWx1ZTsKICBDQ3JjUmVnRGF0YSAqckQgPSAmaENyY0luZm8tPmNyY1JlZ0RhdGFbcmVnXTsKICBGREtfQklUU1RSRUFNIGJzUmVhZGVyOwoKICBpZiAoaEJzLT5Db25maWdDYWNoZT09QlNfUkVBREVSKSB7CiAgICBic1JlYWRlciA9ICpoQnM7CiAgICBGREtwdXNoQmlEaXJlY3Rpb25hbCgmYnNSZWFkZXIsIC0oSU5UKShyRC0+dmFsaWRCaXRzLUZES2dldFZhbGlkQml0cygmYnNSZWFkZXIpKSk7CiAgfQogIGVsc2UgewogICAgRkRLaW5pdEJpdFN0cmVhbSgmYnNSZWFkZXIsIGhCcy0+aEJpdEJ1Zi5CdWZmZXIsIGhCcy0+aEJpdEJ1Zi5idWZTaXplLCBoQnMtPmhCaXRCdWYuVmFsaWRCaXRzLCBCU19SRUFERVIpOwogICAgRkRLcHVzaEJpRGlyZWN0aW9uYWwoJmJzUmVhZGVyLCByRC0+dmFsaWRCaXRzKTsKICB9CgogIGludCBiaXRzLCByQml0czsKICByQml0cyA9IChyRC0+bWF4Qml0cz49MCkgPyByRC0+bWF4Qml0cyA6IC1yRC0+bWF4Qml0czsgLyogcmFtYWluaW5nIGJpdHMgKi8KICBpZiAoKHJELT5tYXhCaXRzPjApICYmICgoKElOVClyRC0+Yml0QnVmQ250Qml0cz4+Mzw8Myk8ckJpdHMpICkgewogICAgYml0cyA9IHJELT5iaXRCdWZDbnRCaXRzOwogIH0KICBlbHNlIHsKICAgIGJpdHMgPSByQml0czsKICB9CgogIGludCB3b3JkcyA9IGJpdHMgPj4gMzsgIC8qIHByb2Nlc3NpbmcgYnl0ZXMgKi8KICBpbnQgbUJpdHMgPSBiaXRzICYgMHg3OyAvKiBtb2R1bG8gYml0cyAqLwoKICBpZihoQ3JjSW5mby0+cENyY0xvb2t1cCkgewogICAgckJpdHMgLT0gKGNhbGNDcmNfQnl0ZXMoJmNyYywgaENyY0luZm8tPnBDcmNMb29rdXAsICZic1JlYWRlciwgd29yZHMpPDwzKTsKICB9CiAgZWxzZSB7CiAgICByQml0cyAtPSBjYWxjQ3JjX0JpdHMoJmNyYywgaENyY0luZm8tPmNyY01hc2ssIGhDcmNJbmZvLT5jcmNQb2x5LCAmYnNSZWFkZXIsIHdvcmRzPDwzICk7CiAgfQoKICAvKiByZW1haW5pbmcgdmFsaWQgYml0cyovCiAgaWYobUJpdHMhPTApIHsKICAgIHJCaXRzIC09IGNhbGNDcmNfQml0cygmY3JjLCBoQ3JjSW5mby0+Y3JjTWFzaywgaENyY0luZm8tPmNyY1BvbHksICZic1JlYWRlciwgbUJpdHMgKTsKICB9CgogIGlmIChyQml0cyE9MCkgewogICAgLyogemVybyBieXRlcyAqLwogICAgaWYgKCAoaENyY0luZm8tPnBDcmNMb29rdXApICYmIChyQml0cz44KSApIHsKICAgICAgckJpdHMgLT0gKGNhbGNDcmNfQnl0ZXMoJmNyYywgaENyY0luZm8tPnBDcmNMb29rdXAsIE5VTEwsIHJCaXRzPj4zKTw8Myk7CiAgICB9CiAgICAvKiByZW1haW5pbmcgemVybyBiaXRzICovCiAgICBpZiAockJpdHMhPTApIHsKICAgICAgckJpdHMgLT0gY2FsY0NyY19CaXRzKCZjcmMsIGhDcmNJbmZvLT5jcmNNYXNrLCBoQ3JjSW5mby0+Y3JjUG9seSwgTlVMTCwgckJpdHMgKTsKICAgIH0KICB9CgogIGhDcmNJbmZvLT5jcmNWYWx1ZSA9IGNyYzsKfQoK