Ci8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAoKqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE1IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAxLiAgICBJTlRST0RVQ1RJT04KVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwp0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCgpBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQppbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydApvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KClBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwppbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCnRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCnRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwpzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCgpDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAphcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCgoyLiAgICBDT1BZUklHSFQgTElDRU5TRQoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CnBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKCllvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCnlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCgpZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCllvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgoKVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dApwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCgpZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCnNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgoKWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCiJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCgozLiAgICBOTyBQQVRFTlQgTElDRU5TRQoKTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCkFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCnJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KCllvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZApieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCgo0LiAgICBESVNDTEFJTUVSCgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwpvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgpDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCmluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCm9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCmFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgoKNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgoKRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCkF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCkFtIFdvbGZzbWFudGVsIDMzCjkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Cgp3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCmFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqICBGcmF1bmhvZmVyIElJUyBGREsgVG9vbHMgICoqKioqKioqKioqKioqKioqKioqKioqCgogICBBdXRob3Iocyk6IEFuZHJlYXMgRWhyZXQsIFRvYmlhcyBDaGFsdXBrYQogICBEZXNjcmlwdGlvbjogU0JSIGVuY29kZXIgdG9wIGxldmVsIHByb2Nlc3NpbmcuCgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgojaW5jbHVkZSAic2JyX2VuY29kZXIuaCIKCiNpbmNsdWRlICJzYnJfcmFtLmgiCiNpbmNsdWRlICJzYnJfcm9tLmgiCiNpbmNsdWRlICJzYnJlbmNfZnJlcV9zY2EuaCIKI2luY2x1ZGUgImVudl9iaXQuaCIKI2luY2x1ZGUgImNtb25kYXRhLmgiCiNpbmNsdWRlICJzYnJfbWlzYy5oIgojaW5jbHVkZSAic2JyLmgiCiNpbmNsdWRlICJxbWYuaCIKCiNpbmNsdWRlICJwc19tYWluLmgiCgojZGVmaW5lIFNCUkVOQ09ERVJfTElCX1ZMMCAzCiNkZWZpbmUgU0JSRU5DT0RFUl9MSUJfVkwxIDMKI2RlZmluZSBTQlJFTkNPREVSX0xJQl9WTDIgMTIKCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoKICogU0JSIERlbGF5IGJhbGFuY2luZyBkZWZpbml0aW9ucy4KICovCgovKgogICAgICBpbnB1dCBidWZmZXIgKDFjaCkKCiAgICAgIHwtLS0tLS0tLS0tLS0gMTUzNyAgIC0tLS0tLS0tLS0tLS18LS0tLS18LS0tLS0tLS0tLSAyMDQ4IC0tLS0tLS0tLS0tLS18CiAgICAgICAgICAgKGNvcmUyc2JyIGRlbGF5ICAgICApICAgICAgICAgIGRzICAgICAocmVhZCwgY29yZSBhbmQgZHMgYXJlYSkKKi8KCiNkZWZpbmUgU0ZCKGR3bnNtcCkgICAgICAgICgzMiA8PCAoZHduc21wLTEpKSAgICAgLyogU0JSIEZyZXF1ZW5jeSBiYW5kczogNjQgZm9yIGR1YWwtcmF0ZSwgMzIgZm9yIHNpbmdsZS1yYXRlICovCiNkZWZpbmUgU1RTKGZsKSAgICAgICAgICAgICgoKGZsKT09MTAyNCk/MzI6MzApICAgLyogU0JSIFRpbWUgU2xvdHM6IDMyIGZvciBjb3JlIGZyYW1lIGxlbmd0aCAxMDI0LCAzMCBmb3IgY29yZSBmcmFtZSBsZW5ndGggOTYwICovCgojZGVmaW5lIERFTEFZX1FNRl9BTkEoZHduc21wKSAoKDMyMDw8KChkd25zbXApLTEpKSAtICgzMjw8KChkd25zbXApLTEpKSkgLyogRnVsbCBiYW5kd2lkdGggKi8KI2RlZmluZSBERUxBWV9IWUJfQU5BICAgICAgICAgKDEwKjY0KSAgICAgICAvKiArIDAuNSAqLyAgICAgICAgICAgICAgLyogICovCiNkZWZpbmUgREVMQVlfSFlCX1NZTiAgICAgICAgICg2KjY0IC0gMzIpICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAqLwojZGVmaW5lIERFTEFZX1FNRl9QT1NUUFJPQyhkd25zbXApICgzMiooZHduc21wKSkgICAgICAgICAgICAgICAgICAgICAvKiBRTUYgcG9zdHByb2Nlc3NpbmcgZGVsYXkgKi8KI2RlZmluZSBERUxBWV9ERUNfUU1GKGR3bnNtcCkgKDYgKiBTRkIoZHduc21wKSApICAgICAgICAgICAgICAgICAgICAgLyogRGVjb2RlciBRTUYgb3ZlcmxhcCAqLwojZGVmaW5lIERFTEFZX1FNRl9TWU4gICAgICAgICAoMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOT19QT0xZLzI9Mi41LCByb3VuZGVkIGRvd24gdG8gMiAqLwojZGVmaW5lIERFTEFZX1FNRl9EUyAgICAgICAgICAoMzIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBRTUYgc3ludGhlc2lzIGZvciBkb3duc2FtcGxlZCB0aW1lIHNpZ25hbCAqLwoKLyogRGVsYXkgaW4gUU1GIHBhdGhzICovCiNkZWZpbmUgREVMQVlfU0JSKGZsLGR3bnNtcCkgICAgIChERUxBWV9RTUZfQU5BKGR3bnNtcCkgKyAoU0ZCKGR3bnNtcCkqU1RTKGZsKSAtIDEpICsgREVMQVlfUU1GX1NZTikKI2RlZmluZSBERUxBWV9QUyhmbCxkd25zbXApICAgICAgKERFTEFZX1FNRl9BTkEoZHduc21wKSArIERFTEFZX0hZQl9BTkEgKyBERUxBWV9ERUNfUU1GKGR3bnNtcCkgKyAoU0ZCKGR3bnNtcCkqU1RTKGZsKS0xKSArIERFTEFZX0hZQl9TWU4gKyBERUxBWV9RTUZfU1lOKQojZGVmaW5lIERFTEFZX0VMRFNCUihmbCxkd25zbXApICAoICggKChmbCkvMikqKGR3bnNtcCkgKSAtIDEgKyBERUxBWV9RTUZfUE9TVFBST0MoZHduc21wKSApCgovKiBEZWxheSBkaWZmZXJlbmNlcyBmb3IgU0JSIGFuZCBTQlIrUFMgKi8KI2RlZmluZSBNQVhfRFNfRklMVEVSX0RFTEFZICg1KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGUgYWRkaXRpb25hbCBtYXggZG93bnNhbXBsZXIgZmlsdGVyIGRlbGF5IChzb3VyY2UgZnMpICovCiNkZWZpbmUgREVMQVlfQUFDMlNCUihmbCxkd25zbXApICgoREVMQVlfUU1GX0FOQShkd25zbXApICsgREVMQVlfREVDX1FNRihkd25zbXApICsgREVMQVlfUU1GX1NZTikgLSBERUxBWV9TQlIoKGZsKSwoZHduc21wKSkpCiNkZWZpbmUgREVMQVlfRUxEMlNCUihmbCxkd25zbXApICgoREVMQVlfUU1GX1BPU1RQUk9DKGR3bnNtcCkpIC0gREVMQVlfRUxEU0JSKGZsLGR3bnNtcCkpCiNkZWZpbmUgREVMQVlfQUFDMlBTKGZsLGR3bnNtcCkgKChERUxBWV9RTUZfQU5BKGR3bnNtcCkgKyBERUxBWV9RTUZfRFMgKyAvKihERUxBWV9BQUMoZmwpKjIpICsgKi8gREVMQVlfUU1GX0FOQShkd25zbXApICsgREVMQVlfREVDX1FNRihkd25zbXApICsgREVMQVlfSFlCX1NZTiArIERFTEFZX1FNRl9TWU4pIC0gREVMQVlfUFMoZmwsZHduc21wKSkgLyogMjA0OCAtIDQ2MyoyICovCgovKiBBc3N1bXB0aW9uOiBUaGUgc2FtcGxlIGRlbGF5IHJlc3VsdGluZyBvZiBvZiBERUxBWV9BQUMyUFMgaXMgYWx3YXlzIHNtYWxsZXIgdGhhbiB0aGUgc2FtcGxlIGRlbGF5IGltcGxpZWQgYnkgREVMQVlfQUFDMlNCUiAqLwojZGVmaW5lIE1BWF9TQU1QTEVfREVMQVkgICAgICAgKERFTEFZX0FBQzJTQlIoMTAyNCwyKSArIE1BWF9EU19GSUxURVJfREVMQVkpIC8qIG1heGltdW0gZGVsYXk6IGZyYW1lIGxlbmd0aCBvZiAxMDI0IGFuZCBkdWFsLXJhdGUgc2JyICovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKCgojZGVmaW5lIElOVkFMSURfVEFCTEVfSURYIC0xCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiEKCiAgXGJyaWVmICBTZWxlY3RzIHRoZSBTQlIgdHVuaW5nIHNldHRpbmdzIHRvIHVzZSBkZXBlbmRlbnQgb24gbnVtYmVyIG9mCiAgICAgICAgICBjaGFubmVscywgYml0cmF0ZSwgc2FtcGxlIHJhdGUgYW5kIGNvcmUgY29kZXIKCiAgXHJldHVybiBJbmRleCB0byB0aGUgYXBwcm9wcmlhdGUgdGFibGUKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiNkZWZpbmUgRElTVEFOQ0VfQ0VJTF9WQUxVRSA1MDAwMDAwCnN0YXRpYyBJTlQKZ2V0U2JyVHVuaW5nVGFibGVJbmRleChVSU5UIGJpdHJhdGUsICAgIC8qISB0aGUgdG90YWwgYml0cmF0ZSBpbiBiaXRzL3NlYyAqLwogICAgICAgICAgICAgICAgICAgICAgIFVJTlQgbnVtQ2hhbm5lbHMsLyohIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgZm9yIHRoZSBjb3JlIGNvZGVyICovCiAgICAgICAgICAgICAgICAgICAgICAgVUlOVCBzYW1wbGVSYXRlLCAgLyohIHRoZSBzYW1wbGluZyByYXRlIG9mIHRoZSBjb3JlIGNvZGVyICovCiAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fT0JKRUNUX1RZUEUgY29yZSwKICAgICAgICAgICAgICAgICAgICAgICBVSU5UICpwQml0UmF0ZUNsb3Nlc3QKICAgICAgICAgICAgICAgICAgICAgICApCnsKICBpbnQgaSwgYml0UmF0ZUNsb3Nlc3RMb3dlckluZGV4PS0xLCBiaXRSYXRlQ2xvc2VzdFVwcGVySW5kZXg9LTEsIGZvdW5kID0gMDsKICBVSU5UIGJpdFJhdGVDbG9zZXN0VXBwZXIgPSAwLCBiaXRSYXRlQ2xvc2VzdExvd2VyPURJU1RBTkNFX0NFSUxfVkFMVUU7CgogICNkZWZpbmUgaXNGb3JUaGlzQ29yZShpKSBcCiAgICAoICggc2JyVHVuaW5nVGFibGVbaV0uY29yZUNvZGVyID09IENPREVDX0FBQ0xEICYmIGNvcmUgPT0gQU9UX0VSX0FBQ19FTEQgKSB8fCBcCiAgICAgICggc2JyVHVuaW5nVGFibGVbaV0uY29yZUNvZGVyID09IENPREVDX0FBQyAgICYmIGNvcmUgIT0gQU9UX0VSX0FBQ19FTEQgKSApCgogIGZvciAoaT0wOyBpIDwgc2JyVHVuaW5nVGFibGVTaXplIDsgaSsrKSB7CiAgICBpZiAoIGlzRm9yVGhpc0NvcmUoaSkgKSAvKiB0dW5pbmcgdGFibGUgaXMgZm9yIHRoaXMgY29yZSBjb2RlYyAqLwogICAgewogICAgICBpZiAoIG51bUNoYW5uZWxzID09IHNiclR1bmluZ1RhYmxlIFtpXS5udW1DaGFubmVscwogICAgICAgICYmIHNhbXBsZVJhdGUgPT0gc2JyVHVuaW5nVGFibGUgW2ldLnNhbXBsZVJhdGUgKQogICAgICB7CiAgICAgICAgZm91bmQgPSAxOwogICAgICAgIGlmICgoYml0cmF0ZSA+PSBzYnJUdW5pbmdUYWJsZSBbaV0uYml0cmF0ZUZyb20pICYmCiAgICAgICAgICAgIChiaXRyYXRlIDwgc2JyVHVuaW5nVGFibGUgW2ldLmJpdHJhdGVUbykpIHsKICAgICAgICAgICAgICBiaXRSYXRlQ2xvc2VzdExvd2VyID0gYml0cmF0ZTsKICAgICAgICAgICAgICBiaXRSYXRlQ2xvc2VzdFVwcGVyID0gYml0cmF0ZTsKICAgICAgICAgICAgICAvL0ZES3ByaW50ZigiZW50cnkgJWRcbiIsIGkpOwogICAgICAgICAgcmV0dXJuIGkgOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAoIHNiclR1bmluZ1RhYmxlIFtpXS5iaXRyYXRlRnJvbSA+IGJpdHJhdGUgKSB7CiAgICAgICAgICAgIGlmIChzYnJUdW5pbmdUYWJsZSBbaV0uYml0cmF0ZUZyb20gPCBiaXRSYXRlQ2xvc2VzdExvd2VyKSB7CiAgICAgICAgICAgICAgYml0UmF0ZUNsb3Nlc3RMb3dlciA9IHNiclR1bmluZ1RhYmxlIFtpXS5iaXRyYXRlRnJvbTsKICAgICAgICAgICAgICBiaXRSYXRlQ2xvc2VzdExvd2VySW5kZXggPSBpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoIHNiclR1bmluZ1RhYmxlIFtpXS5iaXRyYXRlVG8gPD0gYml0cmF0ZSApIHsKICAgICAgICAgICAgaWYgKHNiclR1bmluZ1RhYmxlIFtpXS5iaXRyYXRlVG8gPiBiaXRSYXRlQ2xvc2VzdFVwcGVyKSB7CiAgICAgICAgICAgICAgYml0UmF0ZUNsb3Nlc3RVcHBlciA9IHNiclR1bmluZ1RhYmxlIFtpXS5iaXRyYXRlVG8tMTsKICAgICAgICAgICAgICBiaXRSYXRlQ2xvc2VzdFVwcGVySW5kZXggPSBpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICBpZiAocEJpdFJhdGVDbG9zZXN0ICE9IE5VTEwpCiAgewogICAgLyogSWYgdGhlcmUgd2FzIGF0IGxlYXN0IG9uZSBtYXRjaGluZyB0dW5pbmcgZW50cnkgZm91bmQgdGhlbiBwaWNrIHRoZSBsZWFzdCBkaXN0YW5jZSBiaXQgcmF0ZSAqLwogICAgaWYgKGZvdW5kKQogICAgewogICAgICBpbnQgZGlzdGFuY2VVcHBlcj1ESVNUQU5DRV9DRUlMX1ZBTFVFLCBkaXN0YW5jZUxvd2VyPURJU1RBTkNFX0NFSUxfVkFMVUU7CiAgICAgIGlmIChiaXRSYXRlQ2xvc2VzdExvd2VySW5kZXggPj0gMCkgewogICAgICAgIGRpc3RhbmNlTG93ZXIgPSBzYnJUdW5pbmdUYWJsZSBbYml0UmF0ZUNsb3Nlc3RMb3dlckluZGV4XS5iaXRyYXRlRnJvbSAtIGJpdHJhdGU7CiAgICAgIH0KICAgICAgaWYgKGJpdFJhdGVDbG9zZXN0VXBwZXJJbmRleCA+PSAwKSB7CiAgICAgICAgZGlzdGFuY2VVcHBlciA9IGJpdHJhdGUgLSBzYnJUdW5pbmdUYWJsZSBbYml0UmF0ZUNsb3Nlc3RVcHBlckluZGV4XS5iaXRyYXRlVG87CiAgICAgIH0KICAgICAgaWYgKCBkaXN0YW5jZVVwcGVyIDwgZGlzdGFuY2VMb3dlciApCiAgICAgIHsKICAgICAgICAqcEJpdFJhdGVDbG9zZXN0ID0gYml0UmF0ZUNsb3Nlc3RVcHBlcjsKICAgICAgfSBlbHNlIHsKICAgICAgICAqcEJpdFJhdGVDbG9zZXN0ID0gYml0UmF0ZUNsb3Nlc3RMb3dlcjsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgKnBCaXRSYXRlQ2xvc2VzdCA9IDA7CiAgICB9CiAgfQoKICByZXR1cm4gSU5WQUxJRF9UQUJMRV9JRFg7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qIQoKICBcYnJpZWYgIFNlbGVjdHMgdGhlIFBTIHR1bmluZyBzZXR0aW5ncyB0byB1c2UgZGVwZW5kZW50IG9uIGJpdHJhdGUKICBhbmQgY29yZSBjb2RlcgoKICBccmV0dXJuIEluZGV4IHRvIHRoZSBhcHByb3ByaWF0ZSB0YWJsZQoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIElOVApnZXRQc1R1bmluZ1RhYmxlSW5kZXgoVUlOVCBiaXRyYXRlLCBVSU5UICpwQml0UmF0ZUNsb3Nlc3QpewoKICBJTlQgaSwgcGFyYW1TZXRzID0gc2l6ZW9mIChwc1R1bmluZ1RhYmxlKSAvIHNpemVvZiAocHNUdW5pbmdUYWJsZSBbMF0pOwogIGludCBiaXRSYXRlQ2xvc2VzdExvd2VySW5kZXg9LTEsIGJpdFJhdGVDbG9zZXN0VXBwZXJJbmRleD0tMTsKICBVSU5UIGJpdFJhdGVDbG9zZXN0VXBwZXIgPSAwLCBiaXRSYXRlQ2xvc2VzdExvd2VyPURJU1RBTkNFX0NFSUxfVkFMVUU7CgogIGZvciAoaSA9IDAgOyBpIDwgcGFyYW1TZXRzIDsgaSsrKSAgewogICAgaWYgKChiaXRyYXRlID49IHBzVHVuaW5nVGFibGUgW2ldLmJpdHJhdGVGcm9tKSAmJgogICAgICAgIChiaXRyYXRlIDwgcHNUdW5pbmdUYWJsZSBbaV0uYml0cmF0ZVRvKSkgewogICAgICByZXR1cm4gaSA7CiAgICB9IGVsc2UgewogICAgICBpZiAoIHBzVHVuaW5nVGFibGUgW2ldLmJpdHJhdGVGcm9tID4gYml0cmF0ZSApIHsKICAgICAgICBpZiAocHNUdW5pbmdUYWJsZSBbaV0uYml0cmF0ZUZyb20gPCBiaXRSYXRlQ2xvc2VzdExvd2VyKSB7CiAgICAgICAgICBiaXRSYXRlQ2xvc2VzdExvd2VyID0gcHNUdW5pbmdUYWJsZSBbaV0uYml0cmF0ZUZyb207CiAgICAgICAgICBiaXRSYXRlQ2xvc2VzdExvd2VySW5kZXggPSBpOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoIHBzVHVuaW5nVGFibGUgW2ldLmJpdHJhdGVUbyA8PSBiaXRyYXRlICkgewogICAgICAgIGlmIChwc1R1bmluZ1RhYmxlIFtpXS5iaXRyYXRlVG8gPiBiaXRSYXRlQ2xvc2VzdFVwcGVyKSB7CiAgICAgICAgICBiaXRSYXRlQ2xvc2VzdFVwcGVyID0gcHNUdW5pbmdUYWJsZSBbaV0uYml0cmF0ZVRvLTE7CiAgICAgICAgICBiaXRSYXRlQ2xvc2VzdFVwcGVySW5kZXggPSBpOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KCiAgaWYgKHBCaXRSYXRlQ2xvc2VzdCAhPSBOVUxMKQogIHsKICAgIGludCBkaXN0YW5jZVVwcGVyPURJU1RBTkNFX0NFSUxfVkFMVUUsIGRpc3RhbmNlTG93ZXI9RElTVEFOQ0VfQ0VJTF9WQUxVRTsKICAgIGlmIChiaXRSYXRlQ2xvc2VzdExvd2VySW5kZXggPj0gMCkgewogICAgICBkaXN0YW5jZUxvd2VyID0gc2JyVHVuaW5nVGFibGUgW2JpdFJhdGVDbG9zZXN0TG93ZXJJbmRleF0uYml0cmF0ZUZyb20gLSBiaXRyYXRlOwogICAgfQogICAgaWYgKGJpdFJhdGVDbG9zZXN0VXBwZXJJbmRleCA+PSAwKSB7CiAgICAgIGRpc3RhbmNlVXBwZXIgPSBiaXRyYXRlIC0gc2JyVHVuaW5nVGFibGUgW2JpdFJhdGVDbG9zZXN0VXBwZXJJbmRleF0uYml0cmF0ZVRvOwogICAgfQogICAgaWYgKCBkaXN0YW5jZVVwcGVyIDwgZGlzdGFuY2VMb3dlciApCiAgICB7CiAgICAgICpwQml0UmF0ZUNsb3Nlc3QgPSBiaXRSYXRlQ2xvc2VzdFVwcGVyOwogICAgfSBlbHNlIHsKICAgICAgKnBCaXRSYXRlQ2xvc2VzdCA9IGJpdFJhdGVDbG9zZXN0TG93ZXI7CiAgICB9CiAgfQoKICByZXR1cm4gSU5WQUxJRF9UQUJMRV9JRFg7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qIQoKICBcYnJpZWYgIEluIGNhc2Ugb2YgZG93bnNhbXBsZWQgU0JSIHdlIG1heSBuZWVkIHRvIGxvd2VyIHRoZSBzdG9wIGZyZXEKICAgICAgICAgIG9mIGEgdHVuaW5nIHNldHRpbmcgdG8gZml0IGludG8gdGhlIGxvd2VyIGhhbGYgb2YgdGhlCiAgICAgICAgICBzcGVjdHJ1bSAoIHdoaWNoIGlzIHNhbXBsZVJhdGUvNCApCgogIFxyZXR1cm4gdGhlIGFkYXB0ZWQgc3RvcCBmcmVxdWVuY3kgaW5kZXggKC0xIC0+IGVycm9yKQoKICBcaW5ncm91cCBTYnJFbmNDZmcKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBJTlQKRkRLc2JyRW5jX0dldERvd25zYW1wbGVkU3RvcEZyZXEgKAogICAgICAgIGNvbnN0IElOVCBzYW1wbGVSYXRlQ29yZSwKICAgICAgICBjb25zdCBJTlQgc3RhcnRGcmVxLAogICAgICAgICAgICAgIElOVCBzdG9wRnJlcSwKICAgICAgICBjb25zdCBJTlQgZG93blNhbXBsZUZhY3RvcgogICAgICAgICkKewogIElOVCBtYXhTdG9wRnJlcVJhdyA9IHNhbXBsZVJhdGVDb3JlIC8gMjsKICBJTlQgc3RhcnRCYW5kLCBzdG9wQmFuZDsKICBIQU5ETEVfRVJST1JfSU5GTyBlcnI7CgogIHdoaWxlIChzdG9wRnJlcSA+IDAgJiYgRkRLc2JyRW5jX2dldFNiclN0b3BGcmVxUkFXKHN0b3BGcmVxLCBzYW1wbGVSYXRlQ29yZSkgPiBtYXhTdG9wRnJlcVJhdykgewogICAgc3RvcEZyZXEtLTsKICB9CgogIGlmIChGREtzYnJFbmNfZ2V0U2JyU3RvcEZyZXFSQVcoIHN0b3BGcmVxLCBzYW1wbGVSYXRlQ29yZSkgPiBtYXhTdG9wRnJlcVJhdykKICAgIHJldHVybiAtMTsKCiAgZXJyID0gRkRLc2JyRW5jX0ZpbmRTdGFydEFuZFN0b3BCYW5kICgKICAgICAgICAgICAgICAgIHNhbXBsZVJhdGVDb3JlPDwoZG93blNhbXBsZUZhY3Rvci0xKSwKICAgICAgICAgICAgICAgIHNhbXBsZVJhdGVDb3JlLAogICAgICAgICAgICAgICAgMzI8PChkb3duU2FtcGxlRmFjdG9yLTEpLAogICAgICAgICAgICAgICAgc3RhcnRGcmVxLAogICAgICAgICAgICAgICAgc3RvcEZyZXEsCiAgICAgICAgICAgICAgICZzdGFydEJhbmQsCiAgICAgICAgICAgICAgICZzdG9wQmFuZAogICAgICAgICAgICAgICAgKTsKICBpZiAoZXJyKQogICAgcmV0dXJuIC0xOwoKICByZXR1cm4gc3RvcEZyZXE7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiEKCiAgXGJyaWVmICB0ZWxscyB1cywgaWYgZm9yIHRoZSBnaXZlbiBjb3JlQ29kZXIsIGJpdHJhdGUsIG51bWJlciBvZiBjaGFubmVscwogICAgICAgICAgYW5kIGlucHV0IHNhbXBsaW5nIHJhdGUgYW4gU0JSIHNldHRpbmcgaXMgYXZhaWxhYmxlLiBJZiB5ZXMsIGl0CiAgICAgICAgICB0ZWxscyB1cyBhbHNvIHRoZSBjb3JlIHNhbXBsaW5nIHJhdGUgd2Ugd291bGQgbmVlZCB0byBydW4gd2l0aAoKICBccmV0dXJuIGEgZmxhZyBpbmRpY2F0aW5nIHN1Y2Nlc3M6IHllcyAoMSkgb3Igbm8gKDApCgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgVUlOVApGREtzYnJFbmNfSXNTYnJTZXR0aW5nQXZhaWwgKAogICAgICAgIFVJTlQgYml0cmF0ZSwgICAgICAgICAgIC8qISB0aGUgdG90YWwgYml0cmF0ZSBpbiBiaXRzL3NlYyAqLwogICAgICAgIFVJTlQgdmJyTW9kZSwgICAgICAgICAgIC8qISB0aGUgdmJyIHBhcmFtdGVyLCAwIG1lYW5zIGNvbnN0YW50IGJpdHJhdGUgKi8KICAgICAgICBVSU5UIG51bU91dHB1dENoYW5uZWxzLCAvKiEgdGhlIG51bWJlciBvZiBjaGFubmVscyBmb3IgdGhlIGNvcmUgY29kZXIgKi8KICAgICAgICBVSU5UIHNhbXBsZVJhdGVJbnB1dCwgICAvKiEgdGhlIGlucHV0IHNhbXBsZSByYXRlIFtpbiBIel0gKi8KICAgICAgICBVSU5UIHNhbXBsZVJhdGVDb3JlLCAgICAvKiEgdGhlIGNvcmUncyBzYW1wbGluZyByYXRlICovCiAgICAgICAgQVVESU9fT0JKRUNUX1RZUEUgY29yZQogICAgICAgICkKewogIElOVCBpZHggPSBJTlZBTElEX1RBQkxFX0lEWDsKCiAgaWYgKHNhbXBsZVJhdGVJbnB1dCA8IDE2MDAwKQogICAgcmV0dXJuIDA7CgogIGlmIChiaXRyYXRlPT0wKSB7CiAgICAvKiBtYXAgdmJyIHF1YWxpdHkgdG8gYml0cmF0ZSAqLwogICAgaWYgKHZick1vZGUgPCAzMCkKICAgICAgYml0cmF0ZSA9IDI0MDAwOwogICAgZWxzZSBpZiAodmJyTW9kZSA8IDQwKQogICAgICBiaXRyYXRlID0gMjgwMDA7CiAgICBlbHNlIGlmICh2YnJNb2RlIDwgNjApCiAgICAgIGJpdHJhdGUgPSAzMjAwMDsKICAgIGVsc2UgaWYgKHZick1vZGUgPCA3NSkKICAgICAgYml0cmF0ZSA9IDQwMDAwOwogICAgZWxzZQogICAgICBiaXRyYXRlID0gNDgwMDA7CiAgICBiaXRyYXRlICo9IG51bU91dHB1dENoYW5uZWxzOwogIH0KCiAgaWR4ID0gZ2V0U2JyVHVuaW5nVGFibGVJbmRleChiaXRyYXRlLCBudW1PdXRwdXRDaGFubmVscywgc2FtcGxlUmF0ZUNvcmUsIGNvcmUsIE5VTEwpOwoKICByZXR1cm4gKGlkeCA9PSBJTlZBTElEX1RBQkxFX0lEWCA/IDAgOiAxKTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qIQoKICBcYnJpZWYgIEFkanVzdHMgdGhlIFNCUiBzZXR0aW5ncyBhY2NvcmRpbmcgdG8gdGhlIGNob3NlbiBjb3JlIGNvZGVyCiAgICAgICAgICBzZXR0aW5ncyB3aGljaCBhcmUgYWNjZXNzaWJsZSB2aWEgY29uZmlnLT5jb2RlY1NldHRpbmdzCgogIFxyZXR1cm4gQSBmbGFnIGluZGljYXRpbmcgc3VjY2VzczogeWVzICgxKSBvciBubyAoMCkKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBVSU5UCkZES3NickVuY19BZGp1c3RTYnJTZXR0aW5ncyAoY29uc3Qgc2JyQ29uZmlndXJhdGlvblB0ciBjb25maWcsIC8qISBvdXRwdXQsIG1vZGlmaWVkICovCiAgICAgICAgICAgICAgICAgICBVSU5UIGJpdFJhdGUsICAgICAgICAgICAgIC8qISB0aGUgdG90YWwgYml0cmF0ZSBpbiBiaXRzL3NlYyAqLwogICAgICAgICAgICAgICAgICAgVUlOVCBudW1DaGFubmVscywgICAgICAgICAvKiEgdGhlIGNvcmUgY29kZXIgbnVtYmVyIG9mIGNoYW5uZWxzICovCiAgICAgICAgICAgICAgICAgICBVSU5UIHNhbXBsZVJhdGVDb3JlLCAgICAgIC8qISB0aGUgY29yZSBjb2RlciBzYW1wbGluZyByYXRlIGluIEh6ICovCiAgICAgICAgICAgICAgICAgICBVSU5UIHNhbXBsZVJhdGVTYnIsICAgICAgIC8qISB0aGUgc2JyIGNvZGVyIHNhbXBsaW5nIHJhdGUgaW4gSHogKi8KICAgICAgICAgICAgICAgICAgIFVJTlQgdHJhbnNGYWMsICAgICAgICAgICAgLyohIHRoZSBzaG9ydCBibG9jayB0byBsb25nIGJsb2NrIHJhdGlvICovCiAgICAgICAgICAgICAgICAgICBVSU5UIHN0YW5kYXJkQml0cmF0ZSwgICAgIC8qISB0aGUgc3RhbmRhcmQgYml0cmF0ZSBwZXIgY2hhbm5lbCBpbiBiaXRzL3NlYyAqLwogICAgICAgICAgICAgICAgICAgVUlOVCB2YnJNb2RlLCAgICAgICAgICAgICAvKiEgdGhlIHZiciBwYXJhbXRlciwgMCBwb29yIHF1YWxpdHkgLi4gMTAwIGhpZ2ggcXVhbGl0eSovCiAgICAgICAgICAgICAgICAgICBVSU5UIHVzZVNwZWVjaENvbmZpZywgICAgIC8qITwgYWRhcHQgdHVuaW5nIHBhcmFtZXRlcnMgZm9yIHNwZWVjaCA/ICovCiAgICAgICAgICAgICAgICAgICBVSU5UIGxjc01vZGUsICAgICAgICAgICAgIC8qISB0aGUgbG93IGNvbXBsZXhpdHkgc3RlcmVvIG1vZGUgKi8KICAgICAgICAgICAgICAgICAgIFVJTlQgYlBhcmFtZXRyaWNTdGVyZW8sICAgLyohPCB1c2UgcGFyYW1ldHJpYyBzdGVyZW8gKi8KICAgICAgICAgICAgICAgICAgIEFVRElPX09CSkVDVF9UWVBFIGNvcmUpICAgLyogQ29yZSBhdWRpbyBjb2RlYyBvYmplY3QgdHlwZSAqLwp7CiAgSU5UIGlkeCA9IElOVkFMSURfVEFCTEVfSURYOwogIC8qIHNldCB0aGUgY29yZSBjb2RlYyBzZXR0aW5ncyAqLwogIGNvbmZpZy0+Y29kZWNTZXR0aW5ncy5iaXRSYXRlICAgICAgICAgPSBiaXRSYXRlOwogIGNvbmZpZy0+Y29kZWNTZXR0aW5ncy5uQ2hhbm5lbHMgICAgICAgPSBudW1DaGFubmVsczsKICBjb25maWctPmNvZGVjU2V0dGluZ3Muc2FtcGxlRnJlcSAgICAgID0gc2FtcGxlUmF0ZUNvcmU7CiAgY29uZmlnLT5jb2RlY1NldHRpbmdzLnRyYW5zRmFjICAgICAgICA9IHRyYW5zRmFjOwogIGNvbmZpZy0+Y29kZWNTZXR0aW5ncy5zdGFuZGFyZEJpdHJhdGUgPSBzdGFuZGFyZEJpdHJhdGU7CgogIGlmIChiaXRSYXRlIDwgMjgwMDApIHsKICAgIGNvbmZpZy0+dGhyZXNob2xkX0FtcFJlc19GRl9tID0gKEZJWFBfREJMKU1BWFZBTF9EQkw7CiAgICBjb25maWctPnRocmVzaG9sZF9BbXBSZXNfRkZfZSA9IDc7CiAgfQogIGVsc2UgaWYgKGJpdFJhdGUgPj0gMjgwMDAgJiYgYml0UmF0ZSA8PSA0ODAwMCkgewogICAgLyogVGhlIGZsb2F0IHRocmVzaG9sZCBpcyA3NQogICAgICAgMC41MjQyODhmIGlzIGZyYWN0aW9uYWwgcGFydCBvZiBSRUxBWEFUSU9OLCB0aGUgcXVvdGFNYXRyaXggYW5kIHRoZXJlZm9yZSB0b25hbGl0eSBhcmUgc2NhbGVkIGJ5IHRoaXMKICAgICAgIDIvMyBpcyBiZWNhdXNlIHRoZSBvcmlnaW5hbCBpbXBsZW1lbnRhdGlvbiBkaXZpZGVzIHRoZSB0b25hbGl0eSB2YWx1ZXMgYnkgMywgaGVyZSBpdCdzIGRpdmlkZWQgYnkgMgogICAgICAgMTI4IGNvbXBlbnNhdGVzIHRoZSBuZWNlc3Nhcnkgc2hpZnRmYWN0b3Igb2YgNyAqLwogICAgY29uZmlnLT50aHJlc2hvbGRfQW1wUmVzX0ZGX20gPSBGTDJGWENPTlNUX0RCTCg3NS4wZiowLjUyNDI4OGYvKDIuMGYvMy4wZikvMTI4LjBmKTsKICAgIGNvbmZpZy0+dGhyZXNob2xkX0FtcFJlc19GRl9lID0gNzsKICB9CiAgZWxzZSBpZiAoYml0UmF0ZSA+IDQ4MDAwKSB7CiAgICBjb25maWctPnRocmVzaG9sZF9BbXBSZXNfRkZfbSA9IEZMMkZYQ09OU1RfREJMKDApOwogICAgY29uZmlnLT50aHJlc2hvbGRfQW1wUmVzX0ZGX2UgPSAwOwogIH0KCiAgaWYgKGJpdFJhdGU9PTApIHsKICAgIC8qIG1hcCB2YnIgcXVhbGl0eSB0byBiaXRyYXRlICovCiAgICBpZiAodmJyTW9kZSA8IDMwKQogICAgICBiaXRSYXRlID0gMjQwMDA7CiAgICBlbHNlIGlmICh2YnJNb2RlIDwgNDApCiAgICAgIGJpdFJhdGUgPSAyODAwMDsKICAgIGVsc2UgaWYgKHZick1vZGUgPCA2MCkKICAgICAgYml0UmF0ZSA9IDMyMDAwOwogICAgZWxzZSBpZiAodmJyTW9kZSA8IDc1KQogICAgICBiaXRSYXRlID0gNDAwMDA7CiAgICBlbHNlCiAgICAgIGJpdFJhdGUgPSA0ODAwMDsKICAgIGJpdFJhdGUgKj0gbnVtQ2hhbm5lbHM7CiAgICAvKiBmaXggdG8gZW5hYmxlIG1vbm8gdmJyTW9kZTw0MCBAIDQ0LjEgb2YgNDhrSHogKi8KICAgIGlmIChudW1DaGFubmVscz09MSkgewogICAgICBpZiAoc2FtcGxlUmF0ZVNicj09NDQxMDAgfHwgc2FtcGxlUmF0ZVNicj09NDgwMDApIHsKICAgICAgICBpZiAodmJyTW9kZTw0MCkgYml0UmF0ZSA9IDMyMDAwOwogICAgICB9CiAgICB9CiAgfQoKICBpZHggPSBnZXRTYnJUdW5pbmdUYWJsZUluZGV4KGJpdFJhdGUsbnVtQ2hhbm5lbHMsc2FtcGxlUmF0ZUNvcmUsIGNvcmUsIE5VTEwpOwoKICBpZiAoaWR4ICE9IElOVkFMSURfVEFCTEVfSURYKSB7CiAgICBjb25maWctPnN0YXJ0RnJlcSAgICAgICA9IHNiclR1bmluZ1RhYmxlW2lkeF0uc3RhcnRGcmVxIDsKICAgIGNvbmZpZy0+c3RvcEZyZXEgICAgICAgID0gc2JyVHVuaW5nVGFibGVbaWR4XS5zdG9wRnJlcSA7CiAgICBpZiAodXNlU3BlZWNoQ29uZmlnKSB7CiAgICAgIGNvbmZpZy0+c3RhcnRGcmVxICAgICA9IHNiclR1bmluZ1RhYmxlW2lkeF0uc3RhcnRGcmVxU3BlZWNoOwogICAgICBjb25maWctPnN0b3BGcmVxICAgICAgPSBzYnJUdW5pbmdUYWJsZVtpZHhdLnN0b3BGcmVxU3BlZWNoOwogICAgfQoKICAgIC8qIEFkYXB0IHN0b3AgZnJlcXVlbmN5IGluIGNhc2Ugb2YgZG93bnNhbXBsZWQgU0JSIC0gb25seSAzMiBiYW5kcyB0aGVuICovCiAgICBpZiAoMSA9PSBjb25maWctPmRvd25TYW1wbGVGYWN0b3IpIHsKICAgICAgSU5UIGRzU3RvcEZyZXEgPSBGREtzYnJFbmNfR2V0RG93bnNhbXBsZWRTdG9wRnJlcSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGVDb3JlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5zdGFydEZyZXEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWctPnN0b3BGcmVxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5kb3duU2FtcGxlRmFjdG9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICBpZiAoZHNTdG9wRnJlcSA8IDApIHsKICAgICAgICByZXR1cm4gMDsKICAgICAgfQoKICAgICAgY29uZmlnLT5zdG9wRnJlcSA9IGRzU3RvcEZyZXE7CiAgICB9CgogICAgY29uZmlnLT5zYnJfbm9pc2VfYmFuZHMgPSBzYnJUdW5pbmdUYWJsZVtpZHhdLm51bU5vaXNlQmFuZHMgOwogICAgaWYgKGNvcmUgPT0gQU9UX0VSX0FBQ19FTEQpCiAgICAgIGNvbmZpZy0+aW5pdF9hbXBfcmVzX0ZGID0gU0JSX0FNUF9SRVNfMV81OwogICAgY29uZmlnLT5ub2lzZUZsb29yT2Zmc2V0PSBzYnJUdW5pbmdUYWJsZVtpZHhdLm5vaXNlRmxvb3JPZmZzZXQ7CgogICAgY29uZmlnLT5hbmFfbWF4X2xldmVsICAgPSBzYnJUdW5pbmdUYWJsZVtpZHhdLm5vaXNlTWF4TGV2ZWwgOwogICAgY29uZmlnLT5zdGVyZW9Nb2RlICAgICAgPSBzYnJUdW5pbmdUYWJsZVtpZHhdLnN0ZXJlb01vZGUgOwogICAgY29uZmlnLT5mcmVxU2NhbGUgICAgICAgPSBzYnJUdW5pbmdUYWJsZVtpZHhdLmZyZXFTY2FsZSA7CgogICAgaWYgKG51bUNoYW5uZWxzID09IDEpIHsKICAgICAgLyogc3RlcmVvIGNhc2UgKi8KICAgICAgc3dpdGNoIChjb3JlKSB7CiAgICAgICAgY2FzZSBBT1RfQUFDX0xDOgogICAgICAgICAgaWYgKGJpdFJhdGUgPD0gKHVzZVNwZWVjaENvbmZpZz8yNDAwMFU6MjAwMDBVKSkgewogICAgICAgICAgICBjb25maWctPmZyZXFfcmVzX2ZpeGZpeFswXSA9IEZSRVFfUkVTX0xPVzsgLyogc2V0IGxvdyBmcmVxdWVuY3kgcmVzb2x1dGlvbiBmb3Igbm9uLXNwbGl0IGZyYW1lcyAqLwogICAgICAgICAgICBjb25maWctPmZyZXFfcmVzX2ZpeGZpeFsxXSA9IEZSRVFfUkVTX0xPVzsgLyogc2V0IGxvdyBmcmVxdWVuY3kgcmVzb2x1dGlvbiBmb3Igc3BsaXQgZnJhbWVzICovCiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIEFPVF9FUl9BQUNfRUxEOgogICAgICAgICAgaWYgKGJpdFJhdGUgPCAzNjAwMCkKICAgICAgICAgICAgY29uZmlnLT5mcmVxX3Jlc19maXhmaXhbMV0gPSBGUkVRX1JFU19MT1c7IC8qIHNldCBsb3cgZnJlcXVlbmN5IHJlc29sdXRpb24gZm9yIHNwbGl0IGZyYW1lcyAqLwogICAgICAgICAgaWYgKGJpdFJhdGUgPCAyNjAwMCkgewogICAgICAgICAgICBjb25maWctPmZyZXFfcmVzX2ZpeGZpeFswXSA9IEZSRVFfUkVTX0xPVzsgLyogc2V0IGxvdyBmcmVxdWVuY3kgcmVzb2x1dGlvbiBmb3Igbm9uLXNwbGl0IGZyYW1lcyAqLwogICAgICAgICAgICBjb25maWctPmZSZXNUcmFuc0lzTG93ID0gMTsgICAgICAgICAgICAgICAgLyogZm9yIHRyYW5zaWVudCBmcmFtZXMsIHNldCBsb3cgZnJlcXVlbmN5IHJlc29sdXRpb24gKi8KICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgIC8qIHN0ZXJlbyBjYXNlICovCiAgICAgIHN3aXRjaCAoY29yZSkgewogICAgICAgIGNhc2UgQU9UX0FBQ19MQzoKICAgICAgICAgIGlmIChiaXRSYXRlIDw9IDI4MDAwKSB7CiAgICAgICAgICAgIGNvbmZpZy0+ZnJlcV9yZXNfZml4Zml4WzBdID0gRlJFUV9SRVNfTE9XOyAvKiBzZXQgbG93IGZyZXF1ZW5jeSByZXNvbHV0aW9uIGZvciBub24tc3BsaXQgZnJhbWVzICovCiAgICAgICAgICAgIGNvbmZpZy0+ZnJlcV9yZXNfZml4Zml4WzFdID0gRlJFUV9SRVNfTE9XOyAvKiBzZXQgbG93IGZyZXF1ZW5jeSByZXNvbHV0aW9uIGZvciBzcGxpdCBmcmFtZXMgKi8KICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgQU9UX0VSX0FBQ19FTEQ6CiAgICAgICAgICBpZiAoYml0UmF0ZSA8IDcyMDAwKSB7CiAgICAgICAgICAgIGNvbmZpZy0+ZnJlcV9yZXNfZml4Zml4WzFdID0gRlJFUV9SRVNfTE9XOyAvKiBzZXQgbG93IGZyZXF1ZW5jeSByZXNvbHV0aW9uIGZvciBzcGxpdCBmcmFtZXMgKi8KICAgICAgICAgIH0KICAgICAgICAgIGlmIChiaXRSYXRlIDwgNTIwMDApIHsKICAgICAgICAgICAgY29uZmlnLT5mcmVxX3Jlc19maXhmaXhbMF0gPSBGUkVRX1JFU19MT1c7IC8qIHNldCBsb3cgZnJlcXVlbmN5IHJlc29sdXRpb24gZm9yIG5vbi1zcGxpdCBmcmFtZXMgKi8KICAgICAgICAgICAgY29uZmlnLT5mUmVzVHJhbnNJc0xvdyA9IDE7ICAgICAgICAgICAgICAgIC8qIGZvciB0cmFuc2llbnQgZnJhbWVzLCBzZXQgbG93IGZyZXF1ZW5jeSByZXNvbHV0aW9uICovCiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgaWYgKGJpdFJhdGUgPD0gMjgwMDApIHsKICAgICAgICAvKgogICAgICAgICAgYWRkaXRpb25hbGx5IHJlc3RyaWN0IGZyZXF1ZW5jeSByZXNvbHV0aW9uIGluIEZJWEZJWCBmcmFtZXMKICAgICAgICAgIHRvIGZ1cnRoZXIgcmVkdWNlIFNCUiBwYXlsb2FkIHNpemUgKi8KICAgICAgICBjb25maWctPmZyZXFfcmVzX2ZpeGZpeFswXSA9IEZSRVFfUkVTX0xPVzsKICAgICAgICBjb25maWctPmZyZXFfcmVzX2ZpeGZpeFsxXSA9IEZSRVFfUkVTX0xPVzsKICAgICAgfQogICAgfQoKICAgIC8qIGFkanVzdCB1c2FnZSBvZiBwYXJhbWV0cmljIGNvZGluZyBkZXBlbmRlbnQgb24gYml0cmF0ZSBhbmQgc3BlZWNoIGNvbmZpZyBmbGFnICovCiAgICBpZiAodXNlU3BlZWNoQ29uZmlnKQogICAgICBjb25maWctPnBhcmFtZXRyaWNDb2RpbmcgID0gMDsKCiAgICBpZiAoY29yZSA9PSBBT1RfRVJfQUFDX0VMRCkgewogICAgICBpZiAoYml0UmF0ZSA8IDI4MDAwKQogICAgICAgIGNvbmZpZy0+aW5pdF9hbXBfcmVzX0ZGID0gU0JSX0FNUF9SRVNfM18wOwogICAgICBjb25maWctPlNlbmRIZWFkZXJEYXRhVGltZSA9IC0xOwogICAgfQoKICAgIGlmIChudW1DaGFubmVscyA9PSAxKSB7CiAgICAgIGlmIChiaXRSYXRlIDwgMTYwMDApIHsKICAgICAgICBjb25maWctPnBhcmFtZXRyaWNDb2RpbmcgID0gMDsKICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgIGlmIChiaXRSYXRlIDwgMjAwMDApIHsKICAgICAgICBjb25maWctPnBhcmFtZXRyaWNDb2RpbmcgID0gMDsKICAgICAgfQogICAgfQoKICAgIGNvbmZpZy0+dXNlU3BlZWNoQ29uZmlnID0gdXNlU3BlZWNoQ29uZmlnOwoKICAgIC8qIFBTIHNldHRpbmdzICovCiAgICBjb25maWctPmJQYXJhbWV0cmljU3RlcmVvID0gYlBhcmFtZXRyaWNTdGVyZW87CgogICAgcmV0dXJuIDEgOwogIH0KICBlbHNlIHsKICAgIHJldHVybiAwIDsKICB9Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKIGZ1bmN0aW9ubmFtZTogRkRLc2JyRW5jX0luaXRpYWxpemVTYnJEZWZhdWx0cwogZGVzY3JpcHRpb246ICBpbml0aWFsaXplcyB0aGUgU0JSIGNvbmZpZnVyYXRpb24KIHJldHVybnM6ICAgICAgZXJyb3Igc3RhdHVzCiBpbnB1dDogICAgICAgIC0gY29yZSBjb2RlYyB0eXBlLAogICAgICAgICAgICAgICAtIGZhY3RvciBvZiBTQlIgdG8gY29yZSBmcmFtZSBsZW5ndGgsCiAgICAgICAgICAgICAgIC0gY29yZSBmcmFtZSBsZW5ndGgKIG91dHB1dDogICAgICAgaW5pdGlhbGl6ZWQgU0JSIGNvbmZpZ3VyYXRpb24KCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgVUlOVApGREtzYnJFbmNfSW5pdGlhbGl6ZVNickRlZmF1bHRzIChzYnJDb25maWd1cmF0aW9uUHRyIGNvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgICAgICBkb3duU2FtcGxlRmFjdG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UICAgICAgICAgICAgICAgIGNvZGVjR3JhbnVsZUxlbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxjb25zdCBJTlQgICAgICAgICAgIGlzTG93RGVsYXkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQp7CiAgICBpZiAoIChkb3duU2FtcGxlRmFjdG9yIDwgMSB8fCBkb3duU2FtcGxlRmFjdG9yID4gMikgfHwKICAgICAgICAgKGNvZGVjR3JhbnVsZUxlbipkb3duU2FtcGxlRmFjdG9yID4gUU1GX0NIQU5ORUxTKlFNRl9NQVhfVElNRV9TTE9UUykgKQogICAgICAgcmV0dXJuKDApOyAvKiBlcnJvciAqLwoKICAgIGNvbmZpZy0+U2VuZEhlYWRlckRhdGFUaW1lICAgICA9IDEwMDA7CiAgICBjb25maWctPnVzZVdhdmVDb2RpbmcgICAgICAgICAgPSAwOwogICAgY29uZmlnLT5jcmNTYnIgICAgICAgICAgICAgICAgID0gMDsKICAgIGNvbmZpZy0+ZHluQndTdXBwb3J0ZWQgICAgICAgICA9IDE7CiAgICBpZiAoaXNMb3dEZWxheSkKICAgICAgY29uZmlnLT50cmFuX3RociAgICAgICAgICAgICA9IDYwMDA7CiAgICBlbHNlCiAgICAgIGNvbmZpZy0+dHJhbl90aHIgICAgICAgICAgICAgPSAxMzAwMDsKCiAgICBjb25maWctPnBhcmFtZXRyaWNDb2RpbmcgICAgICAgPSAxOwoKICAgIGNvbmZpZy0+c2JyRnJhbWVTaXplICAgICAgICAgICA9IGNvZGVjR3JhbnVsZUxlbiAqIGRvd25TYW1wbGVGYWN0b3I7CiAgICBjb25maWctPmRvd25TYW1wbGVGYWN0b3IgICAgICAgPSBkb3duU2FtcGxlRmFjdG9yOwoKICAgIC8qIHNiciBkZWZhdWx0IHBhcmFtZXRlcnMgKi8KICAgIGNvbmZpZy0+c2JyX2RhdGFfZXh0cmEgICAgICAgICA9IDA7CiAgICBjb25maWctPmFtcF9yZXMgICAgICAgICAgICAgICAgPSBTQlJfQU1QX1JFU18zXzAgOwogICAgY29uZmlnLT50cmFuX2ZjICAgICAgICAgICAgICAgID0gMCA7CiAgICBjb25maWctPnRyYW5fZGV0X21vZGUgICAgICAgICAgPSAxIDsKICAgIGNvbmZpZy0+c3ByZWFkICAgICAgICAgICAgICAgICA9IDEgOwogICAgY29uZmlnLT5zdGF0ICAgICAgICAgICAgICAgICAgID0gMCA7CiAgICBjb25maWctPmUgICAgICAgICAgICAgICAgICAgICAgPSAxIDsKICAgIGNvbmZpZy0+ZGVsdGFUQWNyb3NzRnJhbWVzICAgICA9IDEgOwogICAgY29uZmlnLT5kRl9lZGdlXzFzdEVudiAgICAgICAgID0gRkwyRlhDT05TVF9EQkwoMC4zZikgOwogICAgY29uZmlnLT5kRl9lZGdlX2luY3IgICAgICAgICAgID0gRkwyRlhDT05TVF9EQkwoMC4zZikgOwoKICAgIGNvbmZpZy0+c2JyX2ludmZfbW9kZSAgID0gSU5WRl9TV0lUQ0hFRDsKICAgIGNvbmZpZy0+c2JyX3hwb3NfbW9kZSAgID0gWFBPU19MQzsKICAgIGNvbmZpZy0+c2JyX3hwb3NfY3RybCAgID0gU0JSX1hQT1NfQ1RSTF9ERUZBVUxUOwogICAgY29uZmlnLT5zYnJfeHBvc19sZXZlbCAgPSAwOwogICAgY29uZmlnLT51c2VTYVBhbiAgICAgICAgPSAwOwogICAgY29uZmlnLT5keW5Cd0VuYWJsZWQgICAgPSAwOwoKCiAgICAvKiB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnMgYXJlIG92ZXJ3cml0dGVuIGJ5IHRoZSBGREtzYnJFbmNfQWRqdXN0U2JyU2V0dGluZ3MoKSBmdW5jdGlvbiBzaW5jZQogICAgICAgdGhleSBhcmUgaW5jbHVkZWQgaW4gdGhlIHR1bmluZyB0YWJsZSAqLwogICAgY29uZmlnLT5zdGVyZW9Nb2RlICAgICAgICAgICAgID0gU0JSX1NXSVRDSF9MUkM7CiAgICBjb25maWctPmFuYV9tYXhfbGV2ZWwgICAgICAgICAgPSA2OwogICAgY29uZmlnLT5ub2lzZUZsb29yT2Zmc2V0ICAgICAgID0gMDsKICAgIGNvbmZpZy0+c3RhcnRGcmVxICAgICAgICAgICAgICA9IDU7IC8qICA1LjkgcmVzcGVjdGl2ZWx5ICA2LjAga0h6IGF0IGZzID0gNDQuMS80OCBrSHogKi8KICAgIGNvbmZpZy0+c3RvcEZyZXEgICAgICAgICAgICAgICA9IDk7IC8qIDE2LjIgcmVzcGVjdGl2ZWx5IDE2Ljgga0h6IGF0IGZzID0gNDQuMS80OCBrSHogKi8KICAgIGNvbmZpZy0+ZnJlcV9yZXNfZml4Zml4WzBdICAgICA9IEZSRVFfUkVTX0hJR0g7ICAvKiBub24tc3BsaXQgY2FzZSAqLwogICAgY29uZmlnLT5mcmVxX3Jlc19maXhmaXhbMV0gICAgID0gRlJFUV9SRVNfSElHSDsgIC8qIHNwbGl0IGNhc2UgKi8KICAgIGNvbmZpZy0+ZlJlc1RyYW5zSXNMb3cgPSAwOyAgLyogZm9yIHRyYW5zaWVudCBmcmFtZXMsIHNldCB2YXJpYWJsZSBmcmVxdWVuY3kgcmVzb2x1dGlvbiBhY2NvcmRpbmcgdG8gZnJlcVJlc1RhYmxlICovCgogICAgLyogaGVhZGVyX2V4dHJhXzEgKi8KICAgIGNvbmZpZy0+ZnJlcVNjYWxlICAgICAgID0gU0JSX0ZSRVFfU0NBTEVfREVGQVVMVDsKICAgIGNvbmZpZy0+YWx0ZXJTY2FsZSAgICAgID0gU0JSX0FMVEVSX1NDQUxFX0RFRkFVTFQ7CiAgICBjb25maWctPnNicl9ub2lzZV9iYW5kcyA9IFNCUl9OT0lTRV9CQU5EU19ERUZBVUxUOwoKICAgIC8qIGhlYWRlcl9leHRyYV8yICovCiAgICBjb25maWctPnNicl9saW1pdGVyX2JhbmRzICAgID0gU0JSX0xJTUlURVJfQkFORFNfREVGQVVMVDsKICAgIGNvbmZpZy0+c2JyX2xpbWl0ZXJfZ2FpbnMgICAgPSBTQlJfTElNSVRFUl9HQUlOU19ERUZBVUxUOwogICAgY29uZmlnLT5zYnJfaW50ZXJwb2xfZnJlcSAgICA9IFNCUl9JTlRFUlBPTF9GUkVRX0RFRkFVTFQ7CiAgICBjb25maWctPnNicl9zbW9vdGhpbmdfbGVuZ3RoID0gU0JSX1NNT09USElOR19MRU5HVEhfREVGQVVMVDsKCiAgICByZXR1cm4gMTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKIGZ1bmN0aW9ubmFtZTogRGVsZXRlRW52Q2hhbm5lbAogZGVzY3JpcHRpb246ICBmcmVlcyBtZW1vcnkgb2Ygb25lIFNCUiBjaGFubmVsCiByZXR1cm5zOiAgICAgIC0KIGlucHV0OiAgICAgICAgaGFuZGxlIG9mIGNoYW5uZWwKIG91dHB1dDogICAgICAgcmVsZWFzZWQgaGFuZGxlCgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIHZvaWQKZGVsZXRlRW52Q2hhbm5lbCAoSEFORExFX0VOVl9DSEFOTkVMIGhFbnZDdXQpCnsKICBpZiAoaEVudkN1dCkgewoKICAgIEZES3NickVuY19EZWxldGVUb25Db3JyUGFyYW1FeHRyKCZoRW52Q3V0LT5Ub25Db3JyKTsKCiAgICBGREtzYnJFbmNfZGVsZXRlRXh0cmFjdFNickVudmVsb3BlICgmaEVudkN1dC0+c2JyRXh0cmFjdEVudmVsb3BlKTsKICB9Cgp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgogZnVuY3Rpb25uYW1lOiBzYnJFbmNvZGVyX0NoYW5uZWxDbG9zZQogZGVzY3JpcHRpb246ICBjbG9zZSB0aGUgY2hhbm5lbCBjb2RpbmcgaGFuZGxlCiByZXR1cm5zOgogaW5wdXQ6ICAgICAgICBwaFNickNoYW5uZWwKIG91dHB1dDoKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgdm9pZApzYnJFbmNvZGVyX0NoYW5uZWxDbG9zZShIQU5ETEVfU0JSX0NIQU5ORUwgaFNickNoYW5uZWwpCnsKICBpZiAoaFNickNoYW5uZWwgIT0gTlVMTCkKICB7CiAgICBkZWxldGVFbnZDaGFubmVsICgmaFNickNoYW5uZWwtPmhFbnZDaGFubmVsKTsKICB9Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKIGZ1bmN0aW9ubmFtZTogc2JyRW5jb2Rlcl9FbGVtZW50Q2xvc2UKIGRlc2NyaXB0aW9uOiAgY2xvc2UgdGhlIGNoYW5uZWwgY29kaW5nIGhhbmRsZQogcmV0dXJuczoKIGlucHV0OiAgICAgICAgcGhTYnJDaGFubmVsCiBvdXRwdXQ6CgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIHZvaWQKc2JyRW5jb2Rlcl9FbGVtZW50Q2xvc2UoSEFORExFX1NCUl9FTEVNRU5UICpwaFNickVsZW1lbnQpCnsKICBIQU5ETEVfU0JSX0VMRU1FTlQgaFNickVsZW1lbnQgPSAqcGhTYnJFbGVtZW50OwoKICBpZiAoaFNickVsZW1lbnQhPU5VTEwpIHsKICAgIGlmIChoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS52X2tfbWFzdGVyKQogICAgICBGcmVlUmFtX1Nicl92X2tfbWFzdGVyKCZoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS52X2tfbWFzdGVyKTsKICAgIGlmIChoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5mcmVxQmFuZFRhYmxlW0xPXSkKICAgICAgRnJlZVJhbV9TYnJfZnJlcUJhbmRUYWJsZUxPKCZoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5mcmVxQmFuZFRhYmxlW0xPXSk7CiAgICBpZiAoaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEuZnJlcUJhbmRUYWJsZVtISV0pCiAgICAgIEZyZWVSYW1fU2JyX2ZyZXFCYW5kVGFibGVISSgmaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEuZnJlcUJhbmRUYWJsZVtISV0pOwoKICAgIEZyZWVSYW1fU2JyRWxlbWVudChwaFNickVsZW1lbnQpOwogIH0KICByZXR1cm4gOwoKfQoKCnZvaWQgc2JyRW5jb2Rlcl9DbG9zZSAoSEFORExFX1NCUl9FTkNPREVSICpwaFNickVuY29kZXIpCnsKICBIQU5ETEVfU0JSX0VOQ09ERVIgaFNickVuY29kZXIgPSAqcGhTYnJFbmNvZGVyOwoKICBpZiAoaFNickVuY29kZXIgIT0gTlVMTCkKICB7CiAgICBpbnQgZWwsIGNoOwoKICAgIGZvciAoZWw9MDsgZWw8KDgpOyBlbCsrKQogICAgewogICAgICBpZiAoaFNickVuY29kZXItPnNickVsZW1lbnRbZWxdIT1OVUxMKSB7CiAgICAgICAgc2JyRW5jb2Rlcl9FbGVtZW50Q2xvc2UoJmhTYnJFbmNvZGVyLT5zYnJFbGVtZW50W2VsXSk7CiAgICAgIH0KICAgIH0KCiAgICAvKiBDbG9zZSBzYnIgQ2hhbm5lbHMgKi8KICAgIGZvciAoY2g9MDsgY2g8KDgpOyBjaCsrKQogICAgewogICAgICBpZiAoaFNickVuY29kZXItPnBTYnJDaGFubmVsW2NoXSkgewogICAgICAgIHNickVuY29kZXJfQ2hhbm5lbENsb3NlKGhTYnJFbmNvZGVyLT5wU2JyQ2hhbm5lbFtjaF0pOwogICAgICAgIEZyZWVSYW1fU2JyQ2hhbm5lbCgmaFNickVuY29kZXItPnBTYnJDaGFubmVsW2NoXSk7CiAgICAgIH0KCiAgICAgIGlmIChoU2JyRW5jb2Rlci0+UW1mQW5hbHlzaXNbY2hdLkZpbHRlclN0YXRlcykKICAgICAgICBGcmVlUmFtX1Nicl9RbWZTdGF0ZXNBbmFseXNpcygoRklYUF9RQVMqKikmaFNickVuY29kZXItPlFtZkFuYWx5c2lzW2NoXS5GaWx0ZXJTdGF0ZXMpOwoKCiAgICB9CgogICAgaWYgKGhTYnJFbmNvZGVyLT5oUGFyYW1ldHJpY1N0ZXJlbykKICAgICAgUFNFbmNfRGVzdHJveSgmaFNickVuY29kZXItPmhQYXJhbWV0cmljU3RlcmVvKTsKICAgIGlmIChoU2JyRW5jb2Rlci0+cW1mU3ludGhlc2lzUFMuRmlsdGVyU3RhdGVzKQogICAgICBGcmVlUmFtX1BzUW1mU3RhdGVzU3ludGhlc2lzKChGSVhQX0RCTCoqKSZoU2JyRW5jb2Rlci0+cW1mU3ludGhlc2lzUFMuRmlsdGVyU3RhdGVzKTsKCiAgICAvKiBSZWxlYXNlIE92ZXJsYXkgKi8KICAgIEZyZWVSYW1fU2JyRHluYW1pY19SQU0oKEZJWFBfREJMKiopJmhTYnJFbmNvZGVyLT5wU0JSZHluYW1pY19SQU0pOwoKCiAgICBGcmVlUmFtX1NickVuY29kZXIocGhTYnJFbmNvZGVyKTsKICB9Cgp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiBmdW5jdGlvbm5hbWU6IHVwZGF0ZUZyZXFCYW5kVGFibGUKIGRlc2NyaXB0aW9uOiAgdXBkYXRlcyB2a19tYXN0ZXIKIHJldHVybnM6ICAgICAgLQogaW5wdXQ6ICAgICAgICBjb25maWcgaGFuZGxlCiBvdXRwdXQ6ICAgICAgIGVycm9yIGluZm8KCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSU5UIHVwZGF0ZUZyZXFCYW5kVGFibGUoCiAgICAgICAgSEFORExFX1NCUl9DT05GSUdfREFUQSAgc2JyQ29uZmlnRGF0YSwKICAgICAgICBIQU5ETEVfU0JSX0hFQURFUl9EQVRBICBzYnJIZWFkZXJEYXRhLAogICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgIGRvd25TYW1wbGVGYWN0b3IKICAgICAgICApCnsKICBJTlQgazAsIGsyOwoKICBpZiggRkRLc2JyRW5jX0ZpbmRTdGFydEFuZFN0b3BCYW5kICgKICAgICAgICAgICAgICBzYnJDb25maWdEYXRhLT5zYW1wbGVGcmVxLAogICAgICAgICAgICAgIHNickNvbmZpZ0RhdGEtPnNhbXBsZUZyZXEgPj4gKGRvd25TYW1wbGVGYWN0b3ItMSksCiAgICAgICAgICAgICAgc2JyQ29uZmlnRGF0YS0+bm9RbWZCYW5kcywKICAgICAgICAgICAgICBzYnJIZWFkZXJEYXRhLT5zYnJfc3RhcnRfZnJlcXVlbmN5LAogICAgICAgICAgICAgIHNickhlYWRlckRhdGEtPnNicl9zdG9wX2ZyZXF1ZW5jeSwKICAgICAgICAgICAgICZrMCwKICAgICAgICAgICAgICZrMgogICAgICAgICAgICAgICkKICAgICkKICAgIHJldHVybigxKTsKCgogIGlmKCBGREtzYnJFbmNfVXBkYXRlRnJlcVNjYWxlKAogICAgICAgICAgICAgIHNickNvbmZpZ0RhdGEtPnZfa19tYXN0ZXIsCiAgICAgICAgICAgICAmc2JyQ29uZmlnRGF0YS0+bnVtX01hc3RlciwKICAgICAgICAgICAgICBrMCwKICAgICAgICAgICAgICBrMiwKICAgICAgICAgICAgICBzYnJIZWFkZXJEYXRhLT5mcmVxU2NhbGUsCiAgICAgICAgICAgICAgc2JySGVhZGVyRGF0YS0+YWx0ZXJTY2FsZQogICAgICAgICAgICAgICkKICAgICkKICAgIHJldHVybigxKTsKCgogIHNickhlYWRlckRhdGEtPnNicl94b3Zlcl9iYW5kPTA7CgoKICBpZiggRkRLc2JyRW5jX1VwZGF0ZUhpUmVzKAogICAgICAgICAgICAgIHNickNvbmZpZ0RhdGEtPmZyZXFCYW5kVGFibGVbSEldLAogICAgICAgICAgICAgICZzYnJDb25maWdEYXRhLT5uU2ZiW0hJXSwKICAgICAgICAgICAgICBzYnJDb25maWdEYXRhLT52X2tfbWFzdGVyLAogICAgICAgICAgICAgIHNickNvbmZpZ0RhdGEtPm51bV9NYXN0ZXIsCiAgICAgICAgICAgICAgJnNickhlYWRlckRhdGEtPnNicl94b3Zlcl9iYW5kCiAgICAgICAgICAgICAgKQogICAgKQogICAgcmV0dXJuKDEpOwoKCiAgRkRLc2JyRW5jX1VwZGF0ZUxvUmVzKAogICAgICAgICAgc2JyQ29uZmlnRGF0YS0+ZnJlcUJhbmRUYWJsZVtMT10sCiAgICAgICAgICAmc2JyQ29uZmlnRGF0YS0+blNmYltMT10sCiAgICAgICAgICBzYnJDb25maWdEYXRhLT5mcmVxQmFuZFRhYmxlW0hJXSwKICAgICAgICAgIHNickNvbmZpZ0RhdGEtPm5TZmJbSEldCiAgICAgICAgICApOwoKCiAgc2JyQ29uZmlnRGF0YS0+eE92ZXJGcmVxID0gKHNickNvbmZpZ0RhdGEtPmZyZXFCYW5kVGFibGVbTE9XX1JFU11bMF0gKiBzYnJDb25maWdEYXRhLT5zYW1wbGVGcmVxIC8gc2JyQ29uZmlnRGF0YS0+bm9RbWZCYW5kcysxKT4+MTsKCiAgcmV0dXJuICgwKTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKIGZ1bmN0aW9ubmFtZTogcmVzZXRFbnZDaGFubmVsCiBkZXNjcmlwdGlvbjogIHJlc2V0cyBwYXJhbWV0ZXJzIGFuZCBhbGxvY2F0ZXMgbWVtb3J5CiByZXR1cm5zOiAgICAgIGVycm9yIHN0YXR1cwogaW5wdXQ6CiBvdXRwdXQ6ICAgICAgIGhFbnYKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSU5UIHJlc2V0RW52Q2hhbm5lbCAoSEFORExFX1NCUl9DT05GSUdfREFUQSAgc2JyQ29uZmlnRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgIHNickhlYWRlckRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRU5WX0NIQU5ORUwgICAgICBoRW52KQp7CiAgLyogbm90ZSAhISEgaEVudi0+ZW5jRW52RGF0YS5ub09mbm9pc2ViYW5kcyB3aWxsIGJlIHVwZGF0ZWQgbGF0ZXIgaW4gZnVuY3Rpb24gRkRLc2JyRW5jX2V4dHJhY3RTYnJFbnZlbG9wZSAhISEqLwogIGhFbnYtPlRvbkNvcnIuc2JyTm9pc2VGbG9vckVzdGltYXRlLm5vaXNlQmFuZHMgPSAgc2JySGVhZGVyRGF0YS0+c2JyX25vaXNlX2JhbmRzOwoKCiAgaWYoRkRLc2JyRW5jX1Jlc2V0VG9uQ29yclBhcmFtRXh0cigmaEVudi0+VG9uQ29yciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyQ29uZmlnRGF0YS0+eHBvc0N0cmxTd2l0Y2gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickNvbmZpZ0RhdGEtPmZyZXFCYW5kVGFibGVbSEldWzBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJDb25maWdEYXRhLT52X2tfbWFzdGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJDb25maWdEYXRhLT5udW1fTWFzdGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJDb25maWdEYXRhLT5zYW1wbGVGcmVxLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJDb25maWdEYXRhLT5mcmVxQmFuZFRhYmxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJDb25maWdEYXRhLT5uU2ZiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJDb25maWdEYXRhLT5ub1FtZkJhbmRzKSkKICAgIHJldHVybigxKTsKCiAgaEVudi0+c2JyQ29kZU5vaXNlRmxvb3IublNmYltMT10gPSBoRW52LT5Ub25Db3JyLnNick5vaXNlRmxvb3JFc3RpbWF0ZS5ub05vaXNlQmFuZHM7CiAgaEVudi0+c2JyQ29kZU5vaXNlRmxvb3IublNmYltISV0gPSBoRW52LT5Ub25Db3JyLnNick5vaXNlRmxvb3JFc3RpbWF0ZS5ub05vaXNlQmFuZHM7CgogIGhFbnYtPnNickNvZGVFbnZlbG9wZS5uU2ZiW0xPXSA9IHNickNvbmZpZ0RhdGEtPm5TZmJbTE9dOwogIGhFbnYtPnNickNvZGVFbnZlbG9wZS5uU2ZiW0hJXSA9IHNickNvbmZpZ0RhdGEtPm5TZmJbSEldOwoKICBoRW52LT5lbmNFbnZEYXRhLm5vSGFybW9uaWNzID0gc2JyQ29uZmlnRGF0YS0+blNmYltISV07CgogIGhFbnYtPnNickNvZGVFbnZlbG9wZS51cERhdGUgPSAwOwogIGhFbnYtPnNickNvZGVOb2lzZUZsb29yLnVwRGF0ZSA9IDA7CgogIHJldHVybiAoMCk7Cn0KCi8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBGREtzYnJFbmNfU2JyR2V0WE92ZXJGcmVxICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoqCiAqIEBmbgogKiBAYnJpZWYgICAgICAgY2FsY3VsYXRlcyB0aGUgY2xvc2VzdCBwb3NzaWJsZSBjcm9zc292ZXIgZnJlcXVlbmN5CiAqIEByZXR1cm4gICAgICB0aGUgY3Jvc3NvdmVyIGZyZXF1ZW5jeSBTQlIgYWNjZXB0cwogKgogKi8Kc3RhdGljIElOVApGREtzYnJFbmNfU2JyR2V0WE92ZXJGcmVxKEhBTkRMRV9TQlJfRUxFTUVOVCAgaEVudiwgICAgICAgIC8qITwgaGFuZGxlIHRvIFNCUiBlbmNvZGVyIGluc3RhbmNlICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgICAgICB4b3ZlckZyZXEpICAgLyohPCBmcm9tIGNvcmUgY29kZXIgc3VnZ2VzdGVkIGNyb3Nzb3ZlciBmcmVxdWVuY3kgKi8KewogIElOVCBiYW5kOwogIElOVCBsYXN0RGlmZiwgbmV3RGlmZjsKICBJTlQgY3V0b2ZmU2I7CgogIFVDSEFSICpSRVNUUklDVCBwVktNYXN0ZXIgPSBoRW52LT5zYnJDb25maWdEYXRhLnZfa19tYXN0ZXI7CgogIC8qIENoZWNrIGlmIHRoZXJlIGlzIGEgbWF0Y2hpbmcgY3V0b2ZmIGZyZXF1ZW5jeSBpbiB0aGUgbWFzdGVyIHRhYmxlICovCiAgY3V0b2ZmU2IgPSAoNCp4b3ZlckZyZXEgKiBoRW52LT5zYnJDb25maWdEYXRhLm5vUW1mQmFuZHMgLyBoRW52LT5zYnJDb25maWdEYXRhLnNhbXBsZUZyZXEgKyAxKT4+MTsKICBsYXN0RGlmZiA9IGN1dG9mZlNiOwogIGZvciAoYmFuZCA9IDA7IGJhbmQgPCBoRW52LT5zYnJDb25maWdEYXRhLm51bV9NYXN0ZXI7IGJhbmQrKykgewoKICAgIG5ld0RpZmYgPSBmaXhwX2FicygoSU5UKXBWS01hc3RlcltiYW5kXSAtIGN1dG9mZlNiKTsKCiAgICBpZihuZXdEaWZmID49IGxhc3REaWZmKSB7CiAgICAgIGJhbmQtLTsKICAgICAgYnJlYWs7CiAgICB9CgogICAgbGFzdERpZmYgPSBuZXdEaWZmOwogIH0KCiAgcmV0dXJuICgocFZLTWFzdGVyW2JhbmRdICogaEVudi0+c2JyQ29uZmlnRGF0YS5zYW1wbGVGcmVxL2hFbnYtPnNickNvbmZpZ0RhdGEubm9RbWZCYW5kcysxKT4+MSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKIGZ1bmN0aW9ubmFtZTogRkRLc2JyRW5jX0VudkVuY29kZUZyYW1lCiBkZXNjcmlwdGlvbjogcGVyZm9ybXMgdGhlIHNiciBlbnZlbG9wZSBjYWxjdWxhdGlvbiBmb3Igb25lIGVsZW1lbnQKIHJldHVybnM6CiBpbnB1dDoKIG91dHB1dDoKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpJTlQKRkRLc2JyRW5jX0VudkVuY29kZUZyYW1lKEhBTkRMRV9TQlJfRU5DT0RFUiAgIGhFbnZFbmNvZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgaUVsZW1lbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICBJTlRfUENNICAgICAgICAgICAgICpzYW1wbGVzLCAgICAgICAgICAgICAgICAgLyohPCB0aW1lIHNhbXBsZXMsIGFsd2F5cyBpbnRlcmxlYXZlZCAqLwogICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCAgICAgICAgICAgICAgICAgdGltZUluU3RyaWRlLCAgICAgICAgICAgIC8qITwgdGltZSBidWZmZXIgY2hhbm5lbCBpbnRlcmxlYXZpbmcgc3RyaWRlICovCiAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UICAgICAgICAgICAgICAgICpzYnJEYXRhQml0cywgICAgICAgICAgICAgLyohPCBTaXplIG9mIFNCUiBwYXlsb2FkICAqLwogICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgICAgICAgICAgICAgICAqc2JyRGF0YSwgICAgICAgICAgICAgICAgIC8qITwgU0JSIHBheWxvYWQgICovCiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICBjbGVhck91dHB1dCAgICAgICAgICAgICAgLyohPCBEbyBub3QgY29uc2lkZXIgYW55IGlucHV0IHNpZ25hbCAqLwogICAgICAgICAgICAgICAgICAgICAgICApCnsKICBIQU5ETEVfU0JSX0VMRU1FTlQgaFNickVsZW1lbnQgPSBOVUxMOwogIEZES19DUkNJTkZPICBjcmNJbmZvOwogIElOVCAgICBjcmNSZWc7CiAgSU5UICAgIGNoOwogIElOVCAgICBiYW5kOwogIElOVCAgICBjdXRvZmZTYjsKICBJTlQgICAgbmV3WE92ZXI7CgogIGlmIChoRW52RW5jb2RlciA9PSBOVUxMKQogICAgcmV0dXJuIC0xOwoKICBoU2JyRWxlbWVudCA9IGhFbnZFbmNvZGVyLT5zYnJFbGVtZW50W2lFbGVtZW50XTsKCiAgaWYgKGhTYnJFbGVtZW50ID09IE5VTEwpCiAgICByZXR1cm4gLTE7CgoKICAvKiBoZWFkZXIgYml0c3RyZWFtIGhhbmRsaW5nICovCiAgSEFORExFX1NCUl9CSVRTVFJFQU1fREFUQSBzYnJCaXRzdHJlYW1EYXRhID0gJmhTYnJFbGVtZW50LT5zYnJCaXRzdHJlYW1EYXRhOwoKICBJTlQgcHNIZWFkZXJBY3RpdmUgPSAwOwogIHNickJpdHN0cmVhbURhdGEtPkhlYWRlckFjdGl2ZSA9IDA7CgogIC8qIEFudGljaXBhdGUgUFMgaGVhZGVyIGJlY2F1c2Ugb2YgaW50ZXJuYWwgUFMgYml0c3RyZWFtIGRlbGF5IGluIG9yZGVyIHRvIGJlIGluIHN5bmMgd2l0aCBTQlIgaGVhZGVyLiAqLwogIGlmICggc2JyQml0c3RyZWFtRGF0YS0+Q291bnRTZW5kSGVhZGVyRGF0YT09KHNickJpdHN0cmVhbURhdGEtPk5yU2VuZEhlYWRlckRhdGEtMSkgKQogIHsKICAgICAgcHNIZWFkZXJBY3RpdmUgPSAxOwogIH0KCiAgLyogU2lnbmFsIFNCUiBoZWFkZXIgdG8gYmUgd3JpdHRlbiBpbnRvIGJpdHN0cmVhbSAqLwogIGlmICggc2JyQml0c3RyZWFtRGF0YS0+Q291bnRTZW5kSGVhZGVyRGF0YT09MCAgKQogIHsKICAgICBzYnJCaXRzdHJlYW1EYXRhLT5IZWFkZXJBY3RpdmUgPSAxOwogIH0KCiAgLyogSW5jcmVtZW50IGhlYWRlciBpbnRlcnZhbCBjb3VudGVyICovCiAgaWYgKHNickJpdHN0cmVhbURhdGEtPk5yU2VuZEhlYWRlckRhdGEgPT0gMCkgewogICAgc2JyQml0c3RyZWFtRGF0YS0+Q291bnRTZW5kSGVhZGVyRGF0YSA9IDE7CiAgfQogIGVsc2UgewogICAgaWYgKHNickJpdHN0cmVhbURhdGEtPkNvdW50U2VuZEhlYWRlckRhdGEgPj0gMCkgewogICAgICBzYnJCaXRzdHJlYW1EYXRhLT5Db3VudFNlbmRIZWFkZXJEYXRhKys7CiAgICAgIHNickJpdHN0cmVhbURhdGEtPkNvdW50U2VuZEhlYWRlckRhdGEgJT0gc2JyQml0c3RyZWFtRGF0YS0+TnJTZW5kSGVhZGVyRGF0YTsKICAgIH0KICB9CgogIGlmIChoU2JyRWxlbWVudC0+Q21vbkRhdGEuZHluQndFbmFibGVkICkgewogICAgSU5UIGk7CiAgICBmb3IgKCBpID0gNDsgaSA+IDA7IGktLSApCiAgICAgIGhTYnJFbGVtZW50LT5keW5YT3ZlckZyZXFEZWxheVtpXSA9IGhTYnJFbGVtZW50LT5keW5YT3ZlckZyZXFEZWxheVtpLTFdOwoKICAgIGhTYnJFbGVtZW50LT5keW5YT3ZlckZyZXFEZWxheVswXSA9IGhTYnJFbGVtZW50LT5DbW9uRGF0YS5keW5YT3ZlckZyZXFFbmM7CiAgICBpZiAoaFNickVsZW1lbnQtPmR5blhPdmVyRnJlcURlbGF5WzFdID4gaFNickVsZW1lbnQtPmR5blhPdmVyRnJlcURlbGF5WzJdKQogICAgICBuZXdYT3ZlciA9IGhTYnJFbGVtZW50LT5keW5YT3ZlckZyZXFEZWxheVsyXTsKICAgIGVsc2UKICAgICAgbmV3WE92ZXIgPSBoU2JyRWxlbWVudC0+ZHluWE92ZXJGcmVxRGVsYXlbMV07CgogICAgLyogaGFzIHRoZSBjcm9zc292ZXIgZnJlcXVlbmN5IGNoYW5nZWQ/ICovCiAgICBpZiAoIGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLmR5blhPdmVyRnJlcSAhPSBuZXdYT3ZlciApIHsKCiAgICAgIC8qIGdldCBjb3JyZXNwb25kaW5nIG1hc3RlciBiYW5kICovCiAgICAgIGN1dG9mZlNiID0gKCg0KiBuZXdYT3ZlciAqIGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLm5vUW1mQmFuZHMKICAgICAgICAgICAgICAgICAgLyBoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5zYW1wbGVGcmVxKSsxKT4+MTsKCiAgICAgIGZvciAoIGJhbmQgPSAwOyBiYW5kIDwgaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEubnVtX01hc3RlcjsgYmFuZCsrICkgewogICAgICAgIGlmICggY3V0b2ZmU2IgPT0gaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEudl9rX21hc3RlcltiYW5kXSApCiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgICBGREtfQVNTRVJUKCBiYW5kIDwgaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEubnVtX01hc3RlciApOwoKICAgICAgaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEuZHluWE92ZXJGcmVxID0gbmV3WE92ZXI7CiAgICAgIGhTYnJFbGVtZW50LT5zYnJIZWFkZXJEYXRhLnNicl94b3Zlcl9iYW5kID0gYmFuZDsKICAgICAgaFNickVsZW1lbnQtPnNickJpdHN0cmVhbURhdGEuSGVhZGVyQWN0aXZlPTE7CiAgICAgIHBzSGVhZGVyQWN0aXZlID0gMTsgLyogcHMgaGVhZGVyIGlzIG9uZSBmcmFtZSBkZWxheWVkICovCgogICAgICAvKgogICAgICAgIHVwZGF0ZSB2a19tYXN0ZXIgdGFibGUKICAgICAgKi8KICAgICAgaWYodXBkYXRlRnJlcUJhbmRUYWJsZSgmaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhTYnJFbGVtZW50LT5zYnJIZWFkZXJEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhFbnZFbmNvZGVyLT5kb3duU2FtcGxlRmFjdG9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSkKICAgICAgICByZXR1cm4oMSk7CgoKICAgICAgLyogcmVzZXQgU0JSIGNoYW5uZWxzICovCiAgICAgIElOVCBuRW52Q2ggPSBoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5uQ2hhbm5lbHM7CiAgICAgIGZvciAoIGNoID0gMDsgY2ggPCBuRW52Q2g7IGNoKysgKSB7CiAgICAgICAgaWYocmVzZXRFbnZDaGFubmVsICgmaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaFNickVsZW1lbnQtPnNickhlYWRlckRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaFNickVsZW1lbnQtPnNickNoYW5uZWxbY2hdLT5oRW52Q2hhbm5lbCkpCiAgICAgICAgICByZXR1cm4oMSk7CgogICAgICB9CiAgICB9CiAgfQoKICAvKgogICAgYWxsb2NhdGUgc3BhY2UgZm9yIGR1bW15IGhlYWRlciBhbmQgY3JjCiAgKi8KICBjcmNSZWcgPSBGREtzYnJFbmNfSW5pdFNickJpdHN0cmVhbSgmaFNickVsZW1lbnQtPkNtb25EYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoU2JyRWxlbWVudC0+cGF5bG9hZERlbGF5TGluZVtoRW52RW5jb2Rlci0+bkJpdHN0ckRlbGF5XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFYX1BBWUxPQURfU0laRSpzaXplb2YoVUNIQVIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjcmNJbmZvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5zYnJTeW50YXhGbGFncyk7CgogIC8qIFRlbXBvcmFsIEVudmVsb3BlIERhdGEgKi8KICBTQlJfRlJBTUVfVEVNUF9EQVRBIF9mRGF0YTsKICBTQlJfRlJBTUVfVEVNUF9EQVRBICpmRGF0YSA9ICZfZkRhdGE7CiAgU0JSX0VOVl9URU1QX0RBVEEgZURhdGFbTUFYX05VTV9DSEFOTkVMU107CgogIC8qIEluaXQgVGVtcG9yYWwgRW52ZWxvcGUgRGF0YSAqLwogIHsKICAgIGludCBpOwoKICAgIEZES21lbWNsZWFyKCZlRGF0YVswXSwgc2l6ZW9mKFNCUl9FTlZfVEVNUF9EQVRBKSk7CiAgICBGREttZW1jbGVhcigmZURhdGFbMV0sIHNpemVvZihTQlJfRU5WX1RFTVBfREFUQSkpOwogICAgRkRLbWVtY2xlYXIoZkRhdGEsIHNpemVvZihTQlJfRlJBTUVfVEVNUF9EQVRBKSk7CgogICAgZm9yKGk9MDsgaTxNQVhfTlVNX05PSVNFX1ZBTFVFUzsgaSsrKQogICAgICBmRGF0YS0+cmVzW2ldID0gRlJFUV9SRVNfSElHSDsKICB9CgoKICBpZiAoIWNsZWFyT3V0cHV0KQogIHsKICAgIC8qCiAgICAgKiBUcmFuc2Zvcm0gYXVkaW8gZGF0YSBpbnRvIFFNRiBkb21haW4KICAgICAqLwogICAgZm9yKGNoID0gMDsgY2ggPCBoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5uQ2hhbm5lbHM7IGNoKyspCiAgICB7CiAgICAgIEhBTkRMRV9FTlZfQ0hBTk5FTCBoX2VudkNoYW4gPSAmaFNickVsZW1lbnQtPnNickNoYW5uZWxbY2hdLT5oRW52Q2hhbm5lbDsKICAgICAgSEFORExFX1NCUl9FWFRSQUNUX0VOVkVMT1BFIHNickV4dHJFbnYgPSAmaF9lbnZDaGFuLT5zYnJFeHRyYWN0RW52ZWxvcGU7CgogICAgICBpZihoU2JyRWxlbWVudC0+ZWxJbmZvLmZQYXJhbWV0cmljU3RlcmVvID09IDApCiAgICAgIHsKICAgICAgICBRTUZfU0NBTEVfRkFDVE9SIHRtcFNjYWxlOwogICAgICAgIEZJWFBfREJMICoqcFFtZlJlYWwsICoqcFFtZkltYWc7CiAgICAgICAgQ19BQUxMT0NfU0NSQVRDSF9TVEFSVChxbWZXb3JrQnVmZmVyLCBGSVhQX0RCTCwgUU1GX0NIQU5ORUxTKjIpCgoKICAgICAgICAvKiBPYnRhaW4gcG9pbnRlcnMgdG8gUU1GIGJ1ZmZlcnMuICovCiAgICAgICAgcFFtZlJlYWwgPSBzYnJFeHRyRW52LT5yQnVmZmVyOwogICAgICAgIHBRbWZJbWFnID0gc2JyRXh0ckVudi0+aUJ1ZmZlcjsKCiAgICAgICAgcW1mQW5hbHlzaXNGaWx0ZXJpbmcoIGhTYnJFbGVtZW50LT5oUW1mQW5hbHlzaXNbY2hdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFFtZlJlYWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUW1mSW1hZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRtcFNjYWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlcyArIGhTYnJFbGVtZW50LT5lbEluZm8uQ2hhbm5lbEluZGV4W2NoXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVJblN0cmlkZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFtZldvcmtCdWZmZXIgKTsKCiAgICAgICAgaF9lbnZDaGFuLT5xbWZTY2FsZSA9IHRtcFNjYWxlLmxiX3NjYWxlICsgNzsKCgogICAgICAgIENfQUFMTE9DX1NDUkFUQ0hfRU5EKHFtZldvcmtCdWZmZXIsIEZJWFBfREJMLCBRTUZfQ0hBTk5FTFMqMikKCiAgICAgIH0gLyogZlBhcmFtZXRyaWNTdGVyZW8gPT0gMCAqLwoKCiAgICAgIC8qCiAgICAgICAgUGFyYW1ldHJpYyBTdGVyZW8gcHJvY2Vzc2luZwogICAgICAqLwogICAgICBpZiAoaFNickVsZW1lbnQtPmVsSW5mby5mUGFyYW1ldHJpY1N0ZXJlbykKICAgICAgewogICAgICAgIElOVCBlcnJvciA9IG5vRXJyb3I7CgoKICAgICAgICAvKiBMaW1pdCBQYXJhbWV0cmljIFN0ZXJlbyB0byBvbmUgaW5zdGFuY2UgKi8KICAgICAgICBGREtfQVNTRVJUKGNoID09IDApOwoKCiAgICAgICAgaWYoZXJyb3IgPT0gbm9FcnJvcil7CiAgICAgICAgICAvKiBwYXJhbWV0cmljIHN0ZXJlbyBwcm9jZXNzaW5nOgogICAgICAgICAgICAgLSBpbnB1dDoKICAgICAgICAgICAgICAgbyBsZWZ0IGFuZCByaWdodCB0aW1lIGRvbWFpbiBzYW1wbGVzCiAgICAgICAgICAgICAtIHByb2Nlc3Npbmc6CiAgICAgICAgICAgICAgIG8gc3RlcmVvIHFtZiBhbmFseXNpcwogICAgICAgICAgICAgICBvIHN0ZXJlbyBoeWJyaWQgYW5hbHlzaXMKICAgICAgICAgICAgICAgbyBwcyBwYXJhbWV0ZXIgZXh0cmFjdGlvbgogICAgICAgICAgICAgICBvIGRvd25taXggKyBoeWJyaWQgc3ludGhlc2lzCiAgICAgICAgICAgICAtIG91dHB1dDoKICAgICAgICAgICAgICAgbyBkb3dubWl4ZWQgcW1mIGRhdGEgaXMgd3JpdHRlbiB0byBzYnJFeHRyRW52LT5yQnVmZmVyIGFuZCBzYnJFeHRyRW52LT5pQnVmZmVyCiAgICAgICAgICAqLwogICAgICAgICAgU0NIQVIgcW1mU2NhbGU7CiAgICAgICAgICBJTlRfUENNKiBwU2FtcGxlc1syXSA9IHtzYW1wbGVzICsgaFNickVsZW1lbnQtPmVsSW5mby5DaGFubmVsSW5kZXhbMF0sc2FtcGxlcyArIGhTYnJFbGVtZW50LT5lbEluZm8uQ2hhbm5lbEluZGV4WzFdfTsKICAgICAgICAgIGVycm9yID0gRkRLc2JyRW5jX1BTRW5jX1BhcmFtZXRyaWNTdGVyZW9Qcm9jZXNzaW5nKCBoRW52RW5jb2Rlci0+aFBhcmFtZXRyaWNTdGVyZW8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNhbXBsZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZUluU3RyaWRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhTYnJFbGVtZW50LT5oUW1mQW5hbHlzaXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRXh0ckVudi0+ckJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJFeHRyRW52LT5pQnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXMgKyBoU2JyRWxlbWVudC0+ZWxJbmZvLkNoYW5uZWxJbmRleFtjaF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaEVudkVuY29kZXItPnFtZlN5bnRoZXNpc1BTLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnFtZlNjYWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzSGVhZGVyQWN0aXZlICk7CiAgICAgICAgICBpZiAobm9FcnJvciAhPSBlcnJvcikKICAgICAgICAgIHsKICAgICAgICAgICAgZXJyb3IgPSBoYW5kQmFjayhlcnJvcik7CiAgICAgICAgICB9CiAgICAgICAgICBoX2VudkNoYW4tPnFtZlNjYWxlID0gKGludClxbWZTY2FsZTsKICAgICAgICB9CgoKICAgICAgfSAvKiBpZiAoaEVudkVuY29kZXItPmhQYXJhbWV0cmljU3RlcmVvKSAqLwoKICAgICAgLyoKCiAgICAgICAgIEV4dHJhY3QgRW52ZWxvcGUgcmVsZXZhbnQgdGhpbmdzIGZyb20gUU1GIGRhdGEKCiAgICAgICovCiAgICAgIEZES3NickVuY19leHRyYWN0U2JyRW52ZWxvcGUxKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaFNickVsZW1lbnQtPnNickhlYWRlckRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhTYnJFbGVtZW50LT5zYnJCaXRzdHJlYW1EYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoX2VudkNoYW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhTYnJFbGVtZW50LT5DbW9uRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZURhdGFbY2hdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmRGF0YQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwoKICAgIH0gLyogaEVudkVuY29kZXItPnNickNvbmZpZ0RhdGEubkNoYW5uZWxzICovCiB9CgogIC8qCiAgICAgUHJvY2VzcyBFbnZlbG9wZSByZWxldmFudCB0aGluZ3MgYW5kIGNhbGN1bGF0ZSBlbnZlbG9wZSBkYXRhIGFuZCB3cml0ZSBwYXlsb2FkCiAgKi8KICBGREtzYnJFbmNfZXh0cmFjdFNickVudmVsb3BlMigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhTYnJFbGVtZW50LT5zYnJIZWFkZXJEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChoU2JyRWxlbWVudC0+ZWxJbmZvLmZQYXJhbWV0cmljU3RlcmVvKSA/IGhFbnZFbmNvZGVyLT5oUGFyYW1ldHJpY1N0ZXJlbyA6IE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhTYnJFbGVtZW50LT5zYnJCaXRzdHJlYW1EYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoU2JyRWxlbWVudC0+c2JyQ2hhbm5lbFswXS0+aEVudkNoYW5uZWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhTYnJFbGVtZW50LT5zYnJDaGFubmVsWzFdLT5oRW52Q2hhbm5lbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaFNickVsZW1lbnQtPkNtb25EYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZkRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyT3V0cHV0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwoKICAvKgogICAgZm9ybWF0IHBheWxvYWQsIGNhbGN1bGF0ZSBjcmMKICAqLwogIEZES3NickVuY19Bc3NlbWJsZVNickJpdHN0cmVhbSgmaFNickVsZW1lbnQtPkNtb25EYXRhLCAmY3JjSW5mbywgY3JjUmVnLCBoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5zYnJTeW50YXhGbGFncyk7CgogIC8qCiAgICBzYXZlIG5ldyBwYXlsb2FkLCBzZXQgdG8gemVybyBsZW5ndGggaWYgZ3JlYXRlciB0aGFuIE1BWF9QQVlMT0FEX1NJWkUKICAqLwogIGhTYnJFbGVtZW50LT5wYXlsb2FkRGVsYXlMaW5lU2l6ZVtoRW52RW5jb2Rlci0+bkJpdHN0ckRlbGF5XSA9IEZES2dldFZhbGlkQml0cygmaFNickVsZW1lbnQtPkNtb25EYXRhLnNickJpdGJ1Zik7CgogIGlmKGhTYnJFbGVtZW50LT5wYXlsb2FkRGVsYXlMaW5lU2l6ZVtoRW52RW5jb2Rlci0+bkJpdHN0ckRlbGF5XSA+IChNQVhfUEFZTE9BRF9TSVpFPDwzKSkKICAgIGhTYnJFbGVtZW50LT5wYXlsb2FkRGVsYXlMaW5lU2l6ZVtoRW52RW5jb2Rlci0+bkJpdHN0ckRlbGF5XT0wOwoKICAvKiBXaGlsZSBmaWxsaW5nIHRoZSBEZWxheSBsaW5lcywgc2JyRGF0YSBpcyBOVUxMICovCiAgaWYgKHNickRhdGEpIHsKICAgICpzYnJEYXRhQml0cyA9IGhTYnJFbGVtZW50LT5wYXlsb2FkRGVsYXlMaW5lU2l6ZVswXTsKICAgIEZES21lbWNweShzYnJEYXRhLCBoU2JyRWxlbWVudC0+cGF5bG9hZERlbGF5TGluZVswXSwgKGhTYnJFbGVtZW50LT5wYXlsb2FkRGVsYXlMaW5lU2l6ZVswXSs3KT4+Myk7CgoKICB9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgogIGlmIChoRW52RW5jb2Rlci0+ZlRpbWVEb21haW5Eb3duc2FtcGxpbmcpCiAgewogICAgaW50IGNoOwogICAgaW50IG5DaGFubmVscyA9IGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLm5DaGFubmVsczsKCiAgICBmb3IgKGNoPTA7IGNoIDwgbkNoYW5uZWxzOyBjaCsrKQogICAgewogICAgICBJTlQgbk91dFNhbXBsZXM7CgogICAgICBGREthYWNFbmNfRG93bnNhbXBsZSgmaFNickVsZW1lbnQtPnNickNoYW5uZWxbY2hdLT5kb3duU2FtcGxlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXMgKyBoU2JyRWxlbWVudC0+ZWxJbmZvLkNoYW5uZWxJbmRleFtjaF0gKyBoRW52RW5jb2Rlci0+YnVmZmVyT2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEuZnJhbWVTaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZUluU3RyaWRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlcyArIGhTYnJFbGVtZW50LT5lbEluZm8uQ2hhbm5lbEluZGV4W2NoXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5PdXRTYW1wbGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaEVudkVuY29kZXItPm5DaGFubmVscyk7CiAgICB9CiAgfSAvKiBkb3duc2FtcGxlICovCgoKICByZXR1cm4gKDApOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCiBmdW5jdGlvbm5hbWU6IGNyZWF0ZUVudkNoYW5uZWwKIGRlc2NyaXB0aW9uOiAgaW5pdGlhbGl6ZXMgcGFyYW1ldGVycyBhbmQgYWxsb2NhdGVzIG1lbW9yeQogcmV0dXJuczogICAgICBlcnJvciBzdGF0dXMKIGlucHV0Ogogb3V0cHV0OiAgICAgICBoRW52CgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnN0YXRpYyBJTlQKY3JlYXRlRW52Q2hhbm5lbCAoSEFORExFX0VOVl9DSEFOTkVMICAgICBoRW52LAogICAgICAgICAgICAgICAgICBJTlQgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwKICAgICAgICAgICAgICAgICAsVUNIQVIqICAgICAgICAgICAgICAgICBkeW5hbWljX1JBTQogICAgICAgICAgICAgICAgICkKewogIEZES21lbWNsZWFyKGhFbnYsc2l6ZW9mIChzdHJ1Y3QgRU5WX0NIQU5ORUwpKTsKCiAgaWYgKCBGREtzYnJFbmNfQ3JlYXRlVG9uQ29yclBhcmFtRXh0cigmaEVudi0+VG9uQ29yciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsKSApCiAgewogICAgcmV0dXJuKDEpOwogIH0KCiAgaWYgKCBGREtzYnJFbmNfQ3JlYXRlRXh0cmFjdFNickVudmVsb3BlICgmaEVudi0+c2JyRXh0cmFjdEVudmVsb3BlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsLypjaGFuKi8wCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxkeW5hbWljX1JBTQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICApICkKICB7CiAgICByZXR1cm4oMSk7CiAgfQoKICByZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgogZnVuY3Rpb25uYW1lOiBpbml0RW52Q2hhbm5lbAogZGVzY3JpcHRpb246ICBpbml0aWFsaXplcyBwYXJhbWV0ZXJzCiByZXR1cm5zOiAgICAgIGVycm9yIHN0YXR1cwogaW5wdXQ6CiBvdXRwdXQ6CgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIElOVAppbml0RW52Q2hhbm5lbCAoICBIQU5ETEVfU0JSX0NPTkZJR19EQVRBIHNickNvbmZpZ0RhdGEsCiAgICAgICAgICAgICAgICAgIEhBTkRMRV9TQlJfSEVBREVSX0RBVEEgc2JySGVhZGVyRGF0YSwKICAgICAgICAgICAgICAgICAgSEFORExFX0VOVl9DSEFOTkVMICAgICBoRW52LAogICAgICAgICAgICAgICAgICBzYnJDb25maWd1cmF0aW9uUHRyICAgIHBhcmFtcywKICAgICAgICAgICAgICAgICAgVUxPTkcgICAgICAgICAgICAgICAgICBzdGF0ZXNJbml0RmxhZwogICAgICAgICAgICAgICAgICxJTlQgICAgICAgICAgICAgICAgICAgIGNoYW5JbkVsCiAgICAgICAgICAgICAgICAgLFVDSEFSKiAgICAgICAgICAgICAgICAgZHluYW1pY19SQU0KICAgICAgICAgICAgICAgICApCnsKICBpbnQgZnJhbWVTaGlmdCwgdHJhbl9vZmY9MDsKICBJTlQgZTsKICBJTlQgdHJhbl9mYzsKICBJTlQgdGltZVNsb3RzLCB0aW1lU3RlcCwgc3RhcnRJbmRleDsKICBJTlQgbm9pc2VCYW5kc1syXSA9IHsgMywgMyB9OwoKICBlID0gMSA8PCBwYXJhbXMtPmU7CgogIEZES19BU1NFUlQocGFyYW1zLT5lID49IDApOwoKICBoRW52LT5lbmNFbnZEYXRhLmZyZXFfcmVzX2ZpeGZpeFswXSA9IHBhcmFtcy0+ZnJlcV9yZXNfZml4Zml4WzBdOwogIGhFbnYtPmVuY0VudkRhdGEuZnJlcV9yZXNfZml4Zml4WzFdID0gcGFyYW1zLT5mcmVxX3Jlc19maXhmaXhbMV07CiAgaEVudi0+ZW5jRW52RGF0YS5mUmVzVHJhbnNJc0xvdyAgICAgPSBwYXJhbXMtPmZSZXNUcmFuc0lzTG93OwoKICBoRW52LT5mTGV2ZWxQcm90ZWN0ID0gMDsKCiAgaEVudi0+ZW5jRW52RGF0YS5sZEdyaWQgPSAoc2JyQ29uZmlnRGF0YS0+c2JyU3ludGF4RmxhZ3MgJiBTQlJfU1lOVEFYX0xPV19ERUxBWSkgPyAxIDogMDsKCiAgaEVudi0+ZW5jRW52RGF0YS5zYnJfeHBvc19tb2RlID0gKFhQT1NfTU9ERSlwYXJhbXMtPnNicl94cG9zX21vZGU7CgogIGlmIChoRW52LT5lbmNFbnZEYXRhLnNicl94cG9zX21vZGUgPT0gWFBPU19TV0lUQ0hFRCkgewogICAgLyoKICAgICAgIG5vIG90aGVyIHR5cGUgdGhhbiBYUE9TX01EQ1Qgb3IgWFBPU19TUEVFQ0ggYWxsb3dlZCwKICAgICAgIGJ1dCBlbmFibGUgc3dpdGNoaW5nCiAgICAqLwogICAgc2JyQ29uZmlnRGF0YS0+c3dpdGNoVHJhbnNwb3NlcnMgPSBUUlVFOwogICAgaEVudi0+ZW5jRW52RGF0YS5zYnJfeHBvc19tb2RlID0gWFBPU19NRENUOwogIH0KICBlbHNlIHsKICAgIHNickNvbmZpZ0RhdGEtPnN3aXRjaFRyYW5zcG9zZXJzID0gRkFMU0U7CiAgfQoKICBoRW52LT5lbmNFbnZEYXRhLnNicl94cG9zX2N0cmwgPSBwYXJhbXMtPnNicl94cG9zX2N0cmw7CgoKICAvKiBleHRlbmRlZCBkYXRhICovCiAgaWYocGFyYW1zLT5wYXJhbWV0cmljQ29kaW5nKSB7CiAgICBoRW52LT5lbmNFbnZEYXRhLmV4dGVuZGVkX2RhdGEgPSAxOwogIH0KICBlbHNlIHsKICAgIGhFbnYtPmVuY0VudkRhdGEuZXh0ZW5kZWRfZGF0YSA9IDA7CiAgfQoKICBoRW52LT5lbmNFbnZEYXRhLmV4dGVuc2lvbl9zaXplID0gMDsKCiAgc3RhcnRJbmRleCA9IFFNRl9GSUxURVJfUFJPVE9UWVBFX1NJWkUgLSBzYnJDb25maWdEYXRhLT5ub1FtZkJhbmRzOwoKICBzd2l0Y2ggKHBhcmFtcy0+c2JyRnJhbWVTaXplKSB7CiAgY2FzZSAyMzA0OgogICAgdGltZVNsb3RzID0gMTg7CiAgICBicmVhazsKICBjYXNlIDIwNDg6CiAgY2FzZSAxMDI0OgogIGNhc2UgNTEyOgogICAgdGltZVNsb3RzID0gMTY7CiAgICBicmVhazsKICBjYXNlIDE5MjA6CiAgY2FzZSA5NjA6CiAgY2FzZSA0ODA6CiAgICB0aW1lU2xvdHMgPSAxNTsKICAgIGJyZWFrOwogIGNhc2UgMTE1MjoKICAgIHRpbWVTbG90cyA9IDk7CiAgICBicmVhazsKICBkZWZhdWx0OgogICAgcmV0dXJuICgxKTsgLyogSWxsZWdhbCBmcmFtZSBzaXplICovCiAgfQoKICB0aW1lU3RlcCA9IHNickNvbmZpZ0RhdGEtPm5vUW1mU2xvdHMgLyB0aW1lU2xvdHM7CgogIGlmICggRkRLc2JyRW5jX0luaXRUb25Db3JyUGFyYW1FeHRyKHBhcmFtcy0+c2JyRnJhbWVTaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhFbnYtPlRvbkNvcnIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyQ29uZmlnRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lU2xvdHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLT5zYnJfeHBvc19jdHJsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy0+YW5hX21heF9sZXZlbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJIZWFkZXJEYXRhLT5zYnJfbm9pc2VfYmFuZHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLT5ub2lzZUZsb29yT2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy0+dXNlU3BlZWNoQ29uZmlnKSApCiAgICByZXR1cm4oMSk7CgogIGhFbnYtPmVuY0VudkRhdGEubm9PZm5vaXNlYmFuZHMgPSBoRW52LT5Ub25Db3JyLnNick5vaXNlRmxvb3JFc3RpbWF0ZS5ub05vaXNlQmFuZHM7CgogIG5vaXNlQmFuZHNbMF0gPSBoRW52LT5lbmNFbnZEYXRhLm5vT2Zub2lzZWJhbmRzOwogIG5vaXNlQmFuZHNbMV0gPSBoRW52LT5lbmNFbnZEYXRhLm5vT2Zub2lzZWJhbmRzOwoKICBoRW52LT5lbmNFbnZEYXRhLnNicl9pbnZmX21vZGUgPSAoSU5WRl9NT0RFKXBhcmFtcy0+c2JyX2ludmZfbW9kZTsKCiAgaWYgKGhFbnYtPmVuY0VudkRhdGEuc2JyX2ludmZfbW9kZSA9PSBJTlZGX1NXSVRDSEVEKSB7CiAgICBoRW52LT5lbmNFbnZEYXRhLnNicl9pbnZmX21vZGUgPSBJTlZGX01JRF9MRVZFTDsKICAgIGhFbnYtPlRvbkNvcnIuc3dpdGNoSW52ZXJzZUZpbHQgPSBUUlVFOwogIH0KICBlbHNlIHsKICAgIGhFbnYtPlRvbkNvcnIuc3dpdGNoSW52ZXJzZUZpbHQgPSBGQUxTRTsKICB9CgoKICB0cmFuX2ZjICA9IHBhcmFtcy0+dHJhbl9mYzsKCiAgaWYgKHRyYW5fZmMgPT0gMCkgewogICAgdHJhbl9mYyA9IGZpeE1pbiAoNTAwMCwgRkRLc2JyRW5jX2dldFNiclN0YXJ0RnJlcVJBVyAoc2JySGVhZGVyRGF0YS0+c2JyX3N0YXJ0X2ZyZXF1ZW5jeSxwYXJhbXMtPmNvZGVjU2V0dGluZ3Muc2FtcGxlRnJlcSkpOwogIH0KCiAgdHJhbl9mYyA9ICh0cmFuX2ZjKjQqc2JyQ29uZmlnRGF0YS0+bm9RbWZCYW5kcy9zYnJDb25maWdEYXRhLT5zYW1wbGVGcmVxICsgMSk+PjE7CgogIGlmIChzYnJDb25maWdEYXRhLT5zYnJTeW50YXhGbGFncyAmIFNCUl9TWU5UQVhfTE9XX0RFTEFZKSB7CiAgICBmcmFtZVNoaWZ0ID0gTERfUFJFVFJBTl9PRkY7CiAgICB0cmFuX29mZiA9IExEX1BSRVRSQU5fT0ZGICsgRlJBTUVfTUlERExFX1NMT1RfNTEyTEQqdGltZVN0ZXA7CiAgfSBlbHNlCiAgewogICAgZnJhbWVTaGlmdCA9IDA7CiAgICBzd2l0Y2ggKHRpbWVTbG90cykgewogICAgICAvKiBUaGUgZmFjdG9yIG9mIDIgaXMgYnkgZGVmaW5pdGlvbi4gKi8KICAgICAgY2FzZSBOVU1CRVJfVElNRV9TTE9UU18yMDQ4OiB0cmFuX29mZiA9IDggKyBGUkFNRV9NSURETEVfU0xPVF8yMDQ4ICogdGltZVN0ZXA7IGJyZWFrOwogICAgICBjYXNlIE5VTUJFUl9USU1FX1NMT1RTXzE5MjA6IHRyYW5fb2ZmID0gNyArIEZSQU1FX01JRERMRV9TTE9UXzE5MjAgKiB0aW1lU3RlcDsgYnJlYWs7CiAgICAgIGRlZmF1bHQ6IHJldHVybiAxOwogICAgfQogIH0KICBpZiAoIEZES3NickVuY19Jbml0RXh0cmFjdFNickVudmVsb3BlICgmaEVudi0+c2JyRXh0cmFjdEVudmVsb3BlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyQ29uZmlnRGF0YS0+bm9RbWZTbG90cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickNvbmZpZ0RhdGEtPm5vUW1mQmFuZHMsIHN0YXJ0SW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lU2xvdHMsIHRpbWVTdGVwLCB0cmFuX29mZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlc0luaXRGbGFnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxjaGFuSW5FbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsZHluYW1pY19SQU0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLHNickNvbmZpZ0RhdGEtPnNiclN5bnRheEZsYWdzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApICkKICAgIHJldHVybigxKTsKCiAgaWYoRkRLc2JyRW5jX0luaXRTYnJDb2RlRW52ZWxvcGUgKCZoRW52LT5zYnJDb2RlRW52ZWxvcGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJDb25maWdEYXRhLT5uU2ZiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLT5kZWx0YVRBY3Jvc3NGcmFtZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMtPmRGX2VkZ2VfMXN0RW52LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLT5kRl9lZGdlX2luY3IpKQogICAgcmV0dXJuKDEpOwoKICBpZihGREtzYnJFbmNfSW5pdFNickNvZGVFbnZlbG9wZSAoJmhFbnYtPnNickNvZGVOb2lzZUZsb29yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9pc2VCYW5kcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy0+ZGVsdGFUQWNyb3NzRnJhbWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwwKSkKICAgIHJldHVybigxKTsKCiAgc2JyQ29uZmlnRGF0YS0+aW5pdEFtcFJlc0ZGID0gcGFyYW1zLT5pbml0X2FtcF9yZXNfRkY7CgogIGlmKEZES3NickVuY19Jbml0U2JySHVmZm1hblRhYmxlcyAoJmhFbnYtPmVuY0VudkRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICZoRW52LT5zYnJDb2RlRW52ZWxvcGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICZoRW52LT5zYnJDb2RlTm9pc2VGbG9vciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JySGVhZGVyRGF0YS0+c2JyX2FtcF9yZXMpKQogICByZXR1cm4oMSk7CgogIEZES3NickVuY19pbml0RnJhbWVJbmZvR2VuZXJhdG9yICgmaEVudi0+U2JyRW52RnJhbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMtPnNwcmVhZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMtPnN0YXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lU2xvdHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoRW52LT5lbmNFbnZEYXRhLmZyZXFfcmVzX2ZpeGZpeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhFbnYtPmVuY0VudkRhdGEuZlJlc1RyYW5zSXNMb3csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoRW52LT5lbmNFbnZEYXRhLmxkR3JpZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKCiAgaWYoc2JyQ29uZmlnRGF0YS0+c2JyU3ludGF4RmxhZ3MgJiBTQlJfU1lOVEFYX0xPV19ERUxBWSkKICB7CiAgICBJTlQgYmFuZHdpZHRoX3FtZl9zbG90ID0gKHNickNvbmZpZ0RhdGEtPnNhbXBsZUZyZXE+PjEpIC8gKHNickNvbmZpZ0RhdGEtPm5vUW1mQmFuZHMpOwogICAgaWYoRkRLc2JyRW5jX0luaXRTYnJGYXN0VHJhbnNpZW50RGV0ZWN0b3IoCiAgICAgICAgICAgICAgJmhFbnYtPnNickZhc3RUcmFuc2llbnREZXRlY3RvciwKICAgICAgICAgICAgICAgc2JyQ29uZmlnRGF0YS0+bm9RbWZTbG90cywKICAgICAgICAgICAgICAgYmFuZHdpZHRoX3FtZl9zbG90LAogICAgICAgICAgICAgICBzYnJDb25maWdEYXRhLT5ub1FtZkJhbmRzLAogICAgICAgICAgICAgICBzYnJDb25maWdEYXRhLT5mcmVxQmFuZFRhYmxlWzBdWzBdCiAgICAgICAgICAgICAgICkpCiAgICAgIHJldHVybigxKTsKICB9CgogIC8qIFRoZSB0cmFuc2llbnQgZGV0ZWN0b3IgaGFzIHRvIGJlIGluaXRpYWxpemVkIGFsc28gaWYgdGhlIGZhc3QgdHJhbnNpZW50CiAgICAgZGV0ZWN0b3Igd2FzIGFjdGl2ZSwgYmVjYXVzZSB0aGUgdmFsdWVzIGZyb20gdGhlIHRyYW5zaWVudCBkZXRlY3RvcgogICAgIHN0cnVjdHVyZSBhcmUgdXNlZC4gKi8KICBpZihGREtzYnJFbmNfSW5pdFNiclRyYW5zaWVudERldGVjdG9yICgmaEVudi0+c2JyVHJhbnNpZW50RGV0ZWN0b3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickNvbmZpZ0RhdGEtPnNiclN5bnRheEZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJDb25maWdEYXRhLT5mcmFtZVNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickNvbmZpZ0RhdGEtPnNhbXBsZUZyZXEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbl9mYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyQ29uZmlnRGF0YS0+bm9RbWZTbG90cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyQ29uZmlnRGF0YS0+bm9RbWZCYW5kcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEVudi0+c2JyRXh0cmFjdEVudmVsb3BlLllCdWZmZXJXcml0ZU9mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEVudi0+c2JyRXh0cmFjdEVudmVsb3BlLllCdWZmZXJTelNoaWZ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZVNoaWZ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuX29mZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApKQogIHJldHVybigxKTsKCgogIHNickNvbmZpZ0RhdGEtPnhwb3NDdHJsU3dpdGNoID0gcGFyYW1zLT5zYnJfeHBvc19jdHJsOwoKICBoRW52LT5lbmNFbnZEYXRhLm5vSGFybW9uaWNzID0gc2JyQ29uZmlnRGF0YS0+blNmYltISV07CiAgaEVudi0+ZW5jRW52RGF0YS5hZGRIYXJtb25pY0ZsYWcgPSAwOwoKICByZXR1cm4gKDApOwp9CgpJTlQgc2JyRW5jb2Rlcl9PcGVuKAogICAgICAgIEhBTkRMRV9TQlJfRU5DT0RFUiAgKnBoU2JyRW5jb2RlciwKICAgICAgICBJTlQgICAgICAgICAgICAgICAgICBuRWxlbWVudHMsCiAgICAgICAgSU5UICAgICAgICAgICAgICAgICAgbkNoYW5uZWxzLAogICAgICAgIElOVCAgICAgICAgICAgICAgICAgIHN1cHBvcnRQUwogICAgICAgICkKewogIElOVCBpOwogIElOVCBlcnJvclN0YXR1cyA9IDE7CiAgSEFORExFX1NCUl9FTkNPREVSIGhTYnJFbmNvZGVyID0gTlVMTDsKCiAgaWYgKHBoU2JyRW5jb2Rlcj09TlVMTAogICAgICkKICB7CiAgICBnb3RvIGJhaWw7CiAgfQoKICBoU2JyRW5jb2RlciA9IEdldFJhbV9TYnJFbmNvZGVyKCk7CiAgaWYgKGhTYnJFbmNvZGVyPT1OVUxMKSB7CiAgICBnb3RvIGJhaWw7CiAgfQogIEZES21lbWNsZWFyKGhTYnJFbmNvZGVyLCBzaXplb2YoU0JSX0VOQ09ERVIpKTsKCiAgICAgIGhTYnJFbmNvZGVyLT5wU0JSZHluYW1pY19SQU0gPSAoVUNIQVIqKUdldFJhbV9TYnJEeW5hbWljX1JBTSgpOwogICAgICBoU2JyRW5jb2Rlci0+ZHluYW1pY1JhbSA9IGhTYnJFbmNvZGVyLT5wU0JSZHluYW1pY19SQU07CgogIGZvciAoaT0wOyBpPG5FbGVtZW50czsgaSsrKSB7CiAgICBoU2JyRW5jb2Rlci0+c2JyRWxlbWVudFtpXSA9IEdldFJhbV9TYnJFbGVtZW50KGkpOwogICAgaWYgKGhTYnJFbmNvZGVyLT5zYnJFbGVtZW50W2ldPT1OVUxMKSB7CiAgICAgICAgZ290byBiYWlsOwogICAgfQogICAgRkRLbWVtY2xlYXIoaFNickVuY29kZXItPnNickVsZW1lbnRbaV0sIHNpemVvZihTQlJfRUxFTUVOVCkpOwogICAgaFNickVuY29kZXItPnNickVsZW1lbnRbaV0tPnNickNvbmZpZ0RhdGEuZnJlcUJhbmRUYWJsZVtMT10gPSAgR2V0UmFtX1Nicl9mcmVxQmFuZFRhYmxlTE8oaSk7CiAgICBoU2JyRW5jb2Rlci0+c2JyRWxlbWVudFtpXS0+c2JyQ29uZmlnRGF0YS5mcmVxQmFuZFRhYmxlW0hJXSA9ICBHZXRSYW1fU2JyX2ZyZXFCYW5kVGFibGVISShpKTsKICAgIGhTYnJFbmNvZGVyLT5zYnJFbGVtZW50W2ldLT5zYnJDb25maWdEYXRhLnZfa19tYXN0ZXIgICAgICAgID0gIEdldFJhbV9TYnJfdl9rX21hc3RlcihpKTsKICAgIGlmICggKGhTYnJFbmNvZGVyLT5zYnJFbGVtZW50W2ldLT5zYnJDb25maWdEYXRhLmZyZXFCYW5kVGFibGVbTE9dPT1OVUxMKSB8fAogICAgICAgICAoaFNickVuY29kZXItPnNickVsZW1lbnRbaV0tPnNickNvbmZpZ0RhdGEuZnJlcUJhbmRUYWJsZVtISV09PU5VTEwpIHx8CiAgICAgICAgIChoU2JyRW5jb2Rlci0+c2JyRWxlbWVudFtpXS0+c2JyQ29uZmlnRGF0YS52X2tfbWFzdGVyPT1OVUxMKSApCiAgICB7CiAgICAgICAgZ290byBiYWlsOwogICAgfQogIH0KCiAgZm9yIChpPTA7IGk8bkNoYW5uZWxzOyBpKyspIHsKICAgIGhTYnJFbmNvZGVyLT5wU2JyQ2hhbm5lbFtpXSA9IEdldFJhbV9TYnJDaGFubmVsKGkpOwogICAgaWYgKGhTYnJFbmNvZGVyLT5wU2JyQ2hhbm5lbFtpXT09TlVMTCkgewogICAgICAgIGdvdG8gYmFpbDsKICAgIH0KCiAgICBpZiAoIGNyZWF0ZUVudkNoYW5uZWwoJmhTYnJFbmNvZGVyLT5wU2JyQ2hhbm5lbFtpXS0+aEVudkNoYW5uZWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGkKICAgICAgICAgICAgICAgICAgICAgICAgICAsaFNickVuY29kZXItPmR5bmFtaWNSYW0KICAgICAgICAgICAgICAgICAgICAgICAgICAgKSApCiAgICB7CiAgICAgICAgZ290byBiYWlsOwogICAgfQoKICB9CgogIGZvciAoaT0wOyBpPGZpeE1heChuQ2hhbm5lbHMsKHN1cHBvcnRQUyk/MjowKTsgaSsrKSB7CiAgICBoU2JyRW5jb2Rlci0+UW1mQW5hbHlzaXNbaV0uRmlsdGVyU3RhdGVzID0gR2V0UmFtX1Nicl9RbWZTdGF0ZXNBbmFseXNpcyhpKTsKICAgIGlmIChoU2JyRW5jb2Rlci0+UW1mQW5hbHlzaXNbaV0uRmlsdGVyU3RhdGVzPT1OVUxMKSB7CiAgICAgICAgZ290byBiYWlsOwogICAgfQogIH0KCiAgaWYgKHN1cHBvcnRQUykgewogICAgaWYgKFBTRW5jX0NyZWF0ZSgmaFNickVuY29kZXItPmhQYXJhbWV0cmljU3RlcmVvKSkKICAgIHsKICAgICAgZ290byBiYWlsOwogICAgfQoKICAgIGhTYnJFbmNvZGVyLT5xbWZTeW50aGVzaXNQUy5GaWx0ZXJTdGF0ZXMgPSBHZXRSYW1fUHNRbWZTdGF0ZXNTeW50aGVzaXMoKTsKICAgIGlmIChoU2JyRW5jb2Rlci0+cW1mU3ludGhlc2lzUFMuRmlsdGVyU3RhdGVzPT1OVUxMKSB7CiAgICAgIGdvdG8gYmFpbDsKICAgIH0KICB9ICAvKiBzdXBwb3J0UFMgKi8KCiAgKnBoU2JyRW5jb2RlciA9IGhTYnJFbmNvZGVyOwoKICBlcnJvclN0YXR1cyA9IDA7CiAgcmV0dXJuIGVycm9yU3RhdHVzOwoKYmFpbDoKICAvKiBDbG9zZSBTQlIgZW5jb2RlciBpbnN0YW5jZSAqLwogIHNickVuY29kZXJfQ2xvc2UoJmhTYnJFbmNvZGVyKTsKICByZXR1cm4gZXJyb3JTdGF0dXM7Cn0KCnN0YXRpYwpJTlQgRkRLc2JyRW5jX1JlYWxsb2NhdGUoCiAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9FTkNPREVSICAgaFNickVuY29kZXIsCiAgICAgICAgICAgICAgICAgICAgU0JSX0VMRU1FTlRfSU5GTyAgICAgZWxJbmZvWyg4KV0sCiAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgbm9FbGVtZW50cykKewogIElOVCB0b3RhbENoID0gMDsKICBJTlQgdG90YWxRbWYgPSAwOwogIElOVCBjb3JlRWw7CiAgSU5UIGVsPS0xOwoKICBoU2JyRW5jb2Rlci0+bGZlQ2hJZHggPSAtMTsgLyogZGVmYXVsdCB2YWx1ZSwgdW50aWwgbGZlIGZvdW5kICovCgogIGZvciAoY29yZUVsPTA7IGNvcmVFbDxub0VsZW1lbnRzOyBjb3JlRWwrKykKICB7CiAgICAvKiBTQlIgb25seSBoYW5kbGVzIFNDRSBhbmQgQ1BFJ3MgKi8KICAgIGlmIChlbEluZm9bY29yZUVsXS5lbFR5cGUgPT0gSURfU0NFIHx8IGVsSW5mb1tjb3JlRWxdLmVsVHlwZSA9PSBJRF9DUEUpIHsKICAgICAgZWwrKzsKICAgIH0gZWxzZSB7CiAgICAgIGlmIChlbEluZm9bY29yZUVsXS5lbFR5cGUgPT0gSURfTEZFKSB7CiAgICAgICAgICBoU2JyRW5jb2Rlci0+bGZlQ2hJZHggPSBlbEluZm9bY29yZUVsXS5DaGFubmVsSW5kZXhbMF07CiAgICAgIH0KICAgICAgY29udGludWU7CiAgICB9CgogICAgU0JSX0VMRU1FTlRfSU5GTyAgICAqcGVsSW5mbyA9ICZlbEluZm9bY29yZUVsXTsKICAgIEhBTkRMRV9TQlJfRUxFTUVOVCAgaFNickVsZW1lbnQgPSBoU2JyRW5jb2Rlci0+c2JyRWxlbWVudFtlbF07CgogICAgaW50IGNoOwogICAgZm9yICggY2ggPSAwOyBjaCA8IHBlbEluZm8tPm5DaGFubmVsc0luRWw7IGNoKysgKSB7CiAgICAgIGhTYnJFbGVtZW50LT5zYnJDaGFubmVsW2NoXSA9IGhTYnJFbmNvZGVyLT5wU2JyQ2hhbm5lbFt0b3RhbENoXTsKICAgICAgdG90YWxDaCsrOwogICAgfQogICAgLyogYW5hbHlzaXMgUU1GICovCiAgICBmb3IgKCBjaCA9IDA7IGNoIDwgKChwZWxJbmZvLT5mUGFyYW1ldHJpY1N0ZXJlbyk/MjpwZWxJbmZvLT5uQ2hhbm5lbHNJbkVsKTsgY2grKyApIHsKICAgICAgaFNickVsZW1lbnQtPmVsSW5mby5DaGFubmVsSW5kZXhbY2hdID0gcGVsSW5mby0+Q2hhbm5lbEluZGV4W2NoXTsKICAgICAgaFNickVsZW1lbnQtPmhRbWZBbmFseXNpc1tjaF0gPSAmaFNickVuY29kZXItPlFtZkFuYWx5c2lzW3RvdGFsUW1mKytdOwogICAgfQoKICAgIC8qIENvcHkgRWxlbWVudCBpbmZvICovCiAgICBoU2JyRWxlbWVudC0+ZWxJbmZvLmVsVHlwZSAgICAgICAgICAgID0gcGVsSW5mby0+ZWxUeXBlOwogICAgaFNickVsZW1lbnQtPmVsSW5mby5pbnN0YW5jZVRhZyAgICAgICA9IHBlbEluZm8tPmluc3RhbmNlVGFnOwogICAgaFNickVsZW1lbnQtPmVsSW5mby5uQ2hhbm5lbHNJbkVsICAgICA9IHBlbEluZm8tPm5DaGFubmVsc0luRWw7CiAgICBoU2JyRWxlbWVudC0+ZWxJbmZvLmZQYXJhbWV0cmljU3RlcmVvID0gcGVsSW5mby0+ZlBhcmFtZXRyaWNTdGVyZW87CiAgfSAvKiBjb3JlRWwgKi8KCiAgcmV0dXJuIDA7Cn0KCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgogZnVuY3Rpb25uYW1lOiBGREtzYnJFbmNfRW52SW5pdAogZGVzY3JpcHRpb246ICBpbml0aWFsaXplcyBwYXJhbWV0ZXJzCiByZXR1cm5zOiAgICAgIGVycm9yIHN0YXR1cwogaW5wdXQ6CiBvdXRwdXQ6ICAgICAgIGhFbnYKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMKSU5UIEZES3NickVuY19FbnZJbml0ICgKICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0VMRU1FTlQgICBoU2JyRWxlbWVudCwKICAgICAgICAgICAgICAgICAgICAgICBzYnJDb25maWd1cmF0aW9uUHRyIHBhcmFtcywKICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAqY29yZUJhbmRXaXRoLAogICAgICAgICAgICAgICAgICAgICAgIEFVRElPX09CSkVDVF9UWVBFIGFvdCwKICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgbkJpdHN0ckRlbGF5LAogICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICBuRWxlbWVudCwKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgaGVhZGVyUGVyaW9kLAogICAgICAgICAgICAgICAgICAgICAgIFVMT05HICAgICBzdGF0ZXNJbml0RmxhZywKICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgZlRpbWVEb21haW5Eb3duc2FtcGxpbmcKICAgICAgICAgICAgICAgICAgICAgICxVQ0hBUiAgICAqZHluYW1pY19SQU0KICAgICAgICAgICAgICAgICAgICAgICkKewogIFVDSEFSICAgICpiaXRzdHJlYW1CdWZmZXI7CiAgaW50IGNoLCBpOwoKICBpZiAoKHBhcmFtcy0+Y29kZWNTZXR0aW5ncy5uQ2hhbm5lbHMgPCAxKSB8fCAocGFyYW1zLT5jb2RlY1NldHRpbmdzLm5DaGFubmVscyA+IE1BWF9OVU1fQ0hBTk5FTFMpKXsKICAgIHJldHVybigxKTsKICB9CgogIC8qIGluaXRpYWxpemUgdGhlIGVuY29kZXIgaGFuZGxlICBhbmQgc3RydWN0cyovCiAgYml0c3RyZWFtQnVmZmVyID0gaFNickVsZW1lbnQtPnBheWxvYWREZWxheUxpbmVbbkJpdHN0ckRlbGF5XTsKCiAgLyogaW5pdCBhbmQgc2V0IHN5bnRheCBmbGFncyAqLwogIGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLnNiclN5bnRheEZsYWdzID0gMDsKCiAgc3dpdGNoIChhb3QpIHsKICBjYXNlIEFPVF9FUl9BQUNfRUxEOgogICAgaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEuc2JyU3ludGF4RmxhZ3MgfD0gU0JSX1NZTlRBWF9MT1dfREVMQVk7CiAgICBicmVhazsKICBkZWZhdWx0OgogICAgYnJlYWs7CiAgfQogIGlmIChwYXJhbXMtPmNyY1NicikgewogICAgaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEuc2JyU3ludGF4RmxhZ3MgfD0gU0JSX1NZTlRBWF9DUkM7CiAgfQoKICBoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5ub1FtZkJhbmRzID0gUU1GX0NIQU5ORUxTPj4oMi1wYXJhbXMtPmRvd25TYW1wbGVGYWN0b3IpOwogIHN3aXRjaCAoaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEubm9RbWZCYW5kcykKICB7CiAgICBjYXNlIDY0OiBoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5ub1FtZlNsb3RzID0gcGFyYW1zLT5zYnJGcmFtZVNpemU+PjY7CiAgICAgICAgICAgICBicmVhazsKICAgIGNhc2UgMzI6IGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLm5vUW1mU2xvdHMgPSBwYXJhbXMtPnNickZyYW1lU2l6ZT4+NTsKICAgICAgICAgICAgIGJyZWFrOwogICAgZGVmYXVsdDogaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEubm9RbWZTbG90cyA9IHBhcmFtcy0+c2JyRnJhbWVTaXplPj42OwogICAgICAgICAgICAgcmV0dXJuKDIpOwogIH0KCiAgRkRLaW5pdEJpdFN0cmVhbSgmaFNickVsZW1lbnQtPkNtb25EYXRhLnNickJpdGJ1ZiwgYml0c3RyZWFtQnVmZmVyLCBNQVhfUEFZTE9BRF9TSVpFKnNpemVvZihVQ0hBUiksIDAsIEJTX1dSSVRFUik7CgogIC8qCiAgICBub3cgaW5pdGlhbGl6ZSBzYnJDb25maWdEYXRhLCBzYnJIZWFkZXJEYXRhIGFuZCBzYnJCaXRzdHJlYW1EYXRhLAogICovCiAgaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEubkNoYW5uZWxzID0gcGFyYW1zLT5jb2RlY1NldHRpbmdzLm5DaGFubmVsczsKCiAgaWYocGFyYW1zLT5jb2RlY1NldHRpbmdzLm5DaGFubmVscyA9PSAyKQogICAgIGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLnN0ZXJlb01vZGUgPSBwYXJhbXMtPnN0ZXJlb01vZGU7CiAgZWxzZQogICAgIGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLnN0ZXJlb01vZGUgPSBTQlJfTU9OTzsKCiAgaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEuZnJhbWVTaXplICAgPSBwYXJhbXMtPnNickZyYW1lU2l6ZTsKCiAgaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEuc2FtcGxlRnJlcSA9IHBhcmFtcy0+ZG93blNhbXBsZUZhY3RvciAqIHBhcmFtcy0+Y29kZWNTZXR0aW5ncy5zYW1wbGVGcmVxOwoKICBoU2JyRWxlbWVudC0+c2JyQml0c3RyZWFtRGF0YS5Db3VudFNlbmRIZWFkZXJEYXRhID0gMDsKICBpZiAocGFyYW1zLT5TZW5kSGVhZGVyRGF0YVRpbWUgPiAwICkgewoKICAgIGlmIChoZWFkZXJQZXJpb2Q9PS0xKSB7CgogICAgICBoU2JyRWxlbWVudC0+c2JyQml0c3RyZWFtRGF0YS5OclNlbmRIZWFkZXJEYXRhID0gKElOVCkocGFyYW1zLT5TZW5kSGVhZGVyRGF0YVRpbWUgKiBoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5zYW1wbGVGcmVxCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyAoMTAwMCAqIGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLmZyYW1lU2l6ZSkpOwogICAgICBoU2JyRWxlbWVudC0+c2JyQml0c3RyZWFtRGF0YS5OclNlbmRIZWFkZXJEYXRhID0gZml4TWF4KGhTYnJFbGVtZW50LT5zYnJCaXRzdHJlYW1EYXRhLk5yU2VuZEhlYWRlckRhdGEsMSk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgLyogYXNzdXJlIGhlYWRlciBwZXJpb2QgYXQgbGVhc3Qgb25jZSBwZXIgc2Vjb25kICovCiAgICAgIGhTYnJFbGVtZW50LT5zYnJCaXRzdHJlYW1EYXRhLk5yU2VuZEhlYWRlckRhdGEgPSBmaXhNaW4oZml4TWF4KGhlYWRlclBlcmlvZCwxKSwoaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEuc2FtcGxlRnJlcS9oU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5mcmFtZVNpemUpKTsKICAgIH0KICB9CiAgZWxzZSB7CiAgIGhTYnJFbGVtZW50LT5zYnJCaXRzdHJlYW1EYXRhLk5yU2VuZEhlYWRlckRhdGEgPSAwOwogIH0KCiAgaFNickVsZW1lbnQtPnNickhlYWRlckRhdGEuc2JyX2RhdGFfZXh0cmEgPSBwYXJhbXMtPnNicl9kYXRhX2V4dHJhOwogIGhTYnJFbGVtZW50LT5zYnJCaXRzdHJlYW1EYXRhLkhlYWRlckFjdGl2ZSA9IDA7CiAgaFNickVsZW1lbnQtPnNickhlYWRlckRhdGEuc2JyX3N0YXJ0X2ZyZXF1ZW5jeSA9IHBhcmFtcy0+c3RhcnRGcmVxOwogIGhTYnJFbGVtZW50LT5zYnJIZWFkZXJEYXRhLnNicl9zdG9wX2ZyZXF1ZW5jeSAgPSBwYXJhbXMtPnN0b3BGcmVxOwogIGhTYnJFbGVtZW50LT5zYnJIZWFkZXJEYXRhLnNicl94b3Zlcl9iYW5kID0gMDsKICBoU2JyRWxlbWVudC0+c2JySGVhZGVyRGF0YS5zYnJfbGNfc3RlcmVvX21vZGUgPSAwOwoKICAvKiBkYXRhX2V4dHJhICovCiAgaWYgKHBhcmFtcy0+c2JyX3hwb3NfY3RybCE9IFNCUl9YUE9TX0NUUkxfREVGQVVMVCkKICAgICBoU2JyRWxlbWVudC0+c2JySGVhZGVyRGF0YS5zYnJfZGF0YV9leHRyYSA9IDE7CgogIGhTYnJFbGVtZW50LT5zYnJIZWFkZXJEYXRhLnNicl9hbXBfcmVzID0gKEFNUF9SRVMpcGFyYW1zLT5hbXBfcmVzOwoKICAvKiBoZWFkZXJfZXh0cmFfMSAqLwogIGhTYnJFbGVtZW50LT5zYnJIZWFkZXJEYXRhLmZyZXFTY2FsZSAgPSBwYXJhbXMtPmZyZXFTY2FsZTsKICBoU2JyRWxlbWVudC0+c2JySGVhZGVyRGF0YS5hbHRlclNjYWxlID0gcGFyYW1zLT5hbHRlclNjYWxlOwogIGhTYnJFbGVtZW50LT5zYnJIZWFkZXJEYXRhLnNicl9ub2lzZV9iYW5kcyA9IHBhcmFtcy0+c2JyX25vaXNlX2JhbmRzOwogIGhTYnJFbGVtZW50LT5zYnJIZWFkZXJEYXRhLmhlYWRlcl9leHRyYV8xID0gMDsKCiAgaWYgKChwYXJhbXMtPmZyZXFTY2FsZSAhPSBTQlJfRlJFUV9TQ0FMRV9ERUZBVUxUKSB8fAogICAgICAocGFyYW1zLT5hbHRlclNjYWxlICE9IFNCUl9BTFRFUl9TQ0FMRV9ERUZBVUxUKSB8fAogICAgICAocGFyYW1zLT5zYnJfbm9pc2VfYmFuZHMgIT0gU0JSX05PSVNFX0JBTkRTX0RFRkFVTFQpKQogIHsKICAgaFNickVsZW1lbnQtPnNickhlYWRlckRhdGEuaGVhZGVyX2V4dHJhXzEgPSAxOwogIH0KCiAgLyogaGVhZGVyX2V4dHJhXzIgKi8KICBoU2JyRWxlbWVudC0+c2JySGVhZGVyRGF0YS5zYnJfbGltaXRlcl9iYW5kcyA9IHBhcmFtcy0+c2JyX2xpbWl0ZXJfYmFuZHM7CiAgaFNickVsZW1lbnQtPnNickhlYWRlckRhdGEuc2JyX2xpbWl0ZXJfZ2FpbnMgPSBwYXJhbXMtPnNicl9saW1pdGVyX2dhaW5zOwoKICBpZiAoKGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLnNhbXBsZUZyZXEgPiA0ODAwMCkgJiYKICAgICAgKGhTYnJFbGVtZW50LT5zYnJIZWFkZXJEYXRhLnNicl9zdGFydF9mcmVxdWVuY3kgPj0gOSkpCiAgewogICAgaFNickVsZW1lbnQtPnNickhlYWRlckRhdGEuc2JyX2xpbWl0ZXJfZ2FpbnMgPSBTQlJfTElNSVRFUl9HQUlOU19JTkZJTklURTsKICB9CgogIGhTYnJFbGVtZW50LT5zYnJIZWFkZXJEYXRhLnNicl9pbnRlcnBvbF9mcmVxID0gcGFyYW1zLT5zYnJfaW50ZXJwb2xfZnJlcTsKICBoU2JyRWxlbWVudC0+c2JySGVhZGVyRGF0YS5zYnJfc21vb3RoaW5nX2xlbmd0aCA9IHBhcmFtcy0+c2JyX3Ntb290aGluZ19sZW5ndGg7CiAgaFNickVsZW1lbnQtPnNickhlYWRlckRhdGEuaGVhZGVyX2V4dHJhXzIgPSAwOwoKICBpZiAoKHBhcmFtcy0+c2JyX2xpbWl0ZXJfYmFuZHMgIT0gU0JSX0xJTUlURVJfQkFORFNfREVGQVVMVCkgfHwKICAgICAgKHBhcmFtcy0+c2JyX2xpbWl0ZXJfZ2FpbnMgIT0gU0JSX0xJTUlURVJfR0FJTlNfREVGQVVMVCkgfHwKICAgICAgKHBhcmFtcy0+c2JyX2ludGVycG9sX2ZyZXEgIT0gU0JSX0lOVEVSUE9MX0ZSRVFfREVGQVVMVCkgfHwKICAgICAgKHBhcmFtcy0+c2JyX3Ntb290aGluZ19sZW5ndGggIT0gU0JSX1NNT09USElOR19MRU5HVEhfREVGQVVMVCkpCiAgewogICAgIGhTYnJFbGVtZW50LT5zYnJIZWFkZXJEYXRhLmhlYWRlcl9leHRyYV8yID0gMTsKICB9CgogICAvKiBvdGhlciBzd2l0Y2hlcyAqLwogIGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLnVzZVdhdmVDb2RpbmcgICAgICAgICAgICAgPSBwYXJhbXMtPnVzZVdhdmVDb2Rpbmc7CiAgaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEudXNlUGFyYW1ldHJpY0NvZGluZyAgICAgICA9IHBhcmFtcy0+cGFyYW1ldHJpY0NvZGluZzsKICBoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS50aHJlc2hvbGRBbXBSZXNGRl9tICAgICAgID0gcGFyYW1zLT50aHJlc2hvbGRfQW1wUmVzX0ZGX207CiAgaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEudGhyZXNob2xkQW1wUmVzRkZfZSAgICAgICA9IHBhcmFtcy0+dGhyZXNob2xkX0FtcFJlc19GRl9lOwoKICAvKiBpbml0IGZyZXEgYmFuZCB0YWJsZSAqLwogIGlmKHVwZGF0ZUZyZXFCYW5kVGFibGUoJmhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgJmhTYnJFbGVtZW50LT5zYnJIZWFkZXJEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLT5kb3duU2FtcGxlRmFjdG9yCiAgICAgICAgICAgICAgICAgICAgICAgICApKQogIHsKICAgIHJldHVybigxKTsKICB9CgogIC8qIG5vdyBjcmVhdGUgZW52ZWxvcGUgZXh0IGFuZCBRTUYgZm9yIGVhY2ggYXZhaWxhYmxlIGNoYW5uZWwgKi8KICBmb3IgKCBjaCA9IDA7IGNoIDwgaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEubkNoYW5uZWxzOyBjaCsrICkgewoKICAgICBpZiAoIGluaXRFbnZDaGFubmVsKCZoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICZoU2JyRWxlbWVudC0+c2JySGVhZGVyRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICZoU2JyRWxlbWVudC0+c2JyQ2hhbm5lbFtjaF0tPmhFbnZDaGFubmVsLAogICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcywKICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZXNJbml0RmxhZwogICAgICAgICAgICAgICAgICAgICAgICAsY2gKICAgICAgICAgICAgICAgICAgICAgICAgLGR5bmFtaWNfUkFNCiAgICAgICAgICAgICAgICAgICAgICAgICApICkKICAgICB7CiAgICAgICByZXR1cm4oMSk7CiAgICAgfQoKCiAgfSAvKiBuQ2hhbm5lbHMgKi8KCiAgLyogcmVzZXQgYW5kIGludGlhbGl6ZSBhbmFseXNpcyBxbWYgKi8KICBmb3IgKCBjaCA9IDA7IGNoIDwgKChoU2JyRWxlbWVudC0+ZWxJbmZvLmZQYXJhbWV0cmljU3RlcmVvKT8yOmhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLm5DaGFubmVscyk7IGNoKysgKQogIHsKICAgIGludCBlcnI7CiAgICBVSU5UIHFtZkZsYWdzID0gKGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLnNiclN5bnRheEZsYWdzICYgU0JSX1NZTlRBWF9MT1dfREVMQVkpID8gUU1GX0ZMQUdfQ0xERkIgOiAwOwogICAgaWYgKHN0YXRlc0luaXRGbGFnKQogICAgICBxbWZGbGFncyAmPSB+UU1GX0ZMQUdfS0VFUF9TVEFURVM7CiAgICBlbHNlCiAgICAgIHFtZkZsYWdzIHw9ICBRTUZfRkxBR19LRUVQX1NUQVRFUzsKCiAgICBlcnIgPSBxbWZJbml0QW5hbHlzaXNGaWx0ZXJCYW5rKCBoU2JyRWxlbWVudC0+aFFtZkFuYWx5c2lzW2NoXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGSVhQX1FBUyopaFNickVsZW1lbnQtPmhRbWZBbmFseXNpc1tjaF0tPkZpbHRlclN0YXRlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLm5vUW1mU2xvdHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5ub1FtZkJhbmRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEubm9RbWZCYW5kcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLm5vUW1mQmFuZHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxbWZGbGFncyApOwogICAgaWYgKDAhPWVycikgewogICAgICByZXR1cm4gZXJyOwogICAgfQogIH0KCiAgLyogICovCiAgaFNickVsZW1lbnQtPkNtb25EYXRhLnhPdmVyRnJlcSA9IGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLnhPdmVyRnJlcTsKICBoU2JyRWxlbWVudC0+Q21vbkRhdGEuZHluQndFbmFibGVkID0gKHBhcmFtcy0+ZHluQndTdXBwb3J0ZWQgJiYgcGFyYW1zLT5keW5Cd0VuYWJsZWQpOwogIGhTYnJFbGVtZW50LT5DbW9uRGF0YS5keW5YT3ZlckZyZXFFbmMgPSBGREtzYnJFbmNfU2JyR2V0WE92ZXJGcmVxKCBoU2JyRWxlbWVudCwgaFNickVsZW1lbnQtPkNtb25EYXRhLnhPdmVyRnJlcSk7CiAgZm9yICggaSA9IDA7IGkgPCA1OyBpKysgKQogICAgICBoU2JyRWxlbWVudC0+ZHluWE92ZXJGcmVxRGVsYXlbaV0gPSBoU2JyRWxlbWVudC0+Q21vbkRhdGEuZHluWE92ZXJGcmVxRW5jOwogIGhTYnJFbGVtZW50LT5DbW9uRGF0YS5zYnJOdW1DaGFubmVscyAgPSBoU2JyRWxlbWVudC0+c2JyQ29uZmlnRGF0YS5uQ2hhbm5lbHM7CiAgaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEuZHluWE92ZXJGcmVxID0gaFNickVsZW1lbnQtPkNtb25EYXRhLnhPdmVyRnJlcTsKCiAgLyogVXBkYXRlIEJhbmR3aXRoIHRvIGJlIHBhc3NlZCB0byB0aGUgY29yZSBlbmNvZGVyICovCiAgKmNvcmVCYW5kV2l0aCA9IGhTYnJFbGVtZW50LT5DbW9uRGF0YS54T3ZlckZyZXE7CgogIHJldHVybigwKTsKIH0KCklOVCBzYnJFbmNvZGVyX0dldEluQnVmZmVyU2l6ZShpbnQgbm9DaGFubmVscykKewogIElOVCB0ZW1wOwoKICB0ZW1wID0gKDIwNDgpOwogIHRlbXAgKz0gMTAyNCArIE1BWF9TQU1QTEVfREVMQVk7CiAgdGVtcCAqPSBub0NoYW5uZWxzOwogIHRlbXAgKj0gc2l6ZW9mKElOVF9QQ00pOwogIHJldHVybiB0ZW1wOwp9CgovKgogKiBFbmNvZGUgRHVtbXkgU0JSIHBheWxvYWQgZnJhbWVzIHRvIGZpbGwgdGhlIGRlbGF5IGxpbmVzLgogKi8Kc3RhdGljCklOVCBGREtzYnJFbmNfRGVsYXlDb21wZW5zYXRpb24gKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9FTkNPREVSIGhFbnZFbmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlRfUENNICp0aW1lQnVmZmVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKewogICAgaW50IG4sIGVsOwoKICAgIGZvciAobj1oRW52RW5jLT5uQml0c3RyRGVsYXk7IG4+MDsgbi0tKQogICAgewogICAgICBmb3IgKGVsPTA7IGVsPGhFbnZFbmMtPm5vRWxlbWVudHM7IGVsKyspCiAgICAgIHsKICAgICAgICBpZiAoRkRLc2JyRW5jX0VudkVuY29kZUZyYW1lKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEVudkVuYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZUJ1ZmZlciArIGhFbnZFbmMtPmRvd25zYW1wbGVkT2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEVudkVuYy0+c2JyRWxlbWVudFtlbF0tPnNickNvbmZpZ0RhdGEubkNoYW5uZWxzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpCiAgICAgICAgICByZXR1cm4gLTE7CiAgICAgIH0KICAgICAgc2JyRW5jb2Rlcl9VcGRhdGVCdWZmZXJzKGhFbnZFbmMsIHRpbWVCdWZmZXIpOwogICAgfQoJICByZXR1cm4gMDsKfQoKVUlOVCBzYnJFbmNvZGVyX0xpbWl0Qml0UmF0ZShVSU5UIGJpdFJhdGUsIFVJTlQgbnVtQ2hhbm5lbHMsIFVJTlQgY29yZVNhbXBsZVJhdGUsIEFVRElPX09CSkVDVF9UWVBFIGFvdCkKewogIFVJTlQgbmV3Qml0UmF0ZTsKICBJTlQgaW5kZXg7CgogIEZES19BU1NFUlQobnVtQ2hhbm5lbHMgPiAwICYmIG51bUNoYW5uZWxzIDw9IDIpOwogIGlmIChhb3QgPT0gQU9UX1BTKSB7CiAgICBpZiAobnVtQ2hhbm5lbHMgPT0gMikgewogICAgICBpbmRleCA9IGdldFBzVHVuaW5nVGFibGVJbmRleChiaXRSYXRlLCAmbmV3Qml0UmF0ZSk7CiAgICAgIGlmIChpbmRleCA9PSBJTlZBTElEX1RBQkxFX0lEWCkgewogICAgICAgIGJpdFJhdGUgPSBuZXdCaXRSYXRlOwogICAgICB9CiAgICAgIC8qIFNldCBudW1DaGFubmVscyB0byAxIGJlY2F1c2UgZm9yIFBTIHdlIG5lZWQgYSBTQlIgU0NFIChtb25vKSBlbGVtZW50LiAqLwogICAgICBudW1DaGFubmVscyA9IDE7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gMDsKICAgIH0KICB9CiAgaW5kZXggPSBnZXRTYnJUdW5pbmdUYWJsZUluZGV4KGJpdFJhdGUsIG51bUNoYW5uZWxzLCBjb3JlU2FtcGxlUmF0ZSwgYW90LCAmbmV3Qml0UmF0ZSk7CiAgaWYgKGluZGV4ICE9IElOVkFMSURfVEFCTEVfSURYKSB7CiAgICBuZXdCaXRSYXRlID0gYml0UmF0ZTsKICB9CgogIHJldHVybiBuZXdCaXRSYXRlOwp9CgpVSU5UIHNickVuY29kZXJfSXNTaW5nbGVSYXRlUG9zc2libGUoQVVESU9fT0JKRUNUX1RZUEUgYW90KQp7CiAgVUlOVCBpc1Bvc3NpYmxlPShBT1RfUFM9PWFvdCk/MDoxOwogIHJldHVybiBpc1Bvc3NpYmxlOwp9CgpJTlQgc2JyRW5jb2Rlcl9Jbml0KAogICAgICAgIEhBTkRMRV9TQlJfRU5DT0RFUiAgIGhTYnJFbmNvZGVyLAogICAgICAgIFNCUl9FTEVNRU5UX0lORk8gICAgIGVsSW5mb1soOCldLAogICAgICAgIGludCAgICAgICAgICAgICAgICAgIG5vRWxlbWVudHMsCiAgICAgICAgSU5UX1BDTSAgICAgICAgICAgICAqaW5wdXRCdWZmZXIsCiAgICAgICAgSU5UICAgICAgICAgICAgICAgICAqY29yZUJhbmR3aWR0aCwKICAgICAgICBJTlQgICAgICAgICAgICAgICAgICppbnB1dEJ1ZmZlck9mZnNldCwKICAgICAgICBJTlQgICAgICAgICAgICAgICAgICpudW1DaGFubmVscywKICAgICAgICBJTlQgICAgICAgICAgICAgICAgICpjb3JlU2FtcGxlUmF0ZSwKICAgICAgICBVSU5UICAgICAgICAgICAgICAgICpkb3duU2FtcGxlRmFjdG9yLAogICAgICAgIElOVCAgICAgICAgICAgICAgICAgKmZyYW1lTGVuZ3RoLAogICAgICAgIEFVRElPX09CSkVDVF9UWVBFICAgIGFvdCwKICAgICAgICBpbnQgICAgICAgICAgICAgICAgICpkZWxheSwKICAgICAgICBpbnQgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm1GYWN0b3IsCiAgICAgICAgY29uc3QgaW50ICAgICAgICAgICAgaGVhZGVyUGVyaW9kLAogICAgICAgIFVMT05HICAgICAgICAgICAgICAgIHN0YXRlc0luaXRGbGFnCiAgICAgICAgKQp7CiAgICBIQU5ETEVfRVJST1JfSU5GTyBlcnJvckluZm8gPSBub0Vycm9yOwogICAgc2JyQ29uZmlndXJhdGlvbiBzYnJDb25maWdbKDgpXTsKICAgIElOVCBlcnJvciA9IDA7CiAgICBJTlQgbG93ZXN0QmFuZHdpZHRoOwogICAgLyogU2F2ZSBpbnB1dCBwYXJhbWV0ZXJzICovCiAgICBJTlQgaW5wdXRTYW1wbGVSYXRlID0gKmNvcmVTYW1wbGVSYXRlOwogICAgaW50IGNvcmVGcmFtZUxlbmd0aCA9ICpmcmFtZUxlbmd0aDsKICAgIGludCBpbnB1dEJhbmRXaWR0aCA9ICpjb3JlQmFuZHdpZHRoOwogICAgaW50IGlucHV0Q2hhbm5lbHMgPSAqbnVtQ2hhbm5lbHM7CgogICAgaW50IGRvd25zYW1wbGVkT2Zmc2V0ID0gMDsKICAgIGludCBzYnJPZmZzZXQgPSAwOwogICAgaW50IGRvd25zYW1wbGVyRGVsYXkgPSAwOwogICAgaW50IHRpbWVEb21haW5Eb3duc2FtcGxlID0gMDsKICAgIGludCBuQml0c3RyRGVsYXkgPSAwOwogICAgaW50IGhpZ2hlc3RTYnJTdGFydEZyZXEsIGhpZ2hlc3RTYnJTdG9wRnJlcTsKICAgIGludCBsb3dEZWxheSA9IDA7CiAgICBpbnQgdXNlUHMgPSAwOwoKICAgIC8qIGNoZWNrIHdoZXRoZXIgU0JSIHNldHRpbmcgaXMgYXZhaWxhYmxlIGZvciB0aGUgY3VycmVudCBlbmNvZGVyIGNvbmZpZ3VyYXRpb24gKGJpdHJhdGUsIHNhbXBsZXJhdGUpICovCiAgICBpZiAoIXNickVuY29kZXJfSXNTaW5nbGVSYXRlUG9zc2libGUoYW90KSkgewogICAgICAqZG93blNhbXBsZUZhY3RvciA9IDI7CiAgICB9CgoKCiAgICBpZiAoIGFvdD09QU9UX1BTICkgewogICAgICAgIHVzZVBzID0gMTsKICAgIH0KICAgIGlmICggYW90PT1BT1RfRVJfQUFDX0VMRCApIHsKICAgICAgICBsb3dEZWxheSA9IDE7CiAgICB9CiAgICBlbHNlIGlmICggYW90PT1BT1RfRVJfQUFDX0xEICkgewogICAgICAgIGVycm9yID0gMTsKICAgICAgICBnb3RvIGJhaWw7CiAgICB9CgogICAgLyogUGFyYW1ldHJpYyBTdGVyZW8gKi8KICAgIGlmICggdXNlUHMgKSB7CiAgICAgIGlmICggKm51bUNoYW5uZWxzID09IDIgJiYgbm9FbGVtZW50cyA9PSAxKSB7CiAgICAgICAgLyogT3ZlcnJpZGUgRWxlbWVudCB0eXBlIGluIGNhc2Ugb2YgUGFyYW1ldHJpYyBzdGVyZW8gKi8KICAgICAgICBlbEluZm9bMF0uZWxUeXBlID0gSURfU0NFOwogICAgICAgIGVsSW5mb1swXS5mUGFyYW1ldHJpY1N0ZXJlbyA9IDE7CiAgICAgICAgZWxJbmZvWzBdLm5DaGFubmVsc0luRWwgPSAxOwogICAgICAgIC8qIGNvcmUgZW5jb2RlciBnZXRzIGRvd25taXhlZCBtb25vIHNpZ25hbCAqLwogICAgICAgICpudW1DaGFubmVscyAgPSAxOwogICAgICB9IGVsc2UgewogICAgICAgIGVycm9yID0gMTsKICAgICAgICBnb3RvIGJhaWw7CiAgICAgIH0KICAgIH0gLyogdXNlUHMgKi8KCiAgICAvKiBzZXQgdGhlIGNvcmUncyBzYW1wbGUgcmF0ZSAqLwogICAgc3dpdGNoICgqZG93blNhbXBsZUZhY3RvcikgewogICAgY2FzZSAxOgogICAgICAqY29yZVNhbXBsZVJhdGUgPSBpbnB1dFNhbXBsZVJhdGU7CiAgICAgIGJyZWFrOwogICAgY2FzZSAyOgogICAgICAqY29yZVNhbXBsZVJhdGUgPSBpbnB1dFNhbXBsZVJhdGU+PjE7CiAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgKmNvcmVTYW1wbGVSYXRlID0gaW5wdXRTYW1wbGVSYXRlPj4xOwogICAgICByZXR1cm4gMDsgLyogcmV0dXJuIGVycm9yICovCiAgICB9CgogICAgLyogY2hlY2sgd2hldGhlciBTQlIgc2V0dGluZyBpcyBhdmFpbGFibGUgZm9yIHRoZSBjdXJyZW50IGVuY29kZXIgY29uZmlndXJhdGlvbiAoYml0cmF0ZSwgY29yZVNhbXBsZVJhdGUpICovCiAgICB7CiAgICAgIGludCBkZWxheURpZmYgPSAwOwogICAgICBpbnQgZWwsIGNvcmVFbDsKCiAgICAgIC8qIENoZWNrIGlmIGV2ZXJ5IGVsZW1lbnQgY29uZmlnIGlzIGZlYXNpYmxlICovCiAgICAgIGZvciAoY29yZUVsPTA7IGNvcmVFbDxub0VsZW1lbnRzOyBjb3JlRWwrKykKICAgICAgewogICAgICAgIC8qIFNCUiBvbmx5IGhhbmRsZXMgU0NFIGFuZCBDUEUncyAqLwogICAgICAgIGlmIChlbEluZm9bY29yZUVsXS5lbFR5cGUgIT0gSURfU0NFICYmIGVsSW5mb1tjb3JlRWxdLmVsVHlwZSAhPSBJRF9DUEUpIHsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICAvKiBjaGVjayBpZiBkZXNpcmVkIGNvbmZpZ3VyYXRpb24gaXMgYXZhaWxhYmxlICovCiAgICAgICAgaWYgKCAhRkRLc2JyRW5jX0lzU2JyU2V0dGluZ0F2YWlsIChlbEluZm9bY29yZUVsXS5iaXRSYXRlLCAwLCBlbEluZm9bY29yZUVsXS5uQ2hhbm5lbHNJbkVsLCBpbnB1dFNhbXBsZVJhdGUsICpjb3JlU2FtcGxlUmF0ZSwgYW90KSApCiAgICAgICAgewogICAgICAgICAgICBlcnJvciA9IDE7CiAgICAgICAgICAgIGdvdG8gYmFpbDsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qIERldGVybWluZSBEZWxheSBiYWxhbmNpbmcgYW5kIG5ldyBlbmNvZGVyIGRlbGF5ICovCiAgICAgIGlmIChsb3dEZWxheSkgewogICAgICAgIHsKICAgICAgICBkZWxheURpZmYgPSAoKmRlbGF5ICogKmRvd25TYW1wbGVGYWN0b3IpICsgREVMQVlfRUxEMlNCUihjb3JlRnJhbWVMZW5ndGgsKmRvd25TYW1wbGVGYWN0b3IpOwogICAgICAgICpkZWxheSA9IERFTEFZX0VMRFNCUihjb3JlRnJhbWVMZW5ndGgsKmRvd25TYW1wbGVGYWN0b3IpOwogICAgICAgIH0KICAgICAgfQogICAgICBlbHNlIGlmICh1c2VQcykgewogICAgICAgIGRlbGF5RGlmZiA9ICgqZGVsYXkgKiAqZG93blNhbXBsZUZhY3RvcikgKyBERUxBWV9BQUMyUFMoY29yZUZyYW1lTGVuZ3RoLCpkb3duU2FtcGxlRmFjdG9yKTsKICAgICAgICAqZGVsYXkgPSBERUxBWV9QUyhjb3JlRnJhbWVMZW5ndGgsKmRvd25TYW1wbGVGYWN0b3IpOwogICAgICB9CiAgICAgIGVsc2UgewogICAgICAgIGRlbGF5RGlmZiA9IERFTEFZX0FBQzJTQlIoY29yZUZyYW1lTGVuZ3RoLCpkb3duU2FtcGxlRmFjdG9yKTsKICAgICAgICBkZWxheURpZmYgKz0gKCpkZWxheSAqICpkb3duU2FtcGxlRmFjdG9yKTsKICAgICAgICAqZGVsYXkgPSBERUxBWV9TQlIoY29yZUZyYW1lTGVuZ3RoLCpkb3duU2FtcGxlRmFjdG9yKTsKICAgICAgfQoKICAgICAgaWYgKCF1c2VQcykgewogICAgICAgICAgdGltZURvbWFpbkRvd25zYW1wbGUgPSAqZG93blNhbXBsZUZhY3Rvci0xOyAgLyogYWN0aXZhdGUgdGltZSBkb21haW4gZG93bnNhbXBsZXIgd2hlbiBkb3duU2FtcGxlRmFjdG9yIGlzICE9IDEgKi8KICAgICAgfQoKCiAgICAgIC8qIFRha2UgY2FyZSBhYm91dCBkb3duc2FtcGxlZCBkYXRhIGJvdW5kIHRvIHRoZSBTQlIgcGF0aCAqLwogICAgICBpZiAoIXRpbWVEb21haW5Eb3duc2FtcGxlICYmIGRlbGF5RGlmZiA+IDApIHsKICAgICAgICAvKgogICAgICAgICAqIFdlIG11c3QgdHdlYWsgdGhlIGJhbGFuY2luZyBpbnRvIGEgc2l0dWF0aW9uIHdoZXJlIHRoZSBkb3duc2FtcGxlZCBwYXRoCiAgICAgICAgICogaXMgdGhlIG9uZSB0byBiZSBkZWxheWVkLCBiZWNhdXNlIGRlbGF5aW5nIHRoZSBRTUYgZG9tYWluIGlucHV0LCBhbHNvIGRlbGF5cwogICAgICAgICAqIHRoZSBkb3duc2FtcGxlZCBhdWRpbywgY291bnRlcmFjdGluZyB0byB0aGUgcHVycG9zZSBvZiBkZWxheSBiYWxhbmNpbmcuCiAgICAgICAgICovCiAgICAgICAgd2hpbGUgKCBkZWxheURpZmYgPiAwICkKICAgICAgICB7CiAgICAgICAgICAvKiBFbmNvZGVyIGRlbGF5IGluY3JlYXNlcyAqLwogICAgICAgICAgewogICAgICAgICAgICAqZGVsYXkgKz0gY29yZUZyYW1lTGVuZ3RoICogKmRvd25TYW1wbGVGYWN0b3I7CiAgICAgICAgICAgIC8qIEFkZCBvbmUgZnJhbWUgZGVsYXkgdG8gU0JSIHBhdGggKi8KICAgICAgICAgICAgZGVsYXlEaWZmIC09IGNvcmVGcmFtZUxlbmd0aCAqICpkb3duU2FtcGxlRmFjdG9yOwogICAgICAgICAgfQogICAgICAgICAgbkJpdHN0ckRlbGF5ICs9IDE7CiAgICAgICAgfQogICAgICB9IGVsc2UKICAgICAgewogICAgICAgICpkZWxheSArPSBmaXhwX2FicyhkZWxheURpZmYpOwogICAgICB9CgogICAgICBpZiAoZGVsYXlEaWZmIDwgMCkgewogICAgICAgIC8qIERlbGF5IEFBQyBkYXRhICovCiAgICAgICAgZGVsYXlEaWZmID0gLWRlbGF5RGlmZjsKICAgICAgICAvKiBNdWx0aXBseSBkb3duc2FtcGxlZCBvZmZzZXQgYnkgQUFDIGNvcmUgY2hhbm5lbHMuIERpdmlkZSBieSAyIGJlY2F1c2Ugb2YgaGFsZiBzYW1wbGVyYXRlIG9mIGRvd25zYW1wbGVkIGRhdGEuICovCiAgICAgICAgRkRLX0FTU0VSVCgqZG93blNhbXBsZUZhY3Rvcj4wICYmICpkb3duU2FtcGxlRmFjdG9yPD0yKTsKICAgICAgICBkb3duc2FtcGxlZE9mZnNldCA9IChkZWxheURpZmYqKCpudW1DaGFubmVscykpPj4oKmRvd25TYW1wbGVGYWN0b3ItMSk7CiAgICAgICAgc2JyT2Zmc2V0ID0gMDsKICAgICAgfSBlbHNlIHsKICAgICAgICAvKiBEZWxheSBTQlIgaW5wdXQgKi8KICAgICAgICBpZiAoIGRlbGF5RGlmZiA+IChpbnQpY29yZUZyYW1lTGVuZ3RoICogKGludCkqZG93blNhbXBsZUZhY3RvciApCiAgICAgICAgewogICAgICAgICAgLyogRG8gYml0c3RyZWFtIGZyYW1lLXdpc2UgZGVsYXkgYmFsYW5jaW5nIGlmIHdlIGhhdmUgbW9yZSB0aGFuIFNCUiBmcmFtZWxlbmd0aCBzYW1wbGVzIGRlbGF5IGRpZmZlcmVuY2UgKi8KICAgICAgICAgIGRlbGF5RGlmZiAtPSBjb3JlRnJhbWVMZW5ndGggKiAqZG93blNhbXBsZUZhY3RvcjsKICAgICAgICAgIG5CaXRzdHJEZWxheSA9IDE7CiAgICAgICAgfQogICAgICAgIC8qIE11bHRpcGx5IGlucHV0IG9mZnNldCBieSBpbnB1dCBjaGFubmVscyAqLwogICAgICAgIHNick9mZnNldCA9IGRlbGF5RGlmZiooKm51bUNoYW5uZWxzKTsKICAgICAgICBkb3duc2FtcGxlZE9mZnNldCA9IDA7CiAgICAgIH0KICAgICAgaFNickVuY29kZXItPm5CaXRzdHJEZWxheSAgICAgICAgICAgID0gbkJpdHN0ckRlbGF5OwogICAgICBoU2JyRW5jb2Rlci0+bkNoYW5uZWxzICAgICAgICAgICAgICAgPSAqbnVtQ2hhbm5lbHM7CiAgICAgIGhTYnJFbmNvZGVyLT5mcmFtZVNpemUgICAgICAgICAgICAgICA9IGNvcmVGcmFtZUxlbmd0aCAqICpkb3duU2FtcGxlRmFjdG9yOwogICAgICBoU2JyRW5jb2Rlci0+ZlRpbWVEb21haW5Eb3duc2FtcGxpbmcgPSB0aW1lRG9tYWluRG93bnNhbXBsZTsKICAgICAgaFNickVuY29kZXItPmRvd25TYW1wbGVGYWN0b3IgICAgICAgID0gKmRvd25TYW1wbGVGYWN0b3I7CiAgICAgIGhTYnJFbmNvZGVyLT5lc3RpbWF0ZUJpdHJhdGUgICAgICAgICA9IDA7CiAgICAgIGhTYnJFbmNvZGVyLT5pbnB1dERhdGFEZWxheSAgICAgICAgICA9IDA7CgoKICAgICAgLyogT3BlbiBTQlIgZWxlbWVudHMgKi8KICAgICAgZWwgPSAtMTsKICAgICAgaGlnaGVzdFNiclN0YXJ0RnJlcSA9IGhpZ2hlc3RTYnJTdG9wRnJlcSA9IDA7CiAgICAgIGxvd2VzdEJhbmR3aWR0aCA9IDk5OTk5OwoKICAgICAgLyogTG9vcCB0aHJvdWdoIGVhY2ggY29yZSBlbmNvZGVyIGVsZW1lbnQgYW5kIGdldCBhIG1hdGNoaW5nIFNCUiBlbGVtZW50IGNvbmZpZyAqLwogICAgICBmb3IgKGNvcmVFbD0wOyBjb3JlRWw8bm9FbGVtZW50czsgY29yZUVsKyspCiAgICAgIHsKICAgICAgICAvKiBTQlIgb25seSBoYW5kbGVzIFNDRSBhbmQgQ1BFJ3MgKi8KICAgICAgICBpZiAoZWxJbmZvW2NvcmVFbF0uZWxUeXBlID09IElEX1NDRSB8fCBlbEluZm9bY29yZUVsXS5lbFR5cGUgPT0gSURfQ1BFKSB7CiAgICAgICAgICBlbCsrOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CgogICAgICAgIC8qIFNldCBwYXJhbWV0cmljIFN0ZXJlbyBGbGFnLiAqLwogICAgICAgIGlmICh1c2VQcykgewogICAgICAgICAgZWxJbmZvW2NvcmVFbF0uZlBhcmFtZXRyaWNTdGVyZW8gPSAxOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBlbEluZm9bY29yZUVsXS5mUGFyYW1ldHJpY1N0ZXJlbyA9IDA7CiAgICAgICAgfQoKICAgICAgICAvKgogICAgICAgICAqIEluaXQgc2JyQ29uZmlnIHN0cnVjdHVyZQogICAgICAgICAqLwogICAgICAgIGlmICggISBGREtzYnJFbmNfSW5pdGlhbGl6ZVNickRlZmF1bHRzICggJnNickNvbmZpZ1tlbF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZG93blNhbXBsZUZhY3RvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JlRnJhbWVMZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNfTE9XREVMQVkoYW90KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgKQogICAgICAgIHsKICAgICAgICAgIGVycm9yID0gMTsKICAgICAgICAgIGdvdG8gYmFpbDsKICAgICAgICB9CgogICAgICAgIC8qCiAgICAgICAgICogTW9kaWZ5IHNickNvbmZpZyBzdHJ1Y3R1cmUgYWNjb3JkaW5nIHRvIEVsZW1lbnQgcGFyYW1ldGVycwogICAgICAgICAqLwogICAgICAgIGlmICggISBGREtzYnJFbmNfQWRqdXN0U2JyU2V0dGluZ3MgKCZzYnJDb25maWdbZWxdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbEluZm9bY29yZUVsXS5iaXRSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbEluZm9bY29yZUVsXS5uQ2hhbm5lbHNJbkVsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjb3JlU2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRTYW1wbGVSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm1GYWN0b3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI0MDAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgLyogdXNlU3BlZWNoQ29uZmlnICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAvKiBsY3NNb2RlICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZVBzLCAvKiBiUGFyYW1ldHJpY1N0ZXJlbyAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhb3QpICkKICAgICAgICB7CiAgICAgICAgICBlcnJvciA9IDE7CiAgICAgICAgICBnb3RvIGJhaWw7CiAgICAgICAgfQoKICAgICAgICAvKiBGaW5kIGNvbW1vbiBmcmVxdWVuY3kgYm9yZGVyIGZvciBhbGwgU0JSIGVsZW1lbnRzICovCiAgICAgICAgaGlnaGVzdFNiclN0YXJ0RnJlcSA9IGZpeE1heChoaWdoZXN0U2JyU3RhcnRGcmVxLCBzYnJDb25maWdbZWxdLnN0YXJ0RnJlcSk7CiAgICAgICAgaGlnaGVzdFNiclN0b3BGcmVxID0gZml4TWF4KGhpZ2hlc3RTYnJTdG9wRnJlcSwgc2JyQ29uZmlnW2VsXS5zdG9wRnJlcSk7CgogICAgICB9IC8qIGZpcnN0IGVsZW1lbnQgbG9vcCAqLwoKICAgICAgLyogU2V0IGVsZW1lbnQgY291bnQgKGNhbiBiZSBsZXNzIHRoYW4gY29yZSBlbmNvZGVyIGVsZW1lbnQgY291bnQpICovCiAgICAgIGhTYnJFbmNvZGVyLT5ub0VsZW1lbnRzID0gZWwrMTsKCiAgICAgIEZES3NickVuY19SZWFsbG9jYXRlKGhTYnJFbmNvZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICBlbEluZm8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vRWxlbWVudHMpOwoKICAgICAgZm9yIChlbD0wOyBlbDxoU2JyRW5jb2Rlci0+bm9FbGVtZW50czsgZWwrKykgewoKICAgICAgICBpbnQgYmFuZHdpZHRoID0gKmNvcmVCYW5kd2lkdGg7CgogICAgICAgIC8qIFVzZSBsb3dlc3QgY29tbW9uIGJhbmR3aWR0aCAqLwogICAgICAgIHNickNvbmZpZ1tlbF0uc3RhcnRGcmVxID0gaGlnaGVzdFNiclN0YXJ0RnJlcTsKICAgICAgICBzYnJDb25maWdbZWxdLnN0b3BGcmVxID0gaGlnaGVzdFNiclN0b3BGcmVxOwoKICAgICAgICAvKiBpbml0aWFsaXplIFNCUiBlbGVtZW50LCBhbmQgZ2V0IGNvcmUgYmFuZHdpZHRoICovCiAgICAgICAgZXJyb3IgPSBGREtzYnJFbmNfRW52SW5pdChoU2JyRW5jb2Rlci0+c2JyRWxlbWVudFtlbF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2JyQ29uZmlnW2VsXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZiYW5kd2lkdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW90LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5CaXRzdHJEZWxheSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJQZXJpb2QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVzSW5pdEZsYWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFNickVuY29kZXItPmZUaW1lRG9tYWluRG93bnNhbXBsaW5nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsaFNickVuY29kZXItPmR5bmFtaWNSYW0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgIGlmIChlcnJvciAhPSAwKSB7CiAgICAgICAgICBlcnJvciA9IDI7CiAgICAgICAgICBnb3RvIGJhaWw7CiAgICAgICAgfQoKICAgICAgICAvKiBHZXQgbG93ZXN0IGNvcmUgZW5jb2RlciBiYW5kd2lkdGggdG8gYmUgcmV0dXJuZWQgbGF0ZXIuICovCiAgICAgICAgbG93ZXN0QmFuZHdpZHRoID0gZml4TWluKGxvd2VzdEJhbmR3aWR0aCwgYmFuZHdpZHRoKTsKCiAgICAgIH0gLyogc2Vjb25kIGVsZW1lbnQgbG9vcCAqLwoKICAgICAgLyogSW5pdGlhbGl6ZSBhIGRvd25zYW1wbGVyIGZvciBlYWNoIGNoYW5uZWwgaW4gZWFjaCBTQlIgZWxlbWVudCAqLwogICAgICBpZiAoaFNickVuY29kZXItPmZUaW1lRG9tYWluRG93bnNhbXBsaW5nKQogICAgICB7CiAgICAgICAgZm9yIChlbD0wOyBlbDxoU2JyRW5jb2Rlci0+bm9FbGVtZW50czsgZWwrKykKICAgICAgICB7CiAgICAgICAgICBIQU5ETEVfU0JSX0VMRU1FTlQgaFNickVsID0gaFNickVuY29kZXItPnNickVsZW1lbnRbZWxdOwogICAgICAgICAgSU5UIFdjLCBjaDsKCiAgICAgICAgICAvKiBDYWxjdWxhdGVkIHJlcXVpcmVkIG5vcm1hbGl6ZWQgY3V0b2ZmIGZyZXF1ZW5jeSAoV2MgPSAxLjAgLT4gbG93ZXN0QmFuZHdpZHRoID0gaW5wdXRTYW1wbGVSYXRlLzIpICovCiAgICAgICAgICBXYyA9ICgyKmxvd2VzdEJhbmR3aWR0aCkqMTAwMCAvIGlucHV0U2FtcGxlUmF0ZTsKCiAgICAgICAgICBmb3IgKGNoPTA7IGNoPGhTYnJFbC0+ZWxJbmZvLm5DaGFubmVsc0luRWw7IGNoKyspCiAgICAgICAgICB7CiAgICAgICAgICAgIEZES2FhY0VuY19Jbml0RG93bnNhbXBsZXIgKCZoU2JyRWwtPnNickNoYW5uZWxbY2hdLT5kb3duU2FtcGxlciwgV2MsICpkb3duU2FtcGxlRmFjdG9yKTsKICAgICAgICAgICAgRkRLX0FTU0VSVCAoaFNickVsLT5zYnJDaGFubmVsW2NoXS0+ZG93blNhbXBsZXIuZGVsYXkgPD1NQVhfRFNfRklMVEVSX0RFTEFZKTsKICAgICAgICAgIH0KCiAgICAgICAgICBkb3duc2FtcGxlckRlbGF5ID0gaFNickVsLT5zYnJDaGFubmVsWzBdLT5kb3duU2FtcGxlci5kZWxheTsKICAgICAgICB9IC8qIHRoaXJkIGVsZW1lbnQgbG9vcCAqLwoKICAgICAgICAvKiBsZmUgKi8KICAgICAgICBGREthYWNFbmNfSW5pdERvd25zYW1wbGVyICgmaFNickVuY29kZXItPmxmZURvd25TYW1wbGVyLCAwLCAqZG93blNhbXBsZUZhY3Rvcik7CgogICAgICAgIC8qIEFkZCB0aGUgcmVzYW1wbGVyIGFkZGl0aW9uYWwgZGVsYXkgdG8gZ2V0IHRoZSBmaW5hbCBkZWxheSBhbmQgYnVmZmVyIG9mZnNldCB2YWx1ZXMuICovCiAgICAgICAgaWYgKHNick9mZnNldCA+IDAgfHwgZG93bnNhbXBsZWRPZmZzZXQgPD0gKChkb3duc2FtcGxlckRlbGF5ICogKCpudW1DaGFubmVscykpPj4oKmRvd25TYW1wbGVGYWN0b3ItMSkpKSB7CiAgICAgICAgICBzYnJPZmZzZXQgKz0gKGRvd25zYW1wbGVyRGVsYXkgLSBkb3duc2FtcGxlZE9mZnNldCkgKiAoKm51bUNoYW5uZWxzKSA7CiAgICAgICAgICAqZGVsYXkgKz0gZG93bnNhbXBsZXJEZWxheSAtIGRvd25zYW1wbGVkT2Zmc2V0OwogICAgICAgICAgZG93bnNhbXBsZWRPZmZzZXQgPSAwOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBkb3duc2FtcGxlZE9mZnNldCAtPSAoZG93bnNhbXBsZXJEZWxheSAqICgqbnVtQ2hhbm5lbHMpKT4+KCpkb3duU2FtcGxlRmFjdG9yLTEpOwogICAgICAgICAgc2JyT2Zmc2V0ID0gMDsKICAgICAgICB9CgogICAgICAgIGhTYnJFbmNvZGVyLT5pbnB1dERhdGFEZWxheSA9IGRvd25zYW1wbGVyRGVsYXk7CiAgICAgIH0KCiAgICAgIC8qIEFzc2lnbiBjb3JlIGVuY29kZXIgQmFuZHdpZHRoICovCiAgICAgICpjb3JlQmFuZHdpZHRoID0gbG93ZXN0QmFuZHdpZHRoOwoKICAgICAgLyogRXN0aW1hdGUgc2JyIGJpdHJhdGUsIDIuNSBrQml0L3MgcGVyIHNiciBjaGFubmVsICovCiAgICAgIGhTYnJFbmNvZGVyLT5lc3RpbWF0ZUJpdHJhdGUgKz0gMjUwMCAqICgqbnVtQ2hhbm5lbHMpOwoKICAgICAgLyogaW5pdGlhbGl6ZSBwYXJhbWV0cmljIHN0ZXJlbyAqLwogICAgICBpZiAodXNlUHMpCiAgICAgIHsKICAgICAgICBQU0VOQ19DT05GSUcgcHNFbmNDb25maWc7CiAgICAgICAgRkRLX0FTU0VSVChoU2JyRW5jb2Rlci0+bm9FbGVtZW50cyA9PSAxKTsKICAgICAgICBJTlQgcHNUdW5pbmdUYWJsZUlkeCA9IGdldFBzVHVuaW5nVGFibGVJbmRleChlbEluZm9bMF0uYml0UmF0ZSwgTlVMTCk7CgogICAgICAgIHBzRW5jQ29uZmlnLmZyYW1lU2l6ZSAgICAgICAgICAgPSBjb3JlRnJhbWVMZW5ndGg7IC8vc2JyQ29uZmlnLnNickZyYW1lU2l6ZTsKICAgICAgICBwc0VuY0NvbmZpZy5xbWZGaWx0ZXJNb2RlICAgICAgID0gMDsKICAgICAgICBwc0VuY0NvbmZpZy5zYnJQc0RlbGF5ICAgICAgICAgID0gMDsKCiAgICAgICAgLyogdHVuaW5nIHBhcmFtZXRlcnMgKi8KICAgICAgICBpZiAocHNUdW5pbmdUYWJsZUlkeCAgIT0gSU5WQUxJRF9UQUJMRV9JRFgpIHsKICAgICAgICAgIHBzRW5jQ29uZmlnLm5TdGVyZW9CYW5kcyAgICAgICAgICAgPSBwc1R1bmluZ1RhYmxlW3BzVHVuaW5nVGFibGVJZHhdLm5TdGVyZW9CYW5kczsKICAgICAgICAgIHBzRW5jQ29uZmlnLm1heEVudmVsb3BlcyAgICAgICAgICAgPSBwc1R1bmluZ1RhYmxlW3BzVHVuaW5nVGFibGVJZHhdLm5FbnZlbG9wZXM7CiAgICAgICAgICBwc0VuY0NvbmZpZy5paWRRdWFudEVycm9yVGhyZXNob2xkID0gKEZJWFBfREJMKXBzVHVuaW5nVGFibGVbcHNUdW5pbmdUYWJsZUlkeF0uaWlkUXVhbnRFcnJvclRocmVzaG9sZDsKCiAgICAgICAgICAvKiBjYWxjdWxhdGlvbiBpcyBub3QgcXVpdGUgbGluZWFyLCBpbmNyZWFzZWQgbnVtYmVyIG9mIGVudmVsb3BlcyBjYXVzZXMgbW9yZSBiaXRzICovCiAgICAgICAgICAvKiBhc3N1bWUgYXZnLiA1MCBiaXRzIHBlciBmcmFtZSBmb3IgMTAgc3RlcmVvIGJhbmRzIC8gMSBlbnZlbG9wZSBjb25maWd1cmF0aW9uICovCiAgICAgICAgICBoU2JyRW5jb2Rlci0+ZXN0aW1hdGVCaXRyYXRlICs9ICggKCgoKmNvcmVTYW1wbGVSYXRlKSAqIDUgKiBwc0VuY0NvbmZpZy5uU3RlcmVvQmFuZHMgKiBwc0VuY0NvbmZpZy5tYXhFbnZlbG9wZXMpIC8gaFNickVuY29kZXItPmZyYW1lU2l6ZSkpOwoKICAgICAgICB9IGVsc2UgewogICAgICAgICAgZXJyb3IgPSBFUlJPUihDREksICJJbnZhbGlkIHBzIHR1bmluZyB0YWJsZSBpbmRleC4iKTsKICAgICAgICAgIGdvdG8gYmFpbDsKICAgICAgICB9CgogICAgICAgIHFtZkluaXRTeW50aGVzaXNGaWx0ZXJCYW5rKCZoU2JyRW5jb2Rlci0+cW1mU3ludGhlc2lzUFMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGSVhQX0RCTCopaFNickVuY29kZXItPnFtZlN5bnRoZXNpc1BTLkZpbHRlclN0YXRlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFNickVuY29kZXItPnNickVsZW1lbnRbMF0tPnNickNvbmZpZ0RhdGEubm9RbWZTbG90cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFNickVuY29kZXItPnNickVsZW1lbnRbMF0tPnNickNvbmZpZ0RhdGEubm9RbWZCYW5kcz4+MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFNickVuY29kZXItPnNickVsZW1lbnRbMF0tPnNickNvbmZpZ0RhdGEubm9RbWZCYW5kcz4+MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFNickVuY29kZXItPnNickVsZW1lbnRbMF0tPnNickNvbmZpZ0RhdGEubm9RbWZCYW5kcz4+MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0YXRlc0luaXRGbGFnKSA/IDAgOiBRTUZfRkxBR19LRUVQX1NUQVRFUyk7CgogICAgICAgIGlmKGVycm9ySW5mbyA9PSBub0Vycm9yKXsKICAgICAgICAgIC8qIHVwZGF0ZSBkZWxheSAqLwogICAgICAgICAgcHNFbmNDb25maWcuc2JyUHNEZWxheSA9IEZES3NickVuY19HZXRFbnZFc3REZWxheSgmaFNickVuY29kZXItPnNickVsZW1lbnRbMF0tPnNickNoYW5uZWxbMF0tPmhFbnZDaGFubmVsLnNickV4dHJhY3RFbnZlbG9wZSk7CgogICAgICAgICAgaWYobm9FcnJvciAhPSAoZXJyb3JJbmZvID0gUFNFbmNfSW5pdCggaFNickVuY29kZXItPmhQYXJhbWV0cmljU3RlcmVvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHNFbmNDb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoU2JyRW5jb2Rlci0+c2JyRWxlbWVudFswXS0+c2JyQ29uZmlnRGF0YS5ub1FtZlNsb3RzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFNickVuY29kZXItPnNickVsZW1lbnRbMF0tPnNickNvbmZpZ0RhdGEubm9RbWZCYW5kcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsaFNickVuY29kZXItPmR5bmFtaWNSYW0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpKQogICAgICAgICAgewogICAgICAgICAgICBlcnJvckluZm8gPSBoYW5kQmFjayhlcnJvckluZm8pOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLyogUU1GIGFuYWx5c2lzICsgSHlicmlkIGFuYWx5c2lzICsgSHlicmlkIHN5bnRoZXNpcyArIFFNRiBzeW50aGVzaXMgKyBkb3duc2FtcGxlZCBpbnB1dCBidWZmZXIgZGVsYXkgKi8KICAgICAgICBoU2JyRW5jb2Rlci0+aW5wdXREYXRhRGVsYXkgPSAoNjQqMTAvMikgKyAoNio2NCkgKyAgKDApICsgKDY0KjEwLzItNjQrMSkgKyAoKCpkb3duU2FtcGxlRmFjdG9yKSpkb3duc2FtcGxlZE9mZnNldCk7CiAgICAgIH0KCiAgICAgIGhTYnJFbmNvZGVyLT5kb3duc2FtcGxlZE9mZnNldCA9IGRvd25zYW1wbGVkT2Zmc2V0OwogICAgICB7CiAgICAgICAgaFNickVuY29kZXItPmRvd25taXhTaXplID0gY29yZUZyYW1lTGVuZ3RoKigqbnVtQ2hhbm5lbHMpOwogICAgICB9CgogICAgICBoU2JyRW5jb2Rlci0+YnVmZmVyT2Zmc2V0ID0gc2JyT2Zmc2V0OwogICAgICAvKiBEZWxheSBDb21wZW5zYXRpb246IGZpbGwgYml0c3RyZWFtIGRlbGF5IGJ1ZmZlciB3aXRoIHplcm8gaW5wdXQgc2lnbmFsICovCiAgICAgIGlmICggaFNickVuY29kZXItPm5CaXRzdHJEZWxheSA+IDAgKQogICAgICB7CiAgICAgICAgZXJyb3IgPSBGREtzYnJFbmNfRGVsYXlDb21wZW5zYXRpb24gKGhTYnJFbmNvZGVyLCBpbnB1dEJ1ZmZlcik7CiAgICAgICAgaWYgKGVycm9yICE9IDApCiAgICAgICAgICBnb3RvIGJhaWw7CiAgICAgIH0KCiAgICAgIC8qIFNldCBPdXRwdXQgZnJhbWUgbGVuZ3RoICovCiAgICAgICpmcmFtZUxlbmd0aCA9IGNvcmVGcmFtZUxlbmd0aCAqICpkb3duU2FtcGxlRmFjdG9yOwogICAgICAvKiBJbnB1dCBidWZmZXIgb2Zmc2V0ICovCiAgICAgICppbnB1dEJ1ZmZlck9mZnNldCA9IGZpeE1heChzYnJPZmZzZXQsIGRvd25zYW1wbGVkT2Zmc2V0KTsKCgogICAgfQoKICAgIHJldHVybiBlcnJvcjsKCmJhaWw6CiAgICAvKiBSZXN0b3JlIGlucHV0IHNldHRpbmdzICovCiAgICAqY29yZVNhbXBsZVJhdGUgPSBpbnB1dFNhbXBsZVJhdGU7CiAgICAqZnJhbWVMZW5ndGggPSBjb3JlRnJhbWVMZW5ndGg7CiAgICAqbnVtQ2hhbm5lbHMgPSBpbnB1dENoYW5uZWxzOwogICAgKmNvcmVCYW5kd2lkdGggPSBpbnB1dEJhbmRXaWR0aDsKCiAgICByZXR1cm4gZXJyb3I7CiB9CgoKSU5UCnNickVuY29kZXJfRW5jb2RlRnJhbWUoICBIQU5ETEVfU0JSX0VOQ09ERVIgICBoU2JyRW5jb2RlciwKICAgICAgICAgICAgICAgICAgICAgICAgIElOVF9QQ00gICAgICAgICAgICAgKnNhbXBsZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UICAgICAgICAgICAgICAgICB0aW1lSW5TdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UICAgICAgICAgICAgICAgICBzYnJEYXRhQml0c1soOCldLAogICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgICAgICAgICAgICAgICAgc2JyRGF0YVsoOCldW01BWF9QQVlMT0FEX1NJWkVdCiAgICAgICAgICAgICAgICAgICAgICAgICkKewogIElOVCBlcnJvcjsKICBpbnQgZWw7CgogIGZvciAoZWw9MDsgZWw8aFNickVuY29kZXItPm5vRWxlbWVudHM7IGVsKyspCiAgewogICAgaWYgKGhTYnJFbmNvZGVyLT5zYnJFbGVtZW50W2VsXSAhPSBOVUxMKQogICAgewogICAgICBlcnJvciA9IEZES3NickVuY19FbnZFbmNvZGVGcmFtZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhTYnJFbmNvZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVzICsgaFNickVuY29kZXItPmRvd25zYW1wbGVkT2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZUluU3RyaWRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2JyRGF0YUJpdHNbZWxdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRGF0YVtlbF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgIGlmIChlcnJvcikKICAgICAgICByZXR1cm4gZXJyb3I7CiAgICB9CiAgfQoKICBpZiAoICggaFNickVuY29kZXItPmxmZUNoSWR4IT0tMSkgJiYgKGhTYnJFbmNvZGVyLT5kb3duU2FtcGxlRmFjdG9yID4gMSkgKQogIHsgICAvKiBsZmUgZG93bnNhbXBsZXIgKi8KICAgICAgSU5UIG5PdXRTYW1wbGVzOwoKICAgICAgRkRLYWFjRW5jX0Rvd25zYW1wbGUoJmhTYnJFbmNvZGVyLT5sZmVEb3duU2FtcGxlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXMgKyBoU2JyRW5jb2Rlci0+ZG93bnNhbXBsZWRPZmZzZXQgKyBoU2JyRW5jb2Rlci0+YnVmZmVyT2Zmc2V0ICsgaFNickVuY29kZXItPmxmZUNoSWR4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaFNickVuY29kZXItPmZyYW1lU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVJblN0cmlkZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXMgKyBoU2JyRW5jb2Rlci0+ZG93bnNhbXBsZWRPZmZzZXQgKyBoU2JyRW5jb2Rlci0+bGZlQ2hJZHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICZuT3V0U2FtcGxlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhTYnJFbmNvZGVyLT5uQ2hhbm5lbHMpOwoKCiAgfQoKICByZXR1cm4gMDsKfQoKCklOVCBzYnJFbmNvZGVyX1VwZGF0ZUJ1ZmZlcnMoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0VOQ09ERVIgaFNickVuY29kZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlRfUENNICp0aW1lQnVmZmVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiB7CiAgICBpZiAoIGhTYnJFbmNvZGVyLT5kb3duc2FtcGxlZE9mZnNldCA+IDAgKSB7CiAgICAgIC8qIE1vdmUgZGVsYXllZCBkb3duc2FtcGxlZCBkYXRhICovCiAgICAgIEZES21lbWNweSAoIHRpbWVCdWZmZXIsCiAgICAgICAgICAgICAgICAgIHRpbWVCdWZmZXIgKyBoU2JyRW5jb2Rlci0+ZG93bm1peFNpemUsCiAgICAgICAgICAgICAgICAgIHNpemVvZihJTlRfUENNKSAqIChoU2JyRW5jb2Rlci0+ZG93bnNhbXBsZWRPZmZzZXQpICk7CiAgICB9IGVsc2UgewogICAgICAvKiBNb3ZlIGRlbGF5ZWQgaW5wdXQgZGF0YSAqLwogICAgICBGREttZW1jcHkgKCB0aW1lQnVmZmVyLAogICAgICAgIHRpbWVCdWZmZXIgKyBoU2JyRW5jb2Rlci0+bkNoYW5uZWxzICogaFNickVuY29kZXItPmZyYW1lU2l6ZSwKICAgICAgICAgICAgICAgICAgc2l6ZW9mKElOVF9QQ00pICogaFNickVuY29kZXItPmJ1ZmZlck9mZnNldCApOwogICAgfQogICAgaWYgKCBoU2JyRW5jb2Rlci0+bkJpdHN0ckRlbGF5ID4gMCAgKQogICAgewogICAgICBpbnQgZWw7CgogICAgICBmb3IgKGVsPTA7IGVsPGhTYnJFbmNvZGVyLT5ub0VsZW1lbnRzOyBlbCsrKQogICAgICB7CiAgICAgICAgRkRLbWVtbW92ZSAoIGhTYnJFbmNvZGVyLT5zYnJFbGVtZW50W2VsXS0+cGF5bG9hZERlbGF5TGluZVswXSwKICAgICAgICAgICAgICAgICAgICAgaFNickVuY29kZXItPnNickVsZW1lbnRbZWxdLT5wYXlsb2FkRGVsYXlMaW5lWzFdLAogICAgICAgICAgICAgICAgICAgICBzaXplb2YoVUNIQVIpICogKGhTYnJFbmNvZGVyLT5uQml0c3RyRGVsYXkqTUFYX1BBWUxPQURfU0laRSkgKTsKCiAgICAgICAgRkRLbWVtbW92ZSggJmhTYnJFbmNvZGVyLT5zYnJFbGVtZW50W2VsXS0+cGF5bG9hZERlbGF5TGluZVNpemVbMF0sCiAgICAgICAgICAgICAgICAgICAgJmhTYnJFbmNvZGVyLT5zYnJFbGVtZW50W2VsXS0+cGF5bG9hZERlbGF5TGluZVNpemVbMV0sCiAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFVJTlQpICogKGhTYnJFbmNvZGVyLT5uQml0c3RyRGVsYXkpICk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiAwOwogfQoKCklOVCBzYnJFbmNvZGVyX0dldEVzdGltYXRlQml0cmF0ZShIQU5ETEVfU0JSX0VOQ09ERVIgaFNickVuY29kZXIpCnsKICBJTlQgZXN0aW1hdGVCaXRyYXRlID0gMDsKCiAgaWYoaFNickVuY29kZXIpIHsKICAgIGVzdGltYXRlQml0cmF0ZSArPSBoU2JyRW5jb2Rlci0+ZXN0aW1hdGVCaXRyYXRlOwogIH0KCiAgcmV0dXJuIGVzdGltYXRlQml0cmF0ZTsKfQoKSU5UIHNickVuY29kZXJfR2V0SW5wdXREYXRhRGVsYXkoSEFORExFX1NCUl9FTkNPREVSIGhTYnJFbmNvZGVyKQp7CiAgSU5UIGRlbGF5ID0gLTE7CgogIGlmKGhTYnJFbmNvZGVyKSB7CiAgICBkZWxheSA9IGhTYnJFbmNvZGVyLT5pbnB1dERhdGFEZWxheTsKICB9CiAgcmV0dXJuIGRlbGF5Owp9CgoKSU5UIHNickVuY29kZXJfR2V0TGliSW5mbyggTElCX0lORk8gKmluZm8gKQp7CiAgaW50IGk7CgogIGlmIChpbmZvID09IE5VTEwpIHsKICAgIHJldHVybiAtMTsKICB9CiAgLyogc2VhcmNoIGZvciBuZXh0IGZyZWUgdGFiICovCiAgZm9yIChpID0gMDsgaSA8IEZES19NT0RVTEVfTEFTVDsgaSsrKSB7CiAgICBpZiAoaW5mb1tpXS5tb2R1bGVfaWQgPT0gRkRLX05PTkUpIGJyZWFrOwogIH0KICBpZiAoaSA9PSBGREtfTU9EVUxFX0xBU1QpIHsKICAgIHJldHVybiAtMTsKICB9CiAgaW5mbyArPSBpOwoKICBpbmZvLT5tb2R1bGVfaWQgPSBGREtfU0JSRU5DOwogIGluZm8tPnZlcnNpb24gPSBMSUJfVkVSU0lPTihTQlJFTkNPREVSX0xJQl9WTDAsIFNCUkVOQ09ERVJfTElCX1ZMMSwgU0JSRU5DT0RFUl9MSUJfVkwyKTsKICBMSUJfVkVSU0lPTl9TVFJJTkcoaW5mbyk7CiNpZmRlZiBfX0FORFJPSURfXwogIGluZm8tPmJ1aWxkX2RhdGUgPSAiIjsKICBpbmZvLT5idWlsZF90aW1lID0gIiI7CiNlbHNlCiAgaW5mby0+YnVpbGRfZGF0ZSA9IF9fREFURV9fOwogIGluZm8tPmJ1aWxkX3RpbWUgPSBfX1RJTUVfXzsKI2VuZGlmCiAgaW5mby0+dGl0bGUgPSAiU0JSIEVuY29kZXIiOwoKICAvKiBTZXQgZmxhZ3MgKi8KICBpbmZvLT5mbGFncyA9IDAKICAgIHwgQ0FQRl9TQlJfSFEKICAgIHwgQ0FQRl9TQlJfUFNfTVBFRwogICAgOwogIC8qIEVuZCBvZiBmbGFncyAqLwoKICByZXR1cm4gMDsKfQo=