LyoKICogQ2luZXBhayBlbmNvZGVyIChjKSAyMDExIFRvbWFzIEjkcmRpbgogKiBodHRwOi8vdGl0YW4uY29kZW1pbGwuc2UvfnRvbWhhci9jaW5lcGFrZW5jLnBhdGNoCiAqCiAqIEZpeGVzIGFuZCBpbXByb3ZlbWVudHMsIHZpbnRhZ2UgZGVjb2RlcnMgY29tcGF0aWJpbGl0eQogKiAgKGMpIDIwMTMsIDIwMTQgUmwsIEFldGV5IEdsb2JhbCBUZWNobm9sb2dpZXMgQUIKClBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCmNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCnRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCmFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQpTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgoKVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCgpUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgpJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwKVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCkFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgpPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCgogKiBUT0RPOgogKiAtIG9wdGltaXplOiBjb2xvciBzcGFjZSBjb252ZXJzaW9uLCAuLi4KICogLSBpbXBsZW1lbnQgb3B0aW9ucyB0byBzZXQgdGhlIG1pbi9tYXggbnVtYmVyIG9mIHN0cmlwcz8KICogTUFZQkU6CiAqIC0gIm9wdGltYWxseSIgc3BsaXQgdGhlIGZyYW1lIGludG8gc2V2ZXJhbCBub24tcmVndWxhciBhcmVhcwogKiAgIHVzaW5nIGEgc2VwYXJhdGUgY29kZWJvb2sgcGFpciBmb3IgZWFjaCBhcmVhIGFuZCBhcHByb3hpbWF0aW5nCiAqICAgdGhlIGFyZWEgYnkgc2V2ZXJhbCByZWN0YW5ndWxhciBzdHJpcHMgKGdlbmVyYWxseSBub3QgZnVsbCB3aWR0aCBvbmVzKQogKiAgICh1c2UgcXVhZHRyZWUgc3BsaXR0aW5nPyBhIHNpbXBsZSBmaXhlZC1ncmFudWxhcml0eSBncmlkPykKICoKICoKICogdmVyc2lvbiAyMDE0LTAxLTIzIFJsCiAqIC0gYWRkZWQgb3B0aW9uIGhhbmRsaW5nIGZvciBmbGV4aWJpbGl0eQogKgogKiB2ZXJzaW9uIDIwMTQtMDEtMjEgUmwKICogLSBiZWxpZXZlIGl0IG9yIG5vdCwgbm93IHdlIGdldCBldmVuIHNtYWxsZXIgZmlsZXMsIHdpdGggYmV0dGVyIHF1YWxpdHkKICogICAod2hpY2ggbWVhbnMgSSBtaXNzZWQgYW4gb3B0aW1pemF0aW9uIGVhcmxpZXIgOikKICoKICogdmVyc2lvbiAyMDE0LTAxLTIwIFJsCiAqIC0gbWFkZSB0aGUgZW5jb2RlciBjb21wYXRpYmxlIHdpdGggdmludGFnZSBkZWNvZGVycwogKiAgIGFuZCBhZGRlZCBzb21lIHlldCB1bnVzZWQgY29kZSBmb3IgcG9zc2libGUgZnV0dXJlCiAqICAgaW5jcmVtZW50YWwgY29kZWJvb2sgdXBkYXRlcwogKiAtIGZpeGVkIGEgc21hbGwgbWVtb3J5IGxlYWsKICoKICogdmVyc2lvbiAyMDEzLTA0LTI4IFJsCiAqIC0gYnVnZml4ZWQgY29kZWJvb2sgb3B0aW1pemF0aW9uIGxvZ2ljCiAqCiAqIHZlcnNpb24gMjAxMy0wMi0xNCBSbAogKiAiVmFsZW50aW5lJ3MgRGF5IiB2ZXJzaW9uOgogKiAtIG1hZGUgc3RyaXAgZGl2aXNpb24gbW9yZSByb2J1c3QKICogLSBtaW5pbWl6ZWQgYnJ1dGVmb3JjaW5nIHRoZSBudW1iZXIgb2Ygc3RyaXBzLAogKiAgIChjb3N0cyBzb21lIFIvRCBidXQgc3BlZWRzIHVwIGNvbXBlc3Npb24gYSBsb3QpLCB0aGUgaGV1cmlzdGljCiAqICAgYXNzdW1wdGlvbiBpcyB0aGF0IHNjb3JlIGFzIGEgZnVuY3Rpb24gb2YgdGhlIG51bWJlciBvZiBzdHJpcHMgaGFzCiAqICAgb25lIHdpZGUgbWluaW11bSB3aGljaCBtb3ZlcyBzbG93bHksIG9mIGNvdXJzZSBub3QgZnVsbHkgdHJ1ZQogKiAtIHNpbXBsaWZpZWQgY29kZWJvb2sgZ2VuZXJhdGlvbiwKICogICB0aGUgb2xkIGNvZGUgd2FzIG1lYW50IGZvciBvdGhlciBvcHRpbWl6YXRpb25zIHRoYW4gd2UgYWN0dWFsbHkgZG8KICogLSBvcHRpbWl6ZWQgdGhlIGNvZGVib29rIGdlbmVyYXRpb24gLyBlcnJvciBlc3RpbWF0aW9uIGZvciBNT0RFX01DCiAqCiAqIHZlcnNpb24gMjAxMy0wMi0xMiBSbAogKiAtIHNlcGFyYXRlZCBjb2RlYm9vayB0cmFpbmluZyBzZXRzLCBhdm9pZGVkIHRoZSB0cmFuc2ZlciBvZiB3YXN0ZWQgYnl0ZXMsCiAqICAgd2hpY2ggeWllbGRzIGJvdGggYmV0dGVyIHF1YWxpdHkgYW5kIHNtYWxsZXIgZmlsZXMKICogLSBub3cgdXNpbmcgdGhlIGNvcnJlY3QgY29sb3JzcGFjZSAoVE9ETzogbW92ZSBjb252ZXJzaW9uIHRvIGxpYnN3c2NhbGUpCiAqCiAqIHZlcnNpb24gMjAxMy0wMi0wOCBSbAogKiAtIGZpeGVzL29wdGltaXphdGlvbiBpbiBtdWx0aXN0cmlwIGVuY29kaW5nIGFuZCBjb2RlYm9vayBzaXplIGNob2ljZSwKICogICBxdWFsaXR5L2JpdHJhdGUgaXMgbm93IGJldHRlciB0aGFuIHRoYXQgb2YgdGhlIGJpbmFyeSBwcm9wcmlldGFyeSBlbmNvZGVyCiAqLwoKI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKI2luY2x1ZGUgImF2Y29kZWMuaCIKI2luY2x1ZGUgImxpYmF2dXRpbC9sZmcuaCIKI2luY2x1ZGUgImVsYmcuaCIKI2luY2x1ZGUgImludGVybmFsLmgiCgojaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCiNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCgojZGVmaW5lIENWSURfSEVBREVSX1NJWkUgMTAKI2RlZmluZSBTVFJJUF9IRUFERVJfU0laRSAxMgojZGVmaW5lIENIVU5LX0hFQURFUl9TSVpFIDQKCiNkZWZpbmUgTUJfU0laRSA0ICAgICAgICAgICAvLzR4NCBNQnMKI2RlZmluZSBNQl9BUkVBIChNQl9TSVpFKk1CX1NJWkUpCgojZGVmaW5lIFZFQ1RPUl9NQVggNiAgICAgICAgLy9zaXggb3IgZm91ciBlbnRyaWVzIHBlciB2ZWN0b3IgZGVwZW5kaW5nIG9uIGZvcm1hdAojZGVmaW5lIENPREVCT09LX01BWCAyNTYgICAgLy9zaXplIG9mIGEgY29kZWJvb2sKCiNkZWZpbmUgTUFYX1NUUklQUyAgMzIgICAgICAvL05vdGU6IGhhdmluZyBmZXdlciBjaG9pY2VzIHJlZ2FyZGluZyB0aGUgbnVtYmVyIG9mIHN0cmlwcyBzcGVlZHMgdXAgZW5jb2RpbmcgKG9idmlvdXNseSkKI2RlZmluZSBNSU5fU1RSSVBTICAxICAgICAgIC8vTm90ZTogaGF2aW5nIG1vcmUgc3RyaXBzIHNwZWVkcyB1cCBlbmNvZGluZyB0aGUgZnJhbWUgKHRoaXMgaXMgbGVzcyBvYnZpb3VzKQovLyBNQVhfU1RSSVBTIGxpbWl0cyB0aGUgbWF4aW11bSBxdWFsaXR5IHlvdSBjYW4gcmVhY2gKLy8gICAgICAgICAgICB3aGVuIHlvdSB3YW50IGhpZ2h0IHF1YWxpdHkgb24gaGlnaCByZXNvbHV0aW9ucywKLy8gTUlOX1NUUklQUyBsaW1pdHMgdGhlIG1pbmltdW0gZWZmaWNpZW50bHkgZW5jb2RhYmxlIGJpdCByYXRlCi8vICAgICAgICAgICAgb24gbG93IHJlc29sdXRpb25zCi8vIHRoZSBudW1iZXJzIGFyZSBvbmx5IHVzZWQgZm9yIGJydXRlIGZvcmNlIG9wdGltaXphdGlvbiBmb3IgdGhlIGZpcnN0IGZyYW1lLAovLyBmb3IgdGhlIGZvbGxvd2luZyBmcmFtZXMgdGhleSBhcmUgYWRhcHRpdmVseSByZWFkanVzdGVkCi8vIE5PVEUgdGhlIGRlY29kZXIgaW4gZmZtcGVnIGhhcyBpdHMgb3duIGFyYml0cmFyeSBsaW1pdGF0aW9uIG9uIHRoZSBudW1iZXIKLy8gb2Ygc3RyaXBzLCBjdXJyZW50bHkgMzIKCnR5cGVkZWYgZW51bSB7CiAgICBNT0RFX1YxX09OTFkgPSAwLAogICAgTU9ERV9WMV9WNCwKICAgIE1PREVfTUMsCgogICAgTU9ERV9DT1VOVCwKfSBDaW5lcGFrTW9kZTsKCnR5cGVkZWYgZW51bSB7CiAgICBFTkNfVjEsCiAgICBFTkNfVjQsCiAgICBFTkNfU0tJUCwKCiAgICBFTkNfVU5DRVJUQUlOCn0gbWJfZW5jb2Rpbmc7Cgp0eXBlZGVmIHN0cnVjdCB7CiAgICBpbnQgdjFfdmVjdG9yOyAgICAgICAgICAgICAgICAgIC8vaW5kZXggaW50byB2MSBjb2RlYm9vawogICAgaW50IHYxX2Vycm9yOyAgICAgICAgICAgICAgICAgICAvL2Vycm9yIHdoZW4gdXNpbmcgVjEgZW5jb2RpbmcKICAgIGludCB2NF92ZWN0b3JbNF07ICAgICAgICAgICAgICAgLy9pbmRpY2VzIGludG8gdjQgY29kZWJvb2tzCiAgICBpbnQgdjRfZXJyb3I7ICAgICAgICAgICAgICAgICAgIC8vZXJyb3Igd2hlbiB1c2luZyBWNCBlbmNvZGluZwogICAgaW50IHNraXBfZXJyb3I7ICAgICAgICAgICAgICAgICAvL2Vycm9yIHdoZW4gYmxvY2sgaXMgc2tpcHBlZCAoYWthIGNvcGllZCBmcm9tIGxhc3QgZnJhbWUpCiAgICBtYl9lbmNvZGluZyBiZXN0X2VuY29kaW5nOyAgICAgIC8vbGFzdCByZXN1bHQgZnJvbSBjYWxjdWxhdGVfbW9kZV9zY29yZSgpCn0gbWJfaW5mbzsKCnR5cGVkZWYgc3RydWN0IHsKICAgIGludCB2MV9jb2RlYm9va1tDT0RFQk9PS19NQVgqVkVDVE9SX01BWF07CiAgICBpbnQgdjRfY29kZWJvb2tbQ09ERUJPT0tfTUFYKlZFQ1RPUl9NQVhdOwogICAgaW50IHYxX3NpemU7CiAgICBpbnQgdjRfc2l6ZTsKICAgIENpbmVwYWtNb2RlIG1vZGU7Cn0gc3RyaXBfaW5mbzsKCnR5cGVkZWYgc3RydWN0IHsKICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOwogICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4OwogICAgdW5zaWduZWQgY2hhciAqcGljdF9idWZzWzRdLCAqc3RyaXBfYnVmLCAqZnJhbWVfYnVmOwogICAgQVZGcmFtZSAqbGFzdF9mcmFtZTsKICAgIEFWRnJhbWUgKmJlc3RfZnJhbWU7CiAgICBBVkZyYW1lICpzY3JhdGNoX2ZyYW1lOwogICAgQVZGcmFtZSAqaW5wdXRfZnJhbWU7CiAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4X2ZtdDsKICAgIGludCB3LCBoOwogICAgaW50IGZyYW1lX2J1Zl9zaXplOwogICAgaW50IGN1cmZyYW1lLCBrZXlpbnQ7CiAgICBBVkxGRyByYW5kY3R4OwogICAgdWludDY0X3QgbGFtYmRhOwogICAgaW50ICpjb2RlYm9va19pbnB1dDsKICAgIGludCAqY29kZWJvb2tfY2xvc2VzdDsKICAgIG1iX2luZm8gKm1iOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9NQiBSRCBzdGF0ZQogICAgaW50IG1pbl9zdHJpcHM7ICAgICAgICAgIC8vdGhlIGN1cnJlbnQgbGltaXQKICAgIGludCBtYXhfc3RyaXBzOyAgICAgICAgICAvL3RoZSBjdXJyZW50IGxpbWl0CiNpZmRlZiBDSU5FUEFLRU5DX0RFQlVHCiAgICBtYl9pbmZvICpiZXN0X21iOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vVE9ETzogcmVtb3ZlLiBvbmx5IHVzZWQgZm9yIHByaW50aW5nIHN0YXRzCiAgICBpbnQgbnVtX3YxX21vZGUsIG51bV92NF9tb2RlLCBudW1fbWNfbW9kZTsKICAgIGludCBudW1fdjFfZW5jcywgbnVtX3Y0X2VuY3MsIG51bV9za2lwczsKI2VuZGlmCi8vIG9wdGlvbnMKICAgIGludCBtYXhfZXh0cmFfY2JfaXRlcmF0aW9uczsKICAgIGludCBza2lwX2VtcHR5X2NiOwogICAgaW50IG1pbl9taW5fc3RyaXBzOwogICAgaW50IG1heF9tYXhfc3RyaXBzOwogICAgaW50IHN0cmlwX251bWJlcl9kZWx0YV9yYW5nZTsKfSBDaW5lcGFrRW5jQ29udGV4dDsKCiNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKENpbmVwYWtFbmNDb250ZXh0LCB4KQojZGVmaW5lIFZFIEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNIHwgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU0Kc3RhdGljIGNvbnN0IEFWT3B0aW9uIG9wdGlvbnNbXSA9IHsKICAgIHsgIm1heF9leHRyYV9jYl9pdGVyYXRpb25zIiwgIk1heCBleHRyYSBjb2RlYm9vayByZWNhbGN1bGF0aW9uIHBhc3NlcywgbW9yZSBpcyBiZXR0ZXIgYW5kIHNsb3dlciIsIE9GRlNFVChtYXhfZXh0cmFfY2JfaXRlcmF0aW9ucyksIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gMiB9LCAwLCBJTlRfTUFYLCBWRSB9LAogICAgeyAic2tpcF9lbXB0eV9jYiIsICJBdm9pZCB3YXN0aW5nIGJ5dGVzLCBpZ25vcmUgdmludGFnZSBNYWNPUyBkZWNvZGVyIiwgT0ZGU0VUKHNraXBfZW1wdHlfY2IpLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IDAgfSwgMCwgMSwgVkUgfSwKICAgIHsgIm1heF9zdHJpcHMiLCAiTGltaXQgc3RyaXBzL2ZyYW1lLCB2aW50YWdlIGNvbXBhdGlibGUgaXMgMS4uMywgb3RoZXJ3aXNlIHRoZSBtb3JlIHRoZSBiZXR0ZXIiLCBPRkZTRVQobWF4X21heF9zdHJpcHMpLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IDMgfSwgTUlOX1NUUklQUywgTUFYX1NUUklQUywgVkUgfSwKICAgIHsgIm1pbl9zdHJpcHMiLCAiRW5mb3JjZSBtaW4gc3RyaXBzL2ZyYW1lLCBtb3JlIGlzIHdvcnNlIGFuZCBmYXN0ZXIsIG11c3QgYmUgPD0gbWF4X3N0cmlwcyIsIE9GRlNFVChtaW5fbWluX3N0cmlwcyksIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gTUlOX1NUUklQUyB9LCBNSU5fU1RSSVBTLCBNQVhfU1RSSVBTLCBWRSB9LAogICAgeyAic3RyaXBfbnVtYmVyX2FkYXB0aXZpdHkiLCAiSG93IGZhc3QgdGhlIHN0cmlwIG51bWJlciBhZGFwdHMsIG1vcmUgaXMgc2xpZ2h0bHkgYmV0dGVyLCBtdWNoIHNsb3dlciIsIE9GRlNFVChzdHJpcF9udW1iZXJfZGVsdGFfcmFuZ2UpLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IDAgfSwgMCwgTUFYX1NUUklQUy1NSU5fU1RSSVBTLCBWRSB9LAogICAgeyBOVUxMIH0sCn07CgpzdGF0aWMgY29uc3QgQVZDbGFzcyBjaW5lcGFrX2NsYXNzID0gewogICAgLmNsYXNzX25hbWUgPSAiY2luZXBhayIsCiAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAogICAgLm9wdGlvbiAgICAgPSBvcHRpb25zLAogICAgLnZlcnNpb24gICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCn07CgpzdGF0aWMgYXZfY29sZCBpbnQgY2luZXBha19lbmNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCnsKICAgIENpbmVwYWtFbmNDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKICAgIGludCB4LCBtYl9jb3VudCwgc3RyaXBfYnVmX3NpemUsIGZyYW1lX2J1Zl9zaXplOwoKICAgIGlmIChhdmN0eC0+d2lkdGggJiAzIHx8IGF2Y3R4LT5oZWlnaHQgJiAzKSB7CiAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJ3aWR0aCBhbmQgaGVpZ2h0IG11c3QgYmUgbXVsdGlwbGVzIG9mIGZvdXIgKGdvdCAlaXglaSlcbiIsCiAgICAgICAgICAgICAgICBhdmN0eC0+d2lkdGgsIGF2Y3R4LT5oZWlnaHQpOwogICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CiAgICB9CgogICAgaWYgKHMtPm1pbl9taW5fc3RyaXBzID4gcy0+bWF4X21heF9zdHJpcHMpIHsKICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIm1pbmltYWwgbnVtYmVyIG9mIHN0cmlwcyBjYW4gbm90IGV4Y2VlZCBtYXhpbWFsIChnb3QgJWkgYW5kICVpKVxuIiwKICAgICAgICAgICAgICAgIHMtPm1pbl9taW5fc3RyaXBzLCBzLT5tYXhfbWF4X3N0cmlwcyk7CiAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKICAgIH0KCiAgICBpZiAoIShzLT5sYXN0X2ZyYW1lID0gYXZfZnJhbWVfYWxsb2MoKSkpCiAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKICAgIGlmICghKHMtPmJlc3RfZnJhbWUgPSBhdl9mcmFtZV9hbGxvYygpKSkKICAgICAgICBnb3RvIGVub21lbTsKICAgIGlmICghKHMtPnNjcmF0Y2hfZnJhbWUgPSBhdl9mcmFtZV9hbGxvYygpKSkKICAgICAgICBnb3RvIGVub21lbTsKICAgIGlmIChhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1JHQjI0KQogICAgICAgIGlmICghKHMtPmlucHV0X2ZyYW1lID0gYXZfZnJhbWVfYWxsb2MoKSkpCiAgICAgICAgICAgIGdvdG8gZW5vbWVtOwoKICAgIGlmICghKHMtPmNvZGVib29rX2lucHV0ID0gYXZfbWFsbG9jKHNpemVvZihpbnQpICogKGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfUkdCMjQgPyA2IDogNCkgKiAoYXZjdHgtPndpZHRoICogYXZjdHgtPmhlaWdodCkgPj4gMikpKQogICAgICAgIGdvdG8gZW5vbWVtOwoKICAgIGlmICghKHMtPmNvZGVib29rX2Nsb3Nlc3QgPSBhdl9tYWxsb2Moc2l6ZW9mKGludCkgKiAoYXZjdHgtPndpZHRoICogYXZjdHgtPmhlaWdodCkgPj4gMikpKQogICAgICAgIGdvdG8gZW5vbWVtOwoKICAgIGZvcih4ID0gMDsgeCA8IChhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1JHQjI0ID8gNCA6IDMpOyB4KyspCiAgICAgICAgaWYoIShzLT5waWN0X2J1ZnNbeF0gPSBhdl9tYWxsb2MoKGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfUkdCMjQgPyA2IDogNCkgKiAoYXZjdHgtPndpZHRoICogYXZjdHgtPmhlaWdodCkgPj4gMikpKQogICAgICAgICAgICBnb3RvIGVub21lbTsKCiAgICBtYl9jb3VudCA9IGF2Y3R4LT53aWR0aCAqIGF2Y3R4LT5oZWlnaHQgLyBNQl9BUkVBOwoKICAgIC8vdGhlIGxhcmdlc3QgcG9zc2libGUgY2h1bmsgaXMgMHgzMSB3aXRoIGFsbCBNQnMgZW5jb2RlZCBpbiBWNCBtb2RlCiAgICAvL2FuZCBmdWxsIGNvZGVib29rcyBiZWluZyByZXBsYWNlZCBpbiBJTlRFUiBtb2RlLAogICAgLy8gd2hpY2ggaXMgMzQgYml0cyBwZXIgTUIKICAgIC8vYW5kIDIqMjU2IGV4dHJhIGZsYWcgYml0cyBwZXIgc3RyaXAKICAgIHN0cmlwX2J1Zl9zaXplID0gU1RSSVBfSEVBREVSX1NJWkUgKyAzICogQ0hVTktfSEVBREVSX1NJWkUgKyAyICogVkVDVE9SX01BWCAqIENPREVCT09LX01BWCArIDQgKiAobWJfY291bnQgKyAobWJfY291bnQgKyAxNSkgLyAxNikgKyAoMiAqIENPREVCT09LX01BWCkvODsKCiAgICBmcmFtZV9idWZfc2l6ZSA9IENWSURfSEVBREVSX1NJWkUgKyBzLT5tYXhfbWF4X3N0cmlwcyAqIHN0cmlwX2J1Zl9zaXplOwoKICAgIGlmICghKHMtPnN0cmlwX2J1ZiA9IGF2X21hbGxvYyhzdHJpcF9idWZfc2l6ZSkpKQogICAgICAgIGdvdG8gZW5vbWVtOwoKICAgIGlmICghKHMtPmZyYW1lX2J1ZiA9IGF2X21hbGxvYyhmcmFtZV9idWZfc2l6ZSkpKQogICAgICAgIGdvdG8gZW5vbWVtOwoKICAgIGlmICghKHMtPm1iID0gYXZfbWFsbG9jKG1iX2NvdW50KnNpemVvZihtYl9pbmZvKSkpKQogICAgICAgIGdvdG8gZW5vbWVtOwoKI2lmZGVmIENJTkVQQUtFTkNfREVCVUcKICAgIGlmICghKHMtPmJlc3RfbWIgPSBhdl9tYWxsb2MobWJfY291bnQqc2l6ZW9mKG1iX2luZm8pKSkpCiAgICAgICAgZ290byBlbm9tZW07CiNlbmRpZgoKICAgIGF2X2xmZ19pbml0KCZzLT5yYW5kY3R4LCAxKTsKICAgIHMtPmF2Y3R4ID0gYXZjdHg7CiAgICBzLT53ID0gYXZjdHgtPndpZHRoOwogICAgcy0+aCA9IGF2Y3R4LT5oZWlnaHQ7CiAgICBzLT5mcmFtZV9idWZfc2l6ZSA9IGZyYW1lX2J1Zl9zaXplOwogICAgcy0+Y3VyZnJhbWUgPSAwOwogICAgcy0+a2V5aW50ID0gYXZjdHgtPmtleWludF9taW47CiAgICBzLT5waXhfZm10ID0gYXZjdHgtPnBpeF9mbXQ7CgogICAgLy9zZXQgdXAgQVZGcmFtZXMKICAgIHMtPmxhc3RfZnJhbWUtPmRhdGFbMF0gICAgICAgID0gcy0+cGljdF9idWZzWzBdOwogICAgcy0+bGFzdF9mcmFtZS0+bGluZXNpemVbMF0gICAgPSBzLT53OwogICAgcy0+YmVzdF9mcmFtZS0+ZGF0YVswXSAgICAgICAgPSBzLT5waWN0X2J1ZnNbMV07CiAgICBzLT5iZXN0X2ZyYW1lLT5saW5lc2l6ZVswXSAgICA9IHMtPnc7CiAgICBzLT5zY3JhdGNoX2ZyYW1lLT5kYXRhWzBdICAgICA9IHMtPnBpY3RfYnVmc1syXTsKICAgIHMtPnNjcmF0Y2hfZnJhbWUtPmxpbmVzaXplWzBdID0gcy0+dzsKCiAgICBpZiAocy0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1JHQjI0KSB7CiAgICAgICAgcy0+bGFzdF9mcmFtZS0+ZGF0YVsxXSAgICAgICAgPSBzLT5sYXN0X2ZyYW1lLT5kYXRhWzBdICsgcy0+dyAqIHMtPmg7CiAgICAgICAgcy0+bGFzdF9mcmFtZS0+ZGF0YVsyXSAgICAgICAgPSBzLT5sYXN0X2ZyYW1lLT5kYXRhWzFdICsgKChzLT53ICogcy0+aCkgPj4gMik7CiAgICAgICAgcy0+bGFzdF9mcmFtZS0+bGluZXNpemVbMV0gICAgPSBzLT5sYXN0X2ZyYW1lLT5saW5lc2l6ZVsyXSA9IHMtPncgPj4gMTsKCiAgICAgICAgcy0+YmVzdF9mcmFtZS0+ZGF0YVsxXSAgICAgICAgPSBzLT5iZXN0X2ZyYW1lLT5kYXRhWzBdICsgcy0+dyAqIHMtPmg7CiAgICAgICAgcy0+YmVzdF9mcmFtZS0+ZGF0YVsyXSAgICAgICAgPSBzLT5iZXN0X2ZyYW1lLT5kYXRhWzFdICsgKChzLT53ICogcy0+aCkgPj4gMik7CiAgICAgICAgcy0+YmVzdF9mcmFtZS0+bGluZXNpemVbMV0gICAgPSBzLT5iZXN0X2ZyYW1lLT5saW5lc2l6ZVsyXSA9IHMtPncgPj4gMTsKCiAgICAgICAgcy0+c2NyYXRjaF9mcmFtZS0+ZGF0YVsxXSAgICAgPSBzLT5zY3JhdGNoX2ZyYW1lLT5kYXRhWzBdICsgcy0+dyAqIHMtPmg7CiAgICAgICAgcy0+c2NyYXRjaF9mcmFtZS0+ZGF0YVsyXSAgICAgPSBzLT5zY3JhdGNoX2ZyYW1lLT5kYXRhWzFdICsgKChzLT53ICogcy0+aCkgPj4gMik7CiAgICAgICAgcy0+c2NyYXRjaF9mcmFtZS0+bGluZXNpemVbMV0gPSBzLT5zY3JhdGNoX2ZyYW1lLT5saW5lc2l6ZVsyXSA9IHMtPncgPj4gMTsKCiAgICAgICAgcy0+aW5wdXRfZnJhbWUtPmRhdGFbMF0gICAgICAgPSBzLT5waWN0X2J1ZnNbM107CiAgICAgICAgcy0+aW5wdXRfZnJhbWUtPmxpbmVzaXplWzBdICAgPSBzLT53OwogICAgICAgIHMtPmlucHV0X2ZyYW1lLT5kYXRhWzFdICAgICAgID0gcy0+aW5wdXRfZnJhbWUtPmRhdGFbMF0gKyBzLT53ICogcy0+aDsKICAgICAgICBzLT5pbnB1dF9mcmFtZS0+ZGF0YVsyXSAgICAgICA9IHMtPmlucHV0X2ZyYW1lLT5kYXRhWzFdICsgKChzLT53ICogcy0+aCkgPj4gMik7CiAgICAgICAgcy0+aW5wdXRfZnJhbWUtPmxpbmVzaXplWzFdICAgPSBzLT5pbnB1dF9mcmFtZS0+bGluZXNpemVbMl0gPSBzLT53ID4+IDE7CiAgICB9CgogICAgcy0+bWluX3N0cmlwcyA9IHMtPm1pbl9taW5fc3RyaXBzOwogICAgcy0+bWF4X3N0cmlwcyA9IHMtPm1heF9tYXhfc3RyaXBzOwoKI2lmZGVmIENJTkVQQUtFTkNfREVCVUcKICAgIHMtPm51bV92MV9tb2RlID0gcy0+bnVtX3Y0X21vZGUgPSBzLT5udW1fbWNfbW9kZSA9IHMtPm51bV92MV9lbmNzID0gcy0+bnVtX3Y0X2VuY3MgPSBzLT5udW1fc2tpcHMgPSAwOwojZW5kaWYKCiAgICByZXR1cm4gMDsKCmVub21lbToKICAgIGF2X2ZyYW1lX2ZyZWUoJnMtPmxhc3RfZnJhbWUpOwogICAgYXZfZnJhbWVfZnJlZSgmcy0+YmVzdF9mcmFtZSk7CiAgICBhdl9mcmFtZV9mcmVlKCZzLT5zY3JhdGNoX2ZyYW1lKTsKICAgIGlmIChhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1JHQjI0KQogICAgICAgIGF2X2ZyYW1lX2ZyZWUoJnMtPmlucHV0X2ZyYW1lKTsKICAgIGF2X2ZyZWVwKCZzLT5jb2RlYm9va19pbnB1dCk7CiAgICBhdl9mcmVlcCgmcy0+Y29kZWJvb2tfY2xvc2VzdCk7CiAgICBhdl9mcmVlcCgmcy0+c3RyaXBfYnVmKTsKICAgIGF2X2ZyZWVwKCZzLT5mcmFtZV9idWYpOwogICAgYXZfZnJlZXAoJnMtPm1iKTsKI2lmZGVmIENJTkVQQUtFTkNfREVCVUcKICAgIGF2X2ZyZWVwKCZzLT5iZXN0X21iKTsKI2VuZGlmCgogICAgZm9yKHggPSAwOyB4IDwgKGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfUkdCMjQgPyA0IDogMyk7IHgrKykKICAgICAgICBhdl9mcmVlcCgmcy0+cGljdF9idWZzW3hdKTsKCiAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwp9CgpzdGF0aWMgaW50NjRfdCBjYWxjdWxhdGVfbW9kZV9zY29yZShDaW5lcGFrRW5jQ29udGV4dCAqcywgaW50IGgsIHN0cmlwX2luZm8gKmluZm8sIGludCByZXBvcnQsIGludCAqdHJhaW5pbmdfc2V0X3YxX3NocnVuaywgaW50ICp0cmFpbmluZ19zZXRfdjRfc2hydW5rCiNpZmRlZiBDSU5FUEFLX1JFUE9SVF9TRVJSCiwgaW50NjRfdCAqc2VycgojZW5kaWYKKQp7CiAgICAvL3Njb3JlID0gRkZfTEFNQkRBX1NDQUxFICogZXJyb3IgKyBsYW1iZGEgKiBiaXRzCiAgICBpbnQgeDsKICAgIGludCBlbnRyeV9zaXplID0gcy0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1JHQjI0ID8gNiA6IDQ7CiAgICBpbnQgbWJfY291bnQgPSBzLT53ICogaCAvIE1CX0FSRUE7CiAgICBtYl9pbmZvICptYjsKICAgIGludDY0X3Qgc2NvcmUxLCBzY29yZTIsIHNjb3JlMzsKICAgIGludDY0X3QgcmV0ID0gcy0+bGFtYmRhICogKChpbmZvLT52MV9zaXplID8gQ0hVTktfSEVBREVSX1NJWkUgKyBpbmZvLT52MV9zaXplICogZW50cnlfc2l6ZSA6IDApICsKICAgICAgICAgICAgICAgICAgIChpbmZvLT52NF9zaXplID8gQ0hVTktfSEVBREVSX1NJWkUgKyBpbmZvLT52NF9zaXplICogZW50cnlfc2l6ZSA6IDApICsKICAgICAgICAgICAgICAgICAgIENIVU5LX0hFQURFUl9TSVpFKSA8PCAzOwoKICAgIC8vYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfSU5GTywgInNpemVzICUzaSAlM2kgLT4gJTlsbGkgc2NvcmUgbWJfY291bnQgJWkiLCBpbmZvLT52MV9zaXplLCBpbmZvLT52NF9zaXplLCAobG9uZyBsb25nIGludClyZXQsIG1iX2NvdW50KTsKCiNpZmRlZiBDSU5FUEFLX1JFUE9SVF9TRVJSCiAgICAqc2VyciA9IDA7CiNlbmRpZgoKICAgIHN3aXRjaChpbmZvLT5tb2RlKSB7CiAgICBjYXNlIE1PREVfVjFfT05MWToKICAgICAgICAvL29uZSBieXRlIHBlciBNQgogICAgICAgIHJldCArPSBzLT5sYW1iZGEgKiA4ICogbWJfY291bnQ7CgovLyB3aGlsZSBjYWxjdWxhdGluZyB3ZSBhc3N1bWUgYWxsIGJsb2NrcyBhcmUgRU5DX1YxCiAgICAgICAgZm9yKHggPSAwOyB4IDwgbWJfY291bnQ7IHgrKykgewogICAgICAgICAgICBtYiA9ICZzLT5tYlt4XTsKICAgICAgICAgICAgcmV0ICs9IEZGX0xBTUJEQV9TQ0FMRSAqIG1iLT52MV9lcnJvcjsKI2lmZGVmIENJTkVQQUtfUkVQT1JUX1NFUlIKICAgICAgICAgICAgKnNlcnIgKz0gbWItPnYxX2Vycm9yOwojZW5kaWYKLy8gdGhpcyBmdW5jdGlvbiBpcyBuZXZlciBjYWxsZWQgZm9yIHJlcG9ydCBpbiBNT0RFX1YxX09OTFkKLy8gICAgICAgICAgICBpZighcmVwb3J0KQogICAgICAgICAgICBtYi0+YmVzdF9lbmNvZGluZyA9IEVOQ19WMTsKICAgICAgICB9CgogICAgICAgIGJyZWFrOwogICAgY2FzZSBNT0RFX1YxX1Y0OgogICAgICAgIC8vOSBvciAzMyBiaXRzIHBlciBNQgogICAgICAgIGlmKHJlcG9ydCkgewovLyBubyBtb3ZlcyBiZXR3ZWVuIHRoZSBjb3JyZXNwb25kaW5nIHRyYWluaW5nIHNldHMgYXJlIGFsbG93ZWQKICAgICAgICAgICAgKnRyYWluaW5nX3NldF92MV9zaHJ1bmsgPSAqdHJhaW5pbmdfc2V0X3Y0X3NocnVuayA9IDA7CiAgICAgICAgICAgIGZvcih4ID0gMDsgeCA8IG1iX2NvdW50OyB4KyspIHsKICAgICAgICAgICAgICAgIGludCBtYmVycjsKICAgICAgICAgICAgICAgIG1iID0gJnMtPm1iW3hdOwogICAgICAgICAgICAgICAgaWYobWItPmJlc3RfZW5jb2RpbmcgPT0gRU5DX1YxKQogICAgICAgICAgICAgICAgICAgIHNjb3JlMSA9IHMtPmxhbWJkYSAqIDkgICsgRkZfTEFNQkRBX1NDQUxFICogKG1iZXJyPW1iLT52MV9lcnJvcik7CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgc2NvcmUxID0gcy0+bGFtYmRhICogMzMgKyBGRl9MQU1CREFfU0NBTEUgKiAobWJlcnI9bWItPnY0X2Vycm9yKTsKICAgICAgICAgICAgICAgIHJldCArPSBzY29yZTE7CiNpZmRlZiBDSU5FUEFLX1JFUE9SVF9TRVJSCiAgICAgICAgICAgICAgICAqc2VyciArPSBtYmVycjsKI2VuZGlmCiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgeyAvLyBmaW5kIGJlc3QgbW9kZSBwZXIgYmxvY2sKICAgICAgICAgICAgZm9yKHggPSAwOyB4IDwgbWJfY291bnQ7IHgrKykgewogICAgICAgICAgICAgICAgbWIgPSAmcy0+bWJbeF07CiAgICAgICAgICAgICAgICBzY29yZTEgPSBzLT5sYW1iZGEgKiA5ICArIEZGX0xBTUJEQV9TQ0FMRSAqIG1iLT52MV9lcnJvcjsKICAgICAgICAgICAgICAgIHNjb3JlMiA9IHMtPmxhbWJkYSAqIDMzICsgRkZfTEFNQkRBX1NDQUxFICogbWItPnY0X2Vycm9yOwoKICAgICAgICAgICAgICAgIGlmKHNjb3JlMSA8PSBzY29yZTIpIHsKICAgICAgICAgICAgICAgICAgICByZXQgKz0gc2NvcmUxOwojaWZkZWYgQ0lORVBBS19SRVBPUlRfU0VSUgogICAgICAgICAgICAgICAgICAgICpzZXJyICs9IG1iLT52MV9lcnJvcjsKI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgbWItPmJlc3RfZW5jb2RpbmcgPSBFTkNfVjE7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHJldCArPSBzY29yZTI7CiNpZmRlZiBDSU5FUEFLX1JFUE9SVF9TRVJSCiAgICAgICAgICAgICAgICAgICAgKnNlcnIgKz0gbWItPnY0X2Vycm9yOwojZW5kaWYKICAgICAgICAgICAgICAgICAgICBtYi0+YmVzdF9lbmNvZGluZyA9IEVOQ19WNDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgYnJlYWs7CiAgICBjYXNlIE1PREVfTUM6CiAgICAgICAgLy8xLCAxMCBvciAzNCBiaXRzIHBlciBNQgogICAgICAgIGlmKHJlcG9ydCkgewogICAgICAgICAgICBpbnQgdjFfc2hydW5rID0gMCwgdjRfc2hydW5rID0gMDsKICAgICAgICAgICAgZm9yKHggPSAwOyB4IDwgbWJfY291bnQ7IHgrKykgewogICAgICAgICAgICAgICAgbWIgPSAmcy0+bWJbeF07Ci8vIGl0IGlzIE9LIHRvIG1vdmUgYmxvY2tzIHRvIEVOQ19TS0lQIGhlcmUKLy8gYnV0IG5vdCB0byBhbnkgY29kZWJvb2sgZW5jb2RpbmchCiAgICAgICAgICAgICAgICBzY29yZTEgPSBzLT5sYW1iZGEgKiAxICArIEZGX0xBTUJEQV9TQ0FMRSAqIG1iLT5za2lwX2Vycm9yOwogICAgICAgICAgICAgICAgaWYobWItPmJlc3RfZW5jb2RpbmcgPT0gRU5DX1NLSVApIHsKICAgICAgICAgICAgICAgICAgICByZXQgKz0gc2NvcmUxOwojaWZkZWYgQ0lORVBBS19SRVBPUlRfU0VSUgogICAgICAgICAgICAgICAgICAgICpzZXJyICs9IG1iLT5za2lwX2Vycm9yOwojZW5kaWYKICAgICAgICAgICAgICAgIH0gZWxzZSBpZihtYi0+YmVzdF9lbmNvZGluZyA9PSBFTkNfVjEpIHsKICAgICAgICAgICAgICAgICAgICBpZigoc2NvcmUyPXMtPmxhbWJkYSAqIDEwICsgRkZfTEFNQkRBX1NDQUxFICogbWItPnYxX2Vycm9yKSA+PSBzY29yZTEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWItPmJlc3RfZW5jb2RpbmcgPSBFTkNfU0tJUDsKICAgICAgICAgICAgICAgICAgICAgICAgKyt2MV9zaHJ1bms7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldCArPSBzY29yZTE7CiNpZmRlZiBDSU5FUEFLX1JFUE9SVF9TRVJSCiAgICAgICAgICAgICAgICAgICAgICAgICpzZXJyICs9IG1iLT5za2lwX2Vycm9yOwojZW5kaWYKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICByZXQgKz0gc2NvcmUyOwojaWZkZWYgQ0lORVBBS19SRVBPUlRfU0VSUgogICAgICAgICAgICAgICAgICAgICAgICAqc2VyciArPSBtYi0+djFfZXJyb3I7CiNlbmRpZgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgaWYoKHNjb3JlMz1zLT5sYW1iZGEgKiAzNCArIEZGX0xBTUJEQV9TQ0FMRSAqIG1iLT52NF9lcnJvcikgPj0gc2NvcmUxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1iLT5iZXN0X2VuY29kaW5nID0gRU5DX1NLSVA7CiAgICAgICAgICAgICAgICAgICAgICAgICsrdjRfc2hydW5rOwogICAgICAgICAgICAgICAgICAgICAgICByZXQgKz0gc2NvcmUxOwojaWZkZWYgQ0lORVBBS19SRVBPUlRfU0VSUgogICAgICAgICAgICAgICAgICAgICAgICAqc2VyciArPSBtYi0+c2tpcF9lcnJvcjsKI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0ICs9IHNjb3JlMzsKI2lmZGVmIENJTkVQQUtfUkVQT1JUX1NFUlIKICAgICAgICAgICAgICAgICAgICAgICAgKnNlcnIgKz0gbWItPnY0X2Vycm9yOwojZW5kaWYKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgKnRyYWluaW5nX3NldF92MV9zaHJ1bmsgPSB2MV9zaHJ1bms7CiAgICAgICAgICAgICp0cmFpbmluZ19zZXRfdjRfc2hydW5rID0gdjRfc2hydW5rOwogICAgICAgIH0gZWxzZSB7IC8vIGZpbmQgYmVzdCBtb2RlIHBlciBibG9jawogICAgICAgICAgICBmb3IoeCA9IDA7IHggPCBtYl9jb3VudDsgeCsrKSB7CiAgICAgICAgICAgICAgICBtYiA9ICZzLT5tYlt4XTsKICAgICAgICAgICAgICAgIHNjb3JlMSA9IHMtPmxhbWJkYSAqIDEgICsgRkZfTEFNQkRBX1NDQUxFICogbWItPnNraXBfZXJyb3I7CiAgICAgICAgICAgICAgICBzY29yZTIgPSBzLT5sYW1iZGEgKiAxMCArIEZGX0xBTUJEQV9TQ0FMRSAqIG1iLT52MV9lcnJvcjsKICAgICAgICAgICAgICAgIHNjb3JlMyA9IHMtPmxhbWJkYSAqIDM0ICsgRkZfTEFNQkRBX1NDQUxFICogbWItPnY0X2Vycm9yOwoKICAgICAgICAgICAgICAgIGlmKHNjb3JlMSA8PSBzY29yZTIgJiYgc2NvcmUxIDw9IHNjb3JlMykgewogICAgICAgICAgICAgICAgICAgIHJldCArPSBzY29yZTE7CiNpZmRlZiBDSU5FUEFLX1JFUE9SVF9TRVJSCiAgICAgICAgICAgICAgICAgICAgKnNlcnIgKz0gbWItPnNraXBfZXJyb3I7CiNlbmRpZgogICAgICAgICAgICAgICAgICAgIG1iLT5iZXN0X2VuY29kaW5nID0gRU5DX1NLSVA7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYoc2NvcmUyIDw9IHNjb3JlMykgewogICAgICAgICAgICAgICAgICAgIHJldCArPSBzY29yZTI7CiNpZmRlZiBDSU5FUEFLX1JFUE9SVF9TRVJSCiAgICAgICAgICAgICAgICAgICAgKnNlcnIgKz0gbWItPnYxX2Vycm9yOwojZW5kaWYKICAgICAgICAgICAgICAgICAgICBtYi0+YmVzdF9lbmNvZGluZyA9IEVOQ19WMTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgcmV0ICs9IHNjb3JlMzsKI2lmZGVmIENJTkVQQUtfUkVQT1JUX1NFUlIKICAgICAgICAgICAgICAgICAgICAqc2VyciArPSBtYi0+djRfZXJyb3I7CiNlbmRpZgogICAgICAgICAgICAgICAgICAgIG1iLT5iZXN0X2VuY29kaW5nID0gRU5DX1Y0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBicmVhazsKICAgIH0KCiAgICByZXR1cm4gcmV0Owp9CgpzdGF0aWMgaW50IHdyaXRlX2NodW5rX2hlYWRlcih1bnNpZ25lZCBjaGFyICpidWYsIGludCBjaHVua190eXBlLCBpbnQgY2h1bmtfc2l6ZSkKewogICAgYnVmWzBdID0gY2h1bmtfdHlwZTsKICAgIEFWX1dCMjQoJmJ1ZlsxXSwgY2h1bmtfc2l6ZSArIENIVU5LX0hFQURFUl9TSVpFKTsKICAgIHJldHVybiBDSFVOS19IRUFERVJfU0laRTsKfQoKc3RhdGljIGludCBlbmNvZGVfY29kZWJvb2soQ2luZXBha0VuY0NvbnRleHQgKnMsIGludCAqY29kZWJvb2ssIGludCBzaXplLCBpbnQgY2h1bmtfdHlwZV95dXYsIGludCBjaHVua190eXBlX2dyYXksIHVuc2lnbmVkIGNoYXIgKmJ1ZikKewogICAgaW50IHgsIHksIHJldCwgZW50cnlfc2l6ZSA9IHMtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9SR0IyNCA/IDYgOiA0OwogICAgaW50IGluY3JlbWVudGFsX2NvZGVib29rX3JlcGxhY2VtZW50X21vZGUgPSAwOyAvLyBoYXJkY29kZWQgaGVyZSwKICAgICAgICAgICAgICAgIC8vIHRoZSBjb21waWxlciBzaG91bGQgbm90aWNlIHRoYXQgdGhpcyBpcyBhIGNvbnN0YW50IC0tIHJsCgogICAgcmV0ID0gd3JpdGVfY2h1bmtfaGVhZGVyKGJ1ZiwKICAgICAgICAgIHMtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9SR0IyNCA/CiAgICAgICAgICAgY2h1bmtfdHlwZV95dXYrKGluY3JlbWVudGFsX2NvZGVib29rX3JlcGxhY2VtZW50X21vZGU/MTowKSA6CiAgICAgICAgICAgY2h1bmtfdHlwZV9ncmF5KyhpbmNyZW1lbnRhbF9jb2RlYm9va19yZXBsYWNlbWVudF9tb2RlPzE6MCksCiAgICAgICAgICBlbnRyeV9zaXplICogc2l6ZQogICAgICAgICAgICsgKGluY3JlbWVudGFsX2NvZGVib29rX3JlcGxhY2VtZW50X21vZGU/KHNpemUrMzEpLzMyKjQ6MCkgKTsKCi8vIHdlIGRvIGNvZGVib29rIGVuY29kaW5nIGFjY29yZGluZyB0byB0aGUgImludHJhIiBtb2RlCi8vIGJ1dCB3ZSBrZWVwIHRoZSAiZGVhZCIgY29kZSBmb3IgcmVmZXJlbmNlIGluIGNhc2Ugd2Ugd2lsbCB3YW50Ci8vIHRvIHVzZSBpbmNyZW1lbnRhbCBjb2RlYm9vayB1cGRhdGVzICh3aGljaCBhY3R1YWxseSB3b3VsZCBnaXZlIHVzCi8vICJraW5kIG9mIiBtb3Rpb24gY29tcGVuc2F0aW9uLCBlc3BlY2lhbGx5IGluIDEgc3RyaXAvZnJhbWUgY2FzZSkgLS0gcmwKLy8gKG9mIGNvdXJzZSwgdGhlIGNvZGUgd2lsbCBiZSBub3QgdXNlZnVsIGFzLWlzKQogICAgaWYoaW5jcmVtZW50YWxfY29kZWJvb2tfcmVwbGFjZW1lbnRfbW9kZSkgewogICAgICAgIGludCBmbGFncyA9IDA7CiAgICAgICAgaW50IGZsYWdzaW5kOwogICAgICAgIGZvcih4ID0gMDsgeCA8IHNpemU7IHgrKykgewogICAgICAgICAgICBpZihmbGFncyA9PSAwKSB7CiAgICAgICAgICAgICAgICBmbGFnc2luZCA9IHJldDsKICAgICAgICAgICAgICAgIHJldCArPSA0OwogICAgICAgICAgICAgICAgZmxhZ3MgPSAweDgwMDAwMDAwOwogICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgIGZsYWdzID0gKChmbGFncz4+MSkgfCAweDgwMDAwMDAwKTsKICAgICAgICAgICAgZm9yKHkgPSAwOyB5IDwgZW50cnlfc2l6ZTsgeSsrKQogICAgICAgICAgICAgICAgYnVmW3JldCsrXSA9IGNvZGVib29rW3kgKyB4KmVudHJ5X3NpemVdIF4gKHkgPj0gNCA/IDB4ODAgOiAwKTsKICAgICAgICAgICAgaWYoKGZsYWdzJjB4ZmZmZmZmZmYpID09IDB4ZmZmZmZmZmYpIHsKICAgICAgICAgICAgICAgIEFWX1dCMzIoJmJ1ZltmbGFnc2luZF0sIGZsYWdzKTsKICAgICAgICAgICAgICAgIGZsYWdzID0gMDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZihmbGFncykKICAgICAgICAgICAgQVZfV0IzMigmYnVmW2ZsYWdzaW5kXSwgZmxhZ3MpOwogICAgfSBlbHNlCiAgICAgICAgZm9yKHggPSAwOyB4IDwgc2l6ZTsgeCsrKQogICAgICAgICAgICBmb3IoeSA9IDA7IHkgPCBlbnRyeV9zaXplOyB5KyspCiAgICAgICAgICAgICAgICBidWZbcmV0KytdID0gY29kZWJvb2tbeSArIHgqZW50cnlfc2l6ZV0gXiAoeSA+PSA0ID8gMHg4MCA6IDApOwoKICAgIHJldHVybiByZXQ7Cn0KCi8vc2V0cyBvdXQgdG8gdGhlIHN1YiBwaWN0dXJlIHN0YXJ0aW5nIGF0ICh4LHkpIGluIGluCnN0YXRpYyB2b2lkIGdldF9zdWJfcGljdHVyZShDaW5lcGFrRW5jQ29udGV4dCAqcywgaW50IHgsIGludCB5LCBBVlBpY3R1cmUgKmluLCBBVlBpY3R1cmUgKm91dCkKewogICAgb3V0LT5kYXRhWzBdID0gaW4tPmRhdGFbMF0gKyB4ICsgeSAqIGluLT5saW5lc2l6ZVswXTsKICAgIG91dC0+bGluZXNpemVbMF0gPSBpbi0+bGluZXNpemVbMF07CgogICAgaWYocy0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1JHQjI0KSB7CiAgICAgICAgb3V0LT5kYXRhWzFdID0gaW4tPmRhdGFbMV0gKyAoeCA+PiAxKSArICh5ID4+IDEpICogaW4tPmxpbmVzaXplWzFdOwogICAgICAgIG91dC0+bGluZXNpemVbMV0gPSBpbi0+bGluZXNpemVbMV07CgogICAgICAgIG91dC0+ZGF0YVsyXSA9IGluLT5kYXRhWzJdICsgKHggPj4gMSkgKyAoeSA+PiAxKSAqIGluLT5saW5lc2l6ZVsyXTsKICAgICAgICBvdXQtPmxpbmVzaXplWzJdID0gaW4tPmxpbmVzaXplWzJdOwogICAgfQp9CgovL2RlY29kZXMgdGhlIFYxIHZlY3RvciBpbiBtYiBpbnRvIHRoZSA0eDQgTUIgcG9pbnRlZCB0byBieSBzdWJfcGljdApzdGF0aWMgdm9pZCBkZWNvZGVfdjFfdmVjdG9yKENpbmVwYWtFbmNDb250ZXh0ICpzLCBBVlBpY3R1cmUgKnN1Yl9waWN0LCBpbnQgdjFfdmVjdG9yLCBzdHJpcF9pbmZvICppbmZvKQp7CiAgICBpbnQgZW50cnlfc2l6ZSA9IHMtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9SR0IyNCA/IDYgOiA0OwoKICAgIHN1Yl9waWN0LT5kYXRhWzBdWzBdID0KICAgICAgICAgICAgc3ViX3BpY3QtPmRhdGFbMF1bMV0gPQogICAgICAgICAgICBzdWJfcGljdC0+ZGF0YVswXVsgICAgc3ViX3BpY3QtPmxpbmVzaXplWzBdXSA9CiAgICAgICAgICAgIHN1Yl9waWN0LT5kYXRhWzBdWzErICBzdWJfcGljdC0+bGluZXNpemVbMF1dID0gaW5mby0+djFfY29kZWJvb2tbdjFfdmVjdG9yKmVudHJ5X3NpemVdOwoKICAgIHN1Yl9waWN0LT5kYXRhWzBdWzJdID0KICAgICAgICAgICAgc3ViX3BpY3QtPmRhdGFbMF1bM10gPQogICAgICAgICAgICBzdWJfcGljdC0+ZGF0YVswXVsyKyAgc3ViX3BpY3QtPmxpbmVzaXplWzBdXSA9CiAgICAgICAgICAgIHN1Yl9waWN0LT5kYXRhWzBdWzMrICBzdWJfcGljdC0+bGluZXNpemVbMF1dID0gaW5mby0+djFfY29kZWJvb2tbdjFfdmVjdG9yKmVudHJ5X3NpemUrMV07CgogICAgc3ViX3BpY3QtPmRhdGFbMF1bMipzdWJfcGljdC0+bGluZXNpemVbMF1dID0KICAgICAgICAgICAgc3ViX3BpY3QtPmRhdGFbMF1bMSsyKnN1Yl9waWN0LT5saW5lc2l6ZVswXV0gPQogICAgICAgICAgICBzdWJfcGljdC0+ZGF0YVswXVsgIDMqc3ViX3BpY3QtPmxpbmVzaXplWzBdXSA9CiAgICAgICAgICAgIHN1Yl9waWN0LT5kYXRhWzBdWzErMypzdWJfcGljdC0+bGluZXNpemVbMF1dID0gaW5mby0+djFfY29kZWJvb2tbdjFfdmVjdG9yKmVudHJ5X3NpemUrMl07CgogICAgc3ViX3BpY3QtPmRhdGFbMF1bMisyKnN1Yl9waWN0LT5saW5lc2l6ZVswXV0gPQogICAgICAgICAgICBzdWJfcGljdC0+ZGF0YVswXVszKzIqc3ViX3BpY3QtPmxpbmVzaXplWzBdXSA9CiAgICAgICAgICAgIHN1Yl9waWN0LT5kYXRhWzBdWzIrMypzdWJfcGljdC0+bGluZXNpemVbMF1dID0KICAgICAgICAgICAgc3ViX3BpY3QtPmRhdGFbMF1bMyszKnN1Yl9waWN0LT5saW5lc2l6ZVswXV0gPSBpbmZvLT52MV9jb2RlYm9va1t2MV92ZWN0b3IqZW50cnlfc2l6ZSszXTsKCiAgICBpZihzLT5waXhfZm10ID09IEFWX1BJWF9GTVRfUkdCMjQpIHsKICAgICAgICBzdWJfcGljdC0+ZGF0YVsxXVswXSA9CiAgICAgICAgICAgIHN1Yl9waWN0LT5kYXRhWzFdWzFdID0KICAgICAgICAgICAgc3ViX3BpY3QtPmRhdGFbMV1bICAgIHN1Yl9waWN0LT5saW5lc2l6ZVsxXV0gPQogICAgICAgICAgICBzdWJfcGljdC0+ZGF0YVsxXVsxKyAgc3ViX3BpY3QtPmxpbmVzaXplWzFdXSA9IGluZm8tPnYxX2NvZGVib29rW3YxX3ZlY3RvciplbnRyeV9zaXplKzRdOwoKICAgICAgICBzdWJfcGljdC0+ZGF0YVsyXVswXSA9CiAgICAgICAgICAgIHN1Yl9waWN0LT5kYXRhWzJdWzFdID0KICAgICAgICAgICAgc3ViX3BpY3QtPmRhdGFbMl1bICAgIHN1Yl9waWN0LT5saW5lc2l6ZVsyXV0gPQogICAgICAgICAgICBzdWJfcGljdC0+ZGF0YVsyXVsxKyAgc3ViX3BpY3QtPmxpbmVzaXplWzJdXSA9IGluZm8tPnYxX2NvZGVib29rW3YxX3ZlY3RvciplbnRyeV9zaXplKzVdOwogICAgfQp9CgovL2RlY29kZXMgdGhlIFY0IHZlY3RvcnMgaW4gbWIgaW50byB0aGUgNHg0IE1CIHBvaW50ZWQgdG8gYnkgc3ViX3BpY3QKc3RhdGljIHZvaWQgZGVjb2RlX3Y0X3ZlY3RvcihDaW5lcGFrRW5jQ29udGV4dCAqcywgQVZQaWN0dXJlICpzdWJfcGljdCwgaW50ICp2NF92ZWN0b3IsIHN0cmlwX2luZm8gKmluZm8pCnsKICAgIGludCBpLCB4LCB5LCBlbnRyeV9zaXplID0gcy0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1JHQjI0ID8gNiA6IDQ7CgogICAgZm9yKGkgPSB5ID0gMDsgeSA8IDQ7IHkgKz0gMikgewogICAgICAgIGZvcih4ID0gMDsgeCA8IDQ7IHggKz0gMiwgaSsrKSB7CiAgICAgICAgICAgIHN1Yl9waWN0LT5kYXRhWzBdW3ggICArICAgICB5KnN1Yl9waWN0LT5saW5lc2l6ZVswXV0gPSBpbmZvLT52NF9jb2RlYm9va1t2NF92ZWN0b3JbaV0qZW50cnlfc2l6ZV07CiAgICAgICAgICAgIHN1Yl9waWN0LT5kYXRhWzBdW3grMSArICAgICB5KnN1Yl9waWN0LT5saW5lc2l6ZVswXV0gPSBpbmZvLT52NF9jb2RlYm9va1t2NF92ZWN0b3JbaV0qZW50cnlfc2l6ZSsxXTsKICAgICAgICAgICAgc3ViX3BpY3QtPmRhdGFbMF1beCAgICsgKHkrMSkqc3ViX3BpY3QtPmxpbmVzaXplWzBdXSA9IGluZm8tPnY0X2NvZGVib29rW3Y0X3ZlY3RvcltpXSplbnRyeV9zaXplKzJdOwogICAgICAgICAgICBzdWJfcGljdC0+ZGF0YVswXVt4KzEgKyAoeSsxKSpzdWJfcGljdC0+bGluZXNpemVbMF1dID0gaW5mby0+djRfY29kZWJvb2tbdjRfdmVjdG9yW2ldKmVudHJ5X3NpemUrM107CgogICAgICAgICAgICBpZihzLT5waXhfZm10ID09IEFWX1BJWF9GTVRfUkdCMjQpIHsKICAgICAgICAgICAgICAgIHN1Yl9waWN0LT5kYXRhWzFdWyh4Pj4xKSArICh5Pj4xKSpzdWJfcGljdC0+bGluZXNpemVbMV1dID0gaW5mby0+djRfY29kZWJvb2tbdjRfdmVjdG9yW2ldKmVudHJ5X3NpemUrNF07CiAgICAgICAgICAgICAgICBzdWJfcGljdC0+ZGF0YVsyXVsoeD4+MSkgKyAoeT4+MSkqc3ViX3BpY3QtPmxpbmVzaXplWzJdXSA9IGluZm8tPnY0X2NvZGVib29rW3Y0X3ZlY3RvcltpXSplbnRyeV9zaXplKzVdOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9CgpzdGF0aWMgdm9pZCBjb3B5X21iKENpbmVwYWtFbmNDb250ZXh0ICpzLCBBVlBpY3R1cmUgKmEsIEFWUGljdHVyZSAqYikKewogICAgaW50IHksIHA7CgogICAgZm9yKHkgPSAwOyB5IDwgTUJfU0laRTsgeSsrKSB7CiAgICAgICAgbWVtY3B5KGEtPmRhdGFbMF0reSphLT5saW5lc2l6ZVswXSwgYi0+ZGF0YVswXSt5KmItPmxpbmVzaXplWzBdLAogICAgICAgICAgICAgICBNQl9TSVpFKTsKICAgIH0KCiAgICBpZihzLT5waXhfZm10ID09IEFWX1BJWF9GTVRfUkdCMjQpIHsKICAgICAgICBmb3IocCA9IDE7IHAgPD0gMjsgcCsrKSB7CiAgICAgICAgICAgIGZvcih5ID0gMDsgeSA8IE1CX1NJWkUvMjsgeSsrKSB7CiAgICAgICAgICAgICAgICBtZW1jcHkoYS0+ZGF0YVtwXSArIHkqYS0+bGluZXNpemVbcF0sCiAgICAgICAgICAgICAgICAgICAgICAgYi0+ZGF0YVtwXSArIHkqYi0+bGluZXNpemVbcF0sCiAgICAgICAgICAgICAgICAgICAgICAgTUJfU0laRS8yKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KfQoKc3RhdGljIGludCBlbmNvZGVfbW9kZShDaW5lcGFrRW5jQ29udGV4dCAqcywgaW50IGgsIEFWUGljdHVyZSAqc2NyYXRjaF9waWN0LCBBVlBpY3R1cmUgKmxhc3RfcGljdCwgc3RyaXBfaW5mbyAqaW5mbywgdW5zaWduZWQgY2hhciAqYnVmKQp7CiAgICBpbnQgeCwgeSwgeiwgZmxhZ3MsIGJpdHMsIHRlbXBfc2l6ZSwgaGVhZGVyX29mcywgcmV0ID0gMCwgbWJfY291bnQgPSBzLT53ICogaCAvIE1CX0FSRUE7CiAgICBpbnQgbmVlZHNfZXh0cmFfYml0LCBzaG91bGRfd3JpdGVfdGVtcDsKICAgIHVuc2lnbmVkIGNoYXIgdGVtcFs2NF07IC8vMzIvMiA9IDE2IFY0IGJsb2NrcyBhdCA0IEIgZWFjaCAtPiA2NCBCCiAgICBtYl9pbmZvICptYjsKICAgIEFWUGljdHVyZSBzdWJfc2NyYXRjaCwgc3ViX2xhc3Q7CgogICAgLy9lbmNvZGUgY29kZWJvb2tzCi8vLy8vLyBNYWNPUyB2aW50YWdlIGRlY29kZXIgY29tcGF0aWJpbGl0eSBkaWN0YXRlcyB0aGUgcHJlc2VuY2Ugb2YKLy8vLy8vIHRoZSBjb2RlYm9vayBjaHVuayBldmVuIHdoZW4gdGhlIGNvZGVib29rIGlzIGVtcHR5IC0gcHJldHR5IGR1bWIuLi4KLy8vLy8vIGFuZCBhbHNvIHRoZSBjZXJ0YWluIG9yZGVyIG9mIHRoZSBjb2RlYm9vayBjaHVua3MgLS0gcmwKICAgIGlmKGluZm8tPnY0X3NpemUgfHwgIXMtPnNraXBfZW1wdHlfY2IpCiAgICAgICAgcmV0ICs9IGVuY29kZV9jb2RlYm9vayhzLCBpbmZvLT52NF9jb2RlYm9vaywgaW5mby0+djRfc2l6ZSwgMHgyMCwgMHgyNCwgYnVmICsgcmV0KTsKCiAgICBpZihpbmZvLT52MV9zaXplIHx8ICFzLT5za2lwX2VtcHR5X2NiKQogICAgICAgIHJldCArPSBlbmNvZGVfY29kZWJvb2socywgaW5mby0+djFfY29kZWJvb2ssIGluZm8tPnYxX3NpemUsIDB4MjIsIDB4MjYsIGJ1ZiArIHJldCk7CgogICAgLy91cGRhdGUgc2NyYXRjaCBwaWN0dXJlCiAgICBmb3IoeiA9IHkgPSAwOyB5IDwgaDsgeSArPSBNQl9TSVpFKSB7CiAgICAgICAgZm9yKHggPSAwOyB4IDwgcy0+dzsgeCArPSBNQl9TSVpFLCB6KyspIHsKICAgICAgICAgICAgbWIgPSAmcy0+bWJbel07CgogICAgICAgICAgICBnZXRfc3ViX3BpY3R1cmUocywgeCwgeSwgc2NyYXRjaF9waWN0LCAmc3ViX3NjcmF0Y2gpOwoKICAgICAgICAgICAgaWYoaW5mby0+bW9kZSA9PSBNT0RFX01DICYmIG1iLT5iZXN0X2VuY29kaW5nID09IEVOQ19TS0lQKSB7CiAgICAgICAgICAgICAgICBnZXRfc3ViX3BpY3R1cmUocywgeCwgeSwgbGFzdF9waWN0LCAmc3ViX2xhc3QpOwogICAgICAgICAgICAgICAgY29weV9tYihzLCAmc3ViX3NjcmF0Y2gsICZzdWJfbGFzdCk7CiAgICAgICAgICAgIH0gZWxzZSBpZihpbmZvLT5tb2RlID09IE1PREVfVjFfT05MWSB8fCBtYi0+YmVzdF9lbmNvZGluZyA9PSBFTkNfVjEpCiAgICAgICAgICAgICAgICBkZWNvZGVfdjFfdmVjdG9yKHMsICZzdWJfc2NyYXRjaCwgbWItPnYxX3ZlY3RvciwgaW5mbyk7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIGRlY29kZV92NF92ZWN0b3IocywgJnN1Yl9zY3JhdGNoLCBtYi0+djRfdmVjdG9yLCBpbmZvKTsKICAgICAgICB9CiAgICB9CgogICAgc3dpdGNoKGluZm8tPm1vZGUpIHsKICAgIGNhc2UgTU9ERV9WMV9PTkxZOgogICAgICAgIC8vYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfSU5GTywgIm1iX2NvdW50ID0gJWlcbiIsIG1iX2NvdW50KTsKICAgICAgICByZXQgKz0gd3JpdGVfY2h1bmtfaGVhZGVyKGJ1ZiArIHJldCwgMHgzMiwgbWJfY291bnQpOwoKICAgICAgICBmb3IoeCA9IDA7IHggPCBtYl9jb3VudDsgeCsrKQogICAgICAgICAgICBidWZbcmV0KytdID0gcy0+bWJbeF0udjFfdmVjdG9yOwoKICAgICAgICBicmVhazsKICAgIGNhc2UgTU9ERV9WMV9WNDoKICAgICAgICAvL3JlbWVtYmVyIGhlYWRlciBwb3NpdGlvbgogICAgICAgIGhlYWRlcl9vZnMgPSByZXQ7CiAgICAgICAgcmV0ICs9IENIVU5LX0hFQURFUl9TSVpFOwoKICAgICAgICBmb3IoeCA9IDA7IHggPCBtYl9jb3VudDsgeCArPSAzMikgewogICAgICAgICAgICBmbGFncyA9IDA7CiAgICAgICAgICAgIGZvcih5ID0geDsgeSA8IEZGTUlOKHgrMzIsIG1iX2NvdW50KTsgeSsrKQogICAgICAgICAgICAgICAgaWYocy0+bWJbeV0uYmVzdF9lbmNvZGluZyA9PSBFTkNfVjQpCiAgICAgICAgICAgICAgICAgICAgZmxhZ3MgfD0gMSA8PCAoMzEgLSB5ICsgeCk7CgogICAgICAgICAgICBBVl9XQjMyKCZidWZbcmV0XSwgZmxhZ3MpOwogICAgICAgICAgICByZXQgKz0gNDsKCiAgICAgICAgICAgIGZvcih5ID0geDsgeSA8IEZGTUlOKHgrMzIsIG1iX2NvdW50KTsgeSsrKSB7CiAgICAgICAgICAgICAgICBtYiA9ICZzLT5tYlt5XTsKCiAgICAgICAgICAgICAgICBpZihtYi0+YmVzdF9lbmNvZGluZyA9PSBFTkNfVjEpCiAgICAgICAgICAgICAgICAgICAgYnVmW3JldCsrXSA9IG1iLT52MV92ZWN0b3I7CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgZm9yKHogPSAwOyB6IDwgNDsgeisrKQogICAgICAgICAgICAgICAgICAgICAgICBidWZbcmV0KytdID0gbWItPnY0X3ZlY3Rvclt6XTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgd3JpdGVfY2h1bmtfaGVhZGVyKGJ1ZiArIGhlYWRlcl9vZnMsIDB4MzAsIHJldCAtIGhlYWRlcl9vZnMgLSBDSFVOS19IRUFERVJfU0laRSk7CgogICAgICAgIGJyZWFrOwogICAgY2FzZSBNT0RFX01DOgogICAgICAgIC8vcmVtZW1iZXIgaGVhZGVyIHBvc2l0aW9uCiAgICAgICAgaGVhZGVyX29mcyA9IHJldDsKICAgICAgICByZXQgKz0gQ0hVTktfSEVBREVSX1NJWkU7CiAgICAgICAgZmxhZ3MgPSBiaXRzID0gdGVtcF9zaXplID0gMDsKCiAgICAgICAgZm9yKHggPSAwOyB4IDwgbWJfY291bnQ7IHgrKykgewogICAgICAgICAgICBtYiA9ICZzLT5tYlt4XTsKICAgICAgICAgICAgZmxhZ3MgfD0gKG1iLT5iZXN0X2VuY29kaW5nICE9IEVOQ19TS0lQKSA8PCAoMzEgLSBiaXRzKyspOwogICAgICAgICAgICBuZWVkc19leHRyYV9iaXQgPSAwOwogICAgICAgICAgICBzaG91bGRfd3JpdGVfdGVtcCA9IDA7CgogICAgICAgICAgICBpZihtYi0+YmVzdF9lbmNvZGluZyAhPSBFTkNfU0tJUCkgewogICAgICAgICAgICAgICAgaWYoYml0cyA8IDMyKQogICAgICAgICAgICAgICAgICAgIGZsYWdzIHw9IChtYi0+YmVzdF9lbmNvZGluZyA9PSBFTkNfVjQpIDw8ICgzMSAtIGJpdHMrKyk7CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgbmVlZHNfZXh0cmFfYml0ID0gMTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYoYml0cyA9PSAzMikgewogICAgICAgICAgICAgICAgQVZfV0IzMigmYnVmW3JldF0sIGZsYWdzKTsKICAgICAgICAgICAgICAgIHJldCArPSA0OwogICAgICAgICAgICAgICAgZmxhZ3MgPSBiaXRzID0gMDsKCiAgICAgICAgICAgICAgICBpZihtYi0+YmVzdF9lbmNvZGluZyA9PSBFTkNfU0tJUCB8fCBuZWVkc19leHRyYV9iaXQpIHsKICAgICAgICAgICAgICAgICAgICBtZW1jcHkoJmJ1ZltyZXRdLCB0ZW1wLCB0ZW1wX3NpemUpOwogICAgICAgICAgICAgICAgICAgIHJldCArPSB0ZW1wX3NpemU7CiAgICAgICAgICAgICAgICAgICAgdGVtcF9zaXplID0gMDsKICAgICAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgICAgIHNob3VsZF93cml0ZV90ZW1wID0gMTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYobmVlZHNfZXh0cmFfYml0KSB7CiAgICAgICAgICAgICAgICBmbGFncyA9IChtYi0+YmVzdF9lbmNvZGluZyA9PSBFTkNfVjQpIDw8IDMxOwogICAgICAgICAgICAgICAgYml0cyA9IDE7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmKG1iLT5iZXN0X2VuY29kaW5nID09IEVOQ19WMSkKICAgICAgICAgICAgICAgIHRlbXBbdGVtcF9zaXplKytdID0gbWItPnYxX3ZlY3RvcjsKICAgICAgICAgICAgZWxzZSBpZihtYi0+YmVzdF9lbmNvZGluZyA9PSBFTkNfVjQpCiAgICAgICAgICAgICAgICBmb3IoeiA9IDA7IHogPCA0OyB6KyspCiAgICAgICAgICAgICAgICAgICAgdGVtcFt0ZW1wX3NpemUrK10gPSBtYi0+djRfdmVjdG9yW3pdOwoKICAgICAgICAgICAgaWYoc2hvdWxkX3dyaXRlX3RlbXApIHsKICAgICAgICAgICAgICAgIG1lbWNweSgmYnVmW3JldF0sIHRlbXAsIHRlbXBfc2l6ZSk7CiAgICAgICAgICAgICAgICByZXQgKz0gdGVtcF9zaXplOwogICAgICAgICAgICAgICAgdGVtcF9zaXplID0gMDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYoYml0cyA+IDApIHsKICAgICAgICAgICAgQVZfV0IzMigmYnVmW3JldF0sIGZsYWdzKTsKICAgICAgICAgICAgcmV0ICs9IDQ7CiAgICAgICAgICAgIG1lbWNweSgmYnVmW3JldF0sIHRlbXAsIHRlbXBfc2l6ZSk7CiAgICAgICAgICAgIHJldCArPSB0ZW1wX3NpemU7CiAgICAgICAgfQoKICAgICAgICB3cml0ZV9jaHVua19oZWFkZXIoYnVmICsgaGVhZGVyX29mcywgMHgzMSwgcmV0IC0gaGVhZGVyX29mcyAtIENIVU5LX0hFQURFUl9TSVpFKTsKCiAgICAgICAgYnJlYWs7CiAgICB9CgogICAgcmV0dXJuIHJldDsKfQoKLy9jb21wdXRlcyBkaXN0b3J0aW9uIG9mIDR4NCBNQiBpbiBiIGNvbXBhcmVkIHRvIGEKc3RhdGljIGludCBjb21wdXRlX21iX2Rpc3RvcnRpb24oQ2luZXBha0VuY0NvbnRleHQgKnMsIEFWUGljdHVyZSAqYSwgQVZQaWN0dXJlICpiKQp7CiAgICBpbnQgeCwgeSwgcCwgZCwgcmV0ID0gMDsKCiAgICBmb3IoeSA9IDA7IHkgPCBNQl9TSVpFOyB5KyspIHsKICAgICAgICBmb3IoeCA9IDA7IHggPCBNQl9TSVpFOyB4KyspIHsKICAgICAgICAgICAgZCA9IGEtPmRhdGFbMF1beCArIHkqYS0+bGluZXNpemVbMF1dIC0gYi0+ZGF0YVswXVt4ICsgeSpiLT5saW5lc2l6ZVswXV07CiAgICAgICAgICAgIHJldCArPSBkKmQ7CiAgICAgICAgfQogICAgfQoKICAgIGlmKHMtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9SR0IyNCkgewogICAgICAgIGZvcihwID0gMTsgcCA8PSAyOyBwKyspIHsKICAgICAgICAgICAgZm9yKHkgPSAwOyB5IDwgTUJfU0laRS8yOyB5KyspIHsKICAgICAgICAgICAgICAgIGZvcih4ID0gMDsgeCA8IE1CX1NJWkUvMjsgeCsrKSB7CiAgICAgICAgICAgICAgICAgICAgZCA9IGEtPmRhdGFbcF1beCArIHkqYS0+bGluZXNpemVbcF1dIC0gYi0+ZGF0YVtwXVt4ICsgeSpiLT5saW5lc2l6ZVtwXV07CiAgICAgICAgICAgICAgICAgICAgcmV0ICs9IGQqZDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gcmV0Owp9CgovLyByZXR1cm4gdGhlIHBvc3NpYmx5IGFkanVzdGVkIHNpemUgb2YgdGhlIGNvZGVib29rCiNkZWZpbmUgQ0VSVEFJTih4KSAoKHgpIT1FTkNfVU5DRVJUQUlOKQpzdGF0aWMgaW50IHF1YW50aXplKENpbmVwYWtFbmNDb250ZXh0ICpzLCBpbnQgaCwgQVZQaWN0dXJlICpwaWN0LAogICAgICAgICAgICAgICAgICAgIGludCB2MW1vZGUsIHN0cmlwX2luZm8gKmluZm8sCiAgICAgICAgICAgICAgICAgICAgbWJfZW5jb2RpbmcgZW5jb2RpbmcpCnsKICAgIGludCB4LCB5LCBpLCBqLCBrLCB4MiwgeTIsIHgzLCB5MywgcGxhbmUsIHNoaWZ0LCBtYm47CiAgICBpbnQgZW50cnlfc2l6ZSA9IHMtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9SR0IyNCA/IDYgOiA0OwogICAgaW50ICpjb2RlYm9vayA9IHYxbW9kZSA/IGluZm8tPnYxX2NvZGVib29rIDogaW5mby0+djRfY29kZWJvb2s7CiAgICBpbnQgc2l6ZSA9IHYxbW9kZSA/IGluZm8tPnYxX3NpemUgOiBpbmZvLT52NF9zaXplOwogICAgaW50NjRfdCB0b3RhbF9lcnJvciA9IDA7CiAgICB1aW50OF90IHZxX3BpY3RfYnVmWyhNQl9BUkVBKjMpLzJdOwogICAgQVZQaWN0dXJlIHN1Yl9waWN0LCB2cV9waWN0OwoKICAgIGZvcihtYm4gPSBpID0geSA9IDA7IHkgPCBoOyB5ICs9IE1CX1NJWkUpIHsKICAgICAgICBmb3IoeCA9IDA7IHggPCBzLT53OyB4ICs9IE1CX1NJWkUsICsrbWJuKSB7CiAgICAgICAgICAgIGludCAqYmFzZTsKCiAgICAgICAgICAgIGlmKENFUlRBSU4oZW5jb2RpbmcpKSB7Ci8vIHVzZSBmb3IgdGhlIHRyYWluaW5nIG9ubHkgdGhlIGJsb2NrcyBrbm93biB0byBiZSB0byBiZSBlbmNvZGVkIFtzaWM6LV0KICAgICAgICAgICAgICAgaWYocy0+bWJbbWJuXS5iZXN0X2VuY29kaW5nICE9IGVuY29kaW5nKSBjb250aW51ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgYmFzZSA9IHMtPmNvZGVib29rX2lucHV0ICsgaSplbnRyeV9zaXplOwogICAgICAgICAgICBpZih2MW1vZGUpIHsKICAgICAgICAgICAgICAgIC8vc3Vic2FtcGxlCiAgICAgICAgICAgICAgICBmb3IoaiA9IHkyID0gMDsgeTIgPCBlbnRyeV9zaXplOyB5MiArPSAyKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yKHgyID0gMDsgeDIgPCA0OyB4MiArPSAyLCBqKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgcGxhbmUgPSB5MiA8IDQgPyAwIDogMSArICh4MiA+PiAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2hpZnQgPSB5MiA8IDQgPyAwIDogMTsKICAgICAgICAgICAgICAgICAgICAgICAgeDMgPSBzaGlmdCA/IDAgOiB4MjsKICAgICAgICAgICAgICAgICAgICAgICAgeTMgPSBzaGlmdCA/IDAgOiB5MjsKICAgICAgICAgICAgICAgICAgICAgICAgYmFzZVtqXSA9IChwaWN0LT5kYXRhW3BsYW5lXVsoKHgreDMpID4+IHNoaWZ0KSArICAgICAgKCh5K3kzKSA+PiBzaGlmdCkgICAgICAqIHBpY3QtPmxpbmVzaXplW3BsYW5lXV0gKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpY3QtPmRhdGFbcGxhbmVdWygoeCt4MykgPj4gc2hpZnQpICsgMSArICAoKHkreTMpID4+IHNoaWZ0KSAgICAgICogcGljdC0+bGluZXNpemVbcGxhbmVdXSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGljdC0+ZGF0YVtwbGFuZV1bKCh4K3gzKSA+PiBzaGlmdCkgKyAgICAgKCgoeSt5MykgPj4gc2hpZnQpICsgMSkgKiBwaWN0LT5saW5lc2l6ZVtwbGFuZV1dICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWN0LT5kYXRhW3BsYW5lXVsoKHgreDMpID4+IHNoaWZ0KSArIDEgKyAoKCh5K3kzKSA+PiBzaGlmdCkgKyAxKSAqIHBpY3QtPmxpbmVzaXplW3BsYW5lXV0pID4+IDI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgLy9jb3B5CiAgICAgICAgICAgICAgICBmb3IoaiA9IHkyID0gMDsgeTIgPCBNQl9TSVpFOyB5MiArPSAyKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yKHgyID0gMDsgeDIgPCBNQl9TSVpFOyB4MiArPSAyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcihrID0gMDsgayA8IGVudHJ5X3NpemU7IGsrKywgaisrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFuZSA9IGsgPj0gNCA/IGsgLSAzIDogMDsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihrID49IDQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4MyA9ICh4K3gyKSA+PiAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkzID0gKHkreTIpID4+IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgzID0geCArIHgyICsgKGsgJiAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5MyA9IHkgKyB5MiArIChrID4+IDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2Vbal0gPSBwaWN0LT5kYXRhW3BsYW5lXVt4MyArIHkzKnBpY3QtPmxpbmVzaXplW3BsYW5lXV07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaSArPSB2MW1vZGUgPyAxIDogNDsKICAgICAgICB9CiAgICB9Ci8vICAgIGlmKGkgPCBtYm4qKHYxbW9kZSA/IDEgOiA0KSkgewovLyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfSU5GTywgInJlZHVjaW5nIHRyYWluaW5nIHNldCBmb3IgJXMgZnJvbSAlaSB0byAlaSAoZW5jb2RpbmcgJWkpXG4iLCB2MW1vZGU/InYxIjoidjQiLCBtYm4qKHYxbW9kZSA/IDEgOiA0KSwgaSwgZW5jb2RpbmcpOwovLyAgICB9CgogICAgaWYoaSA9PSAwKSAvLyBlbXB0eSB0cmFpbmluZyBzZXQsIG5vdGhpbmcgdG8gZG8KICAgICAgICByZXR1cm4gMDsKICAgIGlmKGkgPCBzaXplKSB7CiAgICAgICAgLy9hdl9sb2cocy0+YXZjdHgsIChDRVJUQUlOKGVuY29kaW5nKSA/IEFWX0xPR19FUlJPUiA6IEFWX0xPR19JTkZPKSwgIldPVUxEIFdBU1RFOiAlcyBjYnNpemUgJWkgYmlnZ2VyIHRoYW4gdHJhaW5pbmcgc2V0IHNpemUgJWkgKGVuY29kaW5nICVpKVxuIiwgdjFtb2RlPyJ2MSI6InY0Iiwgc2l6ZSwgaSwgZW5jb2RpbmcpOwogICAgICAgIHNpemUgPSBpOwogICAgfQoKICAgIGF2cHJpdl9pbml0X2VsYmcocy0+Y29kZWJvb2tfaW5wdXQsIGVudHJ5X3NpemUsIGksIGNvZGVib29rLCBzaXplLCAxLCBzLT5jb2RlYm9va19jbG9zZXN0LCAmcy0+cmFuZGN0eCk7CiAgICBhdnByaXZfZG9fZWxiZyhzLT5jb2RlYm9va19pbnB1dCwgZW50cnlfc2l6ZSwgaSwgY29kZWJvb2ssIHNpemUsIDEsIHMtPmNvZGVib29rX2Nsb3Nlc3QsICZzLT5yYW5kY3R4KTsKCiAgICAvL3NldHVwIHZxX3BpY3QsIHdoaWNoIGNvbnRhaW5zIGEgc2luZ2xlIE1CCiAgICB2cV9waWN0LmRhdGFbMF0gPSB2cV9waWN0X2J1ZjsKICAgIHZxX3BpY3QubGluZXNpemVbMF0gPSBNQl9TSVpFOwogICAgdnFfcGljdC5kYXRhWzFdID0gJnZxX3BpY3RfYnVmW01CX0FSRUFdOwogICAgdnFfcGljdC5kYXRhWzJdID0gdnFfcGljdC5kYXRhWzFdICsgKE1CX0FSRUEgPj4gMik7CiAgICB2cV9waWN0LmxpbmVzaXplWzFdID0gdnFfcGljdC5saW5lc2l6ZVsyXSA9IE1CX1NJWkUgPj4gMTsKCiAgICAvL2NvcHkgaW5kaWNlcwogICAgZm9yKGkgPSBqID0geSA9IDA7IHkgPCBoOyB5ICs9IE1CX1NJWkUpIHsKICAgICAgICBmb3IoeCA9IDA7IHggPCBzLT53OyB4ICs9IE1CX1NJWkUsIGorKykgewogICAgICAgICAgICBtYl9pbmZvICptYiA9ICZzLT5tYltqXTsKLy8gc2tpcCB1bmludGVyZXN0aW5nIGJsb2NrcyBpZiB3ZSBrbm93IHRoZWlyIHByZWZlcnJlZCBlbmNvZGluZwogICAgICAgICAgICBpZihDRVJUQUlOKGVuY29kaW5nKSAmJiBtYi0+YmVzdF9lbmNvZGluZyAhPSBlbmNvZGluZykKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwoKICAgICAgICAgICAgLy9wb2ludCBzdWJfcGljdCB0byBjdXJyZW50IE1CCiAgICAgICAgICAgIGdldF9zdWJfcGljdHVyZShzLCB4LCB5LCBwaWN0LCAmc3ViX3BpY3QpOwoKICAgICAgICAgICAgaWYodjFtb2RlKSB7CiAgICAgICAgICAgICAgICBtYi0+djFfdmVjdG9yID0gcy0+Y29kZWJvb2tfY2xvc2VzdFtpXTsKCiAgICAgICAgICAgICAgICAvL2ZpbGwgaW4gdnFfcGljdCB3aXRoIFYxIGRhdGEKICAgICAgICAgICAgICAgIGRlY29kZV92MV92ZWN0b3IocywgJnZxX3BpY3QsIG1iLT52MV92ZWN0b3IsIGluZm8pOwoKICAgICAgICAgICAgICAgIG1iLT52MV9lcnJvciA9IGNvbXB1dGVfbWJfZGlzdG9ydGlvbihzLCAmc3ViX3BpY3QsICZ2cV9waWN0KTsKICAgICAgICAgICAgICAgIHRvdGFsX2Vycm9yICs9IG1iLT52MV9lcnJvcjsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGZvcihrID0gMDsgayA8IDQ7IGsrKykKICAgICAgICAgICAgICAgICAgICBtYi0+djRfdmVjdG9yW2tdID0gcy0+Y29kZWJvb2tfY2xvc2VzdFtpK2tdOwoKICAgICAgICAgICAgICAgIC8vZmlsbCBpbiB2cV9waWN0IHdpdGggVjQgZGF0YQogICAgICAgICAgICAgICAgZGVjb2RlX3Y0X3ZlY3RvcihzLCAmdnFfcGljdCwgbWItPnY0X3ZlY3RvciwgaW5mbyk7CgogICAgICAgICAgICAgICAgbWItPnY0X2Vycm9yID0gY29tcHV0ZV9tYl9kaXN0b3J0aW9uKHMsICZzdWJfcGljdCwgJnZxX3BpY3QpOwogICAgICAgICAgICAgICAgdG90YWxfZXJyb3IgKz0gbWItPnY0X2Vycm9yOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGkgKz0gdjFtb2RlID8gMSA6IDQ7CiAgICAgICAgfQogICAgfQovLyBjaGVjayB0aGF0IHdlIGRpZCBpdCByaWdodCBpbiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmdW5jdGlvbgogICAgYXZfYXNzZXJ0MChpID49IHNpemUpOyAvLyB0cmFpbmluZyBzZXQgaXMgbm8gc21hbGxlciB0aGFuIHRoZSBjb2RlYm9vawoKICAgIC8vYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfSU5GTywgImlzdjEgJWkgc2l6ZT0gJWkgaT0gJWkgZXJyb3IgJWxsaVxuIiwgdjFtb2RlLCBzaXplLCBpLCAobG9uZyBsb25nIGludCl0b3RhbF9lcnJvcik7CgogICAgcmV0dXJuIHNpemU7Cn0KCnN0YXRpYyB2b2lkIGNhbGN1bGF0ZV9za2lwX2Vycm9ycyhDaW5lcGFrRW5jQ29udGV4dCAqcywgaW50IGgsIEFWUGljdHVyZSAqbGFzdF9waWN0LCBBVlBpY3R1cmUgKnBpY3QsIHN0cmlwX2luZm8gKmluZm8pCnsKICAgIGludCB4LCB5LCBpOwogICAgQVZQaWN0dXJlIHN1Yl9sYXN0LCBzdWJfcGljdDsKCiAgICBmb3IoaSA9IHkgPSAwOyB5IDwgaDsgeSArPSBNQl9TSVpFKSB7CiAgICAgICAgZm9yKHggPSAwOyB4IDwgcy0+dzsgeCArPSBNQl9TSVpFLCBpKyspIHsKICAgICAgICAgICAgZ2V0X3N1Yl9waWN0dXJlKHMsIHgsIHksIGxhc3RfcGljdCwgJnN1Yl9sYXN0KTsKICAgICAgICAgICAgZ2V0X3N1Yl9waWN0dXJlKHMsIHgsIHksIHBpY3QsICAgICAgJnN1Yl9waWN0KTsKCiAgICAgICAgICAgIHMtPm1iW2ldLnNraXBfZXJyb3IgPSBjb21wdXRlX21iX2Rpc3RvcnRpb24ocywgJnN1Yl9sYXN0LCAmc3ViX3BpY3QpOwogICAgICAgIH0KICAgIH0KfQoKc3RhdGljIHZvaWQgd3JpdGVfc3RyaXBfaGVhZGVyKENpbmVwYWtFbmNDb250ZXh0ICpzLCBpbnQgeSwgaW50IGgsIGludCBrZXlmcmFtZSwgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgc3RyaXBfc2l6ZSkKewovLyBhY3R1YWxseSB3ZSBhcmUgZXhjbHVzaXZlbHkgdXNpbmcgaW50cmEgc3RyaXAgY29kaW5nIChob3cgbXVjaCBjYW4gd2Ugd2luCi8vIG90aGVyd2lzZT8gaG93IHRvIGNob29zZSB3aGljaCBwYXJ0IG9mIGEgY29kZWJvb2sgdG8gdXBkYXRlPyksCi8vIGtleWZyYW1lcyBhcmUgZGlmZmVyZW50IG9ubHkgYmVjYXVzZSB3ZSBkaXNhbGxvdyBFTkNfU0tJUCBvbiB0aGVtIC0tIHJsCi8vIChiZXNpZGVzLCB0aGUgbG9naWMgaGVyZSB1c2VkIHRvIGJlIGludmVydGVkOiApCi8vICAgIGJ1ZlswXSA9IGtleWZyYW1lID8gMHgxMTogMHgxMDsKICAgIGJ1ZlswXSA9IGtleWZyYW1lID8gMHgxMDogMHgxMTsKICAgIEFWX1dCMjQoJmJ1ZlsxXSwgc3RyaXBfc2l6ZSArIFNUUklQX0hFQURFUl9TSVpFKTsKLy8gICAgQVZfV0IxNigmYnVmWzRdLCB5KTsgLyogdXNpbmcgYWJzb2x1dGUgeSB2YWx1ZXMgd29ya3MgLS0gcmwgKi8KICAgIEFWX1dCMTYoJmJ1Zls0XSwgMCk7IC8qIHVzaW5nIHJlbGF0aXZlIHZhbHVlcyB3b3JrcyBhcyB3ZWxsIC0tIHJsICovCiAgICBBVl9XQjE2KCZidWZbNl0sIDApOwovLyAgICBBVl9XQjE2KCZidWZbOF0sIHkraCk7IC8qIHVzaW5nIGFic29sdXRlIHkgdmFsdWVzIHdvcmtzIC0tIHJsICovCiAgICBBVl9XQjE2KCZidWZbOF0sIGgpOyAvKiB1c2luZyByZWxhdGl2ZSB2YWx1ZXMgd29ya3MgYXMgd2VsbCAtLSBybCAqLwogICAgQVZfV0IxNigmYnVmWzEwXSwgcy0+dyk7CiAgICAvL2F2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0lORk8sICJ3cml0ZV9zdHJpcF9oZWFkZXIoKSAleCBrZXlmcmFtZT0lZFxuIiwgYnVmWzBdLCBrZXlmcmFtZSk7Cn0KCnN0YXRpYyBpbnQgcmRfc3RyaXAoQ2luZXBha0VuY0NvbnRleHQgKnMsIGludCB5LCBpbnQgaCwgaW50IGtleWZyYW1lLCBBVlBpY3R1cmUgKmxhc3RfcGljdCwgQVZQaWN0dXJlICpwaWN0LCBBVlBpY3R1cmUgKnNjcmF0Y2hfcGljdCwgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQ2NF90ICpiZXN0X3Njb3JlCiNpZmRlZiBDSU5FUEFLX1JFUE9SVF9TRVJSCiwgaW50NjRfdCAqYmVzdF9zZXJyCiNlbmRpZgopCnsKICAgIGludDY0X3Qgc2NvcmUgPSAwOwojaWZkZWYgQ0lORVBBS19SRVBPUlRfU0VSUgogICAgaW50NjRfdCBzZXJyOwojZW5kaWYKICAgIGludCBiZXN0X3NpemUgPSAwOwogICAgc3RyaXBfaW5mbyBpbmZvOwovLyBmb3IgY29kZWJvb2sgb3B0aW1pemF0aW9uOgogICAgaW50IHYxZW5vdWdoLCB2MV9zaXplLCB2NGVub3VnaCwgdjRfc2l6ZTsKICAgIGludCBuZXdfdjFfc2l6ZSwgbmV3X3Y0X3NpemU7CiAgICBpbnQgdjFzaHJ1bmssIHY0c2hydW5rOwoKICAgIGlmKCFrZXlmcmFtZSkKICAgICAgICBjYWxjdWxhdGVfc2tpcF9lcnJvcnMocywgaCwgbGFzdF9waWN0LCBwaWN0LCAmaW5mbyk7CgogICAgLy90cnkgc29tZSBwb3dlcnMgb2YgNCBmb3IgdGhlIHNpemUgb2YgdGhlIGNvZGVib29rcwogICAgLy9jb25zdHJhaW50IHRoZSB2NCBjb2RlYm9vayB0byBiZSBubyBiaWdnZXIgdGhhbiB2MSBvbmUsCiAgICAvLyhhbmQgbm8gbGVzcyB0aGFuIHYxX3NpemUvNCkKICAgIC8vdGh1cyBtYWtpbmcgdjEgcHJlZmVyYWJsZSBhbmQgcG9zc2libHkgbG9zaW5nIHNtYWxsIGRldGFpbHM/IHNob3VsZCBiZSBvawojZGVmaW5lIFNNQUxMRVNUX0NPREVCT09LIDEKICAgIGZvcih2MWVub3VnaCA9IDAsIHYxX3NpemUgPSBTTUFMTEVTVF9DT0RFQk9PSzsgdjFfc2l6ZSA8PSBDT0RFQk9PS19NQVggJiYgIXYxZW5vdWdoOyB2MV9zaXplIDw8PSAyKSB7CiAgICAgICAgZm9yKHY0ZW5vdWdoID0gMCwgdjRfc2l6ZSA9IDA7IHY0X3NpemUgPD0gdjFfc2l6ZSAmJiAhdjRlbm91Z2g7IHY0X3NpemUgPSB2NF9zaXplID8gdjRfc2l6ZSA8PCAyIDogdjFfc2l6ZSA+PSBTTUFMTEVTVF9DT0RFQk9PSyA8PCAyID8gdjFfc2l6ZSA+PiAyIDogU01BTExFU1RfQ09ERUJPT0spIHsKICAgICAgICAgICAgLy90cnkgYWxsIG1vZGVzCiAgICAgICAgICAgIGZvcihDaW5lcGFrTW9kZSBtb2RlID0gMDsgbW9kZSA8IE1PREVfQ09VTlQ7IG1vZGUrKykgewogICAgICAgICAgICAgICAgLy9kb24ndCBhbGxvdyBNT0RFX01DIGluIGludHJhIGZyYW1lcwogICAgICAgICAgICAgICAgaWYoa2V5ZnJhbWUgJiYgbW9kZSA9PSBNT0RFX01DKQogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwoKICAgICAgICAgICAgICAgIGlmKG1vZGUgPT0gTU9ERV9WMV9PTkxZKSB7CiAgICAgICAgICAgICAgICAgICAgaW5mby52MV9zaXplID0gdjFfc2l6ZTsKLy8gdGhlIHNpemUgbWF5IHNocmluayBldmVuIGJlZm9yZSBvcHRpbWl6YXRpb25zIGlmIHRoZSBpbnB1dCBpcyBzaG9ydDoKICAgICAgICAgICAgICAgICAgICBpbmZvLnYxX3NpemUgPSBxdWFudGl6ZShzLCBoLCBwaWN0LCAxLCAmaW5mbywgRU5DX1VOQ0VSVEFJTik7CiAgICAgICAgICAgICAgICAgICAgaWYoaW5mby52MV9zaXplIDwgdjFfc2l6ZSkKLy8gdG9vIGZldyBlbGlnaWJsZSBibG9ja3MsIG5vIHNlbnNlIGluIHRyeWluZyBiaWdnZXIgc2l6ZXMKICAgICAgICAgICAgICAgICAgICAgICAgdjFlbm91Z2ggPSAxOwoKICAgICAgICAgICAgICAgICAgICBpbmZvLnY0X3NpemUgPSAwOwogICAgICAgICAgICAgICAgfSBlbHNlIHsgLy8gbW9kZSAhPSBNT0RFX1YxX09OTFkKICAgICAgICAgICAgICAgICAgICAvLyBpZiB2NCBjb2RlYm9vayBpcyBlbXB0eSB0aGVuIG9ubHkgYWxsb3cgVjEtb25seSBtb2RlCiAgICAgICAgICAgICAgICAgICAgaWYoIXY0X3NpemUpCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwoKICAgICAgICAgICAgICAgICAgICBpZihtb2RlID09IE1PREVfVjFfVjQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaW5mby52NF9zaXplID0gdjRfc2l6ZTsKICAgICAgICAgICAgICAgICAgICAgICAgaW5mby52NF9zaXplID0gcXVhbnRpemUocywgaCwgcGljdCwgMCwgJmluZm8sIEVOQ19VTkNFUlRBSU4pOwogICAgICAgICAgICAgICAgICAgICAgICBpZihpbmZvLnY0X3NpemUgPCB2NF9zaXplKQovLyB0b28gZmV3IGVsaWdpYmxlIGJsb2Nrcywgbm8gc2Vuc2UgaW4gdHJ5aW5nIGJpZ2dlciBzaXplcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdjRlbm91Z2ggPSAxOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpbmZvLm1vZGUgPSBtb2RlOwovLyBjaG9vc2UgdGhlIGJlc3QgZW5jb2RpbmcgcGVyIGJsb2NrLCBiYXNlZCBvbiBjdXJyZW50IGV4cGVyaWVuY2UKICAgICAgICAgICAgICAgIHNjb3JlID0gY2FsY3VsYXRlX21vZGVfc2NvcmUocywgaCwgJmluZm8sIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2MXNocnVuaywgJnY0c2hydW5rCiNpZmRlZiBDSU5FUEFLX1JFUE9SVF9TRVJSCiwgJnNlcnIKI2VuZGlmCik7CgogICAgICAgICAgICAgICAgaWYobW9kZSAhPSBNT0RFX1YxX09OTFkpewogICAgICAgICAgICAgICAgICAgIGludCBleHRyYV9pdGVyYXRpb25zX2xpbWl0ID0gcy0+bWF4X2V4dHJhX2NiX2l0ZXJhdGlvbnM7Ci8vIHJlY29tcHV0ZSB0aGUgY29kZWJvb2tzLCBvbWl0dGluZyB0aGUgZXh0cmEgYmxvY2tzCi8vIHdlIGFzc3VtZSB3ZSBfbWF5XyBjb21lIGhlcmUgd2l0aCBtb3JlIGJsb2NrcyB0byBlbmNvZGUgdGhhbiBiZWZvcmUKICAgICAgICAgICAgICAgICAgICBpbmZvLnYxX3NpemUgPSB2MV9zaXplOwogICAgICAgICAgICAgICAgICAgIG5ld192MV9zaXplID0gcXVhbnRpemUocywgaCwgcGljdCwgMSwgJmluZm8sIEVOQ19WMSk7CiAgICAgICAgICAgICAgICAgICAgaWYobmV3X3YxX3NpemUgPCBpbmZvLnYxX3NpemUpewogICAgICAgICAgICAgICAgICAgICAgICAvL2F2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0lORk8sICJtb2RlICVpLCAlM2ksICUzaTogY3V0IHYxIGNvZGVib29rIHRvICVpIGVudHJpZXNcbiIsIG1vZGUsIHYxX3NpemUsIHY0X3NpemUsIG5ld192MV9zaXplKTsKICAgICAgICAgICAgICAgICAgICAgICAgaW5mby52MV9zaXplID0gbmV3X3YxX3NpemU7CiAgICAgICAgICAgICAgICAgICAgfQovLyB3ZSBhc3N1bWUgd2UgX21heV8gY29tZSBoZXJlIHdpdGggbW9yZSBibG9ja3MgdG8gZW5jb2RlIHRoYW4gYmVmb3JlCiAgICAgICAgICAgICAgICAgICAgaW5mby52NF9zaXplID0gdjRfc2l6ZTsKICAgICAgICAgICAgICAgICAgICBuZXdfdjRfc2l6ZSA9IHF1YW50aXplKHMsIGgsIHBpY3QsIDAsICZpbmZvLCBFTkNfVjQpOwogICAgICAgICAgICAgICAgICAgIGlmKG5ld192NF9zaXplIDwgaW5mby52NF9zaXplKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfSU5GTywgIm1vZGUgJWksICUzaSwgJTNpOiBjdXQgdjQgY29kZWJvb2sgdG8gJWkgZW50cmllcyBhdCBmaXJzdCBpdGVyYXRpb25cbiIsIG1vZGUsIHYxX3NpemUsIHY0X3NpemUsIG5ld192NF9zaXplKTsKICAgICAgICAgICAgICAgICAgICAgICAgaW5mby52NF9zaXplID0gbmV3X3Y0X3NpemU7CiAgICAgICAgICAgICAgICAgICAgfQovLyBjYWxjdWxhdGUgdGhlIHJlc3VsdGluZyBzY29yZQovLyAoZG8gbm90IG1vdmUgYmxvY2tzIHRvIGNvZGVib29rIGVuY29kaW5ncyBub3csIGFzIHNvbWUgYmxvY2tzIG1heSBoYXZlCi8vIGdvdCBiaWdnZXIgZXJyb3JzIGRlc3BpdGUgYSBzbWFsbGVyIHRyYWluaW5nIHNldCAtIGJ1dCB3ZSBkbyBub3QKLy8gZXZlciBncm93IHRoZSB0cmFpbmluZyBzZXRzIGJhY2spCiAgICAgICAgICAgICAgICAgICAgZm9yKDs7KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNjb3JlID0gY2FsY3VsYXRlX21vZGVfc2NvcmUocywgaCwgJmluZm8sIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnYxc2hydW5rLCAmdjRzaHJ1bmsKI2lmZGVmIENJTkVQQUtfUkVQT1JUX1NFUlIKLCAmc2VycgojZW5kaWYKKTsKLy8gZG8gd2UgaGF2ZSBhIHJlYXNvbiB0byByZWl0ZXJhdGU/IGlmIHNvLCBoYXZlIHdlIHJlYWNoZWQgdGhlIGxpbWl0PwogICAgICAgICAgICAgICAgICAgICAgICBpZigoIXYxc2hydW5rICYmICF2NHNocnVuaykgfHwgIWV4dHJhX2l0ZXJhdGlvbnNfbGltaXQtLSkgYnJlYWs7Ci8vIHJlY29tcHV0ZSB0aGUgY29kZWJvb2tzLCBvbWl0dGluZyB0aGUgZXh0cmEgYmxvY2tzCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHYxc2hydW5rKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLnYxX3NpemUgPSB2MV9zaXplOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3X3YxX3NpemUgPSBxdWFudGl6ZShzLCBoLCBwaWN0LCAxLCAmaW5mbywgRU5DX1YxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKG5ld192MV9zaXplIDwgaW5mby52MV9zaXplKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2F2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0lORk8sICJtb2RlICVpLCAlM2ksICUzaTogY3V0IHYxIGNvZGVib29rIHRvICVpIGVudHJpZXNcbiIsIG1vZGUsIHYxX3NpemUsIHY0X3NpemUsIG5ld192MV9zaXplKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLnYxX3NpemUgPSBuZXdfdjFfc2l6ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZih2NHNocnVuaykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby52NF9zaXplID0gdjRfc2l6ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld192NF9zaXplID0gcXVhbnRpemUocywgaCwgcGljdCwgMCwgJmluZm8sIEVOQ19WNCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihuZXdfdjRfc2l6ZSA8IGluZm8udjRfc2l6ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfSU5GTywgIm1vZGUgJWksICUzaSwgJTNpOiBjdXQgdjQgY29kZWJvb2sgdG8gJWkgZW50cmllc1xuIiwgbW9kZSwgdjFfc2l6ZSwgdjRfc2l6ZSwgbmV3X3Y0X3NpemUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8udjRfc2l6ZSA9IG5ld192NF9zaXplOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfSU5GTywgIiUzaSAlM2kgc2NvcmUgPSAlbGxpXG4iLCB2MV9zaXplLCB2NF9zaXplLCAobG9uZyBsb25nIGludClzY29yZSk7CgogICAgICAgICAgICAgICAgaWYoYmVzdF9zaXplID09IDAgfHwgc2NvcmUgPCAqYmVzdF9zY29yZSkgewoKICAgICAgICAgICAgICAgICAgICAqYmVzdF9zY29yZSA9IHNjb3JlOwojaWZkZWYgQ0lORVBBS19SRVBPUlRfU0VSUgogICAgICAgICAgICAgICAgICAgICpiZXN0X3NlcnIgPSBzZXJyOwojZW5kaWYKICAgICAgICAgICAgICAgICAgICBiZXN0X3NpemUgPSBlbmNvZGVfbW9kZShzLCBoLCBzY3JhdGNoX3BpY3QsIGxhc3RfcGljdCwgJmluZm8sIHMtPnN0cmlwX2J1ZiArIFNUUklQX0hFQURFUl9TSVpFKTsKCiAgICAgICAgICAgICAgICAgICAgLy9hdl9sb2cocy0+YXZjdHgsIEFWX0xPR19JTkZPLCAibW9kZSAlaSwgJTNpLCAlM2k6ICUxOGxsaSAlaSBCIiwgbW9kZSwgaW5mby52MV9zaXplLCBpbmZvLnY0X3NpemUsIChsb25nIGxvbmcgaW50KXNjb3JlLCBiZXN0X3NpemUpOwogICAgICAgICAgICAgICAgICAgIC8vYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfSU5GTywgIlxuIik7CiNpZmRlZiBDSU5FUEFLX1JFUE9SVF9TRVJSCiAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfSU5GTywgIm1vZGUgJWksICUzaSwgJTNpOiAlMThsbGkgJWkgQlxuIiwgbW9kZSwgdjFfc2l6ZSwgdjRfc2l6ZSwgKGxvbmcgbG9uZyBpbnQpc2VyciwgYmVzdF9zaXplKTsKI2VuZGlmCgojaWZkZWYgQ0lORVBBS0VOQ19ERUJVRwogICAgICAgICAgICAgICAgICAgIC8vc2F2ZSBNQiBlbmNvZGluZyBjaG9pY2VzCiAgICAgICAgICAgICAgICAgICAgbWVtY3B5KHMtPmJlc3RfbWIsIHMtPm1iLCBtYl9jb3VudCpzaXplb2YobWJfaW5mbykpOwojZW5kaWYKCiAgICAgICAgICAgICAgICAgICAgLy9tZW1jcHkoc3RyaXBfdGVtcCArIFNUUklQX0hFQURFUl9TSVpFLCBzdHJpcF90ZW1wLCBiZXN0X3NpemUpOwogICAgICAgICAgICAgICAgICAgIHdyaXRlX3N0cmlwX2hlYWRlcihzLCB5LCBoLCBrZXlmcmFtZSwgcy0+c3RyaXBfYnVmLCBiZXN0X3NpemUpOwoKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiNpZmRlZiBDSU5FUEFLRU5DX0RFQlVHCiAgICAvL2dhdGhlciBzdGF0cy4gdGhpcyB3aWxsIG9ubHkgd29yayBwcm9wZXJseSBvZiBNQVhfU1RSSVBTID09IDEKICAgIGlmKGJlc3RfaW5mby5tb2RlID09IE1PREVfVjFfT05MWSkgewogICAgICAgIHMtPm51bV92MV9tb2RlKys7CiAgICAgICAgcy0+bnVtX3YxX2VuY3MgKz0gcy0+dypoL01CX0FSRUE7CiAgICB9IGVsc2UgewogICAgICAgIGlmKGJlc3RfaW5mby5tb2RlID09IE1PREVfVjFfVjQpCiAgICAgICAgICAgIHMtPm51bV92NF9tb2RlKys7CiAgICAgICAgZWxzZQogICAgICAgICAgICBzLT5udW1fbWNfbW9kZSsrOwoKICAgICAgICBpbnQgeDsKICAgICAgICBmb3IoeCA9IDA7IHggPCBzLT53KmgvTUJfQVJFQTsgeCsrKQogICAgICAgICAgICBpZihzLT5iZXN0X21iW3hdLmJlc3RfZW5jb2RpbmcgPT0gRU5DX1YxKQogICAgICAgICAgICAgICAgcy0+bnVtX3YxX2VuY3MrKzsKICAgICAgICAgICAgZWxzZSBpZihzLT5iZXN0X21iW3hdLmJlc3RfZW5jb2RpbmcgPT0gRU5DX1Y0KQogICAgICAgICAgICAgICAgcy0+bnVtX3Y0X2VuY3MrKzsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgcy0+bnVtX3NraXBzKys7CiAgICB9CiNlbmRpZgoKICAgIGJlc3Rfc2l6ZSArPSBTVFJJUF9IRUFERVJfU0laRTsKICAgIG1lbWNweShidWYsIHMtPnN0cmlwX2J1ZiwgYmVzdF9zaXplKTsKCiAgICByZXR1cm4gYmVzdF9zaXplOwp9CgpzdGF0aWMgaW50IHdyaXRlX2N2aWRfaGVhZGVyKENpbmVwYWtFbmNDb250ZXh0ICpzLCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBudW1fc3RyaXBzLCBpbnQgZGF0YV9zaXplLCBpbnQgaXNha2V5ZnJhbWUpCnsKICAgIGJ1ZlswXSA9IGlzYWtleWZyYW1lID8gMCA6IDE7CiAgICBBVl9XQjI0KCZidWZbMV0sIGRhdGFfc2l6ZSArIENWSURfSEVBREVSX1NJWkUpOwogICAgQVZfV0IxNigmYnVmWzRdLCBzLT53KTsKICAgIEFWX1dCMTYoJmJ1Zls2XSwgcy0+aCk7CiAgICBBVl9XQjE2KCZidWZbOF0sIG51bV9zdHJpcHMpOwoKICAgIHJldHVybiBDVklEX0hFQURFUl9TSVpFOwp9CgpzdGF0aWMgaW50IHJkX2ZyYW1lKENpbmVwYWtFbmNDb250ZXh0ICpzLCBjb25zdCBBVkZyYW1lICpmcmFtZSwgaW50IGlzYWtleWZyYW1lLCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBidWZfc2l6ZSkKewogICAgaW50IG51bV9zdHJpcHMsIHN0cmlwLCBpLCB5LCBuZXh0eSwgc2l6ZSwgdGVtcF9zaXplLCBiZXN0X3NpemU7CiAgICBBVlBpY3R1cmUgbGFzdF9waWN0LCBwaWN0LCBzY3JhdGNoX3BpY3Q7CiAgICBpbnQ2NF90IGJlc3Rfc2NvcmUgPSAwLCBzY29yZSwgc2NvcmVfdGVtcDsKI2lmZGVmIENJTkVQQUtfUkVQT1JUX1NFUlIKICAgIGludDY0X3QgYmVzdF9zZXJyID0gMCwgc2Vyciwgc2Vycl90ZW1wOwojZW5kaWYKCiAgICBpbnQgYmVzdF9uc3RyaXBzOwoKICAgIGlmKHMtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9SR0IyNCkgewogICAgICAgIGludCB4OwovLyBidWlsZCBhIGNvcHkgb2YgdGhlIGdpdmVuIGZyYW1lIGluIHRoZSBjb3JyZWN0IGNvbG9yc3BhY2UKICAgICAgICBmb3IoeSA9IDA7IHkgPCBzLT5oOyB5ICs9IDIpIHsKICAgICAgICAgICAgZm9yKHggPSAwOyB4IDwgcy0+dzsgeCArPSAyKSB7CiAgICAgICAgICAgICAgICB1aW50OF90ICppclsyXTsgaW50MzJfdCByLCBnLCBiLCByciwgZ2csIGJiOwogICAgICAgICAgICAgICAgaXJbMF0gPSAoKEFWUGljdHVyZSopZnJhbWUpLT5kYXRhWzBdICsgeCozICsgeSooKEFWUGljdHVyZSopZnJhbWUpLT5saW5lc2l6ZVswXTsKICAgICAgICAgICAgICAgIGlyWzFdID0gaXJbMF0gKyAoKEFWUGljdHVyZSopZnJhbWUpLT5saW5lc2l6ZVswXTsKICAgICAgICAgICAgICAgIGdldF9zdWJfcGljdHVyZShzLCB4LCB5LCAoQVZQaWN0dXJlKilzLT5pbnB1dF9mcmFtZSwgJnNjcmF0Y2hfcGljdCk7CiAgICAgICAgICAgICAgICByID0gZyA9IGIgPSAwOwogICAgICAgICAgICAgICAgZm9yKGk9MDsgaTw0OyArK2kpIHsKICAgICAgICAgICAgICAgICAgICBpbnQgaTEsIGkyOwogICAgICAgICAgICAgICAgICAgIGkxID0gKGkmMSk7IGkyID0gKGk+PTIpOwogICAgICAgICAgICAgICAgICAgIHJyID0gaXJbaTJdW2kxKjMrMF07CiAgICAgICAgICAgICAgICAgICAgZ2cgPSBpcltpMl1baTEqMysxXTsKICAgICAgICAgICAgICAgICAgICBiYiA9IGlyW2kyXVtpMSozKzJdOwogICAgICAgICAgICAgICAgICAgIHIgKz0gcnI7IGcgKz0gZ2c7IGIgKz0gYmI7Ci8vIHVzaW5nIGZpeGVkIHBvaW50IGFyaXRobWV0aWMgZm9yIHBvcnRhYmxlIHJlcGVhdGFiaWxpdHksIHNjYWxpbmcgYnkgMl4yMwovLyAiWSIKLy8gICAgICAgICAgICAgICAgICAgIHJyID0gMC4yODU3KnJyICsgMC41NzE0KmdnICsgMC4xNDI5KmJiOwogICAgICAgICAgICAgICAgICAgIHJyID0gKDIzOTY2MjUqcnIgKyA0NzkzMjUxKmdnICsgMTE5ODczMipiYikgPj4gMjM7CiAgICAgICAgICAgICAgICAgICAgaWYoICAgICAgcnIgPCAgIDApIHJyID0gICAwOwogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJyID4gMjU1KSByciA9IDI1NTsKICAgICAgICAgICAgICAgICAgICBzY3JhdGNoX3BpY3QuZGF0YVswXVtpMSArIGkyKnNjcmF0Y2hfcGljdC5saW5lc2l6ZVswXV0gPSBycjsKICAgICAgICAgICAgICAgIH0KLy8gbGV0IHVzIHNjYWxlIGRvd24gYXMgbGF0ZSBhcyBwb3NzaWJsZQovLyAgICAgICAgICAgICAgICByIC89IDQ7IGcgLz0gNDsgYiAvPSA0OwovLyAiVSIKLy8gICAgICAgICAgICAgICAgcnIgPSAtMC4xNDI5KnIgLSAwLjI4NTcqZyArIDAuNDI4NipiOwogICAgICAgICAgICAgICAgcnIgPSAoLTI5OTY4MypyIC0gNTk5MTU2KmcgKyA4OTg4MzkqYikgPj4gMjM7CiAgICAgICAgICAgICAgICBpZiggICAgICByciA8IC0xMjgpIHJyID0gLTEyODsKICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJyID4gIDEyNykgcnIgPSAgMTI3OwogICAgICAgICAgICAgICAgc2NyYXRjaF9waWN0LmRhdGFbMV1bMF0gPSByciArIDEyODsgLy8gcXVhbnRpemUgbmVlZHMgdW5zaWduZWQKLy8gIlYiCi8vICAgICAgICAgICAgICAgIHJyID0gMC4zNTcxKnIgLSAwLjI4NTcqZyAtIDAuMDcxNCpiOwogICAgICAgICAgICAgICAgcnIgPSAoNzQ4ODkzKnIgLSA1OTkxNTYqZyAtIDE0OTczNypiKSA+PiAyMzsKICAgICAgICAgICAgICAgIGlmKCAgICAgIHJyIDwgLTEyOCkgcnIgPSAtMTI4OwogICAgICAgICAgICAgICAgZWxzZSBpZiAocnIgPiAgMTI3KSByciA9ICAxMjc7CiAgICAgICAgICAgICAgICBzY3JhdGNoX3BpY3QuZGF0YVsyXVswXSA9IHJyICsgMTI4OyAvLyBxdWFudGl6ZSBuZWVkcyB1bnNpZ25lZAogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIC8vd291bGQgYmUgbmljZSBidXQgcXVpdGUgY2VydGFpbmx5IGluY29tcGF0aWJsZSB3aXRoIHZpbnRhZ2UgcGxheWVyczoKICAgIC8vIHN1cHBvcnQgZW5jb2RpbmcgemVybyBzdHJpcHMgKG1lYW5pbmcgc2tpcCB0aGUgd2hvbGUgZnJhbWUpCiAgICBmb3IobnVtX3N0cmlwcyA9IHMtPm1pbl9zdHJpcHM7IG51bV9zdHJpcHMgPD0gcy0+bWF4X3N0cmlwcyAmJiBudW1fc3RyaXBzIDw9IHMtPmggLyBNQl9TSVpFOyBudW1fc3RyaXBzKyspIHsKICAgICAgICBzY29yZSA9IDA7CiAgICAgICAgc2l6ZSA9IDA7CiNpZmRlZiBDSU5FUEFLX1JFUE9SVF9TRVJSCiAgICAgICAgc2VyciA9IDA7CiNlbmRpZgoKICAgICAgICBmb3IoeSA9IDAsIHN0cmlwID0gMTsgeSA8IHMtPmg7IHN0cmlwKyssIHkgPSBuZXh0eSkgewogICAgICAgICAgICBpbnQgc3RyaXBfaGVpZ2h0OwoKICAgICAgICAgICAgbmV4dHkgPSBzdHJpcCAqIHMtPmggLyBudW1fc3RyaXBzOyAvLyA8PSBzLT5oCiAgICAgICAgICAgIC8vbWFrZSBuZXh0eSB0aGUgbmV4dCBtdWx0aXBsZSBvZiA0IGlmIG5vdCBhbHJlYWR5IHRoZXJlCiAgICAgICAgICAgIGlmKG5leHR5ICYgMykKICAgICAgICAgICAgICAgIG5leHR5ICs9IDQgLSAobmV4dHkgJiAzKTsKCiAgICAgICAgICAgIHN0cmlwX2hlaWdodCA9IG5leHR5IC0geTsKICAgICAgICAgICAgaWYoc3RyaXBfaGVpZ2h0IDw9IDApIHsgLy8gY2FuIHRoaXMgZXZlciBoYXBwZW4/CiAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19JTkZPLCAic2tpcHBpbmcgemVybyBoZWlnaHQgc3RyaXAgJWkgb2YgJWlcbiIsIHN0cmlwLCBudW1fc3RyaXBzKTsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZihzLT5waXhfZm10ID09IEFWX1BJWF9GTVRfUkdCMjQpCiAgICAgICAgICAgICAgICBnZXRfc3ViX3BpY3R1cmUocywgMCwgeSwgKEFWUGljdHVyZSopcy0+aW5wdXRfZnJhbWUsICAgICZwaWN0KTsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgZ2V0X3N1Yl9waWN0dXJlKHMsIDAsIHksIChBVlBpY3R1cmUqKWZyYW1lLCAgICAgICAgICAgICAgJnBpY3QpOwogICAgICAgICAgICBnZXRfc3ViX3BpY3R1cmUocywgMCwgeSwgKEFWUGljdHVyZSopcy0+bGFzdF9mcmFtZSwgICAgJmxhc3RfcGljdCk7CiAgICAgICAgICAgIGdldF9zdWJfcGljdHVyZShzLCAwLCB5LCAoQVZQaWN0dXJlKilzLT5zY3JhdGNoX2ZyYW1lLCAmc2NyYXRjaF9waWN0KTsKCiAgICAgICAgICAgIGlmKCh0ZW1wX3NpemUgPSByZF9zdHJpcChzLCB5LCBzdHJpcF9oZWlnaHQsIGlzYWtleWZyYW1lLCAmbGFzdF9waWN0LCAmcGljdCwgJnNjcmF0Y2hfcGljdCwgcy0+ZnJhbWVfYnVmICsgc2l6ZSArIENWSURfSEVBREVSX1NJWkUsICZzY29yZV90ZW1wCiNpZmRlZiBDSU5FUEFLX1JFUE9SVF9TRVJSCiwgJnNlcnJfdGVtcAojZW5kaWYKKSkgPCAwKQogICAgICAgICAgICAgICAgcmV0dXJuIHRlbXBfc2l6ZTsKCiAgICAgICAgICAgIHNjb3JlICs9IHNjb3JlX3RlbXA7CiNpZmRlZiBDSU5FUEFLX1JFUE9SVF9TRVJSCiAgICAgICAgICAgIHNlcnIgKz0gc2Vycl90ZW1wOwojZW5kaWYKICAgICAgICAgICAgc2l6ZSArPSB0ZW1wX3NpemU7CiAgICAgICAgICAgIC8vYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfSU5GTywgInN0cmlwICVkLCBpc2FrZXlmcmFtZT0lZCIsIHN0cmlwLCBpc2FrZXlmcmFtZSk7CiAgICAgICAgICAgIC8vYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfSU5GTywgIlxuIik7CiAgICAgICAgfQoKICAgICAgICBpZihiZXN0X3Njb3JlID09IDAgfHwgc2NvcmUgPCBiZXN0X3Njb3JlKSB7CiAgICAgICAgICAgIGJlc3Rfc2NvcmUgPSBzY29yZTsKI2lmZGVmIENJTkVQQUtfUkVQT1JUX1NFUlIKICAgICAgICAgICAgYmVzdF9zZXJyID0gc2VycjsKI2VuZGlmCiAgICAgICAgICAgIGJlc3Rfc2l6ZSA9IHNpemUgKyB3cml0ZV9jdmlkX2hlYWRlcihzLCBzLT5mcmFtZV9idWYsIG51bV9zdHJpcHMsIHNpemUsIGlzYWtleWZyYW1lKTsKICAgICAgICAgICAgLy9hdl9sb2cocy0+YXZjdHgsIEFWX0xPR19JTkZPLCAiYmVzdCBudW1iZXIgb2Ygc3RyaXBzIHNvIGZhcjogJTJpLCAlMTJsbGksICVpIEJcbiIsIG51bV9zdHJpcHMsIChsb25nIGxvbmcgaW50KXNjb3JlLCBiZXN0X3NpemUpOwojaWZkZWYgQ0lORVBBS19SRVBPUlRfU0VSUgogICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19JTkZPLCAiYmVzdCBudW1iZXIgb2Ygc3RyaXBzIHNvIGZhcjogJTJpLCAlMTJsbGksICVpIEJcbiIsIG51bV9zdHJpcHMsIChsb25nIGxvbmcgaW50KXNlcnIsIGJlc3Rfc2l6ZSk7CiNlbmRpZgoKICAgICAgICAgICAgRkZTV0FQKEFWRnJhbWUgKiwgcy0+YmVzdF9mcmFtZSwgcy0+c2NyYXRjaF9mcmFtZSk7CiAgICAgICAgICAgIG1lbWNweShidWYsIHMtPmZyYW1lX2J1ZiwgYmVzdF9zaXplKTsKICAgICAgICAgICAgYmVzdF9uc3RyaXBzID0gbnVtX3N0cmlwczsKICAgICAgICB9Ci8vIGF2b2lkIHRyeWluZyB0b28gbWFueSBzdHJpcCBudW1iZXJzIHdpdGhvdXQgYSByZWFsIHJlYXNvbgovLyAodGhpcyBtYWtlcyB0aGUgcHJvY2Vzc2luZyBvZiB0aGUgdmVyeSBmaXJzdCBmcmFtZSBmYXN0ZXIpCiAgICAgICAgaWYobnVtX3N0cmlwcyAtIGJlc3RfbnN0cmlwcyA+IDQpCiAgICAgICAgICAgIGJyZWFrOwogICAgfQoKLy8gbGV0IHRoZSBudW1iZXIgb2Ygc3RyaXBzIHNsb3dseSBhZGFwdCB0byB0aGUgY2hhbmdlcyBpbiB0aGUgY29udGVudHMsCi8vIGNvbXBhcmVkIHRvIGZ1bGwgYnJ1dGVmb3JjaW5nIGV2ZXJ5IHRpbWUgdGhpcyB3aWxsIG9jY2FzaW9uYWxseSBsZWFkCi8vIHRvIHNvbWUgci9kIHBlcmZvcm1hbmNlIGxvc3MgYnV0IG1ha2VzIGVuY29kaW5nIHVwIHRvIHNldmVyYWwgdGltZXMgZmFzdGVyCiAgICBpZighcy0+c3RyaXBfbnVtYmVyX2RlbHRhX3JhbmdlKSB7CiAgICAgICAgaWYoYmVzdF9uc3RyaXBzID09IHMtPm1heF9zdHJpcHMpIHsgLy8gbGV0IHVzIHRyeSB0byBzdGVwIHVwCiAgICAgICAgICAgIHMtPm1heF9zdHJpcHMgPSBiZXN0X25zdHJpcHMgKyAxOwogICAgICAgICAgICBpZihzLT5tYXhfc3RyaXBzID49IHMtPm1heF9tYXhfc3RyaXBzKQogICAgICAgICAgICAgICAgcy0+bWF4X3N0cmlwcyA9IHMtPm1heF9tYXhfc3RyaXBzOwogICAgICAgIH0gZWxzZSB7IC8vIHRyeSB0byBzdGVwIGRvd24KICAgICAgICAgICAgcy0+bWF4X3N0cmlwcyA9IGJlc3RfbnN0cmlwczsKICAgICAgICB9CiAgICAgICAgcy0+bWluX3N0cmlwcyA9IHMtPm1heF9zdHJpcHMgLSAxOwogICAgICAgIGlmKHMtPm1pbl9zdHJpcHMgPCBzLT5taW5fbWluX3N0cmlwcykKICAgICAgICAgICAgcy0+bWluX3N0cmlwcyA9IHMtPm1pbl9taW5fc3RyaXBzOwogICAgfSBlbHNlIHsKICAgICAgICBzLT5tYXhfc3RyaXBzID0gYmVzdF9uc3RyaXBzICsgcy0+c3RyaXBfbnVtYmVyX2RlbHRhX3JhbmdlOwogICAgICAgIGlmKHMtPm1heF9zdHJpcHMgPj0gcy0+bWF4X21heF9zdHJpcHMpCiAgICAgICAgICAgIHMtPm1heF9zdHJpcHMgPSBzLT5tYXhfbWF4X3N0cmlwczsKICAgICAgICBzLT5taW5fc3RyaXBzID0gYmVzdF9uc3RyaXBzIC0gcy0+c3RyaXBfbnVtYmVyX2RlbHRhX3JhbmdlOwogICAgICAgIGlmKHMtPm1pbl9zdHJpcHMgPCBzLT5taW5fbWluX3N0cmlwcykKICAgICAgICAgICAgcy0+bWluX3N0cmlwcyA9IHMtPm1pbl9taW5fc3RyaXBzOwogICAgfQoKICAgIHJldHVybiBiZXN0X3NpemU7Cn0KCnN0YXRpYyBpbnQgY2luZXBha19lbmNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBBVlBhY2tldCAqcGt0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFWRnJhbWUgKmZyYW1lLCBpbnQgKmdvdF9wYWNrZXQpCnsKICAgIENpbmVwYWtFbmNDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKICAgIGludCByZXQ7CgogICAgcy0+bGFtYmRhID0gZnJhbWUtPnF1YWxpdHkgPyBmcmFtZS0+cXVhbGl0eSAtIDEgOiAyICogRkZfTEFNQkRBX1NDQUxFOwoKICAgIGlmICgocmV0ID0gZmZfYWxsb2NfcGFja2V0MihhdmN0eCwgcGt0LCBzLT5mcmFtZV9idWZfc2l6ZSkpIDwgMCkKICAgICAgICByZXR1cm4gcmV0OwogICAgcmV0ID0gcmRfZnJhbWUocywgZnJhbWUsIChzLT5jdXJmcmFtZSA9PSAwKSwgcGt0LT5kYXRhLCBzLT5mcmFtZV9idWZfc2l6ZSk7CiAgICBwa3QtPnNpemUgPSByZXQ7CiAgICBpZiAocy0+Y3VyZnJhbWUgPT0gMCkKICAgICAgICBwa3QtPmZsYWdzIHw9IEFWX1BLVF9GTEFHX0tFWTsKICAgICpnb3RfcGFja2V0ID0gMTsKCiAgICBhdmN0eC0+Y29kZWRfZnJhbWUgPSBmcmFtZTsKCiAgICBGRlNXQVAoQVZGcmFtZSAqLCBzLT5sYXN0X2ZyYW1lLCBzLT5iZXN0X2ZyYW1lKTsKCiAgICBpZiAoKytzLT5jdXJmcmFtZSA+PSBzLT5rZXlpbnQpCiAgICAgICAgcy0+Y3VyZnJhbWUgPSAwOwoKICAgIHJldHVybiAwOwp9CgpzdGF0aWMgYXZfY29sZCBpbnQgY2luZXBha19lbmNvZGVfZW5kKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKewogICAgQ2luZXBha0VuY0NvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOwogICAgaW50IHg7CgogICAgYXZfZnJhbWVfZnJlZSgmcy0+bGFzdF9mcmFtZSk7CiAgICBhdl9mcmFtZV9mcmVlKCZzLT5iZXN0X2ZyYW1lKTsKICAgIGF2X2ZyYW1lX2ZyZWUoJnMtPnNjcmF0Y2hfZnJhbWUpOwogICAgaWYgKGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfUkdCMjQpCiAgICAgICAgYXZfZnJhbWVfZnJlZSgmcy0+aW5wdXRfZnJhbWUpOwogICAgYXZfZnJlZXAoJnMtPmNvZGVib29rX2lucHV0KTsKICAgIGF2X2ZyZWVwKCZzLT5jb2RlYm9va19jbG9zZXN0KTsKICAgIGF2X2ZyZWVwKCZzLT5zdHJpcF9idWYpOwogICAgYXZfZnJlZXAoJnMtPmZyYW1lX2J1Zik7CiAgICBhdl9mcmVlcCgmcy0+bWIpOwojaWZkZWYgQ0lORVBBS0VOQ19ERUJVRwogICAgYXZfZnJlZXAoJnMtPmJlc3RfbWIpOwojZW5kaWYKCiAgICBmb3IoeCA9IDA7IHggPCAoYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9SR0IyNCA/IDQgOiAzKTsgeCsrKQogICAgICAgIGF2X2ZyZWVwKCZzLT5waWN0X2J1ZnNbeF0pOwoKI2lmZGVmIENJTkVQQUtFTkNfREVCVUcKICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0lORk8sICJzdHJpcCBjb2Rpbmcgc3RhdHM6ICVpIFYxIG1vZGUsICVpIFY0IG1vZGUsICVpIE1DIG1vZGUgKCVpIFYxIGVuY3MsICVpIFY0IGVuY3MsICVpIHNraXBzKVxuIiwKICAgICAgICBzLT5udW1fdjFfbW9kZSwgcy0+bnVtX3Y0X21vZGUsIHMtPm51bV9tY19tb2RlLCBzLT5udW1fdjFfZW5jcywgcy0+bnVtX3Y0X2VuY3MsIHMtPm51bV9za2lwcyk7CiNlbmRpZgoKICAgIHJldHVybiAwOwp9CgpBVkNvZGVjIGZmX2NpbmVwYWtfZW5jb2RlciA9IHsKICAgIC5uYW1lICAgICAgICAgICA9ICJjaW5lcGFrIiwKICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX0NJTkVQQUssCiAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoQ2luZXBha0VuY0NvbnRleHQpLAogICAgLmluaXQgICAgICAgICAgID0gY2luZXBha19lbmNvZGVfaW5pdCwKICAgIC5lbmNvZGUyICAgICAgICA9IGNpbmVwYWtfZW5jb2RlX2ZyYW1lLAogICAgLmNsb3NlICAgICAgICAgID0gY2luZXBha19lbmNvZGVfZW5kLAogICAgLnBpeF9mbXRzICAgICAgID0gKGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdFtdKXtBVl9QSVhfRk1UX1JHQjI0LCBBVl9QSVhfRk1UX0dSQVk4LCBBVl9QSVhfRk1UX05PTkV9LAogICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkNpbmVwYWsgLyBDVklEIiksCiAgICAucHJpdl9jbGFzcyAgICAgPSAmY2luZXBha19jbGFzcywKfTsK