Ci8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAoKqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAxLiAgICBJTlRST0RVQ1RJT04KVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwp0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCgpBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQppbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydApvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KClBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwppbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCnRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCnRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwpzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCgpDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAphcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCgoyLiAgICBDT1BZUklHSFQgTElDRU5TRQoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CnBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKCllvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCnlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCgpZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCllvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgoKVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dApwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCgpZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCnNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgoKWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCiJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCgozLiAgICBOTyBQQVRFTlQgTElDRU5TRQoKTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCkFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCnJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KCllvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZApieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCgo0LiAgICBESVNDTEFJTUVSCgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwpvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgpDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCmluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCm9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCmFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgoKNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgoKRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCkF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCkFtIFdvbGZzbWFudGVsIDMzCjkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Cgp3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCmFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKiEKICBcZmlsZQogIFxicmllZiAgcGFyYW1ldHJpYyBzdGVyZW8gZGVjb2RlciAgCiovCgojaW5jbHVkZSAicHNkZWMuaCIKCgoKI2luY2x1ZGUgIkZES19iaXRidWZmZXIuaCIKI2luY2x1ZGUgInBzZGVjX2h5YnJpZC5oIgoKI2luY2x1ZGUgInNicl9yb20uaCIKI2luY2x1ZGUgInNicl9yYW0uaCIKCiNpbmNsdWRlICJGREtfdG9vbHNfcm9tLmgiCgojaW5jbHVkZSAiZ2VuZXJpY1N0ZHMuaCIKCiNpbmNsdWRlICJGREtfdHJpZ0ZjdHMuaCIKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qICAgICAgICAgICAgICAgICAgICAgICBNTFFVQUwgREVGSU5FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKICAjZGVmaW5lIEZSQUNUX1pFUk8gRlJBQ1RfQklUUy0xCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KClNCUl9FUlJPUiBSZXNldFBzRGVjKCBIQU5ETEVfUFNfREVDIGhfcHNfZCApOwoKdm9pZCBSZXNldFBzRGVDb3IoIEhBTkRMRV9QU19ERUMgaF9wc19kICk7CgoKLyoqKioqIEhFTFBFUlMgKioqKiovCgpzdGF0aWMgdm9pZCBhc3NpZ25UaW1lU2xvdHNQUyAoRklYUF9EQkwgKmJ1ZkFkciwgRklYUF9EQkwgKipidWZQdHIsIGNvbnN0IGludCBudW1TbG90cywgY29uc3QgaW50IG51bUNoYW4pOwoKCgovKioqKioqKioqKioqKioqKioqKi8KCiNkZWZpbmUgRElWMyBGTDJGWENPTlNUX0RCTCgxLmYvMy5mKSAgICAgLyogZGl2aXNpb24gMy4wICovCiNkZWZpbmUgRElWMV81IEZMMkZYQ09OU1RfREJMKDIuZi8zLmYpICAgLyogZGl2aXNpb24gMS41ICovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiEKICBcYnJpZWYgIENyZWF0ZXMgb25lIGluc3RhbmNlIG9mIHRoZSBQU19ERUMgc3RydWN0CgogIFxyZXR1cm4gRXJyb3IgaW5mbwoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KaW50CkNyZWF0ZVBzRGVjKCBIQU5ETEVfUFNfREVDICpoX1BTX0RFQywgICAvKiE8IHBvaW50ZXIgdG8gdGhlIG1vZHVsZSBzdGF0ZSAqLwogICAgICAgICAgICAgaW50IGFhY1NhbXBsZXNQZXJGcmFtZQogICAgICAgICAgICkKewogIFNCUl9FUlJPUiBlcnJvckluZm8gPSBTQlJERUNfT0s7CiAgSEFORExFX1BTX0RFQyAgaF9wc19kOwogIGludCBpOwoKICBpZiAoKmhfUFNfREVDID09IE5VTEwpIHsKICAgIC8qIEdldCBwcyBkZWMgcmFtICovCiAgICBoX3BzX2QgPSBHZXRSYW1fcHNfZGVjKCk7CiAgICBpZiAoaF9wc19kID09IE5VTEwpIHsKICAgICAgZXJyb3JJbmZvID0gU0JSREVDX01FTV9BTExPQ19GQUlMRUQ7CiAgICAgIGdvdG8gYmFpbDsKICAgIH0KICB9IGVsc2UgewogICAgLyogUmVzZXQgYW4gb3BlbiBpbnN0YW5jZSAqLwogICAgaF9wc19kID0gKmhfUFNfREVDOwogIH0KCiAgIC8qIGluaXRpYWxpc2F0aW9uICovCiAgc3dpdGNoIChhYWNTYW1wbGVzUGVyRnJhbWUpIHsKICBjYXNlIDk2MDoKICAgIGhfcHNfZC0+bm9TdWJTYW1wbGVzID0gMzA7ICAgICAgICAgICAgICAvKiBjb2wgKi8KICAgIGJyZWFrOwogIGNhc2UgMTAyNDoKICAgIGhfcHNfZC0+bm9TdWJTYW1wbGVzID0gMzI7ICAgICAgICAgICAgICAvKiBjb2wgKi8KICAgIGJyZWFrOwogIGRlZmF1bHQ6CiAgICBoX3BzX2QtPm5vU3ViU2FtcGxlcyA9IC0xOwogICAgYnJlYWs7CiAgfQoKICBpZiAoaF9wc19kLT5ub1N1YlNhbXBsZXMgPiAgTUFYX05VTV9DT0wKICAgfHwgaF9wc19kLT5ub1N1YlNhbXBsZXMgPD0gMCkKICB7CiAgICBnb3RvIGJhaWw7CiAgfQogIGhfcHNfZC0+bm9DaGFubmVscyAgID0gTk9fUU1GX0NIQU5ORUxTOyAgIC8qIHJvdyAqLwoKICBoX3BzX2QtPnBzRGVjb2RlZFBydiAgID0gIDA7CiAgaF9wc19kLT5wcm9jRnJhbWVCYXNlZCA9IC0xOwogIGZvciAoaSA9IDA7IGkgPCAoMSkrMTsgaSsrKSB7CiAgICBoX3BzX2QtPmJQc0RhdGFBdmFpbFtpXSAgPSAgcHB0X25vbmU7CiAgfQoKCiAgZm9yIChpID0gMDsgaSA8ICgxKSsxOyBpKyspIHsKICAgIEZES21lbWNsZWFyKCZoX3BzX2QtPmJzRGF0YVtpXS5tcGVnLCBzaXplb2YoTVBFR19QU19CU19EQVRBKSk7CiAgfQoKICBlcnJvckluZm8gPSBSZXNldFBzRGVjKCBoX3BzX2QgKTsKCiAgaWYgKCBlcnJvckluZm8gIT0gU0JSREVDX09LICkKICAgIGdvdG8gYmFpbDsKCiAgUmVzZXRQc0RlQ29yKCBoX3BzX2QgKTsKCiAgKmhfUFNfREVDID0gaF9wc19kOwoKCgogIHJldHVybiAwOwoKYmFpbDoKICBEZWxldGVQc0RlYygmaF9wc19kKTsKCiAgcmV0dXJuIC0xOwp9IC8qRU5EIENyZWF0ZVBzRGVjICovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiEKICBcYnJpZWYgIERlbGV0ZSBvbmUgaW5zdGFuY2Ugb2YgdGhlIFBTX0RFQyBzdHJ1Y3QKCiAgXHJldHVybiBFcnJvciBpbmZvCgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwppbnQKRGVsZXRlUHNEZWMoIEhBTkRMRV9QU19ERUMgKmhfUFNfREVDKSAgLyohPCBwb2ludGVyIHRvIHRoZSBtb2R1bGUgc3RhdGUgKi8KewogIGlmICgqaF9QU19ERUMgPT0gTlVMTCkgewogICAgcmV0dXJuIC0xOwogIH0KCgogIEZyZWVSYW1fcHNfZGVjKGhfUFNfREVDKTsKCgogIHJldHVybiAwOwp9IC8qRU5EIERlbGV0ZVBzRGVjICovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiEKICBcYnJpZWYgcmVzZXRzIHNvbWUgdmFsdWVzIG9mIHRoZSBQUyBoYW5kbGUgdG8gZGVmYXVsdCBzdGF0ZXMKCiAgXHJldHVybgoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KU0JSX0VSUk9SIFJlc2V0UHNEZWMoIEhBTkRMRV9QU19ERUMgaF9wc19kICkgIC8qITwgcG9pbnRlciB0byB0aGUgbW9kdWxlIHN0YXRlICovCnsKICBTQlJfRVJST1IgZXJyb3JJbmZvID0gU0JSREVDX09LOwogIElOVCBpOwoKICBjb25zdCBVQ0hBUiBub1FtZkJhbmRzSW5IeWJyaWQyMCA9IDM7CiAgLyogY29uc3QgVUNIQVIgbm9RbWZCYW5kc0luSHlicmlkMzQgPSA1OyAqLwoKICBjb25zdCBVQ0hBUiBhSHlicmlkUmVzb2x1dGlvbjIwW10gPSB7IEhZQlJJRF84X0NQTFgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIWUJSSURfMl9SRUFMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFlCUklEXzJfUkVBTCB9OwoKICBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5kZWxheUJ1ZkluZGV4ICAgPSAwOwoKICAvKiBleHBsaWNpdGx5IGluaXQgc3RhdGUgdmFyaWFibGVzIHRvIHNhZmUgdmFsdWVzICh1bnRpbCBmaXJzdCBwcyBoZWFkZXIgYXJyaXZlcykgKi8KCiAgaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcubGFzdFVzYiAgICAgICAgPSAgMDsKCiAgaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuc2NhbGVGYWN0b3JQc0RlbGF5QnVmZmVyID0gLShERlJBQ1RfQklUUy0xKTsKCiAgRkRLbWVtY2xlYXIoaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuYURlbGF5QnVmSW5kZXhEZWxheVFtZiwgKE5PX1FNRl9DSEFOTkVMUy1GSVJTVF9ERUxBWV9TQikqc2l6ZW9mKFVDSEFSKSk7CiAgaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcubm9TYW1wbGVEZWxheSA9IGRlbGF5SW5kZXhRbWZbMF07CgogIGZvciAoaT0wIDsgaSA8IE5PX1NFUklBTF9BTExQQVNTX0xJTktTOyBpKyspIHsKICAgIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmFEZWxheVJCdWZJbmRleFNlcltpXSA9IDA7CiAgfQoKICBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5wQWFSZWFsRGVsYXlCdWZmZXJRbWZbMF0gPSBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5hYVFtZkRlbGF5QnVmUmVhbDsKCiAgYXNzaWduVGltZVNsb3RzUFMgKCBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5wQWFSZWFsRGVsYXlCdWZmZXJRbWZbMF0gKyAoTk9fUU1GX0NIQU5ORUxTLUZJUlNUX0RFTEFZX1NCKSwKICAgICAgICAgICAgICAgICAgICAgJmhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLnBBYVJlYWxEZWxheUJ1ZmZlclFtZlsxXSwKICAgICAgICAgICAgICAgICAgICAgIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLm5vU2FtcGxlRGVsYXktMSwKICAgICAgICAgICAgICAgICAgICAgIChOT19ERUxBWV9CVUZGRVJfQkFORFMtRklSU1RfREVMQVlfU0IpKTsKCiAgaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcucEFhSW1hZ0RlbGF5QnVmZmVyUW1mWzBdID0gaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuYWFRbWZEZWxheUJ1ZkltYWc7CgogIGFzc2lnblRpbWVTbG90c1BTICggaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcucEFhSW1hZ0RlbGF5QnVmZmVyUW1mWzBdICsgKE5PX1FNRl9DSEFOTkVMUy1GSVJTVF9ERUxBWV9TQiksCiAgICAgICAgICAgICAgICAgICAgICZoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5wQWFJbWFnRGVsYXlCdWZmZXJRbWZbMV0sCiAgICAgICAgICAgICAgICAgICAgICBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5ub1NhbXBsZURlbGF5LTEsCiAgICAgICAgICAgICAgICAgICAgICAoTk9fREVMQVlfQlVGRkVSX0JBTkRTLUZJUlNUX0RFTEFZX1NCKSk7CgogIC8qIEh5YnJpZCBGaWx0ZXIgQmFuayAxIGNyZWF0aW9uLiAqLwogIGVycm9ySW5mbyA9IEluaXRIeWJyaWRGaWx0ZXJCYW5rICggJmhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmh5YnJpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoX3BzX2QtPm5vU3ViU2FtcGxlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub1FtZkJhbmRzSW5IeWJyaWQyMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhSHlicmlkUmVzb2x1dGlvbjIwICk7CgogIGZvciAoIGkgPSAwOyBpIDwgTk9fSUlEX0dST1VQUzsgaSsrICkKICB7CiAgICBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5oMTFyUHJldltpXSA9IEZMMkZYQ09OU1RfREJMKDAuNWYpOwogICAgaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuaDEyclByZXZbaV0gPSBGTDJGWENPTlNUX0RCTCgwLjVmKTsKICB9CgogIEZES21lbWNsZWFyKCBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5oMjFyUHJldiwgc2l6ZW9mKCBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5oMjFyUHJldiApICk7CiAgRkRLbWVtY2xlYXIoIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmgyMnJQcmV2LCBzaXplb2YoIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmgyMnJQcmV2ICkgKTsKCiAgcmV0dXJuIGVycm9ySW5mbzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyohCiAgXGJyaWVmICBjbGVhciBzb21lIGJ1ZmZlcnMgdXNlZCBpbiBkZWNvcnJlbGF0aW9uIHByb2Nlc3MKCiAgXHJldHVybgoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kdm9pZCBSZXNldFBzRGVDb3IoIEhBTkRMRV9QU19ERUMgaF9wc19kICkgIC8qITwgcG9pbnRlciB0byB0aGUgbW9kdWxlIHN0YXRlICovCnsKICBJTlQgaTsKCiAgRkRLbWVtY2xlYXIoaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuYVBlYWtEZWNheUZhc3RCaW4sIE5PX01JRF9SRVNfQklOUypzaXplb2YoRklYUF9EQkwpKTsKICBGREttZW1jbGVhcihoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5hUHJldk5yZ0JpbiwgTk9fTUlEX1JFU19CSU5TKnNpemVvZihGSVhQX0RCTCkpOwogIEZES21lbWNsZWFyKGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmFQcmV2UGVha0RpZmZCaW4sIE5PX01JRF9SRVNfQklOUypzaXplb2YoRklYUF9EQkwpKTsKICBGREttZW1jbGVhcihoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5hUG93ZXJQcmV2U2NhbCwgTk9fTUlEX1JFU19CSU5TKnNpemVvZihTQ0hBUikpOwoKICBmb3IgKGk9MCA7IGkgPCBGSVJTVF9ERUxBWV9TQiA7IGkrKykgewogICAgRkRLbWVtY2xlYXIoaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuYWFhUmVhbERlbGF5UkJ1ZmZlclNlclFtZltpXSwgTk9fREVMQVlfTEVOR1RIX1ZFQ1RPUlMqc2l6ZW9mKEZJWFBfREJMKSk7CiAgICBGREttZW1jbGVhcihoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5hYWFJbWFnRGVsYXlSQnVmZmVyU2VyUW1mW2ldLCBOT19ERUxBWV9MRU5HVEhfVkVDVE9SUypzaXplb2YoRklYUF9EQkwpKTsKICB9CiAgZm9yIChpPTAgOyBpIDwgTk9fU1VCX1FNRl9DSEFOTkVMUyA7IGkrKykgewogICAgRkRLbWVtY2xlYXIoaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuYWFhUmVhbERlbGF5UkJ1ZmZlclNlclN1YlFtZltpXSwgTk9fREVMQVlfTEVOR1RIX1ZFQ1RPUlMqc2l6ZW9mKEZJWFBfREJMKSk7CiAgICBGREttZW1jbGVhcihoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5hYWFJbWFnRGVsYXlSQnVmZmVyU2VyU3ViUW1mW2ldLCBOT19ERUxBWV9MRU5HVEhfVkVDVE9SUypzaXplb2YoRklYUF9EQkwpKTsKICB9Cgp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8qIHNsb3QgYmFzZWQgZnVuY2lvbiBwcm90b3R5cGVzICovCgpzdGF0aWMgdm9pZCBkZUNvcnJlbGF0ZVNsb3RCYXNlZCggSEFORExFX1BTX0RFQyBoX3BzX2QsCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICAgKm1IeWJyaWRSZWFsTGVmdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgICptSHlicmlkSW1hZ0xlZnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAgICAgICAgc2ZfbUh5YnJpZExlZnQsCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICAgKnJJbnRCdWZmZXJMZWZ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICAgKmlJbnRCdWZmZXJMZWZ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgICAgICAgIHNmX0ludEJ1ZmZlciwKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgICAqbUh5YnJpZFJlYWxSaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgICptSHlicmlkSW1hZ1JpZ2h0LAoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgICpySW50QnVmZmVyUmlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgICAqaUludEJ1ZmZlclJpZ2h0ICk7CgpzdGF0aWMgdm9pZCBhcHBseVNsb3RCYXNlZFJvdGF0aW9uKCBIQU5ETEVfUFNfREVDIGhfcHNfZCwKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAqbUh5YnJpZFJlYWxMZWZ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgKm1IeWJyaWRJbWFnTGVmdCwKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAqUW1mTGVmdFJlYWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAqUW1mTGVmdEltYWcsCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgKm1IeWJyaWRSZWFsUmlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAqbUh5YnJpZEltYWdSaWdodCwKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAqUW1mUmlnaHRSZWFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgKlFtZlJpZ2h0SW1hZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiEKICBcYnJpZWYgIEdldCBzY2FsZSBmYWN0b3IgZm9yIGFsbCBwcyBkZWxheSBidWZmZXIuCgogIFxyZXR1cm4KCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYwppbnQgZ2V0U2NhbGVGYWN0b3JQc1N0YXRlc0J1ZmZlcihIQU5ETEVfUFNfREVDICAgaF9wc19kKQp7CiAgSU5UIGk7CiAgaW50IHNjYWxlID0gREZSQUNUX0JJVFMtMTsKCiAgZm9yIChpPTA7IGk8Tk9fUU1GX0JBTkRTX0hZQlJJRDIwOyBpKyspIHsKICAgIHNjYWxlID0gZk1pbihzY2FsZSwgZ2V0U2NhbGVmYWN0b3IoaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuaHlicmlkLm1RbWZCdWZmZXJSZWFsU2xvdFtpXSwgTk9fU1VCX1FNRl9DSEFOTkVMUykpOwogICAgc2NhbGUgPSBmTWluKHNjYWxlLCBnZXRTY2FsZWZhY3RvcihoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5oeWJyaWQubVFtZkJ1ZmZlckltYWdTbG90W2ldLCBOT19TVUJfUU1GX0NIQU5ORUxTKSk7CiAgfQoKICBmb3IgKGk9MDsgaTxOT19TQU1QTEVfREVMQVlfQUxMUEFTUzsgaSsrKSB7CiAgICBzY2FsZSA9IGZNaW4oc2NhbGUsIGdldFNjYWxlZmFjdG9yKGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmFhUmVhbERlbGF5QnVmZmVyUW1mW2ldLCBGSVJTVF9ERUxBWV9TQikpOwogICAgc2NhbGUgPSBmTWluKHNjYWxlLCBnZXRTY2FsZWZhY3RvcihoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5hYUltYWdEZWxheUJ1ZmZlclFtZltpXSwgRklSU1RfREVMQVlfU0IpKTsKICB9CgogIGZvciAoaT0wOyBpPE5PX1NBTVBMRV9ERUxBWV9BTExQQVNTOyBpKyspIHsKICAgIHNjYWxlID0gZk1pbihzY2FsZSwgZ2V0U2NhbGVmYWN0b3IoaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuYWFSZWFsRGVsYXlCdWZmZXJTdWJRbWZbaV0sIE5PX1NVQl9RTUZfQ0hBTk5FTFMpKTsKICAgIHNjYWxlID0gZk1pbihzY2FsZSwgZ2V0U2NhbGVmYWN0b3IoaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuYWFJbWFnRGVsYXlCdWZmZXJTdWJRbWZbaV0sIE5PX1NVQl9RTUZfQ0hBTk5FTFMpKTsKICB9CgogIGZvciAoaT0wOyBpPEZJUlNUX0RFTEFZX1NCOyBpKyspIHsKICAgIHNjYWxlID0gZk1pbihzY2FsZSwgZ2V0U2NhbGVmYWN0b3IoaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuYWFhUmVhbERlbGF5UkJ1ZmZlclNlclFtZltpXSwgTk9fREVMQVlfTEVOR1RIX1ZFQ1RPUlMpKTsKICAgIHNjYWxlID0gZk1pbihzY2FsZSwgZ2V0U2NhbGVmYWN0b3IoaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuYWFhSW1hZ0RlbGF5UkJ1ZmZlclNlclFtZltpXSwgTk9fREVMQVlfTEVOR1RIX1ZFQ1RPUlMpKTsKICB9CgogIGZvciAoaT0wOyBpPE5PX1NVQl9RTUZfQ0hBTk5FTFM7IGkrKykgewogICAgc2NhbGUgPSBmTWluKHNjYWxlLCBnZXRTY2FsZWZhY3RvcihoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5hYWFSZWFsRGVsYXlSQnVmZmVyU2VyU3ViUW1mW2ldLCBOT19ERUxBWV9MRU5HVEhfVkVDVE9SUykpOwogICAgc2NhbGUgPSBmTWluKHNjYWxlLCBnZXRTY2FsZWZhY3RvcihoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5hYWFJbWFnRGVsYXlSQnVmZmVyU2VyU3ViUW1mW2ldLCBOT19ERUxBWV9MRU5HVEhfVkVDVE9SUykpOwogIH0KCiAgZm9yIChpPTA7IGk8TUFYX0RFTEFZX0JVRkZFUl9TSVpFOyBpKyspCiAgewogICAgSU5UIGxlbjsKICAgIGlmIChpPT0wKQogICAgICBsZW4gPSBOT19RTUZfQ0hBTk5FTFMtRklSU1RfREVMQVlfU0I7CiAgICBlbHNlCiAgICAgIGxlbiA9IE5PX0RFTEFZX0JVRkZFUl9CQU5EUy1GSVJTVF9ERUxBWV9TQjsKCiAgICBzY2FsZSA9IGZNaW4oc2NhbGUsIGdldFNjYWxlZmFjdG9yKGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLnBBYVJlYWxEZWxheUJ1ZmZlclFtZltpXSwgbGVuKSk7CiAgICBzY2FsZSA9IGZNaW4oc2NhbGUsIGdldFNjYWxlZmFjdG9yKGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLnBBYUltYWdEZWxheUJ1ZmZlclFtZltpXSwgbGVuKSk7CiAgfQoKICByZXR1cm4gKHNjYWxlKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyohCiAgXGJyaWVmICBSZXNjYWxlIGFsbCBwcyBkZWxheSBidWZmZXIuCgogIFxyZXR1cm4KCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYwp2b2lkIHNjYWxlUHNTdGF0ZXNCdWZmZXIoSEFORExFX1BTX0RFQyBoX3BzX2QsCiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgIHNjYWxlKQp7CiAgSU5UIGk7CgogIGlmIChzY2FsZSA8IDApCiAgICBzY2FsZSA9IGZpeE1heCgoSU5UKXNjYWxlLChJTlQpLShERlJBQ1RfQklUUy0xKSk7CiAgZWxzZQogICAgc2NhbGUgPSBmaXhNaW4oKElOVClzY2FsZSwoSU5UKURGUkFDVF9CSVRTLTEpOwoKICBmb3IgKGk9MDsgaTxOT19RTUZfQkFORFNfSFlCUklEMjA7IGkrKykgewogICAgc2NhbGVWYWx1ZXMoIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmh5YnJpZC5tUW1mQnVmZmVyUmVhbFNsb3RbaV0sIE5PX1NVQl9RTUZfQ0hBTk5FTFMsIHNjYWxlICk7CiAgICBzY2FsZVZhbHVlcyggaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuaHlicmlkLm1RbWZCdWZmZXJJbWFnU2xvdFtpXSwgTk9fU1VCX1FNRl9DSEFOTkVMUywgc2NhbGUgKTsKICB9CgogIGZvciAoaT0wOyBpPE5PX1NBTVBMRV9ERUxBWV9BTExQQVNTOyBpKyspIHsKICAgIHNjYWxlVmFsdWVzKCBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5hYVJlYWxEZWxheUJ1ZmZlclFtZltpXSwgRklSU1RfREVMQVlfU0IsIHNjYWxlICk7CiAgICBzY2FsZVZhbHVlcyggaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuYWFJbWFnRGVsYXlCdWZmZXJRbWZbaV0sIEZJUlNUX0RFTEFZX1NCLCBzY2FsZSApOwogIH0KCiAgZm9yIChpPTA7IGk8Tk9fU0FNUExFX0RFTEFZX0FMTFBBU1M7IGkrKykgewogICAgc2NhbGVWYWx1ZXMoIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmFhUmVhbERlbGF5QnVmZmVyU3ViUW1mW2ldLCBOT19TVUJfUU1GX0NIQU5ORUxTLCBzY2FsZSApOwogICAgc2NhbGVWYWx1ZXMoIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmFhSW1hZ0RlbGF5QnVmZmVyU3ViUW1mW2ldLCBOT19TVUJfUU1GX0NIQU5ORUxTLCBzY2FsZSApOwogIH0KCiAgZm9yIChpPTA7IGk8RklSU1RfREVMQVlfU0I7IGkrKykgewogICAgc2NhbGVWYWx1ZXMoIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmFhYVJlYWxEZWxheVJCdWZmZXJTZXJRbWZbaV0sIE5PX0RFTEFZX0xFTkdUSF9WRUNUT1JTLCBzY2FsZSApOwogICAgc2NhbGVWYWx1ZXMoIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmFhYUltYWdEZWxheVJCdWZmZXJTZXJRbWZbaV0sIE5PX0RFTEFZX0xFTkdUSF9WRUNUT1JTLCBzY2FsZSApOwogIH0KCiAgZm9yIChpPTA7IGk8Tk9fU1VCX1FNRl9DSEFOTkVMUzsgaSsrKSB7CiAgICBzY2FsZVZhbHVlcyggaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuYWFhUmVhbERlbGF5UkJ1ZmZlclNlclN1YlFtZltpXSwgTk9fREVMQVlfTEVOR1RIX1ZFQ1RPUlMsIHNjYWxlICk7CiAgICBzY2FsZVZhbHVlcyggaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuYWFhSW1hZ0RlbGF5UkJ1ZmZlclNlclN1YlFtZltpXSwgTk9fREVMQVlfTEVOR1RIX1ZFQ1RPUlMsIHNjYWxlICk7CiAgfQoKICBmb3IgKGk9MDsgaTxNQVhfREVMQVlfQlVGRkVSX1NJWkU7IGkrKykgewogICAgSU5UIGxlbjsKICAgIGlmIChpPT0wKQogICAgICBsZW4gPSBOT19RTUZfQ0hBTk5FTFMtRklSU1RfREVMQVlfU0I7CiAgICBlbHNlCiAgICAgIGxlbiA9IE5PX0RFTEFZX0JVRkZFUl9CQU5EUy1GSVJTVF9ERUxBWV9TQjsKCiAgICBzY2FsZVZhbHVlcyggaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcucEFhUmVhbERlbGF5QnVmZmVyUW1mW2ldLCBsZW4sIHNjYWxlICk7CiAgICBzY2FsZVZhbHVlcyggaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcucEFhSW1hZ0RlbGF5QnVmZmVyUW1mW2ldLCBsZW4sIHNjYWxlICk7CiAgfQoKICBzY2FsZSA8PD0gMTsKCiAgc2NhbGVWYWx1ZXMoIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmFQZWFrRGVjYXlGYXN0QmluLCBOT19NSURfUkVTX0JJTlMsIHNjYWxlICk7CiAgc2NhbGVWYWx1ZXMoIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmFQcmV2UGVha0RpZmZCaW4sIE5PX01JRF9SRVNfQklOUywgc2NhbGUgKTsKICBzY2FsZVZhbHVlcyggaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuYVByZXZOcmdCaW4sIE5PX01JRF9SRVNfQklOUywgc2NhbGUgKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyohCiAgXGJyaWVmICBTY2FsZSBpbnB1dCBjaGFubmVsIHRvIHRoZSBzYW1lIHNjYWxlZmFjdG9yIGFuZCByZXNjYWxlIGh5YnJpZAogICAgICAgICAgZmlsdGVyYmFuayB2YWx1ZXMKCiAgXHJldHVybgoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnZvaWQgc2NhbEZpbHRlckJhbmtWYWx1ZXMoIEhBTkRMRV9QU19ERUMgICBoX3BzX2QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgICAgKipmaXhwUW1mUmVhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICAgICAqKmZpeHBRbWZJbWFnLAogICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgbHNiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgc2NhbGVGYWN0b3JMb3dCYW5kU3BsaXRMb3csCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzY2FsZUZhY3Rvckxvd0JhbmRTcGxpdEhpZ2gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSICAgICAgICAgICpzY2FsZUZhY3Rvckxvd0JhbmRfbGIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSICAgICAgICAgICpzY2FsZUZhY3Rvckxvd0JhbmRfaGIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBzY2FsZUZhY3RvckhpZ2hCYW5kcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgKnNjYWxlRmFjdG9ySGlnaEJhbmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICBub0NvbHMKICAgICAgICAgICAgICAgICAgICAgICAgICkKewogIElOVCBtYXhTY2FsOwoKICBJTlQgaTsKCiAgc2NhbGVGYWN0b3JIaWdoQmFuZHMgICAgICAgID0gIC1zY2FsZUZhY3RvckhpZ2hCYW5kczsKICBzY2FsZUZhY3Rvckxvd0JhbmRTcGxpdExvdyAgPSAgLXNjYWxlRmFjdG9yTG93QmFuZFNwbGl0TG93OwogIHNjYWxlRmFjdG9yTG93QmFuZFNwbGl0SGlnaCA9ICAtc2NhbGVGYWN0b3JMb3dCYW5kU3BsaXRIaWdoOwoKICAvKiBnZXQgbWF4IHNjYWxlIGZhY3RvciAqLwogIG1heFNjYWwgPSBmaXhNYXgoc2NhbGVGYWN0b3JIaWdoQmFuZHMsZml4TWF4KHNjYWxlRmFjdG9yTG93QmFuZFNwbGl0TG93LCBzY2FsZUZhY3Rvckxvd0JhbmRTcGxpdEhpZ2ggKSk7CgogIHsKICAgIGludCBoZWFkcm9vbSAgPSBnZXRTY2FsZUZhY3RvclBzU3RhdGVzQnVmZmVyKGhfcHNfZCk7CiAgICBtYXhTY2FsICAgPSBmaXhNYXgobWF4U2NhbCwoSU5UKShoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5zY2FsZUZhY3RvclBzRGVsYXlCdWZmZXItaGVhZHJvb20pKTsKICAgIG1heFNjYWwgICs9IDE7CiAgfQoKICAvKiBzY2FsZSB3aG9sZSBsZWZ0IGNoYW5uZWwgdG8gdGhlIHNhbWUgc2NhbGUgZmFjdG9yICovCgogIC8qIGxvdyBiYW5kICggb3ZlcmxhcCBidWZmZXIgKSAqLwogIGlmICggbWF4U2NhbCAhPSBzY2FsZUZhY3Rvckxvd0JhbmRTcGxpdExvdyApIHsKICAgIElOVCBzY2FsZSA9IHNjYWxlRmFjdG9yTG93QmFuZFNwbGl0TG93IC0gbWF4U2NhbDsKICAgIGZvciAoIGk9MDsgaTwoNik7IGkrKyApIHsKICAgICAgc2NhbGVWYWx1ZXMoIGZpeHBRbWZSZWFsW2ldLCBsc2IsIHNjYWxlICk7CiAgICAgIHNjYWxlVmFsdWVzKCBmaXhwUW1mSW1hZ1tpXSwgbHNiLCBzY2FsZSApOwogICAgfQogIH0KICAvKiBsb3cgYmFuZCAoIGN1cnJlbnQgZnJhbWUgKSAqLwogIGlmICggbWF4U2NhbCAhPSBzY2FsZUZhY3Rvckxvd0JhbmRTcGxpdEhpZ2ggKSB7CiAgICBJTlQgc2NhbGUgPSBzY2FsZUZhY3Rvckxvd0JhbmRTcGxpdEhpZ2ggLSBtYXhTY2FsOwogICAgLyogZm9yICggaT0oNik7IGk8KDYpK01BWF9OVU1fQ09MOyBpKysgKSB7ICovCiAgICBmb3IgKCBpPSg2KTsgaTwoNikrbm9Db2xzOyBpKysgKSB7CiAgICAgIHNjYWxlVmFsdWVzKCBmaXhwUW1mUmVhbFtpXSwgbHNiLCBzY2FsZSApOwogICAgICBzY2FsZVZhbHVlcyggZml4cFFtZkltYWdbaV0sIGxzYiwgc2NhbGUgKTsKICAgIH0KICB9CiAgLyogaGlnaCBiYW5kICovCiAgaWYgKCBtYXhTY2FsICE9IHNjYWxlRmFjdG9ySGlnaEJhbmRzICkgewogICAgSU5UIHNjYWxlID0gc2NhbGVGYWN0b3JIaWdoQmFuZHMgLSBtYXhTY2FsOwogICAgLyogZm9yICggaT0wOyBpPE1BWF9OVU1fQ09MOyBpKysgKSB7ICovCiAgICBmb3IgKCBpPTA7IGk8bm9Db2xzOyBpKysgKSB7CiAgICAgIHNjYWxlVmFsdWVzKCAmZml4cFFtZlJlYWxbaV1bbHNiXSwgKDY0KS1sc2IsIHNjYWxlICk7CiAgICAgIHNjYWxlVmFsdWVzKCAmZml4cFFtZkltYWdbaV1bbHNiXSwgKDY0KS1sc2IsIHNjYWxlICk7CiAgICB9CiAgfQoKICBpZiAoIG1heFNjYWwgIT0gaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuc2NhbGVGYWN0b3JQc0RlbGF5QnVmZmVyICkKICAgIHNjYWxlUHNTdGF0ZXNCdWZmZXIoaF9wc19kLChoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5zY2FsZUZhY3RvclBzRGVsYXlCdWZmZXItbWF4U2NhbCkpOwoKICBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5oeWJyaWQuc2ZfbVFtZkJ1ZmZlciA9IG1heFNjYWw7CiAgaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuc2NhbGVGYWN0b3JQc0RlbGF5QnVmZmVyID0gbWF4U2NhbDsKCiAgKnNjYWxlRmFjdG9ySGlnaEJhbmQgKz0gbWF4U2NhbCAtIHNjYWxlRmFjdG9ySGlnaEJhbmRzOwoKICBoX3BzX2QtPnJlc2NhbCA9IG1heFNjYWwgLSBzY2FsZUZhY3Rvckxvd0JhbmRTcGxpdEhpZ2g7CiAgaF9wc19kLT5zZl9JbnRCdWZmZXIgPSBtYXhTY2FsOwoKICAqc2NhbGVGYWN0b3JMb3dCYW5kX2xiICs9IG1heFNjYWwgLSBzY2FsZUZhY3Rvckxvd0JhbmRTcGxpdExvdzsKICAqc2NhbGVGYWN0b3JMb3dCYW5kX2hiICs9IG1heFNjYWwgLSBzY2FsZUZhY3Rvckxvd0JhbmRTcGxpdEhpZ2g7Cn0KCnZvaWQgcmVzY2FsRmlsdGVyQmFua1ZhbHVlcyggSEFORExFX1BTX0RFQyAgIGhfcHNfZCwgICAgICAgICAgICAgICAgICAgICAgLyogcGFyYW1ldHJpYyBzdGVyZW8gZGVjb2RlciBoYW5kbGUgICAgICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICAgICAqKlFtZkJ1ZmZlclJlYWwsICAgICAgICAgICAgICAgLyogcW1mIGZpbHRlcmJhbmsgdmFsdWVzICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICAgICAqKlFtZkJ1ZmZlckltYWcsICAgICAgICAgICAgICAgLyogcW1mIGZpbHRlcmJhbmsgdmFsdWVzICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIGxzYiwgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2JyIHN0YXJ0IHN1YmJhbmQgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgIG5vQ29scykKewogIGludCBpOwogIC8qIHNjYWxlIGJhY2sgNiB0aW1lc2xvdHMgbG9vayBhaGVhZCBmb3IgaHlicmlkIGZpbHRlcmJhbmsgdG8gb3JpZ2luYWwgdmFsdWUgKi8KICBmb3IgKCBpPW5vQ29sczsgaTxub0NvbHMgKyAoNik7IGkrKyApIHsKICAgIHNjYWxlVmFsdWVzKCBRbWZCdWZmZXJSZWFsW2ldLCBsc2IsIGhfcHNfZC0+cmVzY2FsICk7CiAgICBzY2FsZVZhbHVlcyggUW1mQnVmZmVySW1hZ1tpXSwgbHNiLCBoX3BzX2QtPnJlc2NhbCApOwogIH0KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyohCiAgXGJyaWVmICBHZW5lcmF0ZSBkZWNvcnJlbGF0ZWQgc2lkZSBjaGFubmVsIHVzaW5nIGFsbHBhc3MvZGVsYXkKCiAgXHJldHVybgoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIHZvaWQKZGVDb3JyZWxhdGVTbG90QmFzZWQoIEhBTkRMRV9QU19ERUMgaF9wc19kLCAgICAgICAgICAgIC8qITwgcG9pbnRlciB0byB0aGUgbW9kdWxlIHN0YXRlICovCgogICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICAgKm1IeWJyaWRSZWFsTGVmdCwgICAgLyohPCBsZWZ0IChtb25vKSBoeWJyaWQgdmFsdWVzIHJlYWwgKi8KICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgICptSHlicmlkSW1hZ0xlZnQsICAgIC8qITwgbGVmdCAobW9ubykgaHlicmlkIHZhbHVlcyBpbWFnICovCiAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAgICAgICAgc2ZfbUh5YnJpZExlZnQsICAgICAvKiE8IHNjYWxlZmFjdG9yIGZvciBsZWZ0IChtb25vKSBoeWJyaWQgYmFuZHMgKi8KCiAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgICAqckludEJ1ZmZlckxlZnQsICAgICAvKiE8IHJlYWwgcW1mIGJhbmRzIGxlZnQgKG1vbm8pICgzOHg2NCkgKi8KICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgICppSW50QnVmZmVyTGVmdCwgICAgIC8qITwgcmVhbCBxbWYgYmFuZHMgbGVmdCAobW9ubykgKDM4eDY0KSAqLwogICAgICAgICAgICAgICAgICAgICAgU0NIQVIgICAgICAgIHNmX0ludEJ1ZmZlciwgICAgICAgLyohPCBzY2FsZWZhY3RvciBmb3IgYWxsIGxlZnQgYW5kIHJpZ2h0IHFtZiBiYW5kcyAgICovCgogICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICAgKm1IeWJyaWRSZWFsUmlnaHQsICAgLyohPCByaWdodCAoZGVjb3JyZWxhdGVkKSBoeWJyaWQgdmFsdWVzIHJlYWwgKi8KICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAgICptSHlicmlkSW1hZ1JpZ2h0LCAgIC8qITwgcmlnaHQgKGRlY29ycmVsYXRlZCkgaHlicmlkIHZhbHVlcyBpbWFnICovCgogICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICAgKnJJbnRCdWZmZXJSaWdodCwgICAgLyohPCByZWFsIHFtZiBiYW5kcyByaWdodCAoZGVjb3JyZWxhdGVkKSAoMzh4NjQpICovCiAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgICAqaUludEJ1ZmZlclJpZ2h0ICkgICAvKiE8IHJlYWwgcW1mIGJhbmRzIHJpZ2h0IChkZWNvcnJlbGF0ZWQpICgzOHg2NCkgKi8KewoKICBJTlQgIGksIG0sIHNiLCBnciwgYmluOwoKICBGSVhQX0RCTCBwZWFrRGlmZiwgbnJnLCB0cmFuc1JhdGlvOwoKICBGSVhQX0RCTCAqUkVTVFJJQ1QgYWFMZWZ0UmVhbDsKICBGSVhQX0RCTCAqUkVTVFJJQ1QgYWFMZWZ0SW1hZzsKCiAgRklYUF9EQkwgKlJFU1RSSUNUIGFhUmlnaHRSZWFsOwogIEZJWFBfREJMICpSRVNUUklDVCBhYVJpZ2h0SW1hZzsKCiAgRklYUF9EQkwgKlJFU1RSSUNUIHBSZWFsRGVsYXlCdWZmZXI7CiAgRklYUF9EQkwgKlJFU1RSSUNUIHBJbWFnRGVsYXlCdWZmZXI7CgogIENfQUxMT0NfU0NSQVRDSF9TVEFSVChhYVBvd2VyU2xvdCwgRklYUF9EQkwsIE5PX01JRF9SRVNfQklOUyk7CiAgQ19BTExPQ19TQ1JBVENIX1NUQVJUKGFhVHJhbnNSYXRpb1Nsb3QsIEZJWFBfREJMLCBOT19NSURfUkVTX0JJTlMpOwoKLyohCjxwcmU+CiAgIHBhcmFtZXRlciBpbmRleCAgICAgICBxbWYgYmFuZHMgICAgICAgICAgICAgaHlicmlkIGJhbmRzCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAwICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgMCw3CiAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAxLDYKICAgICAgICAgMiAgICAgICAgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgIDIKICAgICAgICAgMyAgICAgICAgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgIDMgICAgICAgICAgIEhZQlJJRCBCQU5EUwogICAgICAgICA0ICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgICAgOQogICAgICAgICA1ICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgICAgOAogICAgICAgICA2ICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAgICAgICAxMAogICAgICAgICA3ICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAgICAgICAxMQogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgOCAgICAgICAgICAgICAgICAgICAzCiAgICAgICAgIDkgICAgICAgICAgICAgICAgICAgNAogICAgICAgIDEwICAgICAgICAgICAgICAgICAgIDUKICAgICAgICAxMSAgICAgICAgICAgICAgICAgICA2CiAgICAgICAgMTIgICAgICAgICAgICAgICAgICAgNwogICAgICAgIDEzICAgICAgICAgICAgICAgICAgIDgKICAgICAgICAxNCAgICAgICAgICAgICAgICAgICA5LDEwICAgICAgKDIgKSAgICAgICAgICAgICAgICAgICAgICBRTUYgQkFORFMKICAgICAgICAxNSAgICAgICAgICAgICAgICAgICAxMSAtIDEzICAgKDMgKQogICAgICAgIDE2ICAgICAgICAgICAgICAgICAgIDE0IC0gMTcgICAoNCApCiAgICAgICAgMTcgICAgICAgICAgICAgICAgICAgMTggLSAyMiAgICg1ICkKICAgICAgICAxOCAgICAgICAgICAgICAgICAgICAyMyAtIDM0ICAgKDEyKQogICAgICAgIDE5ICAgICAgICAgICAgICAgICAgIDM1IC0gNjMgICAoMjkpCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQo8L3ByZT4KKi8KCiAgI2RlZmluZSBGTFRSX1NDQUxFIDMKCiAgLyogaHlicmlkIGJhbmRzIChwYXJhbWV0ZXIgaW5kZXggMCAtIDcpICovCiAgYWFMZWZ0UmVhbCAgPSBtSHlicmlkUmVhbExlZnQ7CiAgYWFMZWZ0SW1hZyAgPSBtSHlicmlkSW1hZ0xlZnQ7CgogIGFhUG93ZXJTbG90WzBdID0gKCBmTXVsdEFkZERpdjIoIGZNdWx0RGl2MihhYUxlZnRSZWFsWzBdLCAgYWFMZWZ0UmVhbFswXSksICBhYUxlZnRJbWFnWzBdLCAgYWFMZWZ0SW1hZ1swXSApID4+IEZMVFJfU0NBTEUgKSArCiAgICAgICAgICAgICAgICAgICAoIGZNdWx0QWRkRGl2MiggZk11bHREaXYyKGFhTGVmdFJlYWxbN10sICBhYUxlZnRSZWFsWzddKSwgIGFhTGVmdEltYWdbN10sICBhYUxlZnRJbWFnWzddICkgPj4gRkxUUl9TQ0FMRSApOwoKICBhYVBvd2VyU2xvdFsxXSA9ICggZk11bHRBZGREaXYyKCBmTXVsdERpdjIoYWFMZWZ0UmVhbFsxXSwgIGFhTGVmdFJlYWxbMV0pLCAgYWFMZWZ0SW1hZ1sxXSwgIGFhTGVmdEltYWdbMV0gKSA+PiBGTFRSX1NDQUxFICkgKwogICAgICAgICAgICAgICAgICAgKCBmTXVsdEFkZERpdjIoIGZNdWx0RGl2MihhYUxlZnRSZWFsWzZdLCAgYWFMZWZ0UmVhbFs2XSksICBhYUxlZnRJbWFnWzZdLCAgYWFMZWZ0SW1hZ1s2XSApID4+IEZMVFJfU0NBTEUgKTsKCiAgYWFQb3dlclNsb3RbMl0gPSAgIGZNdWx0QWRkRGl2MiggZk11bHREaXYyKGFhTGVmdFJlYWxbMl0sICBhYUxlZnRSZWFsWzJdKSwgIGFhTGVmdEltYWdbMl0sICBhYUxlZnRJbWFnWzJdICkgPj4gRkxUUl9TQ0FMRTsKICBhYVBvd2VyU2xvdFszXSA9ICAgZk11bHRBZGREaXYyKCBmTXVsdERpdjIoYWFMZWZ0UmVhbFszXSwgIGFhTGVmdFJlYWxbM10pLCAgYWFMZWZ0SW1hZ1szXSwgIGFhTGVmdEltYWdbM10gKSA+PiBGTFRSX1NDQUxFOwoKICBhYVBvd2VyU2xvdFs0XSA9ICAgZk11bHRBZGREaXYyKCBmTXVsdERpdjIoYWFMZWZ0UmVhbFs5XSwgIGFhTGVmdFJlYWxbOV0pLCAgYWFMZWZ0SW1hZ1s5XSwgIGFhTGVmdEltYWdbOV0gKSA+PiBGTFRSX1NDQUxFOwogIGFhUG93ZXJTbG90WzVdID0gICBmTXVsdEFkZERpdjIoIGZNdWx0RGl2MihhYUxlZnRSZWFsWzhdLCAgYWFMZWZ0UmVhbFs4XSksICBhYUxlZnRJbWFnWzhdLCAgYWFMZWZ0SW1hZ1s4XSApID4+IEZMVFJfU0NBTEU7CgogIGFhUG93ZXJTbG90WzZdID0gICBmTXVsdEFkZERpdjIoIGZNdWx0RGl2MihhYUxlZnRSZWFsWzEwXSwgYWFMZWZ0UmVhbFsxMF0pLCBhYUxlZnRJbWFnWzEwXSwgYWFMZWZ0SW1hZ1sxMF0gKSA+PiBGTFRSX1NDQUxFOwogIGFhUG93ZXJTbG90WzddID0gICBmTXVsdEFkZERpdjIoIGZNdWx0RGl2MihhYUxlZnRSZWFsWzExXSwgYWFMZWZ0UmVhbFsxMV0pLCBhYUxlZnRJbWFnWzExXSwgYWFMZWZ0SW1hZ1sxMV0gKSA+PiBGTFRSX1NDQUxFOwoKICAvKiBxbWYgYmFuZHMgKHBhcmFtZXRlciBpbmRleCA4IC0gMTkpICovCiAgZm9yICggYmluID0gODsgYmluIDwgTk9fTUlEX1JFU19CSU5TOyBiaW4rKyApIHsKICAgIEZJWFBfREJMIHNsb3ROcmcgPSBGTDJGWENPTlNUX0RCTCgwLmYpOwoKICAgIGZvciAoIGkgPSBncm91cEJvcmRlcnMyMFtiaW4rMl07IGkgPCBncm91cEJvcmRlcnMyMFtiaW4rM107IGkrKyApIHsgIC8qIG1heCBsb29wczogMjkgKi8KICAgICAgc2xvdE5yZyArPSBmTXVsdEFkZERpdjIgKCBmTXVsdERpdjIockludEJ1ZmZlckxlZnRbaV0sIHJJbnRCdWZmZXJMZWZ0W2ldKSwgaUludEJ1ZmZlckxlZnRbaV0sIGlJbnRCdWZmZXJMZWZ0W2ldKSA+PiBGTFRSX1NDQUxFOwogICAgfQogICAgYWFQb3dlclNsb3RbYmluXSA9IHNsb3ROcmc7CgogIH0KCgogIC8qIGNhbGN1bGF0aW9uIG9mIHRyYW5zaWVudCByYXRpbyAqLwogIGZvciAoYmluPTA7IGJpbiA8IE5PX01JRF9SRVNfQklOUzsgYmluKyspIHsgICAvKiBub0JpbnMgPSAyMCAoIEJBU0VMSU5FX1BTICkgKi8KCiAgICBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5hUGVha0RlY2F5RmFzdEJpbltiaW5dID0gZk11bHQoIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmFQZWFrRGVjYXlGYXN0QmluW2Jpbl0sIFBFQUtfREVDQVlfRkFDVE9SICk7CgogICAgaWYgKGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmFQZWFrRGVjYXlGYXN0QmluW2Jpbl0gPCBhYVBvd2VyU2xvdFtiaW5dKSB7CiAgICAgIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmFQZWFrRGVjYXlGYXN0QmluW2Jpbl0gPSBhYVBvd2VyU2xvdFtiaW5dOwogICAgfQoKICAgIC8qIGNhbGN1bGF0ZSBQU21vb3RoUGVha0RlY2F5RGlmZk5yZyAqLwogICAgcGVha0RpZmYgPSBmTXVsdEFkZCAoIChoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5hUHJldlBlYWtEaWZmQmluW2Jpbl0+PjEpLAogICAgICAgICAgICAgICAgIElOVF9GSUxURVJfQ09FRkYsIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmFQZWFrRGVjYXlGYXN0QmluW2Jpbl0gLSBhYVBvd2VyU2xvdFtiaW5dIC0gaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuYVByZXZQZWFrRGlmZkJpbltiaW5dKTsKCiAgICAvKiBzYXZlIHBlYWtEaWZmIGZvciB0aGUgbmV4dCBmcmFtZSAqLwogICAgaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuYVByZXZQZWFrRGlmZkJpbltiaW5dID0gcGVha0RpZmY7CgogICAgbnJnID0gaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuYVByZXZOcmdCaW5bYmluXSArIGZNdWx0KCBJTlRfRklMVEVSX0NPRUZGLCBhYVBvd2VyU2xvdFtiaW5dIC0gaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuYVByZXZOcmdCaW5bYmluXSApOwoKICAgIC8qIE5lZ2F0aXZlIGVuZXJnaWVzIGRvbid0IGV4aXN0LiBCdXQgc29tZXRpbWVzIHRoZXkgYXBwZWFyIGR1ZSB0byByb3VuZGluZy4gKi8KCiAgICBucmcgPSBmaXhNYXgobnJnLEZMMkZYQ09OU1RfREJMKDAuZikpOwoKICAgIC8qIHNhdmUgbnJnIGZvciB0aGUgbmV4dCBmcmFtZSAqLwogICAgaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuYVByZXZOcmdCaW5bYmluXSA9IG5yZzsKCiAgICBucmcgPSBmTXVsdCggbnJnLCBUUkFOU0lFTlRfSU1QQUNUX0ZBQ1RPUiApOwoKICAgIC8qIHNhdmUgdHJhbnNpZW50IGltcGFjdCBmYWN0b3IgKi8KICAgIGlmICggcGVha0RpZmYgPD0gbnJnIHx8IHBlYWtEaWZmID09IEZMMkZYQ09OU1RfREJMKDAuMCkgKSB7CiAgICAgIGFhVHJhbnNSYXRpb1Nsb3RbYmluXSA9IChGSVhQX0RCTClNQVhWQUxfREJMIC8qIEZMMkZYQ09OU1RfREJMKDEuMGYpKi87CiAgICB9CiAgICBlbHNlIGlmICggbnJnIDw9IEZMMkZYQ09OU1RfREJMKDAuMGYpICkgewogICAgICAgIGFhVHJhbnNSYXRpb1Nsb3RbYmluXSA9IEZMMkZYQ09OU1RfREJMKDAuZik7CiAgICAgIH0KICAgIGVsc2UgewogICAgICAvKiBzY2FsZSB0byBkZW5vbWluYXRvciAqLwogICAgICBJTlQgc2NhbGVfbGVmdCA9IGZpeE1heCgwLCBDbnRMZWFkaW5nWmVyb3MocGVha0RpZmYpIC0gMSk7CiAgICAgIGFhVHJhbnNSYXRpb1Nsb3RbYmluXSA9IHNjaHVyX2RpdiggbnJnPDxzY2FsZV9sZWZ0LCBwZWFrRGlmZjw8c2NhbGVfbGVmdCwgMTYpOwogICAgfQogIH0gLyogYmluICovCgoKCgogICNkZWZpbmUgREVMQVlfR1JPVVBfT0ZGU0VUICAgIDIwCiAgI2RlZmluZSBOUl9PRl9ERUxBWV9HUk9VUFMgICAgIDIKCiAgRklYUF9EQkwgclRtcCwgaVRtcCwgclRtcDAsIGlUbXAwLCByUjAsIGlSMDsKCiAgSU5UIFRlbXBEZWxheSAgICAgPSBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5kZWxheUJ1ZkluZGV4OyAgLyogc2V0IGRlbGF5IGluZGljZXMgKi8KCiAgcFJlYWxEZWxheUJ1ZmZlciA9IGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmFhUmVhbERlbGF5QnVmZmVyU3ViUW1mW1RlbXBEZWxheV07CiAgcEltYWdEZWxheUJ1ZmZlciA9IGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmFhSW1hZ0RlbGF5QnVmZmVyU3ViUW1mW1RlbXBEZWxheV07CgogIGFhTGVmdFJlYWwgID0gbUh5YnJpZFJlYWxMZWZ0OwogIGFhTGVmdEltYWcgID0gbUh5YnJpZEltYWdMZWZ0OwogIGFhUmlnaHRSZWFsID0gbUh5YnJpZFJlYWxSaWdodDsKICBhYVJpZ2h0SW1hZyA9IG1IeWJyaWRJbWFnUmlnaHQ7CgogIC8qKioqKioqKioqKioqKioqKioqKioqKiovCiAgLyogSUNDIGdyb3VwcyA6ICAwIC0gIDkgKi8KICAvKioqKioqKioqKioqKioqKioqKioqKioqLwoKICAvKiBnciA9IElDQyBncm91cHMgKi8KICBmb3IgKGdyPTA7IGdyIDwgU1VCUU1GX0dST1VQUzsgZ3IrKykgewoKICAgIHRyYW5zUmF0aW8gPSBhYVRyYW5zUmF0aW9TbG90W2JpbnMyZ3JvdXBNYXAyMFtncl1dOwoKICAgIC8qIHNiID0gc3ViUU1GL1FNRiBzdWJiYW5kICovCiAgICBzYiA9IGdyb3VwQm9yZGVyczIwW2dyXTsKCiAgICAvKiBVcGRhdGUgZGVsYXkgYnVmZmVycywgc2FtcGxlIGRlbGF5IGFsbHBhc3MgPSAyICovCiAgICByVG1wMCA9IHBSZWFsRGVsYXlCdWZmZXJbc2JdOwogICAgaVRtcDAgPSBwSW1hZ0RlbGF5QnVmZmVyW3NiXTsKCiAgICBwUmVhbERlbGF5QnVmZmVyW3NiXSA9IGFhTGVmdFJlYWxbc2JdOwogICAgcEltYWdEZWxheUJ1ZmZlcltzYl0gPSBhYUxlZnRJbWFnW3NiXTsKCiAgICAvKiBkZWxheSBieSBmcmFjdGlvbiAqLwogICAgY3BseE11bHREaXYyKCZyUjAsICZpUjAsIHJUbXAwLCBpVG1wMCwgYWFGcmFjdERlbGF5UGhhc2VGYWN0b3JSZVN1YlFtZjIwW3NiXSwgYWFGcmFjdERlbGF5UGhhc2VGYWN0b3JJbVN1YlFtZjIwW3NiXSk7CiAgICByUjA8PD0xOwogICAgaVIwPDw9MTsKCiAgICBGSVhQX0RCTCAqcEFhYVJlYWxEZWxheVJCdWZmZXJTZXJTdWJRbWYgPSBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5hYWFSZWFsRGVsYXlSQnVmZmVyU2VyU3ViUW1mW3NiXTsKICAgIEZJWFBfREJMICpwQWFhSW1hZ0RlbGF5UkJ1ZmZlclNlclN1YlFtZiA9IGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmFhYUltYWdEZWxheVJCdWZmZXJTZXJTdWJRbWZbc2JdOwoKICAgIGZvciAobT0wOyBtPE5PX1NFUklBTF9BTExQQVNTX0xJTktTIDsgbSsrKSB7CgogICAgICBJTlQgdG1wRGVsYXlSU2VyID0gaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuYURlbGF5UkJ1ZkluZGV4U2VyW21dOwoKICAgICAgLyogZ2V0IGRlbGF5ZWQgdmFsdWVzIGZyb20gYWNjb3JkaW5nIGJ1ZmZlciA6IG0oMCk9MzsgbSgxKT00OyBtKDIpPTU7ICovCiAgICAgIHJUbXAwID0gcEFhYVJlYWxEZWxheVJCdWZmZXJTZXJTdWJRbWZbdG1wRGVsYXlSU2VyXTsKICAgICAgaVRtcDAgPSBwQWFhSW1hZ0RlbGF5UkJ1ZmZlclNlclN1YlFtZlt0bXBEZWxheVJTZXJdOwoKICAgICAgLyogZGVsYXkgYnkgZnJhY3Rpb24gKi8KICAgICAgY3BseE11bHREaXYyKCZyVG1wLCAmaVRtcCwgclRtcDAsIGlUbXAwLCBhYUZyYWN0RGVsYXlQaGFzZUZhY3RvclNlclJlU3ViUW1mMjBbc2JdW21dLCBhYUZyYWN0RGVsYXlQaGFzZUZhY3RvclNlckltU3ViUW1mMjBbc2JdW21dKTsKCiAgICAgIHJUbXAgPSAoclRtcCAtIGZNdWx0RGl2MihhQWxscGFzc0xpbmtEZWNheVNlclttXSwgclIwKSkgPDwgMTsKICAgICAgaVRtcCA9IChpVG1wIC0gZk11bHREaXYyKGFBbGxwYXNzTGlua0RlY2F5U2VyW21dLCBpUjApKSA8PCAxOwoKICAgICAgcEFhYVJlYWxEZWxheVJCdWZmZXJTZXJTdWJRbWZbdG1wRGVsYXlSU2VyXSA9IHJSMCArIGZNdWx0KGFBbGxwYXNzTGlua0RlY2F5U2VyW21dLCByVG1wKTsKICAgICAgcEFhYUltYWdEZWxheVJCdWZmZXJTZXJTdWJRbWZbdG1wRGVsYXlSU2VyXSA9IGlSMCArIGZNdWx0KGFBbGxwYXNzTGlua0RlY2F5U2VyW21dLCBpVG1wKTsKCiAgICAgIHJSMCA9IHJUbXA7CiAgICAgIGlSMCA9IGlUbXA7CgogICAgICBwQWFhUmVhbERlbGF5UkJ1ZmZlclNlclN1YlFtZiArPSBhQWxscGFzc0xpbmtEZWxheVNlclttXTsKICAgICAgcEFhYUltYWdEZWxheVJCdWZmZXJTZXJTdWJRbWYgKz0gYUFsbHBhc3NMaW5rRGVsYXlTZXJbbV07CgogICAgfSAvKiBtICovCgogICAgLyogZHVjayBpZiBhIHBhc3QgdHJhbnNpZW50IGlzIGZvdW5kICovCiAgICBhYVJpZ2h0UmVhbFtzYl0gPSBmTXVsdCh0cmFuc1JhdGlvLCByUjApOwogICAgYWFSaWdodEltYWdbc2JdID0gZk11bHQodHJhbnNSYXRpbywgaVIwKTsKCiAgfSAvKiBnciAqLwoKCiAgc2NhbGVWYWx1ZXMoIG1IeWJyaWRSZWFsTGVmdCwgIE5PX1NVQl9RTUZfQ0hBTk5FTFMsIC1TQ0FMX0hFQURST09NICk7CiAgc2NhbGVWYWx1ZXMoIG1IeWJyaWRJbWFnTGVmdCwgIE5PX1NVQl9RTUZfQ0hBTk5FTFMsIC1TQ0FMX0hFQURST09NICk7CiAgc2NhbGVWYWx1ZXMoIG1IeWJyaWRSZWFsUmlnaHQsIE5PX1NVQl9RTUZfQ0hBTk5FTFMsIC1TQ0FMX0hFQURST09NICk7CiAgc2NhbGVWYWx1ZXMoIG1IeWJyaWRJbWFnUmlnaHQsIE5PX1NVQl9RTUZfQ0hBTk5FTFMsIC1TQ0FMX0hFQURST09NICk7CgoKICAvKioqKioqKioqKioqKioqKioqKioqKioqLwoKICBhYUxlZnRSZWFsICA9IHJJbnRCdWZmZXJMZWZ0OwogIGFhTGVmdEltYWcgID0gaUludEJ1ZmZlckxlZnQ7CiAgYWFSaWdodFJlYWwgPSBySW50QnVmZmVyUmlnaHQ7CiAgYWFSaWdodEltYWcgPSBpSW50QnVmZmVyUmlnaHQ7CgogIHBSZWFsRGVsYXlCdWZmZXIgPSBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5hYVJlYWxEZWxheUJ1ZmZlclFtZltUZW1wRGVsYXldOwogIHBJbWFnRGVsYXlCdWZmZXIgPSBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5hYUltYWdEZWxheUJ1ZmZlclFtZltUZW1wRGVsYXldOwoKICAvKioqKioqKioqKioqKioqKioqKioqKioqLwogIC8qIElDQyBncm91cHMgOiAxMCAtIDE5ICovCiAgLyoqKioqKioqKioqKioqKioqKioqKioqKi8KCgogIC8qIGdyID0gSUNDIGdyb3VwcyAqLwogIGZvciAoZ3I9U1VCUU1GX0dST1VQUzsgZ3IgPCBOT19JSURfR1JPVVBTIC0gTlJfT0ZfREVMQVlfR1JPVVBTOyBncisrKSB7CgogICAgdHJhbnNSYXRpbyA9IGFhVHJhbnNSYXRpb1Nsb3RbYmluczJncm91cE1hcDIwW2dyXV07CgogICAgLyogc2IgPSBzdWJRTUYvUU1GIHN1YmJhbmQgKi8KICAgIGZvciAoc2IgPSBncm91cEJvcmRlcnMyMFtncl07IHNiIDwgZ3JvdXBCb3JkZXJzMjBbZ3IrMV07IHNiKyspIHsKICAgICAgRklYUF9EQkwgcmVzUiwgcmVzSTsKCiAgICAgIC8qIGRlY2F5U2NhbGVGYWN0b3IgPSAxLjBmICsgZGVjYXlfY3V0b2ZmICogREVDQVlfU0xPUEUgLSBERUNBWV9TTE9QRSAqIHNiOyBERUNBWV9TTE9QRSA9IDAuMDUgKi8KICAgICAgRklYUF9EQkwgZGVjYXlTY2FsZUZhY3RvciA9IGRlY2F5U2NhbGVGYWN0VGFibGVbc2JdOwoKICAgICAgLyogVXBkYXRlIGRlbGF5IGJ1ZmZlcnMsIHNhbXBsZSBkZWxheSBhbGxwYXNzID0gMiAqLwogICAgICByVG1wMCA9IHBSZWFsRGVsYXlCdWZmZXJbc2JdOwogICAgICBpVG1wMCA9IHBJbWFnRGVsYXlCdWZmZXJbc2JdOwoKICAgICAgcFJlYWxEZWxheUJ1ZmZlcltzYl0gPSBhYUxlZnRSZWFsW3NiXTsKICAgICAgcEltYWdEZWxheUJ1ZmZlcltzYl0gPSBhYUxlZnRJbWFnW3NiXTsKCiAgICAgIC8qIGRlbGF5IGJ5IGZyYWN0aW9uICovCiAgICAgIGNwbHhNdWx0RGl2MigmclIwLCAmaVIwLCByVG1wMCwgaVRtcDAsIGFhRnJhY3REZWxheVBoYXNlRmFjdG9yUmVRbWZbc2JdLCBhYUZyYWN0RGVsYXlQaGFzZUZhY3RvckltUW1mW3NiXSk7CiAgICAgIHJSMDw8PTE7CiAgICAgIGlSMDw8PTE7CgogICAgICByZXNSID0gZk11bHQoZGVjYXlTY2FsZUZhY3RvciwgclIwKTsKICAgICAgcmVzSSA9IGZNdWx0KGRlY2F5U2NhbGVGYWN0b3IsIGlSMCk7CgogICAgICBGSVhQX0RCTCAqcEFhYVJlYWxEZWxheVJCdWZmZXJTZXJRbWYgPSBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5hYWFSZWFsRGVsYXlSQnVmZmVyU2VyUW1mW3NiXTsKICAgICAgRklYUF9EQkwgKnBBYWFJbWFnRGVsYXlSQnVmZmVyU2VyUW1mID0gaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuYWFhSW1hZ0RlbGF5UkJ1ZmZlclNlclFtZltzYl07CgogICAgICBmb3IgKG09MDsgbTxOT19TRVJJQUxfQUxMUEFTU19MSU5LUyA7IG0rKykgewoKICAgICAgICBJTlQgdG1wRGVsYXlSU2VyID0gaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuYURlbGF5UkJ1ZkluZGV4U2VyW21dOwoKICAgICAgICAvKiBnZXQgZGVsYXllZCB2YWx1ZXMgZnJvbSBhY2NvcmRpbmcgYnVmZmVyIDogbSgwKT0zOyBtKDEpPTQ7IG0oMik9NTsgKi8KICAgICAgICByVG1wMCA9IHBBYWFSZWFsRGVsYXlSQnVmZmVyU2VyUW1mW3RtcERlbGF5UlNlcl07CiAgICAgICAgaVRtcDAgPSBwQWFhSW1hZ0RlbGF5UkJ1ZmZlclNlclFtZlt0bXBEZWxheVJTZXJdOwoKICAgICAgICAvKiBkZWxheSBieSBmcmFjdGlvbiAqLwogICAgICAgIGNwbHhNdWx0RGl2MigmclRtcCwgJmlUbXAsIHJUbXAwLCBpVG1wMCwgYWFGcmFjdERlbGF5UGhhc2VGYWN0b3JTZXJSZVFtZltzYl1bbV0sIGFhRnJhY3REZWxheVBoYXNlRmFjdG9yU2VySW1RbWZbc2JdW21dKTsKCiAgICAgICAgclRtcCA9IChyVG1wIC0gZk11bHREaXYyKGFBbGxwYXNzTGlua0RlY2F5U2VyW21dLCByZXNSKSk8PDE7CiAgICAgICAgaVRtcCA9IChpVG1wIC0gZk11bHREaXYyKGFBbGxwYXNzTGlua0RlY2F5U2VyW21dLCByZXNJKSk8PDE7CgogICAgICAgIHJlc1IgPSBmTXVsdChkZWNheVNjYWxlRmFjdG9yLCByVG1wKTsKICAgICAgICByZXNJID0gZk11bHQoZGVjYXlTY2FsZUZhY3RvciwgaVRtcCk7CgogICAgICAgIHBBYWFSZWFsRGVsYXlSQnVmZmVyU2VyUW1mW3RtcERlbGF5UlNlcl0gPSByUjAgKyBmTXVsdChhQWxscGFzc0xpbmtEZWNheVNlclttXSwgcmVzUik7CiAgICAgICAgcEFhYUltYWdEZWxheVJCdWZmZXJTZXJRbWZbdG1wRGVsYXlSU2VyXSA9IGlSMCArIGZNdWx0KGFBbGxwYXNzTGlua0RlY2F5U2VyW21dLCByZXNJKTsKCiAgICAgICAgclIwID0gclRtcDsKICAgICAgICBpUjAgPSBpVG1wOwoKICAgICAgICBwQWFhUmVhbERlbGF5UkJ1ZmZlclNlclFtZiArPSBhQWxscGFzc0xpbmtEZWxheVNlclttXTsKICAgICAgICBwQWFhSW1hZ0RlbGF5UkJ1ZmZlclNlclFtZiArPSBhQWxscGFzc0xpbmtEZWxheVNlclttXTsKCiAgICAgIH0gLyogbSAqLwoKICAgICAgLyogZHVjayBpZiBhIHBhc3QgdHJhbnNpZW50IGlzIGZvdW5kICovCiAgICAgIGFhUmlnaHRSZWFsW3NiXSA9IGZNdWx0KHRyYW5zUmF0aW8sIHJSMCk7CiAgICAgIGFhUmlnaHRJbWFnW3NiXSA9IGZNdWx0KHRyYW5zUmF0aW8sIGlSMCk7CgogICAgfSAvKiBzYiAqLwogIH0gLyogZ3IgKi8KCiAgLyoqKioqKioqKioqKioqKioqKioqKioqKi8KICAvKiBJQ0MgZ3JvdXBzIDogMjAsICAyMSAqLwogIC8qKioqKioqKioqKioqKioqKioqKioqKiovCgoKICAvKiBnciA9IElDQyBncm91cHMgKi8KICBmb3IgKGdyPURFTEFZX0dST1VQX09GRlNFVDsgZ3IgPCBOT19JSURfR1JPVVBTOyBncisrKSB7CgogICAgSU5UIHNiU3RhcnQgPSBncm91cEJvcmRlcnMyMFtncl07CiAgICBJTlQgc2JTdG9wICA9IGdyb3VwQm9yZGVyczIwW2dyKzFdOwoKICAgIFVDSEFSICpwRGVsYXlCdWZJZHggPSAmaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuYURlbGF5QnVmSW5kZXhEZWxheVFtZltzYlN0YXJ0LUZJUlNUX0RFTEFZX1NCXTsKCiAgICB0cmFuc1JhdGlvID0gYWFUcmFuc1JhdGlvU2xvdFtiaW5zMmdyb3VwTWFwMjBbZ3JdXTsKCiAgICAvKiBzYiA9IHN1YlFNRi9RTUYgc3ViYmFuZCAqLwogICAgZm9yIChzYiA9IHNiU3RhcnQ7IHNiIDwgc2JTdG9wOyBzYisrKSB7CgogICAgICAvKiBVcGRhdGUgZGVsYXkgYnVmZmVycyAqLwogICAgICByUjAgPSBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5wQWFSZWFsRGVsYXlCdWZmZXJRbWZbKnBEZWxheUJ1ZklkeF1bc2ItRklSU1RfREVMQVlfU0JdOwogICAgICBpUjAgPSBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5wQWFJbWFnRGVsYXlCdWZmZXJRbWZbKnBEZWxheUJ1ZklkeF1bc2ItRklSU1RfREVMQVlfU0JdOwoKICAgICAgaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcucEFhUmVhbERlbGF5QnVmZmVyUW1mWypwRGVsYXlCdWZJZHhdW3NiLUZJUlNUX0RFTEFZX1NCXSA9IGFhTGVmdFJlYWxbc2JdOwogICAgICBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5wQWFJbWFnRGVsYXlCdWZmZXJRbWZbKnBEZWxheUJ1ZklkeF1bc2ItRklSU1RfREVMQVlfU0JdID0gYWFMZWZ0SW1hZ1tzYl07CgogICAgICAvKiBkdWNrIGlmIGEgcGFzdCB0cmFuc2llbnQgaXMgZm91bmQgKi8KICAgICAgYWFSaWdodFJlYWxbc2JdID0gZk11bHQodHJhbnNSYXRpbywgclIwKTsKICAgICAgYWFSaWdodEltYWdbc2JdID0gZk11bHQodHJhbnNSYXRpbywgaVIwKTsKCiAgICAgIGlmICgrKygqcERlbGF5QnVmSWR4KSA+PSBkZWxheUluZGV4UW1mW3NiXSkgewogICAgICAgICpwRGVsYXlCdWZJZHggPSAwOwogICAgICB9CiAgICAgIHBEZWxheUJ1ZklkeCsrOwoKICAgIH0gLyogc2IgKi8KICB9IC8qIGdyICovCgoKICAvKiBVcGRhdGUgZGVsYXkgYnVmZmVyIGluZGV4ICovCiAgaWYgKCsraF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuZGVsYXlCdWZJbmRleCA+PSBOT19TQU1QTEVfREVMQVlfQUxMUEFTUykKICAgIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmRlbGF5QnVmSW5kZXggPSAwOwoKICBmb3IgKG09MDsgbTxOT19TRVJJQUxfQUxMUEFTU19MSU5LUyA7IG0rKykgewogICAgaWYgKCsraF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuYURlbGF5UkJ1ZkluZGV4U2VyW21dID49IGFBbGxwYXNzTGlua0RlbGF5U2VyW21dKQogICAgICBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5hRGVsYXlSQnVmSW5kZXhTZXJbbV0gPSAwOwogIH0KCgogIHNjYWxlVmFsdWVzKCAmckludEJ1ZmZlckxlZnRbTk9fUU1GX0JBTkRTX0hZQlJJRDIwXSwgIE5PX1FNRl9DSEFOTkVMUy1OT19RTUZfQkFORFNfSFlCUklEMjAsIC1TQ0FMX0hFQURST09NICk7CiAgc2NhbGVWYWx1ZXMoICZpSW50QnVmZmVyTGVmdFtOT19RTUZfQkFORFNfSFlCUklEMjBdLCAgTk9fUU1GX0NIQU5ORUxTLU5PX1FNRl9CQU5EU19IWUJSSUQyMCwgLVNDQUxfSEVBRFJPT00gKTsKICBzY2FsZVZhbHVlcyggJnJJbnRCdWZmZXJSaWdodFtOT19RTUZfQkFORFNfSFlCUklEMjBdLCBOT19RTUZfQ0hBTk5FTFMtTk9fUU1GX0JBTkRTX0hZQlJJRDIwLCAtU0NBTF9IRUFEUk9PTSApOwogIHNjYWxlVmFsdWVzKCAmaUludEJ1ZmZlclJpZ2h0W05PX1FNRl9CQU5EU19IWUJSSUQyMF0sIE5PX1FNRl9DSEFOTkVMUy1OT19RTUZfQkFORFNfSFlCUklEMjAsIC1TQ0FMX0hFQURST09NICk7CgogIC8qIGZyZWUgbWVtb3J5IG9uIHNjcmF0Y2ggKi8KICBDX0FMTE9DX1NDUkFUQ0hfRU5EKGFhVHJhbnNSYXRpb1Nsb3QsIEZJWFBfREJMLCBOT19NSURfUkVTX0JJTlMpOwogIENfQUxMT0NfU0NSQVRDSF9FTkQoYWFQb3dlclNsb3QsIEZJWFBfREJMLCBOT19NSURfUkVTX0JJTlMpOwp9CgoKdm9pZCBpbml0U2xvdEJhc2VkUm90YXRpb24oIEhBTkRMRV9QU19ERUMgaF9wc19kLCAvKiE8IHBvaW50ZXIgdG8gdGhlIG1vZHVsZSBzdGF0ZSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVudiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB1c2IKICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgewoKICBJTlQgICAgIGdyb3VwID0gMDsKICBJTlQgICAgIGJpbiA9ICAwOwogIElOVCAgICAgbm9JaWRTdGVwczsKCi8qICBjb25zdCBVQ0hBUiAqcFF1YW50aXplZElJRHM7Ki8KCiAgRklYUF9TR0wgIGludkw7CiAgRklYUF9EQkwgIFNjYWxlTCwgU2NhbGVSOwogIEZJWFBfREJMICBBbHBoYSwgQmV0YTsKICBGSVhQX0RCTCAgaDExciwgaDEyciwgaDIxciwgaDIycjsKCiAgY29uc3QgRklYUF9EQkwgICpQU2NhbGVGYWN0b3JzOwoKICAvKiBPdmVyd3JpdGUgb2xkIHZhbHVlcyBpbiBkZWxheSBidWZmZXJzIHdoZW4gdXBwZXIgc3ViYmFuZCBpcyBoaWdoZXIgdGhhbiBpbiBsYXN0IGZyYW1lICovCiAgaWYgKGVudiA9PSAwKSB7CgogICAgaWYgKCh1c2IgPiBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5sYXN0VXNiKSAmJiBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5sYXN0VXNiKSB7CgogICAgICBJTlQgaSxrLGxlbmd0aDsKCiAgICAgIGZvciAoaT1oX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5sYXN0VXNiIDsgaSA8IEZJUlNUX0RFTEFZX1NCOyBpKyspIHsKICAgICAgICBGREttZW1jbGVhcihoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5hYWFSZWFsRGVsYXlSQnVmZmVyU2VyUW1mW2ldLCBOT19ERUxBWV9MRU5HVEhfVkVDVE9SUypzaXplb2YoRklYUF9EQkwpKTsKICAgICAgICBGREttZW1jbGVhcihoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5hYWFJbWFnRGVsYXlSQnVmZmVyU2VyUW1mW2ldLCBOT19ERUxBWV9MRU5HVEhfVkVDVE9SUypzaXplb2YoRklYUF9EQkwpKTsKICAgICAgfQoKICAgICAgZm9yIChrPTAgOyBrPE5PX1NBTVBMRV9ERUxBWV9BTExQQVNTOyBrKyspIHsKICAgICAgICBGREttZW1jbGVhcihoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5wQWFSZWFsRGVsYXlCdWZmZXJRbWZba10sIEZJUlNUX0RFTEFZX1NCKnNpemVvZihGSVhQX0RCTCkpOwogICAgICB9CiAgICAgIGxlbmd0aCA9ICh1c2ItRklSU1RfREVMQVlfU0IpKnNpemVvZihGSVhQX0RCTCk7CiAgICAgIGlmKGxlbmd0aD4wKSB7CiAgICAgICAgRkRLbWVtY2xlYXIoaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcucEFhUmVhbERlbGF5QnVmZmVyUW1mWzBdLCBsZW5ndGgpOwogICAgICAgIEZES21lbWNsZWFyKGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLnBBYUltYWdEZWxheUJ1ZmZlclFtZlswXSwgbGVuZ3RoKTsKICAgICAgfQogICAgICBsZW5ndGggPSAoZml4TWluKE5PX0RFTEFZX0JVRkZFUl9CQU5EUywoSU5UKXVzYiktRklSU1RfREVMQVlfU0IpKnNpemVvZihGSVhQX0RCTCk7CiAgICAgIGlmKGxlbmd0aD4wKSB7CiAgICAgICAgZm9yIChrPTEgOyBrIDwgaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcubm9TYW1wbGVEZWxheTsgaysrKSB7CiAgICAgICAgICBGREttZW1jbGVhcihoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5wQWFSZWFsRGVsYXlCdWZmZXJRbWZba10sIGxlbmd0aCk7CiAgICAgICAgICBGREttZW1jbGVhcihoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5wQWFJbWFnRGVsYXlCdWZmZXJRbWZba10sIGxlbmd0aCk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5sYXN0VXNiID0gdXNiOwogIH0gLyogZW52ID09IDAgKi8KCiAgaWYgKGhfcHNfZC0+YnNEYXRhW2hfcHNfZC0+cHJvY2Vzc1Nsb3RdLm1wZWcuYkZpbmVJaWRRKQogIHsKICAgIFBTY2FsZUZhY3RvcnMgPSBTY2FsZUZhY3RvcnNGaW5lOyAvKiB2YWx1ZXMgYXJlIHNoaWZ0ZXQgcmlnaHQgYnkgb25lICovCiAgICBub0lpZFN0ZXBzID0gTk9fSUlEX1NURVBTX0ZJTkU7CiAgICAvKnBRdWFudGl6ZWRJSURzID0gcXVhbnRpemVkSUlEc0ZpbmU7Ki8KICB9CgogIGVsc2UKICB7CiAgICBQU2NhbGVGYWN0b3JzID0gU2NhbGVGYWN0b3JzOyAvKiB2YWx1ZXMgYXJlIHNoaWZ0ZXQgcmlnaHQgYnkgb25lICovCiAgICBub0lpZFN0ZXBzID0gTk9fSUlEX1NURVBTOwogICAgLypwUXVhbnRpemVkSUlEcyA9IHF1YW50aXplZElJRHM7Ki8KICB9CgoKICAvKiBkZXF1YW50aXplIGFuZCBkZWNvZGUgKi8KICBmb3IgKCBncm91cCA9IDA7IGdyb3VwIDwgTk9fSUlEX0dST1VQUzsgZ3JvdXArKyApIHsKCiAgICBiaW4gPSBiaW5zMmdyb3VwTWFwMjBbZ3JvdXBdOwoKICAgIC8qIQogICAgPGgzPiB0eXBlICdBJyByb3RhdGlvbiA8L2gzPgogICAgbWl4aW5nIHByb2NlZHVyZSBSX2EsIHVzZWQgaW4gYmFzZWxpbmUgdmVyc2lvbjxicj4KCiAgICAgU2NhbGUtZmFjdG9yIHZlY3RvcnMgYzEgYW5kIGMyIGFyZSBwcmVjYWxjdWxhdGVkIGluIGluaXRQc1RhYmxlcyAoKSBhbmQgc3RvcmVkIGluCiAgICAgc2NhbGVGYWN0b3JzW10gYW5kIHNjYWxlRmFjdG9yc0ZpbmVbXSA9IHBTY2FsZUZhY3RvcnMgW10uCiAgICAgRnJvbSB0aGUgbGluZWFyaXplZCBJSUQgcGFyYW1ldGVycyAoaW50ZW5zaXR5IGRpZmZlcmVuY2VzKSwgdHdvIHNjYWxlIGZhY3RvcnMgYXJlCiAgICAgY2FsY3VsYXRlZC4gVGhleSBhcmUgdXNlZCB0byBvYnRhaW4gdGhlIGNvZWZmaWNpZW50cyBoMTEuLi4gaDIyLgogICAgKi8KCiAgICAvKiBTY2FsZVIgYW5kIFNjYWxlTCBhcmUgc2NhbGVkIGJ5IDEgc2hpZnQgcmlnaHQgKi8KCiAgICBTY2FsZVIgPSBQU2NhbGVGYWN0b3JzW25vSWlkU3RlcHMgKyBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5jb2VmLmFhSWlkSW5kZXhNYXBwZWRbZW52XVtiaW5dXTsKICAgIFNjYWxlTCA9IFBTY2FsZUZhY3RvcnNbbm9JaWRTdGVwcyAtIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmNvZWYuYWFJaWRJbmRleE1hcHBlZFtlbnZdW2Jpbl1dOwoKICAgIEJldGEgICA9IGZNdWx0IChmTXVsdCggQWxwaGFzW2hfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmNvZWYuYWFJY2NJbmRleE1hcHBlZFtlbnZdW2Jpbl1dLCAoIFNjYWxlUiAtIFNjYWxlTCApKSwgRklYUF9TUVJUMDUpOwogICAgQWxwaGEgID0gQWxwaGFzW2hfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmNvZWYuYWFJY2NJbmRleE1hcHBlZFtlbnZdW2Jpbl1dPj4xOwoKICAgIC8qIEFscGhhIGFuZCBCZXRhIGFyZSBub3cgYm90aCBzY2FsZWQgYnkgMiBzaGlmdHMgcmlnaHQgKi8KCiAgICAvKiBjYWxjdWxhdGUgdGhlIGNvZWZmaWNpZW50cyBoMTEuLi4gaDIyIGZyb20gc2NhbGUtZmFjdG9ycyBhbmQgSUNDIHBhcmFtZXRlcnMgKi8KCiAgICAvKiBoIHZhbHVlcyBhcmUgc2NhbGVkIGJ5IDEgc2hpZnQgcmlnaHQgKi8KICAgIHsKICAgICAgRklYUF9EQkwgdHJpZ0RhdGFbNF07CgogICAgICBpbmxpbmVfZml4cF9jb3Nfc2luKEJldGEgKyBBbHBoYSwgQmV0YSAtIEFscGhhLCAyLCB0cmlnRGF0YSk7CiAgICAgIGgxMXIgPSBmTXVsdCggU2NhbGVMLCB0cmlnRGF0YVswXSk7CiAgICAgIGgxMnIgPSBmTXVsdCggU2NhbGVSLCB0cmlnRGF0YVsyXSk7CiAgICAgIGgyMXIgPSBmTXVsdCggU2NhbGVMLCB0cmlnRGF0YVsxXSk7CiAgICAgIGgyMnIgPSBmTXVsdCggU2NhbGVSLCB0cmlnRGF0YVszXSk7CiAgICB9CiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgICAvKiBJbnRlcnBvbGF0aW9uIG9mIHRoZSBtYXRyaWNlcyBIMTEuLi4gSDIyOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAvKiBIMTEoayxuKSA9IEgxMShrLG5bZV0pICsgKG4tbltlXSkgKiAoSDExKGssbltlKzFdIC0gSDExKGssbltlXSkpIC8gKG5bZSsxXSAtIG5bZV0pICAgICovCiAgICAvKiAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgogICAgLyogaW52TCA9IDEvKGxlbmd0aCBvZiBlbnZlbG9wZSkgKi8KICAgIGludkwgPSBGWF9EQkwyRlhfU0dMKEdldEludkludChoX3BzX2QtPmJzRGF0YVtoX3BzX2QtPnByb2Nlc3NTbG90XS5tcGVnLmFFbnZTdGFydFN0b3BbZW52ICsgMV0gLSBoX3BzX2QtPmJzRGF0YVtoX3BzX2QtPnByb2Nlc3NTbG90XS5tcGVnLmFFbnZTdGFydFN0b3BbZW52XSkpOwoKICAgIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmNvZWYuSDExcltncm91cF0gID0gaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuaDExclByZXZbZ3JvdXBdOwogICAgaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuY29lZi5IMTJyW2dyb3VwXSAgPSBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5oMTJyUHJldltncm91cF07CiAgICBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5jb2VmLkgyMXJbZ3JvdXBdICA9IGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmgyMXJQcmV2W2dyb3VwXTsKICAgIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmNvZWYuSDIycltncm91cF0gID0gaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuaDIyclByZXZbZ3JvdXBdOwoKICAgIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmNvZWYuRGVsdGFIMTFyW2dyb3VwXSAgPSBmTXVsdCAoIGgxMXIgLSBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5jb2VmLkgxMXJbZ3JvdXBdLCBpbnZMICk7CiAgICBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5jb2VmLkRlbHRhSDEycltncm91cF0gID0gZk11bHQgKCBoMTJyIC0gaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuY29lZi5IMTJyW2dyb3VwXSwgaW52TCApOwogICAgaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuY29lZi5EZWx0YUgyMXJbZ3JvdXBdICA9IGZNdWx0ICggaDIxciAtIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmNvZWYuSDIxcltncm91cF0sIGludkwgKTsKICAgIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmNvZWYuRGVsdGFIMjJyW2dyb3VwXSAgPSBmTXVsdCAoIGgyMnIgLSBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5jb2VmLkgyMnJbZ3JvdXBdLCBpbnZMICk7CgogICAgLyogdXBkYXRlIHByZXYgY29lZmZpY2llbnRzIGZvciBpbnRlcnBvbGF0aW9uIGluIG5leHQgZW52ZWxvcGUgKi8KCiAgICBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5oMTFyUHJldltncm91cF0gPSBoMTFyOwogICAgaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuaDEyclByZXZbZ3JvdXBdID0gaDEycjsKICAgIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmgyMXJQcmV2W2dyb3VwXSA9IGgyMXI7CiAgICBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5oMjJyUHJldltncm91cF0gPSBoMjJyOwoKICB9IC8qIGdyb3VwIGxvb3AgKi8KfQoKCnN0YXRpYyB2b2lkIGFwcGx5U2xvdEJhc2VkUm90YXRpb24oIEhBTkRMRV9QU19ERUMgaF9wc19kLCAgICAgICAgLyohPCBwb2ludGVyIHRvIHRoZSBtb2R1bGUgc3RhdGUgKi8KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAqbUh5YnJpZFJlYWxMZWZ0LCAgLyohPCBoeWJyaWQgdmFsdWVzIHJlYWwgbGVmdCAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICptSHlicmlkSW1hZ0xlZnQsICAvKiE8IGh5YnJpZCB2YWx1ZXMgaW1hZyBsZWZ0ICAqLwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICpRbWZMZWZ0UmVhbCwgICAgICAvKiE8IHJlYWwgYmFuZHMgbGVmdCBxbWYgY2hhbm5lbCAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgKlFtZkxlZnRJbWFnLCAgICAgIC8qITwgaW1hZyBiYW5kcyBsZWZ0IHFtZiBjaGFubmVsICovCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgKm1IeWJyaWRSZWFsUmlnaHQsIC8qITwgaHlicmlkIHZhbHVlcyByZWFsIHJpZ2h0ICAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgKm1IeWJyaWRJbWFnUmlnaHQsIC8qITwgaHlicmlkIHZhbHVlcyBpbWFnIHJpZ2h0ICAqLwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICpRbWZSaWdodFJlYWwsICAgICAvKiE8IHJlYWwgYmFuZHMgcmlnaHQgcW1mIGNoYW5uZWwgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICpRbWZSaWdodEltYWcgICAgICAvKiE8IGltYWcgYmFuZHMgcmlnaHQgcW1mIGNoYW5uZWwgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCnsKICBJTlQgICAgIGdyb3VwOwogIElOVCAgICAgc3ViYmFuZDsKCiAgRklYUF9EQkwgKlJFU1RSSUNUIEh5YnJMZWZ0UmVhbDsKICBGSVhQX0RCTCAqUkVTVFJJQ1QgSHlickxlZnRJbWFnOwogIEZJWFBfREJMICpSRVNUUklDVCBIeWJyUmlnaHRSZWFsOwogIEZJWFBfREJMICpSRVNUUklDVCBIeWJyUmlnaHRJbWFnOwoKICBGSVhQX0RCTCB0bXBMZWZ0LCB0bXBSaWdodDsKCgogIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogIC8qIQogIDxoMj4gTWFwcGluZyA8L2gyPgoKICBUaGUgbnVtYmVyIG9mIHN0ZXJlbyBiYW5kcyB0aGF0IGlzIGFjdHVhbGx5IHVzZWQgZGVwZW5kcyBvbiB0aGUgbnVtYmVyIG9mIGF2YWlsYmxlCiAgcGFyYW1ldGVycyBmb3IgSUlEIGFuZCBJQ0M6CiAgPHByZT4KICAgbnIuIG9mIElJRCBwYXJhLnwgbnIuIG9mIElDQyBwYXJhLiB8IG5yLiBvZiBTdGVyZW8gYmFuZHMKICAgLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIDEwLDIwICAgICAgICAgfCAgICAgMTAsMjAgICAgICAgIHwgICAgICAgIDIwCiAgICAgMTAsMjAgICAgICAgICB8ICAgICAzNCAgICAgICAgICAgfCAgICAgICAgMzQKICAgICAzNCAgICAgICAgICAgIHwgICAgIDEwLDIwICAgICAgICB8ICAgICAgICAzNAogICAgIDM0ICAgICAgICAgICAgfCAgICAgMzQgICAgICAgICAgIHwgICAgICAgIDM0CiAgPC9wcmU+CiAgSW4gdGhlIGNhc2UgdGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzIGZvciBJSVMgYW5kIElDQyBkaWZmZXJzIGZyb20gdGhlIG51bWJlciBvZiBzdGVyZW8KICBiYW5kcywgYSBtYXBwaW5nIGZyb20gdGhlIGxvd2VyIG51bWJlciB0byB0aGUgaGlnaGVyIG51bWJlciBvZiBwYXJhbWV0ZXJzIGlzIGFwcGxpZWQuCiAgSW5kZXggbWFwcGluZyBvZiBJSUQgYW5kIElDQyBwYXJhbWV0ZXJzIGlzIGFscmVhZHkgZG9uZSBpbiBwc2JpdGRlYy5jcHAuIEZ1cnRoZXIgbWFwcGluZyBpcwogIG5vdCBuZWVkZWQgaGVyZSBpbiBiYXNlbGluZSB2ZXJzaW9uLgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgogIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgLyohCiAgPGgyPiBNaXhpbmcgPC9oMj4KCiAgVG8gZ2VuZXJhdGUgdGhlIFFNRiBzdWJiYW5kIHNpZ25hbHMgZm9yIHRoZSBzdWJiYW5kIHNhbXBsZXMgbiA9IG5bZV0rMSAsLCwgbl9bZSsxXSB0aGUKICBwYXJhbWV0ZXJzIGF0IHBvc2l0aW9uIG5bZV0gYW5kIG5bZSsxXSBhcmUgcmVxdWlyZWQgYXMgd2VsbCBhcyB0aGUgc3ViYmFuZCBkb21haW4gc2lnbmFscwogIHNfayhuKSBhbmQgZF9rKG4pIGZvciBuID0gbltlXSsxLi4uIG5fW2UrMV0uIG5bZV0gcmVwcmVzZW50cyB0aGUgc3RhcnQgcG9zaXRpb24gZm9yCiAgZW52ZWxvcGUgZS4gVGhlIGJvcmRlciBwb3NpdGlvbnMgbltlXSBhcmUgaGFuZGxlZCBpbiBEZWNvZGVQUygpLgoKICBUaGUgc3RlcmVvIHN1YiBzdWJiYW5kIHNpZ25hbHMgYXJlIGNvbnN0cnVjdGVkIGFzOgogIDxwcmU+CiAgbF9rKG4pID0gSDExKGssbikgc19rKG4pICsgSDIxKGssbikgZF9rKG4pCiAgcl9rKG4pID0gSDIxKGssbikgc19rKG4pICsgSDIyKGssbikgZF9rKG4pCiAgPC9wcmU+CiAgSW4gb3JkZXIgdG8gb2J0YWluIHRoZSBtYXRyaWNlcyBIMTEoayxuKS4uLiBIMjIgKGssbiksIHRoZSB2ZWN0b3JzIGgxMShiKS4uLiBoMjIoYikgbmVlZCB0bwogIGJlIGNhbGN1bGF0ZWQgZmlyc3QgKGI6IHBhcmFtZXRlciBpbmRleCkuIERlcGVuZGluZyBvbiBJQ0MgbW9kZSBlaXRoZXIgbWl4aW5nIHByb2NlZHVyZSBSX2EKICBvciBSX2IgaXMgdXNlZCBmb3IgdGhhdC4gRm9yIGJvdGggcHJvY2VkdXJlcywgdGhlIHBhcmFtZXRlcnMgZm9yIHBhcmFtZXRlciBwb3NpdGlvbiBuW2UrMV0KICBpcyB1c2VkLgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCgogIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgLyohCiAgPGgyPlBoYXNlIHBhcmFtZXRlcnMgPC9oMj4KICBXaXRoIGRpc2FibGVkIHBoYXNlIHBhcmFtZXRlcnMgKHdoaWNoIGlzIHRoZSBjYXNlIGluIGJhc2VsaW5lIHZlcnNpb24pLCB0aGUgSC1tYXRyaWNlcyBhcmUKICBqdXN0IGNhbGN1bGF0ZWQgYnk6CgogIDxwcmU+CiAgSDExKGssbltlKzFdID0gaDExKGIoaykpCiAgKC4uLikKICBiKGspOiBwYXJhbWV0ZXIgaW5kZXggYWNjb3JkaW5nIHRvIG1hcHBpbmcgdGFibGUKICA8L3ByZT4KCiAgPGgyPlByb2Nlc3Npbmcgb2YgdGhlIHNhbXBsZXMgaW4gdGhlIHN1YiBzdWJiYW5kcyA8L2gyPgogIHRoaXMgbG9vcCBpbmNsdWRlcyB0aGUgaW50ZXJwb2xhdGlvbiBvZiB0aGUgY29lZmZpY2llbnRzIEh4eAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCgogIC8qIGxvb3AgdGhydSBhbGwgZ3JvdXBzIC4uLiAqLwogIEh5YnJMZWZ0UmVhbCAgPSBtSHlicmlkUmVhbExlZnQ7CiAgSHlickxlZnRJbWFnICA9IG1IeWJyaWRJbWFnTGVmdDsKICBIeWJyUmlnaHRSZWFsID0gbUh5YnJpZFJlYWxSaWdodDsKICBIeWJyUmlnaHRJbWFnID0gbUh5YnJpZEltYWdSaWdodDsKCiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICAvKiBjb25zdHJ1Y3Qgc3RlcmVvIHN1YiBzdWJiYW5kIHNpZ25hbHMgYWNjb3JkaW5nIHRvOiAqLwogIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgLyogbF9rKG4pID0gSDExKGssbikgc19rKG4pICsgSDIxKGssbikgZF9rKG4pICAgICAgICAgKi8KICAvKiByX2sobikgPSBIMTIoayxuKSBzX2sobikgKyBIMjIoayxuKSBkX2sobikgICAgICAgICAqLwogIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgZm9yICggZ3JvdXAgPSAwOyBncm91cCA8IFNVQlFNRl9HUk9VUFM7IGdyb3VwKysgKSB7CgogICAgaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuY29lZi5IMTFyW2dyb3VwXSArPSBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5jb2VmLkRlbHRhSDExcltncm91cF07CiAgICBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5jb2VmLkgxMnJbZ3JvdXBdICs9IGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmNvZWYuRGVsdGFIMTJyW2dyb3VwXTsKICAgIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmNvZWYuSDIxcltncm91cF0gKz0gaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuY29lZi5EZWx0YUgyMXJbZ3JvdXBdOwogICAgaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuY29lZi5IMjJyW2dyb3VwXSArPSBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5jb2VmLkRlbHRhSDIycltncm91cF07CgogICAgc3ViYmFuZCA9IGdyb3VwQm9yZGVyczIwW2dyb3VwXTsKCiAgICB0bXBMZWZ0ICA9IGZNdWx0QWRkRGl2MiggZk11bHREaXYyKGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmNvZWYuSDExcltncm91cF0sIEh5YnJMZWZ0UmVhbFtzdWJiYW5kXSksIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmNvZWYuSDIxcltncm91cF0sIEh5YnJSaWdodFJlYWxbc3ViYmFuZF0pOwogICAgdG1wUmlnaHQgPSBmTXVsdEFkZERpdjIoIGZNdWx0RGl2MihoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5jb2VmLkgxMnJbZ3JvdXBdLCBIeWJyTGVmdFJlYWxbc3ViYmFuZF0pLCBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5jb2VmLkgyMnJbZ3JvdXBdLCBIeWJyUmlnaHRSZWFsW3N1YmJhbmRdKTsKICAgIEh5YnJMZWZ0UmVhbCBbc3ViYmFuZF0gPSB0bXBMZWZ0PDwxOwogICAgSHliclJpZ2h0UmVhbFtzdWJiYW5kXSA9IHRtcFJpZ2h0PDwxOwoKICAgIHRtcExlZnQgID0gZk11bHRBZGQoIGZNdWx0RGl2MihoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5jb2VmLkgxMXJbZ3JvdXBdLCBIeWJyTGVmdEltYWdbc3ViYmFuZF0pLCBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5jb2VmLkgyMXJbZ3JvdXBdLCBIeWJyUmlnaHRJbWFnW3N1YmJhbmRdKTsKICAgIHRtcFJpZ2h0ID0gZk11bHRBZGQoIGZNdWx0RGl2MihoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5jb2VmLkgxMnJbZ3JvdXBdLCBIeWJyTGVmdEltYWdbc3ViYmFuZF0pLCBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5jb2VmLkgyMnJbZ3JvdXBdLCBIeWJyUmlnaHRJbWFnW3N1YmJhbmRdKTsKICAgIEh5YnJMZWZ0SW1hZyBbc3ViYmFuZF0gPSB0bXBMZWZ0OwogICAgSHliclJpZ2h0SW1hZ1tzdWJiYW5kXSA9IHRtcFJpZ2h0OwogIH0KCiAgLyogY29udGludWUgaW4gdGhlIHFtZiBidWZmZXJzICovCiAgSHlickxlZnRSZWFsICA9IFFtZkxlZnRSZWFsOwogIEh5YnJMZWZ0SW1hZyAgPSBRbWZMZWZ0SW1hZzsKICBIeWJyUmlnaHRSZWFsID0gUW1mUmlnaHRSZWFsOwogIEh5YnJSaWdodEltYWcgPSBRbWZSaWdodEltYWc7CgogIGZvciAoOyBncm91cCA8IE5PX0lJRF9HUk9VUFM7IGdyb3VwKysgKSB7CgogICAgaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuY29lZi5IMTFyW2dyb3VwXSArPSBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5jb2VmLkRlbHRhSDExcltncm91cF07CiAgICBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5jb2VmLkgxMnJbZ3JvdXBdICs9IGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmNvZWYuRGVsdGFIMTJyW2dyb3VwXTsKICAgIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmNvZWYuSDIxcltncm91cF0gKz0gaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuY29lZi5EZWx0YUgyMXJbZ3JvdXBdOwogICAgaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuY29lZi5IMjJyW2dyb3VwXSArPSBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5jb2VmLkRlbHRhSDIycltncm91cF07CgogICAgZm9yICggc3ViYmFuZCA9IGdyb3VwQm9yZGVyczIwW2dyb3VwXTsgc3ViYmFuZCA8IGdyb3VwQm9yZGVyczIwW2dyb3VwICsgMV07IHN1YmJhbmQrKyApCiAgICB7CiAgICAgIHRtcExlZnQgID0gZk11bHRBZGQoIGZNdWx0RGl2MihoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5jb2VmLkgxMXJbZ3JvdXBdLCBIeWJyTGVmdFJlYWxbc3ViYmFuZF0pLCBoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5jb2VmLkgyMXJbZ3JvdXBdLCBIeWJyUmlnaHRSZWFsW3N1YmJhbmRdKTsKICAgICAgdG1wUmlnaHQgPSBmTXVsdEFkZCggZk11bHREaXYyKGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmNvZWYuSDEycltncm91cF0sIEh5YnJMZWZ0UmVhbFtzdWJiYW5kXSksIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmNvZWYuSDIycltncm91cF0sIEh5YnJSaWdodFJlYWxbc3ViYmFuZF0pOwogICAgICBIeWJyTGVmdFJlYWwgW3N1YmJhbmRdID0gdG1wTGVmdDsKICAgICAgSHliclJpZ2h0UmVhbFtzdWJiYW5kXSA9IHRtcFJpZ2h0OwoKICAgICAgdG1wTGVmdCAgPSBmTXVsdEFkZCggZk11bHREaXYyKGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmNvZWYuSDExcltncm91cF0sIEh5YnJMZWZ0SW1hZ1tzdWJiYW5kXSksIGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmNvZWYuSDIxcltncm91cF0sIEh5YnJSaWdodEltYWdbc3ViYmFuZF0pOwogICAgICB0bXBSaWdodCA9IGZNdWx0QWRkKCBmTXVsdERpdjIoaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuY29lZi5IMTJyW2dyb3VwXSwgSHlickxlZnRJbWFnW3N1YmJhbmRdKSwgaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuY29lZi5IMjJyW2dyb3VwXSwgSHliclJpZ2h0SW1hZ1tzdWJiYW5kXSk7CiAgICAgIEh5YnJMZWZ0SW1hZyBbc3ViYmFuZF0gPSB0bXBMZWZ0OwogICAgICBIeWJyUmlnaHRJbWFnW3N1YmJhbmRdID0gdG1wUmlnaHQ7CgogICAgfSAvKiBzdWJiYW5kICovCiAgfQp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyohCiAgXGJyaWVmICBBcHBsaWVzIElJRCwgSUNDLCBJUEQgYW5kIE9QRCBwYXJhbWV0ZXJzIHRvIHRoZSBjdXJyZW50IGZyYW1lLgoKICBccmV0dXJuIG5vbmUKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnZvaWQKQXBwbHlQc1Nsb3QoIEhBTkRMRV9QU19ERUMgaF9wc19kLCAgICAgICAgIC8qITwgaGFuZGxlIFBTX0RFQyovCiAgICAgICAgICAgICBGSVhQX0RCTCAgKipySW50QnVmZmVyTGVmdCwgICAvKiE8IHJlYWwgYmFuZHMgbGVmdCBxbWYgY2hhbm5lbCAoMzh4NjQpICAqLwogICAgICAgICAgICAgRklYUF9EQkwgICoqaUludEJ1ZmZlckxlZnQsICAgLyohPCBpbWFnIGJhbmRzIGxlZnQgcW1mIGNoYW5uZWwgKDM4eDY0KSAgKi8KICAgICAgICAgICAgIEZJWFBfREJMICAqckludEJ1ZmZlclJpZ2h0LCAgIC8qITwgcmVhbCBiYW5kcyByaWdodCBxbWYgY2hhbm5lbCAoMzh4NjQpICovCiAgICAgICAgICAgICBGSVhQX0RCTCAgKmlJbnRCdWZmZXJSaWdodCAgICAvKiE8IGltYWcgYmFuZHMgcmlnaHQgcW1mIGNoYW5uZWwgKDM4eDY0KSAqLwogICAgICAgICAgICkKewoKICAvKiEKICBUaGUgNjQtYmFuZCBRTUYgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vbmF1cmFsIHNpZ25hbCBnZW5lcmF0ZWQgYnkgdGhlIFNCUiB0b29sCiAgaXMgdXNlZCBhcyBpbnB1dCBvZiB0aGUgUFMgdG9vbC4gQWZ0ZXIgdGhlIFBTIHByb2Nlc3NpbmcsIHRoZSBvdXRwdXRzIG9mIHRoZSBsZWZ0CiAgYW5kIHJpZ2h0IGh5YnJpZCBzeW50aGVzaXMgZmlsdGVyYmFua3MgYXJlIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIHN0ZXJlbyBvdXRwdXQKICBzaWduYWwuCgogIDxwcmU+CgogICAgICAgICAgICAgLS0tLS0tLS0tLS0tLSAgICAgICAgICAgIC0tLS0tLS0tLS0gICAgICAgICAgICAtLS0tLS0tLS0tLS0tCiAgICAgICAgICAgIHwgSHlicmlkICAgICAgfCBNX25bayxtXSB8ICAgICAgICAgIHwgTF9uW2ssbV0gfCBIeWJyaWQgICAgICB8IGxbbl0KICAgbVtuXSAtLS0+fCBhbmFseXNpcyAgICB8LS0tLS0tLS0tPnwgICAgICAgICAgfC0tLS0tLS0tLT58IHN5bnRoZXNpcyAgIHwtLS0tLT4KICAgICAgICAgICAgfCBmaWx0ZXIgYmFuayB8ICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8IGZpbHRlciBiYW5rIHwKICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0gICAgICAgICAgIHwgU3RlcmVvICAgfCAgICAgICAgICAgLS0tLS0tLS0tLS0tLQogICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgfCByZWNvbi0gICB8CiAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICB8IHN0dWN0aW9uIHwKICAgICAgICAgICAgICAgICAgXHwvICAgICAgICAgICAgICAgIHwgICAgICAgICAgfAogICAgICAgICAgICAgLS0tLS0tLS0tLS0tLSAgICAgICAgICAgfCAgICAgICAgICB8CiAgICAgICAgICAgIHwgRGUtICAgICAgICAgfCBEX25bayxtXSB8ICAgICAgICAgIHwKICAgICAgICAgICAgfCBjb3JyZWxhdGlvbiB8LS0tLS0tLS0tPnwgICAgICAgICAgfAogICAgICAgICAgICAgLS0tLS0tLS0tLS0tLSAgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgICAtLS0tLS0tLS0tLS0tCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgIHwgUl9uW2ssbV0gfCBIeWJyaWQgICAgICB8IHJbbl0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgfC0tLS0tLS0tLT58IHN5bnRoZXNpcyAgIHwtLS0tLT4KICAgSUlELCBJQ0MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPnwgICAgICAgICAgfCAgICAgICAgICB8IGZpbHRlciBiYW5rIHwKICAoSVBELCBPUEQpICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tICAgICAgICAgICAgLS0tLS0tLS0tLS0tLQoKICBtW25dOiAgICAgIFFNRiByZXByZXNhbnRhdGlvbiBvZiB0aGUgbW9ubyBpbnB1dAogIE1fbltrLG1dOiAgKHN1Yi0pc3ViLWJhbmQgZG9tYWluIHNpZ25hbHMgb2YgdGhlIG1vbm8gaW5wdXQKICBEX25bayxtXTogIGRlY29ycmVsYXRlZCAoc3ViLSlzdWItYmFuZCBkb21haW4gc2lnbmFscwogIExfbltrLG1dOiAgKHN1Yi0pc3ViLWJhbmQgZG9tYWluIHNpZ25hbHMgb2YgdGhlIGxlZnQgb3V0cHV0CiAgUl9uW2ssbV06ICAoc3ViLSlzdWItYmFuZCBkb21haW4gc2lnbmFscyBvZiB0aGUgcmlnaHQgb3V0cHV0CiAgbFtuXSxyW25dOiBsZWZ0L3JpZ2h0IG91dHB1dCBzaWduYWxzCgogIDwvcHJlPgogICovCgogIC8qIGdldCB0ZW1wb3JhcnkgaHlicmlkIHFtZiB2YWx1ZXMgb2Ygb25lIHRpbWVzbG90ICovCiAgQ19BTExPQ19TQ1JBVENIX1NUQVJUKGh5YnJpZFJlYWxMZWZ0LCBGSVhQX0RCTCwgTk9fU1VCX1FNRl9DSEFOTkVMUyk7CiAgQ19BTExPQ19TQ1JBVENIX1NUQVJUKGh5YnJpZEltYWdMZWZ0LCBGSVhQX0RCTCwgTk9fU1VCX1FNRl9DSEFOTkVMUyk7CiAgQ19BTExPQ19TQ1JBVENIX1NUQVJUKGh5YnJpZFJlYWxSaWdodCwgRklYUF9EQkwsIE5PX1NVQl9RTUZfQ0hBTk5FTFMpOwogIENfQUxMT0NfU0NSQVRDSF9TVEFSVChoeWJyaWRJbWFnUmlnaHQsIEZJWFBfREJMLCBOT19TVUJfUU1GX0NIQU5ORUxTKTsKCiAgU0NIQVIgc2ZfSW50QnVmZmVyICAgICA9IGhfcHNfZC0+c2ZfSW50QnVmZmVyOwoKICAvKiBjbGVhciB3b3JrYnVmZmVyICovCiAgRkRLbWVtY2xlYXIoaHlicmlkUmVhbExlZnQsICBOT19TVUJfUU1GX0NIQU5ORUxTKnNpemVvZihGSVhQX0RCTCkpOwogIEZES21lbWNsZWFyKGh5YnJpZEltYWdMZWZ0LCAgTk9fU1VCX1FNRl9DSEFOTkVMUypzaXplb2YoRklYUF9EQkwpKTsKICBGREttZW1jbGVhcihoeWJyaWRSZWFsUmlnaHQsIE5PX1NVQl9RTUZfQ0hBTk5FTFMqc2l6ZW9mKEZJWFBfREJMKSk7CiAgRkRLbWVtY2xlYXIoaHlicmlkSW1hZ1JpZ2h0LCBOT19TVUJfUU1GX0NIQU5ORUxTKnNpemVvZihGSVhQX0RCTCkpOwoKCiAgLyohCiAgSHlicmlkIGFuYWx5c2lzIGZpbHRlcmJhbms6CiAgVGhlIGxvd2VyIDMgKDUpIG9mIHRoZSA2NCBRTUYgc3ViYmFuZHMgYXJlIGZ1cnRoZXIgc3BsaXQgdG8gcHJvdmlkZSBiZXR0ZXIgZnJlcXVlbmN5IHJlc29sdXRpb24uCiAgZm9yIFBTIHByb2Nlc3NpbmcuCiAgRm9yIHRoZSAxMCBhbmQgMjAgc3RlcmVvIGJhbmRzIGNvbmZpZ3VyYXRpb24sIHRoZSBRTUYgYmFuZCBIXzAodykgaXMgc3BsaXQKICB1cCBpbnRvIDggKHN1Yi0pIHN1Yi1iYW5kcyBhbmQgdGhlIFFNRiBiYW5kcyBIXzEodykgYW5kIEhfMih3KSBhcmUgc3BpdCBpbnRvIDIgKHN1Yi0pCiAgNHRoLiAoU2VlIGZpZ3VyZXMgOC4yMCBhbmQgOC4yMiBvZiBJU08vSUVDIDE0NDk2LTM6MjAwMS9GREFNIDI6MjAwNChFKSApCiAgKi8KCgogIGlmIChoX3BzX2QtPnByb2NGcmFtZUJhc2VkID09IDEpICAgIC8qIElmIHdlIGhhdmUgc3dpdGNoZWQgZnJvbSBmcmFtZSB0byBzbG90IGJhc2VkIHByb2Nlc3NpbmcgICovCiAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZmlsbCBoeWJyaWQgZGVsYXkgYnVmZmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgIGhfcHNfZC0+cHJvY0ZyYW1lQmFzZWQgPSAwOwoKICAgIGZpbGxIeWJyaWREZWxheUxpbmUoIHJJbnRCdWZmZXJMZWZ0LAogICAgICAgICAgICAgICAgICAgICAgICAgaUludEJ1ZmZlckxlZnQsCiAgICAgICAgICAgICAgICAgICAgICAgICBoeWJyaWRSZWFsTGVmdCwKICAgICAgICAgICAgICAgICAgICAgICAgIGh5YnJpZEltYWdMZWZ0LAogICAgICAgICAgICAgICAgICAgICAgICAgaHlicmlkUmVhbFJpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgaHlicmlkSW1hZ1JpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAmaF9wc19kLT5zcGVjaWZpY1RvLm1wZWcuaHlicmlkICk7CiAgfQoKICBzbG90QmFzZWRIeWJyaWRBbmFseXNpcyAoIHJJbnRCdWZmZXJMZWZ0W0hZQlJJRF9GSUxURVJfREVMQVldLCAvKiBxbWYgZmlsdGVyYmFuayB2YWx1ZXMgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlJbnRCdWZmZXJMZWZ0W0hZQlJJRF9GSUxURVJfREVMQVldLCAvKiBxbWYgZmlsdGVyYmFuayB2YWx1ZXMgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh5YnJpZFJlYWxMZWZ0LCAgICAgICAgICAgICAgICAgICAgICAvKiBoeWJyaWQgZmlsdGVyYmFuayB2YWx1ZXMgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh5YnJpZEltYWdMZWZ0LCAgICAgICAgICAgICAgICAgICAgICAvKiBoeWJyaWQgZmlsdGVyYmFuayB2YWx1ZXMgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmh5YnJpZCk7ICAgICAgICAgIC8qIGh5YnJpZCBmaWx0ZXJiYW5rIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAqLwoKCiAgU0NIQVIgaHlicmlkU2NhbCA9IGhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmh5YnJpZC5zZl9tUW1mQnVmZmVyOwoKCiAgLyohCiAgRGVjb3JyZWxhdGlvbjoKICBCeSBtZWFucyBvZiBhbGwtcGFzcyBmaWx0ZXJpbmcgYW5kIGRlbGF5aW5nLCB0aGUgKHN1Yi0pc3ViLWJhbmQgc2FtcGxlcyBzX2sobikgYXJlCiAgY29udmVydGVkIGludG8gZGUtY29ycmVsYXRlZCAoc3ViLSlzdWItYmFuZCBzYW1wbGVzIGRfayhuKS4KICAtIGs6IGZyZXF1ZW5jeSBpbiBoeWJyaWQgc3BlY3RydW0KICAtIG46IHRpbWUgaW5kZXgKICAqLwoKICBkZUNvcnJlbGF0ZVNsb3RCYXNlZCggaF9wc19kLCAgICAgICAgICAgICAgLyogcGFyYW1ldHJpYyBzdGVyZW8gZGVjb2RlciBoYW5kbGUgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgaHlicmlkUmVhbExlZnQsICAgICAgLyogbGVmdCBoeWJyaWQgdGltZSBzbG90ICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgaHlicmlkSW1hZ0xlZnQsCiAgICAgICAgICAgICAgICAgICAgICAgIGh5YnJpZFNjYWwsICAgICAgLyogc2NhbGUgZmFjdG9yIG9mIGxlZnQgaHlicmlkIHRpbWUgc2xvdCAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgckludEJ1ZmZlckxlZnRbMF0sICAgLyogbGVmdCBxbWYgdGltZSBzbG90ICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgaUludEJ1ZmZlckxlZnRbMF0sCiAgICAgICAgICAgICAgICAgICAgICAgIHNmX0ludEJ1ZmZlciwgICAgICAgIC8qIHNjYWxlIGZhY3RvciBvZiBsZWZ0IGFuZCByaWdodCBxbWYgdGltZSBzbG90ICovCiAgICAgICAgICAgICAgICAgICAgICAgIGh5YnJpZFJlYWxSaWdodCwgICAgIC8qIHJpZ2h0IGh5YnJpZCB0aW1lIHNsb3QgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgICAgIGh5YnJpZEltYWdSaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgckludEJ1ZmZlclJpZ2h0LCAgICAgLyogcmlnaHQgcW1mIHRpbWUgc2xvdCAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgaUludEJ1ZmZlclJpZ2h0ICk7CgoKCiAgLyohCiAgU3RlcmVvIFByb2Nlc3Npbmc6CiAgVGhlIHNldHMgb2YgKHN1Yi0pc3ViLWJhbmQgc2FtcGxlcyBzX2sobikgYW5kIGRfayhuKSBhcmUgcHJvY2Vzc2VkIGFjY29yZGluZyB0bwogIHRoZSBzdGVyZW8gY3VlcyB3aGljaCBhcmUgZGVmaW5lZCBwZXIgc3RlcmVvIGJhbmQuCiAgKi8KCgogIGFwcGx5U2xvdEJhc2VkUm90YXRpb24oIGhfcHNfZCwgICAgICAgICAgICAvKiBwYXJhbWV0cmljIHN0ZXJlbyBkZWNvZGVyIGhhbmRsZSAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgICAgIGh5YnJpZFJlYWxMZWZ0LCAgICAvKiBsZWZ0IGh5YnJpZCB0aW1lIHNsb3QgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgICAgIGh5YnJpZEltYWdMZWZ0LAogICAgICAgICAgICAgICAgICAgICAgICAgIHJJbnRCdWZmZXJMZWZ0WzBdLCAvKiBsZWZ0IHFtZiB0aW1lIHNsb3QgICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgICAgIGlJbnRCdWZmZXJMZWZ0WzBdLAogICAgICAgICAgICAgICAgICAgICAgICAgIGh5YnJpZFJlYWxSaWdodCwgICAvKiByaWdodCBoeWJyaWQgdGltZSBzbG90ICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgICAgIGh5YnJpZEltYWdSaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICBySW50QnVmZmVyUmlnaHQsICAgLyogcmlnaHQgcW1mIHRpbWUgc2xvdCAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICBpSW50QnVmZmVyUmlnaHQgKTsKCgoKCiAgLyohCiAgSHlicmlkIHN5bnRoZXNpcyBmaWx0ZXJiYW5rOgogIFRoZSBzdGVyZW8gcHJvY2Vzc2VkIGh5YnJpZCBzdWJiYW5kIHNpZ25hbHMgbF9rKG4pIGFuZCByX2sobikgYXJlIGZlZCBpbnRvIHRoZSBoeWJyaWQgc3ludGhlc2lzCiAgZmlsdGVyYmFua3Mgd2hpY2ggYXJlIGlkZW50aWNhbCB0byB0aGUgNjQgY29tcGxleCBzeW50aGVzaXMgZmlsdGVyYmFuayBvZiB0aGUgU0JSIHRvb2wuIFRoZQogIGlucHV0IHRvIHRoZSBmaWx0ZXJiYW5rIGFyZSBzbG90cyBvZiA2NCBRTUYgc2FtcGxlcy4gRm9yIGVhY2ggc2xvdCB0aGUgZmlsdGVyYmFuayBvdXRwdXRzIG9uZQogIGJsb2NrIG9mIDY0IHNhbXBsZXMgb2Ygb25lIHJlY29uc3RydWN0ZWQgc3RlcmVvIGNoYW5uZWwuIFRoZSBoeWJyaWQgc3ludGhlc2lzIGZpbHRlcmJhbmsgaXMKICBjb21wdXRlZCBzZXBlcmF0bHkgZm9yIHRoZSBsZWZ0IGFuZCByaWdodCBjaGFubmVsLgogICovCgoKICAvKiBsZWZ0IGNoYW5uZWwgKi8KICBzbG90QmFzZWRIeWJyaWRTeW50aGVzaXMgKCBoeWJyaWRSZWFsTGVmdCwgICAgICAgICAvKiBvbmUgdGltZXNsb3Qgb2YgaHlicmlkIGZpbHRlcmJhbmsgdmFsdWVzICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHlicmlkSW1hZ0xlZnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgckludEJ1ZmZlckxlZnRbMF0sICAgICAgLyogb25lIHRpbWVzbG90IG9mIHFtZiBmaWx0ZXJiYW5rIHZhbHVlcyAgICAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlJbnRCdWZmZXJMZWZ0WzBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhfcHNfZC0+c3BlY2lmaWNUby5tcGVnLmh5YnJpZCApOyAgICAgIC8qIGh5YnJpZCBmaWx0ZXJiYW5rIGhhbmRsZSAgICAgICAgICAgICAgICAgKi8KCiAgLyogcmlnaHQgY2hhbm5lbCAqLwogIHNsb3RCYXNlZEh5YnJpZFN5bnRoZXNpcyAoIGh5YnJpZFJlYWxSaWdodCwgICAgICAgIC8qIG9uZSB0aW1lc2xvdCBvZiBoeWJyaWQgZmlsdGVyYmFuayB2YWx1ZXMgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoeWJyaWRJbWFnUmlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgckludEJ1ZmZlclJpZ2h0LCAgICAgICAgLyogb25lIHRpbWVzbG90IG9mIHFtZiBmaWx0ZXJiYW5rIHZhbHVlcyAgICAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlJbnRCdWZmZXJSaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoX3BzX2QtPnNwZWNpZmljVG8ubXBlZy5oeWJyaWQgKTsgICAgICAvKiBoeWJyaWQgZmlsdGVyYmFuayBoYW5kbGUgICAgICAgICAgICAgICAgICovCgoKCgoKCgogIC8qIGZyZWUgdGVtcG9yYXJ5IGh5YnJpZCBxbWYgdmFsdWVzIG9mIG9uZSB0aW1lc2xvdCAqLwogIENfQUxMT0NfU0NSQVRDSF9FTkQoaHlicmlkSW1hZ1JpZ2h0LCBGSVhQX0RCTCwgTk9fU1VCX1FNRl9DSEFOTkVMUyk7CiAgQ19BTExPQ19TQ1JBVENIX0VORChoeWJyaWRSZWFsUmlnaHQsIEZJWFBfREJMLCBOT19TVUJfUU1GX0NIQU5ORUxTKTsKICBDX0FMTE9DX1NDUkFUQ0hfRU5EKGh5YnJpZEltYWdMZWZ0LCBGSVhQX0RCTCwgTk9fU1VCX1FNRl9DSEFOTkVMUyk7CiAgQ19BTExPQ19TQ1JBVENIX0VORChoeWJyaWRSZWFsTGVmdCwgRklYUF9EQkwsIE5PX1NVQl9RTUZfQ0hBTk5FTFMpOwoKfS8qIEVORCBBcHBseVBzU2xvdCAqLwoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qIQoKICBcYnJpZWYgIGFzc2lnbnMgdGltZXNsb3RzIHRvIGFuIGFycmF5CgogIFxyZXR1cm4KCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpzdGF0aWMgdm9pZCBhc3NpZ25UaW1lU2xvdHNQUyAoRklYUF9EQkwgKmJ1ZkFkciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICoqYnVmUHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IG51bVNsb3RzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IG51bUNoYW4pCnsKICBGSVhQX0RCTCAgKnB0cjsKICBpbnQgc2xvdDsKICBwdHIgPSBidWZBZHI7CiAgZm9yKHNsb3Q9MDsgc2xvdCA8IG51bVNsb3RzOyBzbG90KyspIHsKICAgYnVmUHRyIFtzbG90XSA9IHB0cjsKICAgIHB0ciArPSBudW1DaGFuOwogIH0KfQoK