Ci8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAoKqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAxLiAgICBJTlRST0RVQ1RJT04KVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwp0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCgpBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQppbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydApvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KClBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwppbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCnRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCnRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwpzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCgpDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAphcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCgoyLiAgICBDT1BZUklHSFQgTElDRU5TRQoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CnBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKCllvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCnlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCgpZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCllvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgoKVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dApwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCgpZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCnNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgoKWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCiJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCgozLiAgICBOTyBQQVRFTlQgTElDRU5TRQoKTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCkFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCnJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KCllvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZApieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCgo0LiAgICBESVNDTEFJTUVSCgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwpvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgpDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCmluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCm9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCmFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgoKNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgoKRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCkF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCkFtIFdvbGZzbWFudGVsIDMzCjkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Cgp3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCmFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqICBGYXN0IE1QRUcgQUFDIEF1ZGlvIEVuY29kZXIgICoqKioqKioqKioqKioqKioqKioqKioKCiAgIEluaXRpYWwgYXV0aG9yOiAgICAgICBNLiBTY2h1ZyAvIEEuIEdyb2VzY2hlbAogICBjb250ZW50cy9kZXNjcmlwdGlvbjogZmFzdCBhYWMgY29kZXIgZnVuY3Rpb25zCgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgojaW5jbHVkZSAiYWFjZW5jLmgiCgojaW5jbHVkZSAiYml0ZW5jLmgiCiNpbmNsdWRlICJpbnRlcmZhY2UuaCIKI2luY2x1ZGUgInBzeV9jb25maWd1cmF0aW9uLmgiCiNpbmNsdWRlICJwc3lfbWFpbi5oIgojaW5jbHVkZSAicWNfbWFpbi5oIgojaW5jbHVkZSAiYmFuZHdpZHRoLmgiCiNpbmNsdWRlICJjaGFubmVsX21hcC5oIgojaW5jbHVkZSAidG5zX2Z1bmMuaCIKI2luY2x1ZGUgImFhY0VuY19yYW0uaCIKCiNpbmNsdWRlICJnZW5lcmljU3Rkcy5oIgoKCgoKI2RlZmluZSBNSU5fQlVGU0laRV9QRVJfRUZGX0NIQU4gNjE0NAoKc3RhdGljIEFBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19Jbml0Q2hlY2tBbmNpbGxhcnkoSU5UIGJpdFJhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBmcmFtZWxlbmd0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGFuY2lsbGFyeVJhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqYW5jaWxsYXJ5Qml0c1BlckZyYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgc2FtcGxlUmF0ZSk7CgpJTlQgRkRLYWFjRW5jX0xpbWl0Qml0cmF0ZSgKICAgICAgICBIQU5ETEVfVFJBTlNQT1JURU5DIGhUcEVuYywKICAgICAgICBJTlQgY29yZVNhbXBsaW5nUmF0ZSwKICAgICAgICBJTlQgZnJhbWVMZW5ndGgsCiAgICAgICAgSU5UIG5DaGFubmVscywKICAgICAgICBJTlQgbkNoYW5uZWxzRWZmLAogICAgICAgIElOVCBiaXRSYXRlLAogICAgICAgIElOVCBhdmVyYWdlQml0cywKICAgICAgICBJTlQgKnBBdmVyYWdlQml0c1BlckZyYW1lLAogICAgICAgIElOVCBiaXRyYXRlTW9kZSwKICAgICAgICBJTlQgblN1YkZyYW1lcwogICAgICAgICkKewogIElOVCB0cmFuc3BvcnRCaXRzLCBwcmV2Qml0UmF0ZSwgYXZlcmFnZUJpdHNQZXJGcmFtZSwgc2hpZnQgPSAwLCBpdGVyPTA7CgogIHdoaWxlICggKGZyYW1lTGVuZ3RoICYgfigoMTw8KHNoaWZ0KzEpKS0xKSkgPT0gZnJhbWVMZW5ndGgKICAgICYmIChjb3JlU2FtcGxpbmdSYXRlICYgfigoMTw8KHNoaWZ0KzEpKS0xKSkgPT0gY29yZVNhbXBsaW5nUmF0ZSApCiAgewogICAgc2hpZnQgKys7CiAgfQoKICBkbyB7CiAgICBwcmV2Qml0UmF0ZSA9IGJpdFJhdGU7CiAgICAgYXZlcmFnZUJpdHNQZXJGcmFtZSA9IChiaXRSYXRlKihmcmFtZUxlbmd0aD4+c2hpZnQpKSAvIChjb3JlU2FtcGxpbmdSYXRlPj5zaGlmdCkgLyBuU3ViRnJhbWVzOwoKICAgIGlmIChwQXZlcmFnZUJpdHNQZXJGcmFtZSAhPSBOVUxMKSB7CiAgICAgICpwQXZlcmFnZUJpdHNQZXJGcmFtZSA9IGF2ZXJhZ2VCaXRzUGVyRnJhbWU7CiAgICB9CgogICAgaWYgKGhUcEVuYyAhPSBOVUxMKSB7CiAgICAgIHRyYW5zcG9ydEJpdHMgPSB0cmFuc3BvcnRFbmNfR2V0U3RhdGljQml0cyhoVHBFbmMsIGF2ZXJhZ2VCaXRzUGVyRnJhbWUpOwogICAgfSBlbHNlIHsKICAgICAgLyogQXNzdW1lIHNvbWUgd29yc3QgY2FzZSAqLwogICAgICB0cmFuc3BvcnRCaXRzID0gMjA4OwogICAgfQoKICAgIGJpdFJhdGUgPSBGREttYXgoYml0UmF0ZSwgKCgoKDQwICogbkNoYW5uZWxzKSArIHRyYW5zcG9ydEJpdHMpICogKGNvcmVTYW1wbGluZ1JhdGUpKSAvIGZyYW1lTGVuZ3RoKSApOwogICAgRkRLX0FTU0VSVChiaXRSYXRlID49IDApOwoKICAgIGJpdFJhdGUgPSBGREttaW4oYml0UmF0ZSwgKChuQ2hhbm5lbHNFZmYgKiBNSU5fQlVGU0laRV9QRVJfRUZGX0NIQU4pKihjb3JlU2FtcGxpbmdSYXRlPj5zaGlmdCkpIC8gKGZyYW1lTGVuZ3RoPj5zaGlmdCkpIDsKICAgIEZES19BU1NFUlQoYml0UmF0ZSA+PSAwKTsKCiAgfSB3aGlsZSAocHJldkJpdFJhdGUgIT0gYml0UmF0ZSAmJiBpdGVyKysgPCAzKSA7CgogIHJldHVybiBiaXRSYXRlOwp9CgoKdHlwZWRlZiBzdHJ1Y3QKewogIEFBQ0VOQ19CSVRSQVRFX01PREUgYml0cmF0ZU1vZGU7CiAgaW50IGNoYW5CaXRyYXRlWzJdOyAvKiBtb25vL3N0ZXJlbyBzZXR0aW5ncyAqLwp9IENPTkZJR19UQUJfRU5UUllfVkJSOwoKc3RhdGljIGNvbnN0IENPTkZJR19UQUJfRU5UUllfVkJSIGNvbmZpZ1RhYlZCUltdID0gewogIHtBQUNFTkNfQlJfTU9ERV9DQlIsICAgeyAgICAgMCwgICAgIDB9fSAsCiAge0FBQ0VOQ19CUl9NT0RFX1ZCUl8xLCB7IDMyMDAwLCAyMDAwMH19ICwKICB7QUFDRU5DX0JSX01PREVfVkJSXzIsIHsgNDAwMDAsIDMyMDAwfX0gLAogIHtBQUNFTkNfQlJfTU9ERV9WQlJfMywgeyA1NjAwMCwgNDgwMDB9fSAsCiAge0FBQ0VOQ19CUl9NT0RFX1ZCUl80LCB7IDcyMDAwLCA2NDAwMH19ICwKICB7QUFDRU5DX0JSX01PREVfVkJSXzUsIHsxMTIwMDAsIDk2MDAwfX0KfTsKCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICAgZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfR2V0VkJSQml0cmF0ZQogICAgIGRlc2NyaXB0aW9uOiAgR2V0IFZCUiBiaXRyYXRlIGZyb20gdmJyIHF1YWxpdHkKICAgICBpbnB1dCBwYXJhbXM6IGludCB2YnJRdWFsaXR5IChWQlIwLCBWQlIxLCBWQlIyKQogICAgICAgICAgICAgICAgICAgY2hhbm5lbE1vZGUKICAgICByZXR1cm5zOiAgICAgIHZiciBiaXRyYXRlCgogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KSU5UIEZES2FhY0VuY19HZXRWQlJCaXRyYXRlKElOVCBiaXRyYXRlTW9kZSwgQ0hBTk5FTF9NT0RFIGNoYW5uZWxNb2RlKQp7CiAgSU5UIGJpdHJhdGUgPSAwOwogIElOVCBtb25vU3RlcmVvTW9kZSA9IDA7IC8qIGRlZmF1bHQgbW9ubyAqLwoKICBpZiAoRkRLYWFjRW5jX0dldE1vbm9TdGVyZW9Nb2RlKGNoYW5uZWxNb2RlKT09RUxfTU9ERV9TVEVSRU8pIHsKICAgICAgbW9ub1N0ZXJlb01vZGUgPSAxOwogIH0KCiAgc3dpdGNoKChBQUNFTkNfQklUUkFURV9NT0RFKWJpdHJhdGVNb2RlKXsKICBjYXNlIEFBQ0VOQ19CUl9NT0RFX1ZCUl8xOgogIGNhc2UgQUFDRU5DX0JSX01PREVfVkJSXzI6CiAgY2FzZSBBQUNFTkNfQlJfTU9ERV9WQlJfMzoKICBjYXNlIEFBQ0VOQ19CUl9NT0RFX1ZCUl80OgogIGNhc2UgQUFDRU5DX0JSX01PREVfVkJSXzU6CiAgICBiaXRyYXRlID0gY29uZmlnVGFiVkJSW2JpdHJhdGVNb2RlXS5jaGFuQml0cmF0ZVttb25vU3RlcmVvTW9kZV07CiAgICBicmVhazsKICBjYXNlIEFBQ0VOQ19CUl9NT0RFX0lOVkFMSUQ6CiAgY2FzZSBBQUNFTkNfQlJfTU9ERV9DQlI6CiAgY2FzZSBBQUNFTkNfQlJfTU9ERV9TRlI6CiAgY2FzZSBBQUNFTkNfQlJfTU9ERV9GRjoKICBkZWZhdWx0OgogICAgYml0cmF0ZSA9IDA7CiAgICBicmVhazsKICB9CgogIC8qIGNvbnZlcnQgY2hhbm5lbCBiaXRyYXRlIHRvIG92ZXJhbGwgYml0cmF0ZSovCiAgYml0cmF0ZSAqPSBGREthYWNFbmNfR2V0Q2hhbm5lbE1vZGVDb25maWd1cmF0aW9uKGNoYW5uZWxNb2RlKS0+bkNoYW5uZWxzRWZmOwoKICByZXR1cm4gYml0cmF0ZTsKfQoKLyoqCiAqIFxicmllZiAgQ29udmVydCBlbmNvZGVyIGJpdHJlc2Vydm9pciB2YWx1ZSBmb3IgdHJhbnNwb3J0IGxpYnJhcnkuCiAqCiAqIFxwYXJhbSBiaXRyYXRlTW9kZSAgICAgICAgICAgQml0cmF0ZW1vZGUgdXNlZCBpbiBjdXJyZW50IGVuY29kZXIgaW5zdGFuY2UuIFNlIDo6QUFDRU5DX0JJVFJBVEVfTU9ERQogKiBccGFyYW0gYml0cmVzVG90YWwgICAgICAgICAgIEVuY29kZXIgYml0cmVzZXJ2b2lyIGxldmVsIGluIGJpdHMuCiAqCiAqIFxyZXR1cm4gIENvcnJlY3RlZCBiaXRyZXNlcnZvaXIgbGV2ZWwgdXNlZCBpbiB0cmFuc3BvcnQgbGlicmFyeS4KICovCnN0YXRpYyBJTlQgRkRLYWFjRW5jX0VuY0JpdHJlc1RvVHBCaXRyZXMoCiAgICAgICAgY29uc3QgQUFDRU5DX0JJVFJBVEVfTU9ERSBiaXRyYXRlTW9kZSwKICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgIGJpdHJlc1RvdGFsCiAgICAgICAgKQp7CiAgSU5UIHRyYW5zcG9yQml0cmVzZXJ2b2lyID0gMDsKCiAgc3dpdGNoIChiaXRyYXRlTW9kZSkgewogICAgY2FzZSBBQUNFTkNfQlJfTU9ERV9DQlI6CiAgICAgIHRyYW5zcG9yQml0cmVzZXJ2b2lyID0gYml0cmVzVG90YWw7IC8qIGVuY29kZXIgYml0cmVzZXJ2b2lyIGxldmVsICovCiAgICAgIGJyZWFrOwogICAgY2FzZSBBQUNFTkNfQlJfTU9ERV9WQlJfMToKICAgIGNhc2UgQUFDRU5DX0JSX01PREVfVkJSXzI6CiAgICBjYXNlIEFBQ0VOQ19CUl9NT0RFX1ZCUl8zOgogICAgY2FzZSBBQUNFTkNfQlJfTU9ERV9WQlJfNDoKICAgIGNhc2UgQUFDRU5DX0JSX01PREVfVkJSXzU6CiAgICAgIHRyYW5zcG9yQml0cmVzZXJ2b2lyID0gRkRLX0lOVF9NQVg7IC8qIHNpZ25hbCB2YXJpYWJsZSBiaXRyYXRlICovCiAgICAgIGJyZWFrOwogICAgY2FzZSBBQUNFTkNfQlJfTU9ERV9GRjoKICAgIGNhc2UgQUFDRU5DX0JSX01PREVfU0ZSOgogICAgICB0cmFuc3BvckJpdHJlc2Vydm9pciA9IDA7ICAgICAgICAgICAvKiBzdXBlciBmcmFtaW5nIGFuZCBmaXhlZCBmcmFtaW5nICovCiAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdpdGhvdXQgYml0cmVzZXJ2b2lyIHNpZ25hbGluZyAqLwogICAgZGVmYXVsdDoKICAgIGNhc2UgQUFDRU5DX0JSX01PREVfSU5WQUxJRDoKICAgICAgdHJhbnNwb3JCaXRyZXNlcnZvaXIgPSAwOyAgICAgICAgICAgLyogaW52YWxpZCBjb25maWd1cmF0aW9uKi8KICAgICAgRkRLX0FTU0VSVCgwKTsKICB9CgogIHJldHVybiB0cmFuc3BvckJpdHJlc2Vydm9pcjsKfQoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgICBmdW5jdGlvbm5hbWU6IEZES2FhY0VuY19BYWNJbml0RGVmYXVsdENvbmZpZwogICAgIGRlc2NyaXB0aW9uOiAgZ2l2ZXMgcmVhc29uYWJsZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24KICAgICByZXR1cm5zOiAgICAgIC0tLQoKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCnZvaWQgRkRLYWFjRW5jX0FhY0luaXREZWZhdWx0Q29uZmlnKEFBQ0VOQ19DT05GSUcgKmNvbmZpZykKewogICAgLyogbWFrZSB0aGVwcmUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHN0cnVjdHMgZmxleGlibGUgKi8KICAgIEZES21lbWNsZWFyKGNvbmZpZywgc2l6ZW9mKEFBQ0VOQ19DT05GSUcpKTsKCiAgICAvKiBkZWZhdWx0IGFuY2lsbGFyeSAqLwogICAgY29uZmlnLT5hbmNfUmF0ZSA9IDA7ICAgICAgICAgLyogbm8gYW5jaWxsYXJ5IGRhdGEgKi8KICAgIGNvbmZpZy0+YW5jRGF0YUJpdFJhdGUgPSAwOyAgIC8qIG5vIGFkZGl0aW9uYWwgY29uc3VtZWQgYml0cmF0ZSAqLwoKICAgIC8qIGRlZmF1bHQgY29uZmlndXJhdGlvbnMgKi8KICAgIGNvbmZpZy0+Yml0UmF0ZSAgICAgICAgID0gLTE7ICAgICAgICAgICAgICAgICAgIC8qIGJpdHJhdGUgbXVzdCBiZSBzZXQqLwogICAgY29uZmlnLT5hdmVyYWdlQml0cyAgICAgPSAtMTsgICAgICAgICAgICAgICAgICAgLyogaW5zdGVhZCBvZiBiaXRyYXRlL3Mgd2UgY2FuIGNvbmZpZ3VyZSBiaXRzL3N1cGVyZnJhbWUgKi8KICAgIGNvbmZpZy0+Yml0cmF0ZU1vZGUgICAgID0gMDsKICAgIGNvbmZpZy0+YmFuZFdpZHRoICAgICAgID0gMDsgICAgICAgICAgICAgICAgICAgIC8qIGdldCBiYW5kd2lkdGggZnJvbSB0YWJsZSAqLwogICAgY29uZmlnLT51c2VUbnMgICAgICAgICAgPSBUTlNfRU5BQkxFX01BU0s7ICAgICAgLyogdG5zIGVuYWJsZWQgY29tcGxldGx5ICovCiAgICBjb25maWctPnVzZVBucyAgICAgICAgICA9IDE7ICAgICAgICAgICAgICAgICAgICAvKiBkZXBlbmRpbmcgb24gY2hhbm5lbEJpdHJhdGUgdGhpcyBtaWdodCBiZSBzZXQgdG8gMCBsYXRlciAqLwogICAgY29uZmlnLT51c2VJUyAgICAgICAgICAgPSAxOyAgICAgICAgICAgICAgICAgICAgLyogSW50ZW5zaXR5IFN0ZXJlbyBDb25maWd1cmF0aW9uICovCiAgICBjb25maWctPmZyYW1lbGVuZ3RoICAgICA9IC0xOyAgICAgICAgICAgICAgICAgICAvKiBGcmFtZXNpemUgbm90IGNvbmZpZ3VyZWQgKi8KICAgIGNvbmZpZy0+c3ludGF4RmxhZ3MgICAgID0gMDsgICAgICAgICAgICAgICAgICAgIC8qIGRlZmF1bHQgc3ludGF4IHdpdGggbm8gc3BlY2lhbGl0aWVzICovCiAgICBjb25maWctPmVwQ29uZmlnICAgICAgICA9IC0xOyAgICAgICAgICAgICAgICAgICAvKiBubyBFUiBzeW50YXggLT4gbm8gYWRkaXRpb25hbCBlcnJvciBwcm90ZWN0aW9uICovCiAgICBjb25maWctPm5TdWJGcmFtZXMgICAgICA9IDE7ICAgICAgICAgICAgICAgICAgICAvKiBkZWZhdWx0LCBubyBzdWIgZnJhbWVzICovCiAgICBjb25maWctPmNoYW5uZWxPcmRlciAgICA9IENIX09SREVSX01QRUc7ICAgICAgICAvKiBVc2UgTVBFRyBjaGFubmVsIG9yZGVyaW5nLiAqLwogICAgY29uZmlnLT5jaGFubmVsTW9kZSAgICAgPSBNT0RFX1VOS05PV047CiAgICBjb25maWctPm1pbkJpdHNQZXJGcmFtZSA9IC0xOyAgICAgICAgICAgICAgICAgICAvKiBtaW51bSBudW1iZXIgb2YgYml0cyBpbiBlYWNoIEFVICovCiAgICBjb25maWctPm1heEJpdHNQZXJGcmFtZSA9IC0xOyAgICAgICAgICAgICAgICAgICAvKiBtaW51bSBudW1iZXIgb2YgYml0cyBpbiBlYWNoIEFVICovCiAgICBjb25maWctPmJpdHJlc2Vydm9pciAgICA9IC0xOyAgICAgICAgICAgICAgICAgICAvKiBkZWZhdWx0LCB1bmluaXRpYWxpemVkIHZhbHVlICovCgogICAgLyogaW5pdCB0YWJzIGluIGZpeHBvaW50X21hdGggKi8KICAgIEluaXRMZEludCgpOwogICAgSW5pdEludlNxcnRUYWIoKTsKfQoKCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfT3BlbgogICAgZGVzY3JpcHRpb246ICBhbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBhIG5ldyBlbmNvZGVyIGluc3RhbmNlCiAgICByZXR1cm5zOiAgICAgIGVycm9yIGNvZGUKCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX09wZW4oSEFORExFX0FBQ19FTkMgICpwaEFhY0VuYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgICBuRWxlbWVudHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICAgbkNoYW5uZWxzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAgIG5TdWJGcmFtZXMpCnsKICBBQUNfRU5DT0RFUl9FUlJPUiBFcnJvclN0YXR1czsKICBBQUNfRU5DICAgICAgICAgICAqaEFhY0VuYyA9IE5VTEw7CiAgVUNIQVIgICAgICAgICAgICAgKmR5bmFtaWNSQU0gPSBOVUxMOwoKICBpZiAocGhBYWNFbmM9PU5VTEwpIHsKICAgIHJldHVybiBBQUNfRU5DX0lOVkFMSURfSEFORExFOwogIH0KCiAgLyogYWxsb2NhdGUgZW5jb2RlciBzdHJ1Y3R1cmUgKi8KICBoQWFjRW5jID0gR2V0UmFtX2FhY0VuY19BYWNFbmNvZGVyKCk7CiAgaWYgKGhBYWNFbmMgPT0gTlVMTCkgewogICAgRXJyb3JTdGF0dXMgPSBBQUNfRU5DX05PX01FTU9SWTsKICAgIGdvdG8gYmFpbDsKICB9CiAgRkRLbWVtY2xlYXIoaEFhY0VuYywgc2l6ZW9mKEFBQ19FTkMpKTsKCiAgaEFhY0VuYy0+ZHluYW1pY19SQU0gPSBHZXRBQUNkeW5hbWljX1JBTSgpOwogIGR5bmFtaWNSQU0gPSAoVUNIQVIqKWhBYWNFbmMtPmR5bmFtaWNfUkFNOwoKICAvKiBhbGxvY2F0ZSB0aGUgUHN5IGF1ZCBQc3kgT3V0IHN0cnVjdHVyZSAqLwogICBFcnJvclN0YXR1cyA9IEZES2FhY0VuY19Qc3lOZXcoJmhBYWNFbmMtPnBzeUtlcm5lbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5FbGVtZW50cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5DaGFubmVscwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsZHluYW1pY1JBTQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICBpZiAoRXJyb3JTdGF0dXMgIT0gQUFDX0VOQ19PSykKICAgICBnb3RvIGJhaWw7CgogICBFcnJvclN0YXR1cyA9IEZES2FhY0VuY19Qc3lPdXROZXcoaEFhY0VuYy0+cHN5T3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbkVsZW1lbnRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbkNoYW5uZWxzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgblN1YkZyYW1lcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsZHluYW1pY1JBTQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICBpZiAoRXJyb3JTdGF0dXMgIT0gQUFDX0VOQ19PSykKICAgICBnb3RvIGJhaWw7CgogIC8qIGFsbG9jYXRlIHRoZSBRJkMgT3V0IHN0cnVjdHVyZSAqLwogIEVycm9yU3RhdHVzID0gRkRLYWFjRW5jX1FDT3V0TmV3KGhBYWNFbmMtPnFjT3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5FbGVtZW50cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuQ2hhbm5lbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgblN1YkZyYW1lcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLGR5bmFtaWNSQU0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogIGlmIChFcnJvclN0YXR1cyAhPSBBQUNfRU5DX09LKQogICAgZ290byBiYWlsOwoKICAvKiBhbGxvY2F0ZSB0aGUgUSZDIGtlcm5lbCAqLwogIEVycm9yU3RhdHVzID0gRkRLYWFjRW5jX1FDTmV3KCZoQWFjRW5jLT5xY0tlcm5lbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbkVsZW1lbnRzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLGR5bmFtaWNSQU0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogIGlmIChFcnJvclN0YXR1cyAhPSBBQUNfRU5DX09LKQogICAgZ290byBiYWlsOwoKICBoQWFjRW5jLT5tYXhDaGFubmVscyA9IG5DaGFubmVsczsKICBoQWFjRW5jLT5tYXhFbGVtZW50cyA9IG5FbGVtZW50czsKICBoQWFjRW5jLT5tYXhGcmFtZXMgICA9IG5TdWJGcmFtZXM7CgpiYWlsOgogICpwaEFhY0VuYyA9IGhBYWNFbmM7CiAgcmV0dXJuIEVycm9yU3RhdHVzOwp9CgoKQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX0luaXRpYWxpemUoSEFORExFX0FBQ19FTkMgICAgICBoQWFjRW5jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQUNFTkNfQ09ORklHICAgICAgKmNvbmZpZywgICAgIC8qIHByZS1pbml0aWFsaXplZCBjb25maWcgc3RydWN0ICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9UUkFOU1BPUlRFTkMgaFRwRW5jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTE9ORyAgICAgICAgICAgICAgIGluaXRGbGFncykKewogIEFBQ19FTkNPREVSX0VSUk9SIEVycm9yU3RhdHVzOwogIElOVCBwc3lCaXRyYXRlLCB0bnNNYXNrOyAvL0lOVCBwcm9maWxlID0gMTsKICBDSEFOTkVMX01BUFBJTkcgICAqY20gPSBOVUxMOwoKICBJTlQgcW1iZmFjLCBxYnc7CiAgRklYUF9EQkwgbWJmYWMsIGJ3X3JhdGlvOwogIFFDX0lOSVQgcWNJbml0OwogIElOVCBhdmVyYWdlQml0c1BlckZyYW1lID0gMDsKCiAgaWYgKGNvbmZpZz09TlVMTCkKICAgIHJldHVybiBBQUNfRU5DX0lOVkFMSURfSEFORExFOwoKICAvKioqKioqKioqKioqKioqKioqKiBzYW5pdHkgY2hlY2tzICoqKioqKioqKioqKioqKioqKiovCgogIC8qIGNoZWNrIGNvbmZpZyBzdHJ1Y3R1cmUgKi8KICBpZiAoY29uZmlnLT5uQ2hhbm5lbHMgIDwgMSB8fCBjb25maWctPm5DaGFubmVscyA+ICg4KSkgewogICAgcmV0dXJuIEFBQ19FTkNfVU5TVVBQT1JURURfQ0hBTk5FTENPTkZJRzsKICB9CgogIC8qIGNoZWNrIHNhbXBsZSByYXRlICovCiAgc3dpdGNoIChjb25maWctPnNhbXBsZVJhdGUpCiAgewogICAgY2FzZSA4MDAwOgogICAgY2FzZSAxMTAyNToKICAgIGNhc2UgMTIwMDA6CiAgICBjYXNlIDE2MDAwOgogICAgY2FzZSAyMjA1MDoKICAgIGNhc2UgMjQwMDA6CiAgICBjYXNlIDMyMDAwOgogICAgY2FzZSA0NDEwMDoKICAgIGNhc2UgNDgwMDA6CiAgICBjYXNlIDY0MDAwOgogICAgY2FzZSA4ODIwMDoKICAgIGNhc2UgOTYwMDA6CiAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgcmV0dXJuIEFBQ19FTkNfVU5TVVBQT1JURURfU0FNUExJTkdSQVRFOwogIH0KCiAgLyogYml0cmF0ZSBoYXMgdG8gYmUgc2V0ICovCiAgaWYgKGNvbmZpZy0+Yml0UmF0ZT09LTEpIHsKICAgICAgcmV0dXJuIEFBQ19FTkNfVU5TVVBQT1JURURfQklUUkFURTsKICB9CgogIC8qIGNoZWNrIGJpdCByYXRlICovCgogIGlmIChGREthYWNFbmNfTGltaXRCaXRyYXRlKAogICAgICAgICAgaFRwRW5jLAogICAgICAgICAgY29uZmlnLT5zYW1wbGVSYXRlLAogICAgICAgICAgY29uZmlnLT5mcmFtZWxlbmd0aCwKICAgICAgICAgIGNvbmZpZy0+bkNoYW5uZWxzLAogICAgICAgICAgRkRLYWFjRW5jX0dldENoYW5uZWxNb2RlQ29uZmlndXJhdGlvbihjb25maWctPmNoYW5uZWxNb2RlKS0+bkNoYW5uZWxzRWZmLAogICAgICAgICAgY29uZmlnLT5iaXRSYXRlLAogICAgICAgICAgY29uZmlnLT5hdmVyYWdlQml0cywKICAgICAgICAgJmF2ZXJhZ2VCaXRzUGVyRnJhbWUsCiAgICAgICAgICBjb25maWctPmJpdHJhdGVNb2RlLAogICAgICAgICAgY29uZmlnLT5uU3ViRnJhbWVzCiAgICAgICAgICApICE9IGNvbmZpZy0+Yml0UmF0ZSApCiAgewogICAgcmV0dXJuIEFBQ19FTkNfVU5TVVBQT1JURURfQklUUkFURTsKICB9CgogIGlmIChjb25maWctPnN5bnRheEZsYWdzICYgQUNfRVJfVkNCMTEpIHsKICAgICAgcmV0dXJuIEFBQ19FTkNfVU5TVVBQT1JURURfRVJfRk9STUFUOwogIH0KICBpZiAoY29uZmlnLT5zeW50YXhGbGFncyAmIEFDX0VSX0hDUikgewogICAgICByZXR1cm4gQUFDX0VOQ19VTlNVUFBPUlRFRF9FUl9GT1JNQVQ7CiAgfQoKICAvKiBjaGVjayBmcmFtZSBsZW5ndGggKi8KICBzd2l0Y2ggKGNvbmZpZy0+ZnJhbWVsZW5ndGgpCiAgewogICAgY2FzZSAxMDI0OgogICAgICBpZiAoIGNvbmZpZy0+YXVkaW9PYmplY3RUeXBlID09IEFPVF9FUl9BQUNfTEQKICAgICAgICB8fCBjb25maWctPmF1ZGlvT2JqZWN0VHlwZSA9PSBBT1RfRVJfQUFDX0VMRCApCiAgICAgIHsKICAgICAgICByZXR1cm4gQUFDX0VOQ19JTlZBTElEX0ZSQU1FX0xFTkdUSDsKICAgICAgfQogICAgICBicmVhazsKICAgIGNhc2UgNTEyOgogICAgY2FzZSA0ODA6CiAgICAgIGlmICggY29uZmlnLT5hdWRpb09iamVjdFR5cGUgIT0gQU9UX0VSX0FBQ19MRAogICAgICAgICYmIGNvbmZpZy0+YXVkaW9PYmplY3RUeXBlICE9IEFPVF9FUl9BQUNfRUxEICkKICAgICAgewogICAgICAgIHJldHVybiBBQUNfRU5DX0lOVkFMSURfRlJBTUVfTEVOR1RIOwogICAgICB9CiAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgcmV0dXJuIEFBQ19FTkNfSU5WQUxJRF9GUkFNRV9MRU5HVEg7CiAgfQoKICBpZiAoY29uZmlnLT5hbmNfUmF0ZSAhPSAwKSB7CgogICAgIEVycm9yU3RhdHVzID0gRkRLYWFjRW5jX0luaXRDaGVja0FuY2lsbGFyeShjb25maWctPmJpdFJhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+ZnJhbWVsZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+YW5jX1JhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhBYWNFbmMtPmFuY2lsbGFyeUJpdHNQZXJGcmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5zYW1wbGVSYXRlKTsKICAgICBpZiAoRXJyb3JTdGF0dXMgIT0gQUFDX0VOQ19PSykKICAgICAgIGdvdG8gYmFpbDsKCgogICAgIC8qIHVwZGF0ZSBlc3RpbWF0ZWQgY29uc3VtZWQgYml0cmF0ZSAqLwogICAgIGNvbmZpZy0+YW5jRGF0YUJpdFJhdGUgKz0gKCAoaEFhY0VuYy0+YW5jaWxsYXJ5Qml0c1BlckZyYW1lICogY29uZmlnLT5zYW1wbGVSYXRlKSAvIGNvbmZpZy0+ZnJhbWVsZW5ndGggKTsKCiAgfQoKICAvKiBtYXhpbWFsIGFsbG93ZWQgRFNFIGJ5dGVzIGluIGZyYW1lICovCiAgewogIC8qIGZpeHBvaW50IGNhbGN1bGF0aW9uKi8KICBJTlQgcV9yZXMsIGVuY0JpdHJhdGUsIHNjOwogIEZJWFBfREJMIHRtcCA9IGZEaXZOb3JtKGNvbmZpZy0+ZnJhbWVsZW5ndGgsIGNvbmZpZy0+c2FtcGxlUmF0ZSwgJnFfcmVzKTsKICBlbmNCaXRyYXRlID0gKGNvbmZpZy0+Yml0UmF0ZS8qLWNvbmZpZy0+YW5jRGF0YUJpdFJhdGUqLyktIChJTlQpKGNvbmZpZy0+bkNoYW5uZWxzKjgwMDApOwogIHNjID0gQ291bnRMZWFkaW5nQml0cyhlbmNCaXRyYXRlKTsKICBjb25maWctPm1heEFuY0J5dGVzUGVyQVUgPSBGREttaW4oICgyNTYpLCBGREttYXgoMCwoSU5UKShmTXVsdERpdjIodG1wLCAoRklYUF9EQkwpKGVuY0JpdHJhdGU8PHNjKSk+PigtcV9yZXMrc2MtMSszKSkpICk7CiAgfQoKICAvKiBiaW5kIGNvbmZpZyB0byBoQWFjRW5jLT5jb25maWcgKi8KICBoQWFjRW5jLT5jb25maWcgPSBjb25maWc7CgogIC8qIHNldCBoQWFjRW5jLT5iaXRyYXRlTW9kZSAqLwogIGhBYWNFbmMtPmJpdHJhdGVNb2RlID0gKEFBQ0VOQ19CSVRSQVRFX01PREUpY29uZmlnLT5iaXRyYXRlTW9kZTsKCiAgaEFhY0VuYy0+ZW5jb2Rlck1vZGUgPSBjb25maWctPmNoYW5uZWxNb2RlOwoKICBFcnJvclN0YXR1cyA9IEZES2FhY0VuY19Jbml0Q2hhbm5lbE1hcHBpbmcoaEFhY0VuYy0+ZW5jb2Rlck1vZGUsIGNvbmZpZy0+Y2hhbm5lbE9yZGVyLCAmaEFhY0VuYy0+Y2hhbm5lbE1hcHBpbmcpOwogIGlmIChFcnJvclN0YXR1cyAhPSBBQUNfRU5DX09LKQogICAgZ290byBiYWlsOwoKICBjbSA9ICZoQWFjRW5jLT5jaGFubmVsTWFwcGluZzsKCiAgRXJyb3JTdGF0dXMgPSBGREthYWNFbmNfRGV0ZXJtaW5lQmFuZFdpZHRoKCZoQWFjRW5jLT5jb25maWctPmJhbmRXaWR0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5iYW5kV2lkdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+Yml0UmF0ZSAtIGNvbmZpZy0+YW5jRGF0YUJpdFJhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhBYWNFbmMtPmJpdHJhdGVNb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWctPnNhbXBsZVJhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+ZnJhbWVsZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQWFjRW5jLT5lbmNvZGVyTW9kZSk7CiAgaWYgKEVycm9yU3RhdHVzICE9IEFBQ19FTkNfT0spCiAgICBnb3RvIGJhaWw7CgogIGhBYWNFbmMtPmJhbmR3aWR0aDkwZEIgPSAoSU5UKWhBYWNFbmMtPmNvbmZpZy0+YmFuZFdpZHRoOwoKICB0bnNNYXNrID0gY29uZmlnLT51c2VUbnMgPyBUTlNfRU5BQkxFX01BU0sgOiAweDA7CiAgcHN5Qml0cmF0ZSA9IGNvbmZpZy0+Yml0UmF0ZSAtIGNvbmZpZy0+YW5jRGF0YUJpdFJhdGU7CgogIEVycm9yU3RhdHVzID0gRkRLYWFjRW5jX3BzeUluaXQoaEFhY0VuYy0+cHN5S2VybmVsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEFhY0VuYy0+cHN5T3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEFhY0VuYy0+bWF4RnJhbWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEFhY0VuYy0+bWF4Q2hhbm5lbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWctPmF1ZGlvT2JqZWN0VHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtKTsKICBpZiAoRXJyb3JTdGF0dXMgIT0gQUFDX0VOQ19PSykKICAgIGdvdG8gYmFpbDsKCiAgRXJyb3JTdGF0dXMgPSBGREthYWNFbmNfcHN5TWFpbkluaXQoaEFhY0VuYy0+cHN5S2VybmVsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+YXVkaW9PYmplY3RUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+c2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWctPmZyYW1lbGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeUJpdHJhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG5zTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQWFjRW5jLT5iYW5kd2lkdGg5MGRCLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+dXNlUG5zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+dXNlSVMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5zeW50YXhGbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0RmxhZ3MpOwogIGlmIChFcnJvclN0YXR1cyAhPSBBQUNfRU5DX09LKQogICAgZ290byBiYWlsOwoKICBFcnJvclN0YXR1cyA9IEZES2FhY0VuY19RQ091dEluaXQoaEFhY0VuYy0+cWNPdXQsIGhBYWNFbmMtPm1heEZyYW1lcywgY20pOwogIGlmIChFcnJvclN0YXR1cyAhPSBBQUNfRU5DX09LKQogICAgZ290byBiYWlsOwoKCgogIHFjSW5pdC5jaGFubmVsTWFwcGluZyAgICAgID0gJmhBYWNFbmMtPmNoYW5uZWxNYXBwaW5nOwogIHFjSW5pdC5zY2VDcGUgICAgICAgICAgICAgID0gMDsKCiAgaWYgKChjb25maWctPmJpdHJhdGVNb2RlPj0xKSAmJiAoY29uZmlnLT5iaXRyYXRlTW9kZTw9NSkpIHsKICAgICAgcWNJbml0LmF2ZXJhZ2VCaXRzICAgICA9IChhdmVyYWdlQml0c1BlckZyYW1lKzcpJn43OwogICAgICBxY0luaXQuYml0UmVzICAgICAgICAgID0gTUlOX0JVRlNJWkVfUEVSX0VGRl9DSEFOKmNtLT5uQ2hhbm5lbHNFZmY7CiAgICAgIHFjSW5pdC5tYXhCaXRzICAgICAgICAgPSBNSU5fQlVGU0laRV9QRVJfRUZGX0NIQU4qY20tPm5DaGFubmVsc0VmZjsKICAgICAgcWNJbml0Lm1pbkJpdHMgICAgICAgICA9IDA7CiAgfQogIGVsc2UKICB7CiAgICAgIGludCBtYXhCaXRyZXM7CiAgICAgIHFjSW5pdC5hdmVyYWdlQml0cyAgICAgPSAoYXZlcmFnZUJpdHNQZXJGcmFtZSs3KSZ+NzsKICAgICAgbWF4Qml0cmVzICAgICAgICAgICAgICA9IChNSU5fQlVGU0laRV9QRVJfRUZGX0NIQU4qY20tPm5DaGFubmVsc0VmZikgLSBxY0luaXQuYXZlcmFnZUJpdHM7CiAgICAgIHFjSW5pdC5iaXRSZXMgICAgICAgICAgPSAoY29uZmlnLT5iaXRyZXNlcnZvaXIhPS0xKSA/IEZES21pbihjb25maWctPmJpdHJlc2Vydm9pciwgbWF4Qml0cmVzKSA6IG1heEJpdHJlczsKCiAgICAgIHFjSW5pdC5tYXhCaXRzICAgICAgICAgPSBmaXhNaW4oTUlOX0JVRlNJWkVfUEVSX0VGRl9DSEFOKmNtLT5uQ2hhbm5lbHNFZmYsICgoYXZlcmFnZUJpdHNQZXJGcmFtZSs3KSZ+NykrcWNJbml0LmJpdFJlcyk7CiAgICAgIHFjSW5pdC5tYXhCaXRzICAgICAgICAgPSAoY29uZmlnLT5tYXhCaXRzUGVyRnJhbWUhPS0xKSA/IGZpeE1pbihxY0luaXQubWF4Qml0cywgY29uZmlnLT5tYXhCaXRzUGVyRnJhbWUpIDogcWNJbml0Lm1heEJpdHM7CgogICAgICBxY0luaXQubWluQml0cyAgICAgICAgID0gZml4TWF4KDAsICgoYXZlcmFnZUJpdHNQZXJGcmFtZS0xKSZ+NyktcWNJbml0LmJpdFJlcy10cmFuc3BvcnRFbmNfR2V0U3RhdGljQml0cyhoVHBFbmMsICgoYXZlcmFnZUJpdHNQZXJGcmFtZSs3KSZ+NykrcWNJbml0LmJpdFJlcykpOwogICAgICBxY0luaXQubWluQml0cyAgICAgICAgID0gKGNvbmZpZy0+bWluQml0c1BlckZyYW1lIT0tMSkgPyBmaXhNYXgocWNJbml0Lm1pbkJpdHMsIGNvbmZpZy0+bWluQml0c1BlckZyYW1lKSA6IHFjSW5pdC5taW5CaXRzOwogIH0KCiAgcWNJbml0LnNhbXBsZVJhdGUgICAgICAgICAgPSBjb25maWctPnNhbXBsZVJhdGU7CiAgcWNJbml0LmFkdmFuY2VkQml0c1RvUGUgICAgPSBpc0xvd0RlbGF5KGNvbmZpZy0+YXVkaW9PYmplY3RUeXBlKSA/IDEgOiAwIDsKICBxY0luaXQublN1YkZyYW1lcyAgICAgICAgICA9IGNvbmZpZy0+blN1YkZyYW1lczsKICBxY0luaXQucGFkZGluZy5wYWRkaW5nUmVzdCA9IGNvbmZpZy0+c2FtcGxlUmF0ZTsKCiAgLyogQ2FsYyBtZWFuUGUgKi8KICBid19yYXRpbyA9IGZEaXZOb3JtKChGSVhQX0RCTCloQWFjRW5jLT5iYW5kd2lkdGg5MGRCLCAoRklYUF9EQkwpKGNvbmZpZy0+c2FtcGxlUmF0ZT4+MSksICZxYncpOwogIHFidyA9IERGUkFDVF9CSVRTLTEtcWJ3OwogIC8qIHFjSW5pdC5tZWFuUGUgPSAxMC4wZiAqIEZSQU1FX0xFTl9MT05HICogaEFhY0VuYy0+YmFuZHdpZHRoOTBkQi8oY29uZmlnLT5zYW1wbGVSYXRlLzIuMGYpOyAqLwogIHFjSW5pdC5tZWFuUGUgPSBmTXVsdChid19yYXRpbywgKEZJWFBfREJMKSgoMTAqY29uZmlnLT5mcmFtZWxlbmd0aCk8PDE2KSkgPj4gKHFidy0xNSk7CgogIC8qIENhbGMgbWF4Qml0RmFjICovCiAgbWJmYWMgPSBmRGl2Tm9ybSgoTUlOX0JVRlNJWkVfUEVSX0VGRl9DSEFOLTc0NCkqY20tPm5DaGFubmVsc0VmZiwgcWNJbml0LmF2ZXJhZ2VCaXRzL3FjSW5pdC5uU3ViRnJhbWVzLCAmcW1iZmFjKTsKICBxbWJmYWMgPSBERlJBQ1RfQklUUy0xLXFtYmZhYzsKICBxY0luaXQubWF4Qml0RmFjID0gKHFtYmZhYyA+IDI0KSA/IChtYmZhYyA+PiAocW1iZmFjIC0gMjQpKToobWJmYWMgPDwgKDI0IC0gcW1iZmFjKSk7CgogIHN3aXRjaChjb25maWctPmJpdHJhdGVNb2RlKXsKICBjYXNlIEFBQ0VOQ19CUl9NT0RFX0NCUjoKICAgIHFjSW5pdC5iaXRyYXRlTW9kZSA9IFFDREFUQV9CUl9NT0RFX0NCUjsKICAgIGJyZWFrOwogIGNhc2UgQUFDRU5DX0JSX01PREVfVkJSXzE6CiAgICBxY0luaXQuYml0cmF0ZU1vZGUgPSBRQ0RBVEFfQlJfTU9ERV9WQlJfMTsKICAgIGJyZWFrOwogIGNhc2UgQUFDRU5DX0JSX01PREVfVkJSXzI6CiAgICBxY0luaXQuYml0cmF0ZU1vZGUgPSBRQ0RBVEFfQlJfTU9ERV9WQlJfMjsKICAgIGJyZWFrOwogIGNhc2UgQUFDRU5DX0JSX01PREVfVkJSXzM6CiAgICBxY0luaXQuYml0cmF0ZU1vZGUgPSBRQ0RBVEFfQlJfTU9ERV9WQlJfMzsKICAgIGJyZWFrOwogIGNhc2UgQUFDRU5DX0JSX01PREVfVkJSXzQ6CiAgICBxY0luaXQuYml0cmF0ZU1vZGUgPSBRQ0RBVEFfQlJfTU9ERV9WQlJfNDsKICAgIGJyZWFrOwogIGNhc2UgQUFDRU5DX0JSX01PREVfVkJSXzU6CiAgICBxY0luaXQuYml0cmF0ZU1vZGUgPSBRQ0RBVEFfQlJfTU9ERV9WQlJfNTsKICAgIGJyZWFrOwogIGNhc2UgQUFDRU5DX0JSX01PREVfU0ZSOgogICAgcWNJbml0LmJpdHJhdGVNb2RlID0gUUNEQVRBX0JSX01PREVfU0ZSOwogICAgYnJlYWs7CiAgY2FzZSBBQUNFTkNfQlJfTU9ERV9GRjoKICAgIHFjSW5pdC5iaXRyYXRlTW9kZSA9IFFDREFUQV9CUl9NT0RFX0ZGOwogICAgYnJlYWs7CiAgZGVmYXVsdDoKICAgIEVycm9yU3RhdHVzID0gQUFDX0VOQ19VTlNVUFBPUlRFRF9CSVRSQVRFX01PREU7CiAgICBnb3RvIGJhaWw7CiAgfQoKICBxY0luaXQuaW52UXVhbnQgPSAoY29uZmlnLT51c2VSZXF1YW50KT8yOjA7CgogIC8qIG1heEl0ZXJhdGlvbnMgc2hvdWxkIGJlIHNldCB0byB0aGUgbWF4aW11bSBudW1iZXIgb2YgcmVxdWFudGl6YXRpb24gaXRlcmF0aW9ucyB0aGF0IGFyZQogICAqIGFsbG93ZWQgYmVmb3JlIHRoZSBjcmFzaCByZWNvdmVyeSBmdW5jdGlvbmFsaXR5IGlzIGFjdGl2YXRlZC4gVGhpcyBzZXR0aW5nIHNob3VsZCBiZSBhZGp1c3RlZAogICAqIHRvIHRoZSBwcm9jZXNzaW5nIHBvd2VyIGF2YWlsYWJsZSwgaS5lLiB0byB0aGUgcHJvY2Vzc2luZyBwb3dlciBoZWFkcm9vbSBpbiBvbmUgZnJhbWUgdGhhdCBpcwogICAqIHN0aWxsIGxlZnQgYWZ0ZXIgbm9ybWFsIGVuY29kaW5nIHdpdGhvdXQgcmVxdWFudGl6YXRpb24uIFBsZWFzZSBub3RlIHRoYXQgaWYgYWN0aXZhdGVkIHRoaXMKICAgKiBmdW5jdGlvbmFsaXR5IGlzIHVzZWQgbW9zdCBsaWtlbHkgb25seSBpbiBjYXNlcyB3aGVyZSB0aGUgZW5jb2RlciBpcyBvcGVyYXRpbmcgYmV5b25kCiAgICogcmVjb21tZW5kZWQgc2V0dGluZ3MsIGkuZS4gdGhlIGF1ZGlvIHF1YWxpdHkgaXMgc3Vib3B0aW1hbCBhbnl3YXkuIEFjdGl2YXRpbmcgdGhlIGNyYXNoCiAgICogcmVjb3ZlcnkgZG9lcyBub3QgZnVydGhlciByZWR1Y2UgYXVkaW8gcXVhbGl0eSBzaWduaWZpY2FudGx5IGluIHRoZXNlIGNhc2VzLiAqLwogIGlmICggKGNvbmZpZy0+YXVkaW9PYmplY3RUeXBlID09IEFPVF9FUl9BQUNfTEQpIHx8IChjb25maWctPmF1ZGlvT2JqZWN0VHlwZSA9PSBBT1RfRVJfQUFDX0VMRCkgKSB7CiAgICBxY0luaXQubWF4SXRlcmF0aW9ucyA9IDI7CiAgfQogIGVsc2UKICB7CiAgICBxY0luaXQubWF4SXRlcmF0aW9ucyA9IDU7CiAgfQoKICBxY0luaXQuYml0cmF0ZSA9IGNvbmZpZy0+Yml0UmF0ZSAtIGNvbmZpZy0+YW5jRGF0YUJpdFJhdGU7CgogIHFjSW5pdC5zdGF0aWNCaXRzID0gdHJhbnNwb3J0RW5jX0dldFN0YXRpY0JpdHMoaFRwRW5jLCBxY0luaXQuYXZlcmFnZUJpdHMvcWNJbml0Lm5TdWJGcmFtZXMpOwoKICBFcnJvclN0YXR1cyA9IEZES2FhY0VuY19RQ0luaXQoaEFhY0VuYy0+cWNLZXJuZWwsICZxY0luaXQpOwogIGlmIChFcnJvclN0YXR1cyAhPSBBQUNfRU5DX09LKQogICAgZ290byBiYWlsOwoKICAvKiBNYXAgdmlydHVhbCBhb3QncyB0byBpbnRlcm4gYW90IHVzZWQgaW4gYml0c3RyZWFtIHdyaXRlci4gKi8KICBzd2l0Y2ggKGhBYWNFbmMtPmNvbmZpZy0+YXVkaW9PYmplY3RUeXBlKSB7CiAgICBjYXNlIEFPVF9NUDJfQUFDX0xDOgogICAgY2FzZSBBT1RfREFCUExVU19BQUNfTEM6CiAgICAgIGhBYWNFbmMtPmFvdCA9IEFPVF9BQUNfTEM7CiAgICAgIGJyZWFrOwogICAgY2FzZSBBT1RfTVAyX1NCUjoKICAgIGNhc2UgQU9UX0RBQlBMVVNfU0JSOgogICAgICBoQWFjRW5jLT5hb3QgPSBBT1RfU0JSOwogICAgICBicmVhazsKICAgIGNhc2UgQU9UX01QMl9QUzoKICAgIGNhc2UgQU9UX0RBQlBMVVNfUFM6CiAgICAgIGhBYWNFbmMtPmFvdCA9IEFPVF9QUzsKICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICBoQWFjRW5jLT5hb3QgPSBoQWFjRW5jLT5jb25maWctPmF1ZGlvT2JqZWN0VHlwZTsKICB9CgogIC8qIGNvbW1vbiB0aGluZ3MgKi8KCiAgcmV0dXJuIEFBQ19FTkNfT0s7CgpiYWlsOgoKICByZXR1cm4gRXJyb3JTdGF0dXM7Cn0KCgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgIGZ1bmN0aW9ubmFtZTogRkRLYWFjRW5jX0VuY29kZUZyYW1lCiAgICBkZXNjcmlwdGlvbjogIGVuY29kZXMgb25lIGZyYW1lCiAgICByZXR1cm5zOiAgICAgIGVycm9yIGNvZGUKCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX0VuY29kZUZyYW1lKCBIQU5ETEVfQUFDX0VOQyAgICAgICBoQWFjRW5jLCAgICAgICAgICAvKiBlbmNvZGVyIGhhbmRsZSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9UUkFOU1BPUlRFTkMgIGhUcEVuYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlRfUENNKiBSRVNUUklDVCAgICBpbnB1dEJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQqICAgICAgICAgICAgICAgICBuT3V0Qnl0ZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFDRU5DX0VYVF9QQVlMT0FEICAgZXh0UGF5bG9hZFtNQVhfVE9UQUxfRVhUX1BBWUxPQURTXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCnsKICAgIEFBQ19FTkNPREVSX0VSUk9SIEVycm9yU3RhdHVzOwogICAgaW50ICAgIGVsLCBuLCBjPTA7CiAgICBVQ0hBUiAgZXh0UGF5bG9hZFVzZWRbTUFYX1RPVEFMX0VYVF9QQVlMT0FEU107CgogICAgQ0hBTk5FTF9NQVBQSU5HICpjbSAgICAgID0gJmhBYWNFbmMtPmNoYW5uZWxNYXBwaW5nOwoKCgogICAgUFNZX09VVCAqcHN5T3V0ID0gaEFhY0VuYy0+cHN5T3V0W2NdOwogICAgUUNfT1VUICAqcWNPdXQgID0gaEFhY0VuYy0+cWNPdXRbY107CgogICAgRkRLbWVtY2xlYXIoZXh0UGF5bG9hZFVzZWQsIE1BWF9UT1RBTF9FWFRfUEFZTE9BRFMgKiBzaXplb2YoVUNIQVIpKTsKCiAgICBxY091dC0+ZWxlbWVudEV4dEJpdHMgPSAwOyAvKiBzdW0gdXAgYWxsIGV4dGVuZGVkIGJpdCBvZiBlYWNoIGVsZW1lbnQgKi8KICAgIHFjT3V0LT5zdGF0aWNCaXRzICAgICA9IDA7IC8qIHN1bSB1cCBzaWRlIGluZm8gYml0cyBvZiBlYWNoIGVsZW1lbnQgKi8KICAgIHFjT3V0LT50b3RhbE5vUmVkUGUgICA9IDA7IC8qIHN1bSB1cCBQRSAqLwoKICAgIC8qIGFkdmFuY2UgcHN5Y2hvYWNvdXN0aWNzICovCiAgICBmb3IgKGVsPTA7IGVsPGNtLT5uRWxlbWVudHM7IGVsKyspIHsKICAgICAgICBFTEVNRU5UX0lORk8gZWxJbmZvID0gY20tPmVsSW5mb1tlbF07CgogICAgICAgIGlmICggKGVsSW5mby5lbFR5cGUgPT0gSURfU0NFKQogICAgICAgICAgfHwgKGVsSW5mby5lbFR5cGUgPT0gSURfQ1BFKQogICAgICAgICAgfHwgKGVsSW5mby5lbFR5cGUgPT0gSURfTEZFKSApCiAgICAgICAgewogICAgICAgICAgICBpbnQgY2g7CgogICAgICAgICAgICAvKiB1cGRhdGUgcG9pbnRlciEqLwogICAgICAgICAgICBmb3IoY2g9MDtjaDxlbEluZm8ubkNoYW5uZWxzSW5FbDtjaCsrKSB7CiAgICAgICAgICAgICAgICBQU1lfT1VUX0NIQU5ORUwgKnBzeU91dENoYW4gPSBwc3lPdXQtPnBzeU91dEVsZW1lbnRbZWxdLT5wc3lPdXRDaGFubmVsW2NoXTsKICAgICAgICAgICAgICAgIFFDX09VVF9DSEFOTkVMICAqcWNPdXRDaGFuID0gcWNPdXQtPnFjRWxlbWVudFtlbF0tPnFjT3V0Q2hhbm5lbFtjaF07CgogICAgICAgICAgICAgICAgcHN5T3V0Q2hhbi0+bWRjdFNwZWN0cnVtICAgICAgID0gcWNPdXRDaGFuLT5tZGN0U3BlY3RydW07CiAgICAgICAgICAgICAgICBwc3lPdXRDaGFuLT5zZmJTcHJlYWRFbmVyZ3kgID0gcWNPdXRDaGFuLT5zZmJTcHJlYWRFbmVyZ3k7CiAgICAgICAgICAgICAgICBwc3lPdXRDaGFuLT5zZmJFbmVyZ3kgICAgICAgICAgPSBxY091dENoYW4tPnNmYkVuZXJneTsKICAgICAgICAgICAgICAgIHBzeU91dENoYW4tPnNmYkVuZXJneUxkRGF0YSAgICA9IHFjT3V0Q2hhbi0+c2ZiRW5lcmd5TGREYXRhOwogICAgICAgICAgICAgICAgcHN5T3V0Q2hhbi0+c2ZiTWluU25yTGREYXRhICAgID0gcWNPdXRDaGFuLT5zZmJNaW5TbnJMZERhdGE7CiAgICAgICAgICAgICAgICBwc3lPdXRDaGFuLT5zZmJUaHJlc2hvbGRMZERhdGEgPSBxY091dENoYW4tPnNmYlRocmVzaG9sZExkRGF0YTsKCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIEZES2FhY0VuY19wc3lNYWluKGVsSW5mby5uQ2hhbm5lbHNJbkVsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQWFjRW5jLT5wc3lLZXJuZWwtPnBzeUVsZW1lbnRbZWxdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQWFjRW5jLT5wc3lLZXJuZWwtPnBzeUR5bmFtaWMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhBYWNFbmMtPnBzeUtlcm5lbC0+cHN5Q29uZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0LT5wc3lPdXRFbGVtZW50W2VsXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRCdWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtLT5lbEluZm9bZWxdLkNoYW5uZWxJbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY20tPm5DaGFubmVscwoKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgLyogRm9ybUZhY3RvciwgUGUgYW5kIHN0YXRpY0JpdERlbWFuZCBjYWxjdWxhdGlvbiAqLwogICAgICAgICAgICBFcnJvclN0YXR1cyA9IEZES2FhY0VuY19RQ01haW5QcmVwYXJlKCZlbEluZm8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhBYWNFbmMtPnFjS2VybmVsLT5oQWRqVGhyLT5hZGpUaHJTdGF0ZUVsZW1bZWxdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXQtPnBzeU91dEVsZW1lbnRbZWxdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxY091dC0+cWNFbGVtZW50W2VsXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEFhY0VuYy0+YW90LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQWFjRW5jLT5jb25maWctPnN5bnRheEZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQWFjRW5jLT5jb25maWctPmVwQ29uZmlnKTsKCiAgICAgICAgICAgIGlmIChFcnJvclN0YXR1cyAhPSBBQUNfRU5DX09LKQogICAgICAgICAgICAgIHJldHVybiBFcnJvclN0YXR1czsKCiAgICAgICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCiAgICAgICAgICAgIHFjT3V0LT5xY0VsZW1lbnRbZWxdLT5leHRCaXRzVXNlZCA9IDA7CiAgICAgICAgICAgIHFjT3V0LT5xY0VsZW1lbnRbZWxdLT5uRXh0ZW5zaW9ucyA9IDA7CiAgICAgICAgICAgIC8qIHJlc2V0IGV4dGVuc2lvbiBwYXlsb2FkICovCiAgICAgICAgICAgIEZES21lbWNsZWFyKCZxY091dC0+cWNFbGVtZW50W2VsXS0+ZXh0ZW5zaW9uLCAoMSkqc2l6ZW9mKFFDX09VVF9FWFRFTlNJT04pKTsKCiAgICAgICAgICAgIGZvciAoIG4gPSAwOyBuIDwgTUFYX1RPVEFMX0VYVF9QQVlMT0FEUzsgbisrICkgewogICAgICAgICAgICAgICAgaWYgKCAhZXh0UGF5bG9hZFVzZWRbbl0KICAgICAgICAgICAgICAgICAgJiYgKGV4dFBheWxvYWRbbl0uYXNzb2NpYXRlZENoRWxlbWVudCA9PSBlbCkKICAgICAgICAgICAgICAgICAgJiYgKGV4dFBheWxvYWRbbl0uZGF0YVNpemUgPiAwKQogICAgICAgICAgICAgICAgICAmJiAoZXh0UGF5bG9hZFtuXS5wRGF0YSAhPSBOVUxMKSApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaW50IGlkeCA9IHFjT3V0LT5xY0VsZW1lbnRbZWxdLT5uRXh0ZW5zaW9ucysrOwoKICAgICAgICAgICAgICAgICAgICBxY091dC0+cWNFbGVtZW50W2VsXS0+ZXh0ZW5zaW9uW2lkeF0udHlwZSAgICAgICAgID0gZXh0UGF5bG9hZFtuXS5kYXRhVHlwZTsgICAvKiBQZXJmb3JtIGEgc2FuaXR5IGNoZWNrIG9uIHRoZSB0eXBlPyAqLwogICAgICAgICAgICAgICAgICAgIHFjT3V0LT5xY0VsZW1lbnRbZWxdLT5leHRlbnNpb25baWR4XS5uUGF5bG9hZEJpdHMgPSBleHRQYXlsb2FkW25dLmRhdGFTaXplOwogICAgICAgICAgICAgICAgICAgIHFjT3V0LT5xY0VsZW1lbnRbZWxdLT5leHRlbnNpb25baWR4XS5wUGF5bG9hZCA9IGV4dFBheWxvYWRbbl0ucERhdGE7CiAgICAgICAgICAgICAgICAgICAgLyogTm93IGFzayB0aGUgYml0c3RyZWFtIGVuY29kZXIgaG93IG1hbnkgYml0cyB3ZSBuZWVkIHRvIGVuY29kZSB0aGUgZGF0YSB3aXRoIHRoZSBjdXJyZW50IGJpdHN0cmVhbSBzeW50YXg6ICovCiAgICAgICAgICAgICAgICAgICAgcWNPdXQtPnFjRWxlbWVudFtlbF0tPmV4dEJpdHNVc2VkICs9CiAgICAgICAgICAgICAgICAgICAgICAgICAgRkRLYWFjRW5jX3dyaXRlRXh0ZW5zaW9uRGF0YSggTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZxY091dC0+cWNFbGVtZW50W2VsXS0+ZXh0ZW5zaW9uW2lkeF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQWFjRW5jLT5jb25maWctPnN5bnRheEZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhBYWNFbmMtPmFvdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQWFjRW5jLT5jb25maWctPmVwQ29uZmlnICk7CiAgICAgICAgICAgICAgICAgICAgZXh0UGF5bG9hZFVzZWRbbl0gPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvKiBzdW0gdXAgZXh0ZW5zaW9uIGFuZCBzdGF0aWMgYml0cyBmb3IgYWxsIGNoYW5uZWwgZWxlbWVudHMgKi8KICAgICAgICAgICAgcWNPdXQtPmVsZW1lbnRFeHRCaXRzICs9IHFjT3V0LT5xY0VsZW1lbnRbZWxdLT5leHRCaXRzVXNlZDsKICAgICAgICAgICAgcWNPdXQtPnN0YXRpY0JpdHMgICArPSBxY091dC0+cWNFbGVtZW50W2VsXS0+c3RhdGljQml0c1VzZWQ7CgogICAgICAgICAgICAvKiBzdW0gdXAgcGUgKi8KICAgICAgICAgICAgcWNPdXQtPnRvdGFsTm9SZWRQZSArPSBxY091dC0+cWNFbGVtZW50W2VsXS0+cGVEYXRhLnBlOwogICAgICAgIH0KICAgIH0KCiAgICBxY091dC0+bkV4dGVuc2lvbnMgICA9IDA7CiAgICBxY091dC0+Z2xvYmFsRXh0Qml0cyA9IDA7CgogICAgLyogcmVzZXQgZXh0ZW5zaW9uIHBheWxvYWQgKi8KICAgIEZES21lbWNsZWFyKCZxY091dC0+ZXh0ZW5zaW9uLCAoMisyKSpzaXplb2YoUUNfT1VUX0VYVEVOU0lPTikpOwoKICAgIC8qIEFkZCBleHRlbnNpb24gcGF5bG9hZCBub3QgYXNzaWduZWQgdG8gYW4gY2hhbm5lbCBlbGVtZW50CiAgICAgIChBbmNpbGxhcnkgZGF0YSBpcyB0aGUgb25seSBzdXBwb3J0ZWQgdHlwZSB1cCB0byBub3cpICovCiAgICBmb3IgKCBuID0gMDsgbiA8IE1BWF9UT1RBTF9FWFRfUEFZTE9BRFM7IG4rKyApIHsKICAgICAgICBpZiAoICFleHRQYXlsb2FkVXNlZFtuXQogICAgICAgICAgJiYgKGV4dFBheWxvYWRbbl0uYXNzb2NpYXRlZENoRWxlbWVudCA9PSAtMSkKICAgICAgICAgICYmIChleHRQYXlsb2FkW25dLnBEYXRhICE9IE5VTEwpICkKICAgICAgICB7CiAgICAgICAgICAgIFVJTlQgcGF5bG9hZEJpdHMgPSAwOwoKICAgICAgICAgICAgaWYgKGV4dFBheWxvYWRbbl0uZGF0YVR5cGUgPT0gRVhUX0RBVEFfRUxFTUVOVCkgewogICAgICAgICAgICAgICAgaWYgKGhBYWNFbmMtPmFuY2lsbGFyeUJpdHNQZXJGcmFtZSkgewogICAgICAgICAgICAgICAgICAgIC8qIGdyYW50ZWQgZnJhbWUgZHNlIGJpdHJhdGUgKi8KICAgICAgICAgICAgICAgICAgICBwYXlsb2FkQml0cyA9IGhBYWNFbmMtPmFuY2lsbGFyeUJpdHNQZXJGcmFtZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIC8qIHdyaXRlIGFuYyBkYXRhIGlmIGJpdHJhdGUgY29uc3RyYWludCBmdWxmaWxsZWQgKi8KICAgICAgICAgICAgICAgICAgICBpZiAoKGV4dFBheWxvYWRbbl0uZGF0YVNpemU+PjMpIDw9IGhBYWNFbmMtPmNvbmZpZy0+bWF4QW5jQnl0ZXNQZXJBVSkgewogICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkQml0cyA9IGV4dFBheWxvYWRbbl0uZGF0YVNpemU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcGF5bG9hZEJpdHMgPSBmaXhNaW4oIGV4dFBheWxvYWRbbl0uZGF0YVNpemUsIHBheWxvYWRCaXRzICk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBwYXlsb2FkQml0cyA9IGV4dFBheWxvYWRbbl0uZGF0YVNpemU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChwYXlsb2FkQml0cyA+IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGludCBpZHggPSBxY091dC0+bkV4dGVuc2lvbnMrKzsKCiAgICAgICAgICAgICAgICBxY091dC0+ZXh0ZW5zaW9uW2lkeF0udHlwZSAgICAgICAgID0gZXh0UGF5bG9hZFtuXS5kYXRhVHlwZTsgICAvKiBQZXJmb3JtIGEgc2FuaXR5IGNoZWNrIG9uIHRoZSB0eXBlPyAqLwogICAgICAgICAgICAgICAgcWNPdXQtPmV4dGVuc2lvbltpZHhdLm5QYXlsb2FkQml0cyA9IHBheWxvYWRCaXRzOwogICAgICAgICAgICAgICAgcWNPdXQtPmV4dGVuc2lvbltpZHhdLnBQYXlsb2FkID0gZXh0UGF5bG9hZFtuXS5wRGF0YTsKICAgICAgICAgICAgICAgIC8qIE5vdyBhc2sgdGhlIGJpdHN0cmVhbSBlbmNvZGVyIGhvdyBtYW55IGJpdHMgd2UgbmVlZCB0byBlbmNvZGUgdGhlIGRhdGEgd2l0aCB0aGUgY3VycmVudCBiaXRzdHJlYW0gc3ludGF4OiAqLwogICAgICAgICAgICAgICAgcWNPdXQtPmdsb2JhbEV4dEJpdHMgKz0gRkRLYWFjRW5jX3dyaXRlRXh0ZW5zaW9uRGF0YSggTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnFjT3V0LT5leHRlbnNpb25baWR4XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQWFjRW5jLT5jb25maWctPnN5bnRheEZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEFhY0VuYy0+YW90LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEFhY0VuYy0+Y29uZmlnLT5lcENvbmZpZyApOwogICAgICAgICAgICAgICAgaWYgKGV4dFBheWxvYWRbbl0uZGF0YVR5cGUgPT0gRVhUX0RBVEFfRUxFTUVOVCkgewogICAgICAgICAgICAgICAgICAgIC8qIHN1YnN0cmFjdCB0aGUgcHJvY2Vzc2VkIGJpdHMgKi8KICAgICAgICAgICAgICAgICAgICBleHRQYXlsb2FkW25dLmRhdGFTaXplIC09IHBheWxvYWRCaXRzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZXh0UGF5bG9hZFVzZWRbbl0gPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGlmICghKGhBYWNFbmMtPmNvbmZpZy0+c3ludGF4RmxhZ3MgJiAoQUNfU0NBTEFCTEV8QUNfRVIpKSkgewogICAgICBxY091dC0+Z2xvYmFsRXh0Qml0cyArPSBFTF9JRF9CSVRTOyAgLyogYWRkIGJpdHMgZm9yIElEX0VORCAqLwogICAgfQoKICAgIC8qIGJ1aWxkIGJpdHN0cmVhbSBhbGwgblN1YkZyYW1lcyAqLwogICAgewogICAgICAgIElOVCB0b3RhbEJpdHMgICAgPSAwOyAgIC8qIFRvdGFsIEFVIGJpdHMgKi87CiAgICAgICAgSU5UIGF2Z1RvdGFsQml0cyA9IDA7CgogICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KICAgICAgICAvKiBHZXQgYXZlcmFnZSB0b3RhbCBiaXRzICovCiAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogICAgICAgIHsKICAgICAgICAgICAgLyogZnJhbWUgd2lzZSBiaXRyYXRlIGFkYXB0aW9uICovCiAgICAgICAgICAgIEZES2FhY0VuY19BZGp1c3RCaXRyYXRlKGhBYWNFbmMtPnFjS2VybmVsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYXZnVG90YWxCaXRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQWFjRW5jLT5jb25maWctPmJpdFJhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhBYWNFbmMtPmNvbmZpZy0+c2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEFhY0VuYy0+Y29uZmlnLT5mcmFtZWxlbmd0aCk7CgogICAgICAgICAgICAvKiBhZGp1c3Qgc3VwZXIgZnJhbWUgYml0cmF0ZSAqLwogICAgICAgICAgICBhdmdUb3RhbEJpdHMgKj0gaEFhY0VuYy0+Y29uZmlnLT5uU3ViRnJhbWVzOwogICAgICAgIH0KCiAgICAgICAgLyogTWFrZSBmaXJzdCBlc3RpbWF0ZSBvZiB0cmFuc3BvcnQgaGVhZGVyIG92ZXJoZWFkLgogICAgICAgICAgIFRha2UgbWF4aW11bSBwb3NzaWJsZSBmcmFtZSBzaXplIGludG8gYWNjb3VudCB0byBwcmV2ZW50IGJpdHJlc2Vydm9pciB1bmRlcnJ1bi4gKi8KICAgICAgICBoQWFjRW5jLT5xY0tlcm5lbC0+Z2xvYkhkckJpdHMgPSB0cmFuc3BvcnRFbmNfR2V0U3RhdGljQml0cyhoVHBFbmMsIGF2Z1RvdGFsQml0cyArIGhBYWNFbmMtPnFjS2VybmVsLT5iaXRSZXNUb3QpOwoKCiAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgogICAgICAgIEVycm9yU3RhdHVzID0gRkRLYWFjRW5jX1FDTWFpbihoQWFjRW5jLT5xY0tlcm5lbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEFhY0VuYy0+cHN5T3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQWFjRW5jLT5xY091dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZnVG90YWxCaXRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxoQWFjRW5jLT5hb3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhBYWNFbmMtPmNvbmZpZy0+c3ludGF4RmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhBYWNFbmMtPmNvbmZpZy0+ZXBDb25maWcpOwoKICAgICAgICBpZiAoRXJyb3JTdGF0dXMgIT0gQUFDX0VOQ19PSykKICAgICAgICAgICAgcmV0dXJuIEVycm9yU3RhdHVzOwogICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCiAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogICAgICAgIEVycm9yU3RhdHVzID0gRkRLYWFjRW5jX3VwZGF0ZUZpbGxCaXRzKGNtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhBYWNFbmMtPnFjS2VybmVsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhBYWNFbmMtPnFjS2VybmVsLT5lbGVtZW50Qml0cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQWFjRW5jLT5xY091dCk7CiAgICAgICAgaWYgKEVycm9yU3RhdHVzICE9IEFBQ19FTkNfT0spCiAgICAgICAgICAgIHJldHVybiBFcnJvclN0YXR1czsKCiAgICAgICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KICAgICAgICAgICAgRXJyb3JTdGF0dXMgPSBGREthYWNFbmNfRmluYWxpemVCaXRDb25zdW1wdGlvbihjbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQWFjRW5jLT5xY0tlcm5lbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxY091dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxY091dC0+cWNFbGVtZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhUcEVuYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQWFjRW5jLT5hb3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEFhY0VuYy0+Y29uZmlnLT5zeW50YXhGbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQWFjRW5jLT5jb25maWctPmVwQ29uZmlnKTsKICAgICAgICAgICAgaWYgKEVycm9yU3RhdHVzICE9IEFBQ19FTkNfT0spCiAgICAgICAgICAgICAgICByZXR1cm4gRXJyb3JTdGF0dXM7CiAgICAgICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KICAgICAgICAgICAgdG90YWxCaXRzICs9IHFjT3V0LT50b3RhbEJpdHM7CgoKICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAgICAgICAgRkRLYWFjRW5jX3VwZGF0ZUJpdHJlcyhjbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhBYWNFbmMtPnFjS2VybmVsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEFhY0VuYy0+cWNPdXQpOwoKICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgogICAgICAgIC8qIGZvciAoIGFsbCBzdWIgZnJhbWVzICkgLi4uICovCiAgICAgICAgICAgICAgLyogd3JpdGUgYml0c3RyZWFtIGhlYWRlciAqLwogICAgICAgICAgICAgIHRyYW5zcG9ydEVuY19Xcml0ZUFjY2Vzc1VuaXQoCiAgICAgICAgICAgICAgICAgICAgaFRwRW5jLAogICAgICAgICAgICAgICAgICAgIHRvdGFsQml0cywKICAgICAgICAgICAgICAgICAgICBGREthYWNFbmNfRW5jQml0cmVzVG9UcEJpdHJlcyhoQWFjRW5jLT5iaXRyYXRlTW9kZSwgaEFhY0VuYy0+cWNLZXJuZWwtPmJpdFJlc1RvdCksCiAgICAgICAgICAgICAgICAgICAgY20tPm5DaGFubmVsc0VmZik7CgogICAgICAgICAgICAgIC8qIHdyaXRlIGJpdHN0cmVhbSAqLwogICAgICAgICAgICAgIEVycm9yU3RhdHVzID0gRkRLYWFjRW5jX1dyaXRlQml0c3RyZWFtKAogICAgICAgICAgICAgICAgICAgIGhUcEVuYywKICAgICAgICAgICAgICAgICAgICBjbSwKICAgICAgICAgICAgICAgICAgICBxY091dCwKICAgICAgICAgICAgICAgICAgICBwc3lPdXQsCiAgICAgICAgICAgICAgICAgICAgaEFhY0VuYy0+cWNLZXJuZWwsCiAgICAgICAgICAgICAgICAgICAgaEFhY0VuYy0+YW90LAogICAgICAgICAgICAgICAgICAgIGhBYWNFbmMtPmNvbmZpZy0+c3ludGF4RmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgaEFhY0VuYy0+Y29uZmlnLT5lcENvbmZpZyk7CgogICAgICAgICAgICAgIGlmIChFcnJvclN0YXR1cyAhPSBBQUNfRU5DX09LKQogICAgICAgICAgICAgICAgcmV0dXJuIEVycm9yU3RhdHVzOwoKICAgICAgICAgICAgICAvKiB0cmFuc3BvcnRFbmNfRW5kQWNjZXNzVW5pdCgpIGlzIGJlaW5nIGNhbGxlZCBpbnNpZGUgRkRLYWFjRW5jX1dyaXRlQml0c3RyZWFtKCkgKi8KICAgICAgICAgICAgICB0cmFuc3BvcnRFbmNfR2V0RnJhbWUoaFRwRW5jLCBuT3V0Qnl0ZXMpOwoKICAgIH0gLyogLWVuZC0gaWYgKGN1ckZyYW1lPT1oQWFjRW5jLT5xY0tlcm5lbC0+blN1YkZyYW1lcykgKi8KCgogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogICAgcmV0dXJuIEFBQ19FTkNfT0s7Cn0KCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgZnVuY3Rpb25uYW1lOkZES2FhY0VuY19DbG9zZQogICAgZGVzY3JpcHRpb246IGRlbGV0ZSBlbmNvZGVyIGluc3RhbmNlCiAgICByZXR1cm5zOgoKICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKdm9pZCBGREthYWNFbmNfQ2xvc2UoIEhBTkRMRV9BQUNfRU5DKiAgcGhBYWNFbmMpICAgLyogZW5jb2RlciBoYW5kbGUgKi8KewogICAgaWYgKCpwaEFhY0VuYyA9PSBOVUxMKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIEFBQ19FTkMgKmhBYWNFbmMgPSAoQUFDX0VOQyopKnBoQWFjRW5jOwoKICAgaWYgKGhBYWNFbmMtPmR5bmFtaWNfUkFNICE9IE5VTEwpCiAgICAgICBGcmVlQUFDZHluYW1pY19SQU0oJmhBYWNFbmMtPmR5bmFtaWNfUkFNKTsKCiAgICBGREthYWNFbmNfUHN5Q2xvc2UoJmhBYWNFbmMtPnBzeUtlcm5lbCxoQWFjRW5jLT5wc3lPdXQpOwoKICAgIEZES2FhY0VuY19RQ0Nsb3NlKCZoQWFjRW5jLT5xY0tlcm5lbCwgaEFhY0VuYy0+cWNPdXQpOwoKICAgIEZyZWVSYW1fYWFjRW5jX0FhY0VuY29kZXIocGhBYWNFbmMpOwp9CgoKLyogVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYXJlIGluIHRoaXMgc291cmNlIGZpbGUgb25seSBmb3IgY29udmVuaWVuY2UgYW5kICovCi8qIG5lZWQgbm90IGJlIHZpc2libGUgb3V0c2lkZSBvZiBhIHBvc3NpYmxlIGVuY29kZXIgbGlicmFyeS4gKi8KCi8qIGJhc2ljIGRlZmluZXMgZm9yIGFuY2lsbGFyeSBkYXRhICovCiNkZWZpbmUgTUFYX0FOQ1JBVEUgMTkyMDAgICAgICAgICAgICAvKiBhbmNpbGxhcnkgcmF0ZSA+PSAxOTIwMCBpc24ndCB2YWxpZCAqLwoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICBmdW5jdGlvbm5hbWU6ICBGREthYWNFbmNfSW5pdENoZWNrQW5jaWxsYXJ5CiAgICBkZXNjcmlwdGlvbjogICBpbml0aWFsaXplIGFuZCBjaGVjayBhbmNpbGxhcnkgZGF0YSBzdHJ1Y3QKICAgIHJldHVybjogICAgICAgIGlmIHN1Y2Nlc3Mgb3IgTlVMTCBpZiBlcnJvcgoKICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpzdGF0aWMgQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX0luaXRDaGVja0FuY2lsbGFyeShJTlQgYml0UmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGZyYW1lbGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgYW5jaWxsYXJ5UmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICphbmNpbGxhcnlCaXRzUGVyRnJhbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBzYW1wbGVSYXRlKQp7CiAgSU5UIGRpZmZUb0J5dGVBbGlnbjsKCiAgLyogZG9uJ3QgdXNlIG5lZ2F0aXZlIGFuY2lsbGFyeSByYXRlcyAqLwogIGlmICggYW5jaWxsYXJ5UmF0ZSA8IC0xICkKICAgIHJldHVybiBBQUNfRU5DX1VOU1VQUE9SVEVEX0FOQ19CSVRSQVRFOwoKICAvKiBjaGVjayBpZiBhbmNpbGxhcnkgcmF0ZSBpcyBvayAqLwogIGlmICggKGFuY2lsbGFyeVJhdGUgIT0gKC0xKSkgJiYgKGFuY2lsbGFyeVJhdGUgIT0gMCkgKSB7CiAgICAvKiBhbmNSYXRlIDw9IDE1JSBvZiBiaXRyYXRlICYmIGFuY1JhdGUgPCAxOTIwMCAqLwogICAgaWYgKCAoIGFuY2lsbGFyeVJhdGUgPj0gTUFYX0FOQ1JBVEUgKSB8fAogICAgICAgICAoIChhbmNpbGxhcnlSYXRlICogMjApID4gKGJpdFJhdGUgKiAzKSApICkgewogICAgICByZXR1cm4gQUFDX0VOQ19VTlNVUFBPUlRFRF9BTkNfQklUUkFURTsKICAgIH0KICB9CiAgZWxzZSBpZiAoYW5jaWxsYXJ5UmF0ZSA9PSAtMSkgewogICAgLyogaWYgbm8gc3BlY2lhbCBhbmNSYXRlIGlzIHJlcXVlc3RlZCBidXQgYSBhbmNpbGxhcnkgZmlsZSBpcwogICAgICAgc3RhdGVkLCB0aGVuIGdlbmVyYXRlIGEgYW5jaWxsYXJ5IHJhdGUgbWF0Y2hpbmcgdG8gdGhlIGJpdHJhdGUgKi8KICAgIGlmIChiaXRSYXRlID49IChNQVhfQU5DUkFURSAqIDEwKSkgewogICAgICAvKiBhbmNpbGxhcnkgcmF0ZSBpcyAxOTE5OSAqLwogICAgICBhbmNpbGxhcnlSYXRlID0gKE1BWF9BTkNSQVRFIC0gMSk7CiAgICB9CiAgICBlbHNlIHsgLyogMTAlIG9mIGJpdHJhdGUgKi8KICAgICAgYW5jaWxsYXJ5UmF0ZSA9IGJpdFJhdGUgLyAxMDsKICAgIH0KICB9CgogIC8qIG1ha2UgYW5jaWxsYXJ5Qml0c1BlckZyYW1lIGJ5dGUgYWxpZ24gKi8KICAqYW5jaWxsYXJ5Qml0c1BlckZyYW1lID0gKGFuY2lsbGFyeVJhdGUgKiBmcmFtZWxlbmd0aCApIC8gc2FtcGxlUmF0ZTsKICBkaWZmVG9CeXRlQWxpZ24gPSAqYW5jaWxsYXJ5Qml0c1BlckZyYW1lICUgODsKICAqYW5jaWxsYXJ5Qml0c1BlckZyYW1lID0gKmFuY2lsbGFyeUJpdHNQZXJGcmFtZSAtIGRpZmZUb0J5dGVBbGlnbjsKCiAgcmV0dXJuIEFBQ19FTkNfT0s7Cn0K