Ci8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAoKqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAxLiAgICBJTlRST0RVQ1RJT04KVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwp0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCgpBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQppbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydApvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KClBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwppbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCnRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCnRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwpzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCgpDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAphcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCgoyLiAgICBDT1BZUklHSFQgTElDRU5TRQoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CnBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKCllvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCnlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCgpZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCllvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgoKVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dApwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCgpZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCnNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgoKWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCiJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCgozLiAgICBOTyBQQVRFTlQgTElDRU5TRQoKTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCkFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCnJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KCllvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZApieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCgo0LiAgICBESVNDTEFJTUVSCgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwpvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgpDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCmluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCm9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCmFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgoKNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgoKRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCkF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCkFtIFdvbGZzbWFudGVsIDMzCjkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Cgp3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCmFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKiEKICBcZmlsZQogIFxicmllZiAgcnZsYyBjb25jZWFsbWVudAogIFxhdXRob3IgSm9zZWYgSG9lcGZsCiovCgojaW5jbHVkZSAicnZsY2NvbmNlYWwuaCIKCgojaW5jbHVkZSAiYmxvY2suaCIKI2luY2x1ZGUgInJ2bGMuaCIKCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgZnVuY3Rpb246ICAgICAgY2FsY1JlZlZhbEZ3ZAoKICBkZXNjcmlwdGlvbjogICBUaGUgZnVuY3Rpb24gZGV0ZXJtaW5lcyB0aGUgc2NhbGVmYWN0b3Igd2hpY2ggaXMgY2xvc2VkIHRvIHRoZSBzY2FsZWZhY3RvcmJhbmQKICAgICAgICAgICAgICAgICBjb25jZWFsX21pbi4gVGhlIHNhbWUgaXMgZG9uZSBmb3IgaW50ZW5zaXR5IGRhdGEgYW5kIG5vaXNlIGVuZXJnaWVzLgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIG91dHB1dDogICAgICAgIC0gcmVmZXJlbmNlIHZhbHVlIHNjZgogICAgICAgICAgICAgICAgIC0gcmVmZXJlbmNlIHZhbHVlIGludGVybnNpdHkgZGF0YQogICAgICAgICAgICAgICAgIC0gcmVmZXJlbmNlIHZhbHVlIG5vaXNlIGVuZXJneQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIHJldHVybjogICAgICAgIC0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCnN0YXRpYwp2b2lkIGNhbGNSZWZWYWxGd2QgKENFclJ2bGNJbmZvICpwUnZsYywKICAgICAgICAgICAgICAgICAgICBDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvLAogICAgICAgICAgICAgICAgICAgIGludCAqcmVmSXNGd2QsCiAgICAgICAgICAgICAgICAgICAgaW50ICpyZWZOcmdGd2QsCiAgICAgICAgICAgICAgICAgICAgaW50ICpyZWZTY2ZGd2QpCnsKICBpbnQgYmFuZCxibmRzLGdyb3VwLHN0YXJ0QmFuZDsKICBpbnQgaWRJcyxpZE5yZyxpZFNjZjsKICBpbnQgY29uY2VhbF9taW4sY29uY2VhbF9ncm91cF9taW47CiAgaW50IE1heGltdW1TY2FsZUZhY3RvckJhbmRzOwoKCiAgaWYgKEdldFdpbmRvd1NlcXVlbmNlKCZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5pY3NJbmZvKSA9PSBFaWdodFNob3J0U2VxdWVuY2UpCiAgICBNYXhpbXVtU2NhbGVGYWN0b3JCYW5kcyA9IDE2OwogIGVsc2UKICAgIE1heGltdW1TY2FsZUZhY3RvckJhbmRzID0gNjQ7CgogIGNvbmNlYWxfbWluID0gcFJ2bGMtPmNvbmNlYWxfbWluICUgTWF4aW11bVNjYWxlRmFjdG9yQmFuZHM7CiAgY29uY2VhbF9ncm91cF9taW4gPSBwUnZsYy0+Y29uY2VhbF9taW4gLyBNYXhpbXVtU2NhbGVGYWN0b3JCYW5kczsKCiAgLyogY2FsY3VsYXRlIGZpcnN0IHJlZmVyZW5jZSB2YWx1ZSBmb3IgYXBwcm9hY2ggaW4gZm9yd2FyZCBkaXJlY3Rpb24gKi8KICBpZElzID0gaWROcmcgPSBpZFNjZiA9IDE7CgogIC8qIHNldCByZWZlcmVuY2UgdmFsdWVzICovCiAgKnJlZklzRndkID0gLSBTRl9PRkZTRVQ7CiAgKnJlZk5yZ0Z3ZCA9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5SYXdEYXRhSW5mby5HbG9iYWxHYWluIC0gU0ZfT0ZGU0VUIC0gOTAgLSAyNTY7CiAgKnJlZlNjZkZ3ZCA9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5SYXdEYXRhSW5mby5HbG9iYWxHYWluIC0gU0ZfT0ZGU0VUOwoKICBzdGFydEJhbmQgPSBjb25jZWFsX21pbi0xOwogIGZvciAoZ3JvdXA9Y29uY2VhbF9ncm91cF9taW47IGdyb3VwID49IDA7IGdyb3VwLS0pIHsKICAgIGZvciAoYmFuZD1zdGFydEJhbmQ7IGJhbmQgPj0gMDsgYmFuZC0tKSB7CiAgICAgIGJuZHMgPSAxNipncm91cCtiYW5kOwogICAgICBzd2l0Y2ggKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5hQ29kZUJvb2tbYm5kc10pIHsKICAgICAgICBjYXNlIFpFUk9fSENCOgogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBJTlRFTlNJVFlfSENCOgogICAgICAgIGNhc2UgSU5URU5TSVRZX0hDQjI6CiAgICAgICAgICBpZiAoaWRJcykgewogICAgICAgICAgICAqcmVmSXNGd2QgPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuYVJ2bGNTY2ZGd2RbYm5kc107CiAgICAgICAgICAgIGlkSXM9MDsgLyogcmVmZXJlbmNlIHZhbHVlIGhhcyBiZWVuIHNldCAqLwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBOT0lTRV9IQ0I6CiAgICAgICAgICBpZiAoaWROcmcpIHsKICAgICAgICAgICAgKnJlZk5yZ0Z3ZCA9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5hUnZsY1NjZkZ3ZFtibmRzXTsKICAgICAgICAgICAgaWROcmc9MDsgLyogcmVmZXJlbmNlIHZhbHVlIGhhcyBiZWVuIHNldCAqLwogICAgICAgICAgfQogICAgICAgICAgYnJlYWsgOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICBpZiAoaWRTY2YpIHsKICAgICAgICAgICAgKnJlZlNjZkZ3ZCA9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5hUnZsY1NjZkZ3ZFtibmRzXTsKICAgICAgICAgICAgaWRTY2Y9MDsgLyogcmVmZXJlbmNlIHZhbHVlIGhhcyBiZWVuIHNldCAqLwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgIHN0YXJ0QmFuZCA9IHBSdmxjLT5tYXhTZmJUcmFuc21pdHRlZC0xOwogIH0KCn0KCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgZnVuY3Rpb246ICAgICAgY2FsY1JlZlZhbEJ3ZAoKICBkZXNjcmlwdGlvbjogICBUaGUgZnVuY3Rpb24gZGV0ZXJtaW5lcyB0aGUgc2NhbGVmYWN0b3Igd2hpY2ggaXMgY2xvc2VkIHRvIHRoZSBzY2FsZWZhY3RvcmJhbmQKICAgICAgICAgICAgICAgICBjb25jZWFsX21heC4gVGhlIHNhbWUgaXMgZG9uZSBmb3IgaW50ZW5zaXR5IGRhdGEgYW5kIG5vaXNlIGVuZXJnaWVzLgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIG91dHB1dDogICAgICAgIC0gcmVmZXJlbmNlIHZhbHVlIHNjZgogICAgICAgICAgICAgICAgIC0gcmVmZXJlbmNlIHZhbHVlIGludGVybnNpdHkgZGF0YQogICAgICAgICAgICAgICAgIC0gcmVmZXJlbmNlIHZhbHVlIG5vaXNlIGVuZXJneQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIHJldHVybjogICAgICAgIC0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCnN0YXRpYwp2b2lkIGNhbGNSZWZWYWxCd2QgKENFclJ2bGNJbmZvICpwUnZsYywKICAgICAgICAgICAgICAgICAgICBDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvLAogICAgICAgICAgICAgICAgICAgIGludCAqcmVmSXNCd2QsCiAgICAgICAgICAgICAgICAgICAgaW50ICpyZWZOcmdCd2QsCiAgICAgICAgICAgICAgICAgICAgaW50ICpyZWZTY2ZCd2QpCnsKICBpbnQgYmFuZCxibmRzLGdyb3VwLHN0YXJ0QmFuZDsKICBpbnQgaWRJcyxpZE5yZyxpZFNjZjsKICBpbnQgY29uY2VhbF9tYXgsY29uY2VhbF9ncm91cF9tYXg7CiAgaW50IE1heGltdW1TY2FsZUZhY3RvckJhbmRzOwoKICBpZiAoR2V0V2luZG93U2VxdWVuY2UoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmljc0luZm8pID09IEVpZ2h0U2hvcnRTZXF1ZW5jZSkKICAgIE1heGltdW1TY2FsZUZhY3RvckJhbmRzID0gMTY7CiAgZWxzZQogICAgTWF4aW11bVNjYWxlRmFjdG9yQmFuZHMgPSA2NDsKCiAgY29uY2VhbF9tYXggPSBwUnZsYy0+Y29uY2VhbF9tYXggJSBNYXhpbXVtU2NhbGVGYWN0b3JCYW5kczsKICBjb25jZWFsX2dyb3VwX21heCA9IHBSdmxjLT5jb25jZWFsX21heCAvIE1heGltdW1TY2FsZUZhY3RvckJhbmRzOwoKICAvKiBjYWxjdWxhdGUgZmlyc3QgcmVmZXJlbmNlIHZhbHVlIGZvciBhcHByb2FjaCBpbiBiYWNrd2FyZCBkaXJlY3Rpb24gKi8KICBpZElzID0gaWROcmcgPSBpZFNjZiA9IDE7CgogIC8qIHNldCByZWZlcmVuY2UgdmFsdWVzICovCiAgKnJlZklzQndkID0gcFJ2bGMtPmRwY21faXNfbGFzdF9wb3NpdGlvbiAtIFNGX09GRlNFVDsKICAqcmVmTnJnQndkID0gcFJ2bGMtPnJldl9nbG9iYWxfZ2FpbiArIHBSdmxjLT5kcGNtX25vaXNlX2xhc3RfcG9zaXRpb24gLSBTRl9PRkZTRVQgLSA5MCAtIDI1NiArIHBSdmxjLT5kcGNtX25vaXNlX25yZzsKICAqcmVmU2NmQndkID0gcFJ2bGMtPnJldl9nbG9iYWxfZ2FpbiAtIFNGX09GRlNFVDsKCiAgc3RhcnRCYW5kPWNvbmNlYWxfbWF4KzE7CgogIC8qIGlmIG5lZWRlZCwgcmUtc2V0IHJlZmVyZW5jZSB2YWx1ZXMgKi8KICBmb3IgKGdyb3VwPWNvbmNlYWxfZ3JvdXBfbWF4OyBncm91cCA8IHBSdmxjLT5udW1XaW5kb3dHcm91cHM7IGdyb3VwKyspIHsKICAgIGZvciAoYmFuZD1zdGFydEJhbmQ7IGJhbmQgPCBwUnZsYy0+bWF4U2ZiVHJhbnNtaXR0ZWQ7IGJhbmQrKykgewogICAgICBibmRzID0gMTYqZ3JvdXArYmFuZDsKICAgICAgc3dpdGNoIChwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+YUNvZGVCb29rW2JuZHNdKSB7CiAgICAgICAgY2FzZSBaRVJPX0hDQjoKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgSU5URU5TSVRZX0hDQjoKICAgICAgICBjYXNlIElOVEVOU0lUWV9IQ0IyOgogICAgICAgICAgaWYgKGlkSXMpIHsKICAgICAgICAgICAgKnJlZklzQndkID0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmQndkW2JuZHNdOwogICAgICAgICAgICBpZElzPTA7IC8qIHJlZmVyZW5jZSB2YWx1ZSBoYXMgYmVlbiBzZXQgKi8KICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgTk9JU0VfSENCOgogICAgICAgICAgaWYgKGlkTnJnKSB7CiAgICAgICAgICAgICpyZWZOcmdCd2QgPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuYVJ2bGNTY2ZCd2RbYm5kc107CiAgICAgICAgICAgIGlkTnJnPTA7ICAvKiByZWZlcmVuY2UgdmFsdWUgaGFzIGJlZW4gc2V0ICovCiAgICAgICAgICB9CiAgICAgICAgICBicmVhayA7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgIGlmIChpZFNjZikgewogICAgICAgICAgICAqcmVmU2NmQndkID0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmQndkW2JuZHNdOwogICAgICAgICAgICBpZFNjZj0wOyAvKiByZWZlcmVuY2UgdmFsdWUgaGFzIGJlZW4gc2V0ICovCiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgc3RhcnRCYW5kPTA7CiAgfQoKfQoKCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgZnVuY3Rpb246ICAgICAgQmlkaXJlY3Rpb25hbEVzdGltYXRpb25fVXNlTG93ZXJTY2ZPZkN1cnJlbnRGcmFtZQoKICBkZXNjcmlwdGlvbjogICBUaGlzIGFwcHJvYWNoIGJ5IG1lYW5zIG9mIGJpZGlyZWN0aW9uYWwgZXN0aW1hdGlvbiBpcyBnZW5lcmFsbHkgcGVyZm9ybWVkIHdoZW4KICAgICAgICAgICAgICAgICBhIHNpbmdsZSBiaXQgZXJyb3IgaGFzIGJlZW4gZGV0ZWN0ZWQsIHRoZSBiaXQgZXJyb3IgY2FuIGJlIGlzb2xhdGVkIGJldHdlZW4KICAgICAgICAgICAgICAgICAnY29uY2VhbF9taW4nIGFuZCAnY29uY2VhbF9tYXgnIGFuZCB0aGUgJ3NmX2NvbmNlYWxtZW50JyBmbGFnIGlzIG5vdCBzZXQuIFRoZQogICAgICAgICAgICAgICAgIHNldHMgb2Ygc2NhbGVmYWN0b3JzIGRlY29kZWQgaW4gZm9yd2FyZCBhbmQgYmFja3dhcmQgZGlyZWN0aW9uIGFyZSBjb21wYXJlZAogICAgICAgICAgICAgICAgIHdpdGggZWFjaCBvdGhlci4gVGhlIHNtYWxsZXIgc2NhbGVmYWN0b3Igd2lsbCBiZSBjb25zaWRlcmVkIGFzIHRoZSBjb3JyZWN0IG9uZQogICAgICAgICAgICAgICAgIHJlc3BlY3RpdmVseS4gVGhlIHJlY29uc3RydWN0aW9uIG9mIHRoZSBzY2FsZWZhY3RvcnMgd2l0aCB0aGlzIGFwcHJvYWNoIGFyY2hpZXZlCiAgICAgICAgICAgICAgICAgZ29vZCByZXN1bHRzIGluIGF1ZGlvIHF1YWxpdHkuIFRoZSBzdHJhdGVneSBtdXN0IGJlIGFwcGxpZWQgdG8gc2NhbGVmYWN0b3JzLAogICAgICAgICAgICAgICAgIGludGVuc2l0eSBkYXRhIGFuZCBub2lzZSBlbmVyZ3kgc2VwZXJhdGVseS4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICBvdXRwdXQ6ICAgICAgICBDb25jZWFsZWQgc2NhbGVmYWN0b3IsIG5vaXNlIGVuZXJneSBhbmQgaW50ZW5zaXR5IGRhdGEgYmV0d2VlbiBjb25jZWFsX21pbiBhbmQKICAgICAgICAgICAgICAgICBjb25jZWFsX21heAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIHJldHVybjogICAgICAgIC0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCnZvaWQgQmlkaXJlY3Rpb25hbEVzdGltYXRpb25fVXNlTG93ZXJTY2ZPZkN1cnJlbnRGcmFtZSAoQ0FhY0RlY29kZXJDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJDaGFubmVsSW5mbykKewogIENFclJ2bGNJbmZvICpwUnZsYyA9ICZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuZXJSdmxjSW5mbzsKICBpbnQgYmFuZCxibmRzLHN0YXJ0QmFuZCxlbmRCYW5kLGdyb3VwOwogIGludCBjb25jZWFsX21pbixjb25jZWFsX21heDsKICBpbnQgY29uY2VhbF9ncm91cF9taW4sY29uY2VhbF9ncm91cF9tYXg7CiAgaW50IE1heGltdW1TY2FsZUZhY3RvckJhbmRzOwoKICBpZiAoR2V0V2luZG93U2VxdWVuY2UoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmljc0luZm8pID09IEVpZ2h0U2hvcnRTZXF1ZW5jZSkgewogICAgTWF4aW11bVNjYWxlRmFjdG9yQmFuZHMgPSAxNjsKICB9CiAgZWxzZSB7CiAgICBNYXhpbXVtU2NhbGVGYWN0b3JCYW5kcyA9IDY0OwogIH0KICAKICAvKiBJZiBhbiBlcnJvciB3YXMgZGV0ZWN0ZWQganVzdCBpbiBmb3J3YXJkIG9yIGJhY2t3YXJkIGRpcmVjdGlvbiwgc2V0IHRoZSBjb3JyZXNwb25kaW5nIGJvcmRlciBmb3IgY29uY2VhbG1lbnQgdG8gYQogICAgIGFwcHJvcHJpYXRlIHNjYWxlZmFjdG9yIGJhbmQuIFRoZSBib3JkZXIgaXMgc2V0IHRvIGZpcnN0IG9yIGxhc3Qgc2ZiIHJlc3BlY3RpdmVseSwgYmVjYXVzZSB0aGUgZXJyb3Igd2lsbCBwb3NzaWJseSAKICAgICBub3QgZm9sbG93IGRpcmVjdGx5IGFmdGVyIHRoZSBjb3JydXB0IGJpdCBidXQganVzdCBhZnRlciBkZWNvZGluZyBzb21lIG1vcmUgKHdyb25nKSBzY2FsZWZhY3RvcnMuICovCiAgaWYgKHBSdmxjLT5jb25jZWFsX21pbiA9PSBDT05DRUFMX01JTl9JTklUKQogICAgcFJ2bGMtPmNvbmNlYWxfbWluID0gMDsKCiAgaWYgKHBSdmxjLT5jb25jZWFsX21heCA9PSBDT05DRUFMX01BWF9JTklUKQogICAgcFJ2bGMtPmNvbmNlYWxfbWF4ID0gKHBSdmxjLT5udW1XaW5kb3dHcm91cHMtMSkqMTYrcFJ2bGMtPm1heFNmYlRyYW5zbWl0dGVkLTE7CgogIGNvbmNlYWxfbWluID0gcFJ2bGMtPmNvbmNlYWxfbWluICUgTWF4aW11bVNjYWxlRmFjdG9yQmFuZHM7CiAgY29uY2VhbF9ncm91cF9taW4gPSBwUnZsYy0+Y29uY2VhbF9taW4gLyBNYXhpbXVtU2NhbGVGYWN0b3JCYW5kczsKICBjb25jZWFsX21heCA9IHBSdmxjLT5jb25jZWFsX21heCAlIE1heGltdW1TY2FsZUZhY3RvckJhbmRzOwogIGNvbmNlYWxfZ3JvdXBfbWF4ID0gcFJ2bGMtPmNvbmNlYWxfbWF4IC8gTWF4aW11bVNjYWxlRmFjdG9yQmFuZHM7CgogIGlmIChwUnZsYy0+Y29uY2VhbF9taW4gPT0gcFJ2bGMtPmNvbmNlYWxfbWF4KSB7CgogICAgaW50IHJlZklzRndkLHJlZk5yZ0Z3ZCxyZWZTY2ZGd2Q7CiAgICBpbnQgcmVmSXNCd2QscmVmTnJnQndkLHJlZlNjZkJ3ZDsKCiAgICBibmRzID0gcFJ2bGMtPmNvbmNlYWxfbWluOwogICAgY2FsY1JlZlZhbEZ3ZChwUnZsYyxwQWFjRGVjb2RlckNoYW5uZWxJbmZvLCZyZWZJc0Z3ZCwmcmVmTnJnRndkLCZyZWZTY2ZGd2QpOwogICAgY2FsY1JlZlZhbEJ3ZChwUnZsYyxwQWFjRGVjb2RlckNoYW5uZWxJbmZvLCZyZWZJc0J3ZCwmcmVmTnJnQndkLCZyZWZTY2ZCd2QpOwoKICAgIHN3aXRjaCAocEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFDb2RlQm9va1tibmRzXSkgewogICAgICBjYXNlIFpFUk9fSENCOgogICAgICAgIGJyZWFrOwogICAgICBjYXNlIElOVEVOU0lUWV9IQ0I6CiAgICAgIGNhc2UgSU5URU5TSVRZX0hDQjI6CiAgICAgICAgaWYgKHJlZklzRndkIDwgcmVmSXNCd2QpIAogICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFTY2FsZUZhY3RvcltibmRzXSA9IHJlZklzRndkOwogICAgICAgIGVsc2UKICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5hU2NhbGVGYWN0b3JbYm5kc10gPSByZWZJc0J3ZDsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBOT0lTRV9IQ0I6CiAgICAgICAgaWYgKHJlZk5yZ0Z3ZCA8IHJlZk5yZ0J3ZCkKICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5hU2NhbGVGYWN0b3JbYm5kc10gPSByZWZOcmdGd2Q7CiAgICAgICAgZWxzZQogICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFTY2FsZUZhY3RvcltibmRzXSA9IHJlZk5yZ0J3ZDsKICAgICAgICBicmVhazsKICAgICAgZGVmYXVsdDoKICAgICAgICBpZiAocmVmU2NmRndkIDwgcmVmU2NmQndkKQogICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFTY2FsZUZhY3RvcltibmRzXSA9IHJlZlNjZkZ3ZDsKICAgICAgICBlbHNlIAogICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFTY2FsZUZhY3RvcltibmRzXSA9IHJlZlNjZkJ3ZDsKICAgICAgICBicmVhazsKICAgIH0KICB9CiAgZWxzZSB7CiAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuYVJ2bGNTY2ZGd2RbcFJ2bGMtPmNvbmNlYWxfbWF4XSA9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5hUnZsY1NjZkJ3ZFtwUnZsYy0+Y29uY2VhbF9tYXhdOwogICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmQndkW3BSdmxjLT5jb25jZWFsX21pbl0gPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuYVJ2bGNTY2ZGd2RbcFJ2bGMtPmNvbmNlYWxfbWluXTsKCiAgICAvKiBjb25zaWRlciB0aGUgc21hbGxlciBvZiB0aGUgZm9yd2FyZCBhbmQgYmFja3dhcmQgZGVjb2RlZCB2YWx1ZSBhcyB0aGUgY29ycmVjdCBvbmUgKi8gIAogICAgc3RhcnRCYW5kID0gY29uY2VhbF9taW47ICAgICAgCiAgICBpZiAoY29uY2VhbF9ncm91cF9taW4gPT0gY29uY2VhbF9ncm91cF9tYXgpICAgCiAgICAgIGVuZEJhbmQgPSBjb25jZWFsX21heDsgICAgICAKICAgIGVsc2UgICAgICAgICAgCiAgICAgIGVuZEJhbmQgPSBwUnZsYy0+bWF4U2ZiVHJhbnNtaXR0ZWQtMTsgICAgICAgCgogICAgZm9yIChncm91cD1jb25jZWFsX2dyb3VwX21pbjsgZ3JvdXAgPD0gY29uY2VhbF9ncm91cF9tYXg7IGdyb3VwKyspIHsgIAogICAgICBmb3IgKGJhbmQ9c3RhcnRCYW5kOyBiYW5kIDw9IGVuZEJhbmQ7IGJhbmQrKykgeyAgCiAgICAgICAgYm5kcyA9IDE2Kmdyb3VwK2JhbmQ7ICAKICAgICAgICBpZiAocEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmRndkW2JuZHNdIDwgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmQndkW2JuZHNdKSAgCiAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+YVNjYWxlRmFjdG9yW2JuZHNdID0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmRndkW2JuZHNdOwogICAgICAgIGVsc2UKICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5hU2NhbGVGYWN0b3JbYm5kc10gPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuYVJ2bGNTY2ZCd2RbYm5kc107CiAgICAgIH0gIAogICAgICBzdGFydEJhbmQgPSAwOyAgIAogICAgICBpZiAoKGdyb3VwKzEpID09IGNvbmNlYWxfZ3JvdXBfbWF4KSAgCiAgICAgICAgZW5kQmFuZCA9IGNvbmNlYWxfbWF4OyAgCiAgICB9ICAKICB9CgogIC8qIG5vdyBjb3B5IGFsbCBkYXRhIHRvIHRoZSBvdXRwdXQgYnVmZmVyIHdoaWNoIG5lZWRzIG5vdCB0byBiZSBjb25jZWFsZWQgKi8KICBpZiAoY29uY2VhbF9ncm91cF9taW4gPT0gMCkgCiAgICBlbmRCYW5kID0gY29uY2VhbF9taW47ICAgIAogIGVsc2UgICAgICAgIAogICAgZW5kQmFuZCA9IHBSdmxjLT5tYXhTZmJUcmFuc21pdHRlZDsgICAgIAogIGZvciAoZ3JvdXA9MDsgZ3JvdXAgPD0gY29uY2VhbF9ncm91cF9taW47IGdyb3VwKyspIHsKICAgIGZvciAoYmFuZD0wOyBiYW5kIDwgZW5kQmFuZDsgYmFuZCsrKSB7CiAgICAgIGJuZHMgPSAxNipncm91cCtiYW5kOwogICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+YVNjYWxlRmFjdG9yW2JuZHNdID0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmRndkW2JuZHNdOwogICAgfQogICAgaWYgKChncm91cCsxKSA9PSBjb25jZWFsX2dyb3VwX21pbikgCiAgICAgIGVuZEJhbmQgPSBjb25jZWFsX21pbjsgICAgCiAgfQoKICBzdGFydEJhbmQgPSBjb25jZWFsX21heCsxOyAgICAKICBmb3IgKGdyb3VwPWNvbmNlYWxfZ3JvdXBfbWF4OyBncm91cCA8IHBSdmxjLT5udW1XaW5kb3dHcm91cHM7IGdyb3VwKyspIHsKICAgIGZvciAoYmFuZD1zdGFydEJhbmQ7IGJhbmQgPCBwUnZsYy0+bWF4U2ZiVHJhbnNtaXR0ZWQ7IGJhbmQrKykgewogICAgICBibmRzID0gMTYqZ3JvdXArYmFuZDsKICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFTY2FsZUZhY3RvcltibmRzXSA9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5hUnZsY1NjZkJ3ZFtibmRzXTsKICAgIH0KICAgIHN0YXJ0QmFuZCA9IDA7CiAgfQp9CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIGZ1bmN0aW9uOiAgICAgIEJpZGlyZWN0aW9uYWxFc3RpbWF0aW9uX1VzZVNjZk9mUHJldkZyYW1lQXNSZWZlcmVuY2UKCiAgZGVzY3JpcHRpb246ICAgVGhpcyBhcHByb2FjaCBieSBtZWFucyBvZiBiaWRpcmVjdGlvbmFsIGVzdGltYXRpb24gaXMgZ2VuZXJhbGx5IHBlcmZvcm1lZCB3aGVuCiAgICAgICAgICAgICAgICAgYSBzaW5nbGUgYml0IGVycm9yIGhhcyBiZWVuIGRldGVjdGVkLCB0aGUgYml0IGVycm9yIGNhbiBiZSBpc29sYXRlZCBiZXR3ZWVuIAogICAgICAgICAgICAgICAgICdjb25jZWFsX21pbicgYW5kICdjb25jZWFsX21heCcsIHRoZSAnc2ZfY29uY2VhbG1lbnQnIGZsYWcgaXMgc2V0IGFuZCB0aGUgCiAgICAgICAgICAgICAgICAgcHJldmlvdXMgZnJhbWUgaGFzIHRoZSBzYW1lIGJsb2NrIHR5cGUgYXMgdGhlIGN1cnJlbnQgZnJhbWUuIFRoZSBzY2FsZWZhY3RvciAKICAgICAgICAgICAgICAgICBkZWNvZGVkIGluIGZvcndhcmQgYW5kIGJhY2t3YXJkIGRpcmVjdGlvbiBhbmQgdGhlIHNjYWxlZmFjdG9yIG9mIHRoZSBwcmV2aW91cyAKICAgICAgICAgICAgICAgICBmcmFtZSBhcmUgY29tcGFyZWQgd2l0aCBlYWNoIG90aGVyLiBUaGUgc21hbGxlciBzY2FsZWZhY3RvciB3aWxsIGJlIGNvbnNpZGVyZWQgCiAgICAgICAgICAgICAgICAgYXMgdGhlIGNvcnJlY3Qgb25lLiBBdCB0aGlzIHRoZSBjb2RlYm9vayBvZiB0aGUgcHJldmlvdXMgYW5kIGN1cnJlbnQgZnJhbWUgbXVzdCAKICAgICAgICAgICAgICAgICBiZSBvZiB0aGUgc2FtZSBzZXQgKHNjZiwgbnJnLCBpcykgaW4gZWFjaCBzY2FsZWZhY3RvcmJhbmQuIE90aGVyd2lzZSB0aGUgCiAgICAgICAgICAgICAgICAgc2NhbGVmYWN0b3Igb2YgdGhlIHByZXZpb3VzIGZyYW1lIGlzIG5vdCBjb25zaWRlcmVkIGluIHRoZSBtaW5pbXVtIGNhbGN1bGF0aW9uLiAKICAgICAgICAgICAgICAgICBUaGUgcmVjb25zdHJ1Y3Rpb24gb2YgdGhlIHNjYWxlZmFjdG9ycyB3aXRoIHRoaXMgYXBwcm9hY2ggYXJjaGlldmUgZ29vZCByZXN1bHRzIAogICAgICAgICAgICAgICAgIGluIGF1ZGlvIHF1YWxpdHkuIFRoZSBzdHJhdGVneSBtdXN0IGJlIGFwcGxpZWQgdG8gc2NhbGVmYWN0b3JzLCBpbnRlbnNpdHkgZGF0YSAKICAgICAgICAgICAgICAgICBhbmQgbm9pc2UgZW5lcmd5IHNlcGVyYXRlbHkuCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgb3V0cHV0OiAgICAgICAgQ29uY2VhbGVkIHNjYWxlZmFjdG9yLCBub2lzZSBlbmVyZ3kgYW5kIGludGVuc2l0eSBkYXRhIGJldHdlZW4gY29uY2VhbF9taW4gYW5kIAogICAgICAgICAgICAgICAgIGNvbmNlYWxfbWF4Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgcmV0dXJuOiAgICAgICAgLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKdm9pZCBCaWRpcmVjdGlvbmFsRXN0aW1hdGlvbl9Vc2VTY2ZPZlByZXZGcmFtZUFzUmVmZXJlbmNlICgKICAgICAgICBDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvLAogICAgICAgIENBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8KICAgICAgICApCnsKICBDRXJSdmxjSW5mbyAqcFJ2bGMgPSAmcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmVyUnZsY0luZm87CiAgaW50IGJhbmQsYm5kcyxzdGFydEJhbmQsZW5kQmFuZCxncm91cDsKICBpbnQgY29uY2VhbF9taW4sY29uY2VhbF9tYXg7CiAgaW50IGNvbmNlYWxfZ3JvdXBfbWluLGNvbmNlYWxfZ3JvdXBfbWF4OwogIGludCBNYXhpbXVtU2NhbGVGYWN0b3JCYW5kczsKICBpbnQgY29tbW9uTWluOwoKICBpZiAoR2V0V2luZG93U2VxdWVuY2UoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmljc0luZm8pID09IEVpZ2h0U2hvcnRTZXF1ZW5jZSkgewogICAgTWF4aW11bVNjYWxlRmFjdG9yQmFuZHMgPSAxNjsKICB9CiAgZWxzZSB7CiAgICBNYXhpbXVtU2NhbGVGYWN0b3JCYW5kcyA9IDY0OwogIH0KCiAgLyogSWYgYW4gZXJyb3Igd2FzIGRldGVjdGVkIGp1c3QgaW4gZm9yd2FyZCBvciBiYWNrd2FyZCBkaXJlY3Rpb24sIHNldCB0aGUgY29ycmVzcG9uZGluZyBib3JkZXIgZm9yIGNvbmNlYWxtZW50IHRvIGEKICAgICBhcHByb3ByaWF0ZSBzY2FsZWZhY3RvciBiYW5kLiBUaGUgYm9yZGVyIGlzIHNldCB0byBmaXJzdCBvciBsYXN0IHNmYiByZXNwZWN0aXZlbHksIGJlY2F1c2UgdGhlIGVycm9yIHdpbGwgcG9zc2libHkgCiAgICAgbm90IGZvbGxvdyBkaXJlY3RseSBhZnRlciB0aGUgY29ycnVwdCBiaXQgYnV0IGp1c3QgYWZ0ZXIgZGVjb2Rpbmcgc29tZSBtb3JlICh3cm9uZykgc2NhbGVmYWN0b3JzLiAqLwogIGlmIChwUnZsYy0+Y29uY2VhbF9taW4gPT0gQ09OQ0VBTF9NSU5fSU5JVCkKICAgIHBSdmxjLT5jb25jZWFsX21pbiA9IDA7CgogIGlmIChwUnZsYy0+Y29uY2VhbF9tYXggPT0gQ09OQ0VBTF9NQVhfSU5JVCkKICAgIHBSdmxjLT5jb25jZWFsX21heCA9IChwUnZsYy0+bnVtV2luZG93R3JvdXBzLTEpKjE2K3BSdmxjLT5tYXhTZmJUcmFuc21pdHRlZC0xOwoKICBjb25jZWFsX21pbiA9IHBSdmxjLT5jb25jZWFsX21pbiAlIE1heGltdW1TY2FsZUZhY3RvckJhbmRzOwogIGNvbmNlYWxfZ3JvdXBfbWluID0gcFJ2bGMtPmNvbmNlYWxfbWluIC8gTWF4aW11bVNjYWxlRmFjdG9yQmFuZHM7CiAgY29uY2VhbF9tYXggPSBwUnZsYy0+Y29uY2VhbF9tYXggJSBNYXhpbXVtU2NhbGVGYWN0b3JCYW5kczsKICBjb25jZWFsX2dyb3VwX21heCA9IHBSdmxjLT5jb25jZWFsX21heCAvIE1heGltdW1TY2FsZUZhY3RvckJhbmRzOwoKICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuYVJ2bGNTY2ZGd2RbcFJ2bGMtPmNvbmNlYWxfbWF4XSA9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5hUnZsY1NjZkJ3ZFtwUnZsYy0+Y29uY2VhbF9tYXhdOyAgCiAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmQndkW3BSdmxjLT5jb25jZWFsX21pbl0gPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuYVJ2bGNTY2ZGd2RbcFJ2bGMtPmNvbmNlYWxfbWluXTsgIAoKICAvKiBjb25zaWRlciB0aGUgc21hbGxlciBvZiB0aGUgZm9yd2FyZCBhbmQgYmFja3dhcmQgZGVjb2RlZCB2YWx1ZSBhcyB0aGUgY29ycmVjdCBvbmUgKi8KICBzdGFydEJhbmQgPSBjb25jZWFsX21pbjsgICAgCiAgaWYgKGNvbmNlYWxfZ3JvdXBfbWluID09IGNvbmNlYWxfZ3JvdXBfbWF4KSAKICAgIGVuZEJhbmQgPSBjb25jZWFsX21heDsgICAgCiAgZWxzZSAgICAgICAgCiAgICBlbmRCYW5kID0gcFJ2bGMtPm1heFNmYlRyYW5zbWl0dGVkLTE7ICAgICAKCiAgZm9yIChncm91cD1jb25jZWFsX2dyb3VwX21pbjsgZ3JvdXAgPD0gY29uY2VhbF9ncm91cF9tYXg7IGdyb3VwKyspIHsKICAgIGZvciAoYmFuZD1zdGFydEJhbmQ7IGJhbmQgPD0gZW5kQmFuZDsgYmFuZCsrKSB7CiAgICAgIGJuZHMgPSAxNipncm91cCtiYW5kOwogICAgICBzd2l0Y2ggKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5hQ29kZUJvb2tbYm5kc10pIHsKICAgICAgICBjYXNlIFpFUk9fSENCOgogICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFTY2FsZUZhY3RvcltibmRzXSA9IDA7CiAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBJTlRFTlNJVFlfSENCOgogICAgICAgIGNhc2UgSU5URU5TSVRZX0hDQjI6CiAgICAgICAgICBpZiAoIChwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5jb25jZWFsbWVudEluZm8uYVJ2bGNQcmV2aW91c0NvZGVib29rW2JuZHNdPT1JTlRFTlNJVFlfSENCKSB8fCAocEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+Y29uY2VhbG1lbnRJbmZvLmFSdmxjUHJldmlvdXNDb2RlYm9va1tibmRzXT09SU5URU5TSVRZX0hDQjIpICkgewogICAgICAgICAgICBjb21tb25NaW4gPSBGREttaW4ocEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmRndkW2JuZHNdLHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5hUnZsY1NjZkJ3ZFtibmRzXSk7CiAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5hU2NhbGVGYWN0b3JbYm5kc10gPSBGREttaW4oY29tbW9uTWluLCBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5jb25jZWFsbWVudEluZm8uYVJ2bGNQcmV2aW91c1NjYWxlRmFjdG9yW2JuZHNdKTsKICAgICAgICAgIH0KICAgICAgICAgIGVsc2UgewogICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+YVNjYWxlRmFjdG9yW2JuZHNdID0gRkRLbWluKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5hUnZsY1NjZkZ3ZFtibmRzXSxwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuYVJ2bGNTY2ZCd2RbYm5kc10pOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgTk9JU0VfSENCOgogICAgICAgICAgaWYgKCBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5jb25jZWFsbWVudEluZm8uYVJ2bGNQcmV2aW91c0NvZGVib29rW2JuZHNdPT1OT0lTRV9IQ0IgKSB7CiAgICAgICAgICAgIGNvbW1vbk1pbiA9IEZES21pbihwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuYVJ2bGNTY2ZGd2RbYm5kc10scEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmQndkW2JuZHNdKTsKICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFTY2FsZUZhY3RvcltibmRzXSA9IEZES21pbihjb21tb25NaW4sIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmNvbmNlYWxtZW50SW5mby5hUnZsY1ByZXZpb3VzU2NhbGVGYWN0b3JbYm5kc10pOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFTY2FsZUZhY3RvcltibmRzXSA9IEZES21pbihwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuYVJ2bGNTY2ZGd2RbYm5kc10scEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmQndkW2JuZHNdKTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwoKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgaWYgKCAgIChwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5jb25jZWFsbWVudEluZm8uYVJ2bGNQcmV2aW91c0NvZGVib29rW2JuZHNdIT1aRVJPX0hDQikKICAgICAgICAgICAgICAmJiAocEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+Y29uY2VhbG1lbnRJbmZvLmFSdmxjUHJldmlvdXNDb2RlYm9va1tibmRzXSE9Tk9JU0VfSENCKQogICAgICAgICAgICAgICYmIChwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5jb25jZWFsbWVudEluZm8uYVJ2bGNQcmV2aW91c0NvZGVib29rW2JuZHNdIT1JTlRFTlNJVFlfSENCKSAKICAgICAgICAgICAgICAmJiAocEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+Y29uY2VhbG1lbnRJbmZvLmFSdmxjUHJldmlvdXNDb2RlYm9va1tibmRzXSE9SU5URU5TSVRZX0hDQjIpICkKICAgICAgICAgIHsKICAgICAgICAgICAgY29tbW9uTWluID0gRkRLbWluKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5hUnZsY1NjZkZ3ZFtibmRzXSwgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmQndkW2JuZHNdKTsKICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFTY2FsZUZhY3RvcltibmRzXSA9IEZES21pbihjb21tb25NaW4sIHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmNvbmNlYWxtZW50SW5mby5hUnZsY1ByZXZpb3VzU2NhbGVGYWN0b3JbYm5kc10pOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFTY2FsZUZhY3RvcltibmRzXSA9IEZES21pbihwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuYVJ2bGNTY2ZGd2RbYm5kc10scEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmQndkW2JuZHNdKTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgICBzdGFydEJhbmQgPSAwOyAKICAgIGlmICgoZ3JvdXArMSkgPT0gY29uY2VhbF9ncm91cF9tYXgpCiAgICAgIGVuZEJhbmQgPSBjb25jZWFsX21heDsKICB9CgogIC8qIG5vdyBjb3B5IGFsbCBkYXRhIHRvIHRoZSBvdXRwdXQgYnVmZmVyIHdoaWNoIG5lZWRzIG5vdCB0byBiZSBjb25jZWFsZWQgKi8KICBpZiAoY29uY2VhbF9ncm91cF9taW4gPT0gMCkgCiAgICBlbmRCYW5kID0gY29uY2VhbF9taW47ICAgIAogIGVsc2UgICAgICAgIAogICAgZW5kQmFuZCA9IHBSdmxjLT5tYXhTZmJUcmFuc21pdHRlZDsgICAgIAogIGZvciAoZ3JvdXA9MDsgZ3JvdXAgPD0gY29uY2VhbF9ncm91cF9taW47IGdyb3VwKyspIHsKICAgIGZvciAoYmFuZD0wOyBiYW5kIDwgZW5kQmFuZDsgYmFuZCsrKSB7CiAgICAgIGJuZHMgPSAxNipncm91cCtiYW5kOwogICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+YVNjYWxlRmFjdG9yW2JuZHNdID0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmRndkW2JuZHNdOwogICAgfQogICAgaWYgKChncm91cCsxKSA9PSBjb25jZWFsX2dyb3VwX21pbikgCiAgICAgIGVuZEJhbmQgPSBjb25jZWFsX21pbjsgICAgCiAgfQoKICBzdGFydEJhbmQgPSBjb25jZWFsX21heCsxOyAgICAKICBmb3IgKGdyb3VwPWNvbmNlYWxfZ3JvdXBfbWF4OyBncm91cCA8IHBSdmxjLT5udW1XaW5kb3dHcm91cHM7IGdyb3VwKyspIHsKICAgIGZvciAoYmFuZD1zdGFydEJhbmQ7IGJhbmQgPCBwUnZsYy0+bWF4U2ZiVHJhbnNtaXR0ZWQ7IGJhbmQrKykgewogICAgICBibmRzID0gMTYqZ3JvdXArYmFuZDsKICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFTY2FsZUZhY3RvcltibmRzXSA9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5hUnZsY1NjZkJ3ZFtibmRzXTsKICAgIH0KICAgIHN0YXJ0QmFuZCA9IDA7CiAgfQp9CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIGZ1bmN0aW9uOiAgICAgIFN0YXRpc3RpY2FsRXN0aW1hdGlvbgoKICBkZXNjcmlwdGlvbjogICBUaGlzIGFwcHJvYWNoIGJ5IG1lYW5zIG9mIHN0YXRpc3RpY2FsIGVzdGltYXRpb24gaXMgZ2VuZXJhbGx5IHBlcmZvcm1lZCB3aGVuIAogICAgICAgICAgICAgICAgIGJvdGggdGhlIHN0YXJ0IHZhbHVlIGFuZCB0aGUgZW5kIHZhbHVlIGFyZSBkaWZmZXJlbnQgYW5kIG5vIGZ1cnRoZXIgZXJyb3JzIGhhdmUgCiAgICAgICAgICAgICAgICAgYmVlbiBkZXRlY3RlZC4gQ29uc2lkZXJpbmcgdGhlIGZvcndhcmQgYW5kIGJhY2t3YXJkIGRlY29kZWQgc2NhbGVmYWN0b3JzLCB0aGUgCiAgICAgICAgICAgICAgICAgc2V0IHdpdGggdGhlIGxvd2VyIHNjYWxlZmFjdG9ycyBpbiBzdW0gd2lsbCBiZSBjb25zaWRlcmVkIGFzIHRoZSBjb3JyZWN0IG9uZS4gCiAgICAgICAgICAgICAgICAgVGhlIHNjYWxlZmFjdG9ycyBhcmUgZGlmZmVyZW50aWFsbHkgZW5jb2RlZC4gTm9ybWFsbHkgaXQgd291bGQgcmVhY2ggdG8gY29tcGFyZSAKICAgICAgICAgICAgICAgICBvbmUgcGFpciBvZiB0aGUgZm9yd2FyZCBhbmQgYmFja3dhcmQgZGVjb2RlZCBzY2FsZWZhY3RvcnMgdG8gc3BlY2lmeSB0aGUgbG93ZXIgCiAgICAgICAgICAgICAgICAgc2V0LiBCdXQgaGF2aW5nIGRldGVjdGVkIG5vIGZ1cnRoZXIgZXJyb3JzIGRvZXMgbm90IG5lY2Vzc2FyaWx5IG1lYW4gdGhlIGFic2VuY2UKICAgICAgICAgICAgICAgICBvZiBlcnJvcnMuIFRoZXJlZm9yZSBhbGwgc2NhbGVmYWN0b3JzIGRlY29kZWQgaW4gZm9yd2FyZCBhbmQgYmFja3dhcmQgZGlyZWN0aW9uIAogICAgICAgICAgICAgICAgIGFyZSBzdW1tZWQgdXAgc2VwZXJhdGVseS4gVGhlIHNldCB3aXRoIHRoZSBsb3dlciBzdW0gd2lsbCBiZSB1c2VkLiBUaGUgc3RyYXRlZ3kgCiAgICAgICAgICAgICAgICAgbXVzdCBiZSBhcHBsaWVkIHRvIHNjYWxlZmFjdG9ycywgaW50ZW5zaXR5IGRhdGEgYW5kIG5vaXNlIGVuZXJneSBzZXBlcmF0ZWx5LgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIG91dHB1dDogICAgICAgIENvbmNlYWxlZCBzY2FsZWZhY3Rvciwgbm9pc2UgZW5lcmd5IGFuZCBpbnRlbnNpdHkgZGF0YQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIHJldHVybjogICAgICAgIC0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCnZvaWQgU3RhdGlzdGljYWxFc3RpbWF0aW9uIChDQWFjRGVjb2RlckNoYW5uZWxJbmZvICpwQWFjRGVjb2RlckNoYW5uZWxJbmZvKQp7CiAgQ0VyUnZsY0luZm8gKnBSdmxjID0gJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5lclJ2bGNJbmZvOwogIGludCBiYW5kLGJuZHMsZ3JvdXA7CiAgaW50IHN1bUlzRndkLHN1bUlzQndkOyAgICAgICAgICAgIC8qIHN1bSBvZiBpbnRlbnNpdHkgZGF0YSBmb3J3YXJkL2JhY2t3YXJkICovCiAgaW50IHN1bU5yZ0Z3ZCxzdW1OcmdCd2Q7ICAgICAgICAgIC8qIHN1bSBvZiBub2lzZSBlbmVyZ3kgZGF0YSBmb3J3YXJkL2JhY2t3YXJkICovCiAgaW50IHN1bVNjZkZ3ZCxzdW1TY2ZCd2Q7ICAgICAgICAgIC8qIHN1bSBvZiBzY2FsZWZhY3RvciBkYXRhIGZvcndhcmQvYmFja3dhcmQgKi8KICBpbnQgdXNlSXNGd2QsdXNlTnJnRndkLHVzZVNjZkZ3ZDsgLyogdGhlIGZsYWdzIHNpZ25hbHMgdGhlIGVsZW1lbnRzIHdoaWNoIGFyZSB1c2VkIGZvciB0aGUgZmluYWwgcmVzdWx0ICovCiAgaW50IE1heGltdW1TY2FsZUZhY3RvckJhbmRzOwoKICBpZiAoR2V0V2luZG93U2VxdWVuY2UoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmljc0luZm8pID09IEVpZ2h0U2hvcnRTZXF1ZW5jZSkKICAgIE1heGltdW1TY2FsZUZhY3RvckJhbmRzID0gMTY7CiAgZWxzZQogICAgTWF4aW11bVNjYWxlRmFjdG9yQmFuZHMgPSA2NDsKCiAgc3VtSXNGd2QgPSBzdW1Jc0J3ZCA9IHN1bU5yZ0Z3ZCA9IHN1bU5yZ0J3ZCA9IHN1bVNjZkZ3ZCA9IHN1bVNjZkJ3ZCA9IDA7CiAgdXNlSXNGd2QgPSB1c2VOcmdGd2QgPSB1c2VTY2ZGd2QgPSAwOwoKICAvKiBjYWxjdWxhdGUgc3VtIG9mIGVhY2ggZ3JvdXAgKHNjZixucmcsaXMpIG9mIGZvcndhcmQgYW5kIGJhY2t3YXJkIGRpcmVjdGlvbiAqLwogIGZvciAoZ3JvdXA9MDsgZ3JvdXA8cFJ2bGMtPm51bVdpbmRvd0dyb3VwczsgZ3JvdXArKykgewogICAgZm9yIChiYW5kPTA7IGJhbmQgPCBwUnZsYy0+bWF4U2ZiVHJhbnNtaXR0ZWQ7IGJhbmQrKykgewogICAgICBibmRzID0gMTYqZ3JvdXArYmFuZDsKICAgICAgc3dpdGNoIChwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+YUNvZGVCb29rW2JuZHNdKSB7CiAgICAgICAgY2FzZSBaRVJPX0hDQjoKICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIElOVEVOU0lUWV9IQ0I6CiAgICAgICAgY2FzZSBJTlRFTlNJVFlfSENCMjoKICAgICAgICAgIHN1bUlzRndkICs9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5hUnZsY1NjZkZ3ZFtibmRzXTsKICAgICAgICAgIHN1bUlzQndkICs9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5hUnZsY1NjZkJ3ZFtibmRzXTsKICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIE5PSVNFX0hDQjoKICAgICAgICAgIHN1bU5yZ0Z3ZCArPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuYVJ2bGNTY2ZGd2RbYm5kc107CiAgICAgICAgICBzdW1OcmdCd2QgKz0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmQndkW2JuZHNdOwogICAgICAgICAgYnJlYWsgOwoKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgc3VtU2NmRndkICs9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5hUnZsY1NjZkZ3ZFtibmRzXTsKICAgICAgICAgIHN1bVNjZkJ3ZCArPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuYVJ2bGNTY2ZCd2RbYm5kc107CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogIH0KCiAgLyogZmluZCBmb3IgZWFjaCBncm91cCAoc2NmLG5yZyxpcykgdGhlIGNvcnJlY3QgZGlyZWN0aW9uICovCiAgaWYgKCBzdW1Jc0Z3ZCA8IHN1bUlzQndkICkKICAgIHVzZUlzRndkID0gMTsKCiAgaWYgKCBzdW1OcmdGd2QgPCBzdW1OcmdCd2QgKQogICAgdXNlTnJnRndkID0gMTsKCiAgaWYgKCBzdW1TY2ZGd2QgPCBzdW1TY2ZCd2QgKQogICAgdXNlU2NmRndkID0gMTsKCiAgLyogY29uY2VhbCBlYWNoIGdyb3VwIChzY2YsbnJnLGlzKSAqLwogIGZvciAoZ3JvdXA9MDsgZ3JvdXA8cFJ2bGMtPm51bVdpbmRvd0dyb3VwczsgZ3JvdXArKykgewogICAgZm9yIChiYW5kPTA7IGJhbmQgPCBwUnZsYy0+bWF4U2ZiVHJhbnNtaXR0ZWQ7IGJhbmQrKykgewogICAgICBibmRzID0gMTYqZ3JvdXArYmFuZDsKICAgICAgc3dpdGNoIChwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+YUNvZGVCb29rW2JuZHNdKSB7CiAgICAgICAgY2FzZSBaRVJPX0hDQjoKICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIElOVEVOU0lUWV9IQ0I6CiAgICAgICAgY2FzZSBJTlRFTlNJVFlfSENCMjoKICAgICAgICAgIGlmICh1c2VJc0Z3ZCkKICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFTY2FsZUZhY3RvcltibmRzXSA9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5hUnZsY1NjZkZ3ZFtibmRzXTsKICAgICAgICAgIGVsc2UKICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFTY2FsZUZhY3RvcltibmRzXSA9IHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5hUnZsY1NjZkJ3ZFtibmRzXTsKICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIE5PSVNFX0hDQjoKICAgICAgICAgIGlmICh1c2VOcmdGd2QpCiAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5hU2NhbGVGYWN0b3JbYm5kc10gPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuYVJ2bGNTY2ZGd2RbYm5kc107CiAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5hU2NhbGVGYWN0b3JbYm5kc10gPSBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuYVJ2bGNTY2ZCd2RbYm5kc107CiAgICAgICAgICBicmVhayA7CgogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICBpZiAodXNlU2NmRndkKQogICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+YVNjYWxlRmFjdG9yW2JuZHNdID0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmRndkW2JuZHNdOwogICAgICAgICAgZWxzZQogICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+YVNjYWxlRmFjdG9yW2JuZHNdID0gcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmQndkW2JuZHNdOwogICAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICB9Cn0KCgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIGRlc2NyaXB0aW9uOiAgIEFwcHJvYWNoIGJ5IG1lYW5zIG9mIHByZWRpY3RpdmUgaW50ZXJwb2xhdGlvbgogICAgICAgICAgICAgICAgIFRoaXMgYXBwcm9hY2ggYnkgbWVhbnMgb2YgcHJlZGljdGl2ZSBlc3RpbWF0aW9uIGlzIGdlbmVyYWxseSBwZXJmb3JtZWQgd2hlbiAKICAgICAgICAgICAgICAgICB0aGUgZXJyb3IgY2Fubm90IGJlIGlzb2xhdGVkIGJldHdlZW4gJ2NvbmNlYWxfbWluJyBhbmQgJ2NvbmNlYWxfbWF4JywgdGhlIAogICAgICAgICAgICAgICAgICdzZl9jb25jZWFsbWVudCcgZmxhZyBpcyBzZXQgYW5kIHRoZSBwcmV2aW91cyBmcmFtZSBoYXMgdGhlIHNhbWUgYmxvY2sgdHlwZSAKICAgICAgICAgICAgICAgICBhcyB0aGUgY3VycmVudCBmcmFtZS4gQ2hlY2sgZm9yIGVhY2ggc2NhbGVmYWN0b3JiYW5kIGlmIHRoZSBzYW1lIHR5cGUgb2YgZGF0YSAKICAgICAgICAgICAgICAgICAoc2NhbGVmYWN0b3IsIGludGVybnNpdHkgZGF0YSwgbm9pc2UgZW5lcmdpZXMpIGlzIHRyYW5zbWl0dGVkLiBJZiBzbyB1c2UgdGhlIAogICAgICAgICAgICAgICAgIHNjYWxlZmFjdG9yIChpbnRlbnNpdHkgZGF0YSwgbm9pc2UgZW5lcmd5KSBpbiB0aGUgY3VycmVudCBmcmFtZS4gT3RoZXJ3aXNlIHNldCAKICAgICAgICAgICAgICAgICB0aGUgc2NhbGVmYWN0b3IgKGludGVuc2l0eSBkYXRhLCBub2lzZSBlbmVyZ3kpIGZvciB0aGlzIHNjYWxlZmFjdG9yYmFuZCB0byB6ZXJvLgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIG91dHB1dDogICAgICAgIENvbmNlYWxlZCBzY2FsZWZhY3Rvciwgbm9pc2UgZW5lcmd5IGFuZCBpbnRlbnNpdHkgZGF0YQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIHJldHVybjogICAgICAgIC0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCnZvaWQgUHJlZGljdGl2ZUludGVycG9sYXRpb24gKAogICAgICAgIENBYWNEZWNvZGVyQ2hhbm5lbEluZm8gKnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8sCiAgICAgICAgQ0FhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbyAqcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mbwogICAgICAgICkKewogIENFclJ2bGNJbmZvICpwUnZsYyA9ICZwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuZXJSdmxjSW5mbzsKICBpbnQgYmFuZCxibmRzLGdyb3VwOwogIGludCBNYXhpbXVtU2NhbGVGYWN0b3JCYW5kczsKICBpbnQgY29tbW9uTWluOwoKICBpZiAoR2V0V2luZG93U2VxdWVuY2UoJnBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPmljc0luZm8pID09IEVpZ2h0U2hvcnRTZXF1ZW5jZSkKICAgIE1heGltdW1TY2FsZUZhY3RvckJhbmRzID0gMTY7CiAgZWxzZQogICAgTWF4aW11bVNjYWxlRmFjdG9yQmFuZHMgPSA2NDsKCiAgZm9yIChncm91cD0wOyBncm91cDxwUnZsYy0+bnVtV2luZG93R3JvdXBzOyBncm91cCsrKSB7CiAgICBmb3IgKGJhbmQ9MDsgYmFuZCA8IHBSdmxjLT5tYXhTZmJUcmFuc21pdHRlZDsgYmFuZCsrKSB7CiAgICAgIGJuZHMgPSAxNipncm91cCtiYW5kOwogICAgICBzd2l0Y2ggKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5hQ29kZUJvb2tbYm5kc10pIHsKICAgICAgICBjYXNlIFpFUk9fSENCOgogICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFTY2FsZUZhY3RvcltibmRzXSA9IDA7CiAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBJTlRFTlNJVFlfSENCOgogICAgICAgIGNhc2UgSU5URU5TSVRZX0hDQjI6CiAgICAgICAgICBpZiAoIChwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5jb25jZWFsbWVudEluZm8uYVJ2bGNQcmV2aW91c0NvZGVib29rW2JuZHNdPT1JTlRFTlNJVFlfSENCKSB8fCAocEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+Y29uY2VhbG1lbnRJbmZvLmFSdmxjUHJldmlvdXNDb2RlYm9va1tibmRzXT09SU5URU5TSVRZX0hDQjIpICkgewogICAgICAgICAgICBjb21tb25NaW4gPSBGREttaW4ocEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmRndkW2JuZHNdLHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5hUnZsY1NjZkJ3ZFtibmRzXSk7CiAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5hU2NhbGVGYWN0b3JbYm5kc10gPSBGREttaW4oY29tbW9uTWluLCBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5jb25jZWFsbWVudEluZm8uYVJ2bGNQcmV2aW91c1NjYWxlRmFjdG9yW2JuZHNdKTsKICAgICAgICAgIH0KICAgICAgICAgIGVsc2UgewogICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+YVNjYWxlRmFjdG9yW2JuZHNdID0gLTExMDsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIE5PSVNFX0hDQjoKICAgICAgICAgIGlmICggcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+Y29uY2VhbG1lbnRJbmZvLmFSdmxjUHJldmlvdXNDb2RlYm9va1tibmRzXT09Tk9JU0VfSENCICkgewogICAgICAgICAgICBjb21tb25NaW4gPSBGREttaW4ocEFhY0RlY29kZXJDaGFubmVsSW5mby0+cENvbURhdGEtPm92ZXJsYXkuYWFjLmFSdmxjU2NmRndkW2JuZHNdLHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5hUnZsY1NjZkJ3ZFtibmRzXSk7CiAgICAgICAgICAgIHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBEeW5EYXRhLT5hU2NhbGVGYWN0b3JbYm5kc10gPSBGREttaW4oY29tbW9uTWluLCBwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5jb25jZWFsbWVudEluZm8uYVJ2bGNQcmV2aW91c1NjYWxlRmFjdG9yW2JuZHNdKTsKICAgICAgICAgIH0KICAgICAgICAgIGVsc2UgewogICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+YVNjYWxlRmFjdG9yW2JuZHNdID0gLTExMDsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwoKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgaWYgKCAgIChwQWFjRGVjb2RlclN0YXRpY0NoYW5uZWxJbmZvLT5jb25jZWFsbWVudEluZm8uYVJ2bGNQcmV2aW91c0NvZGVib29rW2JuZHNdIT1aRVJPX0hDQikKICAgICAgICAgICAgICAmJiAocEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+Y29uY2VhbG1lbnRJbmZvLmFSdmxjUHJldmlvdXNDb2RlYm9va1tibmRzXSE9Tk9JU0VfSENCKSAKICAgICAgICAgICAgICAmJiAocEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+Y29uY2VhbG1lbnRJbmZvLmFSdmxjUHJldmlvdXNDb2RlYm9va1tibmRzXSE9SU5URU5TSVRZX0hDQikgCiAgICAgICAgICAgICAgJiYgKHBBYWNEZWNvZGVyU3RhdGljQ2hhbm5lbEluZm8tPmNvbmNlYWxtZW50SW5mby5hUnZsY1ByZXZpb3VzQ29kZWJvb2tbYm5kc10hPUlOVEVOU0lUWV9IQ0IyKSApIHsKICAgICAgICAgICAgY29tbW9uTWluID0gRkRLbWluKHBBYWNEZWNvZGVyQ2hhbm5lbEluZm8tPnBDb21EYXRhLT5vdmVybGF5LmFhYy5hUnZsY1NjZkZ3ZFtibmRzXSxwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wQ29tRGF0YS0+b3ZlcmxheS5hYWMuYVJ2bGNTY2ZCd2RbYm5kc10pOwogICAgICAgICAgICBwQWFjRGVjb2RlckNoYW5uZWxJbmZvLT5wRHluRGF0YS0+YVNjYWxlRmFjdG9yW2JuZHNdID0gRkRLbWluKGNvbW1vbk1pbiwgcEFhY0RlY29kZXJTdGF0aWNDaGFubmVsSW5mby0+Y29uY2VhbG1lbnRJbmZvLmFSdmxjUHJldmlvdXNTY2FsZUZhY3RvcltibmRzXSk7CiAgICAgICAgICB9CiAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcEFhY0RlY29kZXJDaGFubmVsSW5mby0+cER5bkRhdGEtPmFTY2FsZUZhY3RvcltibmRzXSA9IDA7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogIH0KfQoK