Ci8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAoKqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAxLiAgICBJTlRST0RVQ1RJT04KVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwp0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCgpBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQppbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydApvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KClBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwppbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCnRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCnRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwpzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCgpDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAphcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCgoyLiAgICBDT1BZUklHSFQgTElDRU5TRQoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CnBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKCllvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCnlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCgpZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCllvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgoKVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dApwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCgpZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCnNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgoKWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCiJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCgozLiAgICBOTyBQQVRFTlQgTElDRU5TRQoKTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCkFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCnJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KCllvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZApieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCgo0LiAgICBESVNDTEFJTUVSCgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwpvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgpDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCmluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCm9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCmFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgoKNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgoKRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCkF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCkFtIFdvbGZzbWFudGVsIDMzCjkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Cgp3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCmFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIE1QRUctNCBBQUMgRGVjb2RlciAgKioqKioqKioqKioqKioqKioqKioqKioqKioKCiAgIEF1dGhvcihzKTogICBDaHJpc3RpYW4gR3JpZWJlbAogICBEZXNjcmlwdGlvbjogRHluYW1pYyByYW5nZSBjb250cm9sIChEUkMpIGRlY29kZXIgdG9vbCBmb3IgU0JSCgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgojaW5jbHVkZSAic2JyZGVjX2RyYy5oIgoKCi8qIERSQyAtIE9mZnNldCB0YWJsZSBmb3IgUU1GIGludGVycG9sYXRpb24uICovCnN0YXRpYyBjb25zdCBpbnQgb2Zmc2V0VGFiWzJdWzE2XSA9CnsKICB7IDAsIDQsIDgsIDEyLCAxNiwgMjAsIDI0LCAyOCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9LCAgLyogMTAyNCBmcmFtaW5nICovCiAgeyAwLCA0LCA4LCAxMiwgMTYsIDE5LCAyMiwgMjYsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfSAgIC8qICA5NjAgZnJhbWluZyAqLwp9OwoKLyohCiAgXGJyaWVmIEluaXRpYWxpemUgRFJDIFFNRiBmYWN0b3JzCgogIFxoRHJjRGF0YSBIYW5kbGUgdG8gRFJDIGNoYW5uZWwgZGF0YS4KCiAgXHJldHVybiBub25lCiovCnZvaWQgc2JyRGVjb2Rlcl9kcmNJbml0Q2hhbm5lbCAoCiAgICBIQU5ETEVfU0JSX0RSQ19DSEFOTkVMICBoRHJjRGF0YSApCnsKICBpbnQgYmFuZDsKCiAgaWYgKGhEcmNEYXRhID09IE5VTEwpIHsKICAgIHJldHVybjsKICB9CgogIGZvciAoYmFuZCA9IDA7IGJhbmQgPCAoNjQpOyBiYW5kKyspIHsKICAgIGhEcmNEYXRhLT5wcmV2RmFjdF9tYWdbYmFuZF0gPSBGTDJGWENPTlNUX0RCTCgwLjVmKTsKICB9CgogIGZvciAoYmFuZCA9IDA7IGJhbmQgPCBTQlJERUNfTUFYX0RSQ19CQU5EUzsgYmFuZCsrKSB7CiAgICBoRHJjRGF0YS0+Y3VyckZhY3RfbWFnW2JhbmRdID0gRkwyRlhDT05TVF9EQkwoMC41Zik7CiAgICBoRHJjRGF0YS0+bmV4dEZhY3RfbWFnW2JhbmRdID0gRkwyRlhDT05TVF9EQkwoMC41Zik7CiAgfQoKICBoRHJjRGF0YS0+cHJldkZhY3RfZXhwID0gMTsKICBoRHJjRGF0YS0+Y3VyckZhY3RfZXhwID0gMTsKICBoRHJjRGF0YS0+bmV4dEZhY3RfZXhwID0gMTsKCiAgaERyY0RhdGEtPm51bUJhbmRzQ3VyciA9IDE7CiAgaERyY0RhdGEtPm51bUJhbmRzTmV4dCA9IDE7CgogIGhEcmNEYXRhLT53aW5TZXF1ZW5jZUN1cnIgPSAwOwogIGhEcmNEYXRhLT53aW5TZXF1ZW5jZU5leHQgPSAwOwoKICBoRHJjRGF0YS0+ZHJjSW50ZXJwb2xhdGlvblNjaGVtZUN1cnIgPSAwOwogIGhEcmNEYXRhLT5kcmNJbnRlcnBvbGF0aW9uU2NoZW1lTmV4dCA9IDA7CgogIGhEcmNEYXRhLT5lbmFibGUgPSAwOwp9CgoKLyohCiAgXGJyaWVmIFN3YXAgRFJDIFFNRiBzY2FsaW5nIGZhY3RvcnMgYWZ0ZXIgdGhleSBoYXZlIGJlZW4gYXBwbGllZC4KCiAgXGhEcmNEYXRhIEhhbmRsZSB0byBEUkMgY2hhbm5lbCBkYXRhLgoKICBccmV0dXJuIG5vbmUKKi8Kdm9pZCBzYnJEZWNvZGVyX2RyY1VwZGF0ZUNoYW5uZWwgKAogICAgSEFORExFX1NCUl9EUkNfQ0hBTk5FTCAgaERyY0RhdGEgKQp7CiAgaWYgKGhEcmNEYXRhID09IE5VTEwpIHsKICAgIHJldHVybjsKICB9CiAgaWYgKGhEcmNEYXRhLT5lbmFibGUgIT0gMSkgewogICAgcmV0dXJuOwogIH0KCiAgLyogc3dhcCBwcmV2aW91cyBkYXRhICovCiAgRkRLbWVtY3B5KCBoRHJjRGF0YS0+Y3VyckZhY3RfbWFnLAogICAgICAgICAgICAgaERyY0RhdGEtPm5leHRGYWN0X21hZywKICAgICAgICAgICAgIFNCUkRFQ19NQVhfRFJDX0JBTkRTICogc2l6ZW9mKEZJWFBfREJMKSApOwoKICBoRHJjRGF0YS0+Y3VyckZhY3RfZXhwID0gaERyY0RhdGEtPm5leHRGYWN0X2V4cDsKCiAgaERyY0RhdGEtPm51bUJhbmRzQ3VyciA9IGhEcmNEYXRhLT5udW1CYW5kc05leHQ7CgogIEZES21lbWNweSggaERyY0RhdGEtPmJhbmRUb3BDdXJyLAogICAgICAgICAgICAgaERyY0RhdGEtPmJhbmRUb3BOZXh0LAogICAgICAgICAgICAgU0JSREVDX01BWF9EUkNfQkFORFMgKiBzaXplb2YoVVNIT1JUKSApOwoKICBoRHJjRGF0YS0+ZHJjSW50ZXJwb2xhdGlvblNjaGVtZUN1cnIgPSBoRHJjRGF0YS0+ZHJjSW50ZXJwb2xhdGlvblNjaGVtZU5leHQ7CgogIGhEcmNEYXRhLT53aW5TZXF1ZW5jZUN1cnIgPSBoRHJjRGF0YS0+d2luU2VxdWVuY2VOZXh0Owp9CgoKLyohCiAgXGJyaWVmIEFwcGx5IERSQyBmYWN0b3JzIHNsb3QgYmFzZWQuCgogIFxoRHJjRGF0YSBIYW5kbGUgdG8gRFJDIGNoYW5uZWwgZGF0YS4KICBccW1mUmVhbFNsb3QgUG9pbnRlciB0byByZWFsIHZhbHVlZCBRTUYgZGF0YSBvZiBvbmUgdGltZSBzbG90LgogIFxxbWZJbWFnU2xvdCBQb2ludGVyIHRvIHRoZSBpbWFnaW5hcnkgUU1GIGRhdGEgb2Ygb25lIHRpbWUgc2xvdC4KICBcY29sIE51bWJlciBvZiB0aGUgdGltZSBzbG90LgogIFxudW1RbWZTdWJTYW1wbGVzIFRvdGFsIG51bWJlciBvZiB0aW1lIHNsb3RzIGZvciBvbmUgZnJhbWUuCiAgXHNjYWxlRmFjdG9yIFBvaW50ZXIgdG8gdGhlIG91dCBzY2FsZSBmYWN0b3Igb2YgdGhlIHRpbWUgc2xvdC4KCiAgXHJldHVybiBOb25lLgoqLwp2b2lkIHNickRlY29kZXJfZHJjQXBwbHlTbG90ICgKICAgIEhBTkRMRV9TQlJfRFJDX0NIQU5ORUwgIGhEcmNEYXRhLAogICAgRklYUF9EQkwgICAqcW1mUmVhbFNsb3QsCiAgICBGSVhQX0RCTCAgICpxbWZJbWFnU2xvdCwKICAgIGludCAgY29sLAogICAgaW50ICBudW1RbWZTdWJTYW1wbGVzLAogICAgaW50ICBtYXhTaGlmdAogICkKewogIGNvbnN0IGludCAqb2Zmc2V0OwoKICBpbnQgYmFuZCwgYm90dG9tTWRjdCwgdG9wTWRjdCwgYmluLCB1c2VMUDsKICBpbnQgaW5keCA9IG51bVFtZlN1YlNhbXBsZXMgLSAobnVtUW1mU3ViU2FtcGxlcyA+PiAxKSAtIDEwOyAgIC8qIGxfYm9yZGVyICovCiAgaW50IGZyYW1lTGVuRmxhZyA9IChudW1RbWZTdWJTYW1wbGVzID09IDMwKSA/IDEgOiAwOwoKICBjb25zdCBGSVhQX0RCTCAqZmFjdF9tYWcgPSBOVUxMOwogIElOVCBmYWN0X2V4cCA9IDA7CiAgVUlOVCBudW1CYW5kcyA9IDA7CiAgVVNIT1JUICpiYW5kVG9wID0gTlVMTDsKICBpbnQgc2hvcnREcmMgPSAwOwoKICBGSVhQX0RCTCBhbHBoYVZhbHVlID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CgogIGlmIChoRHJjRGF0YSA9PSBOVUxMKSB7CiAgICByZXR1cm47CiAgfQogIGlmIChoRHJjRGF0YS0+ZW5hYmxlICE9IDEpIHsKICAgIHJldHVybjsKICB9CgogIG9mZnNldCA9IG9mZnNldFRhYltmcmFtZUxlbkZsYWddOwoKICB1c2VMUCA9IChxbWZJbWFnU2xvdCA9PSBOVUxMKSA/IDEgOiAwOwoKICBjb2wgKz0gaW5keDsKICBib3R0b21NZGN0ID0gMDsKICBiaW4gPSAwOwoKICAvKiBnZXQgcmVzcGVjdGl2ZSBkYXRhIGFuZCBjYWxjIGludGVycG9sYXRpb24gZmFjdG9yICovCiAgaWYgKGNvbCA8IChudW1RbWZTdWJTYW1wbGVzPj4xKSkgeyAgLyogZmlyc3QgaGFsZiBvZiBjdXJyZW50IGZyYW1lICovCiAgICBpZiAoaERyY0RhdGEtPndpblNlcXVlbmNlQ3VyciAhPSAyKSB7IC8qIGxvbmcgd2luZG93ICovCiAgICAgIGludCBqID0gY29sICsgKG51bVFtZlN1YlNhbXBsZXM+PjEpOwoKICAgICAgaWYgKGhEcmNEYXRhLT5kcmNJbnRlcnBvbGF0aW9uU2NoZW1lQ3VyciA9PSAwKSB7CiAgICAgICAgSU5UIGsgPSAoZnJhbWVMZW5GbGFnKSA/IDB4NDQ0NDQ0NCA6IDB4NDAwMDAwMDsKCiAgICAgICAgYWxwaGFWYWx1ZSA9IChGSVhQX0RCTCkoaiAqIGspOwogICAgICB9CiAgICAgIGVsc2UgewogICAgICAgIGlmIChqID49IG9mZnNldFtoRHJjRGF0YS0+ZHJjSW50ZXJwb2xhdGlvblNjaGVtZUN1cnIgLSAxXSkgewogICAgICAgICAgYWxwaGFWYWx1ZSA9IChGSVhQX0RCTClNQVhWQUxfREJMOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgZWxzZSB7ICAvKiBzaG9ydCB3aW5kb3dzICovCiAgICAgIHNob3J0RHJjID0gMTsKICAgIH0KCiAgICBmYWN0X21hZyA9IGhEcmNEYXRhLT5jdXJyRmFjdF9tYWc7CiAgICBmYWN0X2V4cCA9IGhEcmNEYXRhLT5jdXJyRmFjdF9leHA7CiAgICBudW1CYW5kcyA9IGhEcmNEYXRhLT5udW1CYW5kc0N1cnI7CiAgICBiYW5kVG9wID0gaERyY0RhdGEtPmJhbmRUb3BDdXJyOwogIH0KICBlbHNlIGlmIChjb2wgPCBudW1RbWZTdWJTYW1wbGVzKSB7ICAvKiBzZWNvbmQgaGFsZiBvZiBjdXJyZW50IGZyYW1lICovCiAgICBpZiAoaERyY0RhdGEtPndpblNlcXVlbmNlTmV4dCAhPSAyKSB7IC8qIG5leHQ6IGxvbmcgd2luZG93ICovCiAgICAgIGludCBqID0gY29sIC0gKG51bVFtZlN1YlNhbXBsZXM+PjEpOwoKICAgICAgaWYgKGhEcmNEYXRhLT5kcmNJbnRlcnBvbGF0aW9uU2NoZW1lTmV4dCA9PSAwKSB7CiAgICAgICAgSU5UIGsgPSAoZnJhbWVMZW5GbGFnKSA/IDB4NDQ0NDQ0NCA6IDB4NDAwMDAwMDsKCiAgICAgICAgYWxwaGFWYWx1ZSA9IChGSVhQX0RCTCkoaiAqIGspOwogICAgICB9CiAgICAgIGVsc2UgewogICAgICAgIGlmIChqID49IG9mZnNldFtoRHJjRGF0YS0+ZHJjSW50ZXJwb2xhdGlvblNjaGVtZU5leHQgLSAxXSkgewogICAgICAgICAgYWxwaGFWYWx1ZSA9IChGSVhQX0RCTClNQVhWQUxfREJMOwogICAgICAgIH0KICAgICAgfQoKICAgICAgZmFjdF9tYWcgPSBoRHJjRGF0YS0+bmV4dEZhY3RfbWFnOwogICAgICBmYWN0X2V4cCA9IGhEcmNEYXRhLT5uZXh0RmFjdF9leHA7CiAgICAgIG51bUJhbmRzID0gaERyY0RhdGEtPm51bUJhbmRzTmV4dDsKICAgICAgYmFuZFRvcCA9IGhEcmNEYXRhLT5iYW5kVG9wTmV4dDsKICAgIH0KICAgIGVsc2UgeyAgLyogbmV4dDogc2hvcnQgd2luZG93cyAqLwogICAgICBpZiAoaERyY0RhdGEtPndpblNlcXVlbmNlQ3VyciAhPSAyKSB7ICAvKiBjdXJyZW50OiBsb25nIHdpbmRvdyAqLwogICAgICAgIGFscGhhVmFsdWUgPSAoRklYUF9EQkwpMDsKCiAgICAgICAgZmFjdF9tYWcgPSBoRHJjRGF0YS0+bmV4dEZhY3RfbWFnOwogICAgICAgIGZhY3RfZXhwID0gaERyY0RhdGEtPm5leHRGYWN0X2V4cDsKICAgICAgICBudW1CYW5kcyA9IGhEcmNEYXRhLT5udW1CYW5kc05leHQ7CiAgICAgICAgYmFuZFRvcCA9IGhEcmNEYXRhLT5iYW5kVG9wTmV4dDsKICAgICAgfQogICAgICBlbHNlIHsgIC8qIGN1cnJlbnQ6IHNob3J0IHdpbmRvd3MgKi8KICAgICAgICBzaG9ydERyYyA9IDE7CgogICAgICAgIGZhY3RfbWFnID0gaERyY0RhdGEtPmN1cnJGYWN0X21hZzsKICAgICAgICBmYWN0X2V4cCA9IGhEcmNEYXRhLT5jdXJyRmFjdF9leHA7CiAgICAgICAgbnVtQmFuZHMgPSBoRHJjRGF0YS0+bnVtQmFuZHNDdXJyOwogICAgICAgIGJhbmRUb3AgPSBoRHJjRGF0YS0+YmFuZFRvcEN1cnI7CiAgICAgIH0KICAgIH0KICB9CiAgZWxzZSB7ICAvKiBmaXJzdCBoYWxmIG9mIG5leHQgZnJhbWUgKi8KICAgIGlmIChoRHJjRGF0YS0+d2luU2VxdWVuY2VOZXh0ICE9IDIpIHsgLyogbG9uZyB3aW5kb3cgKi8KICAgICAgaW50IGogPSBjb2wgLSAobnVtUW1mU3ViU2FtcGxlcz4+MSk7CgogICAgICBpZiAoaERyY0RhdGEtPmRyY0ludGVycG9sYXRpb25TY2hlbWVOZXh0ID09IDApIHsKICAgICAgICBJTlQgayA9IChmcmFtZUxlbkZsYWcpID8gMHg0NDQ0NDQ0IDogMHg0MDAwMDAwOwoKICAgICAgICBhbHBoYVZhbHVlID0gKEZJWFBfREJMKShqICogayk7CiAgICAgIH0KICAgICAgZWxzZSB7CiAgICAgICAgaWYgKGogPj0gb2Zmc2V0W2hEcmNEYXRhLT5kcmNJbnRlcnBvbGF0aW9uU2NoZW1lTmV4dCAtIDFdKSB7CiAgICAgICAgICBhbHBoYVZhbHVlID0gKEZJWFBfREJMKU1BWFZBTF9EQkw7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBlbHNlIHsgIC8qIHNob3J0IHdpbmRvd3MgKi8KICAgICAgc2hvcnREcmMgPSAxOwogICAgfQoKICAgIGZhY3RfbWFnID0gaERyY0RhdGEtPm5leHRGYWN0X21hZzsKICAgIGZhY3RfZXhwID0gaERyY0RhdGEtPm5leHRGYWN0X2V4cDsKICAgIG51bUJhbmRzID0gaERyY0RhdGEtPm51bUJhbmRzTmV4dDsKICAgIGJhbmRUb3AgPSBoRHJjRGF0YS0+YmFuZFRvcE5leHQ7CgogICAgY29sIC09IG51bVFtZlN1YlNhbXBsZXM7CiAgfQoKCiAgLyogcHJvY2VzcyBiYW5kcyAqLwogIGZvciAoYmFuZCA9IDA7IGJhbmQgPCAoaW50KW51bUJhbmRzOyBiYW5kKyspIHsKICAgIGludCBib3R0b21RbWYsIHRvcFFtZjsKCiAgICBGSVhQX0RCTCBkcmNGYWN0X21hZyA9IChGSVhQX0RCTClNQVhWQUxfREJMOwoKICAgIHRvcE1kY3QgPSAoYmFuZFRvcFtiYW5kXSsxKSA8PCAyOwoKICAgIGlmICghc2hvcnREcmMpIHsgIC8qIGxvbmcgd2luZG93ICovCiAgICAgIGlmIChmcmFtZUxlbkZsYWcpIHsKICAgICAgICAvKiA5NjAgZnJhbWluZyAqLwogICAgICAgIGJvdHRvbU1kY3QgPSAzMCAqIChib3R0b21NZGN0IC8gMzApOwogICAgICAgIHRvcE1kY3QgICAgPSAzMCAqICh0b3BNZGN0IC8gMzApOwoKICAgICAgICBib3R0b21RbWYgPSBmTXVsdElmbG9vcigoRklYUF9EQkwpMHg0NDQ0NDQ0LCBib3R0b21NZGN0KTsKICAgICAgICB0b3BRbWYgICAgPSBmTXVsdElmbG9vcigoRklYUF9EQkwpMHg0NDQ0NDQ0LCB0b3BNZGN0KTsKICAgICAgfQogICAgICBlbHNlIHsKICAgICAgICAvKiAxMDI0IGZyYW1pbmcgKi8KICAgICAgICBib3R0b21NZGN0ICY9IH4weDFmOwogICAgICAgIHRvcE1kY3QgICAgJj0gfjB4MWY7CgogICAgICAgIGJvdHRvbVFtZiA9IGJvdHRvbU1kY3QgPj4gNTsKICAgICAgICB0b3BRbWYgICAgPSB0b3BNZGN0ID4+IDU7CiAgICAgIH0KCiAgICAgIGlmIChiYW5kID09ICgoaW50KW51bUJhbmRzLTEpKSB7CiAgICAgICAgdG9wUW1mID0gKDY0KTsKICAgICAgfQogICAgCiAgICAgIGZvciAoYmluID0gYm90dG9tUW1mOyBiaW4gPCB0b3BRbWY7IGJpbisrKSB7CiAgICAgICAgRklYUF9EQkwgZHJjRmFjdDFfbWFnID0gaERyY0RhdGEtPnByZXZGYWN0X21hZ1tiaW5dOwogICAgICAgIEZJWFBfREJMIGRyY0ZhY3QyX21hZyA9IGZhY3RfbWFnW2JhbmRdOwoKICAgICAgICAvKiBub3JtYWxpemUgc2NhbGUgZmFjdG9ycyAqLwogICAgICAgIGlmIChoRHJjRGF0YS0+cHJldkZhY3RfZXhwIDwgbWF4U2hpZnQpIHsKICAgICAgICAgIGRyY0ZhY3QxX21hZyA+Pj0gbWF4U2hpZnQgLSBoRHJjRGF0YS0+cHJldkZhY3RfZXhwOwogICAgICAgIH0KICAgICAgICBpZiAoZmFjdF9leHAgPCBtYXhTaGlmdCkgewogICAgICAgICAgZHJjRmFjdDJfbWFnID4+PSBtYXhTaGlmdCAtIGZhY3RfZXhwOwogICAgICAgIH0KCiAgICAgICAgLyogaW50ZXJwb2xhdGUgKi8KICAgICAgICBpZiAoYWxwaGFWYWx1ZSA9PSAoRklYUF9EQkwpMCkgewogICAgICAgICAgZHJjRmFjdF9tYWcgPSBkcmNGYWN0MV9tYWc7CiAgICAgICAgfSBlbHNlIGlmIChhbHBoYVZhbHVlID09IChGSVhQX0RCTClNQVhWQUxfREJMKSB7CiAgICAgICAgICBkcmNGYWN0X21hZyA9IGRyY0ZhY3QyX21hZzsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgZHJjRmFjdF9tYWcgPSBmTXVsdChhbHBoYVZhbHVlLCBkcmNGYWN0Ml9tYWcpICsgZk11bHQoKChGSVhQX0RCTClNQVhWQUxfREJMIC0gYWxwaGFWYWx1ZSksIGRyY0ZhY3QxX21hZyk7CiAgICAgICAgfQoKICAgICAgICAvKiBhcHBseSBzY2FsaW5nICovCiAgICAgICAgcW1mUmVhbFNsb3RbYmluXSA9IGZNdWx0KHFtZlJlYWxTbG90W2Jpbl0sIGRyY0ZhY3RfbWFnKTsKICAgICAgICBpZiAoIXVzZUxQKSB7CiAgICAgICAgICBxbWZJbWFnU2xvdFtiaW5dID0gZk11bHQocW1mSW1hZ1Nsb3RbYmluXSwgZHJjRmFjdF9tYWcpOwogICAgICAgIH0KCiAgICAgICAgLyogc2F2ZSBwcmV2aW91cyBmYWN0b3JzICovCiAgICAgICAgaWYgKGNvbCA9PSAobnVtUW1mU3ViU2FtcGxlcz4+MSktMSkgewogICAgICAgICAgaERyY0RhdGEtPnByZXZGYWN0X21hZ1tiaW5dID0gZmFjdF9tYWdbYmFuZF07CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBlbHNlIHsgIC8qIHNob3J0IHdpbmRvd3MgKi8KICAgICAgaW50IHN0YXJ0U2FtcGxlLCBzdG9wU2FtcGxlOwogICAgICBGSVhQX0RCTCBpbnZGcmFtZVNpemVEaXY4ID0gKGZyYW1lTGVuRmxhZykgPyAoRklYUF9EQkwpMHgxMTExMTExIDogKEZJWFBfREJMKTB4MTAwMDAwMDsKCiAgICAgIGlmIChmcmFtZUxlbkZsYWcpIHsKICAgICAgICAvKiAgOTYwIGZyYW1pbmcgKi8KICAgICAgICBib3R0b21NZGN0ID0gMzAvOCAqIChib3R0b21NZGN0KjgvMzApOwogICAgICAgIHRvcE1kY3QgICAgPSAzMC84ICogKHRvcE1kY3QqOC8zMCk7CiAgICAgIH0KICAgICAgZWxzZSB7CiAgICAgICAgLyogMTAyNCBmcmFtaW5nICovCiAgICAgICAgYm90dG9tTWRjdCAmPSB+MHgwMzsKICAgICAgICB0b3BNZGN0ICAgICY9IH4weDAzOwogICAgICB9CgogICAgICAvKiBzdGFydFNhbXBsZSBpcyB0cnVuY2F0ZWQgdG8gdGhlIG5lYXJlc3QgY29ycmVzcG9uZGluZyBzdGFydCBzdWJzYW1wbGUgaW4KICAgICAgICAgdGhlIFFNRiBvZiB0aGUgc2hvcnQgd2luZG93IGJvdHRvbSBpcyBwcmVzZW50IGluOiovCiAgICAgIHN0YXJ0U2FtcGxlICA9ICgoZk11bHRJZmxvb3IoIGludkZyYW1lU2l6ZURpdjgsIGJvdHRvbU1kY3QgKSAmIDB4NykgKiBudW1RbWZTdWJTYW1wbGVzKSA+PiAzOwoKICAgICAgLyogc3RvcFNhbXBsZSBpcyByb3VuZGVkIHVwd2FyZHMgdG8gdGhlIG5lYXJlc3QgY29ycmVzcG9uZGluZyBzdG9wIHN1YnNhbXBsZQogICAgICAgICBpbiB0aGUgUU1GIG9mIHRoZSBzaG9ydCB3aW5kb3cgdG9wIGlzIHByZXNlbnQgaW4uICovCiAgICAgIHN0b3BTYW1wbGUgID0gKChmTXVsdEljZWlsKCBpbnZGcmFtZVNpemVEaXY4LCB0b3BNZGN0ICkgJiAweGYpICogbnVtUW1mU3ViU2FtcGxlcykgPj4gMzsKCiAgICAgIGJvdHRvbVFtZiA9IGZNdWx0SWZsb29yKCBpbnZGcmFtZVNpemVEaXY4LCAoKGJvdHRvbU1kY3QlKG51bVFtZlN1YlNhbXBsZXM8PDIpKSA8PCA1KSApOwogICAgICB0b3BRbWYgICAgPSBmTXVsdElmbG9vciggaW52RnJhbWVTaXplRGl2OCwgKCh0b3BNZGN0JShudW1RbWZTdWJTYW1wbGVzPDwyKSkgPDwgNSkgKTsKCiAgICAgIC8qIGV4dGVuZCBsYXN0IGJhbmQgKi8KICAgICAgaWYgKGJhbmQgPT0gKChpbnQpbnVtQmFuZHMtMSkpIHsKICAgICAgICB0b3BRbWYgPSAoNjQpOwogICAgICAgIHN0b3BTYW1wbGUgPSBudW1RbWZTdWJTYW1wbGVzOwogICAgICB9CgogICAgICBpZiAodG9wUW1mID09IDApIHsKICAgICAgICB0b3BRbWYgPSAoNjQpOwogICAgICB9CgogICAgICAvKiBzYXZlIHByZXZpb3VzIGZhY3RvcnMgKi8KICAgICAgaWYgKHN0b3BTYW1wbGUgPT0gbnVtUW1mU3ViU2FtcGxlcykgewogICAgICAgIGludCB0bXBCb3R0b20gPSBib3R0b21RbWY7CgogICAgICAgIGlmICgoKG51bVFtZlN1YlNhbXBsZXMtMSkgJiB+MHgwMykgPiBzdGFydFNhbXBsZSkgewogICAgICAgICAgICB0bXBCb3R0b20gPSAwOyAgICAvKiBiYW5kIHN0YXJ0cyBpbiBwcmV2aW91cyBzaG9ydCB3aW5kb3cgKi8KICAgICAgICB9CgogICAgICAgIGZvciAoYmluID0gdG1wQm90dG9tOyBiaW4gPCB0b3BRbWY7IGJpbisrKSB7CiAgICAgICAgICBoRHJjRGF0YS0+cHJldkZhY3RfbWFnW2Jpbl0gPSBmYWN0X21hZ1tiYW5kXTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qIGFwcGx5ICovCiAgICAgIGlmICgoY29sID49IHN0YXJ0U2FtcGxlKSAmJiAoY29sIDwgc3RvcFNhbXBsZSkpIHsKICAgICAgICBpZiAoKGNvbCAmIH4weDAzKSA+IHN0YXJ0U2FtcGxlKSB7CiAgICAgICAgICAgIGJvdHRvbVFtZiA9IDA7ICAgIC8qIGJhbmQgc3RhcnRzIGluIHByZXZpb3VzIHNob3J0IHdpbmRvdyAqLwogICAgICAgIH0KICAgICAgICBpZiAoY29sIDwgKChzdG9wU2FtcGxlLTEpICYgfjB4MDMpKSB7CiAgICAgICAgICAgIHRvcFFtZiA9ICg2NCk7ICAgLyogYmFuZCBlbmRzIGluIG5leHQgc2hvcnQgd2luZG93ICovCiAgICAgICAgfQoKICAgICAgICBkcmNGYWN0X21hZyA9IGZhY3RfbWFnW2JhbmRdOwoKICAgICAgICAvKiBub3JtYWxpemUgc2NhbGUgZmFjdG9yICovCiAgICAgICAgaWYgKGZhY3RfZXhwIDwgbWF4U2hpZnQpIHsKICAgICAgICAgIGRyY0ZhY3RfbWFnID4+PSBtYXhTaGlmdCAtIGZhY3RfZXhwOwogICAgICAgIH0KCiAgICAgICAgLyogYXBwbHkgc2NhbGluZyAqLwogICAgICAgIGZvciAoYmluID0gYm90dG9tUW1mOyBiaW4gPCB0b3BRbWY7IGJpbisrKSB7CiAgICAgICAgICBxbWZSZWFsU2xvdFtiaW5dID0gZk11bHQocW1mUmVhbFNsb3RbYmluXSwgZHJjRmFjdF9tYWcpOwogICAgICAgICAgaWYgKCF1c2VMUCkgewogICAgICAgICAgICBxbWZJbWFnU2xvdFtiaW5dID0gZk11bHQocW1mSW1hZ1Nsb3RbYmluXSwgZHJjRmFjdF9tYWcpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIGJvdHRvbU1kY3QgPSB0b3BNZGN0OwogIH0gICAvKiBlbmQgb2YgYmFuZHMgbG9vcCAqLwoKICBpZiAoY29sID09IChudW1RbWZTdWJTYW1wbGVzPj4xKS0xKSB7CiAgICBoRHJjRGF0YS0+cHJldkZhY3RfZXhwID0gZmFjdF9leHA7CiAgfQp9CgoKLyohCiAgXGJyaWVmIEFwcGx5IERSQyBmYWN0b3JzIGZyYW1lIGJhc2VkLgoKICBcaERyY0RhdGEgSGFuZGxlIHRvIERSQyBjaGFubmVsIGRhdGEuCiAgXHFtZlJlYWxTbG90IFBvaW50ZXIgdG8gcmVhbCB2YWx1ZWQgUU1GIGRhdGEgb2YgdGhlIHdob2xlIGZyYW1lLgogIFxxbWZJbWFnU2xvdCBQb2ludGVyIHRvIHRoZSBpbWFnaW5hcnkgUU1GIGRhdGEgb2YgdGhlIHdob2xlIGZyYW1lLgogIFxudW1RbWZTdWJTYW1wbGVzIFRvdGFsIG51bWJlciBvZiB0aW1lIHNsb3RzIGZvciBvbmUgZnJhbWUuCiAgXHNjYWxlRmFjdG9yIFBvaW50ZXIgdG8gdGhlIG91dCBzY2FsZSBmYWN0b3Igb2YgdGhlIGZyYW1lLgoKICBccmV0dXJuIE5vbmUuCiovCnZvaWQgc2JyRGVjb2Rlcl9kcmNBcHBseSAoCiAgICBIQU5ETEVfU0JSX0RSQ19DSEFOTkVMICBoRHJjRGF0YSwKICAgIEZJWFBfREJMICoqUW1mQnVmZmVyUmVhbCwKICAgIEZJWFBfREJMICoqUW1mQnVmZmVySW1hZywKICAgIGludCAgbnVtUW1mU3ViU2FtcGxlcywKICAgIGludCAqc2NhbGVGYWN0b3IKICApCnsKICBpbnQgY29sOwogIGludCBtYXhTaGlmdCA9IDA7CgogIGlmIChoRHJjRGF0YSA9PSBOVUxMKSB7CiAgICByZXR1cm47CiAgfQogIGlmIChoRHJjRGF0YS0+ZW5hYmxlID09IDApIHsKICAgIHJldHVybjsgIC8qIEF2b2lkIGNoYW5naW5nIHRoZSBzY2FsZUZhY3RvciBldmVuIHRob3VnaCB0aGUgcHJvY2Vzc2luZyBpcyBkaXNhYmxlZC4gKi8KICB9CgogIC8qIGdldCBtYXggc2NhbGUgZmFjdG9yICovCiAgaWYgKGhEcmNEYXRhLT5wcmV2RmFjdF9leHAgPiBtYXhTaGlmdCkgewogICAgbWF4U2hpZnQgPSBoRHJjRGF0YS0+cHJldkZhY3RfZXhwOwogIH0KICBpZiAoaERyY0RhdGEtPmN1cnJGYWN0X2V4cCA+IG1heFNoaWZ0KSB7CiAgICBtYXhTaGlmdCA9IGhEcmNEYXRhLT5jdXJyRmFjdF9leHA7CiAgfQogIGlmIChoRHJjRGF0YS0+bmV4dEZhY3RfZXhwID4gbWF4U2hpZnQpIHsKICAgIG1heFNoaWZ0ID0gaERyY0RhdGEtPm5leHRGYWN0X2V4cDsKICB9CgogIGZvciAoY29sID0gMDsgY29sIDwgbnVtUW1mU3ViU2FtcGxlczsgY29sKyspCiAgewogICAgRklYUF9EQkwgKnFtZlNsb3RSZWFsID0gUW1mQnVmZmVyUmVhbFtjb2xdOwogICAgRklYUF9EQkwgKnFtZlNsb3RJbWFnID0gKFFtZkJ1ZmZlckltYWcgPT0gTlVMTCkgPyBOVUxMIDogUW1mQnVmZmVySW1hZ1tjb2xdOwoKICAgIHNickRlY29kZXJfZHJjQXBwbHlTbG90ICgKICAgICAgaERyY0RhdGEsCiAgICAgIHFtZlNsb3RSZWFsLAogICAgICBxbWZTbG90SW1hZywKICAgICAgY29sLAogICAgICBudW1RbWZTdWJTYW1wbGVzLAogICAgICBtYXhTaGlmdAogICAgKTsKICB9CgogICpzY2FsZUZhY3RvciArPSBtYXhTaGlmdDsKfQoK