Ci8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAoKqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEyIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAxLiAgICBJTlRST0RVQ1RJT04KVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwp0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCgpBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQppbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydApvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KClBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwppbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCnRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCnRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwpzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCgpDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAphcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCgoyLiAgICBDT1BZUklHSFQgTElDRU5TRQoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CnBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKCllvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCnlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCgpZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCllvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgoKVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dApwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCgpZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCnNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgoKWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCiJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCgozLiAgICBOTyBQQVRFTlQgTElDRU5TRQoKTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCkFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCnJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KCllvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZApieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCgo0LiAgICBESVNDTEFJTUVSCgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwpvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgpDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCmluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCm9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCmFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgoKNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgoKRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCkF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCkFtIFdvbGZzbWFudGVsIDMzCjkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Cgp3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCmFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqICBGcmF1bmhvZmVyIElJUyBGREsgVG9vbHMgICoqKioqKioqKioqKioqKioqKioqKioqCgogICBBdXRob3Iocyk6IEFuZHJlYXMgRWhyZXQKICAgRGVzY3JpcHRpb246IFNCUiBlbmNvZGVyIHRvcCBsZXZlbCBwcm9jZXNzaW5nLgoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKI2luY2x1ZGUgInNicl9lbmNvZGVyLmgiCgojaW5jbHVkZSAic2JyX3JhbS5oIgojaW5jbHVkZSAic2JyX3JvbS5oIgojaW5jbHVkZSAic2JyZW5jX2ZyZXFfc2NhLmgiCiNpbmNsdWRlICJlbnZfYml0LmgiCiNpbmNsdWRlICJjbW9uZGF0YS5oIgojaW5jbHVkZSAic2JyX21pc2MuaCIKI2luY2x1ZGUgInNici5oIgojaW5jbHVkZSAicW1mLmgiCgojaW5jbHVkZSAicHNfbWFpbi5oIgoKI2RlZmluZSBTQlJFTkNPREVSX0xJQl9WTDAgMwojZGVmaW5lIFNCUkVOQ09ERVJfTElCX1ZMMSAyCiNkZWZpbmUgU0JSRU5DT0RFUl9MSUJfVkwyIDEKCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoKICogU0JSIERlbGF5IGJhbGFuY2luZyBkZWZpbml0aW9ucy4KICovCgovKgogICAgICBpbnB1dCBidWZmZXIgKDFjaCkKCiAgICAgIHwtLS0tLS0tLS0tLS0gMTUzNyAgIC0tLS0tLS0tLS0tLS18LS0tLS18LS0tLS0tLS0tLSAyMDQ4IC0tLS0tLS0tLS0tLS18CiAgICAgICAgICAgKGNvcmUyc2JyIGRlbGF5ICAgICApICAgICAgICAgIGRzICAgICAocmVhZCwgY29yZSBhbmQgZHMgYXJlYSkKKi8KCiNkZWZpbmUgRE9XTl9TTVBMX0ZBQyAgICAgICAgKDIpCgojZGVmaW5lIFNGTChmbCkgICAgICAgICAgICAoZmwqRE9XTl9TTVBMX0ZBQykgICAvKiBTQlIgZnJhbWUgbGVuZ3RoIChoYXJkY29kZWQgdG8gZG93bnNhbXBsZSBmYWN0b3Igb2YgMikgKi8KI2RlZmluZSBTVFMoZmwpICAgICAgICAgICAgKFNGTChmbCkvNjQpICAvKiBTQlIgVGltZSBTbG90cyAqLwoKI2RlZmluZSBERUxBWV9RTUZfQU5BICAgICAgKDY0MCAtIDY0KSAgICAvKiBGdWxsIGJhbmR3aWR0aCAqLwojZGVmaW5lIERFTEFZX1FNRl9BTkFFTEQgICAoMzIpCiNkZWZpbmUgREVMQVlfSFlCX0FOQSAgICAgICgxMCo2NCkgICAgICAgLyogKyAwLjUgKi8KI2RlZmluZSBERUxBWV9IWUJfU1lOICAgICAgKDYqNjQgLSAzMikKI2RlZmluZSBERUxBWV9RTUZfU1lORUxEICAgKDMyKQojZGVmaW5lIERFTEFZX0RFQ19RTUYgICAgICAoNio2NCkgICAgICAgIC8qIERlY29kZXIgUU1GIG92ZXJsYXAgKi8KI2RlZmluZSBERUxBWV9RTUZfU1lOICAgICAgKDIpICAgICAgICAgICAvKiBOT19QT0xZLzIgKi8KI2RlZmluZSBERUxBWV9RTUZfRFMgICAgICAgKDMyKSAgICAgICAgICAvKiBRTUYgc3ludGhlc2lzIGZvciBkb3duc2FtcGxlZCB0aW1lIHNpZ25hbCAqLwoKLyogRGVsYXkgaW4gUU1GIHBhdGhzICovCiNkZWZpbmUgREVMQVlfU0JSKGZsKSAgICAgIChERUxBWV9RTUZfQU5BICsgKDY0KlNUUyhmbCktMSkgKyBERUxBWV9RTUZfU1lOKQojZGVmaW5lIERFTEFZX1BTKGZsKSAgICAgICAoREVMQVlfUU1GX0FOQSArIERFTEFZX0hZQl9BTkEgKyBERUxBWV9ERUNfUU1GICsgKDY0KlNUUyhmbCktMSkgKyBERUxBWV9IWUJfU1lOICsgREVMQVlfUU1GX1NZTikKI2RlZmluZSBERUxBWV9FTERTQlIoZmwpICAgKERFTEFZX1FNRl9BTkFFTEQgKyAoKChmbCkrKChmbCkvMikpKjIgLSAxKSArIERFTEFZX1FNRl9TWU5FTEQpCgovKiBEZWxheSBkaWZmZXJlbmNlcyBmb3IgU0JSIGFuZCBTQlIrUFMgKi8KICAgICNkZWZpbmUgTUFYX0RTX0ZJTFRFUl9ERUxBWSAoMzQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGUgYWRkaXRpb25hbCBtYXggZG93bnNhbXBsZXIgZmlsdGVyIGRlbGF5IChzb3VyY2UgZnMpICovCiNkZWZpbmUgREVMQVlfQUFDMlNCUihmbCkgICAgICAoKC8qUkVTQU1QTEVSICsqLyAvKihERUxBWV9BQUMoZmwpKjIpICsgKi8gREVMQVlfUU1GX0FOQSArIERFTEFZX0RFQ19RTUYgKyBERUxBWV9RTUZfU1lOKSAtIERFTEFZX1NCUihmbCkpIC8qIDE1MzcgKi8KI2RlZmluZSBERUxBWV9FTEQyU0JSKGZsKSAgICAgICgoLypSRVNBTVBMRVIgKyovIC8qKERFTEFZX0VMRChmbCkqMikgKyAqLyBERUxBWV9RTUZfQU5BRUxEICsgREVMQVlfUU1GX1NZTkVMRCkgLSBERUxBWV9FTERTQlIoZmwpKQoKI2RlZmluZSBERUxBWV9BQUMyUFMoZmwpICAgICAgICgoREVMQVlfUU1GX0FOQSArIERFTEFZX1FNRl9EUyArIC8qKERFTEFZX0FBQyhmbCkqMikqLyArIERFTEFZX1FNRl9BTkEgKyBERUxBWV9ERUNfUU1GICsgREVMQVlfSFlCX1NZTiArIERFTEFZX1FNRl9TWU4pIC0gREVMQVlfUFMoZmwpKSAvKiAyMDQ4IC0gNDYzKjIgKi8KCi8qIEFzc3VtcHRpb246IHRoYXQgdGhlIHNhbXBsZSBkZWxheSByZXN1bHRpbmcgb2Ygb2YgREVMQVlfQUFDMlBTIGlzIGFsd2F5cyBzbWFsbGVyIHRoYW4gdGhlIHNhbXBsZSBkZWxheSBpbXBsaWVkIGJ5IERFTEFZX0FBQzJTQlIgKi8KI2RlZmluZSBNQVhfU0FNUExFX0RFTEFZICAgICAgIChERUxBWV9BQUMyU0JSKDEwMjQpICsgTUFYX0RTX0ZJTFRFUl9ERUxBWSkKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgoKCiNkZWZpbmUgSU5WQUxJRF9UQUJMRV9JRFggLTEKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qIQoKICBcYnJpZWYgIFNlbGVjdHMgdGhlIFNCUiB0dW5pbmcgc2V0dGluZ3MgdG8gdXNlIGRlcGVuZGVudCBvbiBudW1iZXIgb2YKICAgICAgICAgIGNoYW5uZWxzLCBiaXRyYXRlLCBzYW1wbGUgcmF0ZSBhbmQgY29yZSBjb2RlcgoKICBccmV0dXJuIEluZGV4IHRvIHRoZSBhcHByb3ByaWF0ZSB0YWJsZQoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KI2RlZmluZSBESVNUQU5DRV9DRUlMX1ZBTFVFIDUwMDAwMDAKc3RhdGljIElOVApnZXRTYnJUdW5pbmdUYWJsZUluZGV4KFVJTlQgYml0cmF0ZSwgICAgLyohIHRoZSB0b3RhbCBiaXRyYXRlIGluIGJpdHMvc2VjICovCiAgICAgICAgICAgICAgICAgICAgICAgVUlOVCBudW1DaGFubmVscywvKiEgdGhlIG51bWJlciBvZiBjaGFubmVscyBmb3IgdGhlIGNvcmUgY29kZXIgKi8KICAgICAgICAgICAgICAgICAgICAgICBVSU5UIHNhbXBsZVJhdGUsICAvKiEgdGhlIHNhbXBsaW5nIHJhdGUgb2YgdGhlIGNvcmUgY29kZXIgKi8KICAgICAgICAgICAgICAgICAgICAgICBBVURJT19PQkpFQ1RfVFlQRSBjb3JlLAogICAgICAgICAgICAgICAgICAgICAgIFVJTlQgKnBCaXRSYXRlQ2xvc2VzdAogICAgICAgICAgICAgICAgICAgICAgICkKewogIGludCBpLCBwYXJhbVNldFRvcCwgYml0UmF0ZUNsb3Nlc3RMb3dlckluZGV4PS0xLCBiaXRSYXRlQ2xvc2VzdFVwcGVySW5kZXg9LTEsIGZvdW5kID0gMDsKICBVSU5UIGJpdFJhdGVDbG9zZXN0VXBwZXIgPSAwLCBiaXRSYXRlQ2xvc2VzdExvd2VyPURJU1RBTkNFX0NFSUxfVkFMVUU7CgogIEZES19BU1NFUlQoU0JSRU5DX1RVTklOR19TSVpFID09IHNpemVvZihzYnJUdW5pbmdUYWJsZSkvc2l6ZW9mKHNiclR1bmluZ1RhYmxlWzBdKSk7CgogIGlmIChjb3JlID09IEFPVF9FUl9BQUNfRUxEKSB7CiAgICBwYXJhbVNldFRvcCA9IFNCUkVOQ19UVU5JTkdfU0laRTsKICAgIGkgPSBTQlJFTkNfQUFDTENfVFVOSU5HX1NJWkU7CiAgfSBlbHNlIHsKICAgIHBhcmFtU2V0VG9wID0gU0JSRU5DX0FBQ0xDX1RVTklOR19TSVpFOwogICAgaSA9IDA7CiAgfQoKICBmb3IgKDsgaSA8IHBhcmFtU2V0VG9wIDsgaSsrKSB7CiAgICBpZiAoIG51bUNoYW5uZWxzID09IHNiclR1bmluZ1RhYmxlIFtpXS5udW1DaGFubmVscwogICAgICAmJiBzYW1wbGVSYXRlID09IHNiclR1bmluZ1RhYmxlIFtpXS5zYW1wbGVSYXRlICkKICAgIHsKICAgICAgZm91bmQgPSAxOwogICAgICBpZiAoKGJpdHJhdGUgPj0gc2JyVHVuaW5nVGFibGUgW2ldLmJpdHJhdGVGcm9tKSAmJgogICAgICAgICAgKGJpdHJhdGUgPCBzYnJUdW5pbmdUYWJsZSBbaV0uYml0cmF0ZVRvKSkgewogICAgICAgICAgICBiaXRSYXRlQ2xvc2VzdExvd2VyID0gYml0cmF0ZTsKICAgICAgICAgICAgYml0UmF0ZUNsb3Nlc3RVcHBlciA9IGJpdHJhdGU7CiAgICAgICAgICAgIC8vRkRLcHJpbnRmKCJlbnRyeSAlZFxuIiwgaSk7CiAgICAgICAgcmV0dXJuIGkgOwogICAgICB9IGVsc2UgewogICAgICAgIGlmICggc2JyVHVuaW5nVGFibGUgW2ldLmJpdHJhdGVGcm9tID4gYml0cmF0ZSApIHsKICAgICAgICAgIGlmIChzYnJUdW5pbmdUYWJsZSBbaV0uYml0cmF0ZUZyb20gPCBiaXRSYXRlQ2xvc2VzdExvd2VyKSB7CiAgICAgICAgICAgIGJpdFJhdGVDbG9zZXN0TG93ZXIgPSBzYnJUdW5pbmdUYWJsZSBbaV0uYml0cmF0ZUZyb207CiAgICAgICAgICAgIGJpdFJhdGVDbG9zZXN0TG93ZXJJbmRleCA9IGk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICggc2JyVHVuaW5nVGFibGUgW2ldLmJpdHJhdGVUbyA8PSBiaXRyYXRlICkgewogICAgICAgICAgaWYgKHNiclR1bmluZ1RhYmxlIFtpXS5iaXRyYXRlVG8gPiBiaXRSYXRlQ2xvc2VzdFVwcGVyKSB7CiAgICAgICAgICAgIGJpdFJhdGVDbG9zZXN0VXBwZXIgPSBzYnJUdW5pbmdUYWJsZSBbaV0uYml0cmF0ZVRvLTE7CiAgICAgICAgICAgIGJpdFJhdGVDbG9zZXN0VXBwZXJJbmRleCA9IGk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICBpZiAocEJpdFJhdGVDbG9zZXN0ICE9IE5VTEwpCiAgewogICAgLyogSXMgdGhlcmUgd2FzIGF0IGxlYXN0IG9uZSBtYXRjaGluZyB0dW5pbmcgZW50cnkgZm91bmQgdGhlbiBwaWNrIHRoZSBsZWFzdCBkaXN0YW5jZSBiaXQgcmF0ZSAqLwogICAgaWYgKGZvdW5kKQogICAgewogICAgICBpbnQgZGlzdGFuY2VVcHBlcj1ESVNUQU5DRV9DRUlMX1ZBTFVFLCBkaXN0YW5jZUxvd2VyPURJU1RBTkNFX0NFSUxfVkFMVUU7CiAgICAgIGlmIChiaXRSYXRlQ2xvc2VzdExvd2VySW5kZXggPj0gMCkgewogICAgICAgIGRpc3RhbmNlTG93ZXIgPSBzYnJUdW5pbmdUYWJsZSBbYml0UmF0ZUNsb3Nlc3RMb3dlckluZGV4XS5iaXRyYXRlRnJvbSAtIGJpdHJhdGU7CiAgICAgIH0KICAgICAgaWYgKGJpdFJhdGVDbG9zZXN0VXBwZXJJbmRleCA+PSAwKSB7CiAgICAgICAgZGlzdGFuY2VVcHBlciA9IGJpdHJhdGUgLSBzYnJUdW5pbmdUYWJsZSBbYml0UmF0ZUNsb3Nlc3RVcHBlckluZGV4XS5iaXRyYXRlVG87CiAgICAgIH0KICAgICAgaWYgKCBkaXN0YW5jZVVwcGVyIDwgZGlzdGFuY2VMb3dlciApCiAgICAgIHsKICAgICAgICAqcEJpdFJhdGVDbG9zZXN0ID0gYml0UmF0ZUNsb3Nlc3RVcHBlcjsKICAgICAgfSBlbHNlIHsKICAgICAgICAqcEJpdFJhdGVDbG9zZXN0ID0gYml0UmF0ZUNsb3Nlc3RMb3dlcjsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgKnBCaXRSYXRlQ2xvc2VzdCA9IDA7CiAgICB9CiAgfQoKICByZXR1cm4gSU5WQUxJRF9UQUJMRV9JRFg7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qIQoKICBcYnJpZWYgIFNlbGVjdHMgdGhlIFBTIHR1bmluZyBzZXR0aW5ncyB0byB1c2UgZGVwZW5kZW50IG9uIGJpdHJhdGUKICBhbmQgY29yZSBjb2RlcgoKICBccmV0dXJuIEluZGV4IHRvIHRoZSBhcHByb3ByaWF0ZSB0YWJsZQoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIElOVApnZXRQc1R1bmluZ1RhYmxlSW5kZXgoVUlOVCBiaXRyYXRlLCBVSU5UICpwQml0UmF0ZUNsb3Nlc3QpewoKICBJTlQgaSwgcGFyYW1TZXRzID0gc2l6ZW9mIChwc1R1bmluZ1RhYmxlKSAvIHNpemVvZiAocHNUdW5pbmdUYWJsZSBbMF0pOwogIGludCBiaXRSYXRlQ2xvc2VzdExvd2VySW5kZXg9LTEsIGJpdFJhdGVDbG9zZXN0VXBwZXJJbmRleD0tMTsKICBVSU5UIGJpdFJhdGVDbG9zZXN0VXBwZXIgPSAwLCBiaXRSYXRlQ2xvc2VzdExvd2VyPURJU1RBTkNFX0NFSUxfVkFMVUU7CgogIGZvciAoaSA9IDAgOyBpIDwgcGFyYW1TZXRzIDsgaSsrKSAgewogICAgaWYgKChiaXRyYXRlID49IHBzVHVuaW5nVGFibGUgW2ldLmJpdHJhdGVGcm9tKSAmJgogICAgICAgIChiaXRyYXRlIDwgcHNUdW5pbmdUYWJsZSBbaV0uYml0cmF0ZVRvKSkgewogICAgICByZXR1cm4gaSA7CiAgICB9IGVsc2UgewogICAgICBpZiAoIHBzVHVuaW5nVGFibGUgW2ldLmJpdHJhdGVGcm9tID4gYml0cmF0ZSApIHsKICAgICAgICBpZiAocHNUdW5pbmdUYWJsZSBbaV0uYml0cmF0ZUZyb20gPCBiaXRSYXRlQ2xvc2VzdExvd2VyKSB7CiAgICAgICAgICBiaXRSYXRlQ2xvc2VzdExvd2VyID0gcHNUdW5pbmdUYWJsZSBbaV0uYml0cmF0ZUZyb207CiAgICAgICAgICBiaXRSYXRlQ2xvc2VzdExvd2VySW5kZXggPSBpOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoIHBzVHVuaW5nVGFibGUgW2ldLmJpdHJhdGVUbyA8PSBiaXRyYXRlICkgewogICAgICAgIGlmIChwc1R1bmluZ1RhYmxlIFtpXS5iaXRyYXRlVG8gPiBiaXRSYXRlQ2xvc2VzdFVwcGVyKSB7CiAgICAgICAgICBiaXRSYXRlQ2xvc2VzdFVwcGVyID0gcHNUdW5pbmdUYWJsZSBbaV0uYml0cmF0ZVRvLTE7CiAgICAgICAgICBiaXRSYXRlQ2xvc2VzdFVwcGVySW5kZXggPSBpOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KCiAgaWYgKHBCaXRSYXRlQ2xvc2VzdCAhPSBOVUxMKQogIHsKICAgIGludCBkaXN0YW5jZVVwcGVyPURJU1RBTkNFX0NFSUxfVkFMVUUsIGRpc3RhbmNlTG93ZXI9RElTVEFOQ0VfQ0VJTF9WQUxVRTsKICAgIGlmIChiaXRSYXRlQ2xvc2VzdExvd2VySW5kZXggPj0gMCkgewogICAgICBkaXN0YW5jZUxvd2VyID0gc2JyVHVuaW5nVGFibGUgW2JpdFJhdGVDbG9zZXN0TG93ZXJJbmRleF0uYml0cmF0ZUZyb20gLSBiaXRyYXRlOwogICAgfQogICAgaWYgKGJpdFJhdGVDbG9zZXN0VXBwZXJJbmRleCA+PSAwKSB7CiAgICAgIGRpc3RhbmNlVXBwZXIgPSBiaXRyYXRlIC0gc2JyVHVuaW5nVGFibGUgW2JpdFJhdGVDbG9zZXN0VXBwZXJJbmRleF0uYml0cmF0ZVRvOwogICAgfQogICAgaWYgKCBkaXN0YW5jZVVwcGVyIDwgZGlzdGFuY2VMb3dlciApCiAgICB7CiAgICAgICpwQml0UmF0ZUNsb3Nlc3QgPSBiaXRSYXRlQ2xvc2VzdFVwcGVyOwogICAgfSBlbHNlIHsKICAgICAgKnBCaXRSYXRlQ2xvc2VzdCA9IGJpdFJhdGVDbG9zZXN0TG93ZXI7CiAgICB9CiAgfQoKICByZXR1cm4gSU5WQUxJRF9UQUJMRV9JRFg7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiEKCiAgXGJyaWVmICB0ZWxscyB1cywgaWYgZm9yIHRoZSBnaXZlbiBjb3JlQ29kZXIsIGJpdHJhdGUsIG51bWJlciBvZiBjaGFubmVscwogICAgICAgICAgYW5kIGlucHV0IHNhbXBsaW5nIHJhdGUgYW4gU0JSIHNldHRpbmcgaXMgYXZhaWxhYmxlLiBJZiB5ZXMsIGl0CiAgICAgICAgICB0ZWxscyB1cyBhbHNvIHRoZSBjb3JlIHNhbXBsaW5nIHJhdGUgd2Ugd291bGQgbmVlZCB0byBydW4gd2l0aAoKICBccmV0dXJuIGEgZmxhZyBpbmRpY2F0aW5nIHN1Y2Nlc3M6IHllcyAoMSkgb3Igbm8gKDApCgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgVUlOVApGREtzYnJFbmNfSXNTYnJTZXR0aW5nQXZhaWwgKFVJTlQgYml0cmF0ZSwgICAgICAgICAgLyohIHRoZSB0b3RhbCBiaXRyYXRlIGluIGJpdHMvc2VjICovCiAgICAgICAgICAgICAgICAgICBVSU5UIHZick1vZGUsICAgICAgICAgIC8qISB0aGUgdmJyIHBhcmFtdGVyLCAwIG1lYW5zIGNvbnN0YW50IGJpdHJhdGUgKi8KICAgICAgICAgICAgICAgICAgIFVJTlQgbnVtT3V0cHV0Q2hhbm5lbHMsLyohIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgZm9yIHRoZSBjb3JlIGNvZGVyICovCiAgICAgICAgICAgICAgICAgICBVSU5UIHNhbXBsZVJhdGVJbnB1dCwgICAvKiEgdGhlIGlucHV0IHNhbXBsZSByYXRlIFtpbiBIel0gKi8KICAgICAgICAgICAgICAgICAgIEFVRElPX09CSkVDVF9UWVBFIGNvcmUKICAgICAgICAgICAgICAgICAgICkKewogIElOVCBpZHggPSBJTlZBTElEX1RBQkxFX0lEWDsKICBVSU5UIHNhbXBsZVJhdGVDb3JlOwoKICBpZiAoc2FtcGxlUmF0ZUlucHV0IDwgMTYwMDApCiAgICByZXR1cm4gMDsKCiAgaWYgKGJpdHJhdGU9PTApIHsKICAgIC8qIG1hcCB2YnIgcXVhbGl0eSB0byBiaXRyYXRlICovCiAgICBpZiAodmJyTW9kZSA8IDMwKQogICAgICBiaXRyYXRlID0gMjQwMDA7CiAgICBlbHNlIGlmICh2YnJNb2RlIDwgNDApCiAgICAgIGJpdHJhdGUgPSAyODAwMDsKICAgIGVsc2UgaWYgKHZick1vZGUgPCA2MCkKICAgICAgYml0cmF0ZSA9IDMyMDAwOwogICAgZWxzZSBpZiAodmJyTW9kZSA8IDc1KQogICAgICBiaXRyYXRlID0gNDAwMDA7CiAgICBlbHNlCiAgICAgIGJpdHJhdGUgPSA0ODAwMDsKICAgIGJpdHJhdGUgKj0gbnVtT3V0cHV0Q2hhbm5lbHM7CiAgfQoKICAvKiB0cnkgRE9XTl9TTVBMX0ZBQyBvZiB0aGUgaW5wdXQgc2FtcGxpbmcgcmF0ZSAqLwogIHNhbXBsZVJhdGVDb3JlID0gc2FtcGxlUmF0ZUlucHV0L0RPV05fU01QTF9GQUM7CiAgaWR4ID0gZ2V0U2JyVHVuaW5nVGFibGVJbmRleChiaXRyYXRlLCBudW1PdXRwdXRDaGFubmVscywgc2FtcGxlUmF0ZUNvcmUsIGNvcmUsIE5VTEwpOwoKICByZXR1cm4gKGlkeCA9PSBJTlZBTElEX1RBQkxFX0lEWCA/IDAgOiAxKTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qIQoKICBcYnJpZWYgIEFkanVzdHMgdGhlIFNCUiBzZXR0aW5ncyBhY2NvcmRpbmcgdG8gdGhlIGNob3NlbiBjb3JlIGNvZGVyCiAgICAgICAgICBzZXR0aW5ncyB3aGljaCBhcmUgYWNjZXNzaWJsZSB2aWEgY29uZmlnLT5jb2RlY1NldHRpbmdzCgogIFxyZXR1cm4gQSBmbGFnIGluZGljYXRpbmcgc3VjY2VzczogeWVzICgxKSBvciBubyAoMCkKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBVSU5UCkZES3NickVuY19BZGp1c3RTYnJTZXR0aW5ncyAoY29uc3Qgc2JyQ29uZmlndXJhdGlvblB0ciBjb25maWcsIC8qISBvdXRwdXQsIG1vZGlmaWVkICovCiAgICAgICAgICAgICAgICAgICBVSU5UIGJpdFJhdGUsICAgICAgICAgICAgIC8qISB0aGUgdG90YWwgYml0cmF0ZSBpbiBiaXRzL3NlYyAqLwogICAgICAgICAgICAgICAgICAgVUlOVCBudW1DaGFubmVscywgICAgICAgICAvKiEgdGhlIGNvcmUgY29kZXIgbnVtYmVyIG9mIGNoYW5uZWxzICovCiAgICAgICAgICAgICAgICAgICBVSU5UIGZzQ29yZSwgICAgICAgICAgICAgIC8qISB0aGUgY29yZSBjb2RlciBzYW1wbGluZyByYXRlIGluIEh6ICovCiAgICAgICAgICAgICAgICAgICBVSU5UIHRyYW5zRmFjLCAgICAgICAgICAgIC8qISB0aGUgc2hvcnQgYmxvY2sgdG8gbG9uZyBibG9jayByYXRpbyAqLwogICAgICAgICAgICAgICAgICAgVUlOVCBzdGFuZGFyZEJpdHJhdGUsICAgICAvKiEgdGhlIHN0YW5kYXJkIGJpdHJhdGUgcGVyIGNoYW5uZWwgaW4gYml0cy9zZWMgKi8KICAgICAgICAgICAgICAgICAgIFVJTlQgdmJyTW9kZSwgICAgICAgICAgICAgLyohIHRoZSB2YnIgcGFyYW10ZXIsIDAgcG9vciBxdWFsaXR5IC4uIDEwMCBoaWdoIHF1YWxpdHkqLwogICAgICAgICAgICAgICAgICAgVUlOVCB1c2VTcGVlY2hDb25maWcsICAgICAvKiE8IGFkYXB0IHR1bmluZyBwYXJhbWV0ZXJzIGZvciBzcGVlY2ggPyAqLwogICAgICAgICAgICAgICAgICAgVUlOVCBsY3NNb2RlLCAgICAgICAgICAgICAvKiEgdGhlIGxvdyBjb21wbGV4aXR5IHN0ZXJlbyBtb2RlICovCiAgICAgICAgICAgICAgICAgICBVSU5UIGJQYXJhbWV0cmljU3RlcmVvLCAgIC8qITwgdXNlIHBhcmFtZXRyaWMgc3RlcmVvICovCiAgICAgICAgICAgICAgICAgICBBVURJT19PQkpFQ1RfVFlQRSBjb3JlKSAgIC8qIENvcmUgYXVkaW8gY29kZWMgb2JqZWN0IHR5cGUgKi8KewogIElOVCBpZHggPSBJTlZBTElEX1RBQkxFX0lEWDsKICBVSU5UIHNhbXBsZVJhdGU7CgogIC8qIHNldCB0aGUgY29kZWMgc2V0dGluZ3MgKi8KICBjb25maWctPmNvZGVjU2V0dGluZ3MuYml0UmF0ZSAgICAgICAgID0gYml0UmF0ZTsKICBjb25maWctPmNvZGVjU2V0dGluZ3MubkNoYW5uZWxzICAgICAgID0gbnVtQ2hhbm5lbHM7CiAgY29uZmlnLT5jb2RlY1NldHRpbmdzLnNhbXBsZUZyZXEgICAgICA9IGZzQ29yZTsKICBjb25maWctPmNvZGVjU2V0dGluZ3MudHJhbnNGYWMgICAgICAgID0gdHJhbnNGYWM7CiAgY29uZmlnLT5jb2RlY1NldHRpbmdzLnN0YW5kYXJkQml0cmF0ZSA9IHN0YW5kYXJkQml0cmF0ZTsKICBzYW1wbGVSYXRlICA9IGZzQ29yZSAqIERPV05fU01QTF9GQUM7CgogIGlmIChiaXRSYXRlPT0wKSB7CiAgICAvKiBtYXAgdmJyIHF1YWxpdHkgdG8gYml0cmF0ZSAqLwogICAgaWYgKHZick1vZGUgPCAzMCkKICAgICAgYml0UmF0ZSA9IDI0MDAwOwogICAgZWxzZSBpZiAodmJyTW9kZSA8IDQwKQogICAgICBiaXRSYXRlID0gMjgwMDA7CiAgICBlbHNlIGlmICh2YnJNb2RlIDwgNjApCiAgICAgIGJpdFJhdGUgPSAzMjAwMDsKICAgIGVsc2UgaWYgKHZick1vZGUgPCA3NSkKICAgICAgYml0UmF0ZSA9IDQwMDAwOwogICAgZWxzZQogICAgICBiaXRSYXRlID0gNDgwMDA7CiAgICBiaXRSYXRlICo9IG51bUNoYW5uZWxzOwogICAgLyogZml4IHRvIGVuYWJsZSBtb25vIHZick1vZGU8NDAgQCA0NC4xIG9mIDQ4a0h6ICovCiAgICBpZiAobnVtQ2hhbm5lbHM9PTEpIHsKICAgICAgaWYgKHNhbXBsZVJhdGU9PTQ0MTAwIHx8IHNhbXBsZVJhdGU9PTQ4MDAwKSB7CiAgICAgICAgaWYgKHZick1vZGU8NDApIGJpdFJhdGUgPSAzMjAwMDsKICAgICAgfQogICAgfQogIH0KCiAgaWR4ID0gZ2V0U2JyVHVuaW5nVGFibGVJbmRleChiaXRSYXRlLG51bUNoYW5uZWxzLGZzQ29yZSwgY29yZSwgTlVMTCk7CgogIGlmIChpZHggIT0gSU5WQUxJRF9UQUJMRV9JRFgpIHsKICAgIGNvbmZpZy0+c3RhcnRGcmVxICAgICAgID0gc2JyVHVuaW5nVGFibGVbaWR4XS5zdGFydEZyZXEgOwogICAgY29uZmlnLT5zdG9wRnJlcSAgICAgICAgPSBzYnJUdW5pbmdUYWJsZVtpZHhdLnN0b3BGcmVxIDsKICAgIGlmICh1c2VTcGVlY2hDb25maWcpIHsKICAgICAgY29uZmlnLT5zdGFydEZyZXEgICAgID0gc2JyVHVuaW5nVGFibGVbaWR4XS5zdGFydEZyZXFTcGVlY2g7CiAgICAgIGNvbmZpZy0+c3RvcEZyZXEgICAgICA9IHNiclR1bmluZ1RhYmxlW2lkeF0uc3RvcEZyZXFTcGVlY2g7CiAgICB9CgogICAgY29uZmlnLT5zYnJfbm9pc2VfYmFuZHMgPSBzYnJUdW5pbmdUYWJsZVtpZHhdLm51bU5vaXNlQmFuZHMgOwogICAgaWYgKGNvcmUgPT0gQU9UX0VSX0FBQ19FTEQpCiAgICAgIGNvbmZpZy0+aW5pdF9hbXBfcmVzX0ZGID0gU0JSX0FNUF9SRVNfMV81OwogICAgY29uZmlnLT5ub2lzZUZsb29yT2Zmc2V0PSBzYnJUdW5pbmdUYWJsZVtpZHhdLm5vaXNlRmxvb3JPZmZzZXQ7CgogICAgY29uZmlnLT5hbmFfbWF4X2xldmVsICAgPSBzYnJUdW5pbmdUYWJsZVtpZHhdLm5vaXNlTWF4TGV2ZWwgOwogICAgY29uZmlnLT5zdGVyZW9Nb2RlICAgICAgPSBzYnJUdW5pbmdUYWJsZVtpZHhdLnN0ZXJlb01vZGUgOwogICAgY29uZmlnLT5mcmVxU2NhbGUgICAgICAgPSBzYnJUdW5pbmdUYWJsZVtpZHhdLmZyZXFTY2FsZSA7CgogICAgLyogYWRqdXN0IHVzYWdlIG9mIHBhcmFtZXRyaWMgY29kaW5nIGRlcGVuZGVudCBvbiBiaXRyYXRlIGFuZCBzcGVlY2ggY29uZmlnIGZsYWcgKi8KICAgIGlmICh1c2VTcGVlY2hDb25maWcpCiAgICAgIGNvbmZpZy0+cGFyYW1ldHJpY0NvZGluZyAgPSAwOwoKICAgIGlmIChjb3JlID09IEFPVF9FUl9BQUNfRUxEKSB7CiAgICAgIGlmIChiaXRSYXRlIDwgMjgwMDApCiAgICAgICAgY29uZmlnLT5pbml0X2FtcF9yZXNfRkYgPSBTQlJfQU1QX1JFU18zXzA7CiAgICAgIGNvbmZpZy0+U2VuZEhlYWRlckRhdGFUaW1lID0gLTE7CiAgICB9CgogICAgaWYgKG51bUNoYW5uZWxzID09IDEpIHsKICAgICAgaWYgKGJpdFJhdGUgPCAxNjAwMCkgewogICAgICAgIGNvbmZpZy0+cGFyYW1ldHJpY0NvZGluZyAgPSAwOwogICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgaWYgKGJpdFJhdGUgPCAyMDAwMCkgewogICAgICAgIGNvbmZpZy0+cGFyYW1ldHJpY0NvZGluZyAgPSAwOwogICAgICB9CiAgICB9CgogICAgY29uZmlnLT51c2VTcGVlY2hDb25maWcgPSB1c2VTcGVlY2hDb25maWc7CgogICAgLyogUFMgc2V0dGluZ3MgKi8KICAgIGNvbmZpZy0+YlBhcmFtZXRyaWNTdGVyZW8gPSBiUGFyYW1ldHJpY1N0ZXJlbzsKCiAgICByZXR1cm4gMSA7CiAgfQogIGVsc2UgewogICAgcmV0dXJuIDAgOwogIH0KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgogZnVuY3Rpb25uYW1lOiBGREtzYnJFbmNfSW5pdGlhbGl6ZVNickRlZmF1bHRzCiBkZXNjcmlwdGlvbjogIGluaXRpYWxpemVzIHRoZSBTQlIgY29uZmlmdXJhdGlvbgogcmV0dXJuczogICAgICBlcnJvciBzdGF0dXMKIGlucHV0OiAgICAgICAgLSBjb3JlIGNvZGVjIHR5cGUsCiAgICAgICAgICAgICAgIC0gZmFjIG9mIFNCUiB0byBjb3JlIGZyYW1lIGxlbmd0aCwKICAgICAgICAgICAgICAgLSBjb3JlIGZyYW1lIGxlbmd0aAogb3V0cHV0OiAgICAgICBpbml0aWFsaXplZCBTQlIgY29uZmlndXJhdGlvbgoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBVSU5UCkZES3NickVuY19Jbml0aWFsaXplU2JyRGVmYXVsdHMgKHNickNvbmZpZ3VyYXRpb25QdHIgY29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICAgICAgIGNvcmVTYnJGcmFtZUxlbkZhYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCAgICAgICAgICAgICAgICBjb2RlY0dyYW51bGVMZW4pCnsKICAgIGlmICggKGNvcmVTYnJGcmFtZUxlbkZhYyAhPSAyKSB8fAogICAgICAgICAoY29kZWNHcmFudWxlTGVuKmNvcmVTYnJGcmFtZUxlbkZhYyA+IFFNRl9DSEFOTkVMUypRTUZfTUFYX1RJTUVfU0xPVFMpICkKICAgICAgIHJldHVybigxKTsKCiAgICBjb25maWctPlNlbmRIZWFkZXJEYXRhVGltZSAgICAgPSAxMDAwOwogICAgY29uZmlnLT51c2VXYXZlQ29kaW5nICAgICAgICAgID0gMDsKICAgIGNvbmZpZy0+Y3JjU2JyICAgICAgICAgICAgICAgICA9IDA7CiAgICBjb25maWctPmR5bkJ3U3VwcG9ydGVkICAgICAgICAgPSAxOwogICAgY29uZmlnLT50cmFuX3RociAgICAgICAgICAgICAgID0gMTMwMDA7CiAgICBjb25maWctPnBhcmFtZXRyaWNDb2RpbmcgICAgICAgPSAxOwoKICAgIGNvbmZpZy0+c2JyRnJhbWVTaXplICA9IGNvZGVjR3JhbnVsZUxlbiAqIGNvcmVTYnJGcmFtZUxlbkZhYzsKCgogICAgLyogc2JyIGRlZmF1bHQgcGFyYW1ldGVycyAqLwogICAgY29uZmlnLT5zYnJfZGF0YV9leHRyYSAgICAgICAgID0gMDsKICAgIGNvbmZpZy0+YW1wX3JlcyAgICAgICAgICAgICAgICA9IFNCUl9BTVBfUkVTXzNfMCA7CiAgICBjb25maWctPnRyYW5fZmMgICAgICAgICAgICAgICAgPSAwIDsKICAgIGNvbmZpZy0+dHJhbl9kZXRfbW9kZSAgICAgICAgICA9IDEgOwogICAgY29uZmlnLT5zcHJlYWQgICAgICAgICAgICAgICAgID0gMSA7CiAgICBjb25maWctPnN0YXQgICAgICAgICAgICAgICAgICAgPSAwIDsKICAgIGNvbmZpZy0+ZSAgICAgICAgICAgICAgICAgICAgICA9IDEgOwogICAgY29uZmlnLT5kZWx0YVRBY3Jvc3NGcmFtZXMgICAgID0gMSA7CiAgICBjb25maWctPmRGX2VkZ2VfMXN0RW52ICAgICAgICAgPSBGTDJGWENPTlNUX0RCTCgwLjNmKSA7CiAgICBjb25maWctPmRGX2VkZ2VfaW5jciAgICAgICAgICAgPSBGTDJGWENPTlNUX0RCTCgwLjNmKSA7CgogICAgY29uZmlnLT5zYnJfaW52Zl9tb2RlICAgPSBJTlZGX1NXSVRDSEVEOwogICAgY29uZmlnLT5zYnJfeHBvc19tb2RlICAgPSBYUE9TX0xDOwogICAgY29uZmlnLT5zYnJfeHBvc19jdHJsICAgPSBTQlJfWFBPU19DVFJMX0RFRkFVTFQ7CiAgICBjb25maWctPnNicl94cG9zX2xldmVsICA9IDA7CiAgICBjb25maWctPnVzZVNhUGFuICAgICAgICA9IDA7CiAgICBjb25maWctPmR5bkJ3RW5hYmxlZCAgICA9IDA7CiAgICBjb25maWctPmJEb3duU2FtcGxlZFNiciA9IDA7CgoKICAgIC8qIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVycyBhcmUgb3ZlcndyaXR0ZW4gYnkgdGhlIEZES3NickVuY19BZGp1c3RTYnJTZXR0aW5ncygpIGZ1bmN0aW9uIHNpbmNlCiAgICAgICB0aGV5IGFyZSBpbmNsdWRlZCBpbiB0aGUgdHVuaW5nIHRhYmxlICovCiAgICBjb25maWctPnN0ZXJlb01vZGUgICAgICAgICAgICAgPSBTQlJfU1dJVENIX0xSQzsKICAgIGNvbmZpZy0+YW5hX21heF9sZXZlbCAgICAgICAgICA9IDY7CiAgICBjb25maWctPm5vaXNlRmxvb3JPZmZzZXQgICAgICAgPSAwOwogICAgY29uZmlnLT5zdGFydEZyZXEgICAgICAgICAgICAgID0gNTsgLyogIDUuOSByZXNwZWN0aXZlbHkgIDYuMCBrSHogYXQgZnMgPSA0NC4xLzQ4IGtIeiAqLwogICAgY29uZmlnLT5zdG9wRnJlcSAgICAgICAgICAgICAgID0gOTsgLyogMTYuMiByZXNwZWN0aXZlbHkgMTYuOCBrSHogYXQgZnMgPSA0NC4xLzQ4IGtIeiAqLwoKCiAgICAvKiBoZWFkZXJfZXh0cmFfMSAqLwogICAgY29uZmlnLT5mcmVxU2NhbGUgICAgICAgPSBTQlJfRlJFUV9TQ0FMRV9ERUZBVUxUOwogICAgY29uZmlnLT5hbHRlclNjYWxlICAgICAgPSBTQlJfQUxURVJfU0NBTEVfREVGQVVMVDsKICAgIGNvbmZpZy0+c2JyX25vaXNlX2JhbmRzID0gU0JSX05PSVNFX0JBTkRTX0RFRkFVTFQ7CgogICAgLyogaGVhZGVyX2V4dHJhXzIgKi8KICAgIGNvbmZpZy0+c2JyX2xpbWl0ZXJfYmFuZHMgICAgPSBTQlJfTElNSVRFUl9CQU5EU19ERUZBVUxUOwogICAgY29uZmlnLT5zYnJfbGltaXRlcl9nYWlucyAgICA9IFNCUl9MSU1JVEVSX0dBSU5TX0RFRkFVTFQ7CiAgICBjb25maWctPnNicl9pbnRlcnBvbF9mcmVxICAgID0gU0JSX0lOVEVSUE9MX0ZSRVFfREVGQVVMVDsKICAgIGNvbmZpZy0+c2JyX3Ntb290aGluZ19sZW5ndGggPSBTQlJfU01PT1RISU5HX0xFTkdUSF9ERUZBVUxUOwoKICAgIHJldHVybiAxOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgogZnVuY3Rpb25uYW1lOiBEZWxldGVFbnZDaGFubmVsCiBkZXNjcmlwdGlvbjogIGZyZWVzIG1lbW9yeSBvZiBvbmUgU0JSIGNoYW5uZWwKIHJldHVybnM6ICAgICAgLQogaW5wdXQ6ICAgICAgICBoYW5kbGUgb2YgY2hhbm5lbAogb3V0cHV0OiAgICAgICByZWxlYXNlZCBoYW5kbGUKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgdm9pZApkZWxldGVFbnZDaGFubmVsIChIQU5ETEVfRU5WX0NIQU5ORUwgaEVudkN1dCkKewogIGlmIChoRW52Q3V0KSB7CgogICAgRkRLc2JyRW5jX0RlbGV0ZVRvbkNvcnJQYXJhbUV4dHIoJmhFbnZDdXQtPlRvbkNvcnIpOwoKICAgIEZES3NickVuY19kZWxldGVFeHRyYWN0U2JyRW52ZWxvcGUgKCZoRW52Q3V0LT5zYnJFeHRyYWN0RW52ZWxvcGUpOwogIH0KCn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiBmdW5jdGlvbm5hbWU6IHNickVuY29kZXJfQ2hhbm5lbENsb3NlCiBkZXNjcmlwdGlvbjogIGNsb3NlIHRoZSBjaGFubmVsIGNvZGluZyBoYW5kbGUKIHJldHVybnM6CiBpbnB1dDogICAgICAgIHBoU2JyQ2hhbm5lbAogb3V0cHV0OgoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyB2b2lkCnNickVuY29kZXJfQ2hhbm5lbENsb3NlKEhBTkRMRV9TQlJfQ0hBTk5FTCBoU2JyQ2hhbm5lbCkKewogIGlmIChoU2JyQ2hhbm5lbCAhPSBOVUxMKQogIHsKICAgIGRlbGV0ZUVudkNoYW5uZWwgKCZoU2JyQ2hhbm5lbC0+aEVudkNoYW5uZWwpOwogIH0KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgogZnVuY3Rpb25uYW1lOiBzYnJFbmNvZGVyX0VsZW1lbnRDbG9zZQogZGVzY3JpcHRpb246ICBjbG9zZSB0aGUgY2hhbm5lbCBjb2RpbmcgaGFuZGxlCiByZXR1cm5zOgogaW5wdXQ6ICAgICAgICBwaFNickNoYW5uZWwKIG91dHB1dDoKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgdm9pZApzYnJFbmNvZGVyX0VsZW1lbnRDbG9zZShIQU5ETEVfU0JSX0VMRU1FTlQgKnBoU2JyRWxlbWVudCkKewogIEhBTkRMRV9TQlJfRUxFTUVOVCBoU2JyRWxlbWVudCA9ICpwaFNickVsZW1lbnQ7CgogIGlmIChoU2JyRWxlbWVudCE9TlVMTCkgewogICAgaWYgKGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLnZfa19tYXN0ZXIpCiAgICAgIEZyZWVSYW1fU2JyX3Zfa19tYXN0ZXIoJmhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLnZfa19tYXN0ZXIpOwogICAgaWYgKGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLmZyZXFCYW5kVGFibGVbTE9dKQogICAgICBGcmVlUmFtX1Nicl9mcmVxQmFuZFRhYmxlTE8oJmhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLmZyZXFCYW5kVGFibGVbTE9dKTsKICAgIGlmIChoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5mcmVxQmFuZFRhYmxlW0hJXSkKICAgICAgRnJlZVJhbV9TYnJfZnJlcUJhbmRUYWJsZUhJKCZoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5mcmVxQmFuZFRhYmxlW0hJXSk7CgogICAgRnJlZVJhbV9TYnJFbGVtZW50KHBoU2JyRWxlbWVudCk7CiAgfQogIHJldHVybiA7Cgp9CgoKdm9pZCBzYnJFbmNvZGVyX0Nsb3NlIChIQU5ETEVfU0JSX0VOQ09ERVIgKnBoU2JyRW5jb2RlcikKewogIEhBTkRMRV9TQlJfRU5DT0RFUiBoU2JyRW5jb2RlciA9ICpwaFNickVuY29kZXI7CgogIGlmIChoU2JyRW5jb2RlciAhPSBOVUxMKQogIHsKICAgIGludCBlbCwgY2g7CgogICAgZm9yIChlbD0wOyBlbDwoNik7IGVsKyspCiAgICB7CiAgICAgIGlmIChoU2JyRW5jb2Rlci0+c2JyRWxlbWVudFtlbF0hPU5VTEwpIHsKICAgICAgICBzYnJFbmNvZGVyX0VsZW1lbnRDbG9zZSgmaFNickVuY29kZXItPnNickVsZW1lbnRbZWxdKTsKICAgICAgfQogICAgfQoKICAgIC8qIENsb3NlIHNiciBDaGFubmVscyAqLwogICAgZm9yIChjaD0wOyBjaDwoNik7IGNoKyspCiAgICB7CiAgICAgIGlmIChoU2JyRW5jb2Rlci0+cFNickNoYW5uZWxbY2hdKSB7CiAgICAgICAgc2JyRW5jb2Rlcl9DaGFubmVsQ2xvc2UoaFNickVuY29kZXItPnBTYnJDaGFubmVsW2NoXSk7CiAgICAgICAgRnJlZVJhbV9TYnJDaGFubmVsKCZoU2JyRW5jb2Rlci0+cFNickNoYW5uZWxbY2hdKTsKICAgICAgfQoKICAgICAgaWYgKGhTYnJFbmNvZGVyLT5RbWZBbmFseXNpc1tjaF0uRmlsdGVyU3RhdGVzKQogICAgICAgIEZyZWVSYW1fU2JyX1FtZlN0YXRlc0FuYWx5c2lzKChGSVhQX1FBUyoqKSZoU2JyRW5jb2Rlci0+UW1mQW5hbHlzaXNbY2hdLkZpbHRlclN0YXRlcyk7CgoKICAgIH0KCiAgICBpZiAoaFNickVuY29kZXItPmhQYXJhbWV0cmljU3RlcmVvKQogICAgICBQU0VuY19EZXN0cm95KCZoU2JyRW5jb2Rlci0+aFBhcmFtZXRyaWNTdGVyZW8pOwogICAgaWYgKGhTYnJFbmNvZGVyLT5xbWZTeW50aGVzaXNQUy5GaWx0ZXJTdGF0ZXMpCiAgICAgIEZyZWVSYW1fUHNRbWZTdGF0ZXNTeW50aGVzaXMoKEZJWFBfREJMKiopJmhTYnJFbmNvZGVyLT5xbWZTeW50aGVzaXNQUy5GaWx0ZXJTdGF0ZXMpOwoKICAgIC8qIFJlbGVhc2UgT3ZlcmxheSAqLwogICAgRnJlZVJhbV9TYnJEeW5hbWljX1JBTSgoRklYUF9EQkwqKikmaFNickVuY29kZXItPnBTQlJkeW5hbWljX1JBTSk7CgoKICAgIEZyZWVSYW1fU2JyRW5jb2RlcihwaFNickVuY29kZXIpOwogIH0KCn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKIGZ1bmN0aW9ubmFtZTogdXBkYXRlRnJlcUJhbmRUYWJsZQogZGVzY3JpcHRpb246ICB1cGRhdGVzIHZrX21hc3RlcgogcmV0dXJuczogICAgICAtCiBpbnB1dDogICAgICAgIGNvbmZpZyBoYW5kbGUKIG91dHB1dDogICAgICAgZXJyb3IgaW5mbwoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBJTlQgdXBkYXRlRnJlcUJhbmRUYWJsZShIQU5ETEVfU0JSX0NPTkZJR19EQVRBICBzYnJDb25maWdEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9IRUFERVJfREFUQSAgc2JySGVhZGVyRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBub1FtZkNoYW5uZWxzKQp7CiAgSU5UIGswLCBrMjsKCiAgaWYoRkRLc2JyRW5jX0ZpbmRTdGFydEFuZFN0b3BCYW5kKHNickNvbmZpZ0RhdGEtPnNhbXBsZUZyZXEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vUW1mQ2hhbm5lbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickhlYWRlckRhdGEtPnNicl9zdGFydF9mcmVxdWVuY3ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickhlYWRlckRhdGEtPnNicl9zdG9wX2ZyZXF1ZW5jeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JySGVhZGVyRGF0YS0+c2FtcGxlUmF0ZU1vZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrMCwgJmsyKSkKICAgIHJldHVybigxKTsKCgogIGlmKEZES3NickVuY19VcGRhdGVGcmVxU2NhbGUoc2JyQ29uZmlnRGF0YS0+dl9rX21hc3RlciwgJnNickNvbmZpZ0RhdGEtPm51bV9NYXN0ZXIsCiAgICAgICAgICAgICAgICAgICAgIGswLCBrMiwgc2JySGVhZGVyRGF0YS0+ZnJlcVNjYWxlLAogICAgICAgICAgICAgICAgICAgICBzYnJIZWFkZXJEYXRhLT5hbHRlclNjYWxlKSkKICAgIHJldHVybigxKTsKCgogIHNickhlYWRlckRhdGEtPnNicl94b3Zlcl9iYW5kPTA7CgoKICBpZihGREtzYnJFbmNfVXBkYXRlSGlSZXMoc2JyQ29uZmlnRGF0YS0+ZnJlcUJhbmRUYWJsZVtISV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICZzYnJDb25maWdEYXRhLT5uU2ZiW0hJXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyQ29uZmlnRGF0YS0+dl9rX21hc3RlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyQ29uZmlnRGF0YS0+bnVtX01hc3RlciAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICZzYnJIZWFkZXJEYXRhLT5zYnJfeG92ZXJfYmFuZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JySGVhZGVyRGF0YS0+c2FtcGxlUmF0ZU1vZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vUW1mQ2hhbm5lbHMpKQogICAgcmV0dXJuKDEpOwoKCiAgRkRLc2JyRW5jX1VwZGF0ZUxvUmVzKHNickNvbmZpZ0RhdGEtPmZyZXFCYW5kVGFibGVbTE9dLAogICAgICAgICAgICAgICAgICAgICAgICAmc2JyQ29uZmlnRGF0YS0+blNmYltMT10sCiAgICAgICAgICAgICAgICAgICAgICAgIHNickNvbmZpZ0RhdGEtPmZyZXFCYW5kVGFibGVbSEldLAogICAgICAgICAgICAgICAgICAgICAgICBzYnJDb25maWdEYXRhLT5uU2ZiW0hJXSk7CgogIHNickNvbmZpZ0RhdGEtPnhPdmVyRnJlcSA9IChzYnJDb25maWdEYXRhLT5mcmVxQmFuZFRhYmxlW0xPV19SRVNdWzBdICogc2JyQ29uZmlnRGF0YS0+c2FtcGxlRnJlcSAvIG5vUW1mQ2hhbm5lbHMrMSk+PjE7CgogIHJldHVybiAoMCk7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiBmdW5jdGlvbm5hbWU6IHJlc2V0RW52Q2hhbm5lbAogZGVzY3JpcHRpb246ICByZXNldHMgcGFyYW1ldGVycyBhbmQgYWxsb2NhdGVzIG1lbW9yeQogcmV0dXJuczogICAgICBlcnJvciBzdGF0dXMKIGlucHV0Ogogb3V0cHV0OiAgICAgICBoRW52CgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIElOVCByZXNldEVudkNoYW5uZWwgKEhBTkRMRV9TQlJfQ09ORklHX0RBVEEgIHNickNvbmZpZ0RhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0hFQURFUl9EQVRBICBzYnJIZWFkZXJEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0VOVl9DSEFOTkVMICAgICAgaEVudikKewogIC8qIG5vdGUgISEhIGhFbnYtPmVuY0VudkRhdGEubm9PZm5vaXNlYmFuZHMgd2lsbCBiZSB1cGRhdGVkIGxhdGVyIGluIGZ1bmN0aW9uIEZES3NickVuY19leHRyYWN0U2JyRW52ZWxvcGUgISEhKi8KICBoRW52LT5Ub25Db3JyLnNick5vaXNlRmxvb3JFc3RpbWF0ZS5ub2lzZUJhbmRzID0gIHNickhlYWRlckRhdGEtPnNicl9ub2lzZV9iYW5kczsKCgogIGlmKEZES3NickVuY19SZXNldFRvbkNvcnJQYXJhbUV4dHIoJmhFbnYtPlRvbkNvcnIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickNvbmZpZ0RhdGEtPnhwb3NDdHJsU3dpdGNoLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJDb25maWdEYXRhLT5mcmVxQmFuZFRhYmxlW0hJXVswXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyQ29uZmlnRGF0YS0+dl9rX21hc3RlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyQ29uZmlnRGF0YS0+bnVtX01hc3RlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyQ29uZmlnRGF0YS0+c2FtcGxlRnJlcSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyQ29uZmlnRGF0YS0+ZnJlcUJhbmRUYWJsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyQ29uZmlnRGF0YS0+blNmYiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyQ29uZmlnRGF0YS0+bm9RbWZCYW5kcykpCiAgICByZXR1cm4oMSk7CgogIGhFbnYtPnNickNvZGVOb2lzZUZsb29yLm5TZmJbTE9dID0gaEVudi0+VG9uQ29yci5zYnJOb2lzZUZsb29yRXN0aW1hdGUubm9Ob2lzZUJhbmRzOwogIGhFbnYtPnNickNvZGVOb2lzZUZsb29yLm5TZmJbSEldID0gaEVudi0+VG9uQ29yci5zYnJOb2lzZUZsb29yRXN0aW1hdGUubm9Ob2lzZUJhbmRzOwoKICBoRW52LT5zYnJDb2RlRW52ZWxvcGUublNmYltMT10gPSBzYnJDb25maWdEYXRhLT5uU2ZiW0xPXTsKICBoRW52LT5zYnJDb2RlRW52ZWxvcGUublNmYltISV0gPSBzYnJDb25maWdEYXRhLT5uU2ZiW0hJXTsKCiAgaEVudi0+ZW5jRW52RGF0YS5ub0hhcm1vbmljcyA9IHNickNvbmZpZ0RhdGEtPm5TZmJbSEldOwoKICBoRW52LT5zYnJDb2RlRW52ZWxvcGUudXBEYXRlID0gMDsKICBoRW52LT5zYnJDb2RlTm9pc2VGbG9vci51cERhdGUgPSAwOwoKICByZXR1cm4gKDApOwp9CgovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogRkRLc2JyRW5jX1NickdldFhPdmVyRnJlcSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKgogKiBAZm4KICogQGJyaWVmICAgICAgIGNhbGN1bGF0ZXMgdGhlIGNsb3Nlc3QgcG9zc2libGUgY3Jvc3NvdmVyIGZyZXF1ZW5jeQogKiBAcmV0dXJuICAgICAgdGhlIGNyb3Nzb3ZlciBmcmVxdWVuY3kgU0JSIGFjY2VwdHMKICoKICovCnN0YXRpYyBJTlQKRkRLc2JyRW5jX1NickdldFhPdmVyRnJlcShIQU5ETEVfU0JSX0VMRU1FTlQgIGhFbnYsICAgICAgICAvKiE8IGhhbmRsZSB0byBTQlIgZW5jb2RlciBpbnN0YW5jZSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICAgICAgeG92ZXJGcmVxKSAgIC8qITwgZnJvbSBjb3JlIGNvZGVyIHN1Z2dlc3RlZCBjcm9zc292ZXIgZnJlcXVlbmN5ICovCnsKICBJTlQgYmFuZDsKICBJTlQgbGFzdERpZmYsIG5ld0RpZmY7CiAgSU5UIGN1dG9mZlNiOwoKICBVQ0hBUiAqUkVTVFJJQ1QgcFZLTWFzdGVyID0gaEVudi0+c2JyQ29uZmlnRGF0YS52X2tfbWFzdGVyOwoKICAvKiBDaGVjayBpZiB0aGVyZSBpcyBhIG1hdGNoaW5nIGN1dG9mZiBmcmVxdWVuY3kgaW4gdGhlIG1hc3RlciB0YWJsZSAqLwogIGN1dG9mZlNiID0gKDQqeG92ZXJGcmVxICogaEVudi0+c2JyQ29uZmlnRGF0YS5ub1FtZkJhbmRzIC8gaEVudi0+c2JyQ29uZmlnRGF0YS5zYW1wbGVGcmVxICsgMSk+PjE7CiAgbGFzdERpZmYgPSBjdXRvZmZTYjsKICBmb3IgKGJhbmQgPSAwOyBiYW5kIDwgaEVudi0+c2JyQ29uZmlnRGF0YS5udW1fTWFzdGVyOyBiYW5kKyspIHsKCiAgICBuZXdEaWZmID0gZml4cF9hYnMoKElOVClwVktNYXN0ZXJbYmFuZF0gLSBjdXRvZmZTYik7CgogICAgaWYobmV3RGlmZiA+PSBsYXN0RGlmZikgewogICAgICBiYW5kLS07CiAgICAgIGJyZWFrOwogICAgfQoKICAgIGxhc3REaWZmID0gbmV3RGlmZjsKICB9CgogIHJldHVybiAoKHBWS01hc3RlcltiYW5kXSAqIGhFbnYtPnNickNvbmZpZ0RhdGEuc2FtcGxlRnJlcS9oRW52LT5zYnJDb25maWdEYXRhLm5vUW1mQmFuZHMrMSk+PjEpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiBmdW5jdGlvbm5hbWU6IEZES3NickVuY19FbnZFbmNvZGVGcmFtZQogZGVzY3JpcHRpb246IHBlcmZvcm1zIHRoZSBzYnIgZW52ZWxvcGUgY2FsY3VsYXRpb24gZm9yIG9uZSBlbGVtZW50CiByZXR1cm5zOgogaW5wdXQ6CiBvdXRwdXQ6CgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KSU5UCkZES3NickVuY19FbnZFbmNvZGVGcmFtZShIQU5ETEVfU0JSX0VOQ09ERVIgICBoRW52RW5jb2RlciwKICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgIGlFbGVtZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgSU5UX1BDTSAgICAgICAgICAgICAqc2FtcGxlcywgICAgICAgICAgICAgICAgIC8qITwgdGltZSBzYW1wbGVzLCBhbHdheXMgaW50ZXJsZWF2ZWQgKi8KICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgICAgICAgICAgICAgICAgIHRpbWVJblN0cmlkZSwgICAgICAgICAgICAvKiE8IHRpbWUgYnVmZmVyIGNoYW5uZWwgaW50ZXJsZWF2aW5nIHN0cmlkZSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCAgICAgICAgICAgICAgICAqc2JyRGF0YUJpdHMsICAgICAgICAgICAgIC8qITwgU2l6ZSBvZiBTQlIgcGF5bG9hZCAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICAgICAgICAgICAgICAgKnNickRhdGEsICAgICAgICAgICAgICAgICAvKiE8IFNCUiBwYXlsb2FkICAqLwogICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgY2xlYXJPdXRwdXQgICAgICAgICAgICAgIC8qITwgRG8gbm90IGNvbnNpZGVyIGFueSBpbnB1dCBzaWduYWwgKi8KICAgICAgICAgICAgICAgICAgICAgICAgKQp7CiAgSEFORExFX1NCUl9FTEVNRU5UIGhTYnJFbGVtZW50ID0gaEVudkVuY29kZXItPnNickVsZW1lbnRbaUVsZW1lbnRdOwogIEZES19DUkNJTkZPICBjcmNJbmZvOwogIElOVCAgICBjcmNSZWc7CiAgSU5UICAgIGNoOwogIElOVCAgICBiYW5kOwogIElOVCAgICBjdXRvZmZTYjsKICBJTlQgICAgbmV3WE92ZXI7CgogIGlmIChoRW52RW5jb2RlciA9PSBOVUxMKQogICAgcmV0dXJuIC0xOwoKICBoU2JyRWxlbWVudCA9IGhFbnZFbmNvZGVyLT5zYnJFbGVtZW50W2lFbGVtZW50XTsKCiAgaWYgKGhTYnJFbGVtZW50ID09IE5VTEwpCiAgICByZXR1cm4gLTE7CgoKICAvKiBoZWFkZXIgYml0c3RyZWFtIGhhbmRsaW5nICovCiAgSEFORExFX1NCUl9CSVRTVFJFQU1fREFUQSBzYnJCaXRzdHJlYW1EYXRhID0gJmhTYnJFbGVtZW50LT5zYnJCaXRzdHJlYW1EYXRhOwoKICBJTlQgcHNIZWFkZXJBY3RpdmUgPSAwOwogIHNickJpdHN0cmVhbURhdGEtPkhlYWRlckFjdGl2ZSA9IDA7CgogIC8qIEFudGljaXBhdGUgUFMgaGVhZGVyIGJlY2F1c2Ugb2YgaW50ZXJuYWwgUFMgYml0c3RyZWFtIGRlbGF5IGluIG9yZGVyIHRvIGJlIGluIHN5bmMgd2l0aCBTQlIgaGVhZGVyLiAqLwogIGlmICggc2JyQml0c3RyZWFtRGF0YS0+Q291bnRTZW5kSGVhZGVyRGF0YT09KHNickJpdHN0cmVhbURhdGEtPk5yU2VuZEhlYWRlckRhdGEtMSkgKQogIHsKICAgICAgcHNIZWFkZXJBY3RpdmUgPSAxOwogIH0KCiAgLyogU2lnbmFsIFNCUiBoZWFkZXIgdG8gYmUgd3JpdHRlbiBpbnRvIGJpdHN0cmVhbSAqLwogIGlmICggc2JyQml0c3RyZWFtRGF0YS0+Q291bnRTZW5kSGVhZGVyRGF0YT09MCAgKQogIHsKICAgICBzYnJCaXRzdHJlYW1EYXRhLT5IZWFkZXJBY3RpdmUgPSAxOwogIH0KCiAgLyogSW5jcmVtZW50IGhlYWRlciBpbnRlcnZhbCBjb3VudGVyICovCiAgaWYgKHNickJpdHN0cmVhbURhdGEtPk5yU2VuZEhlYWRlckRhdGEgPT0gMCkgewogICAgc2JyQml0c3RyZWFtRGF0YS0+Q291bnRTZW5kSGVhZGVyRGF0YSA9IDE7CiAgfQogIGVsc2UgewogICAgaWYgKHNickJpdHN0cmVhbURhdGEtPkNvdW50U2VuZEhlYWRlckRhdGEgPj0gMCkgewogICAgICBzYnJCaXRzdHJlYW1EYXRhLT5Db3VudFNlbmRIZWFkZXJEYXRhKys7CiAgICAgIHNickJpdHN0cmVhbURhdGEtPkNvdW50U2VuZEhlYWRlckRhdGEgJT0gc2JyQml0c3RyZWFtRGF0YS0+TnJTZW5kSGVhZGVyRGF0YTsKICAgIH0KICB9CgogIGlmIChoU2JyRWxlbWVudC0+Q21vbkRhdGEuZHluQndFbmFibGVkICkgewogICAgSU5UIGk7CiAgICBmb3IgKCBpID0gNDsgaSA+IDA7IGktLSApCiAgICAgIGhTYnJFbGVtZW50LT5keW5YT3ZlckZyZXFEZWxheVtpXSA9IGhTYnJFbGVtZW50LT5keW5YT3ZlckZyZXFEZWxheVtpLTFdOwoKICAgIGhTYnJFbGVtZW50LT5keW5YT3ZlckZyZXFEZWxheVswXSA9IGhTYnJFbGVtZW50LT5DbW9uRGF0YS5keW5YT3ZlckZyZXFFbmM7CiAgICBpZiAoaFNickVsZW1lbnQtPmR5blhPdmVyRnJlcURlbGF5WzFdID4gaFNickVsZW1lbnQtPmR5blhPdmVyRnJlcURlbGF5WzJdKQogICAgICBuZXdYT3ZlciA9IGhTYnJFbGVtZW50LT5keW5YT3ZlckZyZXFEZWxheVsyXTsKICAgIGVsc2UKICAgICAgbmV3WE92ZXIgPSBoU2JyRWxlbWVudC0+ZHluWE92ZXJGcmVxRGVsYXlbMV07CgogICAgLyogaGFzIHRoZSBjcm9zc292ZXIgZnJlcXVlbmN5IGNoYW5nZWQ/ICovCiAgICBpZiAoIGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLmR5blhPdmVyRnJlcSAhPSBuZXdYT3ZlciApIHsKCiAgICAgIC8qIGdldCBjb3JyZXNwb25kaW5nIG1hc3RlciBiYW5kICovCiAgICAgIGN1dG9mZlNiID0gKCg0KiBuZXdYT3ZlciAqIGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLm5vUW1mQmFuZHMKICAgICAgICAgICAgICAgICAgLyBoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5zYW1wbGVGcmVxKSsxKT4+MTsKCiAgICAgIGZvciAoIGJhbmQgPSAwOyBiYW5kIDwgaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEubnVtX01hc3RlcjsgYmFuZCsrICkgewogICAgICAgIGlmICggY3V0b2ZmU2IgPT0gaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEudl9rX21hc3RlcltiYW5kXSApCiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgICBGREtfQVNTRVJUKCBiYW5kIDwgaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEubnVtX01hc3RlciApOwoKICAgICAgaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEuZHluWE92ZXJGcmVxID0gbmV3WE92ZXI7CiAgICAgIGhTYnJFbGVtZW50LT5zYnJIZWFkZXJEYXRhLnNicl94b3Zlcl9iYW5kID0gYmFuZDsKICAgICAgaFNickVsZW1lbnQtPnNickJpdHN0cmVhbURhdGEuSGVhZGVyQWN0aXZlPTE7CiAgICAgIHBzSGVhZGVyQWN0aXZlID0gMTsgLyogcHMgaGVhZGVyIGlzIG9uZSBmcmFtZSBkZWxheWVkICovCgogICAgICAvKgogICAgICAgIHVwZGF0ZSB2a19tYXN0ZXIgdGFibGUKICAgICAgKi8KICAgICAgaWYodXBkYXRlRnJlcUJhbmRUYWJsZSgmaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhTYnJFbGVtZW50LT5zYnJIZWFkZXJEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5ub1FtZkJhbmRzKSkKICAgICAgICByZXR1cm4oMSk7CgoKICAgICAgLyogcmVzZXQgU0JSIGNoYW5uZWxzICovCiAgICAgIElOVCBuRW52Q2ggPSBoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5uQ2hhbm5lbHM7CiAgICAgIGZvciAoIGNoID0gMDsgY2ggPCBuRW52Q2g7IGNoKysgKSB7CiAgICAgICAgaWYocmVzZXRFbnZDaGFubmVsICgmaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaFNickVsZW1lbnQtPnNickhlYWRlckRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaFNickVsZW1lbnQtPnNickNoYW5uZWxbY2hdLT5oRW52Q2hhbm5lbCkpCiAgICAgICAgICByZXR1cm4oMSk7CgogICAgICB9CiAgICB9CiAgfQoKICAvKgogICAgYWxsb2NhdGUgc3BhY2UgZm9yIGR1bW15IGhlYWRlciBhbmQgY3JjCiAgKi8KICBjcmNSZWcgPSBGREtzYnJFbmNfSW5pdFNickJpdHN0cmVhbSgmaFNickVsZW1lbnQtPkNtb25EYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoU2JyRWxlbWVudC0+cGF5bG9hZERlbGF5TGluZVtoRW52RW5jb2Rlci0+bkJpdHN0ckRlbGF5XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFYX1BBWUxPQURfU0laRSpzaXplb2YoVUNIQVIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjcmNJbmZvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5zYnJTeW50YXhGbGFncyk7CgogIElOVCBlcnJvciA9IG5vRXJyb3I7CgogIC8qIFRlbXBvcmFsIEVudmVsb3BlIERhdGEgKi8KICBTQlJfRlJBTUVfVEVNUF9EQVRBIF9mRGF0YTsKICBTQlJfRlJBTUVfVEVNUF9EQVRBICpmRGF0YSA9ICZfZkRhdGE7CiAgU0JSX0VOVl9URU1QX0RBVEEgZURhdGFbTUFYX05VTV9DSEFOTkVMU107CgogIC8qIEluaXQgVGVtcG9yYWwgRW52ZWxvcGUgRGF0YSAqLwogIHsKICAgIGludCBpOwoKICAgIEZES21lbWNsZWFyKCZlRGF0YVswXSwgc2l6ZW9mKFNCUl9FTlZfVEVNUF9EQVRBKSk7CiAgICBGREttZW1jbGVhcigmZURhdGFbMV0sIHNpemVvZihTQlJfRU5WX1RFTVBfREFUQSkpOwogICAgRkRLbWVtY2xlYXIoZkRhdGEsIHNpemVvZihTQlJfRlJBTUVfVEVNUF9EQVRBKSk7CgogICAgZm9yKGk9MDsgaTxNQVhfTlVNX05PSVNFX1ZBTFVFUzsgaSsrKQogICAgICBmRGF0YS0+cmVzW2ldID0gRlJFUV9SRVNfSElHSDsKICB9CgoKICBpZiAoIWNsZWFyT3V0cHV0KQogIHsKICAgIC8qCiAgICAgKiBUcmFuc2Zvcm0gYXVkaW8gZGF0YSBpbnRvIFFNRiBkb21haW4KICAgICAqLwogICAgZm9yKGNoID0gMDsgY2ggPCBoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5uQ2hhbm5lbHM7IGNoKyspCiAgICB7CiAgICAgIEhBTkRMRV9FTlZfQ0hBTk5FTCBoX2VudkNoYW4gPSAmaFNickVsZW1lbnQtPnNickNoYW5uZWxbY2hdLT5oRW52Q2hhbm5lbDsKICAgICAgSEFORExFX1NCUl9FWFRSQUNUX0VOVkVMT1BFIHNickV4dHJFbnYgPSAmaF9lbnZDaGFuLT5zYnJFeHRyYWN0RW52ZWxvcGU7CgogICAgICBpZihoU2JyRWxlbWVudC0+ZWxJbmZvLmZQYXJhbWV0cmljU3RlcmVvID09IDApCiAgICAgIHsKICAgICAgICBDX0FMTE9DX1NDUkFUQ0hfU1RBUlQocW1mV29ya0J1ZmZlciwgRklYUF9EQkwsIFFNRl9DSEFOTkVMUyoyKTsKICAgICAgICBRTUZfU0NBTEVfRkFDVE9SIHRtcFNjYWxlOwogICAgICAgIEZJWFBfREJMICoqcFFtZlJlYWwsICoqcFFtZkltYWc7CgoKICAgICAgICAvKiBPYnRhaW4gcG9pbnRlcnMgdG8gUU1GIGJ1ZmZlcnMuICovCiAgICAgICAgcFFtZlJlYWwgPSBzYnJFeHRyRW52LT5yQnVmZmVyOwogICAgICAgIHBRbWZJbWFnID0gc2JyRXh0ckVudi0+aUJ1ZmZlcjsKCiAgICAgICAgcW1mQW5hbHlzaXNGaWx0ZXJpbmcoIGhTYnJFbGVtZW50LT5oUW1mQW5hbHlzaXNbY2hdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFFtZlJlYWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUW1mSW1hZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRtcFNjYWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlcyArIGhTYnJFbGVtZW50LT5lbEluZm8uQ2hhbm5lbEluZGV4W2NoXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVJblN0cmlkZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFtZldvcmtCdWZmZXIgKTsKCiAgICAgICAgQ19BTExPQ19TQ1JBVENIX0VORChxbWZXb3JrQnVmZmVyLCBGSVhQX0RCTCwgUU1GX0NIQU5ORUxTKjIpOwoKICAgICAgICBoX2VudkNoYW4tPnFtZlNjYWxlID0gdG1wU2NhbGUubGJfc2NhbGUgKyA3OwoKICAgICAgfSAvKiBmUGFyYW1ldHJpY1N0ZXJlbyA9PSAwICovCgoKICAgICAgLyoKICAgICAgICBQYXJhbWV0cmljIFN0ZXJlbyBwcm9jZXNzaW5nCiAgICAgICovCiAgICAgIGlmIChoU2JyRWxlbWVudC0+ZWxJbmZvLmZQYXJhbWV0cmljU3RlcmVvKQogICAgICB7CgogICAgICAgIC8qIExpbWl0IFBhcmFtZXRyaWMgU3RlcmVvIHRvIG9uZSBpbnN0YW5jZSAqLwogICAgICAgIEZES19BU1NFUlQoY2ggPT0gMCk7CgoKICAgICAgICBpZihlcnJvciA9PSBub0Vycm9yKXsKICAgICAgICAgIC8qIHBhcmFtZXRyaWMgc3RlcmVvIHByb2Nlc3Npbmc6CiAgICAgICAgICAgICAtIGlucHV0OgogICAgICAgICAgICAgICBvIGxlZnQgYW5kIHJpZ2h0IHRpbWUgZG9tYWluIHNhbXBsZXMKICAgICAgICAgICAgIC0gcHJvY2Vzc2luZzoKICAgICAgICAgICAgICAgbyBzdGVyZW8gcW1mIGFuYWx5c2lzCiAgICAgICAgICAgICAgIG8gc3RlcmVvIGh5YnJpZCBhbmFseXNpcwogICAgICAgICAgICAgICBvIHBzIHBhcmFtZXRlciBleHRyYWN0aW9uCiAgICAgICAgICAgICAgIG8gZG93bm1peCArIGh5YnJpZCBzeW50aGVzaXMKICAgICAgICAgICAgIC0gb3V0cHV0OgogICAgICAgICAgICAgICBvIGRvd25taXhlZCBxbWYgZGF0YSBpcyB3cml0dGVuIHRvIHNickV4dHJFbnYtPnJCdWZmZXIgYW5kIHNickV4dHJFbnYtPmlCdWZmZXIKICAgICAgICAgICovCiAgICAgICAgICBTQ0hBUiBxbWZTY2FsZTsKICAgICAgICAgIElOVF9QQ00qIHBTYW1wbGVzWzJdID0ge3NhbXBsZXMgKyBoU2JyRWxlbWVudC0+ZWxJbmZvLkNoYW5uZWxJbmRleFswXSxzYW1wbGVzICsgaFNickVsZW1lbnQtPmVsSW5mby5DaGFubmVsSW5kZXhbMV19OwogICAgICAgICAgZXJyb3IgPSBGREtzYnJFbmNfUFNFbmNfUGFyYW1ldHJpY1N0ZXJlb1Byb2Nlc3NpbmcoIGhFbnZFbmNvZGVyLT5oUGFyYW1ldHJpY1N0ZXJlbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2FtcGxlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lSW5TdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFNickVsZW1lbnQtPmhRbWZBbmFseXNpcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJFeHRyRW52LT5yQnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickV4dHJFbnYtPmlCdWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlcyArIGhTYnJFbGVtZW50LT5lbEluZm8uQ2hhbm5lbEluZGV4W2NoXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoRW52RW5jb2Rlci0+cW1mU3ludGhlc2lzUFMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcW1mU2NhbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNIZWFkZXJBY3RpdmUgKTsKICAgICAgICAgIGlmIChub0Vycm9yICE9IGVycm9yKQogICAgICAgICAgewogICAgICAgICAgICBlcnJvciA9IGhhbmRCYWNrKGVycm9yKTsKICAgICAgICAgIH0KICAgICAgICAgIGhfZW52Q2hhbi0+cW1mU2NhbGUgPSAoaW50KXFtZlNjYWxlOwogICAgICAgIH0KCgogICAgICB9IC8qIGlmIChoRW52RW5jb2Rlci0+aFBhcmFtZXRyaWNTdGVyZW8pICovCgogICAgICAvKgoKICAgICAgICAgRXh0cmFjdCBFbnZlbG9wZSByZWxldmFudCB0aGluZ3MgZnJvbSBRTUYgZGF0YQoKICAgICAgKi8KICAgICAgRkRLc2JyRW5jX2V4dHJhY3RTYnJFbnZlbG9wZTEoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoU2JyRWxlbWVudC0+c2JySGVhZGVyRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaFNickVsZW1lbnQtPnNickJpdHN0cmVhbURhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhfZW52Q2hhbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaFNickVsZW1lbnQtPkNtb25EYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlRGF0YVtjaF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZEYXRhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CgogICAgfSAvKiBoRW52RW5jb2Rlci0+c2JyQ29uZmlnRGF0YS5uQ2hhbm5lbHMgKi8KIH0KCiAgLyoKICAgICBQcm9jZXNzIEVudmVsb3BlIHJlbGV2YW50IHRoaW5ncyBhbmQgY2FsY3VsYXRlIGVudmVsb3BlIGRhdGEgYW5kIHdyaXRlIHBheWxvYWQKICAqLwogIEZES3NickVuY19leHRyYWN0U2JyRW52ZWxvcGUyKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaFNickVsZW1lbnQtPnNickhlYWRlckRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGhTYnJFbGVtZW50LT5lbEluZm8uZlBhcmFtZXRyaWNTdGVyZW8pID8gaEVudkVuY29kZXItPmhQYXJhbWV0cmljU3RlcmVvIDogTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaFNickVsZW1lbnQtPnNickJpdHN0cmVhbURhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhTYnJFbGVtZW50LT5zYnJDaGFubmVsWzBdLT5oRW52Q2hhbm5lbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaFNickVsZW1lbnQtPnNickNoYW5uZWxbMV0tPmhFbnZDaGFubmVsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoU2JyRWxlbWVudC0+Q21vbkRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJPdXRwdXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CgogIC8qCiAgICBmb3JtYXQgcGF5bG9hZCwgY2FsY3VsYXRlIGNyYwogICovCiAgRkRLc2JyRW5jX0Fzc2VtYmxlU2JyQml0c3RyZWFtKCZoU2JyRWxlbWVudC0+Q21vbkRhdGEsICZjcmNJbmZvLCBjcmNSZWcsIGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLnNiclN5bnRheEZsYWdzKTsKCiAgLyoKICAgIHNhdmUgbmV3IHBheWxvYWQsIHNldCB0byB6ZXJvIGxlbmd0aCBpZiBncmVhdGVyIHRoYW4gTUFYX1BBWUxPQURfU0laRQogICovCiAgaFNickVsZW1lbnQtPnBheWxvYWREZWxheUxpbmVTaXplW2hFbnZFbmNvZGVyLT5uQml0c3RyRGVsYXldID0gRkRLZ2V0VmFsaWRCaXRzKCZoU2JyRWxlbWVudC0+Q21vbkRhdGEuc2JyQml0YnVmKTsKCiAgaWYoaFNickVsZW1lbnQtPnBheWxvYWREZWxheUxpbmVTaXplW2hFbnZFbmNvZGVyLT5uQml0c3RyRGVsYXldID4gKE1BWF9QQVlMT0FEX1NJWkU8PDMpKQogICAgaFNickVsZW1lbnQtPnBheWxvYWREZWxheUxpbmVTaXplW2hFbnZFbmNvZGVyLT5uQml0c3RyRGVsYXldPTA7CgogIC8qIFdoaWxlIGZpbGxpbmcgdGhlIERlbGF5IGxpbmVzLCBzYnJEYXRhIGlzIE5VTEwgKi8KICBpZiAoc2JyRGF0YSkgewogICAgKnNickRhdGFCaXRzID0gaFNickVsZW1lbnQtPnBheWxvYWREZWxheUxpbmVTaXplWzBdOwogICAgRkRLbWVtY3B5KHNickRhdGEsIGhTYnJFbGVtZW50LT5wYXlsb2FkRGVsYXlMaW5lWzBdLCAoaFNickVsZW1lbnQtPnBheWxvYWREZWxheUxpbmVTaXplWzBdKzcpPj4zKTsKCgogIH0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiAgaWYgKGhFbnZFbmNvZGVyLT5mVGltZURvbWFpbkRvd25zYW1wbGluZykKICB7CiAgICBpbnQgY2g7CiAgICBpbnQgbkNoYW5uZWxzID0gaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEubkNoYW5uZWxzOwoKICAgIGZvciAoY2g9MDsgY2ggPCBuQ2hhbm5lbHM7IGNoKyspCiAgICB7CiAgICAgIElOVCBuT3V0U2FtcGxlczsKCiAgICAgIEZES2FhY0VuY19Eb3duc2FtcGxlKCZoU2JyRWxlbWVudC0+c2JyQ2hhbm5lbFtjaF0tPmRvd25TYW1wbGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlcyArIGhTYnJFbGVtZW50LT5lbEluZm8uQ2hhbm5lbEluZGV4W2NoXSArIGhFbnZFbmNvZGVyLT5idWZmZXJPZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5mcmFtZVNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lSW5TdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVzICsgaFNickVsZW1lbnQtPmVsSW5mby5DaGFubmVsSW5kZXhbY2hdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAmbk91dFNhbXBsZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoRW52RW5jb2Rlci0+bkNoYW5uZWxzKTsKICAgIH0KICB9IC8qIGRvd25zYW1wbGUgKi8KCgogIHJldHVybiAoMCk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKIGZ1bmN0aW9ubmFtZTogY3JlYXRlRW52Q2hhbm5lbAogZGVzY3JpcHRpb246ICBpbml0aWFsaXplcyBwYXJhbWV0ZXJzIGFuZCBhbGxvY2F0ZXMgbWVtb3J5CiByZXR1cm5zOiAgICAgIGVycm9yIHN0YXR1cwogaW5wdXQ6CiBvdXRwdXQ6ICAgICAgIGhFbnYKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKc3RhdGljIElOVApjcmVhdGVFbnZDaGFubmVsIChIQU5ETEVfRU5WX0NIQU5ORUwgICAgIGhFbnYsCiAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICAgICAgICAgY2hhbm5lbAogICAgICAgICAgICAgICAgICxVQ0hBUiogICAgICAgICAgICAgICAgIGR5bmFtaWNfUkFNCiAgICAgICAgICAgICAgICAgKQp7CiAgRkRLbWVtY2xlYXIoaEVudixzaXplb2YgKHN0cnVjdCBFTlZfQ0hBTk5FTCkpOwoKICBpZiAoIEZES3NickVuY19DcmVhdGVUb25Db3JyUGFyYW1FeHRyKCZoRW52LT5Ub25Db3JyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwpICkKICB7CiAgICByZXR1cm4oMSk7CiAgfQoKICBpZiAoIEZES3NickVuY19DcmVhdGVFeHRyYWN0U2JyRW52ZWxvcGUgKCZoRW52LT5zYnJFeHRyYWN0RW52ZWxvcGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwvKmNoYW4qLzAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLGR5bmFtaWNfUkFNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgKQogIHsKICAgIHJldHVybigxKTsKICB9CgogIHJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiBmdW5jdGlvbm5hbWU6IGluaXRFbnZDaGFubmVsCiBkZXNjcmlwdGlvbjogIGluaXRpYWxpemVzIHBhcmFtZXRlcnMKIHJldHVybnM6ICAgICAgZXJyb3Igc3RhdHVzCiBpbnB1dDoKIG91dHB1dDoKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSU5UCmluaXRFbnZDaGFubmVsICggIEhBTkRMRV9TQlJfQ09ORklHX0RBVEEgc2JyQ29uZmlnRGF0YSwKICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9IRUFERVJfREFUQSBzYnJIZWFkZXJEYXRhLAogICAgICAgICAgICAgICAgICBIQU5ETEVfRU5WX0NIQU5ORUwgICAgIGhFbnYsCiAgICAgICAgICAgICAgICAgIHNickNvbmZpZ3VyYXRpb25QdHIgICAgcGFyYW1zLAogICAgICAgICAgICAgICAgICBVTE9ORyAgICAgICAgICAgICAgICAgIHN0YXRlc0luaXRGbGFnCiAgICAgICAgICAgICAgICAgLElOVCAgICAgICAgICAgICAgICAgICAgY2hhbkluRWwKICAgICAgICAgICAgICAgICAsVUNIQVIqICAgICAgICAgICAgICAgICBkeW5hbWljX1JBTQogICAgICAgICAgICAgICAgICkKewogIGludCBmcmFtZVNoaWZ0LCB0cmFuX29mZj0wOwogIElOVCBlOwogIElOVCB0cmFuX2ZjOwogIElOVCB0aW1lU2xvdHMsIHRpbWVTdGVwLCBzdGFydEluZGV4OwogIElOVCBub2lzZUJhbmRzWzJdID0geyAzLCAzIH07CgogIGUgPSAxIDw8IHBhcmFtcy0+ZTsKCiAgRkRLX0FTU0VSVChwYXJhbXMtPmUgPj0gMCk7CgogIGhFbnYtPmVuY0VudkRhdGEuZnJlcV9yZXNfZml4Zml4ID0gMTsKICBoRW52LT5mTGV2ZWxQcm90ZWN0ID0gMDsKCiAgaEVudi0+ZW5jRW52RGF0YS5sZEdyaWQgPSAoc2JyQ29uZmlnRGF0YS0+c2JyU3ludGF4RmxhZ3MgJiBTQlJfU1lOVEFYX0xPV19ERUxBWSkgPyAxIDogMDsKCiAgaEVudi0+ZW5jRW52RGF0YS5zYnJfeHBvc19tb2RlID0gKFhQT1NfTU9ERSlwYXJhbXMtPnNicl94cG9zX21vZGU7CgogIGlmIChoRW52LT5lbmNFbnZEYXRhLnNicl94cG9zX21vZGUgPT0gWFBPU19TV0lUQ0hFRCkgewogICAgLyoKICAgICAgIG5vIG90aGVyIHR5cGUgdGhhbiBYUE9TX01EQ1Qgb3IgWFBPU19TUEVFQ0ggYWxsb3dlZCwKICAgICAgIGJ1dCBlbmFibGUgc3dpdGNoaW5nCiAgICAqLwogICAgc2JyQ29uZmlnRGF0YS0+c3dpdGNoVHJhbnNwb3NlcnMgPSBUUlVFOwogICAgaEVudi0+ZW5jRW52RGF0YS5zYnJfeHBvc19tb2RlID0gWFBPU19NRENUOwogIH0KICBlbHNlIHsKICAgIHNickNvbmZpZ0RhdGEtPnN3aXRjaFRyYW5zcG9zZXJzID0gRkFMU0U7CiAgfQoKICBoRW52LT5lbmNFbnZEYXRhLnNicl94cG9zX2N0cmwgPSBwYXJhbXMtPnNicl94cG9zX2N0cmw7CgoKICAvKiBleHRlbmRlZCBkYXRhICovCiAgaWYocGFyYW1zLT5wYXJhbWV0cmljQ29kaW5nKSB7CiAgICBoRW52LT5lbmNFbnZEYXRhLmV4dGVuZGVkX2RhdGEgPSAxOwogIH0KICBlbHNlIHsKICAgIGhFbnYtPmVuY0VudkRhdGEuZXh0ZW5kZWRfZGF0YSA9IDA7CiAgfQoKICBoRW52LT5lbmNFbnZEYXRhLmV4dGVuc2lvbl9zaXplID0gMDsKCiAgc3RhcnRJbmRleCA9IFFNRl9GSUxURVJfUFJPVE9UWVBFX1NJWkUgLSBzYnJDb25maWdEYXRhLT5ub1FtZkJhbmRzOwoKICBzd2l0Y2ggKHBhcmFtcy0+c2JyRnJhbWVTaXplKSB7CiAgY2FzZSAyMzA0OgogICAgdGltZVNsb3RzID0gMTg7CiAgICBicmVhazsKICBjYXNlIDIwNDg6CiAgY2FzZSAxMDI0OgogICAgdGltZVNsb3RzID0gMTY7CiAgICBicmVhazsKICBjYXNlIDE5MjA6CiAgY2FzZSA5NjA6CiAgICB0aW1lU2xvdHMgPSAxNTsKICAgIGJyZWFrOwogIGNhc2UgMTE1MjoKICAgIHRpbWVTbG90cyA9IDk7CiAgICBicmVhazsKICBkZWZhdWx0OgogICAgcmV0dXJuICgxKTsgLyogSWxsZWdhbCBmcmFtZSBzaXplICovCiAgfQoKICB0aW1lU3RlcCA9IHNickNvbmZpZ0RhdGEtPm5vUW1mU2xvdHMgLyB0aW1lU2xvdHM7CgogIGlmICggRkRLc2JyRW5jX0luaXRUb25Db3JyUGFyYW1FeHRyKHBhcmFtcy0+c2JyRnJhbWVTaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhFbnYtPlRvbkNvcnIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyQ29uZmlnRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lU2xvdHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLT5zYnJfeHBvc19jdHJsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy0+YW5hX21heF9sZXZlbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJIZWFkZXJEYXRhLT5zYnJfbm9pc2VfYmFuZHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLT5ub2lzZUZsb29yT2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy0+dXNlU3BlZWNoQ29uZmlnKSApCiAgICByZXR1cm4oMSk7CgogIGhFbnYtPmVuY0VudkRhdGEubm9PZm5vaXNlYmFuZHMgPSBoRW52LT5Ub25Db3JyLnNick5vaXNlRmxvb3JFc3RpbWF0ZS5ub05vaXNlQmFuZHM7CgogIG5vaXNlQmFuZHNbMF0gPSBoRW52LT5lbmNFbnZEYXRhLm5vT2Zub2lzZWJhbmRzOwogIG5vaXNlQmFuZHNbMV0gPSBoRW52LT5lbmNFbnZEYXRhLm5vT2Zub2lzZWJhbmRzOwoKICBoRW52LT5lbmNFbnZEYXRhLnNicl9pbnZmX21vZGUgPSAoSU5WRl9NT0RFKXBhcmFtcy0+c2JyX2ludmZfbW9kZTsKCiAgaWYgKGhFbnYtPmVuY0VudkRhdGEuc2JyX2ludmZfbW9kZSA9PSBJTlZGX1NXSVRDSEVEKSB7CiAgICBoRW52LT5lbmNFbnZEYXRhLnNicl9pbnZmX21vZGUgPSBJTlZGX01JRF9MRVZFTDsKICAgIGhFbnYtPlRvbkNvcnIuc3dpdGNoSW52ZXJzZUZpbHQgPSBUUlVFOwogIH0KICBlbHNlIHsKICAgIGhFbnYtPlRvbkNvcnIuc3dpdGNoSW52ZXJzZUZpbHQgPSBGQUxTRTsKICB9CgoKICB0cmFuX2ZjICA9IHBhcmFtcy0+dHJhbl9mYzsKCiAgaWYgKHRyYW5fZmMgPT0gMCkKICAgIHRyYW5fZmMgPSBmaXhNaW4gKDUwMDAsIEZES3NickVuY19nZXRTYnJTdGFydEZyZXFSQVcgKHNickhlYWRlckRhdGEtPnNicl9zdGFydF9mcmVxdWVuY3ksNjQsc2JyQ29uZmlnRGF0YS0+c2FtcGxlRnJlcSkpOwoKCiAgdHJhbl9mYyA9ICh0cmFuX2ZjKjQqc2JyQ29uZmlnRGF0YS0+bm9RbWZCYW5kcy9zYnJDb25maWdEYXRhLT5zYW1wbGVGcmVxICsgMSk+PjE7CgogIGlmIChzYnJDb25maWdEYXRhLT5zYnJTeW50YXhGbGFncyAmIFNCUl9TWU5UQVhfTE9XX0RFTEFZKSB7CiAgICBmcmFtZVNoaWZ0ID0gTERfUFJFVFJBTl9PRkY7CiAgICB0cmFuX29mZiA9IExEX1BSRVRSQU5fT0ZGICsgRlJBTUVfTUlERExFX1NMT1RfNTEyTEQqdGltZVN0ZXA7CiAgfSBlbHNlCiAgewogICAgZnJhbWVTaGlmdCA9IDA7CiAgICBzd2l0Y2ggKHBhcmFtcy0+c2JyRnJhbWVTaXplKSB7CiAgICAgIC8qIFRoZSBmYWN0b3Igb2YgMiBpcyBieSBkZWZpbml0aW9uLiAqLwogICAgICBjYXNlIDIwNDg6IHRyYW5fb2ZmID0gOCArIEZSQU1FX01JRERMRV9TTE9UXzIwNDggKiB0aW1lU3RlcDsgYnJlYWs7CiAgICAgIGNhc2UgMTkyMDogdHJhbl9vZmYgPSA3ICsgRlJBTUVfTUlERExFX1NMT1RfMTkyMCAqIHRpbWVTdGVwOyBicmVhazsKICAgICAgZGVmYXVsdDogcmV0dXJuIDE7IGJyZWFrOwogICAgfQogIH0KICBpZiAoIEZES3NickVuY19Jbml0RXh0cmFjdFNickVudmVsb3BlICgmaEVudi0+c2JyRXh0cmFjdEVudmVsb3BlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyQ29uZmlnRGF0YS0+bm9RbWZTbG90cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickNvbmZpZ0RhdGEtPm5vUW1mQmFuZHMsIHN0YXJ0SW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lU2xvdHMsIHRpbWVTdGVwLCB0cmFuX29mZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlc0luaXRGbGFnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxjaGFuSW5FbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsZHluYW1pY19SQU0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLHNickNvbmZpZ0RhdGEtPnNiclN5bnRheEZsYWdzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApICkKICAgIHJldHVybigxKTsKCiAgaWYoRkRLc2JyRW5jX0luaXRTYnJDb2RlRW52ZWxvcGUgKCZoRW52LT5zYnJDb2RlRW52ZWxvcGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJDb25maWdEYXRhLT5uU2ZiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLT5kZWx0YVRBY3Jvc3NGcmFtZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMtPmRGX2VkZ2VfMXN0RW52LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLT5kRl9lZGdlX2luY3IpKQogICAgcmV0dXJuKDEpOwoKICBpZihGREtzYnJFbmNfSW5pdFNickNvZGVFbnZlbG9wZSAoJmhFbnYtPnNickNvZGVOb2lzZUZsb29yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9pc2VCYW5kcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy0+ZGVsdGFUQWNyb3NzRnJhbWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwwKSkKICAgIHJldHVybigxKTsKCiAgc2JyQ29uZmlnRGF0YS0+aW5pdEFtcFJlc0ZGID0gcGFyYW1zLT5pbml0X2FtcF9yZXNfRkY7CgogIGlmKEZES3NickVuY19Jbml0U2JySHVmZm1hblRhYmxlcyAoJmhFbnYtPmVuY0VudkRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICZoRW52LT5zYnJDb2RlRW52ZWxvcGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICZoRW52LT5zYnJDb2RlTm9pc2VGbG9vciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JySGVhZGVyRGF0YS0+c2JyX2FtcF9yZXMpKQogICByZXR1cm4oMSk7CgogIEZES3NickVuY19pbml0RnJhbWVJbmZvR2VuZXJhdG9yICgmaEVudi0+U2JyRW52RnJhbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMtPnNwcmVhZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMtPnN0YXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lU2xvdHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoRW52LT5lbmNFbnZEYXRhLmZyZXFfcmVzX2ZpeGZpeAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLGhFbnYtPmVuY0VudkRhdGEubGRHcmlkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwoKICBpZihGREtzYnJFbmNfSW5pdFNiclRyYW5zaWVudERldGVjdG9yICgmaEVudi0+c2JyVHJhbnNpZW50RGV0ZWN0b3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickNvbmZpZ0RhdGEtPmZyYW1lU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyQ29uZmlnRGF0YS0+c2FtcGxlRnJlcSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuX2ZjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJDb25maWdEYXRhLT5ub1FtZlNsb3RzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJDb25maWdEYXRhLT5ub1FtZkJhbmRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoRW52LT5zYnJFeHRyYWN0RW52ZWxvcGUuWUJ1ZmZlcldyaXRlT2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoRW52LT5zYnJFeHRyYWN0RW52ZWxvcGUuWUJ1ZmZlclN6U2hpZnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lU2hpZnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5fb2ZmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpCiAgcmV0dXJuKDEpOwoKCiAgc2JyQ29uZmlnRGF0YS0+eHBvc0N0cmxTd2l0Y2ggPSBwYXJhbXMtPnNicl94cG9zX2N0cmw7CgogIGhFbnYtPmVuY0VudkRhdGEubm9IYXJtb25pY3MgPSBzYnJDb25maWdEYXRhLT5uU2ZiW0hJXTsKICBoRW52LT5lbmNFbnZEYXRhLmFkZEhhcm1vbmljRmxhZyA9IDA7CgogIHJldHVybiAoMCk7Cn0KCklOVCBzYnJFbmNvZGVyX09wZW4oCiAgICAgICAgSEFORExFX1NCUl9FTkNPREVSICAqcGhTYnJFbmNvZGVyLAogICAgICAgIElOVCAgICAgICAgICAgICAgICAgIG5FbGVtZW50cywKICAgICAgICBJTlQgICAgICAgICAgICAgICAgICBuQ2hhbm5lbHMsCiAgICAgICAgSU5UICAgICAgICAgICAgICAgICAgc3VwcG9ydFBTCiAgICAgICAgKQp7CiAgSU5UIGk7CiAgSU5UIGVycm9yU3RhdHVzID0gMTsKICBIQU5ETEVfU0JSX0VOQ09ERVIgaFNickVuY29kZXIgPSBOVUxMOwoKICBpZiAocGhTYnJFbmNvZGVyPT1OVUxMCiAgICAgKQogIHsKICAgIGdvdG8gYmFpbDsKICB9CgogIGhTYnJFbmNvZGVyID0gR2V0UmFtX1NickVuY29kZXIoKTsKICBpZiAoaFNickVuY29kZXI9PU5VTEwpIHsKICAgIGdvdG8gYmFpbDsKICB9CiAgRkRLbWVtY2xlYXIoaFNickVuY29kZXIsIHNpemVvZihTQlJfRU5DT0RFUikpOwoKICAgICAgaFNickVuY29kZXItPnBTQlJkeW5hbWljX1JBTSA9IChVQ0hBUiopR2V0UmFtX1NickR5bmFtaWNfUkFNKCk7CiAgICAgIGhTYnJFbmNvZGVyLT5keW5hbWljUmFtID0gaFNickVuY29kZXItPnBTQlJkeW5hbWljX1JBTTsKCgogIGZvciAoaT0wOyBpPG5FbGVtZW50czsgaSsrKSB7CiAgICBoU2JyRW5jb2Rlci0+c2JyRWxlbWVudFtpXSA9IEdldFJhbV9TYnJFbGVtZW50KGkpOwogICAgaWYgKGhTYnJFbmNvZGVyLT5zYnJFbGVtZW50W2ldPT1OVUxMKSB7CiAgICAgICAgZ290byBiYWlsOwogICAgfQogICAgRkRLbWVtY2xlYXIoaFNickVuY29kZXItPnNickVsZW1lbnRbaV0sIHNpemVvZihTQlJfRUxFTUVOVCkpOwogICAgaFNickVuY29kZXItPnNickVsZW1lbnRbaV0tPnNickNvbmZpZ0RhdGEuZnJlcUJhbmRUYWJsZVtMT10gPSAgR2V0UmFtX1Nicl9mcmVxQmFuZFRhYmxlTE8oaSk7CiAgICBoU2JyRW5jb2Rlci0+c2JyRWxlbWVudFtpXS0+c2JyQ29uZmlnRGF0YS5mcmVxQmFuZFRhYmxlW0hJXSA9ICBHZXRSYW1fU2JyX2ZyZXFCYW5kVGFibGVISShpKTsKICAgIGhTYnJFbmNvZGVyLT5zYnJFbGVtZW50W2ldLT5zYnJDb25maWdEYXRhLnZfa19tYXN0ZXIgICAgICAgID0gIEdldFJhbV9TYnJfdl9rX21hc3RlcihpKTsKICAgIGlmICggKGhTYnJFbmNvZGVyLT5zYnJFbGVtZW50W2ldLT5zYnJDb25maWdEYXRhLmZyZXFCYW5kVGFibGVbTE9dPT1OVUxMKSB8fAogICAgICAgICAoaFNickVuY29kZXItPnNickVsZW1lbnRbaV0tPnNickNvbmZpZ0RhdGEuZnJlcUJhbmRUYWJsZVtISV09PU5VTEwpIHx8CiAgICAgICAgIChoU2JyRW5jb2Rlci0+c2JyRWxlbWVudFtpXS0+c2JyQ29uZmlnRGF0YS52X2tfbWFzdGVyPT1OVUxMKSApCiAgICB7CiAgICAgICAgZ290byBiYWlsOwogICAgfQogIH0KCiAgZm9yIChpPTA7IGk8bkNoYW5uZWxzOyBpKyspIHsKICAgIGhTYnJFbmNvZGVyLT5wU2JyQ2hhbm5lbFtpXSA9IEdldFJhbV9TYnJDaGFubmVsKGkpOwogICAgaWYgKGhTYnJFbmNvZGVyLT5wU2JyQ2hhbm5lbFtpXT09TlVMTCkgewogICAgICAgIGdvdG8gYmFpbDsKICAgIH0KCiAgICBpZiAoIGNyZWF0ZUVudkNoYW5uZWwoJmhTYnJFbmNvZGVyLT5wU2JyQ2hhbm5lbFtpXS0+aEVudkNoYW5uZWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGkKICAgICAgICAgICAgICAgICAgICAgICAgICAsaFNickVuY29kZXItPmR5bmFtaWNSYW0KICAgICAgICAgICAgICAgICAgICAgICAgICAgKSApCiAgICB7CiAgICAgICAgZ290byBiYWlsOwogICAgfQoKICB9CgogIGZvciAoaT0wOyBpPGZpeE1heChuQ2hhbm5lbHMsKHN1cHBvcnRQUyk/MjowKTsgaSsrKSB7CiAgICBoU2JyRW5jb2Rlci0+UW1mQW5hbHlzaXNbaV0uRmlsdGVyU3RhdGVzID0gR2V0UmFtX1Nicl9RbWZTdGF0ZXNBbmFseXNpcyhpKTsKICAgIGlmIChoU2JyRW5jb2Rlci0+UW1mQW5hbHlzaXNbaV0uRmlsdGVyU3RhdGVzPT1OVUxMKSB7CiAgICAgICAgZ290byBiYWlsOwogICAgfQogIH0KCiAgaWYgKHN1cHBvcnRQUykgewogICAgaWYgKFBTRW5jX0NyZWF0ZSgmaFNickVuY29kZXItPmhQYXJhbWV0cmljU3RlcmVvKSkKICAgIHsKICAgICAgZ290byBiYWlsOwogICAgfQoKICAgIGhTYnJFbmNvZGVyLT5xbWZTeW50aGVzaXNQUy5GaWx0ZXJTdGF0ZXMgPSBHZXRSYW1fUHNRbWZTdGF0ZXNTeW50aGVzaXMoKTsKICAgIGlmIChoU2JyRW5jb2Rlci0+cW1mU3ludGhlc2lzUFMuRmlsdGVyU3RhdGVzPT1OVUxMKSB7CiAgICAgIGdvdG8gYmFpbDsKICAgIH0KICB9ICAvKiBzdXBwb3J0UFMgKi8KCiAgKnBoU2JyRW5jb2RlciA9IGhTYnJFbmNvZGVyOwoKICBlcnJvclN0YXR1cyA9IDA7CiAgcmV0dXJuIGVycm9yU3RhdHVzOwoKYmFpbDoKICAvKiBDbG9zZSBTQlIgZW5jb2RlciBpbnN0YW5jZSAqLwogIHNickVuY29kZXJfQ2xvc2UoJmhTYnJFbmNvZGVyKTsKICByZXR1cm4gZXJyb3JTdGF0dXM7Cn0KCnN0YXRpYwpJTlQgRkRLc2JyRW5jX1JlYWxsb2NhdGUoCiAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9FTkNPREVSICAgaFNickVuY29kZXIsCiAgICAgICAgICAgICAgICAgICAgU0JSX0VMRU1FTlRfSU5GTyAgICAgZWxJbmZvWyg2KV0sCiAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgbm9FbGVtZW50cykKewogIElOVCB0b3RhbENoID0gMDsKICBJTlQgdG90YWxRbWYgPSAwOwogIElOVCBjb3JlRWw7CiAgSU5UIGVsPS0xOwoKICBoU2JyRW5jb2Rlci0+bGZlQ2hJZHggPSAtMTsgLyogZGVmYXVsdCB2YWx1ZSwgdW50aWwgbGZlIGZvdW5kICovCgogIGZvciAoY29yZUVsPTA7IGNvcmVFbDxub0VsZW1lbnRzOyBjb3JlRWwrKykKICB7CiAgICAvKiBTQlIgb25seSBoYW5kbGVzIFNDRSBhbmQgQ1BFJ3MgKi8KICAgIGlmIChlbEluZm9bY29yZUVsXS5lbFR5cGUgPT0gSURfU0NFIHx8IGVsSW5mb1tjb3JlRWxdLmVsVHlwZSA9PSBJRF9DUEUpIHsKICAgICAgZWwrKzsKICAgIH0gZWxzZSB7CiAgICAgIGlmIChlbEluZm9bY29yZUVsXS5lbFR5cGUgPT0gSURfTEZFKSB7CiAgICAgICAgICBoU2JyRW5jb2Rlci0+bGZlQ2hJZHggPSBlbEluZm9bY29yZUVsXS5DaGFubmVsSW5kZXhbMF07CiAgICAgIH0KICAgICAgY29udGludWU7CiAgICB9CgogICAgU0JSX0VMRU1FTlRfSU5GTyAgICAqcGVsSW5mbyA9ICZlbEluZm9bY29yZUVsXTsKICAgIEhBTkRMRV9TQlJfRUxFTUVOVCAgaFNickVsZW1lbnQgPSBoU2JyRW5jb2Rlci0+c2JyRWxlbWVudFtlbF07CgogICAgaW50IGNoOwogICAgZm9yICggY2ggPSAwOyBjaCA8IHBlbEluZm8tPm5DaGFubmVsc0luRWw7IGNoKysgKSB7CiAgICAgIGhTYnJFbGVtZW50LT5zYnJDaGFubmVsW2NoXSA9IGhTYnJFbmNvZGVyLT5wU2JyQ2hhbm5lbFt0b3RhbENoXTsKICAgICAgdG90YWxDaCsrOwogICAgfQogICAgLyogYW5hbHlzaXMgUU1GICovCiAgICBmb3IgKCBjaCA9IDA7IGNoIDwgKChwZWxJbmZvLT5mUGFyYW1ldHJpY1N0ZXJlbyk/MjpwZWxJbmZvLT5uQ2hhbm5lbHNJbkVsKTsgY2grKyApIHsKICAgICAgaFNickVsZW1lbnQtPmVsSW5mby5DaGFubmVsSW5kZXhbY2hdID0gcGVsSW5mby0+Q2hhbm5lbEluZGV4W2NoXTsKICAgICAgaFNickVsZW1lbnQtPmhRbWZBbmFseXNpc1tjaF0gPSAmaFNickVuY29kZXItPlFtZkFuYWx5c2lzW3RvdGFsUW1mKytdOwogICAgfQoKICAgIC8qIENvcHkgRWxlbWVudCBpbmZvICovCiAgICBoU2JyRWxlbWVudC0+ZWxJbmZvLmVsVHlwZSAgICAgICAgICAgID0gcGVsSW5mby0+ZWxUeXBlOwogICAgaFNickVsZW1lbnQtPmVsSW5mby5pbnN0YW5jZVRhZyAgICAgICA9IHBlbEluZm8tPmluc3RhbmNlVGFnOwogICAgaFNickVsZW1lbnQtPmVsSW5mby5uQ2hhbm5lbHNJbkVsICAgICA9IHBlbEluZm8tPm5DaGFubmVsc0luRWw7CiAgICBoU2JyRWxlbWVudC0+ZWxJbmZvLmZQYXJhbWV0cmljU3RlcmVvID0gcGVsSW5mby0+ZlBhcmFtZXRyaWNTdGVyZW87CiAgfSAvKiBjb3JlRWwgKi8KCiAgcmV0dXJuIDA7Cn0KCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgogZnVuY3Rpb25uYW1lOiBGREtzYnJFbmNfRW52SW5pdAogZGVzY3JpcHRpb246ICBpbml0aWFsaXplcyBwYXJhbWV0ZXJzCiByZXR1cm5zOiAgICAgIGVycm9yIHN0YXR1cwogaW5wdXQ6CiBvdXRwdXQ6ICAgICAgIGhFbnYKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMKSU5UIEZES3NickVuY19FbnZJbml0ICgKICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0VMRU1FTlQgICBoU2JyRWxlbWVudCwKICAgICAgICAgICAgICAgICAgICAgICBzYnJDb25maWd1cmF0aW9uUHRyIHBhcmFtcywKICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAqY29yZUJhbmRXaXRoLAogICAgICAgICAgICAgICAgICAgICAgIEFVRElPX09CSkVDVF9UWVBFIGFvdCwKICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgbkJpdHN0ckRlbGF5LAogICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICBuRWxlbWVudCwKICAgICAgICAgICAgICAgICAgICAgICBVTE9ORyAgICAgc3RhdGVzSW5pdEZsYWcKICAgICAgICAgICAgICAgICAgICAgICxVQ0hBUiAgICAqZHluYW1pY19SQU0KICAgICAgICAgICAgICAgICAgICAgICkKewogIFVDSEFSICAgICpiaXRzdHJlYW1CdWZmZXI7CiAgaW50IGNoLCBpOwoKICBpZiAoKHBhcmFtcy0+Y29kZWNTZXR0aW5ncy5uQ2hhbm5lbHMgPCAxKSB8fCAocGFyYW1zLT5jb2RlY1NldHRpbmdzLm5DaGFubmVscyA+IE1BWF9OVU1fQ0hBTk5FTFMpKXsKICAgIHJldHVybigxKTsKICB9CgogIC8qIGluaXRpYWxpemUgdGhlIGVuY29kZXIgaGFuZGxlICBhbmQgc3RydWN0cyovCiAgYml0c3RyZWFtQnVmZmVyID0gaFNickVsZW1lbnQtPnBheWxvYWREZWxheUxpbmVbbkJpdHN0ckRlbGF5XTsKCiAgLyogaW5pdCBhbmQgc2V0IHN5bnRheCBmbGFncyAqLwogIGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLnNiclN5bnRheEZsYWdzID0gMDsKCiAgc3dpdGNoIChhb3QpIHsKICBjYXNlIEFPVF9EUk1fTVBFR19QUzoKICBjYXNlIEFPVF9EUk1fU0JSOgogICAgaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEuc2JyU3ludGF4RmxhZ3MgfD0gU0JSX1NZTlRBWF9TQ0FMQUJMRTsKICAgIGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLnNiclN5bnRheEZsYWdzIHw9IFNCUl9TWU5UQVhfRFJNX0NSQzsKICAgIGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLnNiclN5bnRheEZsYWdzIHw9IFNCUl9TWU5UQVhfQ1JDOwogICAgYnJlYWs7CiAgY2FzZSBBT1RfRVJfQUFDX0VMRDoKICAgIGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLnNiclN5bnRheEZsYWdzIHw9IFNCUl9TWU5UQVhfTE9XX0RFTEFZOwogICAgYnJlYWs7CiAgZGVmYXVsdDoKICAgIGJyZWFrOwogIH0KICBpZiAocGFyYW1zLT5jcmNTYnIpIHsKICAgIGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLnNiclN5bnRheEZsYWdzIHw9IFNCUl9TWU5UQVhfQ1JDOwogIH0KCiAgaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEubm9RbWZCYW5kcyA9IFFNRl9DSEFOTkVMUzsKICBoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5ub1FtZlNsb3RzID0gcGFyYW1zLT5zYnJGcmFtZVNpemUvaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEubm9RbWZCYW5kczsKCiAgRkRLaW5pdEJpdFN0cmVhbSgmaFNickVsZW1lbnQtPkNtb25EYXRhLnNickJpdGJ1ZiwgYml0c3RyZWFtQnVmZmVyLCBNQVhfUEFZTE9BRF9TSVpFKnNpemVvZihVQ0hBUiksIDAsIEJTX1dSSVRFUik7CgogIC8qCiAgICBub3cgaW5pdGlhbGl6ZSBzYnJDb25maWdEYXRhLCBzYnJIZWFkZXJEYXRhIGFuZCBzYnJCaXRzdHJlYW1EYXRhLAogICovCiAgaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEubkNoYW5uZWxzID0gcGFyYW1zLT5jb2RlY1NldHRpbmdzLm5DaGFubmVsczsKCiAgaWYocGFyYW1zLT5jb2RlY1NldHRpbmdzLm5DaGFubmVscyA9PSAyKQogICAgIGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLnN0ZXJlb01vZGUgPSBwYXJhbXMtPnN0ZXJlb01vZGU7CiAgZWxzZQogICAgIGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLnN0ZXJlb01vZGUgPSBTQlJfTU9OTzsKCiAgaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEuZnJhbWVTaXplICAgPSBwYXJhbXMtPnNickZyYW1lU2l6ZTsKCiAgLyogaW1wbGljaXQgcnVsZSBmb3Igc2FtcGxlUmF0ZU1vZGUgKi8KICAvKiBydW4gaW4gIm11bHRpcmF0ZSIgbW9kZSB3aGVyZSBzYnIgZnMgaXMgMiAqIGNvZGVjIGZzICovCiAgaFNickVsZW1lbnQtPnNickhlYWRlckRhdGEuc2FtcGxlUmF0ZU1vZGUgPSBEVUFMX1JBVEU7CiAgaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEuc2FtcGxlRnJlcSA9IDIgKiBwYXJhbXMtPmNvZGVjU2V0dGluZ3Muc2FtcGxlRnJlcTsKCiAgaFNickVsZW1lbnQtPnNickJpdHN0cmVhbURhdGEuQ291bnRTZW5kSGVhZGVyRGF0YSA9IDA7CiAgaWYgKHBhcmFtcy0+U2VuZEhlYWRlckRhdGFUaW1lID4gMCApIHsKCiAgICBoU2JyRWxlbWVudC0+c2JyQml0c3RyZWFtRGF0YS5OclNlbmRIZWFkZXJEYXRhID0gKElOVCkocGFyYW1zLT5TZW5kSGVhZGVyRGF0YVRpbWUgKiBoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5zYW1wbGVGcmVxCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyAoMTAwMCAqIGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLmZyYW1lU2l6ZSkpOwogICAgaFNickVsZW1lbnQtPnNickJpdHN0cmVhbURhdGEuTnJTZW5kSGVhZGVyRGF0YSA9IGZpeE1heChoU2JyRWxlbWVudC0+c2JyQml0c3RyZWFtRGF0YS5OclNlbmRIZWFkZXJEYXRhLDEpOwogIH0KICBlbHNlIHsKICAgaFNickVsZW1lbnQtPnNickJpdHN0cmVhbURhdGEuTnJTZW5kSGVhZGVyRGF0YSA9IDA7CiAgfQoKICBoU2JyRWxlbWVudC0+c2JySGVhZGVyRGF0YS5zYnJfZGF0YV9leHRyYSA9IHBhcmFtcy0+c2JyX2RhdGFfZXh0cmE7CiAgaFNickVsZW1lbnQtPnNickJpdHN0cmVhbURhdGEuSGVhZGVyQWN0aXZlID0gMDsKICBoU2JyRWxlbWVudC0+c2JySGVhZGVyRGF0YS5zYnJfc3RhcnRfZnJlcXVlbmN5ID0gcGFyYW1zLT5zdGFydEZyZXE7CiAgaFNickVsZW1lbnQtPnNickhlYWRlckRhdGEuc2JyX3N0b3BfZnJlcXVlbmN5ICA9IHBhcmFtcy0+c3RvcEZyZXE7CiAgaFNickVsZW1lbnQtPnNickhlYWRlckRhdGEuc2JyX3hvdmVyX2JhbmQgPSAwOwogIGhTYnJFbGVtZW50LT5zYnJIZWFkZXJEYXRhLnNicl9sY19zdGVyZW9fbW9kZSA9IDA7CgogIC8qIGRhdGFfZXh0cmEgKi8KICBpZiAocGFyYW1zLT5zYnJfeHBvc19jdHJsIT0gU0JSX1hQT1NfQ1RSTF9ERUZBVUxUKQogICAgIGhTYnJFbGVtZW50LT5zYnJIZWFkZXJEYXRhLnNicl9kYXRhX2V4dHJhID0gMTsKCiAgaFNickVsZW1lbnQtPnNickhlYWRlckRhdGEuc2JyX2FtcF9yZXMgPSAoQU1QX1JFUylwYXJhbXMtPmFtcF9yZXM7CgogIC8qIGhlYWRlcl9leHRyYV8xICovCiAgaFNickVsZW1lbnQtPnNickhlYWRlckRhdGEuZnJlcVNjYWxlICA9IHBhcmFtcy0+ZnJlcVNjYWxlOwogIGhTYnJFbGVtZW50LT5zYnJIZWFkZXJEYXRhLmFsdGVyU2NhbGUgPSBwYXJhbXMtPmFsdGVyU2NhbGU7CiAgaFNickVsZW1lbnQtPnNickhlYWRlckRhdGEuc2JyX25vaXNlX2JhbmRzID0gcGFyYW1zLT5zYnJfbm9pc2VfYmFuZHM7CiAgaFNickVsZW1lbnQtPnNickhlYWRlckRhdGEuaGVhZGVyX2V4dHJhXzEgPSAwOwoKICBpZiAoKHBhcmFtcy0+ZnJlcVNjYWxlICE9IFNCUl9GUkVRX1NDQUxFX0RFRkFVTFQpIHx8CiAgICAgIChwYXJhbXMtPmFsdGVyU2NhbGUgIT0gU0JSX0FMVEVSX1NDQUxFX0RFRkFVTFQpIHx8CiAgICAgIChwYXJhbXMtPnNicl9ub2lzZV9iYW5kcyAhPSBTQlJfTk9JU0VfQkFORFNfREVGQVVMVCkpCiAgewogICBoU2JyRWxlbWVudC0+c2JySGVhZGVyRGF0YS5oZWFkZXJfZXh0cmFfMSA9IDE7CiAgfQoKICAvKiBoZWFkZXJfZXh0cmFfMiAqLwogIGhTYnJFbGVtZW50LT5zYnJIZWFkZXJEYXRhLnNicl9saW1pdGVyX2JhbmRzID0gcGFyYW1zLT5zYnJfbGltaXRlcl9iYW5kczsKICBoU2JyRWxlbWVudC0+c2JySGVhZGVyRGF0YS5zYnJfbGltaXRlcl9nYWlucyA9IHBhcmFtcy0+c2JyX2xpbWl0ZXJfZ2FpbnM7CgogIGlmICgoaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEuc2FtcGxlRnJlcSA+IDQ4MDAwKSAmJgogICAgICAoaFNickVsZW1lbnQtPnNickhlYWRlckRhdGEuc2JyX3N0YXJ0X2ZyZXF1ZW5jeSA+PSA5KSkKICB7CiAgICBoU2JyRWxlbWVudC0+c2JySGVhZGVyRGF0YS5zYnJfbGltaXRlcl9nYWlucyA9IFNCUl9MSU1JVEVSX0dBSU5TX0lORklOSVRFOwogIH0KCiAgaFNickVsZW1lbnQtPnNickhlYWRlckRhdGEuc2JyX2ludGVycG9sX2ZyZXEgPSBwYXJhbXMtPnNicl9pbnRlcnBvbF9mcmVxOwogIGhTYnJFbGVtZW50LT5zYnJIZWFkZXJEYXRhLnNicl9zbW9vdGhpbmdfbGVuZ3RoID0gcGFyYW1zLT5zYnJfc21vb3RoaW5nX2xlbmd0aDsKICBoU2JyRWxlbWVudC0+c2JySGVhZGVyRGF0YS5oZWFkZXJfZXh0cmFfMiA9IDA7CgogIGlmICgocGFyYW1zLT5zYnJfbGltaXRlcl9iYW5kcyAhPSBTQlJfTElNSVRFUl9CQU5EU19ERUZBVUxUKSB8fAogICAgICAocGFyYW1zLT5zYnJfbGltaXRlcl9nYWlucyAhPSBTQlJfTElNSVRFUl9HQUlOU19ERUZBVUxUKSB8fAogICAgICAocGFyYW1zLT5zYnJfaW50ZXJwb2xfZnJlcSAhPSBTQlJfSU5URVJQT0xfRlJFUV9ERUZBVUxUKSB8fAogICAgICAocGFyYW1zLT5zYnJfc21vb3RoaW5nX2xlbmd0aCAhPSBTQlJfU01PT1RISU5HX0xFTkdUSF9ERUZBVUxUKSkKICB7CiAgICAgaFNickVsZW1lbnQtPnNickhlYWRlckRhdGEuaGVhZGVyX2V4dHJhXzIgPSAxOwogIH0KCiAgIC8qIG90aGVyIHN3aXRjaGVzICovCiAgaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEudXNlV2F2ZUNvZGluZyAgICAgICAgICAgICA9IHBhcmFtcy0+dXNlV2F2ZUNvZGluZzsKICBoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS51c2VQYXJhbWV0cmljQ29kaW5nICAgICAgID0gcGFyYW1zLT5wYXJhbWV0cmljQ29kaW5nOwoKICAvKiBpbml0IGZyZXEgYmFuZCB0YWJsZSAqLwogIGlmKHVwZGF0ZUZyZXFCYW5kVGFibGUoJmhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgJmhTYnJFbGVtZW50LT5zYnJIZWFkZXJEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEubm9RbWZCYW5kcykpCiAgewogICAgcmV0dXJuKDEpOwogIH0KCiAgLyogbm93IGNyZWF0ZSBlbnZlbG9wZSBleHQgYW5kIFFNRiBmb3IgZWFjaCBhdmFpbGFibGUgY2hhbm5lbCAqLwogIGZvciAoIGNoID0gMDsgY2ggPCBoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5uQ2hhbm5lbHM7IGNoKysgKSB7CgogICAgIGlmICggaW5pdEVudkNoYW5uZWwoJmhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgJmhTYnJFbGVtZW50LT5zYnJIZWFkZXJEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgJmhTYnJFbGVtZW50LT5zYnJDaGFubmVsW2NoXS0+aEVudkNoYW5uZWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlc0luaXRGbGFnCiAgICAgICAgICAgICAgICAgICAgICAgICxjaAogICAgICAgICAgICAgICAgICAgICAgICAsZHluYW1pY19SQU0KICAgICAgICAgICAgICAgICAgICAgICAgICkgKQogICAgIHsKICAgICAgIHJldHVybigxKTsKICAgICB9CgoKICB9IC8qIG5DaGFubmVscyAqLwoKICAvKiByZXNldCBhbmQgaW50aWFsaXplIGFuYWx5c2lzIHFtZiAqLwogIGZvciAoIGNoID0gMDsgY2ggPCAoKGhTYnJFbGVtZW50LT5lbEluZm8uZlBhcmFtZXRyaWNTdGVyZW8pPzI6aFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEubkNoYW5uZWxzKTsgY2grKyApCiAgewogICAgaW50IGVycjsKICAgIFVJTlQgcW1mRmxhZ3MgPSAoaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEuc2JyU3ludGF4RmxhZ3MgJiBTQlJfU1lOVEFYX0xPV19ERUxBWSkgPyBRTUZfRkxBR19DTERGQiA6IDA7CiAgICBpZiAoc3RhdGVzSW5pdEZsYWcpCiAgICAgIHFtZkZsYWdzICY9IH5RTUZfRkxBR19LRUVQX1NUQVRFUzsKICAgIGVsc2UKICAgICAgcW1mRmxhZ3MgfD0gIFFNRl9GTEFHX0tFRVBfU1RBVEVTOwoKICAgIGVyciA9IHFtZkluaXRBbmFseXNpc0ZpbHRlckJhbmsoIGhTYnJFbGVtZW50LT5oUW1mQW5hbHlzaXNbY2hdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZJWFBfUUFTKiloU2JyRWxlbWVudC0+aFFtZkFuYWx5c2lzW2NoXS0+RmlsdGVyU3RhdGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEubm9RbWZTbG90cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLm5vUW1mQmFuZHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5ub1FtZkJhbmRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEubm9RbWZCYW5kcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFtZkZsYWdzICk7CiAgfQoKICAvKiAgKi8KICBoU2JyRWxlbWVudC0+Q21vbkRhdGEueE92ZXJGcmVxID0gaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEueE92ZXJGcmVxOwogIGhTYnJFbGVtZW50LT5DbW9uRGF0YS5keW5Cd0VuYWJsZWQgPSAocGFyYW1zLT5keW5Cd1N1cHBvcnRlZCAmJiBwYXJhbXMtPmR5bkJ3RW5hYmxlZCk7CiAgaFNickVsZW1lbnQtPkNtb25EYXRhLmR5blhPdmVyRnJlcUVuYyA9IEZES3NickVuY19TYnJHZXRYT3ZlckZyZXEoIGhTYnJFbGVtZW50LCBoU2JyRWxlbWVudC0+Q21vbkRhdGEueE92ZXJGcmVxKTsKICBmb3IgKCBpID0gMDsgaSA8IDU7IGkrKyApCiAgICAgIGhTYnJFbGVtZW50LT5keW5YT3ZlckZyZXFEZWxheVtpXSA9IGhTYnJFbGVtZW50LT5DbW9uRGF0YS5keW5YT3ZlckZyZXFFbmM7CiAgaFNickVsZW1lbnQtPkNtb25EYXRhLnNick51bUNoYW5uZWxzICA9IGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLm5DaGFubmVsczsKICBoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5keW5YT3ZlckZyZXEgPSBoU2JyRWxlbWVudC0+Q21vbkRhdGEueE92ZXJGcmVxOwoKICAvKiBVcGRhdGUgQmFuZHdpdGggdG8gYmUgcGFzc2VkIHRvIHRoZSBjb3JlIGVuY29kZXIgKi8KICAqY29yZUJhbmRXaXRoID0gaFNickVsZW1lbnQtPkNtb25EYXRhLnhPdmVyRnJlcTsKCiAgcmV0dXJuKDApOwogfQoKSU5UIHNickVuY29kZXJfR2V0SW5CdWZmZXJTaXplKGludCBub0NoYW5uZWxzKQp7CiAgSU5UIHRlbXA7CgogIHRlbXAgPSAoMTAyNCpET1dOX1NNUExfRkFDKTsKICB0ZW1wICs9IDEwMjQgKyBNQVhfU0FNUExFX0RFTEFZOwogIHRlbXAgKj0gbm9DaGFubmVsczsKICB0ZW1wICo9IHNpemVvZihJTlRfUENNKTsKICByZXR1cm4gdGVtcDsKfQoKLyoKICogRW5jb2RlIER1bW15IFNCUiBwYXlsb2FkIGZyYW1lcyB0byBmaWxsIHRoZSBkZWxheSBsaW5lcy4KICovCnN0YXRpYwpJTlQgRkRLc2JyRW5jX0RlbGF5Q29tcGVuc2F0aW9uICgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfRU5DT0RFUiBoRW52RW5jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UX1BDTSAqdGltZUJ1ZmZlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCnsKICAgIGludCBuLCBlbDsKCiAgICBmb3IgKG49aEVudkVuYy0+bkJpdHN0ckRlbGF5OyBuPjA7IG4tLSkKICAgIHsKICAgICAgZm9yIChlbD0wOyBlbDxoRW52RW5jLT5ub0VsZW1lbnRzOyBlbCsrKQogICAgICB7CiAgICAgICAgaWYgKEZES3NickVuY19FbnZFbmNvZGVGcmFtZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhFbnZFbmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVCdWZmZXIgKyBoRW52RW5jLT5kb3duc2FtcGxlZE9mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhFbnZFbmMtPnNickVsZW1lbnRbZWxdLT5zYnJDb25maWdEYXRhLm5DaGFubmVscywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApKQogICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgc2JyRW5jb2Rlcl9VcGRhdGVCdWZmZXJzKGhFbnZFbmMsIHRpbWVCdWZmZXIpOwogICAgICB9CiAgICB9CgkgIHJldHVybiAwOwp9CgpVSU5UIHNickVuY29kZXJfTGltaXRCaXRSYXRlKFVJTlQgYml0UmF0ZSwgVUlOVCBudW1DaGFubmVscywgVUlOVCBjb3JlU2FtcGxlUmF0ZSwgQVVESU9fT0JKRUNUX1RZUEUgYW90KQp7CiAgVUlOVCBuZXdCaXRSYXRlOwogIElOVCBpbmRleDsKCiAgRkRLX0FTU0VSVChudW1DaGFubmVscyA+IDAgJiYgbnVtQ2hhbm5lbHMgPD0gMik7CiAgaWYgKGFvdCA9PSBBT1RfUFMpIHsKICAgIGlmIChudW1DaGFubmVscyA9PSAyKSB7CiAgICAgIGluZGV4ID0gZ2V0UHNUdW5pbmdUYWJsZUluZGV4KGJpdFJhdGUsICZuZXdCaXRSYXRlKTsKICAgICAgaWYgKGluZGV4ID09IElOVkFMSURfVEFCTEVfSURYKSB7CiAgICAgICAgYml0UmF0ZSA9IG5ld0JpdFJhdGU7CiAgICAgIH0KICAgICAgLyogU2V0IG51bUNoYW5uZWxzIHRvIDEgYmVjYXVzZSBmb3IgUFMgd2UgbmVlZCBhIFNCUiBTQ0UgKG1vbm8pIGVsZW1lbnQuICovCiAgICAgIG51bUNoYW5uZWxzID0gMTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAwOwogICAgfQogIH0KICBpbmRleCA9IGdldFNiclR1bmluZ1RhYmxlSW5kZXgoYml0UmF0ZSwgbnVtQ2hhbm5lbHMsIGNvcmVTYW1wbGVSYXRlLCBhb3QsICZuZXdCaXRSYXRlKTsKICBpZiAoaW5kZXggIT0gSU5WQUxJRF9UQUJMRV9JRFgpIHsKICAgIG5ld0JpdFJhdGUgPSBiaXRSYXRlOwogIH0KCiAgcmV0dXJuIG5ld0JpdFJhdGU7Cn0KCgpJTlQgc2JyRW5jb2Rlcl9Jbml0KAogICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0VOQ09ERVIgaFNickVuY29kZXIsCiAgICAgICAgICAgICAgICAgICAgIFNCUl9FTEVNRU5UX0lORk8gZWxJbmZvWyg2KV0sCiAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgbm9FbGVtZW50cywKICAgICAgICAgICAgICAgICAgICAgSU5UX1BDTSAqaW5wdXRCdWZmZXIsCiAgICAgICAgICAgICAgICAgICAgIElOVCAgICpjb3JlQmFuZHdpZHRoLAogICAgICAgICAgICAgICAgICAgICBJTlQgICAqaW5wdXRCdWZmZXJPZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgIElOVCAgICpudW1DaGFubmVscywKICAgICAgICAgICAgICAgICAgICAgSU5UICAgKnNhbXBsZVJhdGUsCiAgICAgICAgICAgICAgICAgICAgIElOVCAgICpmcmFtZUxlbmd0aCwKICAgICAgICAgICAgICAgICAgICAgQVVESU9fT0JKRUNUX1RZUEUgKmFvdCwKICAgICAgICAgICAgICAgICAgICAgaW50ICpkZWxheSwKICAgICAgICAgICAgICAgICAgICAgaW50ICB0cmFuc2Zvcm1GYWN0b3IsCiAgICAgICAgICAgICAgICAgICAgIFVMT05HICBzdGF0ZXNJbml0RmxhZwogICAgICAgICAgICAgICAgICAgICkKewogICAgSEFORExFX0VSUk9SX0lORk8gZXJyb3JJbmZvID0gbm9FcnJvcjsKICAgIHNickNvbmZpZ3VyYXRpb24gc2JyQ29uZmlnWyg2KV07CiAgICBJTlQgZXJyb3IgPSAwOwogICAgSU5UIGxvd2VzdEJhbmR3aWR0aDsKICAgIC8qIFNhdmUgaW5wdXQgcGFyYW1ldGVycyAqLwogICAgSU5UIGlucHV0U2FtcGxlUmF0ZSA9ICpzYW1wbGVSYXRlOwogICAgaW50IGNvcmVGcmFtZUxlbmd0aCA9ICpmcmFtZUxlbmd0aDsKICAgIGludCBpbnB1dEJhbmRXaWR0aCA9ICpjb3JlQmFuZHdpZHRoOwogICAgaW50IGlucHV0Q2hhbm5lbHMgPSAqbnVtQ2hhbm5lbHM7CgogICAgaW50IGRvd25zYW1wbGVkT2Zmc2V0ID0gMDsKICAgIGludCBzYnJPZmZzZXQgPSAwOwogICAgaW50IGRvd25zYW1wbGVyRGVsYXkgPSAwOwogICAgaW50IGRvd25zYW1wbGUgPSAwOwogICAgaW50IG5CaXRzdHJEZWxheSA9IDA7CiAgICBpbnQgbG93ZXN0U2JyU3RhcnRGcmVxLCBsb3dlc3RTYnJTdG9wRnJlcTsKICAgIGludCBsb3dEZWxheSA9IDA7CiAgICBpbnQgdXNlUHMgPSAwOwoKICAgIC8qIGNoZWNrIHdoZXRoZXIgU0JSIHNldHRpbmcgaXMgYXZhaWxhYmxlIGZvciB0aGUgY3VycmVudCBlbmNvZGVyIGNvbmZpZ3VyYXRpb24gKGJpdHJhdGUsIHNhbXBsZXJhdGUpICovCiAgICBpZiAoICgqYW90PT1BT1RfUFMpIHx8ICgqYW90PT1BT1RfTVAyX1BTKSB8fCAoKmFvdD09QU9UX0RBQlBMVVNfUFMpIHx8ICgqYW90PT1BT1RfRFJNX01QRUdfUFMpICkgewogICAgICAgIHVzZVBzID0gMTsKICAgIH0KICAgIGlmICggKCphb3Q9PUFPVF9FUl9BQUNfRUxEKSApIHsKICAgICAgICBsb3dEZWxheSA9IDE7CiAgICB9CiAgICBlbHNlIGlmICggKCphb3Q9PUFPVF9FUl9BQUNfTEQpICkgewogICAgICAgIGVycm9yID0gMTsKICAgICAgICBnb3RvIGJhaWw7CiAgICB9CgogICAgLyogUGFyYW1ldHJpYyBTdGVyZW8gKi8KICAgIGlmICggdXNlUHMgKSB7CiAgICAgIGlmICggKm51bUNoYW5uZWxzID09IDIgJiYgbm9FbGVtZW50cyA9PSAxKSB7CiAgICAgICAgLyogT3ZlcnJpZGUgRWxlbWVudCB0eXBlIGluIGNhc2Ugb2YgUGFyYW1ldHJpYyBzdGVyZW8gKi8KICAgICAgICBlbEluZm9bMF0uZWxUeXBlID0gSURfU0NFOwogICAgICAgIGVsSW5mb1swXS5mUGFyYW1ldHJpY1N0ZXJlbyA9IDE7CiAgICAgICAgZWxJbmZvWzBdLm5DaGFubmVsc0luRWwgPSAxOwogICAgICAgIC8qIGNvcmUgZW5jb2RlciBnZXRzIGRvd25taXhlZCBtb25vIHNpZ25hbCAqLwogICAgICAgICpudW1DaGFubmVscyAgPSAxOwogICAgICB9IGVsc2UgewogICAgICAgIHN3aXRjaCAoKmFvdCkgewogICAgICAgICAgY2FzZSBBT1RfTVAyX1BTOgogICAgICAgICAgICAqYW90ID0gQU9UX01QMl9TQlI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBBT1RfREFCUExVU19QUzoKICAgICAgICAgICAgKmFvdCA9IEFPVF9EQUJQTFVTX1NCUjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIEFPVF9EUk1fTVBFR19QUzoKICAgICAgICAgICAgKmFvdCA9IEFPVF9EUk1fU0JSOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgQU9UX1BTOgogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgKmFvdCA9IEFPVF9TQlI7CiAgICAgICAgfQogICAgICAgIHVzZVBzID0gMDsKICAgICAgfQogICAgfSAvKiB1c2VQcyAqLwoKICAgIC8qIGNoZWNrIHdoZXRoZXIgU0JSIHNldHRpbmcgaXMgYXZhaWxhYmxlIGZvciB0aGUgY3VycmVudCBlbmNvZGVyIGNvbmZpZ3VyYXRpb24gKGJpdHJhdGUsIHNhbXBsZXJhdGUpICovCiAgICB7CiAgICAgIGludCBkZWxheURpZmYgPSAwOwogICAgICBpbnQgZWwsIGNvcmVFbDsKCiAgICAgIC8qIENoZWNrIGlmIGV2ZXJ5IGVsZW1lbnQgY29uZmlnIGlzIGZlYXNpYmxlICovCiAgICAgIGZvciAoY29yZUVsPTA7IGNvcmVFbDxub0VsZW1lbnRzOyBjb3JlRWwrKykKICAgICAgewogICAgICAgIC8qIFNCUiBvbmx5IGhhbmRsZXMgU0NFIGFuZCBDUEUncyAqLwogICAgICAgIGlmIChlbEluZm9bY29yZUVsXS5lbFR5cGUgIT0gSURfU0NFICYmIGVsSW5mb1tjb3JlRWxdLmVsVHlwZSAhPSBJRF9DUEUpIHsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICAvKiBjaGVjayBpZiBkZXNpcmVkIGNvbmZpZ3VyYXRpb24gaXMgYXZhaWxhYmxlICovCiAgICAgICAgaWYgKCAhRkRLc2JyRW5jX0lzU2JyU2V0dGluZ0F2YWlsIChlbEluZm9bY29yZUVsXS5iaXRSYXRlLCAwLCBlbEluZm9bY29yZUVsXS5uQ2hhbm5lbHNJbkVsLCBpbnB1dFNhbXBsZVJhdGUsICphb3QpICkKICAgICAgICB7CiAgICAgICAgICAgIC8qIG90aGVyd2lzZSAtIGNoYW5nZSB0byBBQUMtTEMgKi8KICAgICAgICAgICAgc3dpdGNoICgqYW90KSB7CiAgICAgICAgICAgICAgY2FzZSBBT1RfTVAyX1NCUjoKICAgICAgICAgICAgICBjYXNlIEFPVF9NUDJfUFM6CiAgICAgICAgICAgICAgICAqYW90ID0gQU9UX01QMl9BQUNfTEM7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICBjYXNlIEFPVF9EQUJQTFVTX1NCUjoKICAgICAgICAgICAgICBjYXNlIEFPVF9EQUJQTFVTX1BTOgogICAgICAgICAgICAgICAgKmFvdCA9IEFPVF9EQUJQTFVTX0FBQ19MQzsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIGNhc2UgQU9UX0RSTV9TQlI6CiAgICAgICAgICAgICAgY2FzZSBBT1RfRFJNX01QRUdfUFM6CiAgICAgICAgICAgICAgICAqYW90ID0gQU9UX0RSTV9BQUM7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICBjYXNlIEFPVF9FUl9BQUNfRUxEOgogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgY2FzZSBBT1RfU0JSOgogICAgICAgICAgICAgIGNhc2UgQU9UX1BTOgogICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAqYW90ID0gQU9UX0FBQ19MQzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlcnJvciA9IDE7CiAgICAgICAgICAgIGdvdG8gYmFpbDsKICAgICAgICB9CiAgICAgIH0KCiAgICAgICpzYW1wbGVSYXRlIC89IERPV05fU01QTF9GQUM7CgogICAgICAvKiBEZXRlcm1pbmUgRGVsYXkgYmFsYW5jaW5nIGFuZCBuZXcgZW5jb2RlciBkZWxheSAqLwogICAgICBpZiAobG93RGVsYXkpIHsKICAgICAgICBkb3duc2FtcGxlID0gMTsgIC8qIGFjdGl2YXRlIGRvd25zYW1wbGVyICovCiAgICAgICAgZGVsYXlEaWZmID0gKCpkZWxheSpET1dOX1NNUExfRkFDKSArIERFTEFZX0VMRDJTQlIoY29yZUZyYW1lTGVuZ3RoKTsKICAgICAgICAqZGVsYXkgPSBERUxBWV9FTERTQlIoY29yZUZyYW1lTGVuZ3RoKTsKICAgICAgfQogICAgICBlbHNlIGlmICh1c2VQcykgewogICAgICAgIGRlbGF5RGlmZiA9ICgqZGVsYXkqRE9XTl9TTVBMX0ZBQykgKyBERUxBWV9BQUMyUFMoY29yZUZyYW1lTGVuZ3RoKTsKICAgICAgICAqZGVsYXkgPSBERUxBWV9QUyhjb3JlRnJhbWVMZW5ndGgpOwogICAgICB9CiAgICAgIGVsc2UgewogICAgICAgIGRvd25zYW1wbGUgPSAxOyAgLyogYWN0aXZhdGUgZG93bnNhbXBsZXIgKi8KICAgICAgICBkZWxheURpZmYgPSAoKmRlbGF5KkRPV05fU01QTF9GQUMpICsgREVMQVlfQUFDMlNCUihjb3JlRnJhbWVMZW5ndGgpOwogICAgICAgICpkZWxheSA9IERFTEFZX1NCUihjb3JlRnJhbWVMZW5ndGgpOwogICAgICB9CgogICAgICAvKiBUYWtlIGNhcmUgYWJvdXQgZG93bnNhbXBsZWQgZGF0YSBib3VuZCB0byB0aGUgU0JSIHBhdGggKi8KICAgICAgaWYgKCFkb3duc2FtcGxlICYmIGRlbGF5RGlmZiA+IDApIHsKICAgICAgICAvKgogICAgICAgICAqIFdlIG11c3QgdHdlYWsgdGhlIGJhbGFuY2luZyBpbnRvIGEgc2l0dWF0aW9uIHdoZXJlIHRoZSBkb3duc2FtcGxlZCBwYXRoCiAgICAgICAgICogaXMgdGhlIG9uZSB0byBiZSBkZWxheWVkLCBiZWNhdXNlIGRlbGF5aW5nIHRoZSBRTUYgZG9tYWluIGlucHV0LCBhbHNvIGRlbGF5cwogICAgICAgICAqIHRoZSBkb3duc2FtcGxlZCBhdWRpbywgY291bnRlcmFjdGluZyB0byB0aGUgcHVycG9zZSBvZiBkZWxheSBiYWxhbmNpbmcuCiAgICAgICAgICovCiAgICAgICAgd2hpbGUgKCBkZWxheURpZmYgPiAwICkKICAgICAgICB7CiAgICAgICAgICAvKiBFbmNvZGVyIGRlbGF5IGluY3JlYXNlcyAqLwogICAgICAgICAgKmRlbGF5ICs9IGNvcmVGcmFtZUxlbmd0aCpET1dOX1NNUExfRkFDOwogICAgICAgICAgLyogQWRkIG9uZSBmcmFtZSBkZWxheSB0byBTQlIgcGF0aCAqLwogICAgICAgICAgZGVsYXlEaWZmIC09IGNvcmVGcmFtZUxlbmd0aCpET1dOX1NNUExfRkFDOwogICAgICAgICAgbkJpdHN0ckRlbGF5ICs9IDE7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgICpkZWxheSArPSBmaXhwX2FicyhkZWxheURpZmYpOwogICAgICB9CgogICAgICBpZiAoZGVsYXlEaWZmIDwgMCkgewogICAgICAgIC8qIERlbGF5IEFBQyBkYXRhICovCiAgICAgICAgZGVsYXlEaWZmID0gLWRlbGF5RGlmZjsKICAgICAgICAvKiBNdWx0aXBseSBkb3duc2FtcGxlZCBvZmZzZXQgYnkgQUFDIGNvcmUgY2hhbm5lbHMuIERpdmlkZSBieSAyIGJlY2F1c2Ugb2YgaGFsZiBzYW1wbGVyYXRlIG9mIGRvd25zYW1wbGVkIGRhdGEuICovCiAgICAgICAgZG93bnNhbXBsZWRPZmZzZXQgPSAoZGVsYXlEaWZmKigqbnVtQ2hhbm5lbHMpKS9ET1dOX1NNUExfRkFDOwogICAgICAgIHNick9mZnNldCA9IDA7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLyogRGVsYXkgU0JSIGlucHV0ICovCiAgICAgICAgaWYgKCBkZWxheURpZmYgPiAoaW50KWNvcmVGcmFtZUxlbmd0aCpET1dOX1NNUExfRkFDICkKICAgICAgICB7CiAgICAgICAgICAvKiBEbyBiaXRzdHJlYW0gZnJhbWUtd2lzZSBkZWxheSBiYWxhbmNpbmcgaWYgd2UgaGF2ZSBtb3JlIHRoYW4gU0JSIGZyYW1lbGVuZ3RoIHNhbXBsZXMgZGVsYXkgZGlmZmVyZW5jZSAqLwogICAgICAgICAgZGVsYXlEaWZmIC09IGNvcmVGcmFtZUxlbmd0aCpET1dOX1NNUExfRkFDOwogICAgICAgICAgbkJpdHN0ckRlbGF5ID0gMTsKICAgICAgICB9CiAgICAgICAgLyogTXVsdGlwbHkgaW5wdXQgb2Zmc2V0IGJ5IGlucHV0IGNoYW5uZWxzICovCiAgICAgICAgc2JyT2Zmc2V0ID0gZGVsYXlEaWZmKigqbnVtQ2hhbm5lbHMpOwogICAgICAgIGRvd25zYW1wbGVkT2Zmc2V0ID0gMDsKICAgICAgfQoKICAgICAgaFNickVuY29kZXItPm5CaXRzdHJEZWxheSA9IG5CaXRzdHJEZWxheTsKICAgICAgaFNickVuY29kZXItPm5DaGFubmVscyA9ICpudW1DaGFubmVsczsKICAgICAgaFNickVuY29kZXItPmZyYW1lU2l6ZSA9ICpmcmFtZUxlbmd0aCpET1dOX1NNUExfRkFDOwogICAgICBoU2JyRW5jb2Rlci0+ZlRpbWVEb21haW5Eb3duc2FtcGxpbmcgPSBkb3duc2FtcGxlOwogICAgICBoU2JyRW5jb2Rlci0+ZXN0aW1hdGVCaXRyYXRlID0gMDsKICAgICAgaFNickVuY29kZXItPmlucHV0RGF0YURlbGF5ID0gMDsKCgogICAgICAvKiBPcGVuIFNCUiBlbGVtZW50cyAqLwogICAgICBlbCA9IC0xOwogICAgICBsb3dlc3RTYnJTdGFydEZyZXEgPSBsb3dlc3RTYnJTdG9wRnJlcSA9IDk5OTk7CiAgICAgIGxvd2VzdEJhbmR3aWR0aCA9IDk5OTk5OwoKICAgICAgLyogTG9vcCB0aHJvdWdoIGVhY2ggY29yZSBlbmNvZGVyIGVsZW1lbnQgYW5kIGdldCBhIG1hdGNoaW5nIFNCUiBlbGVtZW50IGNvbmZpZyAqLwogICAgICBmb3IgKGNvcmVFbD0wOyBjb3JlRWw8bm9FbGVtZW50czsgY29yZUVsKyspCiAgICAgIHsKICAgICAgICAvKiBTQlIgb25seSBoYW5kbGVzIFNDRSBhbmQgQ1BFJ3MgKi8KICAgICAgICBpZiAoZWxJbmZvW2NvcmVFbF0uZWxUeXBlID09IElEX1NDRSB8fCBlbEluZm9bY29yZUVsXS5lbFR5cGUgPT0gSURfQ1BFKSB7CiAgICAgICAgICBlbCsrOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CgogICAgICAgIC8qIFNldCBwYXJhbWV0cmljIFN0ZXJlbyBGbGFnLiAqLwogICAgICAgIGlmICh1c2VQcykgewogICAgICAgICAgZWxJbmZvW2NvcmVFbF0uZlBhcmFtZXRyaWNTdGVyZW8gPSAxOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBlbEluZm9bY29yZUVsXS5mUGFyYW1ldHJpY1N0ZXJlbyA9IDA7CiAgICAgICAgfQoKICAgICAgICAvKgogICAgICAgICAqIEluaXQgc2JyQ29uZmlnIHN0cnVjdHVyZQogICAgICAgICAqLwogICAgICAgIEZES3NickVuY19Jbml0aWFsaXplU2JyRGVmYXVsdHMgKCAmc2JyQ29uZmlnW2VsXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERPV05fU01QTF9GQUMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JlRnJhbWVMZW5ndGgpOwogICAgICAgIC8qCiAgICAgICAgICogTW9kaWZ5IHNickNvbmZpZyBzdHJ1Y3R1cmUgYWNjb3JkaW5nIHRvIEVsZW1lbnQgcGFyYW1ldGVycwogICAgICAgICAqLwogICAgICAgIEZES3NickVuY19BZGp1c3RTYnJTZXR0aW5ncyAoICZzYnJDb25maWdbZWxdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbEluZm9bY29yZUVsXS5iaXRSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbEluZm9bY29yZUVsXS5uQ2hhbm5lbHNJbkVsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzYW1wbGVSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm1GYWN0b3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI0MDAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdXNlU3BlZWNoQ29uZmlnICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsY3NNb2RlICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZVBzLCAvKiBiUGFyYW1ldHJpY1N0ZXJlbyAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYW90KTsKCiAgICAgICAgLyogRmluZCBjb21tb24gZnJlcXVlbmN5IGJvcmRlciBmb3IgYWxsIFNCUiBlbGVtZW50cyAqLwogICAgICAgIGxvd2VzdFNiclN0YXJ0RnJlcSA9IGZpeE1pbihsb3dlc3RTYnJTdGFydEZyZXEsIHNickNvbmZpZ1tlbF0uc3RhcnRGcmVxKTsKICAgICAgICBsb3dlc3RTYnJTdG9wRnJlcSA9IGZpeE1pbihsb3dlc3RTYnJTdG9wRnJlcSwgc2JyQ29uZmlnW2VsXS5zdG9wRnJlcSk7CgoKICAgICAgfSAvKiBmaXJzdCBlbGVtZW50IGxvb3AgKi8KCiAgICAgIC8qIFNldCBlbGVtZW50IGNvdW50IChjYW4gYmUgbGVzcyB0aGFuIGNvcmUgZW5jb2RlciBlbGVtZW50IGNvdW50KSAqLwogICAgICBoU2JyRW5jb2Rlci0+bm9FbGVtZW50cyA9IGVsKzE7CgogICAgICBGREtzYnJFbmNfUmVhbGxvY2F0ZShoU2JyRW5jb2RlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxJbmZvLAogICAgICAgICAgICAgICAgICAgICAgICAgICBub0VsZW1lbnRzKTsKCiAgICAgIGZvciAoZWw9MDsgZWw8aFNickVuY29kZXItPm5vRWxlbWVudHM7IGVsKyspIHsKCiAgICAgICAgaW50IGJhbmR3aWR0aCA9ICpjb3JlQmFuZHdpZHRoOwoKICAgICAgICAvKiBVc2UgbG93ZXN0IGNvbW1vbiBiYW5kd2lkdGggKi8KICAgICAgICBzYnJDb25maWdbZWxdLnN0YXJ0RnJlcSA9IGxvd2VzdFNiclN0YXJ0RnJlcTsKICAgICAgICBzYnJDb25maWdbZWxdLnN0b3BGcmVxID0gbG93ZXN0U2JyU3RvcEZyZXE7CgogICAgICAgIC8qIGluaXRpYWxpemUgU0JSIGVsZW1lbnQsIGFuZCBnZXQgY29yZSBiYW5kd2lkdGggKi8KICAgICAgICBlcnJvciA9IEZES3NickVuY19FbnZJbml0KGhTYnJFbmNvZGVyLT5zYnJFbGVtZW50W2VsXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzYnJDb25maWdbZWxdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJhbmR3aWR0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICphb3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbkJpdHN0ckRlbGF5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlc0luaXRGbGFnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsaFNickVuY29kZXItPmR5bmFtaWNSYW0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgIGlmIChlcnJvciAhPSAwKSB7CiAgICAgICAgICBnb3RvIGJhaWw7CiAgICAgICAgfQoKICAgICAgICAvKiBHZXQgbG93ZXN0IGNvcmUgZW5jb2RlciBiYW5kd2lkdGggdG8gYmUgcmV0dXJuZWQgbGF0ZXIuICovCiAgICAgICAgbG93ZXN0QmFuZHdpZHRoID0gZml4TWluKGxvd2VzdEJhbmR3aWR0aCwgYmFuZHdpZHRoKTsKCiAgICAgIH0gLyogc2Vjb25kIGVsZW1lbnQgbG9vcCAqLwoKICAgICAgLyogSW5pdGlhbGl6ZSBhIGRvd25zYW1wbGVyIGZvciBlYWNoIGNoYW5uZWwgaW4gZWFjaCBTQlIgZWxlbWVudCAqLwogICAgICBpZiAoaFNickVuY29kZXItPmZUaW1lRG9tYWluRG93bnNhbXBsaW5nKQogICAgICB7CiAgICAgICAgZm9yIChlbD0wOyBlbDxoU2JyRW5jb2Rlci0+bm9FbGVtZW50czsgZWwrKykKICAgICAgICB7CiAgICAgICAgICBIQU5ETEVfU0JSX0VMRU1FTlQgaFNickVsID0gaFNickVuY29kZXItPnNickVsZW1lbnRbZWxdOwogICAgICAgICAgSU5UIFdjLCBjaDsKCiAgICAgICAgICAvKiBDYWxjdWxhdGVkIHJlcXVpcmVkIG5vcm1hbGl6ZWQgY3V0b2ZmIGZyZXF1ZW5jeSAoV2MgPSAxLjAgLT4gbG93ZXN0QmFuZHdpZHRoID0gaW5wdXRTYW1wbGVSYXRlLzIpICovCiAgICAgICAgICBXYyA9ICgyKmxvd2VzdEJhbmR3aWR0aCkqMTAwMCAvIGlucHV0U2FtcGxlUmF0ZTsKCiAgICAgICAgICBmb3IgKGNoPTA7IGNoPGhTYnJFbC0+ZWxJbmZvLm5DaGFubmVsc0luRWw7IGNoKyspCiAgICAgICAgICB7CiAgICAgICAgICAgIEZES2FhY0VuY19Jbml0RG93bnNhbXBsZXIgKCZoU2JyRWwtPnNickNoYW5uZWxbY2hdLT5kb3duU2FtcGxlciwgV2MsIERPV05fU01QTF9GQUMpOwogICAgICAgICAgfQoKICAgICAgICAgIEZES19BU1NFUlQgKGhTYnJFbC0+c2JyQ2hhbm5lbFswXS0+ZG93blNhbXBsZXIuZGVsYXkgPD1NQVhfRFNfRklMVEVSX0RFTEFZICYmIGhTYnJFbC0+c2JyQ2hhbm5lbFswXS0+ZG93blNhbXBsZXIuZGVsYXkgPD1NQVhfRFNfRklMVEVSX0RFTEFZKTsKICAgICAgICAgIGRvd25zYW1wbGVyRGVsYXkgPSBoU2JyRWwtPnNickNoYW5uZWxbMF0tPmRvd25TYW1wbGVyLmRlbGF5OwogICAgICAgIH0gLyogdGhpcmQgZWxlbWVudCBsb29wICovCgogICAgICAgIC8qIGxmZSAqLwogICAgICAgIEZES2FhY0VuY19Jbml0RG93bnNhbXBsZXIgKCZoU2JyRW5jb2Rlci0+bGZlRG93blNhbXBsZXIsIDAsIERPV05fU01QTF9GQUMpOwoKICAgICAgICAvKiBBZGQgdGhlIHJlc2FtcGxlciBhZGRpdGlvbmFsIGRlbGF5IHRvIGdldCB0aGUgZmluYWwgZGVsYXkgYW5kIGJ1ZmZlciBvZmZzZXQgdmFsdWVzLiAqLwogICAgICAgIGlmIChzYnJPZmZzZXQgPiAwIHx8IGRvd25zYW1wbGVkT2Zmc2V0IDw9ICgoZG93bnNhbXBsZXJEZWxheSAqICgqbnVtQ2hhbm5lbHMpKS9ET1dOX1NNUExfRkFDKSkgewogICAgICAgICAgc2JyT2Zmc2V0ICs9IChkb3duc2FtcGxlckRlbGF5IC0gZG93bnNhbXBsZWRPZmZzZXQpICogKCpudW1DaGFubmVscykgOwogICAgICAgICAgKmRlbGF5ICs9IGRvd25zYW1wbGVyRGVsYXkgLSBkb3duc2FtcGxlZE9mZnNldDsKICAgICAgICAgIGRvd25zYW1wbGVkT2Zmc2V0ID0gMDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgZG93bnNhbXBsZWRPZmZzZXQgLT0gKGRvd25zYW1wbGVyRGVsYXkgKiAoKm51bUNoYW5uZWxzKSkvRE9XTl9TTVBMX0ZBQzsKICAgICAgICAgIHNick9mZnNldCA9IDA7CiAgICAgICAgfQoKICAgICAgICBoU2JyRW5jb2Rlci0+aW5wdXREYXRhRGVsYXkgPSBkb3duc2FtcGxlckRlbGF5OwogICAgICB9CgoKICAgICAgLyogQXNzaWduIGNvcmUgZW5jb2RlciBCYW5kd2lkdGggKi8KICAgICAgKmNvcmVCYW5kd2lkdGggPSBsb3dlc3RCYW5kd2lkdGg7CgogICAgICAvKiBFc3RpbWF0ZSBzYnIgYml0cmF0ZSwgMi41IGtCaXQvcyBwZXIgc2JyIGNoYW5uZWwgKi8KICAgICAgaFNickVuY29kZXItPmVzdGltYXRlQml0cmF0ZSArPSAyNTAwICogKCpudW1DaGFubmVscyk7CgogICAgICAvKiBpbml0aWFsaXplIHBhcmFtZXRyaWMgc3RlcmVvICovCiAgICAgIGlmICh1c2VQcykKICAgICAgewogICAgICAgIFBTRU5DX0NPTkZJRyBwc0VuY0NvbmZpZzsKICAgICAgICBGREtfQVNTRVJUKGhTYnJFbmNvZGVyLT5ub0VsZW1lbnRzID09IDEpOwogICAgICAgIElOVCBwc1R1bmluZ1RhYmxlSWR4ID0gZ2V0UHNUdW5pbmdUYWJsZUluZGV4KGVsSW5mb1swXS5iaXRSYXRlLCBOVUxMKTsKCiAgICAgICAgcHNFbmNDb25maWcuZnJhbWVTaXplICAgICAgICAgICA9ICpmcmFtZUxlbmd0aDsgLy9zYnJDb25maWcuc2JyRnJhbWVTaXplOwogICAgICAgIHBzRW5jQ29uZmlnLnFtZkZpbHRlck1vZGUgICAgICAgPSAwOwogICAgICAgIHBzRW5jQ29uZmlnLnNiclBzRGVsYXkgICAgICAgICAgPSAwOwoKICAgICAgICAvKiB0dW5pbmcgcGFyYW1ldGVycyAqLwogICAgICAgIGlmIChwc1R1bmluZ1RhYmxlSWR4ICAhPSBJTlZBTElEX1RBQkxFX0lEWCkgewogICAgICAgICAgcHNFbmNDb25maWcublN0ZXJlb0JhbmRzICAgICAgICAgICA9IHBzVHVuaW5nVGFibGVbcHNUdW5pbmdUYWJsZUlkeF0ublN0ZXJlb0JhbmRzOwogICAgICAgICAgcHNFbmNDb25maWcubWF4RW52ZWxvcGVzICAgICAgICAgICA9IHBzVHVuaW5nVGFibGVbcHNUdW5pbmdUYWJsZUlkeF0ubkVudmVsb3BlczsKICAgICAgICAgIHBzRW5jQ29uZmlnLmlpZFF1YW50RXJyb3JUaHJlc2hvbGQgPSAoRklYUF9EQkwpcHNUdW5pbmdUYWJsZVtwc1R1bmluZ1RhYmxlSWR4XS5paWRRdWFudEVycm9yVGhyZXNob2xkOwoKICAgICAgICAgIC8qIGNhbGN1bGF0aW9uIGlzIG5vdCBxdWl0ZSBsaW5lYXIsIGluY3JlYXNlZCBudW1iZXIgb2YgZW52ZWxvcGVzIGNhdXNlcyBtb3JlIGJpdHMgKi8KICAgICAgICAgIC8qIGFzc3VtZSBhdmcuIDUwIGJpdHMgcGVyIGZyYW1lIGZvciAxMCBzdGVyZW8gYmFuZHMgLyAxIGVudmVsb3BlIGNvbmZpZ3VyYXRpb24gKi8KICAgICAgICAgIGhTYnJFbmNvZGVyLT5lc3RpbWF0ZUJpdHJhdGUgKz0gKCAoKCgqc2FtcGxlUmF0ZSkgKiA1ICogcHNFbmNDb25maWcublN0ZXJlb0JhbmRzICogcHNFbmNDb25maWcubWF4RW52ZWxvcGVzKSAvIGhTYnJFbmNvZGVyLT5mcmFtZVNpemUpKTsKCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGVycm9yID0gRVJST1IoQ0RJLCAiSW52YWxpZCBwcyB0dW5pbmcgdGFibGUgaW5kZXguIik7CiAgICAgICAgICBnb3RvIGJhaWw7CiAgICAgICAgfQoKICAgICAgICBxbWZJbml0U3ludGhlc2lzRmlsdGVyQmFuaygmaFNickVuY29kZXItPnFtZlN5bnRoZXNpc1BTLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRklYUF9EQkwqKWhTYnJFbmNvZGVyLT5xbWZTeW50aGVzaXNQUy5GaWx0ZXJTdGF0ZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhTYnJFbmNvZGVyLT5zYnJFbGVtZW50WzBdLT5zYnJDb25maWdEYXRhLm5vUW1mU2xvdHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhTYnJFbmNvZGVyLT5zYnJFbGVtZW50WzBdLT5zYnJDb25maWdEYXRhLm5vUW1mQmFuZHM+PjEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhTYnJFbmNvZGVyLT5zYnJFbGVtZW50WzBdLT5zYnJDb25maWdEYXRhLm5vUW1mQmFuZHM+PjEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhTYnJFbmNvZGVyLT5zYnJFbGVtZW50WzBdLT5zYnJDb25maWdEYXRhLm5vUW1mQmFuZHM+PjEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdGF0ZXNJbml0RmxhZykgPyAwIDogUU1GX0ZMQUdfS0VFUF9TVEFURVMpOwoKICAgICAgICBpZihlcnJvckluZm8gPT0gbm9FcnJvcil7CiAgICAgICAgICAvKiB1cGRhdGUgZGVsYXkgKi8KICAgICAgICAgIHBzRW5jQ29uZmlnLnNiclBzRGVsYXkgPSBGREtzYnJFbmNfR2V0RW52RXN0RGVsYXkoJmhTYnJFbmNvZGVyLT5zYnJFbGVtZW50WzBdLT5zYnJDaGFubmVsWzBdLT5oRW52Q2hhbm5lbC5zYnJFeHRyYWN0RW52ZWxvcGUpOwoKICAgICAgICAgIGlmKG5vRXJyb3IgIT0gKGVycm9ySW5mbyA9IFBTRW5jX0luaXQoIGhTYnJFbmNvZGVyLT5oUGFyYW1ldHJpY1N0ZXJlbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBzRW5jQ29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFNickVuY29kZXItPnNickVsZW1lbnRbMF0tPnNickNvbmZpZ0RhdGEubm9RbWZTbG90cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhTYnJFbmNvZGVyLT5zYnJFbGVtZW50WzBdLT5zYnJDb25maWdEYXRhLm5vUW1mQmFuZHMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLGhTYnJFbmNvZGVyLT5keW5hbWljUmFtCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApKSkKICAgICAgICAgIHsKICAgICAgICAgICAgZXJyb3JJbmZvID0gaGFuZEJhY2soZXJyb3JJbmZvKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIGhTYnJFbmNvZGVyLT5kb3duc2FtcGxlZE9mZnNldCA9IGRvd25zYW1wbGVkT2Zmc2V0OwogICAgICBoU2JyRW5jb2Rlci0+ZG93bm1peFNpemUgPSBjb3JlRnJhbWVMZW5ndGgqKCpudW1DaGFubmVscyk7CiAgICAgIGhTYnJFbmNvZGVyLT5idWZmZXJPZmZzZXQgPSBzYnJPZmZzZXQ7CiAgICAgIC8qIERlbGF5IENvbXBlbnNhdGlvbjogZmlsbCBiaXRzdHJlYW0gZGVsYXkgYnVmZmVyIHdpdGggemVybyBpbnB1dCBzaWduYWwgKi8KICAgICAgaWYgKCBoU2JyRW5jb2Rlci0+bkJpdHN0ckRlbGF5ID4gMCApCiAgICAgIHsKICAgICAgICBlcnJvciA9IEZES3NickVuY19EZWxheUNvbXBlbnNhdGlvbiAoaFNickVuY29kZXIsIGlucHV0QnVmZmVyKTsKICAgICAgICBpZiAoZXJyb3IgIT0gMCkKICAgICAgICAgIGdvdG8gYmFpbDsKICAgICAgfQoKICAgICAgLyogU2V0IE91dHB1dCBmcmFtZSBsZW5ndGggKi8KICAgICAgKmZyYW1lTGVuZ3RoID0gY29yZUZyYW1lTGVuZ3RoKkRPV05fU01QTF9GQUM7CiAgICAgIC8qIElucHV0IGJ1ZmZlciBvZmZzZXQgKi8KICAgICAgKmlucHV0QnVmZmVyT2Zmc2V0ID0gZml4TWF4KHNick9mZnNldCwgZG93bnNhbXBsZWRPZmZzZXQpOwoKCiAgICB9CgogICAgcmV0dXJuIGVycm9yOwoKYmFpbDoKICAgIC8qIFJlc3RvcmUgaW5wdXQgc2V0dGluZ3MgKi8KICAgICpzYW1wbGVSYXRlID0gaW5wdXRTYW1wbGVSYXRlOwogICAgKmZyYW1lTGVuZ3RoID0gY29yZUZyYW1lTGVuZ3RoOwogICAgKm51bUNoYW5uZWxzID0gaW5wdXRDaGFubmVsczsKICAgICpjb3JlQmFuZHdpZHRoID0gaW5wdXRCYW5kV2lkdGg7CgogICAgcmV0dXJuIGVycm9yOwogfQoKCklOVApzYnJFbmNvZGVyX0VuY29kZUZyYW1lKCAgSEFORExFX1NCUl9FTkNPREVSICAgaFNickVuY29kZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICBJTlRfUENNICAgICAgICAgICAgICpzYW1wbGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCAgICAgICAgICAgICAgICAgdGltZUluU3RyaWRlLAogICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCAgICAgICAgICAgICAgICAgc2JyRGF0YUJpdHNbKDYpXSwKICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICAgICAgICAgICAgICAgIHNickRhdGFbKDYpXVtNQVhfUEFZTE9BRF9TSVpFXQogICAgICAgICAgICAgICAgICAgICAgICApCnsKICBJTlQgZXJyb3I7CiAgaW50IGVsOwoKICBmb3IgKGVsPTA7IGVsPGhTYnJFbmNvZGVyLT5ub0VsZW1lbnRzOyBlbCsrKQogIHsKICAgIGlmIChoU2JyRW5jb2Rlci0+c2JyRWxlbWVudFtlbF0gIT0gTlVMTCkKICAgIHsKICAgICAgZXJyb3IgPSBGREtzYnJFbmNfRW52RW5jb2RlRnJhbWUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoU2JyRW5jb2RlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlcyArIGhTYnJFbmNvZGVyLT5kb3duc2FtcGxlZE9mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVJblN0cmlkZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNickRhdGFCaXRzW2VsXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickRhdGFbZWxdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICBpZiAoZXJyb3IpCiAgICAgICAgcmV0dXJuIGVycm9yOwogICAgfQogIH0KCiAgaWYgKCAoaFNickVuY29kZXItPmxmZUNoSWR4IT0tMSkgJiYgKGhTYnJFbmNvZGVyLT5mVGltZURvbWFpbkRvd25zYW1wbGluZykgKQogIHsKICAgICAgSU5UIG5PdXRTYW1wbGVzOwoKICAgICAgRkRLYWFjRW5jX0Rvd25zYW1wbGUoJmhTYnJFbmNvZGVyLT5sZmVEb3duU2FtcGxlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXMgKyBoU2JyRW5jb2Rlci0+ZG93bnNhbXBsZWRPZmZzZXQgKyBoU2JyRW5jb2Rlci0+YnVmZmVyT2Zmc2V0ICsgaFNickVuY29kZXItPmxmZUNoSWR4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaFNickVuY29kZXItPmZyYW1lU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVJblN0cmlkZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXMgKyBoU2JyRW5jb2Rlci0+ZG93bnNhbXBsZWRPZmZzZXQgKyBoU2JyRW5jb2Rlci0+bGZlQ2hJZHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICZuT3V0U2FtcGxlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhTYnJFbmNvZGVyLT5uQ2hhbm5lbHMpOwogIH0gLyogbGZlIGRvd25zYW1wbGVyICovCgogIHJldHVybiAwOwp9CgoKSU5UIHNickVuY29kZXJfVXBkYXRlQnVmZmVycygKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfRU5DT0RFUiBoU2JyRW5jb2RlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVF9QQ00gKnRpbWVCdWZmZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKIHsKICAgIGlmICggaFNickVuY29kZXItPmRvd25zYW1wbGVkT2Zmc2V0ID4gMCApIHsKICAgICAgLyogTW92ZSBkZWxheWVkIGRvd25zYW1wbGVkIGRhdGEgKi8KICAgICAgRkRLbWVtY3B5ICggdGltZUJ1ZmZlciwKICAgICAgICAgICAgICAgICAgdGltZUJ1ZmZlciArIGhTYnJFbmNvZGVyLT5kb3dubWl4U2l6ZSwKICAgICAgICAgICAgICAgICAgc2l6ZW9mKElOVF9QQ00pICogKGhTYnJFbmNvZGVyLT5kb3duc2FtcGxlZE9mZnNldCkgKTsKICAgIH0gZWxzZSB7CiAgICAgIC8qIE1vdmUgZGVsYXllZCBpbnB1dCBkYXRhICovCiAgICAgIEZES21lbWNweSAoIHRpbWVCdWZmZXIsCiAgICAgICAgdGltZUJ1ZmZlciArIGhTYnJFbmNvZGVyLT5uQ2hhbm5lbHMgKiBoU2JyRW5jb2Rlci0+ZnJhbWVTaXplLAogICAgICAgICAgICAgICAgICBzaXplb2YoSU5UX1BDTSkgKiBoU2JyRW5jb2Rlci0+YnVmZmVyT2Zmc2V0ICk7CiAgICB9CiAgICBpZiAoIGhTYnJFbmNvZGVyLT5uQml0c3RyRGVsYXkgPiAwICApCiAgICB7CiAgICAgIGludCBlbDsKCiAgICAgIGZvciAoZWw9MDsgZWw8aFNickVuY29kZXItPm5vRWxlbWVudHM7IGVsKyspCiAgICAgIHsKICAgICAgICBGREttZW1tb3ZlICggaFNickVuY29kZXItPnNickVsZW1lbnRbZWxdLT5wYXlsb2FkRGVsYXlMaW5lWzBdLAogICAgICAgICAgICAgICAgICAgICBoU2JyRW5jb2Rlci0+c2JyRWxlbWVudFtlbF0tPnBheWxvYWREZWxheUxpbmVbMV0sCiAgICAgICAgICAgICAgICAgICAgIHNpemVvZihVQ0hBUikgKiAoaFNickVuY29kZXItPm5CaXRzdHJEZWxheSpNQVhfUEFZTE9BRF9TSVpFKSApOwoKICAgICAgICBGREttZW1tb3ZlKCAmaFNickVuY29kZXItPnNickVsZW1lbnRbZWxdLT5wYXlsb2FkRGVsYXlMaW5lU2l6ZVswXSwKICAgICAgICAgICAgICAgICAgICAmaFNickVuY29kZXItPnNickVsZW1lbnRbZWxdLT5wYXlsb2FkRGVsYXlMaW5lU2l6ZVsxXSwKICAgICAgICAgICAgICAgICAgICBzaXplb2YoVUlOVCkgKiAoaFNickVuY29kZXItPm5CaXRzdHJEZWxheSkgKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIDA7CiB9CgoKSU5UIHNickVuY29kZXJfR2V0RXN0aW1hdGVCaXRyYXRlKEhBTkRMRV9TQlJfRU5DT0RFUiBoU2JyRW5jb2RlcikKewogIElOVCBlc3RpbWF0ZUJpdHJhdGUgPSAwOwoKICBpZihoU2JyRW5jb2RlcikgewogICAgZXN0aW1hdGVCaXRyYXRlICs9IGhTYnJFbmNvZGVyLT5lc3RpbWF0ZUJpdHJhdGU7CiAgfQoKICByZXR1cm4gZXN0aW1hdGVCaXRyYXRlOwp9CgpJTlQgc2JyRW5jb2Rlcl9HZXRJbnB1dERhdGFEZWxheShIQU5ETEVfU0JSX0VOQ09ERVIgaFNickVuY29kZXIpCnsKICBJTlQgZGVsYXkgPSAtMTsKCiAgaWYoaFNickVuY29kZXIpIHsKICAgIGRlbGF5ID0gaFNickVuY29kZXItPmlucHV0RGF0YURlbGF5OwogIH0KICByZXR1cm4gZGVsYXk7Cn0KCgpJTlQgc2JyRW5jb2Rlcl9HZXRMaWJJbmZvKCBMSUJfSU5GTyAqaW5mbyApCnsKICBpbnQgaTsKCiAgaWYgKGluZm8gPT0gTlVMTCkgewogICAgcmV0dXJuIC0xOwogIH0KICAvKiBzZWFyY2ggZm9yIG5leHQgZnJlZSB0YWIgKi8KICBmb3IgKGkgPSAwOyBpIDwgRkRLX01PRFVMRV9MQVNUOyBpKyspIHsKICAgIGlmIChpbmZvW2ldLm1vZHVsZV9pZCA9PSBGREtfTk9ORSkgYnJlYWs7CiAgfQogIGlmIChpID09IEZES19NT0RVTEVfTEFTVCkgewogICAgcmV0dXJuIC0xOwogIH0KICBpbmZvICs9IGk7CgogIGluZm8tPm1vZHVsZV9pZCA9IEZES19TQlJFTkM7CiAgaW5mby0+dmVyc2lvbiA9IExJQl9WRVJTSU9OKFNCUkVOQ09ERVJfTElCX1ZMMCwgU0JSRU5DT0RFUl9MSUJfVkwxLCBTQlJFTkNPREVSX0xJQl9WTDIpOwogIExJQl9WRVJTSU9OX1NUUklORyhpbmZvKTsKICBpbmZvLT5idWlsZF9kYXRlID0gX19EQVRFX187CiAgaW5mby0+YnVpbGRfdGltZSA9IF9fVElNRV9fOwogIGluZm8tPnRpdGxlID0gIlNCUiBFbmNvZGVyIjsKCiAgLyogU2V0IGZsYWdzICovCiAgaW5mby0+ZmxhZ3MgPSAwCiAgICB8IENBUEZfU0JSX0hRCiAgICB8IENBUEZfU0JSX1BTX01QRUcKICAgIDsKICAvKiBFbmQgb2YgZmxhZ3MgKi8KCiAgcmV0dXJuIDA7Cn0K