Ci8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAoKqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEyIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAxLiAgICBJTlRST0RVQ1RJT04KVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwp0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCgpBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQppbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydApvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KClBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwppbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCnRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCnRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwpzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCgpDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAphcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCgoyLiAgICBDT1BZUklHSFQgTElDRU5TRQoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CnBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKCllvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCnlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCgpZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCllvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgoKVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dApwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCgpZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCnNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgoKWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCiJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCgozLiAgICBOTyBQQVRFTlQgTElDRU5TRQoKTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCkFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCnJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KCllvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZApieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCgo0LiAgICBESVNDTEFJTUVSCgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwpvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgpDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCmluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCm9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCmFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgoKNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgoKRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCkF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCkFtIFdvbGZzbWFudGVsIDMzCjkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Cgp3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCmFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqICBGYXN0IE1QRUcgQUFDIEF1ZGlvIEVuY29kZXIgICoqKioqKioqKioqKioqKioqKioqKioKCiAgIEluaXRpYWwgYXV0aG9yOiAgICAgICBNLiBTY2h1ZyAvIEEuIEdyb2VzY2hlbAogICBjb250ZW50cy9kZXNjcmlwdGlvbjogZmFzdCBhYWMgY29kZXIgZnVuY3Rpb25zCgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgojaW5jbHVkZSAiYWFjZW5jLmgiCgojaW5jbHVkZSAiYml0ZW5jLmgiCiNpbmNsdWRlICJpbnRlcmZhY2UuaCIKI2luY2x1ZGUgInBzeV9jb25maWd1cmF0aW9uLmgiCiNpbmNsdWRlICJwc3lfbWFpbi5oIgojaW5jbHVkZSAicWNfbWFpbi5oIgojaW5jbHVkZSAiYmFuZHdpZHRoLmgiCiNpbmNsdWRlICJjaGFubmVsX21hcC5oIgojaW5jbHVkZSAidG5zX2Z1bmMuaCIKI2luY2x1ZGUgImFhY0VuY19yYW0uaCIKCiNpbmNsdWRlICJnZW5lcmljU3Rkcy5oIgoKCgoKI2RlZmluZSBNSU5fQlVGU0laRV9QRVJfRUZGX0NIQU4gNjE0NAoKc3RhdGljIEFBQ19FTkNPREVSX0VSUk9SIEZES2FhY0VuY19Jbml0Q2hlY2tBbmNpbGxhcnkoSU5UIGJpdFJhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBmcmFtZWxlbmd0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGFuY2lsbGFyeVJhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqYW5jaWxsYXJ5Qml0c1BlckZyYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgc2FtcGxlUmF0ZSk7CgpJTlQgRkRLYWFjRW5jX0xpbWl0Qml0cmF0ZSgKICAgICAgICBIQU5ETEVfVFJBTlNQT1JURU5DIGhUcEVuYywKICAgICAgICBJTlQgY29yZVNhbXBsaW5nUmF0ZSwKICAgICAgICBJTlQgZnJhbWVMZW5ndGgsCiAgICAgICAgSU5UIG5DaGFubmVscywKICAgICAgICBJTlQgbkNoYW5uZWxzRWZmLAogICAgICAgIElOVCBiaXRSYXRlLAogICAgICAgIElOVCBhdmVyYWdlQml0cywKICAgICAgICBJTlQgKnBBdmVyYWdlQml0c1BlckZyYW1lLAogICAgICAgIElOVCBiaXRyYXRlTW9kZSwKICAgICAgICBJTlQgblN1YkZyYW1lcwogICAgICAgICkKewogIElOVCB0cmFuc3BvcnRCaXRzLCBwcmV2Qml0UmF0ZSwgYXZlcmFnZUJpdHNQZXJGcmFtZSwgc2hpZnQgPSAwLCBpdGVyPTA7CgogIHdoaWxlICggKGZyYW1lTGVuZ3RoICYgfigoMTw8KHNoaWZ0KzEpKS0xKSkgPT0gZnJhbWVMZW5ndGgKICAgICYmIChjb3JlU2FtcGxpbmdSYXRlICYgfigoMTw8KHNoaWZ0KzEpKS0xKSkgPT0gY29yZVNhbXBsaW5nUmF0ZSApCiAgewogICAgc2hpZnQgKys7CiAgfQoKICBkbyB7CiAgICBwcmV2Qml0UmF0ZSA9IGJpdFJhdGU7CiAgICAgYXZlcmFnZUJpdHNQZXJGcmFtZSA9IChiaXRSYXRlKihmcmFtZUxlbmd0aD4+c2hpZnQpKSAvIChjb3JlU2FtcGxpbmdSYXRlPj5zaGlmdCkgLyBuU3ViRnJhbWVzOwoKICAgIGlmIChwQXZlcmFnZUJpdHNQZXJGcmFtZSAhPSBOVUxMKSB7CiAgICAgICpwQXZlcmFnZUJpdHNQZXJGcmFtZSA9IGF2ZXJhZ2VCaXRzUGVyRnJhbWU7CiAgICB9CgogICAgaWYgKGhUcEVuYyAhPSBOVUxMKSB7CiAgICAgIHRyYW5zcG9ydEJpdHMgPSB0cmFuc3BvcnRFbmNfR2V0U3RhdGljQml0cyhoVHBFbmMsIGF2ZXJhZ2VCaXRzUGVyRnJhbWUpOwogICAgfSBlbHNlIHsKICAgICAgLyogQXNzdW1lIHNvbWUgd29yc3QgY2FzZSAqLwogICAgICB0cmFuc3BvcnRCaXRzID0gMjA4OwogICAgfQoKICAgIGJpdFJhdGUgPSBGREttYXgoYml0UmF0ZSwgKCgoKDQwICogbkNoYW5uZWxzKSArIHRyYW5zcG9ydEJpdHMpICogKGNvcmVTYW1wbGluZ1JhdGUpKSAvIGZyYW1lTGVuZ3RoKSApOwogICAgRkRLX0FTU0VSVChiaXRSYXRlID49IDApOwoKICAgIGJpdFJhdGUgPSBGREttaW4oYml0UmF0ZSwgKChuQ2hhbm5lbHNFZmYgKiBNSU5fQlVGU0laRV9QRVJfRUZGX0NIQU4pKihjb3JlU2FtcGxpbmdSYXRlPj5zaGlmdCkpIC8gKGZyYW1lTGVuZ3RoPj5zaGlmdCkpIDsKICAgIEZES19BU1NFUlQoYml0UmF0ZSA+PSAwKTsKCiAgfSB3aGlsZSAocHJldkJpdFJhdGUgIT0gYml0UmF0ZSAmJiBpdGVyKysgPCAzKSA7CgogIHJldHVybiBiaXRSYXRlOwp9CgoKdHlwZWRlZiBzdHJ1Y3QKewogIEFBQ0VOQ19CSVRSQVRFX01PREUgYml0cmF0ZU1vZGU7CiAgaW50IGNoYW5CaXRyYXRlWzJdOyAvKiBtb25vL3N0ZXJlbyBzZXR0aW5ncyAqLwp9IENPTkZJR19UQUJfRU5UUllfVkJSOwoKc3RhdGljIGNvbnN0IENPTkZJR19UQUJfRU5UUllfVkJSIGNvbmZpZ1RhYlZCUltdID0gewogIHtBQUNFTkNfQlJfTU9ERV9DQlIsICAgeyAgICAgMCwgICAgIDB9fSAsCiAge0FBQ0VOQ19CUl9NT0RFX1ZCUl8xLCB7IDMyMDAwLCAyMDAwMH19ICwKICB7QUFDRU5DX0JSX01PREVfVkJSXzIsIHsgNDAwMDAsIDMyMDAwfX0gLAogIHtBQUNFTkNfQlJfTU9ERV9WQlJfMywgeyA1NjAwMCwgNDgwMDB9fSAsCiAge0FBQ0VOQ19CUl9NT0RFX1ZCUl80LCB7IDcyMDAwLCA2NDAwMH19ICwKICB7QUFDRU5DX0JSX01PREVfVkJSXzUsIHsxMTIwMDAsIDk2MDAwfX0KfTsKCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICAgZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfR2V0VkJSQml0cmF0ZQogICAgIGRlc2NyaXB0aW9uOiAgR2V0IFZCUiBiaXRyYXRlIGZyb20gdmJyIHF1YWxpdHkKICAgICBpbnB1dCBwYXJhbXM6IGludCB2YnJRdWFsaXR5IChWQlIwLCBWQlIxLCBWQlIyKQogICAgICAgICAgICAgICAgICAgY2hhbm5lbE1vZGUKICAgICByZXR1cm5zOiAgICAgIHZiciBiaXRyYXRlCgogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KSU5UIEZES2FhY0VuY19HZXRWQlJCaXRyYXRlKElOVCBiaXRyYXRlTW9kZSwgQ0hBTk5FTF9NT0RFIGNoYW5uZWxNb2RlKQp7CiAgSU5UIGJpdHJhdGUgPSAwOwogIElOVCBtb25vU3RlcmVvTW9kZSA9IDA7IC8qIGRlZmF1bHQgbW9ubyAqLwoKICBpZiAoRkRLYWFjRW5jX0dldE1vbm9TdGVyZW9Nb2RlKGNoYW5uZWxNb2RlKT09RUxfTU9ERV9TVEVSRU8pIHsKICAgICAgbW9ub1N0ZXJlb01vZGUgPSAxOwogIH0KCiAgc3dpdGNoKChBQUNFTkNfQklUUkFURV9NT0RFKWJpdHJhdGVNb2RlKXsKICBjYXNlIEFBQ0VOQ19CUl9NT0RFX1ZCUl8xOgogIGNhc2UgQUFDRU5DX0JSX01PREVfVkJSXzI6CiAgY2FzZSBBQUNFTkNfQlJfTU9ERV9WQlJfMzoKICBjYXNlIEFBQ0VOQ19CUl9NT0RFX1ZCUl80OgogIGNhc2UgQUFDRU5DX0JSX01PREVfVkJSXzU6CiAgICBiaXRyYXRlID0gY29uZmlnVGFiVkJSW2JpdHJhdGVNb2RlXS5jaGFuQml0cmF0ZVttb25vU3RlcmVvTW9kZV07CiAgICBicmVhazsKICBjYXNlIEFBQ0VOQ19CUl9NT0RFX0lOVkFMSUQ6CiAgY2FzZSBBQUNFTkNfQlJfTU9ERV9DQlI6CiAgY2FzZSBBQUNFTkNfQlJfTU9ERV9TRlI6CiAgY2FzZSBBQUNFTkNfQlJfTU9ERV9GRjoKICBkZWZhdWx0OgogICAgYml0cmF0ZSA9IDA7CiAgICBicmVhazsKICB9CgogIC8qIGNvbnZlcnQgY2hhbm5lbCBiaXRyYXRlIHRvIG92ZXJhbGwgYml0cmF0ZSovCiAgYml0cmF0ZSAqPSBGREthYWNFbmNfR2V0Q2hhbm5lbE1vZGVDb25maWd1cmF0aW9uKGNoYW5uZWxNb2RlKS0+bkNoYW5uZWxzRWZmOwoKICByZXR1cm4gYml0cmF0ZTsKfQoKLyoqCiAqIFxicmllZiAgQ29udmVydCBlbmNvZGVyIGJpdHJlc2Vydm9pciB2YWx1ZSBmb3IgdHJhbnNwb3J0IGxpYnJhcnkuCiAqCiAqIFxwYXJhbSBiaXRyYXRlTW9kZSAgICAgICAgICAgQml0cmF0ZW1vZGUgdXNlZCBpbiBjdXJyZW50IGVuY29kZXIgaW5zdGFuY2UuIFNlIDo6QUFDRU5DX0JJVFJBVEVfTU9ERQogKiBccGFyYW0gYml0cmVzVG90YWwgICAgICAgICAgIEVuY29kZXIgYml0cmVzZXJ2b2lyIGxldmVsIGluIGJpdHMuCiAqCiAqIFxyZXR1cm4gIENvcnJlY3RlZCBiaXRyZXNlcnZvaXIgbGV2ZWwgdXNlZCBpbiB0cmFuc3BvcnQgbGlicmFyeS4KICovCnN0YXRpYyBJTlQgRkRLYWFjRW5jX0VuY0JpdHJlc1RvVHBCaXRyZXMoCiAgICAgICAgY29uc3QgQUFDRU5DX0JJVFJBVEVfTU9ERSBiaXRyYXRlTW9kZSwKICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgIGJpdHJlc1RvdGFsCiAgICAgICAgKQp7CiAgSU5UIHRyYW5zcG9yQml0cmVzZXJ2b2lyID0gMDsKCiAgc3dpdGNoIChiaXRyYXRlTW9kZSkgewogICAgY2FzZSBBQUNFTkNfQlJfTU9ERV9DQlI6CiAgICAgIHRyYW5zcG9yQml0cmVzZXJ2b2lyID0gYml0cmVzVG90YWw7IC8qIGVuY29kZXIgYml0cmVzZXJ2b2lyIGxldmVsICovCiAgICAgIGJyZWFrOwogICAgY2FzZSBBQUNFTkNfQlJfTU9ERV9WQlJfMToKICAgIGNhc2UgQUFDRU5DX0JSX01PREVfVkJSXzI6CiAgICBjYXNlIEFBQ0VOQ19CUl9NT0RFX1ZCUl8zOgogICAgY2FzZSBBQUNFTkNfQlJfTU9ERV9WQlJfNDoKICAgIGNhc2UgQUFDRU5DX0JSX01PREVfVkJSXzU6CiAgICAgIHRyYW5zcG9yQml0cmVzZXJ2b2lyID0gRkRLX0lOVF9NQVg7IC8qIHNpZ25hbCB2YXJpYWJsZSBiaXRyYXRlICovCiAgICAgIGJyZWFrOwogICAgY2FzZSBBQUNFTkNfQlJfTU9ERV9GRjoKICAgIGNhc2UgQUFDRU5DX0JSX01PREVfU0ZSOgogICAgICB0cmFuc3BvckJpdHJlc2Vydm9pciA9IDA7ICAgICAgICAgICAvKiBzdXBlciBmcmFtaW5nIGFuZCBmaXhlZCBmcmFtaW5nICovCiAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdpdGhvdXQgYml0cmVzZXJ2b2lyIHNpZ25hbGluZyAqLwogICAgZGVmYXVsdDoKICAgIGNhc2UgQUFDRU5DX0JSX01PREVfSU5WQUxJRDoKICAgICAgdHJhbnNwb3JCaXRyZXNlcnZvaXIgPSAwOyAgICAgICAgICAgLyogaW52YWxpZCBjb25maWd1cmF0aW9uKi8KICAgICAgRkRLX0FTU0VSVCgwKTsKICB9CgogIHJldHVybiB0cmFuc3BvckJpdHJlc2Vydm9pcjsKfQoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgICBmdW5jdGlvbm5hbWU6IEZES2FhY0VuY19BYWNJbml0RGVmYXVsdENvbmZpZwogICAgIGRlc2NyaXB0aW9uOiAgZ2l2ZXMgcmVhc29uYWJsZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24KICAgICByZXR1cm5zOiAgICAgIC0tLQoKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCnZvaWQgRkRLYWFjRW5jX0FhY0luaXREZWZhdWx0Q29uZmlnKEFBQ0VOQ19DT05GSUcgKmNvbmZpZykKewogICAgLyogbWFrZSB0aGVwcmUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHN0cnVjdHMgZmxleGlibGUgKi8KICAgIEZES21lbWNsZWFyKGNvbmZpZywgc2l6ZW9mKEFBQ0VOQ19DT05GSUcpKTsKCiAgICAvKiBkZWZhdWx0IGFuY2lsbGFyeSAqLwogICAgY29uZmlnLT5hbmNfUmF0ZSA9IDA7ICAgICAgICAgLyogbm8gYW5jaWxsYXJ5IGRhdGEgKi8KICAgIGNvbmZpZy0+YW5jRGF0YUJpdFJhdGUgPSAwOyAgIC8qIG5vIGFkZGl0aW9uYWwgY29uc3VtZWQgYml0cmF0ZSAqLwoKICAgIC8qIGRlZmF1bHQgY29uZmlndXJhdGlvbnMgKi8KICAgIGNvbmZpZy0+Yml0UmF0ZSAgICAgICAgID0gLTE7ICAgICAgICAgICAgICAgICAgIC8qIGJpdHJhdGUgbXVzdCBiZSBzZXQqLwogICAgY29uZmlnLT5hdmVyYWdlQml0cyAgICAgPSAtMTsgICAgICAgICAgICAgICAgICAgLyogaW5zdGVhZCBvZiBiaXRyYXRlL3Mgd2UgY2FuIGNvbmZpZ3VyZSBiaXRzL3N1cGVyZnJhbWUgKi8KICAgIGNvbmZpZy0+Yml0cmF0ZU1vZGUgICAgID0gMDsKICAgIGNvbmZpZy0+YmFuZFdpZHRoICAgICAgID0gMDsgICAgICAgICAgICAgICAgICAgIC8qIGdldCBiYW5kd2lkdGggZnJvbSB0YWJsZSAqLwogICAgY29uZmlnLT51c2VUbnMgICAgICAgICAgPSBUTlNfRU5BQkxFX01BU0s7ICAgICAgLyogdG5zIGVuYWJsZWQgY29tcGxldGx5ICovCiAgICBjb25maWctPnVzZVBucyAgICAgICAgICA9IDE7ICAgICAgICAgICAgICAgICAgICAvKiBkZXBlbmRpbmcgb24gY2hhbm5lbEJpdHJhdGUgdGhpcyBtaWdodCBiZSBzZXQgdG8gMCBsYXRlciAqLwogICAgY29uZmlnLT51c2VJUyAgICAgICAgICAgPSAxOyAgICAgICAgICAgICAgICAgICAgLyogSW50ZW5zaXR5IFN0ZXJlbyBDb25maWd1cmF0aW9uICovCiAgICBjb25maWctPmZyYW1lbGVuZ3RoICAgICA9IC0xOyAgICAgICAgICAgICAgICAgICAvKiBGcmFtZXNpemUgbm90IGNvbmZpZ3VyZWQgKi8KICAgIGNvbmZpZy0+c3ludGF4RmxhZ3MgICAgID0gMDsgICAgICAgICAgICAgICAgICAgIC8qIGRlZmF1bHQgc3ludGF4IHdpdGggbm8gc3BlY2lhbGl0aWVzICovCiAgICBjb25maWctPmVwQ29uZmlnICAgICAgICA9IC0xOyAgICAgICAgICAgICAgICAgICAvKiBubyBFUiBzeW50YXggLT4gbm8gYWRkaXRpb25hbCBlcnJvciBwcm90ZWN0aW9uICovCiAgICBjb25maWctPm5TdWJGcmFtZXMgICAgICA9IDE7ICAgICAgICAgICAgICAgICAgICAvKiBkZWZhdWx0LCBubyBzdWIgZnJhbWVzICovCiAgICBjb25maWctPmNoYW5uZWxPcmRlciAgICA9IENIX09SREVSX01QRUc7ICAgICAgICAvKiBVc2UgTVBFRyBjaGFubmVsIG9yZGVyaW5nLiAqLwogICAgY29uZmlnLT5jaGFubmVsTW9kZSAgICAgPSBNT0RFX1VOS05PV047CiAgICBjb25maWctPm1pbkJpdHNQZXJGcmFtZSA9IC0xOyAgICAgICAgICAgICAgICAgICAvKiBtaW51bSBudW1iZXIgb2YgYml0cyBpbiBlYWNoIEFVICovCiAgICBjb25maWctPm1heEJpdHNQZXJGcmFtZSA9IC0xOyAgICAgICAgICAgICAgICAgICAvKiBtaW51bSBudW1iZXIgb2YgYml0cyBpbiBlYWNoIEFVICovCiAgICBjb25maWctPmJpdHJlc2Vydm9pciAgICA9IC0xOyAgICAgICAgICAgICAgICAgICAvKiBkZWZhdWx0LCB1bmluaXRpYWxpemVkIHZhbHVlICovCgogICAgLyogaW5pdCB0YWJzIGluIGZpeHBvaW50X21hdGggKi8KICAgIEluaXRMZEludCgpOwogICAgSW5pdEludlNxcnRUYWIoKTsKfQoKCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfT3BlbgogICAgZGVzY3JpcHRpb246ICBhbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBhIG5ldyBlbmNvZGVyIGluc3RhbmNlCiAgICByZXR1cm5zOiAgICAgIGVycm9yIGNvZGUKCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX09wZW4oSEFORExFX0FBQ19FTkMgICpwaEFhY0VuYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgICBuRWxlbWVudHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICAgbkNoYW5uZWxzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAgIG5TdWJGcmFtZXMpCnsKICBBQUNfRU5DT0RFUl9FUlJPUiBFcnJvclN0YXR1czsKICBBQUNfRU5DICAgICAgICAgICAqaEFhY0VuYyA9IE5VTEw7CiAgVUNIQVIgICAgICAgICAgICAgKmR5bmFtaWNSQU0gPSBOVUxMOwoKICBpZiAocGhBYWNFbmM9PU5VTEwpIHsKICAgIHJldHVybiBBQUNfRU5DX0lOVkFMSURfSEFORExFOwogIH0KCiAgLyogYWxsb2NhdGUgZW5jb2RlciBzdHJ1Y3R1cmUgKi8KICBoQWFjRW5jID0gR2V0UmFtX2FhY0VuY19BYWNFbmNvZGVyKCk7CiAgaWYgKGhBYWNFbmMgPT0gTlVMTCkgewogICAgRXJyb3JTdGF0dXMgPSBBQUNfRU5DX05PX01FTU9SWTsKICAgIGdvdG8gYmFpbDsKICB9CiAgRkRLbWVtY2xlYXIoaEFhY0VuYywgc2l6ZW9mKEFBQ19FTkMpKTsKCiAgaEFhY0VuYy0+ZHluYW1pY19SQU0gPSBHZXRBQUNkeW5hbWljX1JBTSgpOwogIGR5bmFtaWNSQU0gPSAoVUNIQVIqKWhBYWNFbmMtPmR5bmFtaWNfUkFNOwoKICAvKiBhbGxvY2F0ZSB0aGUgUHN5IGF1ZCBQc3kgT3V0IHN0cnVjdHVyZSAqLwogICBFcnJvclN0YXR1cyA9IEZES2FhY0VuY19Qc3lOZXcoJmhBYWNFbmMtPnBzeUtlcm5lbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5FbGVtZW50cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5DaGFubmVscwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsZHluYW1pY1JBTQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICBpZiAoRXJyb3JTdGF0dXMgIT0gQUFDX0VOQ19PSykKICAgICBnb3RvIGJhaWw7CgogICBFcnJvclN0YXR1cyA9IEZES2FhY0VuY19Qc3lPdXROZXcoaEFhY0VuYy0+cHN5T3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbkVsZW1lbnRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbkNoYW5uZWxzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgblN1YkZyYW1lcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsZHluYW1pY1JBTQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICBpZiAoRXJyb3JTdGF0dXMgIT0gQUFDX0VOQ19PSykKICAgICBnb3RvIGJhaWw7CgogIC8qIGFsbG9jYXRlIHRoZSBRJkMgT3V0IHN0cnVjdHVyZSAqLwogIEVycm9yU3RhdHVzID0gRkRLYWFjRW5jX1FDT3V0TmV3KGhBYWNFbmMtPnFjT3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5FbGVtZW50cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuQ2hhbm5lbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgblN1YkZyYW1lcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLGR5bmFtaWNSQU0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogIGlmIChFcnJvclN0YXR1cyAhPSBBQUNfRU5DX09LKQogICAgZ290byBiYWlsOwoKICAvKiBhbGxvY2F0ZSB0aGUgUSZDIGtlcm5lbCAqLwogIEVycm9yU3RhdHVzID0gRkRLYWFjRW5jX1FDTmV3KCZoQWFjRW5jLT5xY0tlcm5lbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbkVsZW1lbnRzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLGR5bmFtaWNSQU0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogIGlmIChFcnJvclN0YXR1cyAhPSBBQUNfRU5DX09LKQogICAgZ290byBiYWlsOwoKICBoQWFjRW5jLT5tYXhDaGFubmVscyA9IG5DaGFubmVsczsKICBoQWFjRW5jLT5tYXhFbGVtZW50cyA9IG5FbGVtZW50czsKICBoQWFjRW5jLT5tYXhGcmFtZXMgICA9IG5TdWJGcmFtZXM7CgpiYWlsOgogICpwaEFhY0VuYyA9IGhBYWNFbmM7CiAgcmV0dXJuIEVycm9yU3RhdHVzOwp9CgoKQUFDX0VOQ09ERVJfRVJST1IgRkRLYWFjRW5jX0luaXRpYWxpemUoSEFORExFX0FBQ19FTkMgICAgICBoQWFjRW5jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQUNFTkNfQ09ORklHICAgICAgKmNvbmZpZywgICAgIC8qIHByZS1pbml0aWFsaXplZCBjb25maWcgc3RydWN0ICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9UUkFOU1BPUlRFTkMgaFRwRW5jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTE9ORyAgICAgICAgICAgICAgIGluaXRGbGFncykKewogIEFBQ19FTkNPREVSX0VSUk9SIEVycm9yU3RhdHVzOwogIElOVCBwc3lCaXRyYXRlLCB0bnNNYXNrOyAvL0lOVCBwcm9maWxlID0gMTsKICBDSEFOTkVMX01BUFBJTkcgICAqY20gPSBOVUxMOwoKICBJTlQgcW1iZmFjLCBxYnc7CiAgRklYUF9EQkwgbWJmYWMsIGJ3X3JhdGlvOwogIFFDX0lOSVQgcWNJbml0OwogIElOVCBhdmVyYWdlQml0c1BlckZyYW1lID0gMDsKCiAgaWYgKGNvbmZpZz09TlVMTCkKICAgIHJldHVybiBBQUNfRU5DX0lOVkFMSURfSEFORExFOwoKICAvKioqKioqKioqKioqKioqKioqKiBzYW5pdHkgY2hlY2tzICoqKioqKioqKioqKioqKioqKiovCgogIC8qIGNoZWNrIGNvbmZpZyBzdHJ1Y3R1cmUgKi8KICBpZiAoY29uZmlnLT5uQ2hhbm5lbHMgIDwgMSB8fCBjb25maWctPm5DaGFubmVscyA+ICg2KSkgewogICAgcmV0dXJuIEFBQ19FTkNfVU5TVVBQT1JURURfQ0hBTk5FTENPTkZJRzsKICB9CgogIC8qIGNoZWNrIHNhbXBsZSByYXRlICovCiAgc3dpdGNoIChjb25maWctPnNhbXBsZVJhdGUpCiAgewogICAgY2FzZSA4MDAwOgogICAgY2FzZSAxMTAyNToKICAgIGNhc2UgMTIwMDA6CiAgICBjYXNlIDE2MDAwOgogICAgY2FzZSAyMjA1MDoKICAgIGNhc2UgMjQwMDA6CiAgICBjYXNlIDMyMDAwOgogICAgY2FzZSA0NDEwMDoKICAgIGNhc2UgNDgwMDA6CiAgICBjYXNlIDY0MDAwOgogICAgY2FzZSA4ODIwMDoKICAgIGNhc2UgOTYwMDA6CiAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgcmV0dXJuIEFBQ19FTkNfVU5TVVBQT1JURURfU0FNUExJTkdSQVRFOwogIH0KCiAgLyogYml0cmF0ZSBoYXMgdG8gYmUgc2V0ICovCiAgaWYgKGNvbmZpZy0+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+cWNPdXQsIGhBYWNFbmMtPm1heEZyYW1lcywgY20pOwogIGlmIChFcnJvclN0YXR1cyAhPSBBQUNfRU5DX09LKQogICAgZ290byBiYWlsOwoKCgogIHFjSW5pdC5jaGFubmVsTWFwcGluZyAgICAgID0gJmhBYWNFbmMtPmNoYW5uZWxNYXBwaW5nOwogIHFjSW5pdC5zY2VDcGUgICAgICAgICAgICAgID0gMDsKCiAgewogICAgICBpbnQgbWF4Qml0cmVzOwogICAgICBxY0luaXQuYXZlcmFnZUJpdHMgICAgID0gKGF2ZXJhZ2VCaXRzUGVyRnJhbWUrNykmfjc7CiAgICAgIG1heEJpdHJlcyAgICAgICAgICAgICAgPSAoTUlOX0JVRlNJWkVfUEVSX0VGRl9DSEFOKmNtLT5uQ2hhbm5lbHNFZmYpIC0gcWNJbml0LmF2ZXJhZ2VCaXRzOwogICAgICBxY0luaXQuYml0UmVzICAgICAgICAgID0gKGNvbmZpZy0+Yml0cmVzZXJ2b2lyIT0tMSkgPyBGREttaW4oY29uZmlnLT5iaXRyZXNlcnZvaXIsIG1heEJpdHJlcykgOiBtYXhCaXRyZXM7CgogICAgICBxY0luaXQubWF4Qml0cyAgICAgICAgID0gZml4TWluKE1JTl9CVUZTSVpFX1BFUl9FRkZfQ0hBTipjbS0+bkNoYW5uZWxzRWZmLCAoKGF2ZXJhZ2VCaXRzUGVyRnJhbWUrNykmfjcpK3FjSW5pdC5iaXRSZXMpOwogICAgICBxY0luaXQubWF4Qml0cyAgICAgICAgID0gKGNvbmZpZy0+bWF4Qml0c1BlckZyYW1lIT0tMSkgPyBmaXhNaW4ocWNJbml0Lm1heEJpdHMsIGNvbmZpZy0+bWF4Qml0c1BlckZyYW1lKSA6IHFjSW5pdC5tYXhCaXRzOwoKICAgICAgcWNJbml0Lm1pbkJpdHMgICAgICAgICA9IGZpeE1heCgwLCAoKGF2ZXJhZ2VCaXRzUGVyRnJhbWUtMSkmfjcpLXFjSW5pdC5iaXRSZXMtdHJhbnNwb3J0RW5jX0dldFN0YXRpY0JpdHMoaFRwRW5jLCAoKGF2ZXJhZ2VCaXRzUGVyRnJhbWUrNykmfjcpK3FjSW5pdC5iaXRSZXMpKTsKICAgICAgcWNJbml0Lm1pbkJpdHMgICAgICAgICA9IChjb25maWctPm1pbkJpdHNQZXJGcmFtZSE9LTEpID8gZml4TWF4KHFjSW5pdC5taW5CaXRzLCBjb25maWctPm1pbkJpdHNQZXJGcmFtZSkgOiBxY0luaXQubWluQml0czsKICB9CgogIHFjSW5pdC5uU3ViRnJhbWVzICAgICAgICAgID0gY29uZmlnLT5uU3ViRnJhbWVzOwogIHFjSW5pdC5wYWRkaW5nLnBhZGRpbmdSZXN0ID0gY29uZmlnLT5zYW1wbGVSYXRlOwoKICAvKiBDYWxjIG1lYW5QZSAqLwogIGJ3X3JhdGlvID0gZkRpdk5vcm0oKEZJWFBfREJMKWhBYWNFbmMtPmJhbmR3aWR0aDkwZEIsIChGSVhQX0RCTCkoY29uZmlnLT5zYW1wbGVSYXRlPj4xKSwgJnFidyk7CiAgcWJ3ID0gREZSQUNUX0JJVFMtMS1xYnc7CiAgLyogcWNJbml0Lm1lYW5QZSA9IDEwLjBmICogRlJBTUVfTEVOX0xPTkcgKiBoQWFjRW5jLT5iYW5kd2lkdGg5MGRCLyhjb25maWctPnNhbXBsZVJhdGUvMi4wZik7ICovCiAgcWNJbml0Lm1lYW5QZSA9IGZNdWx0KGJ3X3JhdGlvLCAoRklYUF9EQkwpKCgxMCpjb25maWctPmZyYW1lbGVuZ3RoKTw8MTYpKSA+PiAocWJ3LTE1KTsKCiAgLyogQ2FsYyBtYXhCaXRGYWMgKi8KICBtYmZhYyA9IGZEaXZOb3JtKChNSU5fQlVGU0laRV9QRVJfRUZGX0NIQU4tNzQ0KSpjbS0+bkNoYW5uZWxzRWZmLCBxY0luaXQuYXZlcmFnZUJpdHMvcWNJbml0Lm5TdWJGcmFtZXMsICZxbWJmYWMpOwogIHFtYmZhYyA9IERGUkFDVF9CSVRTLTEtcW1iZmFjOwogIHFjSW5pdC5tYXhCaXRGYWMgPSAocW1iZmFjID4gMjQpID8gKG1iZmFjID4+IChxbWJmYWMgLSAyNCkpOihtYmZhYyA8PCAoMjQgLSBxbWJmYWMpKTsKCiAgc3dpdGNoKGNvbmZpZy0+Yml0cmF0ZU1vZGUpewogIGNhc2UgQUFDRU5DX0JSX01PREVfQ0JSOgogICAgcWNJbml0LmJpdHJhdGVNb2RlID0gUUNEQVRBX0JSX01PREVfQ0JSOwogICAgYnJlYWs7CiAgY2FzZSBBQUNFTkNfQlJfTU9ERV9WQlJfMToKICAgIHFjSW5pdC5iaXRyYXRlTW9kZSA9IFFDREFUQV9CUl9NT0RFX1ZCUl8xOwogICAgYnJlYWs7CiAgY2FzZSBBQUNFTkNfQlJfTU9ERV9WQlJfMjoKICAgIHFjSW5pdC5iaXRyYXRlTW9kZSA9IFFDREFUQV9CUl9NT0RFX1ZCUl8yOwogICAgYnJlYWs7CiAgY2FzZSBBQUNFTkNfQlJfTU9ERV9WQlJfMzoKICAgIHFjSW5pdC5iaXRyYXRlTW9kZSA9IFFDREFUQV9CUl9NT0RFX1ZCUl8zOwogICAgYnJlYWs7CiAgY2FzZSBBQUNFTkNfQlJfTU9ERV9WQlJfNDoKICAgIHFjSW5pdC5iaXRyYXRlTW9kZSA9IFFDREFUQV9CUl9NT0RFX1ZCUl80OwogICAgYnJlYWs7CiAgY2FzZSBBQUNFTkNfQlJfTU9ERV9WQlJfNToKICAgIHFjSW5pdC5iaXRyYXRlTW9kZSA9IFFDREFUQV9CUl9NT0RFX1ZCUl81OwogICAgYnJlYWs7CiAgY2FzZSBBQUNFTkNfQlJfTU9ERV9TRlI6CiAgICBxY0luaXQuYml0cmF0ZU1vZGUgPSBRQ0RBVEFfQlJfTU9ERV9TRlI7CiAgICBicmVhazsKICBjYXNlIEFBQ0VOQ19CUl9NT0RFX0ZGOgogICAgcWNJbml0LmJpdHJhdGVNb2RlID0gUUNEQVRBX0JSX01PREVfRkY7CiAgICBicmVhazsKICBkZWZhdWx0OgogICAgRXJyb3JTdGF0dXMgPSBBQUNfRU5DX1VOU1VQUE9SVEVEX0JJVFJBVEVfTU9ERTsKICAgIGdvdG8gYmFpbDsKICB9CgogIHFjSW5pdC5pbnZRdWFudCA9IChjb25maWctPnVzZVJlcXVhbnQpPzI6MDsKCiAgLyogbWF4SXRlcmF0aW9ucyBzaG91bGQgYmUgc2V0IHRvIHRoZSBtYXhpbXVtIG51bWJlciBvZiByZXF1YW50aXphdGlvbiBpdGVyYXRpb25zIHRoYXQgYXJlCiAgICogYWxsb3dlZCBiZWZvcmUgdGhlIGNyYXNoIHJlY292ZXJ5IGZ1bmN0aW9uYWxpdHkgaXMgYWN0aXZhdGVkLiBUaGlzIHNldHRpbmcgc2hvdWxkIGJlIGFkanVzdGVkCiAgICogdG8gdGhlIHByb2Nlc3NpbmcgcG93ZXIgYXZhaWxhYmxlLCBpLmUuIHRvIHRoZSBwcm9jZXNzaW5nIHBvd2VyIGhlYWRyb29tIGluIG9uZSBmcmFtZSB0aGF0IGlzCiAgICogc3RpbGwgbGVmdCBhZnRlciBub3JtYWwgZW5jb2Rpbmcgd2l0aG91dCByZXF1YW50aXphdGlvbi4gUGxlYXNlIG5vdGUgdGhhdCBpZiBhY3RpdmF0ZWQgdGhpcwogICAqIGZ1bmN0aW9uYWxpdHkgaXMgdXNlZCBtb3N0IGxpa2VseSBvbmx5IGluIGNhc2VzIHdoZXJlIHRoZSBlbmNvZGVyIGlzIG9wZXJhdGluZyBiZXlvbmQKICAgKiByZWNvbW1lbmRlZCBzZXR0aW5ncywgaS5lLiB0aGUgYXVkaW8gcXVhbGl0eSBpcyBzdWJvcHRpbWFsIGFueXdheS4gQWN0aXZhdGluZyB0aGUgY3Jhc2gKICAgKiByZWNvdmVyeSBkb2VzIG5vdCBmdXJ0aGVyIHJlZHVjZSBhdWRpbyBxdWFsaXR5IHNpZ25pZmljYW50bHkgaW4gdGhlc2UgY2FzZXMuICovCiAgaWYgKCAoY29uZmlnLT5hdWRpb09iamVjdFR5cGUgPT0gQU9UX0VSX0FBQ19MRCkgfHwgKGNvbmZpZy0+YXVkaW9PYmplY3RUeXBlID09IEFPVF9FUl9BQUNfRUxEKSApIHsKICAgIHFjSW5pdC5tYXhJdGVyYXRpb25zID0gMjsKICB9CiAgZWxzZQogIHsKICAgIHFjSW5pdC5tYXhJdGVyYXRpb25zID0gNTsKICB9CgogIHFjSW5pdC5iaXRyYXRlID0gY29uZmlnLT5iaXRSYXRlIC0gY29uZmlnLT5hbmNEYXRhQml0UmF0ZTsKCiAgcWNJbml0LnN0YXRpY0JpdHMgPSB0cmFuc3BvcnRFbmNfR2V0U3RhdGljQml0cyhoVHBFbmMsIHFjSW5pdC5hdmVyYWdlQml0cy9xY0luaXQublN1YkZyYW1lcyk7CgogIEVycm9yU3RhdHVzID0gRkRLYWFjRW5jX1FDSW5pdChoQWFjRW5jLT5xY0tlcm5lbCwgJnFjSW5pdCk7CiAgaWYgKEVycm9yU3RhdHVzICE9IEFBQ19FTkNfT0spCiAgICBnb3RvIGJhaWw7CgogIC8qIE1hcCB2aXJ0dWFsIGFvdCdzIHRvIGludGVybiBhb3QgdXNlZCBpbiBiaXRzdHJlYW0gd3JpdGVyLiAqLwogIHN3aXRjaCAoaEFhY0VuYy0+Y29uZmlnLT5hdWRpb09iamVjdFR5cGUpIHsKICAgIGNhc2UgQU9UX01QMl9BQUNfTEM6CiAgICBjYXNlIEFPVF9EQUJQTFVTX0FBQ19MQzoKICAgICAgaEFhY0VuYy0+YW90ID0gQU9UX0FBQ19MQzsKICAgICAgYnJlYWs7CiAgICBjYXNlIEFPVF9NUDJfU0JSOgogICAgY2FzZSBBT1RfREFCUExVU19TQlI6CiAgICAgIGhBYWNFbmMtPmFvdCA9IEFPVF9TQlI7CiAgICAgIGJyZWFrOwogICAgY2FzZSBBT1RfTVAyX1BTOgogICAgY2FzZSBBT1RfREFCUExVU19QUzoKICAgICAgaEFhY0VuYy0+YW90ID0gQU9UX1BTOwogICAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgIGhBYWNFbmMtPmFvdCA9IGhBYWNFbmMtPmNvbmZpZy0+YXVkaW9PYmplY3RUeXBlOwogIH0KCiAgLyogY29tbW9uIHRoaW5ncyAqLwoKICByZXR1cm4gQUFDX0VOQ19PSzsKCmJhaWw6CgogIHJldHVybiBFcnJvclN0YXR1czsKfQoKCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgZnVuY3Rpb25uYW1lOiBGREthYWNFbmNfRW5jb2RlRnJhbWUKICAgIGRlc2NyaXB0aW9uOiAgZW5jb2RlcyBvbmUgZnJhbWUKICAgIHJldHVybnM6ICAgICAgZXJyb3IgY29kZQoKICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpBQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfRW5jb2RlRnJhbWUoIEhBTkRMRV9BQUNfRU5DICAgICAgIGhBYWNFbmMsICAgICAgICAgIC8qIGVuY29kZXIgaGFuZGxlICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1RSQU5TUE9SVEVOQyAgaFRwRW5jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVF9QQ00qIFJFU1RSSUNUICAgIGlucHV0QnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCogICAgICAgICAgICAgICAgIG5PdXRCeXRlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQUNFTkNfRVhUX1BBWUxPQUQgICBleHRQYXlsb2FkW01BWF9UT1RBTF9FWFRfUEFZTE9BRFNdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKewogICAgQUFDX0VOQ09ERVJfRVJST1IgRXJyb3JTdGF0dXM7CiAgICBpbnQgICAgZWwsIG4sIGM9MDsKICAgIFVDSEFSICBleHRQYXlsb2FkVXNlZFtNQVhfVE9UQUxfRVhUX1BBWUxPQURTXTsKCiAgICBDSEFOTkVMX01BUFBJTkcgKmNtICAgICAgPSAmaEFhY0VuYy0+Y2hhbm5lbE1hcHBpbmc7CgoKCiAgICBQU1lfT1VUICpwc3lPdXQgPSBoQWFjRW5jLT5wc3lPdXRbY107CiAgICBRQ19PVVQgICpxY091dCAgPSBoQWFjRW5jLT5xY091dFtjXTsKCiAgICBGREttZW1jbGVhcihleHRQYXlsb2FkVXNlZCwgTUFYX1RPVEFMX0VYVF9QQVlMT0FEUyAqIHNpemVvZihVQ0hBUikpOwoKICAgIHFjT3V0LT5lbGVtZW50RXh0Qml0cyA9IDA7IC8qIHN1bSB1cCBhbGwgZXh0ZW5kZWQgYml0IG9mIGVhY2ggZWxlbWVudCAqLwogICAgcWNPdXQtPnN0YXRpY0JpdHMgICAgID0gMDsgLyogc3VtIHVwIHNpZGUgaW5mbyBiaXRzIG9mIGVhY2ggZWxlbWVudCAqLwogICAgcWNPdXQtPnRvdGFsTm9SZWRQZSAgID0gMDsgLyogc3VtIHVwIFBFICovCgogICAgLyogYWR2YW5jZSBwc3ljaG9hY291c3RpY3MgKi8KICAgIGZvciAoZWw9MDsgZWw8Y20tPm5FbGVtZW50czsgZWwrKykgewogICAgICAgIEVMRU1FTlRfSU5GTyBlbEluZm8gPSBjbS0+ZWxJbmZvW2VsXTsKCiAgICAgICAgaWYgKCAoZWxJbmZvLmVsVHlwZSA9PSBJRF9TQ0UpCiAgICAgICAgICB8fCAoZWxJbmZvLmVsVHlwZSA9PSBJRF9DUEUpCiAgICAgICAgICB8fCAoZWxJbmZvLmVsVHlwZSA9PSBJRF9MRkUpICkKICAgICAgICB7CiAgICAgICAgICAgIGludCBjaDsKCiAgICAgICAgICAgIC8qIHVwZGF0ZSBwb2ludGVyISovCiAgICAgICAgICAgIGZvcihjaD0wO2NoPGVsSW5mby5uQ2hhbm5lbHNJbkVsO2NoKyspIHsKICAgICAgICAgICAgICAgIFBTWV9PVVRfQ0hBTk5FTCAqcHN5T3V0Q2hhbiA9IHBzeU91dC0+cHN5T3V0RWxlbWVudFtlbF0tPnBzeU91dENoYW5uZWxbY2hdOwogICAgICAgICAgICAgICAgUUNfT1VUX0NIQU5ORUwgICpxY091dENoYW4gPSBxY091dC0+cWNFbGVtZW50W2VsXS0+cWNPdXRDaGFubmVsW2NoXTsKCiAgICAgICAgICAgICAgICBwc3lPdXRDaGFuLT5tZGN0U3BlY3RydW0gICAgICAgPSBxY091dENoYW4tPm1kY3RTcGVjdHJ1bTsKICAgICAgICAgICAgICAgIHBzeU91dENoYW4tPnNmYlNwcmVhZEVuZXJneSAgPSBxY091dENoYW4tPnNmYlNwcmVhZEVuZXJneTsKICAgICAgICAgICAgICAgIHBzeU91dENoYW4tPnNmYkVuZXJneSAgICAgICAgICA9IHFjT3V0Q2hhbi0+c2ZiRW5lcmd5OwogICAgICAgICAgICAgICAgcHN5T3V0Q2hhbi0+c2ZiRW5lcmd5TGREYXRhICAgID0gcWNPdXRDaGFuLT5zZmJFbmVyZ3lMZERhdGE7CiAgICAgICAgICAgICAgICBwc3lPdXRDaGFuLT5zZmJNaW5TbnJMZERhdGEgICAgPSBxY091dENoYW4tPnNmYk1pblNuckxkRGF0YTsKICAgICAgICAgICAgICAgIHBzeU91dENoYW4tPnNmYlRocmVzaG9sZExkRGF0YSA9IHFjT3V0Q2hhbi0+c2ZiVGhyZXNob2xkTGREYXRhOwoKICAgICAgICAgICAgfQoKICAgICAgICAgICAgRkRLYWFjRW5jX3BzeU1haW4oZWxJbmZvLm5DaGFubmVsc0luRWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhBYWNFbmMtPnBzeUtlcm5lbC0+cHN5RWxlbWVudFtlbF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhBYWNFbmMtPnBzeUtlcm5lbC0+cHN5RHluYW1pYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEFhY0VuYy0+cHN5S2VybmVsLT5wc3lDb25mLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXQtPnBzeU91dEVsZW1lbnRbZWxdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dEJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY20tPmVsSW5mb1tlbF0uQ2hhbm5lbEluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbS0+bkNoYW5uZWxzCgogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAvKiBGb3JtRmFjdG9yLCBQZSBhbmQgc3RhdGljQml0RGVtYW5kIGNhbGN1bGF0aW9uICovCiAgICAgICAgICAgIEVycm9yU3RhdHVzID0gRkRLYWFjRW5jX1FDTWFpblByZXBhcmUoJmVsSW5mbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEFhY0VuYy0+cWNLZXJuZWwtPmhBZGpUaHItPmFkalRoclN0YXRlRWxlbVtlbF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dC0+cHN5T3V0RWxlbWVudFtlbF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFjT3V0LT5xY0VsZW1lbnRbZWxdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQWFjRW5jLT5hb3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhBYWNFbmMtPmNvbmZpZy0+c3ludGF4RmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhBYWNFbmMtPmNvbmZpZy0+ZXBDb25maWcpOwoKICAgICAgICAgICAgaWYgKEVycm9yU3RhdHVzICE9IEFBQ19FTkNfT0spCiAgICAgICAgICAgICAgcmV0dXJuIEVycm9yU3RhdHVzOwoKICAgICAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKICAgICAgICAgICAgcWNPdXQtPnFjRWxlbWVudFtlbF0tPmV4dEJpdHNVc2VkID0gMDsKICAgICAgICAgICAgcWNPdXQtPnFjRWxlbWVudFtlbF0tPm5FeHRlbnNpb25zID0gMDsKICAgICAgICAgICAgLyogcmVzZXQgZXh0ZW5zaW9uIHBheWxvYWQgKi8KICAgICAgICAgICAgRkRLbWVtY2xlYXIoJnFjT3V0LT5xY0VsZW1lbnRbZWxdLT5leHRlbnNpb24sICgxKSpzaXplb2YoUUNfT1VUX0VYVEVOU0lPTikpOwoKICAgICAgICAgICAgZm9yICggbiA9IDA7IG4gPCBNQVhfVE9UQUxfRVhUX1BBWUxPQURTOyBuKysgKSB7CiAgICAgICAgICAgICAgICBpZiAoICFleHRQYXlsb2FkVXNlZFtuXQogICAgICAgICAgICAgICAgICAmJiAoZXh0UGF5bG9hZFtuXS5hc3NvY2lhdGVkQ2hFbGVtZW50ID09IGVsKQogICAgICAgICAgICAgICAgICAmJiAoZXh0UGF5bG9hZFtuXS5kYXRhU2l6ZSA+IDApCiAgICAgICAgICAgICAgICAgICYmIChleHRQYXlsb2FkW25dLnBEYXRhICE9IE5VTEwpICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpbnQgaWR4ID0gcWNPdXQtPnFjRWxlbWVudFtlbF0tPm5FeHRlbnNpb25zKys7CgogICAgICAgICAgICAgICAgICAgIHFjT3V0LT5xY0VsZW1lbnRbZWxdLT5leHRlbnNpb25baWR4XS50eXBlICAgICAgICAgPSBleHRQYXlsb2FkW25dLmRhdGFUeXBlOyAgIC8qIFBlcmZvcm0gYSBzYW5pdHkgY2hlY2sgb24gdGhlIHR5cGU/ICovCiAgICAgICAgICAgICAgICAgICAgcWNPdXQtPnFjRWxlbWVudFtlbF0tPmV4dGVuc2lvbltpZHhdLm5QYXlsb2FkQml0cyA9IGV4dFBheWxvYWRbbl0uZGF0YVNpemU7CiAgICAgICAgICAgICAgICAgICAgcWNPdXQtPnFjRWxlbWVudFtlbF0tPmV4dGVuc2lvbltpZHhdLnBQYXlsb2FkID0gZXh0UGF5bG9hZFtuXS5wRGF0YTsKICAgICAgICAgICAgICAgICAgICAvKiBOb3cgYXNrIHRoZSBiaXRzdHJlYW0gZW5jb2RlciBob3cgbWFueSBiaXRzIHdlIG5lZWQgdG8gZW5jb2RlIHRoZSBkYXRhIHdpdGggdGhlIGN1cnJlbnQgYml0c3RyZWFtIHN5bnRheDogKi8KICAgICAgICAgICAgICAgICAgICBxY091dC0+cWNFbGVtZW50W2VsXS0+ZXh0Qml0c1VzZWQgKz0KICAgICAgICAgICAgICAgICAgICAgICAgICBGREthYWNFbmNfd3JpdGVFeHRlbnNpb25EYXRhKCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnFjT3V0LT5xY0VsZW1lbnRbZWxdLT5leHRlbnNpb25baWR4XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhBYWNFbmMtPmNvbmZpZy0+c3ludGF4RmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEFhY0VuYy0+YW90LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhBYWNFbmMtPmNvbmZpZy0+ZXBDb25maWcgKTsKICAgICAgICAgICAgICAgICAgICBleHRQYXlsb2FkVXNlZFtuXSA9IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8qIHN1bSB1cCBleHRlbnNpb24gYW5kIHN0YXRpYyBiaXRzIGZvciBhbGwgY2hhbm5lbCBlbGVtZW50cyAqLwogICAgICAgICAgICBxY091dC0+ZWxlbWVudEV4dEJpdHMgKz0gcWNPdXQtPnFjRWxlbWVudFtlbF0tPmV4dEJpdHNVc2VkOwogICAgICAgICAgICBxY091dC0+c3RhdGljQml0cyAgICs9IHFjT3V0LT5xY0VsZW1lbnRbZWxdLT5zdGF0aWNCaXRzVXNlZDsKCiAgICAgICAgICAgIC8qIHN1bSB1cCBwZSAqLwogICAgICAgICAgICBxY091dC0+dG90YWxOb1JlZFBlICs9IHFjT3V0LT5xY0VsZW1lbnRbZWxdLT5wZURhdGEucGU7CiAgICAgICAgfQogICAgfQoKICAgIHFjT3V0LT5uRXh0ZW5zaW9ucyAgID0gMDsKICAgIHFjT3V0LT5nbG9iYWxFeHRCaXRzID0gMDsKCiAgICAvKiByZXNldCBleHRlbnNpb24gcGF5bG9hZCAqLwogICAgRkRLbWVtY2xlYXIoJnFjT3V0LT5leHRlbnNpb24sICgyKzIpKnNpemVvZihRQ19PVVRfRVhURU5TSU9OKSk7CgogICAgLyogQWRkIGV4dGVuc2lvbiBwYXlsb2FkIG5vdCBhc3NpZ25lZCB0byBhbiBjaGFubmVsIGVsZW1lbnQKICAgICAgKEFuY2lsbGFyeSBkYXRhIGlzIHRoZSBvbmx5IHN1cHBvcnRlZCB0eXBlIHVwIHRvIG5vdykgKi8KICAgIGZvciAoIG4gPSAwOyBuIDwgTUFYX1RPVEFMX0VYVF9QQVlMT0FEUzsgbisrICkgewogICAgICAgIGlmICggIWV4dFBheWxvYWRVc2VkW25dCiAgICAgICAgICAmJiAoZXh0UGF5bG9hZFtuXS5hc3NvY2lhdGVkQ2hFbGVtZW50ID09IC0xKQogICAgICAgICAgJiYgKGV4dFBheWxvYWRbbl0ucERhdGEgIT0gTlVMTCkgKQogICAgICAgIHsKICAgICAgICAgICAgVUlOVCBwYXlsb2FkQml0cyA9IDA7CgogICAgICAgICAgICBpZiAoZXh0UGF5bG9hZFtuXS5kYXRhVHlwZSA9PSBFWFRfREFUQV9FTEVNRU5UKSB7CiAgICAgICAgICAgICAgICBpZiAoaEFhY0VuYy0+YW5jaWxsYXJ5Qml0c1BlckZyYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgLyogZ3JhbnRlZCBmcmFtZSBkc2UgYml0cmF0ZSAqLwogICAgICAgICAgICAgICAgICAgIHBheWxvYWRCaXRzID0gaEFhY0VuYy0+YW5jaWxsYXJ5Qml0c1BlckZyYW1lOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgLyogd3JpdGUgYW5jIGRhdGEgaWYgYml0cmF0ZSBjb25zdHJhaW50IGZ1bGZpbGxlZCAqLwogICAgICAgICAgICAgICAgICAgIGlmICgoZXh0UGF5bG9hZFtuXS5kYXRhU2l6ZT4+MykgPD0gaEFhY0VuYy0+Y29uZmlnLT5tYXhBbmNCeXRlc1BlckFVKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWRCaXRzID0gZXh0UGF5bG9hZFtuXS5kYXRhU2l6ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBwYXlsb2FkQml0cyA9IGZpeE1pbiggZXh0UGF5bG9hZFtuXS5kYXRhU2l6ZSwgcGF5bG9hZEJpdHMgKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHBheWxvYWRCaXRzID0gZXh0UGF5bG9hZFtuXS5kYXRhU2l6ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHBheWxvYWRCaXRzID4gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaW50IGlkeCA9IHFjT3V0LT5uRXh0ZW5zaW9ucysrOwoKICAgICAgICAgICAgICAgIHFjT3V0LT5leHRlbnNpb25baWR4XS50eXBlICAgICAgICAgPSBleHRQYXlsb2FkW25dLmRhdGFUeXBlOyAgIC8qIFBlcmZvcm0gYSBzYW5pdHkgY2hlY2sgb24gdGhlIHR5cGU/ICovCiAgICAgICAgICAgICAgICBxY091dC0+ZXh0ZW5zaW9uW2lkeF0ublBheWxvYWRCaXRzID0gcGF5bG9hZEJpdHM7CiAgICAgICAgICAgICAgICBxY091dC0+ZXh0ZW5zaW9uW2lkeF0ucFBheWxvYWQgPSBleHRQYXlsb2FkW25dLnBEYXRhOwogICAgICAgICAgICAgICAgLyogTm93IGFzayB0aGUgYml0c3RyZWFtIGVuY29kZXIgaG93IG1hbnkgYml0cyB3ZSBuZWVkIHRvIGVuY29kZSB0aGUgZGF0YSB3aXRoIHRoZSBjdXJyZW50IGJpdHN0cmVhbSBzeW50YXg6ICovCiAgICAgICAgICAgICAgICBxY091dC0+Z2xvYmFsRXh0Qml0cyArPSBGREthYWNFbmNfd3JpdGVFeHRlbnNpb25EYXRhKCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcWNPdXQtPmV4dGVuc2lvbltpZHhdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhBYWNFbmMtPmNvbmZpZy0+c3ludGF4RmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQWFjRW5jLT5hb3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQWFjRW5jLT5jb25maWctPmVwQ29uZmlnICk7CiAgICAgICAgICAgICAgICBpZiAoZXh0UGF5bG9hZFtuXS5kYXRhVHlwZSA9PSBFWFRfREFUQV9FTEVNRU5UKSB7CiAgICAgICAgICAgICAgICAgICAgLyogc3Vic3RyYWN0IHRoZSBwcm9jZXNzZWQgYml0cyAqLwogICAgICAgICAgICAgICAgICAgIGV4dFBheWxvYWRbbl0uZGF0YVNpemUgLT0gcGF5bG9hZEJpdHM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBleHRQYXlsb2FkVXNlZFtuXSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgaWYgKCEoaEFhY0VuYy0+Y29uZmlnLT5zeW50YXhGbGFncyAmIChBQ19TQ0FMQUJMRXxBQ19FUikpKSB7CiAgICAgIHFjT3V0LT5nbG9iYWxFeHRCaXRzICs9IEVMX0lEX0JJVFM7ICAvKiBhZGQgYml0cyBmb3IgSURfRU5EICovCiAgICB9CgogICAgLyogYnVpbGQgYml0c3RyZWFtIGFsbCBuU3ViRnJhbWVzICovCiAgICB7CiAgICAgICAgSU5UIHRvdGFsQml0cyAgICA9IDA7ICAgLyogVG90YWwgQVUgYml0cyAqLzsKICAgICAgICBJTlQgYXZnVG90YWxCaXRzID0gMDsKCiAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogICAgICAgIC8qIEdldCBhdmVyYWdlIHRvdGFsIGJpdHMgKi8KICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAgICAgICAgewogICAgICAgICAgICAvKiBmcmFtZSB3aXNlIGJpdHJhdGUgYWRhcHRpb24gKi8KICAgICAgICAgICAgRkRLYWFjRW5jX0FkanVzdEJpdHJhdGUoaEFhY0VuYy0+cWNLZXJuZWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhdmdUb3RhbEJpdHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhBYWNFbmMtPmNvbmZpZy0+Yml0UmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEFhY0VuYy0+Y29uZmlnLT5zYW1wbGVSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQWFjRW5jLT5jb25maWctPmZyYW1lbGVuZ3RoKTsKCiAgICAgICAgICAgIC8qIGFkanVzdCBzdXBlciBmcmFtZSBiaXRyYXRlICovCiAgICAgICAgICAgIGF2Z1RvdGFsQml0cyAqPSBoQWFjRW5jLT5jb25maWctPm5TdWJGcmFtZXM7CiAgICAgICAgfQoKICAgICAgICAvKiBNYWtlIGZpcnN0IGVzdGltYXRlIG9mIHRyYW5zcG9ydCBoZWFkZXIgb3ZlcmhlYWQuCiAgICAgICAgICAgVGFrZSBtYXhpbXVtIHBvc3NpYmxlIGZyYW1lIHNpemUgaW50byBhY2NvdW50IHRvIHByZXZlbnQgYml0cmVzZXJ2b2lyIHVuZGVycnVuLiAqLwogICAgICAgIGhBYWNFbmMtPnFjS2VybmVsLT5nbG9iSGRyQml0cyA9IHRyYW5zcG9ydEVuY19HZXRTdGF0aWNCaXRzKGhUcEVuYywgYXZnVG90YWxCaXRzICsgaEFhY0VuYy0+cWNLZXJuZWwtPmJpdFJlc1RvdCk7CgoKICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCiAgICAgICAgRXJyb3JTdGF0dXMgPSBGREthYWNFbmNfUUNNYWluKGhBYWNFbmMtPnFjS2VybmVsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQWFjRW5jLT5wc3lPdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhBYWNFbmMtPnFjT3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmdUb3RhbEJpdHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLGhBYWNFbmMtPmFvdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEFhY0VuYy0+Y29uZmlnLT5zeW50YXhGbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEFhY0VuYy0+Y29uZmlnLT5lcENvbmZpZyk7CgogICAgICAgIGlmIChFcnJvclN0YXR1cyAhPSBBQUNfRU5DX09LKQogICAgICAgICAgICByZXR1cm4gRXJyb3JTdGF0dXM7CiAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAgICAgICAgRXJyb3JTdGF0dXMgPSBGREthYWNFbmNfdXBkYXRlRmlsbEJpdHMoY20sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEFhY0VuYy0+cWNLZXJuZWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEFhY0VuYy0+cWNLZXJuZWwtPmVsZW1lbnRCaXRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhBYWNFbmMtPnFjT3V0KTsKICAgICAgICBpZiAoRXJyb3JTdGF0dXMgIT0gQUFDX0VOQ19PSykKICAgICAgICAgICAgcmV0dXJuIEVycm9yU3RhdHVzOwoKICAgICAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogICAgICAgICAgICBFcnJvclN0YXR1cyA9IEZES2FhY0VuY19GaW5hbGl6ZUJpdENvbnN1bXB0aW9uKGNtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhBYWNFbmMtPnFjS2VybmVsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFjT3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFjT3V0LT5xY0VsZW1lbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFRwRW5jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhBYWNFbmMtPmFvdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQWFjRW5jLT5jb25maWctPnN5bnRheEZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhBYWNFbmMtPmNvbmZpZy0+ZXBDb25maWcpOwogICAgICAgICAgICBpZiAoRXJyb3JTdGF0dXMgIT0gQUFDX0VOQ19PSykKICAgICAgICAgICAgICAgIHJldHVybiBFcnJvclN0YXR1czsKICAgICAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogICAgICAgICAgICB0b3RhbEJpdHMgKz0gcWNPdXQtPnRvdGFsQml0czsKCgogICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KICAgICAgICBGREthYWNFbmNfdXBkYXRlQml0cmVzKGNtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEFhY0VuYy0+cWNLZXJuZWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoQWFjRW5jLT5xY091dCk7CgogICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCiAgICAgICAgLyogZm9yICggYWxsIHN1YiBmcmFtZXMgKSAuLi4gKi8KICAgICAgICAgICAgICAvKiB3cml0ZSBiaXRzdHJlYW0gaGVhZGVyICovCiAgICAgICAgICAgICAgdHJhbnNwb3J0RW5jX1dyaXRlQWNjZXNzVW5pdCgKICAgICAgICAgICAgICAgICAgICBoVHBFbmMsCiAgICAgICAgICAgICAgICAgICAgdG90YWxCaXRzLAogICAgICAgICAgICAgICAgICAgIEZES2FhY0VuY19FbmNCaXRyZXNUb1RwQml0cmVzKGhBYWNFbmMtPmJpdHJhdGVNb2RlLCBoQWFjRW5jLT5xY0tlcm5lbC0+Yml0UmVzVG90KSwKICAgICAgICAgICAgICAgICAgICBjbS0+bkNoYW5uZWxzRWZmKTsKCiAgICAgICAgICAgICAgLyogd3JpdGUgYml0c3RyZWFtICovCiAgICAgICAgICAgICAgRXJyb3JTdGF0dXMgPSBGREthYWNFbmNfV3JpdGVCaXRzdHJlYW0oCiAgICAgICAgICAgICAgICAgICAgaFRwRW5jLAogICAgICAgICAgICAgICAgICAgIGNtLAogICAgICAgICAgICAgICAgICAgIHFjT3V0LAogICAgICAgICAgICAgICAgICAgIHBzeU91dCwKICAgICAgICAgICAgICAgICAgICBoQWFjRW5jLT5xY0tlcm5lbCwKICAgICAgICAgICAgICAgICAgICBoQWFjRW5jLT5hb3QsCiAgICAgICAgICAgICAgICAgICAgaEFhY0VuYy0+Y29uZmlnLT5zeW50YXhGbGFncywKICAgICAgICAgICAgICAgICAgICBoQWFjRW5jLT5jb25maWctPmVwQ29uZmlnKTsKCiAgICAgICAgICAgICAgaWYgKEVycm9yU3RhdHVzICE9IEFBQ19FTkNfT0spCiAgICAgICAgICAgICAgICByZXR1cm4gRXJyb3JTdGF0dXM7CgogICAgICAgICAgICAgIC8qIHRyYW5zcG9ydEVuY19FbmRBY2Nlc3NVbml0KCkgaXMgYmVpbmcgY2FsbGVkIGluc2lkZSBGREthYWNFbmNfV3JpdGVCaXRzdHJlYW0oKSAqLwogICAgICAgICAgICAgIHRyYW5zcG9ydEVuY19HZXRGcmFtZShoVHBFbmMsIG5PdXRCeXRlcyk7CgogICAgfSAvKiAtZW5kLSBpZiAoY3VyRnJhbWU9PWhBYWNFbmMtPnFjS2VybmVsLT5uU3ViRnJhbWVzKSAqLwoKCiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAgICByZXR1cm4gQUFDX0VOQ19PSzsKfQoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICBmdW5jdGlvbm5hbWU6RkRLYWFjRW5jX0Nsb3NlCiAgICBkZXNjcmlwdGlvbjogZGVsZXRlIGVuY29kZXIgaW5zdGFuY2UKICAgIHJldHVybnM6CgogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgp2b2lkIEZES2FhY0VuY19DbG9zZSggSEFORExFX0FBQ19FTkMqICBwaEFhY0VuYykgICAvKiBlbmNvZGVyIGhhbmRsZSAqLwp7CiAgICBpZiAoKnBoQWFjRW5jID09IE5VTEwpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgQUFDX0VOQyAqaEFhY0VuYyA9IChBQUNfRU5DKikqcGhBYWNFbmM7CgogICBpZiAoaEFhY0VuYy0+ZHluYW1pY19SQU0gIT0gTlVMTCkKICAgICAgIEZyZWVBQUNkeW5hbWljX1JBTSgmaEFhY0VuYy0+ZHluYW1pY19SQU0pOwoKICAgIEZES2FhY0VuY19Qc3lDbG9zZSgmaEFhY0VuYy0+cHN5S2VybmVsLGhBYWNFbmMtPnBzeU91dCk7CgogICAgRkRLYWFjRW5jX1FDQ2xvc2UoJmhBYWNFbmMtPnFjS2VybmVsLCBoQWFjRW5jLT5xY091dCk7CgogICAgRnJlZVJhbV9hYWNFbmNfQWFjRW5jb2RlcihwaEFhY0VuYyk7Cn0KCgovKiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBhcmUgaW4gdGhpcyBzb3VyY2UgZmlsZSBvbmx5IGZvciBjb252ZW5pZW5jZSBhbmQgKi8KLyogbmVlZCBub3QgYmUgdmlzaWJsZSBvdXRzaWRlIG9mIGEgcG9zc2libGUgZW5jb2RlciBsaWJyYXJ5LiAqLwoKLyogYmFzaWMgZGVmaW5lcyBmb3IgYW5jaWxsYXJ5IGRhdGEgKi8KI2RlZmluZSBNQVhfQU5DUkFURSAxOTIwMCAgICAgICAgICAgIC8qIGFuY2lsbGFyeSByYXRlID49IDE5MjAwIGlzbid0IHZhbGlkICovCgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgIGZ1bmN0aW9ubmFtZTogIEZES2FhY0VuY19Jbml0Q2hlY2tBbmNpbGxhcnkKICAgIGRlc2NyaXB0aW9uOiAgIGluaXRpYWxpemUgYW5kIGNoZWNrIGFuY2lsbGFyeSBkYXRhIHN0cnVjdAogICAgcmV0dXJuOiAgICAgICAgaWYgc3VjY2VzcyBvciBOVUxMIGlmIGVycm9yCgogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCnN0YXRpYyBBQUNfRU5DT0RFUl9FUlJPUiBGREthYWNFbmNfSW5pdENoZWNrQW5jaWxsYXJ5KElOVCBiaXRSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgZnJhbWVsZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBhbmNpbGxhcnlSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKmFuY2lsbGFyeUJpdHNQZXJGcmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHNhbXBsZVJhdGUpCnsKICBJTlQgZGlmZlRvQnl0ZUFsaWduOwoKICAvKiBkb24ndCB1c2UgbmVnYXRpdmUgYW5jaWxsYXJ5IHJhdGVzICovCiAgaWYgKCBhbmNpbGxhcnlSYXRlIDwgLTEgKQogICAgcmV0dXJuIEFBQ19FTkNfVU5TVVBQT1JURURfQU5DX0JJVFJBVEU7CgogIC8qIGNoZWNrIGlmIGFuY2lsbGFyeSByYXRlIGlzIG9rICovCiAgaWYgKCAoYW5jaWxsYXJ5UmF0ZSAhPSAoLTEpKSAmJiAoYW5jaWxsYXJ5UmF0ZSAhPSAwKSApIHsKICAgIC8qIGFuY1JhdGUgPD0gMTUlIG9mIGJpdHJhdGUgJiYgYW5jUmF0ZSA8IDE5MjAwICovCiAgICBpZiAoICggYW5jaWxsYXJ5UmF0ZSA+PSBNQVhfQU5DUkFURSApIHx8CiAgICAgICAgICggKGFuY2lsbGFyeVJhdGUgKiAyMCkgPiAoYml0UmF0ZSAqIDMpICkgKSB7CiAgICAgIHJldHVybiBBQUNfRU5DX1VOU1VQUE9SVEVEX0FOQ19CSVRSQVRFOwogICAgfQogIH0KICBlbHNlIGlmIChhbmNpbGxhcnlSYXRlID09IC0xKSB7CiAgICAvKiBpZiBubyBzcGVjaWFsIGFuY1JhdGUgaXMgcmVxdWVzdGVkIGJ1dCBhIGFuY2lsbGFyeSBmaWxlIGlzCiAgICAgICBzdGF0ZWQsIHRoZW4gZ2VuZXJhdGUgYSBhbmNpbGxhcnkgcmF0ZSBtYXRjaGluZyB0byB0aGUgYml0cmF0ZSAqLwogICAgaWYgKGJpdFJhdGUgPj0gKE1BWF9BTkNSQVRFICogMTApKSB7CiAgICAgIC8qIGFuY2lsbGFyeSByYXRlIGlzIDE5MTk5ICovCiAgICAgIGFuY2lsbGFyeVJhdGUgPSAoTUFYX0FOQ1JBVEUgLSAxKTsKICAgIH0KICAgIGVsc2UgeyAvKiAxMCUgb2YgYml0cmF0ZSAqLwogICAgICBhbmNpbGxhcnlSYXRlID0gYml0UmF0ZSAvIDEwOwogICAgfQogIH0KCiAgLyogbWFrZSBhbmNpbGxhcnlCaXRzUGVyRnJhbWUgYnl0ZSBhbGlnbiAqLwogICphbmNpbGxhcnlCaXRzUGVyRnJhbWUgPSAoYW5jaWxsYXJ5UmF0ZSAqIGZyYW1lbGVuZ3RoICkgLyBzYW1wbGVSYXRlOwogIGRpZmZUb0J5dGVBbGlnbiA9ICphbmNpbGxhcnlCaXRzUGVyRnJhbWUgJSA4OwogICphbmNpbGxhcnlCaXRzUGVyRnJhbWUgPSAqYW5jaWxsYXJ5Qml0c1BlckZyYW1lIC0gZGlmZlRvQnl0ZUFsaWduOwoKICByZXR1cm4gQUFDX0VOQ19PSzsKfQo=