LyoKICogIEludGVyZmFjZXMgTUlCIGdyb3VwIGltcGxlbWVudGF0aW9uIC0gaW50ZXJmYWNlcy5jCiAqCiAqLwoKLyogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29weXJpZ2h0KHMpLiAgU2VlCiAqIHRoZSBOZXQtU05NUCdzIENPUFlJTkcgZmlsZSBmb3IgbW9yZSBkZXRhaWxzIGFuZCBvdGhlciBjb3B5cmlnaHRzCiAqIHRoYXQgbWF5IGFwcGx5OgogKi8KLyoKICogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBjb3B5cmlnaHRlZCBieToKICogQ29weXJpZ2h0IKkgMjAwMyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqIFVzZSBpcyBzdWJqZWN0IHRvIGxpY2Vuc2UgdGVybXMgc3BlY2lmaWVkIGluIHRoZSBDT1BZSU5HIGZpbGUKICogZGlzdHJpYnV0ZWQgd2l0aCB0aGUgTmV0LVNOTVAgcGFja2FnZS4KICovCgojaW5jbHVkZSA8bmV0LXNubXAvbmV0LXNubXAtY29uZmlnLmg+CgojaWYgZGVmaW5lZChORVRTTk1QX0lGTkVUX05FRURTX0tFUk5FTCkgJiYgIWRlZmluZWQoX0tFUk5FTCkgJiYgIWRlZmluZWQoTkVUU05NUF9JRk5FVF9ORUVEU19LRVJORUxfTEFURSkKI2RlZmluZSBfS0VSTkVMIDEKI2RlZmluZSBfSV9ERUZJTkVEX0tFUk5FTAojZW5kaWYKCiNpZiBIQVZFX1NUUklOR19ICiNpbmNsdWRlIDxzdHJpbmcuaD4KI2Vsc2UKI2luY2x1ZGUgPHN0cmluZ3MuaD4KI2VuZGlmCgojaWYgSEFWRV9TVERMSUJfSAojaW5jbHVkZSA8c3RkbGliLmg+CiNlbmRpZgojaWYgSEFWRV9VTklTVERfSAojaW5jbHVkZSA8dW5pc3RkLmg+CiNlbmRpZgojaWYgSEFWRV9TWVNfUEFSQU1fSAojaW5jbHVkZSA8c3lzL3BhcmFtLmg+CiNlbmRpZgojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNpZiBIQVZFX1dJTlNPQ0tfSAojaW5jbHVkZSA8d2luc29jay5oPgojZW5kaWYKI2lmIGRlZmluZWQoTkVUU05NUF9JRk5FVF9ORUVEU19LRVJORUwpICYmICFkZWZpbmVkKF9LRVJORUwpICYmIGRlZmluZWQoTkVUU05NUF9JRk5FVF9ORUVEU19LRVJORUxfTEFURSkKI2RlZmluZSBfS0VSTkVMIDEKI2RlZmluZSBfSV9ERUZJTkVEX0tFUk5FTAojZW5kaWYKI2lmIEhBVkVfU1lTX1NPQ0tFVF9ICiNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CiNlbmRpZgojaWZuZGVmIFNUUkVBTV9ORUVEU19LRVJORUxfSVNMQU5EUwojaWYgSEFWRV9TWVNfU1RSRUFNX0gKI2luY2x1ZGUgPHN5cy9zdHJlYW0uaD4KI2VuZGlmCiNlbmRpZgojaWYgSEFWRV9TWVNfU09DS0VUVkFSX0gKI2luY2x1ZGUgPHN5cy9zb2NrZXR2YXIuaD4KI2VuZGlmCgojaWYgVElNRV9XSVRIX1NZU19USU1FCiMgaWYgZGVmaW5lZCAoV0lOMzIpIHx8IGRlZmluZWQgKGN5Z3dpbikKIyAgaW5jbHVkZSA8c3lzL3RpbWViLmg+CiMgZWxzZQojIGluY2x1ZGUgPHN5cy90aW1lLmg+CiMgZW5kaWYKIyBpbmNsdWRlIDx0aW1lLmg+CiNlbHNlCiMgaWYgSEFWRV9TWVNfVElNRV9ICiMgIGluY2x1ZGUgPHN5cy90aW1lLmg+CiMgZWxzZQojICBpbmNsdWRlIDx0aW1lLmg+CiMgZW5kaWYKI2VuZGlmCiNpZiBIQVZFX1NZU19TT0NLSU9fSAojaW5jbHVkZSA8c3lzL3NvY2tpby5oPgojZW5kaWYKI2lmIEhBVkVfRkNOVExfSAojaW5jbHVkZSA8ZmNudGwuaD4KI2VuZGlmCiNpZiBIQVZFX1NZU19JT0NUTF9ICiNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KI2VuZGlmCiNpZiBIQVZFX05FVElORVRfSU5fSAojaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgojZW5kaWYKI2lmIEhBVkVfTkVUX0lGX0gKI2luY2x1ZGUgPG5ldC9pZi5oPgojZW5kaWYKI2lmIEhBVkVfTkVUSU5FVF9JTl9WQVJfSAojaW5jbHVkZSA8bmV0aW5ldC9pbl92YXIuaD4KI2VuZGlmCiNpZiBIQVZFX05FVF9JRl9WQVJfSAojaW5jbHVkZSA8bmV0L2lmX3Zhci5oPgojZW5kaWYKI2lmZGVmIF9JX0RFRklORURfS0VSTkVMCiN1bmRlZiBfS0VSTkVMCiNlbmRpZgojaWZkZWYgU1RSRUFNX05FRURTX0tFUk5FTF9JU0xBTkRTCiNpZiBIQVZFX1NZU19TVFJFQU1fSAojaW5jbHVkZSA8c3lzL3N0cmVhbS5oPgojZW5kaWYKI2VuZGlmCiNpZiBIQVZFX05FVF9ST1VURV9ICiNpbmNsdWRlIDxuZXQvcm91dGUuaD4KI2VuZGlmCiNpZiBIQVZFX05FVElORVRfSU5fU1lTVE1fSAojaW5jbHVkZSA8bmV0aW5ldC9pbl9zeXN0bS5oPgojZW5kaWYKI2lmIEhBVkVfU1lTX0hBU0hJTkdfSAojaW5jbHVkZSA8c3lzL2hhc2hpbmcuaD4KI2VuZGlmCiNpZiBIQVZFX05FVElORVRfSU5fVkFSX0gKI2luY2x1ZGUgPG5ldGluZXQvaW5fdmFyLmg+CiNlbmRpZgojaWYgSEFWRV9ORVRJTkVUX0lQX0gKI2luY2x1ZGUgPG5ldGluZXQvaXAuaD4KI2VuZGlmCiNpZmRlZiBORVRTTk1QX0VOQUJMRV9JUFY2CiNpZiBIQVZFX05FVElORVRfSVA2X0gKI2luY2x1ZGUgPG5ldGluZXQvaXA2Lmg+CiNlbmRpZgojZW5kaWYKI2lmIEhBVkVfU1lTX1FVRVVFX0gKI2luY2x1ZGUgPHN5cy9xdWV1ZS5oPgojZW5kaWYKI2lmIEhBVkVfTkVUSU5FVF9JUF9WQVJfSAojaW5jbHVkZSA8bmV0aW5ldC9pcF92YXIuaD4KI2VuZGlmCiNpZmRlZiBORVRTTk1QX0VOQUJMRV9JUFY2CiNpZiBIQVZFX05FVE5FVFNOTVBfRU5BQkxFX0lQVjZfSVA2X1ZBUl9ICiNpbmNsdWRlIDxuZXRpbmV0Ni9pcDZfdmFyLmg+CiNlbmRpZgojZW5kaWYKI2lmIEhBVkVfTkVUSU5FVF9JTl9QQ0JfSAojaW5jbHVkZSA8bmV0aW5ldC9pbl9wY2IuaD4KI2VuZGlmCiNpZiBIQVZFX05FVElORVRfSUZfRVRIRVJfSAojaW5jbHVkZSA8bmV0aW5ldC9pZl9ldGhlci5oPgojZW5kaWYKI2lmIEhBVkVfTkVUX0lGX1RZUEVTX0gKI2luY2x1ZGUgPG5ldC9pZl90eXBlcy5oPgojZW5kaWYKI2lmIEhBVkVfTkVUX0lGX0RMX0gKI2lmbmRlZiBkeW5peAojaW5jbHVkZSA8bmV0L2lmX2RsLmg+CiNlbHNlCiNpbmNsdWRlIDxzeXMvbmV0L2lmX2RsLmg+CiNlbmRpZgojZW5kaWYKI2lmIEhBVkVfSU5FVF9NSUIyX0gKI2luY2x1ZGUgPGluZXQvbWliMi5oPgojZW5kaWYKI2lmIEhBVkVfSU9DVExTX0gKI2luY2x1ZGUgPGlvY3Rscy5oPgojZW5kaWYKCiNpZmRlZiBzb2xhcmlzMgojIGluY2x1ZGUgPGVycm5vLmg+CiNpbmNsdWRlICJrZXJuZWxfc3Vub3M1LmgiCiNlbHNlCiNpbmNsdWRlICJrZXJuZWwuaCIKI2VuZGlmCgojaWZkZWYgaHB1eAojaW5jbHVkZSA8c3lzL21pYi5oPgojaW5jbHVkZSA8bmV0aW5ldC9taWJfa2Vybi5oPgojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGhwdXggKi8KCiNpZmRlZiBjeWd3aW4KI2luY2x1ZGUgPHdpbmRvd3MuaD4KI2VuZGlmCgojaWYgSEFWRV9TWVNfU1lTQ1RMX0gKI2luY2x1ZGUgPHN5cy9zeXNjdGwuaD4KCiNpZiBkZWZpbmVkKGZyZWVic2QzKSB8fCBkZWZpbmVkKGZyZWVic2Q0KSB8fCBkZWZpbmVkKGZyZWVic2Q1KQojICAgIGRlZmluZSBVU0VfU1lTQ1RMX0lGTElTVAojZWxzZQojIGlmIGRlZmluZWQoQ1RMX05FVCkgJiYgIWRlZmluZWQoZnJlZWJzZDIpICYmICFkZWZpbmVkKG5ldGJzZDEpCiMgIGlmZGVmIFBGX1JPVVRFCiMgICBpZmRlZiBORVRfUlRfSUZMSVNUCiMgICAgaWZuZGVmIG5ldGJzZDEKIyAgICAgZGVmaW5lIFVTRV9TWVNDVExfSUZMSVNUCiMgICAgZW5kaWYKIyAgIGVuZGlmCiMgIGVuZGlmCiMgZW5kaWYKI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkZWZpbmVkKGZyZWVic2QzKSAqLwojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEhBVkVfU1lTX1NZU0NUTF9IICovCgojaWYgSEFWRV9PU1JFTERBVEVfSAojaW5jbHVkZSA8b3NyZWxkYXRlLmg+CiNlbmRpZgojaWZkZWYgTkVUU05NUF9DQU5fVVNFX1NZU0NUTAojaW5jbHVkZSA8c3lzL3N5c2N0bC5oPgojZW5kaWYKCiNpbmNsdWRlIDxuZXQtc25tcC9uZXQtc25tcC1pbmNsdWRlcy5oPgojaW5jbHVkZSA8bmV0LXNubXAvYWdlbnQvbmV0LXNubXAtYWdlbnQtaW5jbHVkZXMuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL2FnZW50L2F1dG9fbmxpc3QuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL2FnZW50L3N5c09SVGFibGUuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL2RhdGFfYWNjZXNzL2ludGVyZmFjZS5oPgoKI2luY2x1ZGUgImludGVyZmFjZXMuaCIKI2luY2x1ZGUgInN0cnVjdC5oIgojaW5jbHVkZSAidXRpbF9mdW5jcy9oZWFkZXJfZ2VuZXJpYy5oIgoKLyogaWYgeW91IHdhbnQgY2FjaGluZyBlbmFibGVkIGZvciBzcGVlZCByZXRyaXZhbCBwdXJwb3Nlcywgc2V0IHRoaXMgdG8gNT8qLwojZGVmaW5lIE1JTkxPQURGUkVRIDAgICAgICAgICAgICAgICAgICAgICAvKiBtaW4gcmVsb2FkIGZyZXF1ZW5jeSBpbiBzZWNvbmRzICovCiNpZmRlZiBsaW51eApzdGF0aWMgdW5zaWduZWQgbG9uZyBMYXN0TG9hZCA9IDA7ICAgICAgICAvKiBFVCBpbiBzZWNzIGF0IGxhc3QgdGFibGUgbG9hZCAqLwojZW5kaWYKCmV4dGVybiBzdHJ1Y3QgdGltZXZhbCBzdGFydHRpbWU7CgpzdHJ1Y3QgdmFyaWFibGUzIGludGVyZmFjZXNfdmFyaWFibGVzW10gPSB7CiAgICB7TkVUU05NUF9JRk5VTUJFUiwgQVNOX0lOVEVHRVIsIE5FVFNOTVBfT0xEQVBJX1JPTkxZLAogICAgIHZhcl9pbnRlcmZhY2VzLCAxLCB7MX19LAogICAge05FVFNOTVBfSUZJTkRFWCwgQVNOX0lOVEVHRVIsIE5FVFNOTVBfT0xEQVBJX1JPTkxZLAogICAgIHZhcl9pZkVudHJ5LCAzLCB7MiwgMSwgMX19LAogICAge05FVFNOTVBfSUZERVNDUiwgQVNOX09DVEVUX1NUUiwgTkVUU05NUF9PTERBUElfUk9OTFksCiAgICAgdmFyX2lmRW50cnksIDMsIHsyLCAxLCAyfX0sCiAgICB7TkVUU05NUF9JRlRZUEUsIEFTTl9JTlRFR0VSLCBORVRTTk1QX09MREFQSV9ST05MWSwKICAgICB2YXJfaWZFbnRyeSwgMywgezIsIDEsIDN9fSwKICAgIHtORVRTTk1QX0lGTVRVLCBBU05fSU5URUdFUiwgTkVUU05NUF9PTERBUElfUk9OTFksCiAgICAgdmFyX2lmRW50cnksIDMsIHsyLCAxLCA0fX0sCiAgICB7TkVUU05NUF9JRlNQRUVELCBBU05fR0FVR0UsIE5FVFNOTVBfT0xEQVBJX1JPTkxZLAogICAgIHZhcl9pZkVudHJ5LCAzLCB7MiwgMSwgNX19LAogICAge05FVFNOTVBfSUZQSFlTQUREUkVTUywgQVNOX09DVEVUX1NUUiwgTkVUU05NUF9PTERBUElfUk9OTFksCiAgICAgdmFyX2lmRW50cnksIDMsIHsyLCAxLCA2fX0sCiNpZiBkZWZpbmVkIChXSU4zMikgfHwgZGVmaW5lZCAoY3lnd2luKQogICAge05FVFNOTVBfSUZBRE1JTlNUQVRVUywgQVNOX0lOVEVHRVIsIE5FVFNOTVBfT0xEQVBJX1JXUklURSwKICAgICB2YXJfaWZFbnRyeSwgMywgezIsIDEsIDd9fSwKI2Vsc2UKICAgIHtORVRTTk1QX0lGQURNSU5TVEFUVVMsIEFTTl9JTlRFR0VSLCBORVRTTk1QX09MREFQSV9ST05MWSwKICAgICB2YXJfaWZFbnRyeSwgMywgezIsIDEsIDd9fSwKI2VuZGlmCiAgICB7TkVUU05NUF9JRk9QRVJTVEFUVVMsIEFTTl9JTlRFR0VSLCBORVRTTk1QX09MREFQSV9ST05MWSwKICAgICB2YXJfaWZFbnRyeSwgMywgezIsIDEsIDh9fSwKICAgIHtORVRTTk1QX0lGTEFTVENIQU5HRSwgQVNOX1RJTUVUSUNLUywgTkVUU05NUF9PTERBUElfUk9OTFksCiAgICAgdmFyX2lmRW50cnksIDMsIHsyLCAxLCA5fX0sCiAgICB7TkVUU05NUF9JRklOT0NURVRTLCBBU05fQ09VTlRFUiwgTkVUU05NUF9PTERBUElfUk9OTFksCiAgICAgdmFyX2lmRW50cnksIDMsIHsyLCAxLCAxMH19LAogICAge05FVFNOTVBfSUZJTlVDQVNUUEtUUywgQVNOX0NPVU5URVIsIE5FVFNOTVBfT0xEQVBJX1JPTkxZLAogICAgIHZhcl9pZkVudHJ5LCAzLCB7MiwgMSwgMTF9fSwKICAgIHtORVRTTk1QX0lGSU5OVUNBU1RQS1RTLCBBU05fQ09VTlRFUiwgTkVUU05NUF9PTERBUElfUk9OTFksCiAgICAgdmFyX2lmRW50cnksIDMsIHsyLCAxLCAxMn19LAogICAge05FVFNOTVBfSUZJTkRJU0NBUkRTLCBBU05fQ09VTlRFUiwgTkVUU05NUF9PTERBUElfUk9OTFksCiAgICAgdmFyX2lmRW50cnksIDMsIHsyLCAxLCAxM319LAogICAge05FVFNOTVBfSUZJTkVSUk9SUywgQVNOX0NPVU5URVIsIE5FVFNOTVBfT0xEQVBJX1JPTkxZLAogICAgIHZhcl9pZkVudHJ5LCAzLCB7MiwgMSwgMTR9fSwKICAgIHtORVRTTk1QX0lGSU5VTktOT1dOUFJPVE9TLCBBU05fQ09VTlRFUiwgTkVUU05NUF9PTERBUElfUk9OTFksCiAgICAgdmFyX2lmRW50cnksIDMsIHsyLCAxLCAxNX19LAogICAge05FVFNOTVBfSUZPVVRPQ1RFVFMsIEFTTl9DT1VOVEVSLCBORVRTTk1QX09MREFQSV9ST05MWSwKICAgICB2YXJfaWZFbnRyeSwgMywgezIsIDEsIDE2fX0sCiAgICB7TkVUU05NUF9JRk9VVFVDQVNUUEtUUywgQVNOX0NPVU5URVIsIE5FVFNOTVBfT0xEQVBJX1JPTkxZLAogICAgIHZhcl9pZkVudHJ5LCAzLCB7MiwgMSwgMTd9fSwKICAgIHtORVRTTk1QX0lGT1VUTlVDQVNUUEtUUywgQVNOX0NPVU5URVIsIE5FVFNOTVBfT0xEQVBJX1JPTkxZLAogICAgIHZhcl9pZkVudHJ5LCAzLCB7MiwgMSwgMTh9fSwKICAgIHtORVRTTk1QX0lGT1VURElTQ0FSRFMsIEFTTl9DT1VOVEVSLCBORVRTTk1QX09MREFQSV9ST05MWSwKICAgICB2YXJfaWZFbnRyeSwgMywgezIsIDEsIDE5fX0sCiAgICB7TkVUU05NUF9JRk9VVEVSUk9SUywgQVNOX0NPVU5URVIsIE5FVFNOTVBfT0xEQVBJX1JPTkxZLAogICAgIHZhcl9pZkVudHJ5LCAzLCB7MiwgMSwgMjB9fSwKICAgIHtORVRTTk1QX0lGT1VUUUxFTiwgQVNOX0dBVUdFLCBORVRTTk1QX09MREFQSV9ST05MWSwKICAgICB2YXJfaWZFbnRyeSwgMywgezIsIDEsIDIxfX0sCiAgICB7TkVUU05NUF9JRlNQRUNJRklDLCBBU05fT0JKRUNUX0lELCBORVRTTk1QX09MREFQSV9ST05MWSwKICAgICB2YXJfaWZFbnRyeSwgMywgezIsIDEsIDIyfX0KfTsKCi8qCiAqIERlZmluZSB0aGUgT0lEIHBvaW50ZXIgdG8gdGhlIHRvcCBvZiB0aGUgbWliIHRyZWUgdGhhdCB3ZSdyZQogKiByZWdpc3RlcmluZyB1bmRlcm5lYXRoLCBhbmQgdGhlIE9JRCBvZiB0aGUgTUlCIG1vZHVsZSAKICovCm9pZCAgICAgICAgICAgICBpbnRlcmZhY2VzX3ZhcmlhYmxlc19vaWRbXSA9IHsgU05NUF9PSURfTUlCMiwgMiB9OwpvaWQgICAgICAgICAgICAgaW50ZXJmYWNlc19tb2R1bGVfb2lkW10gPSB7IFNOTVBfT0lEX01JQjIsIDMxIH07Cgp2b2lkCmluaXRfaW50ZXJmYWNlcyh2b2lkKQp7CiAgICAvKgogICAgICogcmVnaXN0ZXIgb3Vyc2VsdmVzIHdpdGggdGhlIGFnZW50IHRvIGhhbmRsZSBvdXIgbWliIHRyZWUgCiAgICAgKi8KICAgIFJFR0lTVEVSX01JQigibWliSUkvaW50ZXJmYWNlcyIsIGludGVyZmFjZXNfdmFyaWFibGVzLCB2YXJpYWJsZTMsCiAgICAgICAgICAgICAgICAgaW50ZXJmYWNlc192YXJpYWJsZXNfb2lkKTsKICAgIFJFR0lTVEVSX1NZU09SX0VOVFJZKGludGVyZmFjZXNfbW9kdWxlX29pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgTUlCIG1vZHVsZSB0byBkZXNjcmliZSBnZW5lcmljIG9iamVjdHMgZm9yIG5ldHdvcmsgaW50ZXJmYWNlIHN1Yi1sYXllcnMiKTsKCiNpZm5kZWYgVVNFX1NZU0NUTF9JRkxJU1QKI2lmIEhBVkVfTkVUX0lGX01JQl9ICiAgICBpbml0X2ludGVyZmFjZXNfc2V0dXAoKTsKI2VuZGlmCiNlbmRpZgojaWZkZWYgc29sYXJpczIKICAgIGluaXRfa2VybmVsX3N1bm9zNSgpOwojZW5kaWYKfQoKI2lmZGVmIGxpbnV4Ci8qCiAqIGlmX3R5cGVfZnJvbV9uYW1lCiAqIFJldHVybiBpbnRlcmZhY2UgdHlwZSB1c2luZyB0aGUgaW50ZXJmYWNlIG5hbWUgYXMgYSBjbHVlLgogKiBSZXR1cm5zIDEgdG8gaW1wbHkgIm90aGVyIiB0eXBlIGlmIG5hbWUgbm90IHJlY29nbml6ZWQuIAogKi8Kc3RhdGljIGludAppZl90eXBlX2Zyb21fbmFtZShjb25zdCBjaGFyICpwY2NoKQp7CiAgICB0eXBlZGVmIHN0cnVjdCBfbWF0Y2hfaWYgewogICAgICAgIGludCAgICAgICAgICAgICBtaV90eXBlOwogICAgICAgIGNvbnN0IGNoYXIgICAgICptaV9uYW1lOwogICAgfSAgICAgICAgICAgICAgKnBtYXRjaF9pZiwgbWF0Y2hfaWY7CgogICAgc3RhdGljIG1hdGNoX2lmIGxtYXRjaF9pZltdID0gewogICAgICAgIHsyNCwgImxvIn0sCiAgICAgICAgezYsICJldGgifSwKICAgICAgICB7OSwgInRyIn0sCiAgICAgICAgezIzLCAicHBwIn0sCiAgICAgICAgezI4LCAic2wifSwKICAgICAgICB7MCwgMH0gICAgICAgICAgICAgICAgICAvKiBlbmQgb2YgbGlzdCAqLwogICAgfTsKCiAgICBpbnQgICAgICAgICAgICAgaWksIGxlbjsKICAgIHJlZ2lzdGVyIHBtYXRjaF9pZiBwbTsKCiAgICBmb3IgKGlpID0gMCwgcG0gPSBsbWF0Y2hfaWY7IHBtLT5taV9uYW1lOyBwbSsrKSB7CiAgICAgICAgbGVuID0gc3RybGVuKHBtLT5taV9uYW1lKTsKICAgICAgICBpZiAoMCA9PSBzdHJuY21wKHBjY2gsIHBtLT5taV9uYW1lLCBsZW4pKSB7CiAgICAgICAgICAgIHJldHVybiAocG0tPm1pX3R5cGUpOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAoMSk7ICAgICAgICAgICAgICAgICAvKiBpbiBjYXNlIHNlYXJjaCBmYWlscyAqLwp9CiNlbmRpZgoKCiNpZmRlZiBsaW51eApzdGF0aWMgc3RydWN0IGlmbmV0ICppZm5ldGFkZHJfbGlzdDsKI2VuZGlmCgoKLyoKICogaGVhZGVyX2lmRW50cnkoLi4uCiAqIEFyZ3VtZW50czoKICogdnAgICAgIElOICAgICAgLSBwb2ludGVyIHRvIHZhcmlhYmxlIGVudHJ5IHRoYXQgcG9pbnRzIGhlcmUKICogbmFtZSAgICBJTi9PVVQgIC0gSU4vbmFtZSByZXF1ZXN0ZWQsIE9VVC9uYW1lIGZvdW5kCiAqIGxlbmd0aCAgSU4vT1VUICAtIGxlbmd0aCBvZiBJTi9PVVQgb2lkJ3MgCiAqIGV4YWN0ICAgSU4gICAgICAtIFRSVUUgaWYgYW4gZXhhY3QgbWF0Y2ggd2FzIHJlcXVlc3RlZAogKiB2YXJfbGVuIE9VVCAgICAgLSBsZW5ndGggb2YgdmFyaWFibGUgb3IgMCBpZiBmdW5jdGlvbiByZXR1cm5lZAogKiB3cml0ZV9tZXRob2QKICogCiAqLwojaWYgIWRlZmluZWQgKFdJTjMyKSAmJiAhZGVmaW5lZCAoY3lnd2luKQpzdGF0aWMgaW50CmhlYWRlcl9pZkVudHJ5KHN0cnVjdCB2YXJpYWJsZSAqdnAsCiAgICAgICAgICAgICAgIG9pZCAqIG5hbWUsCiAgICAgICAgICAgICAgIHNpemVfdCAqIGxlbmd0aCwKICAgICAgICAgICAgICAgaW50IGV4YWN0LCBzaXplX3QgKiB2YXJfbGVuLCBXcml0ZU1ldGhvZCAqKiB3cml0ZV9tZXRob2QpCnsKI2RlZmluZSBJRkVOVFJZX05BTUVfTEVOR1RICTEwCiAgICBvaWQgICAgICAgICAgICAgbmV3bmFtZVtNQVhfT0lEX0xFTl07CiAgICByZWdpc3RlciBpbnQgICAgaW50ZXJmYWNlOwogICAgaW50ICAgICAgICAgICAgIHJlc3VsdCwgY291bnQ7CgogICAgREVCVUdNU0dUTCgoIm1pYklJL2ludGVyZmFjZXMiLCAidmFyX2lmRW50cnk6ICIpKTsKICAgIERFQlVHTVNHT0lEKCgibWliSUkvaW50ZXJmYWNlcyIsIG5hbWUsICpsZW5ndGgpKTsKICAgIERFQlVHTVNHKCgibWliSUkvaW50ZXJmYWNlcyIsICIgJWRcbiIsIGV4YWN0KSk7CgogICAgbWVtY3B5KChjaGFyICopIG5ld25hbWUsIChjaGFyICopIHZwLT5uYW1lLAogICAgICAgICAgIChpbnQpIHZwLT5uYW1lbGVuICogc2l6ZW9mKG9pZCkpOwogICAgLyoKICAgICAqIGZpbmQgIm5leHQiIGludGVyZmFjZSAKICAgICAqLwogICAgY291bnQgPSBJbnRlcmZhY2VfU2Nhbl9HZXRfQ291bnQoKTsKICAgIGZvciAoaW50ZXJmYWNlID0gMTsgaW50ZXJmYWNlIDw9IGNvdW50OyBpbnRlcmZhY2UrKykgewogICAgICAgIG5ld25hbWVbSUZFTlRSWV9OQU1FX0xFTkdUSF0gPSAob2lkKSBpbnRlcmZhY2U7CiAgICAgICAgcmVzdWx0ID0KICAgICAgICAgICAgc25tcF9vaWRfY29tcGFyZShuYW1lLCAqbGVuZ3RoLCBuZXduYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpIHZwLT5uYW1lbGVuICsgMSk7CiAgICAgICAgaWYgKChleGFjdCAmJiAocmVzdWx0ID09IDApKSB8fCAoIWV4YWN0ICYmIChyZXN1bHQgPCAwKSkpCiAgICAgICAgICAgIGJyZWFrOwogICAgfQogICAgaWYgKGludGVyZmFjZSA+IGNvdW50KSB7CiAgICAgICAgREVCVUdNU0dUTCgoIm1pYklJL2ludGVyZmFjZXMiLCAiLi4uIGluZGV4IG91dCBvZiByYW5nZVxuIikpOwogICAgICAgIHJldHVybiBNQVRDSF9GQUlMRUQ7CiAgICB9CgoKICAgIG1lbWNweSgoY2hhciAqKSBuYW1lLCAoY2hhciAqKSBuZXduYW1lLAogICAgICAgICAgICgoaW50KSB2cC0+bmFtZWxlbiArIDEpICogc2l6ZW9mKG9pZCkpOwogICAgKmxlbmd0aCA9IHZwLT5uYW1lbGVuICsgMTsKICAgICp3cml0ZV9tZXRob2QgPSAwOwogICAgKnZhcl9sZW4gPSBzaXplb2YobG9uZyk7ICAgIC8qIGRlZmF1bHQgdG8gJ2xvbmcnIHJlc3VsdHMgKi8KCiAgICBERUJVR01TR1RMKCgibWliSUkvaW50ZXJmYWNlcyIsICIuLi4gZ2V0IEkvRiBzdGF0cyAiKSk7CiAgICBERUJVR01TR09JRCgoIm1pYklJL2ludGVyZmFjZXMiLCBuYW1lLCAqbGVuZ3RoKSk7CiAgICBERUJVR01TRygoIm1pYklJL2ludGVyZmFjZXMiLCAiXG4iKSk7CgogICAgcmV0dXJuIGludGVyZmFjZTsKfQoKCgp1X2NoYXIgICAgICAgICAqCnZhcl9pbnRlcmZhY2VzKHN0cnVjdCB2YXJpYWJsZSAqIHZwLAogICAgICAgICAgICAgICBvaWQgKiBuYW1lLAogICAgICAgICAgICAgICBzaXplX3QgKiBsZW5ndGgsCiAgICAgICAgICAgICAgIGludCBleGFjdCwgc2l6ZV90ICogdmFyX2xlbiwgV3JpdGVNZXRob2QgKiogd3JpdGVfbWV0aG9kKQp7CiAgICBpZiAoaGVhZGVyX2dlbmVyaWModnAsIG5hbWUsIGxlbmd0aCwgZXhhY3QsIHZhcl9sZW4sIHdyaXRlX21ldGhvZCkgPT0KICAgICAgICBNQVRDSF9GQUlMRUQpCiAgICAgICAgcmV0dXJuIE5VTEw7CgogICAgc3dpdGNoICh2cC0+bWFnaWMpIHsKICAgIGNhc2UgTkVUU05NUF9JRk5VTUJFUjoKICAgICAgICBsb25nX3JldHVybiA9IEludGVyZmFjZV9TY2FuX0dldF9Db3VudCgpOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBkZWZhdWx0OgogICAgICAgIERFQlVHTVNHVEwoKCJzbm1wZCIsICJ1bmtub3duIHN1Yi1pZCAlZCBpbiB2YXJfaW50ZXJmYWNlc1xuIiwKICAgICAgICAgICAgICAgICAgICB2cC0+bWFnaWMpKTsKICAgIH0KICAgIHJldHVybiBOVUxMOwp9CgojaWZkZWYgVVNFX1NZU0NUTF9JRkxJU1QKCnN0YXRpYyB1X2NoYXIgICppZl9saXN0ID0gMDsKc3RhdGljIGNvbnN0IHVfY2hhciAqaWZfbGlzdF9lbmQ7CnN0YXRpYyBzaXplX3QgICBpZl9saXN0X3NpemUgPSAwOwoKc3RydWN0IHNtYWxsX2lmYWRkciB7CiAgICBzdHJ1Y3QgaW5fYWRkciAgc2lmYV9hZGRyOwogICAgc3RydWN0IGluX2FkZHIgIHNpZmFfbmV0bWFzazsKICAgIHN0cnVjdCBpbl9hZGRyICBzaWZhX2Jyb2FkY2FzdDsKfTsKCmV4dGVybiBjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKmdldF9hZGRyZXNzKGNvbnN0IHZvaWQgKiwgaW50LCBpbnQpOwpleHRlcm4gY29uc3Qgc3RydWN0IGluX2FkZHIgKmdldF9pbl9hZGRyZXNzKGNvbnN0IHZvaWQgKiwgaW50LCBpbnQpOwpzdGF0aWMgaW50ICAgICAgSW50ZXJmYWNlX1NjYW5fQnlfSW5kZXgoaW50LCBzdHJ1Y3QgaWZfbXNnaGRyICosIGNoYXIgKiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzbWFsbF9pZmFkZHIgKik7CnN0YXRpYyBpbnQgICAgICBJbnRlcmZhY2VfR2V0X0V0aGVyX0J5X0luZGV4KGludCwgdV9jaGFyICopOwoKc3RhdGljIGludApJbnRlcmZhY2VfU2Nhbl9CeV9JbmRleChpbnQgaWluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaWZfbXNnaGRyICppZl9tc2csCiAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmlmX25hbWUsIHN0cnVjdCBzbWFsbF9pZmFkZHIgKnNpZmEpCnsKICAgIHVfY2hhciAgICAgICAgICpjcDsKICAgIHN0cnVjdCBpZl9tc2doZHIgKmlmcDsKICAgIGludCAgICAgICAgICAgICBoYXZlX2lmaW5mbyA9IDAsIGhhdmVfYWRkciA9IDA7CgogICAgaWYgKE5VTEwgIT0gc2lmYSkKICAgICAgICBtZW1zZXQoc2lmYSwgMCwgc2l6ZW9mKCpzaWZhKSk7CiAgICBmb3IgKGNwID0gaWZfbGlzdDsgY3AgPCBpZl9saXN0X2VuZDsgY3AgKz0gaWZwLT5pZm1fbXNnbGVuKSB7CiAgICAgICAgaWZwID0gKHN0cnVjdCBpZl9tc2doZHIgKikgY3A7CiAgICAgICAgREVCVUdNU0dUTCgoIm1pYklJL2ludGVyZmFjZXMiLCAiaWZtX3R5cGUgPSAlZCwgaWZtX2luZGV4ID0gJWRcbiIsCiAgICAgICAgICAgICAgICAgICAgaWZwLT5pZm1fdHlwZSwgaWZwLT5pZm1faW5kZXgpKTsKCiAgICAgICAgc3dpdGNoIChpZnAtPmlmbV90eXBlKSB7CiAgICAgICAgY2FzZSBSVE1fSUZJTkZPOgogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKmE7CgogICAgICAgICAgICAgICAgaWYgKGlmcC0+aWZtX2luZGV4ID09IGlpbmRleCkgewogICAgICAgICAgICAgICAgICAgIGEgPSBnZXRfYWRkcmVzcyhpZnAgKyAxLCBpZnAtPmlmbV9hZGRycywgUlRBX0lGUCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGEgPT0gTlVMTCkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihpZl9uYW1lLCAiJS4qcyIsICgoY29uc3QgdV9jaGFyICopIGEpWzVdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKChjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW4gKikgYSktPnNpbl96ZXJvKTsKICAgICAgICAgICAgICAgICAgICAqaWZfbXNnID0gKmlmcDsKICAgICAgICAgICAgICAgICAgICArK2hhdmVfaWZpbmZvOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgUlRNX05FV0FERFI6CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHN0cnVjdCBpZmFfbXNnaGRyICppZmFwID0gKHN0cnVjdCBpZmFfbXNnaGRyICopIGNwOwoKICAgICAgICAgICAgICAgIGlmICgoTlVMTCAhPSBzaWZhKSAmJiAoaWZhcC0+aWZhbV9pbmRleCA9PSBpaW5kZXgpKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGluX2FkZHIgKmlhOwoKICAgICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAgICAqIEkgZG9uJ3Qga25vdyB3aHkgdGhlIG5vcm1hbCBnZXRfYWRkcmVzcygpIGRvZXNuJ3QKICAgICAgICAgICAgICAgICAgICAgKiB3b3JrIG9uIElSSVggNi4yLiAgTWF5YmUgdGhpcyBoYXMgdG8gZG8gd2l0aCB0aGUKICAgICAgICAgICAgICAgICAgICAgKiBleGlzdGVuY2Ugb2Ygc3RydWN0IHNvY2thZGRyX25ldy4gIEhvcGVmdWxseSwgb24KICAgICAgICAgICAgICAgICAgICAgKiBvdGhlciBzeXN0ZW1zIHdlIGNhbiBzaW1wbHkgdXNlIGdldF9pbl9hZGRyZXNzCiAgICAgICAgICAgICAgICAgICAgICogdGhyZWUgdGltZXMsIHdpdGggKGlmYXArMSkgYXMgdGhlIHN0YXJ0aW5nCiAgICAgICAgICAgICAgICAgICAgICogYWRkcmVzcy4gCiAgICAgICAgICAgICAgICAgICAgICovCgogICAgICAgICAgICAgICAgICAgIHNpZmEtPnNpZmFfbmV0bWFzayA9CiAgICAgICAgICAgICAgICAgICAgICAgICooKHN0cnVjdCBpbl9hZGRyICopICgoY2hhciAqKSAoaWZhcCArIDEpICsgNCkpOwogICAgICAgICAgICAgICAgICAgIGlhID0gZ2V0X2luX2FkZHJlc3MoKGNoYXIgKikgKGlmYXAgKyAxKSArIDgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmFwLT5pZmFtX2FkZHJzICY9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+UlRBX05FVE1BU0ssIFJUQV9JRkEpOwogICAgICAgICAgICAgICAgICAgIGlmIChpYSA9PSBOVUxMKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKCiAgICAgICAgICAgICAgICAgICAgc2lmYS0+c2lmYV9hZGRyID0gKmlhOwogICAgICAgICAgICAgICAgICAgIGlhID0gZ2V0X2luX2FkZHJlc3MoKGNoYXIgKikgKGlmYXAgKyAxKSArIDgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmFwLT5pZmFtX2FkZHJzICY9IH5SVEFfTkVUTUFTSywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUQV9CUkQpOwogICAgICAgICAgICAgICAgICAgIGlmIChpYSA9PSBOVUxMKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKCiAgICAgICAgICAgICAgICAgICAgc2lmYS0+c2lmYV9icm9hZGNhc3QgPSAqaWE7CiAgICAgICAgICAgICAgICAgICAgKytoYXZlX2FkZHI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgREVCVUdNU0dUTCgoIm1pYklJL2ludGVyZmFjZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAicm91dGluZyBzb2NrZXQ6IHVua25vd24gbWVzc2FnZSB0eXBlICVkXG4iLAogICAgICAgICAgICAgICAgICAgICAgICBpZnAtPmlmbV90eXBlKSk7CiAgICAgICAgfQogICAgfQogICAgaWYgKGhhdmVfaWZpbmZvICYmIChOVUxMID09IHNpZmEpIHx8IChoYXZlX2FkZHIpKSB7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9IGVsc2UgaWYgKGhhdmVfaWZpbmZvICYmICEoaWZfbXNnLT5pZm1fZmxhZ3MgJiBJRkZfVVApKQogICAgICAgIHJldHVybiAwOwogICAgZWxzZSB7CiAgICAgICAgcmV0dXJuIC0xOwogICAgfQp9CgppbnQKSW50ZXJmYWNlX1NjYW5fR2V0X0NvdW50KHZvaWQpCnsKICAgIHVfY2hhciAgICAgICAgICpjcDsKICAgIHN0cnVjdCBpZl9tc2doZHIgKmlmcDsKICAgIGxvbmcgICAgICAgICAgICBuID0gMDsKCiAgICBJbnRlcmZhY2VfU2Nhbl9Jbml0KCk7CgogICAgaWYgKGlmX2xpc3Rfc2l6ZSkgewogICAgICAgIGZvciAoY3AgPSBpZl9saXN0LCBuID0gMDsgY3AgPCBpZl9saXN0X2VuZDsgY3AgKz0gaWZwLT5pZm1fbXNnbGVuKSB7CiAgICAgICAgICAgIGlmcCA9IChzdHJ1Y3QgaWZfbXNnaGRyICopIGNwOwogICAgCiAgICAgICAgICAgIGlmIChpZnAtPmlmbV90eXBlID09IFJUTV9JRklORk8pIHsKICAgICAgICAgICAgICAgICsrbjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBuOwp9Cgp2b2lkCkludGVyZmFjZV9TY2FuX0luaXQodm9pZCkKewogICAgaW50ICAgICAgICAgICAgIG5hbWVbXSA9IHsgQ1RMX05FVCwgUEZfUk9VVEUsIDAsIDAsIE5FVF9SVF9JRkxJU1QsIDAgfTsKICAgIHNpemVfdCAgICAgICAgICBzaXplOwoKICAgIGlmIChzeXNjdGwobmFtZSwgc2l6ZW9mKG5hbWUpIC8gc2l6ZW9mKGludCksIDAsICZzaXplLCAwLCAwKSA9PSAtMSkgewogICAgICAgIHNubXBfbG9nKExPR19FUlIsICJzeXNjdGwgc2l6ZSBmYWlsXG4iKTsKICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKGlmX2xpc3QgPT0gMCB8fCBpZl9saXN0X3NpemUgPCBzaXplKSB7CiAgICAgICAgICAgIGlmIChpZl9saXN0ICE9IDApIHsKICAgICAgICAgICAgICAgIGZyZWUoaWZfbGlzdCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWZfbGlzdCAgICAgID0gTlVMTDsKICAgICAgICAgICAgaWZfbGlzdF9zaXplID0gMDsKICAgICAgICAgICAgaWZfbGlzdF9lbmQgID0gMDsKICAgICAgICAgICAgaWYgKChpZl9saXN0ID0gbWFsbG9jKHNpemUpKSA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLAogICAgICAgICAgICAgICAgICAgICAgICAgIm91dCBvZiBtZW1vcnkgYWxsb2NhdGluZyByb3V0ZSB0YWJsZSAoc2l6ZSA9ICVkKVxuIiwgc2l6ZSk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWZfbGlzdF9zaXplID0gc2l6ZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzaXplID0gaWZfbGlzdF9zaXplOwogICAgICAgIH0KICAgICAgICBpZiAoc3lzY3RsKG5hbWUsIHNpemVvZihuYW1lKSAvIHNpemVvZihpbnQpLAogICAgICAgICAgICAgICAgICAgaWZfbGlzdCwgJnNpemUsIDAsIDApID09IC0xKSB7CiAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsICJzeXNjdGwgZ2V0IGZhaWxcbiIpOwogICAgICAgIH0KICAgICAgICBpZl9saXN0X2VuZCA9IGlmX2xpc3QgKyBzaXplOwogICAgfQp9Cgp1X2NoYXIgICAgICAgICAqCnZhcl9pZkVudHJ5KHN0cnVjdCB2YXJpYWJsZSAqdnAsCiAgICAgICAgICAgIG9pZCAqIG5hbWUsCiAgICAgICAgICAgIHNpemVfdCAqIGxlbmd0aCwKICAgICAgICAgICAgaW50IGV4YWN0LCBzaXplX3QgKiB2YXJfbGVuLCBXcml0ZU1ldGhvZCAqKiB3cml0ZV9tZXRob2QpCnsKICAgIGludCAgICAgICAgICAgICBpbnRlcmZhY2U7CiAgICBzdHJ1Y3QgaWZfbXNnaGRyIGlmX21zZzsKICAgIHN0YXRpYyBjaGFyICAgICBpZl9uYW1lWzEwMF07CiAgICBjb25mX2lmX2xpc3QgICAqaWZfcHRyOwogICAgY2hhciAgICAgICAgICAgKmNwOwoKICAgIGludGVyZmFjZSA9CiAgICAgICAgaGVhZGVyX2lmRW50cnkodnAsIG5hbWUsIGxlbmd0aCwgZXhhY3QsIHZhcl9sZW4sIHdyaXRlX21ldGhvZCk7CiAgICBpZiAoaW50ZXJmYWNlID09IE1BVENIX0ZBSUxFRCkKICAgICAgICByZXR1cm4gTlVMTDsKCiAgICBpZiAoSW50ZXJmYWNlX1NjYW5fQnlfSW5kZXgoaW50ZXJmYWNlLCAmaWZfbXNnLCBpZl9uYW1lLCBOVUxMKSAhPSAwKQogICAgICAgIHJldHVybiBOVUxMOwogICAgaWZfcHRyID0gbmV0c25tcF9hY2Nlc3NfaW50ZXJmYWNlX2VudHJ5X292ZXJyaWRlc19nZXQoaWZfbmFtZSk7CgogICAgc3dpdGNoICh2cC0+bWFnaWMpIHsKICAgIGNhc2UgTkVUU05NUF9JRklOREVYOgogICAgICAgIGxvbmdfcmV0dXJuID0gaW50ZXJmYWNlOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIE5FVFNOTVBfSUZERVNDUjoKICAgICAgICBjcCA9IGlmX25hbWU7CiAgICAgICAgKnZhcl9sZW4gPSBzdHJsZW4oaWZfbmFtZSk7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgY3A7CiAgICBjYXNlIE5FVFNOTVBfSUZUWVBFOgogICAgICAgIGlmIChpZl9wdHIpCiAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gaWZfcHRyLT50eXBlOwogICAgICAgIGVsc2UKICAgICAgICBsb25nX3JldHVybiA9IChsb25nKSBpZl9tc2cuaWZtX2RhdGEuaWZpX3R5cGU7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgTkVUU05NUF9JRk1UVToKICAgICAgICBsb25nX3JldHVybiA9IChsb25nKSBpZl9tc2cuaWZtX2RhdGEuaWZpX210dTsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGU1BFRUQ6CiAgICAgICAgaWYgKGlmX3B0cikKICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSBpZl9wdHItPnNwZWVkOwogICAgICAgIGVsc2UgewojaWYgSEFWRV9TVFJVQ1RfSUZORVRfSUZfQkFVRFJBVEVfSUZTX1ZBTFVFCiAgICAgICAgbG9uZ19yZXR1cm4gPSAodV9sb25nKSBpZl9tc2cuaWZtX2RhdGEuaWZpX2JhdWRyYXRlLmlmc192YWx1ZSA8PAogICAgICAgICAgICBpZl9tc2cuaWZtX2RhdGEuaWZpX2JhdWRyYXRlLmlmc19sb2cyOwojZWxzZQogICAgICAgIGxvbmdfcmV0dXJuID0gKHVfbG9uZykgaWZfbXNnLmlmbV9kYXRhLmlmaV9iYXVkcmF0ZTsKI2VuZGlmCiAgICAgICAgfQogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIE5FVFNOTVBfSUZQSFlTQUREUkVTUzoKICAgICAgICAvKgogICAgICAgICAqIFhYWCAKICAgICAgICAgKi8KICAgICAgICByZXR1cm4gTlVMTDsKICAgIGNhc2UgTkVUU05NUF9JRkFETUlOU1RBVFVTOgogICAgICAgIGxvbmdfcmV0dXJuID0gaWZfbXNnLmlmbV9mbGFncyAmIElGRl9VUCA/IDEgOiAyOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIE5FVFNOTVBfSUZPUEVSU1RBVFVTOgogICAgICAgIGxvbmdfcmV0dXJuID0gaWZfbXNnLmlmbV9mbGFncyAmIElGRl9SVU5OSU5HID8gMSA6IDI7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgICAgICAvKgogICAgICAgICAqIGlmTGFzdENoYW5nZSAKICAgICAgICAgKi8KICAgIGNhc2UgTkVUU05NUF9JRklOT0NURVRTOgogICAgICAgIGxvbmdfcmV0dXJuID0gKHVfbG9uZykgaWZfbXNnLmlmbV9kYXRhLmlmaV9pYnl0ZXM7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgTkVUU05NUF9JRklOVUNBU1RQS1RTOgogICAgICAgIGxvbmdfcmV0dXJuID0KICAgICAgICAgICAgKHVfbG9uZykgaWZfbXNnLmlmbV9kYXRhLmlmaV9pcGFja2V0cyAtCiAgICAgICAgICAgIGlmX21zZy5pZm1fZGF0YS5pZmlfaW1jYXN0czsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGSU5OVUNBU1RQS1RTOgogICAgICAgIGxvbmdfcmV0dXJuID0gKHVfbG9uZykgaWZfbXNnLmlmbV9kYXRhLmlmaV9pbWNhc3RzOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIE5FVFNOTVBfSUZJTkRJU0NBUkRTOgogICAgICAgIGxvbmdfcmV0dXJuID0gKHVfbG9uZykgaWZfbXNnLmlmbV9kYXRhLmlmaV9pcWRyb3BzOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIE5FVFNOTVBfSUZJTkVSUk9SUzoKICAgICAgICBsb25nX3JldHVybiA9ICh1X2xvbmcpIGlmX21zZy5pZm1fZGF0YS5pZmlfaWVycm9yczsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGSU5VTktOT1dOUFJPVE9TOgogICAgICAgIGxvbmdfcmV0dXJuID0gKHVfbG9uZykgaWZfbXNnLmlmbV9kYXRhLmlmaV9ub3Byb3RvOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIE5FVFNOTVBfSUZPVVRPQ1RFVFM6CiAgICAgICAgbG9uZ19yZXR1cm4gPSAodV9sb25nKSBpZl9tc2cuaWZtX2RhdGEuaWZpX29ieXRlczsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGT1VUVUNBU1RQS1RTOgogICAgICAgIGxvbmdfcmV0dXJuID0KICAgICAgICAgICAgKHVfbG9uZykgaWZfbXNnLmlmbV9kYXRhLmlmaV9vcGFja2V0cyAtCiAgICAgICAgICAgIGlmX21zZy5pZm1fZGF0YS5pZmlfb21jYXN0czsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGT1VUTlVDQVNUUEtUUzoKICAgICAgICBsb25nX3JldHVybiA9ICh1X2xvbmcpIGlmX21zZy5pZm1fZGF0YS5pZmlfb21jYXN0czsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGT1VURElTQ0FSRFM6CiNpZmRlZiBpZl9vZHJvcHMKICAgICAgICBsb25nX3JldHVybiA9ICh1X2xvbmcpIGlmX21zZy5pZm1fZGF0YS5pZmlfb2Ryb3BzOwojZWxzZQojaWYgTkVUU05NUF9OT19EVU1NWV9WQUxVRVMKICAgICAgICByZXR1cm4gTlVMTDsKI2VuZGlmCiAgICAgICAgbG9uZ19yZXR1cm4gPSAwOwojZW5kaWYKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGT1VURVJST1JTOgogICAgICAgIGxvbmdfcmV0dXJuID0gKHVfbG9uZykgaWZfbXNnLmlmbV9kYXRhLmlmaV9vZXJyb3JzOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIE5FVFNOTVBfSUZMQVNUQ0hBTkdFOgojaWZkZWYgaXJpeDYKICAgICAgICBsb25nX3JldHVybiA9IDA7CiNlbHNlCiAgICAgICAgaWYgKGlmX21zZy5pZm1fZGF0YS5pZmlfbGFzdGNoYW5nZS50dl9zZWMgPT0gMCAmJgojaWYgU1RSVUNUX0lGTkVUX0hBU19JRl9MQVNUQ0hBTkdFX1RWX05TRUMKICAgICAgICAgICAgaWZfbXNnLmlmbV9kYXRhLmlmaV9sYXN0Y2hhbmdlLnR2X25zZWMgPT0gMAojZWxzZQogICAgICAgICAgICBpZl9tc2cuaWZtX2RhdGEuaWZpX2xhc3RjaGFuZ2UudHZfdXNlYyA9PSAwCiNlbmRpZgogICAgICAgICAgICkKICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSAwOwogICAgICAgIGVsc2UgaWYgKGlmX21zZy5pZm1fZGF0YS5pZmlfbGFzdGNoYW5nZS50dl9zZWMgPCBzdGFydHRpbWUudHZfc2VjKQogICAgICAgICAgICBsb25nX3JldHVybiA9IDA7CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gKHVfbG9uZykKICAgICAgICAgICAgICAgICgoaWZfbXNnLmlmbV9kYXRhLmlmaV9sYXN0Y2hhbmdlLnR2X3NlYyAtCiAgICAgICAgICAgICAgICAgIHN0YXJ0dGltZS50dl9zZWMpICogMTAwICsKICAgICAgICAgICAgICAgICAoCiNpZiBTVFJVQ1RfSUZORVRfSEFTX0lGX0xBU1RDSEFOR0VfVFZfTlNFQwogICAgICAgICAgICAgICAgICBpZl9tc2cuaWZtX2RhdGEuaWZpX2xhc3RjaGFuZ2UudHZfbnNlYyAvIDEwMDAKI2Vsc2UKICAgICAgICAgICAgICAgICAgaWZfbXNnLmlmbV9kYXRhLmlmaV9sYXN0Y2hhbmdlLnR2X3VzZWMKI2VuZGlmCiAgICAgICAgICAgICAgICAgIC0gc3RhcnR0aW1lLnR2X3VzZWMpIC8gMTAwMDApOwogICAgICAgIH0KI2VuZGlmCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGRlZmF1bHQ6CiAgICAgICAgcmV0dXJuIDA7CiAgICB9Cn0KCmludApJbnRlcmZhY2VfU2Nhbl9OZXh0KHNob3J0ICpJbmRleCwKICAgICAgICAgICAgICAgICAgICBjaGFyICpOYW1lLAogICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpZm5ldCAqUmV0aWZuZXQsIHN0cnVjdCBpbl9pZmFkZHIgKlJldGluX2lmYWRkcikKewogICAgcmV0dXJuIDA7Cn0KCmludApJbnRlcmZhY2VfU2Nhbl9OZXh0SW50KGludCAqSW5kZXgsCiAgICAgICAgICAgICAgICAgICAgY2hhciAqTmFtZSwKICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaWZuZXQgKlJldGlmbmV0LCBzdHJ1Y3QgaW5faWZhZGRyICpSZXRpbl9pZmFkZHIpCnsKICAgIHJldHVybiAwOwp9CgojZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vdCBVU0VfU1lTQ1RMX0lGTElTVCAqLwoKICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqCgkgKgoJICogIEtlcm5lbCAmIGludGVyZmFjZSBpbmZvcm1hdGlvbiwKCSAqICAgYW5kIGludGVybmFsIGZvcndhcmQgZGVjbGFyYXRpb25zCgkgKgoJICoqKioqKioqKioqKioqKioqKioqKi8KCiNpZm5kZWYgSEFWRV9ORVRfSUZfTUlCX0gKCiNpZm5kZWYgc29sYXJpczIKI2lmbmRlZiBocHV4MTEKc3RhdGljIGludCAgICAgIEludGVyZmFjZV9TY2FuX0J5X0luZGV4KGludCwgY2hhciAqLCBzdHJ1Y3QgaWZuZXQgKiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpbl9pZmFkZHIgKik7CnN0YXRpYyBpbnQgICAgICBJbnRlcmZhY2VfR2V0X0V0aGVyX0J5X0luZGV4KGludCwgdV9jaGFyICopOwojZWxzZQpzdGF0aWMgaW50ICAgICAgSW50ZXJmYWNlX1NjYW5fQnlfSW5kZXgoaW50LCBjaGFyICosIG5tYXBpX3BoeXN0YXQgKik7CiNlbmRpZgojZW5kaWYKCgoKICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqCgkgKgoJICogIFN5c3RlbSBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBmdW5jdGlvbnMKCSAqCgkgKioqKioqKioqKioqKioqKioqKioqLwoKCiNpZm5kZWYgc29sYXJpczIKI2lmbmRlZiBocHV4Cgp1X2NoYXIgICAgICAgICAqCnZhcl9pZkVudHJ5KHN0cnVjdCB2YXJpYWJsZSAqdnAsCiAgICAgICAgICAgIG9pZCAqIG5hbWUsCiAgICAgICAgICAgIHNpemVfdCAqIGxlbmd0aCwKICAgICAgICAgICAgaW50IGV4YWN0LCBzaXplX3QgKiB2YXJfbGVuLCBXcml0ZU1ldGhvZCAqKiB3cml0ZV9tZXRob2QpCnsKICAgIHN0YXRpYyBzdHJ1Y3QgaWZuZXQgaWZuZXQ7CiAgICBpbnQgICAgICAgICAgICAgaW50ZXJmYWNlOwogICAgc3RhdGljIHN0cnVjdCBpbl9pZmFkZHIgaW5faWZhZGRyOwogICAgc3RhdGljIGNoYXIgICAgIE5hbWVbMTZdOwogICAgY2hhciAgICAgICAgICAgKmNwOwogICAgY29uZl9pZl9saXN0ICAgKmlmX3B0cjsKI2lmIEhBVkVfU1RSVUNUX0lGTkVUX0lGX0xBU1RDSEFOR0VfVFZfU0VDCiAgICBzdHJ1Y3QgdGltZXZhbCAgbm93OwojZW5kaWYKCiAgICBpbnRlcmZhY2UgPQogICAgICAgIGhlYWRlcl9pZkVudHJ5KHZwLCBuYW1lLCBsZW5ndGgsIGV4YWN0LCB2YXJfbGVuLCB3cml0ZV9tZXRob2QpOwogICAgaWYgKGludGVyZmFjZSA9PSBNQVRDSF9GQUlMRUQpCiAgICAgICAgcmV0dXJuIE5VTEw7CgogICAgSW50ZXJmYWNlX1NjYW5fQnlfSW5kZXgoaW50ZXJmYWNlLCBOYW1lLCAmaWZuZXQsICZpbl9pZmFkZHIpOwogICAgaWZfcHRyID0gbmV0c25tcF9hY2Nlc3NfaW50ZXJmYWNlX2VudHJ5X292ZXJyaWRlc19nZXQoTmFtZSk7CgogICAgc3dpdGNoICh2cC0+bWFnaWMpIHsKICAgIGNhc2UgTkVUU05NUF9JRklOREVYOgogICAgICAgIGxvbmdfcmV0dXJuID0gaW50ZXJmYWNlOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIE5FVFNOTVBfSUZERVNDUjoKICAgICAgICBjcCA9IE5hbWU7CiAgICAgICAgKnZhcl9sZW4gPSBzdHJsZW4oY3ApOwogICAgICAgIHJldHVybiAodV9jaGFyICopIGNwOwogICAgY2FzZSBORVRTTk1QX0lGVFlQRToKICAgICAgICBpZiAoaWZfcHRyKQogICAgICAgICAgICBsb25nX3JldHVybiA9IGlmX3B0ci0+dHlwZTsKICAgICAgICBlbHNlIHsKI2lmIEhBVkVfU1RSVUNUX0lGTkVUX0lGX1RZUEUKICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSBpZm5ldC5pZl90eXBlOwojZWxzZQogICAgICAgICAgICBsb25nX3JldHVybiA9IDE7ICAgIC8qIE9USEVSICovCiNlbmRpZgogICAgICAgIH0KICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGTVRVOnsKICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSAobG9uZykgaWZuZXQuaWZfbXR1OwogICAgICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgICAgIH0KICAgIGNhc2UgTkVUU05NUF9JRlNQRUVEOgogICAgICAgIGlmIChpZl9wdHIpCiAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gaWZfcHRyLT5zcGVlZDsKICAgICAgICBlbHNlIHsKI2lmIEhBVkVfU1RSVUNUX0lGTkVUX0lGX0JBVURSQVRFCiAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gaWZuZXQuaWZfYmF1ZHJhdGU7CiNlbGlmIEhBVkVfU1RSVUNUX0lGTkVUX0lGX1NQRUVECiAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gaWZuZXQuaWZfc3BlZWQ7CiNlbGlmIEhBVkVfU1RSVUNUX0lGTkVUX0lGX1RZUEUgJiYgZGVmaW5lZChJRlRfRVRIRVIpCiAgICAgICAgICAgIGlmIChpZm5ldC5pZl90eXBlID09IElGVF9FVEhFUikKICAgICAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gMTAwMDAwMDA7CiAgICAgICAgICAgIGlmIChpZm5ldC5pZl90eXBlID09IElGVF9QMTApCiAgICAgICAgICAgICAgICBsb25nX3JldHVybiA9IDEwMDAwMDAwOwogICAgICAgICAgICBpZiAoaWZuZXQuaWZfdHlwZSA9PSBJRlRfUDgwKQogICAgICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSA4MDAwMDAwMDsKICAgICAgICAgICAgaWYgKGlmbmV0LmlmX3R5cGUgPT0gSUZUX0lTRE5CQVNJQykKICAgICAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gNjQwMDA7ICAgIC8qIEVEU1MxIG9ubHkgKi8KICAgICAgICAgICAgaWYgKGlmbmV0LmlmX3R5cGUgPT0gSUZUX0lTRE5QUklNQVJZKQogICAgICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSA2NDAwMCAqIDMwOwojZWxzZQojaWYgTkVUU05NUF9OT19EVU1NWV9WQUxVRVMKICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiNlbmRpZgogICAgICAgICAgICBsb25nX3JldHVybiA9ICh1X2xvbmcpIDEwMDAwMDAwOwojZW5kaWYKICAgICAgICB9CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgTkVUU05NUF9JRlBIWVNBRERSRVNTOgogICAgICAgIEludGVyZmFjZV9HZXRfRXRoZXJfQnlfSW5kZXgoaW50ZXJmYWNlLCByZXR1cm5fYnVmKTsKI2lmIGRlZmluZWQoYWl4NCkgfHwgZGVmaW5lZChhaXg1KSB8fCBkZWZpbmVkKGFpeDYpCgkqdmFyX2xlbiA9IDA7CiNlbHNlCiAgICAgICAgaWYgKChyZXR1cm5fYnVmWzBdID09IDApICYmIChyZXR1cm5fYnVmWzFdID09IDApICYmCiAgICAgICAgICAgIChyZXR1cm5fYnVmWzJdID09IDApICYmIChyZXR1cm5fYnVmWzNdID09IDApICYmCiAgICAgICAgICAgIChyZXR1cm5fYnVmWzRdID09IDApICYmIChyZXR1cm5fYnVmWzVdID09IDApKQogICAgICAgICAgICAqdmFyX2xlbiA9IDA7CiAgICAgICAgZWxzZQogICAgICAgICAgICAqdmFyX2xlbiA9IDY7CiNlbmRpZgogICAgICAgIHJldHVybiAodV9jaGFyICopIHJldHVybl9idWY7CiAgICBjYXNlIE5FVFNOTVBfSUZBRE1JTlNUQVRVUzoKICAgICAgICBsb25nX3JldHVybiA9IGlmbmV0LmlmX2ZsYWdzICYgSUZGX1VQID8gMSA6IDI7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgTkVUU05NUF9JRk9QRVJTVEFUVVM6CiAgICAgICAgbG9uZ19yZXR1cm4gPSBpZm5ldC5pZl9mbGFncyAmIElGRl9SVU5OSU5HID8gMSA6IDI7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgTkVUU05NUF9JRkxBU1RDSEFOR0U6CiNpZiBkZWZpbmVkKEhBVkVfU1RSVUNUX0lGTkVUX0lGX0xBU1RDSEFOR0VfVFZfU0VDKSAmJiAhKGRlZmluZWQoZnJlZWJzZDIpICYmIF9fRnJlZUJTRF92ZXJzaW9uIDwgMTk5NjA3KQogICAgICAgIC8qCiAgICAgICAgICogWFhYIC0gU05NUCdzIGlmTGFzdGNoYW5nZSBpcyB0aW1lIHdoZW4gb3AuIHN0YXR1cyBjaGFuZ2VkCiAgICAgICAgICogKiBGcmVlQlNEJ3MgaWZfbGFzdGNoYW5nZSBpcyB0aW1lIHdoZW4gcGFja2V0IHdhcyBpbnB1dCBvciBvdXRwdXQKICAgICAgICAgKiAqIChhdCBsZWFzdCBpbiAyLjEuMC1SRUxFQVNFLiBDaGFuZ2VkIGluIGxhdGVyIHZlcnNpb25zIG9mIHRoZSBrZXJuZWw/KQogICAgICAgICAqLwogICAgICAgIC8qCiAgICAgICAgICogRnJlZUJTRCdzIGlmX2xhc3RjaGFuZ2UgYmVmb3JlIHRoZSAyLjEuNSByZWxlYXNlIGlzIHRoZSB0aW1lIHdoZW4KICAgICAgICAgKiAqIGEgcGFja2V0IHdhcyBsYXN0IGlucHV0IG9yIG91dHB1dC4gIEluIHRoZSAyLjEuNSBhbmQgbGF0ZXIgcmVsZWFzZXMsCiAgICAgICAgICogKiB0aGlzIGlzIGZpeGVkLCB0aHVzIHRoZSAxOTk2MDcgY29tcGFyaXNvbi4KICAgICAgICAgKi8KICAgICAgICBpZiAoaWZuZXQuaWZfbGFzdGNoYW5nZS50dl9zZWMgPT0gMCAmJgogICAgICAgICAgICBpZm5ldC5pZl9sYXN0Y2hhbmdlLnR2X3VzZWMgPT0gMCkKICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSAwOwogICAgICAgIGVsc2UgaWYgKGlmbmV0LmlmX2xhc3RjaGFuZ2UudHZfc2VjIDwgc3RhcnR0aW1lLnR2X3NlYykKICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSAwOwogICAgICAgIGVsc2UgewogICAgICAgICAgICBsb25nX3JldHVybiA9ICh1X2xvbmcpCiAgICAgICAgICAgICAgICAoKGlmbmV0LmlmX2xhc3RjaGFuZ2UudHZfc2VjIC0gc3RhcnR0aW1lLnR2X3NlYykgKiAxMDAKICAgICAgICAgICAgICAgICArIChpZm5ldC5pZl9sYXN0Y2hhbmdlLnR2X3VzZWMgLQogICAgICAgICAgICAgICAgICAgIHN0YXJ0dGltZS50dl91c2VjKSAvIDEwMDAwKTsKICAgICAgICB9CiNlbHNlCiNpZiBORVRTTk1QX05PX0RVTU1ZX1ZBTFVFUwogICAgICAgIHJldHVybiBOVUxMOwojZW5kaWYKICAgICAgICBsb25nX3JldHVybiA9IDA7ICAgICAgICAvKiBYWFggKi8KI2VuZGlmCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgTkVUU05NUF9JRklOT0NURVRTOgojaWZkZWYgSEFWRV9TVFJVQ1RfSUZORVRfSUZfSUJZVEVTCiNpZiBkZWZpbmVkKGFpeDQpIHx8IGRlZmluZWQoYWl4NSkgfHwgZGVmaW5lZChhaXg2KQogICAgICAgIGxvbmdfcmV0dXJuID0gKHVfbG9uZykgaWZuZXQuaWZfaWJ5dGVzICYgMHhmZmZmZmZmZjsKI2Vsc2UKICAgICAgICBsb25nX3JldHVybiA9ICh1X2xvbmcpIGlmbmV0LmlmX2lieXRlczsKI2VuZGlmCiNlbHNlCiNpZiBORVRTTk1QX05PX0RVTU1ZX1ZBTFVFUwogICAgICAgIHJldHVybiBOVUxMOwojZW5kaWYKICAgICAgICBsb25nX3JldHVybiA9ICh1X2xvbmcpIGlmbmV0LmlmX2lwYWNrZXRzICogMzA4OyAvKiBYWFggKi8KI2VuZGlmCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgTkVUU05NUF9JRklOVUNBU1RQS1RTOgogICAgICAgIHsKI2lmIGRlZmluZWQoYWl4NCkgfHwgZGVmaW5lZChhaXg1KSB8fCBkZWZpbmVkKGFpeDYpCiAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gKHVfbG9uZykgaWZuZXQuaWZfaXBhY2tldHMgJiAweGZmZmZmZmZmOwojZWxzZQogICAgICAgICAgICBsb25nX3JldHVybiA9ICh1X2xvbmcpIGlmbmV0LmlmX2lwYWNrZXRzOwojZW5kaWYKI2lmIEhBVkVfU1RSVUNUX0lGTkVUX0lGX0lNQ0FTVFMKI2lmIGRlZmluZWQoYWl4NCkgfHwgZGVmaW5lZChhaXg1KSB8fCBkZWZpbmVkKGFpeDYpCiAgICAgICAgICAgIGxvbmdfcmV0dXJuIC09ICh1X2xvbmcpIGlmbmV0LmlmX2ltY2FzdHMgJiAweGZmZmZmZmZmOwojZWxzZQogICAgICAgICAgICBsb25nX3JldHVybiAtPSAodV9sb25nKSBpZm5ldC5pZl9pbWNhc3RzOwojZW5kaWYKI2VuZGlmCiAgICAgICAgfQogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIE5FVFNOTVBfSUZJTk5VQ0FTVFBLVFM6CiNpZiBIQVZFX1NUUlVDVF9JRk5FVF9JRl9JTUNBU1RTCiNpZiBkZWZpbmVkKGFpeDQpIHx8IGRlZmluZWQoYWl4NSkgfHwgZGVmaW5lZChhaXg2KQogICAgICAgIGxvbmdfcmV0dXJuID0gKHVfbG9uZykgaWZuZXQuaWZfaW1jYXN0cyAmIDB4ZmZmZmZmZmY7CiNlbHNlCiAgICAgICAgbG9uZ19yZXR1cm4gPSAodV9sb25nKSBpZm5ldC5pZl9pbWNhc3RzOwojZW5kaWYKI2Vsc2UKI2lmIE5FVFNOTVBfTk9fRFVNTVlfVkFMVUVTCiAgICAgICAgcmV0dXJuIE5VTEw7CiNlbmRpZgogICAgICAgIGxvbmdfcmV0dXJuID0gKHVfbG9uZykgMDsgICAgICAgLyogWFhYICovCiNlbmRpZgogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIE5FVFNOTVBfSUZJTkRJU0NBUkRTOgojaWYgSEFWRV9TVFJVQ1RfSUZORVRfSUZfSVFEUk9QUwojaWYgZGVmaW5lZChhaXg0KSB8fCBkZWZpbmVkKGFpeDUpIHx8IGRlZmluZWQoYWl4NikKICAgICAgICBsb25nX3JldHVybiA9ICh1X2xvbmcpIGlmbmV0LmlmX2lxZHJvcHMgJiAweGZmZmZmZmZmOwojZWxzZQogICAgICAgIGxvbmdfcmV0dXJuID0gKHVfbG9uZykgaWZuZXQuaWZfaXFkcm9wczsKI2VuZGlmCiNlbHNlCiNpZiBORVRTTk1QX05PX0RVTU1ZX1ZBTFVFUwogICAgICAgIHJldHVybiBOVUxMOwojZW5kaWYKICAgICAgICBsb25nX3JldHVybiA9ICh1X2xvbmcpIDA7ICAgICAgIC8qIFhYWCAqLwojZW5kaWYKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGSU5FUlJPUlM6CiNpZiBkZWZpbmVkKGFpeDQpIHx8IGRlZmluZWQoYWl4NSkgfHwgZGVmaW5lZChhaXg2KQogICAgICAgIGxvbmdfcmV0dXJuID0gKHVfbG9uZykgaWZuZXQuaWZfaWVycm9ycyAmIDB4ZmZmZmZmZmY7CiNlbHNlCiAgICAgICAgbG9uZ19yZXR1cm4gPSAodV9sb25nKSBpZm5ldC5pZl9pZXJyb3JzOwojZW5kaWYKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGSU5VTktOT1dOUFJPVE9TOgojaWYgSEFWRV9TVFJVQ1RfSUZORVRfSUZfTk9QUk9UTwojaWYgZGVmaW5lZChhaXg0KSB8fCBkZWZpbmVkKGFpeDUpIHx8IGRlZmluZWQoYWl4NikKICAgICAgICBsb25nX3JldHVybiA9ICh1X2xvbmcpIGlmbmV0LmlmX25vcHJvdG8gJiAweGZmZmZmZmZmOwojZWxzZQogICAgICAgIGxvbmdfcmV0dXJuID0gKHVfbG9uZykgaWZuZXQuaWZfbm9wcm90bzsKI2VuZGlmCiNlbHNlCiNpZiBORVRTTk1QX05PX0RVTU1ZX1ZBTFVFUwogICAgICAgIHJldHVybiBOVUxMOwojZW5kaWYKICAgICAgICBsb25nX3JldHVybiA9ICh1X2xvbmcpIDA7ICAgICAgIC8qIFhYWCAqLwojZW5kaWYKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGT1VUT0NURVRTOgojaWZkZWYgSEFWRV9TVFJVQ1RfSUZORVRfSUZfT0JZVEVTCiNpZiBkZWZpbmVkKGFpeDQpIHx8IGRlZmluZWQoYWl4NSkgfHwgZGVmaW5lZChhaXg2KQogICAgICAgIGxvbmdfcmV0dXJuID0gKHVfbG9uZykgaWZuZXQuaWZfb2J5dGVzICYgMHhmZmZmZmZmZjsKI2Vsc2UKICAgICAgICBsb25nX3JldHVybiA9ICh1X2xvbmcpIGlmbmV0LmlmX29ieXRlczsKI2VuZGlmCiNlbHNlCiNpZiBORVRTTk1QX05PX0RVTU1ZX1ZBTFVFUwogICAgICAgIHJldHVybiBOVUxMOwojZW5kaWYKICAgICAgICBsb25nX3JldHVybiA9ICh1X2xvbmcpIGlmbmV0LmlmX29wYWNrZXRzICogMzA4OyAvKiBYWFggKi8KI2VuZGlmCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgTkVUU05NUF9JRk9VVFVDQVNUUEtUUzoKICAgICAgICB7CiNpZiBkZWZpbmVkKGFpeDQpIHx8IGRlZmluZWQoYWl4NSkgfHwgZGVmaW5lZChhaXg2KQogICAgICAgICAgICBsb25nX3JldHVybiA9ICh1X2xvbmcpIGlmbmV0LmlmX29wYWNrZXRzICYgMHhmZmZmZmZmZjsKI2Vsc2UKICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSAodV9sb25nKSBpZm5ldC5pZl9vcGFja2V0czsKI2VuZGlmCiNpZiBIQVZFX1NUUlVDVF9JRk5FVF9JRl9PTUNBU1RTCiNpZiBkZWZpbmVkKGFpeDQpIHx8IGRlZmluZWQoYWl4NSkgfHwgZGVmaW5lZChhaXg2KQogICAgICAgICAgICBsb25nX3JldHVybiAtPSAodV9sb25nKSBpZm5ldC5pZl9vbWNhc3RzICYgMHhmZmZmZmZmZjsKI2Vsc2UKICAgICAgICAgICAgbG9uZ19yZXR1cm4gLT0gKHVfbG9uZykgaWZuZXQuaWZfb21jYXN0czsKI2VuZGlmCiNlbmRpZgogICAgICAgIH0KICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGT1VUTlVDQVNUUEtUUzoKI2lmIEhBVkVfU1RSVUNUX0lGTkVUX0lGX09NQ0FTVFMKI2lmIGRlZmluZWQoYWl4NCkgfHwgZGVmaW5lZChhaXg1KSB8fCBkZWZpbmVkKGFpeDYpCiAgICAgICAgbG9uZ19yZXR1cm4gPSAodV9sb25nKSBpZm5ldC5pZl9vbWNhc3RzICYgMHhmZmZmZmZmZjsKI2Vsc2UKICAgICAgICBsb25nX3JldHVybiA9ICh1X2xvbmcpIGlmbmV0LmlmX29tY2FzdHM7CiNlbmRpZgojZWxzZQojaWYgTkVUU05NUF9OT19EVU1NWV9WQUxVRVMKICAgICAgICByZXR1cm4gTlVMTDsKI2VuZGlmCiAgICAgICAgbG9uZ19yZXR1cm4gPSAodV9sb25nKSAwOyAgICAgICAvKiBYWFggKi8KI2VuZGlmCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgTkVUU05NUF9JRk9VVERJU0NBUkRTOgojaWYgZGVmaW5lZChhaXg0KSB8fCBkZWZpbmVkKGFpeDUpIHx8IGRlZmluZWQoYWl4NikKICAgICAgICBsb25nX3JldHVybiA9IGlmbmV0LmlmX3NuZC5pZnFfZHJvcHMgJiAweGZmZmZmZmZmOwojZWxzZQogICAgICAgIGxvbmdfcmV0dXJuID0gaWZuZXQuaWZfc25kLmlmcV9kcm9wczsKI2VuZGlmCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgTkVUU05NUF9JRk9VVEVSUk9SUzoKI2lmIGRlZmluZWQoYWl4NCkgfHwgZGVmaW5lZChhaXg1KSB8fCBkZWZpbmVkKGFpeDYpCiAgICAgICAgbG9uZ19yZXR1cm4gPSBpZm5ldC5pZl9vZXJyb3JzICYgMHhmZmZmZmZmZjsKI2Vsc2UKICAgICAgICBsb25nX3JldHVybiA9IGlmbmV0LmlmX29lcnJvcnM7CiNlbmRpZgogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIE5FVFNOTVBfSUZPVVRRTEVOOgojaWYgZGVmaW5lZChhaXg0KSB8fCBkZWZpbmVkKGFpeDUpIHx8IGRlZmluZWQoYWl4NikKICAgICAgICBsb25nX3JldHVybiA9IGlmbmV0LmlmX3NuZC5pZnFfbGVuICYgMHhmZmZmZmZmZjsKI2Vsc2UKICAgICAgICBsb25nX3JldHVybiA9IGlmbmV0LmlmX3NuZC5pZnFfbGVuOwojZW5kaWYKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGU1BFQ0lGSUM6CiAgICAgICAgKnZhcl9sZW4gPSBudWxsT2lkTGVuOwogICAgICAgIHJldHVybiAodV9jaGFyICopIG51bGxPaWQ7CiAgICBkZWZhdWx0OgogICAgICAgIERFQlVHTVNHVEwoKCJzbm1wZCIsICJ1bmtub3duIHN1Yi1pZCAlZCBpbiB2YXJfaWZFbnRyeVxuIiwKICAgICAgICAgICAgICAgICAgICB2cC0+bWFnaWMpKTsKICAgIH0KICAgIHJldHVybiBOVUxMOwp9CgojZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGhwdXggKi8KCnVfY2hhciAgICAgICAgICoKdmFyX2lmRW50cnkoc3RydWN0IHZhcmlhYmxlICp2cCwKICAgICAgICAgICAgb2lkICogbmFtZSwKICAgICAgICAgICAgc2l6ZV90ICogbGVuZ3RoLAogICAgICAgICAgICBpbnQgZXhhY3QsIHNpemVfdCAqIHZhcl9sZW4sIFdyaXRlTWV0aG9kICoqIHdyaXRlX21ldGhvZCkKewojaWYgZGVmaW5lZChocHV4MTEpCiAgICBzdGF0aWMgbm1hcGlfcGh5c3RhdCBpZm5ldDsKI2Vsc2UKICAgIHN0YXRpYyBzdHJ1Y3QgaWZuZXQgaWZuZXQ7CiNlbmRpZgogICAgcmVnaXN0ZXIgaW50ICAgIGludGVyZmFjZTsKI2lmICFkZWZpbmVkKGhwdXgxMSkKICAgIHN0YXRpYyBzdHJ1Y3QgaW5faWZhZGRyIGluX2lmYWRkclZhcjsKI2VuZGlmCiNpZiBkZWZpbmVkKGhwdXgxMSkKICAgIHN0YXRpYyBjaGFyICAgICBOYW1lW01BWF9QSFlTQUREUl9MRU5dOwojZWxzZQogICAgc3RhdGljIGNoYXIgICAgIE5hbWVbMTZdOwojZW5kaWYKICAgIHJlZ2lzdGVyIGNoYXIgICpjcDsKI2lmIEhBVkVfU1RSVUNUX0lGTkVUX0lGX0xBU1RDSEFOR0VfVFZfU0VDCiAgICBzdHJ1Y3QgdGltZXZhbCAgbm93OwojZW5kaWYKI2lmICFkZWZpbmVkKGhwdXgxMSkKICAgIHN0cnVjdCBubXBhcm1zICBocF9ubXBhcm1zOwogICAgc3RhdGljIG1pYl9pZkVudHJ5IGhwX2lmRW50cnk7CiAgICBpbnQgICAgICAgICAgICAgaHBfZmQ7CiAgICBpbnQgICAgICAgICAgICAgaHBfbGVuID0gc2l6ZW9mKGhwX2lmRW50cnkpOwojZW5kaWYKICAgIGNvbmZfaWZfbGlzdCAgICppZl9wdHI7CgogICAgaW50ZXJmYWNlID0KICAgICAgICBoZWFkZXJfaWZFbnRyeSh2cCwgbmFtZSwgbGVuZ3RoLCBleGFjdCwgdmFyX2xlbiwgd3JpdGVfbWV0aG9kKTsKICAgIGlmIChpbnRlcmZhY2UgPT0gTUFUQ0hfRkFJTEVEKQogICAgICAgIHJldHVybiBOVUxMOwoKI2lmIGRlZmluZWQoaHB1eDExKQogICAgSW50ZXJmYWNlX1NjYW5fQnlfSW5kZXgoaW50ZXJmYWNlLCBOYW1lLCAmaWZuZXQpOwojZWxzZQogICAgSW50ZXJmYWNlX1NjYW5fQnlfSW5kZXgoaW50ZXJmYWNlLCBOYW1lLCAmaWZuZXQsICZpbl9pZmFkZHJWYXIpOwojZW5kaWYKCiNpZiAhZGVmaW5lZChocHV4MTEpCiAgICAvKgogICAgICogQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgaW50ZXJmYWNlcyBpcyBhdmFpbGFibGUgdW5kZXIKICAgICAqIEhQLVVYIHRocm91Z2ggdGhlIG5ldHdvcmsgbWFuYWdlbWVudCBpbnRlcmZhY2UgJy9kZXYvbmV0bWFuJwogICAgICovCiAgICBocF9pZkVudHJ5LmlmSW5kZXggPSBpbnRlcmZhY2U7CiAgICBocF9ubXBhcm1zLm9iamlkID0gSURfaWZFbnRyeTsKICAgIGhwX25tcGFybXMuYnVmZmVyID0gKGNoYXIgKikgJmhwX2lmRW50cnk7CiAgICBocF9ubXBhcm1zLmxlbiA9ICZocF9sZW47CiAgICBpZiAoKGhwX2ZkID0gb3BlbigiL2Rldi9uZXRtYW4iLCBPX1JET05MWSkpICE9IC0xKSB7CiAgICAgICAgaWYgKGlvY3RsKGhwX2ZkLCBOTUlPR0VULCAmaHBfbm1wYXJtcykgIT0gLTEpIHsKICAgICAgICAgICAgY2xvc2UoaHBfZmQpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNsb3NlKGhwX2ZkKTsKICAgICAgICAgICAgaHBfZmQgPSAtMTsgICAgICAgICAvKiBmYWlsZWQgKi8KICAgICAgICB9CiAgICB9CiNlbmRpZgogICAgaWZfcHRyID0gbmV0c25tcF9hY2Nlc3NfaW50ZXJmYWNlX2VudHJ5X292ZXJyaWRlc19nZXQoTmFtZSk7CgogICAgc3dpdGNoICh2cC0+bWFnaWMpIHsKICAgIGNhc2UgTkVUU05NUF9JRklOREVYOgogICAgICAgIGxvbmdfcmV0dXJuID0gaW50ZXJmYWNlOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIE5FVFNOTVBfSUZERVNDUjoKI2lmIGRlZmluZWQoaHB1eDExKQogICAgICAgIGNwID0gaWZuZXQuaWZfZW50cnkuaWZEZXNjcjsKI2Vsc2UKICAgICAgICBpZiAoaHBfZmQgIT0gLTEpCiAgICAgICAgICAgIGNwID0gaHBfaWZFbnRyeS5pZkRlc2NyOwogICAgICAgIGVsc2UKICAgICAgICAgICAgY3AgPSBOYW1lOwojZW5kaWYKICAgICAgICAqdmFyX2xlbiA9IHN0cmxlbihjcCk7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgY3A7CiAgICBjYXNlIE5FVFNOTVBfSUZUWVBFOgogICAgICAgIGlmIChpZl9wdHIpCiAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gaWZfcHRyLT50eXBlOwogICAgICAgIGVsc2UgewojaWYgZGVmaW5lZChocHV4MTEpCiAgICAgICAgbG9uZ19yZXR1cm4gPSBpZm5ldC5pZl9lbnRyeS5pZlR5cGU7CiNlbHNlCiAgICAgICAgaWYgKGhwX2ZkICE9IC0xKQogICAgICAgICAgICBsb25nX3JldHVybiA9IGhwX2lmRW50cnkuaWZUeXBlOwogICAgICAgIGVsc2UKICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSAxOyAgICAvKiBPVEhFUiAqLwojZW5kaWYKICAgICAgICB9CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgTkVUU05NUF9JRk1UVTp7CiNpZiBkZWZpbmVkKGhwdXgxMSkKICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSAobG9uZykgaWZuZXQuaWZfZW50cnkuaWZNdHU7CiNlbHNlCiAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gKGxvbmcpIGlmbmV0LmlmX210dTsKI2VuZGlmCiAgICAgICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICAgICAgfQogICAgY2FzZSBORVRTTk1QX0lGU1BFRUQ6CiAgICAgICAgaWYgKGlmX3B0cikKICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSBpZl9wdHItPnNwZWVkOwogICAgICAgIGVsc2UgewojaWYgZGVmaW5lZChocHV4MTEpCiAgICAgICAgbG9uZ19yZXR1cm4gPSBpZm5ldC5pZl9lbnRyeS5pZlNwZWVkOwojZWxzZQogICAgICAgIGlmIChocF9mZCAhPSAtMSkKICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSBocF9pZkVudHJ5LmlmU3BlZWQ7CiAgICAgICAgZWxzZQogICAgICAgICAgICBsb25nX3JldHVybiA9ICh1X2xvbmcpIDE7ICAgLyogT1RIRVIgKi8KI2VuZGlmCiAgICAgICAgfQogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIE5FVFNOTVBfSUZQSFlTQUREUkVTUzoKI2lmIGRlZmluZWQoaHB1eDExKQogICAgICAgICp2YXJfbGVuID0gaWZuZXQuaWZfZW50cnkuaWZQaHlzQWRkcmVzcy5vX2xlbmd0aDsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSBpZm5ldC5pZl9lbnRyeS5pZlBoeXNBZGRyZXNzLm9fYnl0ZXM7CiNlbHNlCiAgICAgICAgSW50ZXJmYWNlX0dldF9FdGhlcl9CeV9JbmRleChpbnRlcmZhY2UsIHJldHVybl9idWYpOwogICAgICAgIGlmICgocmV0dXJuX2J1ZlswXSA9PSAwKSAmJiAocmV0dXJuX2J1ZlsxXSA9PSAwKSAmJgogICAgICAgICAgICAocmV0dXJuX2J1ZlsyXSA9PSAwKSAmJiAocmV0dXJuX2J1ZlszXSA9PSAwKSAmJgogICAgICAgICAgICAocmV0dXJuX2J1Zls0XSA9PSAwKSAmJiAocmV0dXJuX2J1Zls1XSA9PSAwKSkKICAgICAgICAgICAgKnZhcl9sZW4gPSAwOwogICAgICAgIGVsc2UKICAgICAgICAgICAgKnZhcl9sZW4gPSA2OwogICAgICAgIHJldHVybiAodV9jaGFyICopIHJldHVybl9idWY7CiNlbmRpZgogICAgY2FzZSBORVRTTk1QX0lGQURNSU5TVEFUVVM6CiNpZiBkZWZpbmVkKGhwdXgxMSkKICAgICAgICBsb25nX3JldHVybiA9IGlmbmV0LmlmX2VudHJ5LmlmQWRtaW47CiNlbHNlCiAgICAgICAgbG9uZ19yZXR1cm4gPSBpZm5ldC5pZl9mbGFncyAmIElGRl9VUCA/IDEgOiAyOwojZW5kaWYKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGT1BFUlNUQVRVUzoKI2lmIGRlZmluZWQoaHB1eDExKQogICAgICAgIGxvbmdfcmV0dXJuID0gaWZuZXQuaWZfZW50cnkuaWZPcGVyOwojZWxzZQogICAgICAgIGxvbmdfcmV0dXJuID0gaWZuZXQuaWZfZmxhZ3MgJiBJRkZfUlVOTklORyA/IDEgOiAyOwojZW5kaWYKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGTEFTVENIQU5HRToKI2lmIGRlZmluZWQoaHB1eDExKQogICAgICAgIGxvbmdfcmV0dXJuID0gaWZuZXQuaWZfZW50cnkuaWZMYXN0Q2hhbmdlOwojZWxzZQogICAgICAgIGlmIChocF9mZCAhPSAtMSkKICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSBocF9pZkVudHJ5LmlmTGFzdENoYW5nZTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gMDsgICAgLyogWFhYICovCiNlbmRpZgogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIE5FVFNOTVBfSUZJTk9DVEVUUzoKI2lmIGRlZmluZWQoaHB1eDExKQogICAgICAgIGxvbmdfcmV0dXJuID0gaWZuZXQuaWZfZW50cnkuaWZJbk9jdGV0czsKI2Vsc2UKICAgICAgICBpZiAoaHBfZmQgIT0gLTEpCiAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gaHBfaWZFbnRyeS5pZkluT2N0ZXRzOwogICAgICAgIGVsc2UKICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSAodV9sb25nKSBpZm5ldC5pZl9pcGFja2V0cyAqIDMwODsgICAgIC8qIFhYWCAqLwojZW5kaWYKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGSU5VQ0FTVFBLVFM6CiNpZiBkZWZpbmVkKGhwdXgxMSkKICAgICAgICBsb25nX3JldHVybiA9IGlmbmV0LmlmX2VudHJ5LmlmSW5VY2FzdFBrdHM7CiNlbHNlCiAgICAgICAgaWYgKGhwX2ZkICE9IC0xKQogICAgICAgICAgICBsb25nX3JldHVybiA9IGhwX2lmRW50cnkuaWZJblVjYXN0UGt0czsKICAgICAgICBlbHNlCiAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gKHVfbG9uZykgaWZuZXQuaWZfaXBhY2tldHM7CiNlbmRpZgogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIE5FVFNOTVBfSUZJTk5VQ0FTVFBLVFM6CiNpZiBkZWZpbmVkKGhwdXgxMSkKICAgICAgICBsb25nX3JldHVybiA9IGlmbmV0LmlmX2VudHJ5LmlmSW5OVWNhc3RQa3RzOwojZWxzZQogICAgICAgIGlmIChocF9mZCAhPSAtMSkKICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSBocF9pZkVudHJ5LmlmSW5OVWNhc3RQa3RzOwogICAgICAgIGVsc2UKICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSAodV9sb25nKSAwOyAgIC8qIFhYWCAqLwojZW5kaWYKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGSU5ESVNDQVJEUzoKI2lmIGRlZmluZWQoaHB1eDExKQogICAgICAgIGxvbmdfcmV0dXJuID0gaWZuZXQuaWZfZW50cnkuaWZJbkRpc2NhcmRzOwojZWxzZQogICAgICAgIGlmIChocF9mZCAhPSAtMSkKICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSBocF9pZkVudHJ5LmlmSW5EaXNjYXJkczsKICAgICAgICBlbHNlCiAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gKHVfbG9uZykgMDsgICAvKiBYWFggKi8KI2VuZGlmCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgTkVUU05NUF9JRklORVJST1JTOgojaWYgZGVmaW5lZChocHV4MTEpCiAgICAgICAgbG9uZ19yZXR1cm4gPSBpZm5ldC5pZl9lbnRyeS5pZkluRXJyb3JzOwojZWxzZQogICAgICAgIGxvbmdfcmV0dXJuID0gaWZuZXQuaWZfaWVycm9yczsKI2VuZGlmCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgTkVUU05NUF9JRklOVU5LTk9XTlBST1RPUzoKI2lmIGRlZmluZWQoaHB1eDExKQogICAgICAgIGxvbmdfcmV0dXJuID0gaWZuZXQuaWZfZW50cnkuaWZJblVua25vd25Qcm90b3M7CiNlbHNlCiAgICAgICAgaWYgKGhwX2ZkICE9IC0xKQogICAgICAgICAgICBsb25nX3JldHVybiA9IGhwX2lmRW50cnkuaWZJblVua25vd25Qcm90b3M7CiAgICAgICAgZWxzZQogICAgICAgICAgICBsb25nX3JldHVybiA9ICh1X2xvbmcpIDA7ICAgLyogWFhYICovCiNlbmRpZgogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIE5FVFNOTVBfSUZPVVRPQ1RFVFM6CiNpZiBkZWZpbmVkKGhwdXgxMSkKICAgICAgICBsb25nX3JldHVybiA9IGlmbmV0LmlmX2VudHJ5LmlmT3V0T2N0ZXRzOwojZWxzZQogICAgICAgIGlmIChocF9mZCAhPSAtMSkKICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSBocF9pZkVudHJ5LmlmT3V0T2N0ZXRzOwogICAgICAgIGVsc2UKICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSAodV9sb25nKSBpZm5ldC5pZl9vcGFja2V0cyAqIDMwODsgICAgIC8qIFhYWCAqLwojZW5kaWYKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGT1VUVUNBU1RQS1RTOgojaWYgZGVmaW5lZChocHV4MTEpCiAgICAgICAgbG9uZ19yZXR1cm4gPSBpZm5ldC5pZl9lbnRyeS5pZk91dFVjYXN0UGt0czsKI2Vsc2UKICAgICAgICBpZiAoaHBfZmQgIT0gLTEpCiAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gaHBfaWZFbnRyeS5pZk91dFVjYXN0UGt0czsKICAgICAgICBlbHNlCiAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gKHVfbG9uZykgaWZuZXQuaWZfb3BhY2tldHM7CiNlbmRpZgogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIE5FVFNOTVBfSUZPVVROVUNBU1RQS1RTOgojaWYgZGVmaW5lZChocHV4MTEpCiAgICAgICAgbG9uZ19yZXR1cm4gPSBpZm5ldC5pZl9lbnRyeS5pZk91dE5VY2FzdFBrdHM7CiNlbHNlCiAgICAgICAgaWYgKGhwX2ZkICE9IC0xKQogICAgICAgICAgICBsb25nX3JldHVybiA9IGhwX2lmRW50cnkuaWZPdXROVWNhc3RQa3RzOwogICAgICAgIGVsc2UKICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSAodV9sb25nKSAwOyAgIC8qIFhYWCAqLwojZW5kaWYKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGT1VURElTQ0FSRFM6CiNpZiBkZWZpbmVkKGhwdXgxMSkKICAgICAgICBsb25nX3JldHVybiA9IGlmbmV0LmlmX2VudHJ5LmlmT3V0RGlzY2FyZHM7CiNlbHNlCiAgICAgICAgbG9uZ19yZXR1cm4gPSBpZm5ldC5pZl9zbmQuaWZxX2Ryb3BzOwojZW5kaWYKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGT1VURVJST1JTOgojaWYgZGVmaW5lZChocHV4MTEpCiAgICAgICAgbG9uZ19yZXR1cm4gPSBpZm5ldC5pZl9lbnRyeS5pZk91dEVycm9yczsKI2Vsc2UKICAgICAgICBsb25nX3JldHVybiA9IGlmbmV0LmlmX29lcnJvcnM7CiNlbmRpZgogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIE5FVFNOTVBfSUZPVVRRTEVOOgojaWYgZGVmaW5lZChocHV4MTEpCiAgICAgICAgbG9uZ19yZXR1cm4gPSBpZm5ldC5pZl9lbnRyeS5pZk91dFFsZW47CiNlbHNlCiAgICAgICAgbG9uZ19yZXR1cm4gPSBpZm5ldC5pZl9zbmQuaWZxX2xlbjsKI2VuZGlmCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgTkVUU05NUF9JRlNQRUNJRklDOgogICAgICAgICp2YXJfbGVuID0gbnVsbE9pZExlbjsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSBudWxsT2lkOwogICAgZGVmYXVsdDoKICAgICAgICBERUJVR01TR1RMKCgic25tcGQiLCAidW5rbm93biBzdWItaWQgJWQgaW4gdmFyX2lmRW50cnlcbiIsCiAgICAgICAgICAgICAgICAgICAgdnAtPm1hZ2ljKSk7CiAgICB9CiAgICByZXR1cm4gTlVMTDsKfQoKI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBocHV4ICovCiNlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc29sYXJpczIgKi8KCnN0YXRpYyBpbnQKSUZfY21wKHZvaWQgKmFkZHIsIHZvaWQgKmVwKQp7CiAgICBERUJVR01TR1RMKCgibWliSUkvaW50ZXJmYWNlcyIsICIuLi4gSUZfY21wICVkICVkXG4iLAogICAgICAgICAgICAgICAgKChtaWIyX2lmRW50cnlfdCAqKSBlcCktPmlmSW5kZXgsCiAgICAgICAgICAgICAgICAoKG1pYjJfaWZFbnRyeV90ICopIGFkZHIpLT5pZkluZGV4KSk7CiAgICBpZiAoKChtaWIyX2lmRW50cnlfdCAqKSBlcCktPmlmSW5kZXggPT0KICAgICAgICAoKG1pYjJfaWZFbnRyeV90ICopIGFkZHIpLT5pZkluZGV4KQogICAgICAgIHJldHVybiAoMCk7CiAgICBlbHNlCiAgICAgICAgcmV0dXJuICgxKTsKfQoKdV9jaGFyICAgICAgICAgKgp2YXJfaWZFbnRyeShzdHJ1Y3QgdmFyaWFibGUgKiB2cCwKICAgICAgICAgICAgb2lkICogbmFtZSwKICAgICAgICAgICAgc2l6ZV90ICogbGVuZ3RoLAogICAgICAgICAgICBpbnQgZXhhY3QsIHNpemVfdCAqIHZhcl9sZW4sIFdyaXRlTWV0aG9kICoqIHdyaXRlX21ldGhvZCkKewogICAgaW50ICAgICAgICAgICAgIGludGVyZmFjZTsKICAgIG1pYjJfaWZFbnRyeV90ICBpZnN0YXQ7CiAgICBjb25mX2lmX2xpc3QgICAqaWZfcHRyID0gTlVMTDsKCiAgICBpbnRlcmZhY2UgPQogICAgICAgIGhlYWRlcl9pZkVudHJ5KHZwLCBuYW1lLCBsZW5ndGgsIGV4YWN0LCB2YXJfbGVuLCB3cml0ZV9tZXRob2QpOwogICAgaWYgKGludGVyZmFjZSA9PSBNQVRDSF9GQUlMRUQpCiAgICAgICAgcmV0dXJuIE5VTEw7CgogICAgaWYgKGdldE1pYnN0YXQoTUlCX0lOVEVSRkFDRVMsICZpZnN0YXQsIHNpemVvZihtaWIyX2lmRW50cnlfdCksCiAgICAgICAgICAgICAgICAgICBHRVRfRVhBQ1QsICZJRl9jbXAsICZpbnRlcmZhY2UpICE9IDApIHsKICAgICAgICBERUJVR01TR1RMKCgibWliSUkvaW50ZXJmYWNlcyIsICIuLi4gbm8gbWliIHN0YXRzXG4iKSk7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CiAgICAvKgogICAgICogaG1tbS4uIHdoZXJlIHRvIGdldCB0aGUgaW50ZXJmYWNlIG5hbWUgdG8gY2hlY2sgb3ZlcnJpZGVzPwogICAgICoKICAgICAqIGlmX3B0ciA9IG5ldHNubXBfYWNjZXNzX2ludGVyZmFjZV9lbnRyeV9vdmVycmlkZXNfZ2V0KE5hbWUpOwogICAgICovCiAgICBzd2l0Y2ggKHZwLT5tYWdpYykgewogICAgY2FzZSBORVRTTk1QX0lGSU5ERVg6CiAgICAgICAgbG9uZ19yZXR1cm4gPSBpZnN0YXQuaWZJbmRleDsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGREVTQ1I6CiAgICAgICAgKnZhcl9sZW4gPSBpZnN0YXQuaWZEZXNjci5vX2xlbmd0aDsKICAgICAgICAodm9pZCkgbWVtY3B5KHJldHVybl9idWYsIGlmc3RhdC5pZkRlc2NyLm9fYnl0ZXMsICp2YXJfbGVuKTsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSByZXR1cm5fYnVmOwogICAgY2FzZSBORVRTTk1QX0lGVFlQRToKICAgICAgICBpZiAoaWZfcHRyKQogICAgICAgICAgICBsb25nX3JldHVybiA9IGlmX3B0ci0+dHlwZTsKICAgICAgICBlbHNlCiAgICAgICAgbG9uZ19yZXR1cm4gPSAodV9sb25nKSBpZnN0YXQuaWZUeXBlOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIE5FVFNOTVBfSUZNVFU6CiAgICAgICAgbG9uZ19yZXR1cm4gPSAodV9sb25nKSBpZnN0YXQuaWZNdHU7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgTkVUU05NUF9JRlNQRUVEOgogICAgICAgIGlmIChpZl9wdHIpCiAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gaWZfcHRyLT5zcGVlZDsKICAgICAgICBlbHNlCiAgICAgICAgbG9uZ19yZXR1cm4gPSAodV9sb25nKSBpZnN0YXQuaWZTcGVlZDsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGUEhZU0FERFJFU1M6CiAgICAgICAgKnZhcl9sZW4gPSBpZnN0YXQuaWZQaHlzQWRkcmVzcy5vX2xlbmd0aDsKICAgICAgICAodm9pZCkgbWVtY3B5KHJldHVybl9idWYsIGlmc3RhdC5pZlBoeXNBZGRyZXNzLm9fYnl0ZXMsICp2YXJfbGVuKTsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSByZXR1cm5fYnVmOwogICAgY2FzZSBORVRTTk1QX0lGQURNSU5TVEFUVVM6CiAgICAgICAgbG9uZ19yZXR1cm4gPSAodV9sb25nKSBpZnN0YXQuaWZBZG1pblN0YXR1czsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGT1BFUlNUQVRVUzoKICAgICAgICBsb25nX3JldHVybiA9ICh1X2xvbmcpIGlmc3RhdC5pZk9wZXJTdGF0dXM7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgTkVUU05NUF9JRkxBU1RDSEFOR0U6CiAgICAgICAgbG9uZ19yZXR1cm4gPSAodV9sb25nKSBpZnN0YXQuaWZMYXN0Q2hhbmdlOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIE5FVFNOTVBfSUZJTk9DVEVUUzoKICAgICAgICBsb25nX3JldHVybiA9ICh1X2xvbmcpIGlmc3RhdC5pZkluT2N0ZXRzOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIE5FVFNOTVBfSUZJTlVDQVNUUEtUUzoKICAgICAgICBsb25nX3JldHVybiA9ICh1X2xvbmcpIGlmc3RhdC5pZkluVWNhc3RQa3RzOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIE5FVFNOTVBfSUZJTk5VQ0FTVFBLVFM6CiAgICAgICAgbG9uZ19yZXR1cm4gPSAodV9sb25nKSBpZnN0YXQuaWZJbk5VY2FzdFBrdHM7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgTkVUU05NUF9JRklORElTQ0FSRFM6CiAgICAgICAgbG9uZ19yZXR1cm4gPSAodV9sb25nKSBpZnN0YXQuaWZJbkRpc2NhcmRzOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIE5FVFNOTVBfSUZJTkVSUk9SUzoKICAgICAgICBsb25nX3JldHVybiA9ICh1X2xvbmcpIGlmc3RhdC5pZkluRXJyb3JzOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIE5FVFNOTVBfSUZJTlVOS05PV05QUk9UT1M6CiAgICAgICAgbG9uZ19yZXR1cm4gPSAodV9sb25nKSBpZnN0YXQuaWZJblVua25vd25Qcm90b3M7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgTkVUU05NUF9JRk9VVE9DVEVUUzoKICAgICAgICBsb25nX3JldHVybiA9ICh1X2xvbmcpIGlmc3RhdC5pZk91dE9jdGV0czsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGT1VUVUNBU1RQS1RTOgogICAgICAgIGxvbmdfcmV0dXJuID0gKHVfbG9uZykgaWZzdGF0LmlmT3V0VWNhc3RQa3RzOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIE5FVFNOTVBfSUZPVVROVUNBU1RQS1RTOgogICAgICAgIGxvbmdfcmV0dXJuID0gKHVfbG9uZykgaWZzdGF0LmlmT3V0TlVjYXN0UGt0czsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGT1VURElTQ0FSRFM6CiAgICAgICAgbG9uZ19yZXR1cm4gPSAodV9sb25nKSBpZnN0YXQuaWZPdXREaXNjYXJkczsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGT1VURVJST1JTOgogICAgICAgIGxvbmdfcmV0dXJuID0gKHVfbG9uZykgaWZzdGF0LmlmT3V0RXJyb3JzOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIE5FVFNOTVBfSUZPVVRRTEVOOgogICAgICAgIGxvbmdfcmV0dXJuID0gKHVfbG9uZykgaWZzdGF0LmlmT3V0UUxlbjsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGU1BFQ0lGSUM6Cglsb25nX3JldHVybiA9ICh1X2xvbmcpIGlmc3RhdC5pZlNwZWNpZmljOwoJcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGRlZmF1bHQ6CiAgICAgICAgREVCVUdNU0dUTCgoInNubXBkIiwgInVua25vd24gc3ViLWlkICVkIGluIHZhcl9pZkVudHJ5XG4iLAogICAgICAgICAgICAgICAgICAgIHZwLT5tYWdpYykpOwogICAgfQogICAgcmV0dXJuIE5VTEw7Cn0KCiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc29sYXJpczIgKi8KCgoKICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqCgkgKgoJICogIEludGVybmFsIGltcGxlbWVudGF0aW9uIGZ1bmN0aW9ucwoJICoKCSAqKioqKioqKioqKioqKioqKioqKiovCgoKI2lmbmRlZiBzb2xhcmlzMgoKI2lmICFkZWZpbmVkKHN1blYzKSAmJiAhZGVmaW5lZChsaW51eCkgJiYgIWRlZmluZWQoaHB1eDExKQpzdGF0aWMgc3RydWN0IGluX2lmYWRkciBzYXZlaW5faWZhZGRyOwojZW5kaWYKI2lmICFkZWZpbmVkKGhwdXgxMSkKc3RhdGljIHN0cnVjdCBpZm5ldCAqaWZuZXRhZGRyLCBzYXZlaWZuZXQsICpzYXZlaWZuZXRhZGRyOwpzdGF0aWMgY2hhciAgICAgc2F2ZU5hbWVbMTZdOwojZW5kaWYKc3RhdGljIGludCAgICAgIHNhdmVJbmRleCA9IDA7CgovKioKKiBEZXRlcm1pbmVzIG5ldHdvcmsgaW50ZXJmYWNlIHNwZWVkLiBJdCBpcyBzeXN0ZW0gc3BlY2lmaWMuIE9ubHkgbGludXgKKiByZWFsaXphdGlvbiBpcyBtYWRlLiAKKi8KdW5zaWduZWQgaW50IGdldElmU3BlZWQoaW50IGZkLCBzdHJ1Y3QgaWZyZXEgaWZyLCB1bnNpZ25lZCBpbnQgZGVmYXVsdHNwZWVkKQp7CiNpZmRlZiBsaW51eAogICAgLyoqIHRlbXBvcmFyeSBleHBvc2UgaW50ZXJuYWwgdW50aWwgdGhpcyBtb2R1bGUgY2FuIGJlIHJlLXdyaXR0ZW4gKi8KICAgIGV4dGVybiB1bnNpZ25lZCBpbnQKICAgICAgICBuZXRzbm1wX2xpbnV4X2ludGVyZmFjZV9nZXRfaWZfc3BlZWQoaW50IGZkLCBjb25zdCBjaGFyICpuYW1lLAogICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBsb25nIGRlZmF1bHRzcGVlZCk7CgogICAgcmV0dXJuIG5ldHNubXBfbGludXhfaW50ZXJmYWNlX2dldF9pZl9zcGVlZChmZCwgaWZyLmlmcl9uYW1lLCBkZWZhdWx0c3BlZWQpOwojZWxzZSAvKiFsaW51eCovCQkJICAgCiAgICByZXR1cm4gZGVmYXVsdHNwZWVkOwojZW5kaWYgCn0KCnZvaWQKSW50ZXJmYWNlX1NjYW5fSW5pdCh2b2lkKQp7CiNpZmRlZiBsaW51eAogICAgY2hhciAgICAgICAgICAgIGxpbmVbMjU2XSwgaWZuYW1lX2J1Zls2NF0sICppZm5hbWUsICpwdHI7CiAgICBzdHJ1Y3QgaWZyZXEgICAgaWZycTsKICAgIHN0cnVjdCBpZm5ldCAgKippZm5ldGFkZHJfcHRyOwogICAgRklMRSAgICAgICAgICAgKmRldmluOwogICAgaW50ICAgICAgICAgICAgIGksIGZkOwogICAgY29uZl9pZl9saXN0ICAgKmlmX3B0cjsKICAgIC8qCiAgICAgKiBzY2FubGluZV8yXzI6CiAgICAgKiAgWyAgICAgICAgICAgICAgIElOICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICogICBieXRlIHBrdHMgZXJycyBkcm9wIGZpZm8gZnJhbWUgY21wcnMgbWNzdCB8CiAgICAgKiAgWyAgICAgICAgICAgICAgIE9VVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgKiAgIGJ5dGUgcGt0cyBlcnJzIGRyb3AgZmlmbyBjb2xscyBjYXJyaWVyIGNvbXByZXNzZWQKICAgICAqLwojaWZkZWYgU0NOdU1BWAogICAgdWludG1heF90ICAgICAgIHJlY19wa3QsIHJlY19vY3QsIHJlY19lcnIsIHJlY19kcm9wOwogICAgdWludG1heF90ICAgICAgIHNuZF9wa3QsIHNuZF9vY3QsIHNuZF9lcnIsIHNuZF9kcm9wLCBjb2xsOwogICAgY29uc3QgY2hhciAgICAgKnNjYW5fbGluZV8yXzIgPQogICAgICAgICIlIiAgIFNDTnVNQVggIiAlIiAgU0NOdU1BWCAiICUiICBTQ051TUFYICIgJSIgIFNDTnVNQVgKICAgICAgICAiICUqIiBTQ051TUFYICIgJSoiIFNDTnVNQVggIiAlKiIgU0NOdU1BWCAiICUqIiBTQ051TUFYCiAgICAgICAgIiAlIiAgU0NOdU1BWCAiICUiICBTQ051TUFYICIgJSIgIFNDTnVNQVggIiAlIiAgU0NOdU1BWAogICAgICAgICIgJSoiIFNDTnVNQVggIiAlIiAgU0NOdU1BWDsKICAgIGNvbnN0IGNoYXIgICAgICpzY2FuX2xpbmVfMl8wID0KICAgICAgICAiJSIgICBTQ051TUFYICIgJSIgIFNDTnVNQVggIiAlKiIgU0NOdU1BWCAiICUqIiBTQ051TUFYCiAgICAgICAgIiAlKiIgU0NOdU1BWCAiICUiICBTQ051TUFYICIgJSIgIFNDTnVNQVggIiAlKiIgU0NOdU1BWAogICAgICAgICIgJSoiIFNDTnVNQVggIiAlIiAgU0NOdU1BWDsKI2Vsc2UKICAgIHVuc2lnbmVkIGxvbmcgICByZWNfcGt0LCByZWNfb2N0LCByZWNfZXJyLCByZWNfZHJvcDsKICAgIHVuc2lnbmVkIGxvbmcgICBzbmRfcGt0LCBzbmRfb2N0LCBzbmRfZXJyLCBzbmRfZHJvcCwgY29sbDsKICAgIGNvbnN0IGNoYXIgICAgICpzY2FuX2xpbmVfMl8yID0KICAgICAgICAiJWx1ICVsdSAlbHUgJWx1ICUqbHUgJSpsdSAlKmx1ICUqbHUgJWx1ICVsdSAlbHUgJWx1ICUqbHUgJWx1IjsKICAgIGNvbnN0IGNoYXIgICAgICpzY2FuX2xpbmVfMl8wID0KICAgICAgICAiJWx1ICVsdSAlKmx1ICUqbHUgJSpsdSAlbHUgJWx1ICUqbHUgJSpsdSAlbHUiOwojZW5kaWYKICAgIGNvbnN0IGNoYXIgICAgICpzY2FuX2xpbmVfdG9fdXNlOwogICAgc3RydWN0IHRpbWV2YWwgZXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZWxhcHNlZCB0aW1lICovCgojZW5kaWYKCiNpZiAhZGVmaW5lZChocHV4MTEpICYmIGRlZmluZWQoSUZORVRfU1lNQk9MKQogICAgYXV0b19ubGlzdChJRk5FVF9TWU1CT0wsIChjaGFyICopICZpZm5ldGFkZHIsIHNpemVvZihpZm5ldGFkZHIpKTsKI2VuZGlmCiAgICBzYXZlSW5kZXggPSAwOwoKCiNpZmRlZiBsaW51eAogICAgLyogIGRpc2FsbG93IHJlbG9hZGluZyBvZiBzdHJ1Y3R1cmVzIHRvbyBvZnRlbiAqLwogICAgZ2V0dGltZW9mZGF5ICggJmV0LCAoIHN0cnVjdCB0aW1lem9uZSAqICkgMCApOyAgLyogIGdldCB0aW1lLW9mLWRheSAqLwogICAgaWYgKCBldC50dl9zZWMgPCBMYXN0TG9hZCArIE1JTkxPQURGUkVRICkgeyAgICAgLyogIG9ubHkgcmVsb2FkIHNvIG9mdGVuICovCiAgICAgIGlmbmV0YWRkciA9IGlmbmV0YWRkcl9saXN0OyAgICAgICAgICAgICAgICAgICAvKiAgaW5pdGlhbGl6ZSBwb2ludGVyICovCiAgICAgIHJldHVybjsKICAgIH0KICAgIExhc3RMb2FkID0gZXQudHZfc2VjOwoKICAgIC8qCiAgICAgKiBmcmVlIG9sZCBsaXN0OiAKICAgICAqLwogICAgd2hpbGUgKGlmbmV0YWRkcl9saXN0KSB7CiAgICAgICAgc3RydWN0IGlmbmV0ICAgKm9sZCA9IGlmbmV0YWRkcl9saXN0OwogICAgICAgIGlmbmV0YWRkcl9saXN0ID0gaWZuZXRhZGRyX2xpc3QtPmlmX25leHQ7CiAgICAgICAgZnJlZShvbGQtPmlmX25hbWUpOwogICAgICAgIGZyZWUob2xkLT5pZl91bml0KTsKICAgICAgICBmcmVlKG9sZCk7CiAgICB9CgogICAgaWZuZXRhZGRyID0gMDsKICAgIGlmbmV0YWRkcl9wdHIgPSAmaWZuZXRhZGRyX2xpc3Q7CgogICAgaWYgKChmZCA9IHNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCAwKSkgPCAwKSB7CiAgICAgICAgREVCVUdNU0dUTCgoInNubXBkIiwKICAgICAgICAgICAgICAgICAgICAic29ja2V0IG9wZW4gZmFpbHVyZSBpbiBJbnRlcmZhY2VfU2Nhbl9Jbml0XG4iKSk7CiAgICAgICAgcmV0dXJuOyAvKiogZXhpdCAoMSk7ICoqLwogICAgfQoKICAgIC8qCiAgICAgKiBidWlsZCB1cCBpZm5ldGFkZHIgbGlzdCBieSBoYW5kOiAKICAgICAqLwoKICAgIC8qCiAgICAgKiBhdCBsZWFzdCBsaW51eCB2MS4zLjUzIHNheXMgRU1GSUxFIHdpdGhvdXQgcmVhc29uLi4uIAogICAgICovCiAgICBpZiAoIShkZXZpbiA9IGZvcGVuKCIvcHJvYy9uZXQvZGV2IiwgInIiKSkpIHsKICAgICAgICBjbG9zZShmZCk7CiAgICAgICAgc25tcF9sb2coTE9HX0VSUiwgImNhbm5vdCBvcGVuIC9wcm9jL25ldC9kZXYgLSBjb250aW51aW5nLi4uXG4iKTsKICAgICAgICByZXR1cm47IC8qKiBleGl0ICgxKTsgKiovCiAgICB9CgogICAgaSA9IDA7CgogICAgLyoKICAgICAqIHJlYWQgdGhlIHNlY29uZCBsaW5lIChhIGhlYWRlcikgYW5kIGRldGVybWluZSB0aGUgZmllbGRzIHdlCiAgICAgKiBzaG91bGQgcmVhZCBmcm9tLiAgVGhpcyBzaG91bGQgYmUgZG9uZSBpbiBhIGJldHRlciB3YXkgYnkKICAgICAqIGFjdHVhbGx5IGxvb2tpbmcgZm9yIHRoZSBmaWVsZCBuYW1lcyB3ZSB3YW50LiAgQnV0IHRoYXRzIHRvbwogICAgICogbXVjaCB3b3JrIGZvciB0b2RheS4gIC0tIFdlcyAKICAgICAqLwogICAgZmdldHMobGluZSwgc2l6ZW9mKGxpbmUpLCBkZXZpbik7CiAgICBmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIGRldmluKTsKICAgIGlmIChzdHJzdHIobGluZSwgImNvbXByZXNzZWQiKSkgewogICAgICAgIHNjYW5fbGluZV90b191c2UgPSBzY2FuX2xpbmVfMl8yOwogICAgICAgIERFQlVHTVNHVEwoKCJtaWJJSS9pbnRlcmZhY2VzIiwKICAgICAgICAgICAgICAgICAgICAidXNpbmcgbGludXggMi4yIGtlcm5lbCAvcHJvYy9uZXQvZGV2XG4iKSk7CiAgICB9IGVsc2UgewogICAgICAgIHNjYW5fbGluZV90b191c2UgPSBzY2FuX2xpbmVfMl8wOwogICAgICAgIERFQlVHTVNHVEwoKCJtaWJJSS9pbnRlcmZhY2VzIiwKICAgICAgICAgICAgICAgICAgICAidXNpbmcgbGludXggMi4wIGtlcm5lbCAvcHJvYy9uZXQvZGV2XG4iKSk7CiAgICB9CgoKICAgIHdoaWxlIChmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIGRldmluKSkgewogICAgICAgIHN0cnVjdCBpZm5ldCAgICpubmV3OwogICAgICAgIGNoYXIgICAgICAgICAgICpzdGF0cywgKmlmc3RhcnQgPSBsaW5lOwoKICAgICAgICBpZiAobGluZVtzdHJsZW4obGluZSkgLSAxXSA9PSAnXG4nKQogICAgICAgICAgICBsaW5lW3N0cmxlbihsaW5lKSAtIDFdID0gJ1wwJzsKCiAgICAgICAgd2hpbGUgKCppZnN0YXJ0ICYmICppZnN0YXJ0ID09ICcgJykKICAgICAgICAgICAgaWZzdGFydCsrOwoKICAgICAgICBpZiAoISppZnN0YXJ0IHx8ICgoc3RhdHMgPSBzdHJyY2hyKGlmc3RhcnQsICc6JykpID09IE5VTEwpKSB7CiAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsCiAgICAgICAgICAgICAgICAgICAgICIvcHJvYy9uZXQvZGV2IGRhdGEgZm9ybWF0IGVycm9yLCBsaW5lID09fCVzfCIsIGxpbmUpOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgaWYgKChzY2FuX2xpbmVfdG9fdXNlID09IHNjYW5fbGluZV8yXzIpICYmICgoc3RhdHMgLSBsaW5lKSA8IDYpKSB7CiAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsCiAgICAgICAgICAgICAgICAgICAgICIvcHJvYy9uZXQvZGV2IGRhdGEgZm9ybWF0IGVycm9yLCBsaW5lID09fCVzfCIsIGxpbmUpOwogICAgICAgIH0KCiAgICAgICAgKnN0YXRzICAgPSAwOwogICAgICAgIHN0cmxjcHkoaWZuYW1lX2J1ZiwgaWZzdGFydCwgc2l6ZW9mKGlmbmFtZV9idWYpKTsKICAgICAgICAqc3RhdHMrKyA9ICc6JzsKICAgICAgICB3aGlsZSAoKnN0YXRzID09ICcgJykKICAgICAgICAgICAgc3RhdHMrKzsKCiAgICAgICAgaWYgKChzY2FuX2xpbmVfdG9fdXNlID09IHNjYW5fbGluZV8yXzIgJiYKICAgICAgICAgICAgIHNzY2FuZihzdGF0cywgc2Nhbl9saW5lX3RvX3VzZSwgJnJlY19vY3QsICZyZWNfcGt0LCAmcmVjX2VyciwKICAgICAgICAgICAgICAgICAgICAmcmVjX2Ryb3AsICZzbmRfb2N0LCAmc25kX3BrdCwgJnNuZF9lcnIsICZzbmRfZHJvcCwKICAgICAgICAgICAgICAgICAgICAmY29sbCkgIT0gOSkgfHwgKHNjYW5fbGluZV90b191c2UgPT0gc2Nhbl9saW5lXzJfMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgc3NjYW5mKHN0YXRzLCBzY2FuX2xpbmVfdG9fdXNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWNfcGt0LCAmcmVjX2VyciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc25kX3BrdCwgJnNuZF9lcnIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbGwpICE9IDUpKSB7CiAgICAgICAgICAgIGlmICgoc2Nhbl9saW5lX3RvX3VzZSA9PSBzY2FuX2xpbmVfMl8yKQogICAgICAgICAgICAgICAgJiYgIXN0cnN0cihsaW5lLCAiTm8gc3RhdGlzdGljcyBhdmFpbGFibGUiKSkKICAgICAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiL3Byb2MvbmV0L2RldiBkYXRhIGZvcm1hdCBlcnJvciwgbGluZSA9PXwlc3wiLAogICAgICAgICAgICAgICAgICAgICAgICAgbGluZSk7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KCiAgICAgICAgbm5ldyA9IChzdHJ1Y3QgaWZuZXQgKikgY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgaWZuZXQpKTsKICAgICAgICBpZiAobm5ldyA9PSBOVUxMKQogICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgIC8qIGFsbG9jIGVycm9yICovCgogICAgICAgIC8qCiAgICAgICAgICogY2hhaW4gaW46IAogICAgICAgICAqLwogICAgICAgICppZm5ldGFkZHJfcHRyID0gbm5ldzsKICAgICAgICBpZm5ldGFkZHJfcHRyID0gJm5uZXctPmlmX25leHQ7CiAgICAgICAgaSsrOwoKICAgICAgICAvKgogICAgICAgICAqIGxpbnV4IHByZXZpb3VzIHRvIDEuMy5+MTMgbWF5IG1pc3MgdHJhbnNtaXR0ZWQgbG9vcGJhY2sgcGt0czogCiAgICAgICAgICovCiAgICAgICAgaWYgKCFzdHJjbXAoaWZuYW1lX2J1ZiwgImxvIikgJiYgcmVjX3BrdCA+IDAgJiYgIXNuZF9wa3QpCiAgICAgICAgICAgIHNuZF9wa3QgPSByZWNfcGt0OwoKICAgICAgICBubmV3LT5pZl9pcGFja2V0cyA9IHJlY19wa3QgJiAweGZmZmZmZmZmOwogICAgICAgIG5uZXctPmlmX2llcnJvcnMgPSByZWNfZXJyOwogICAgICAgIG5uZXctPmlmX29wYWNrZXRzID0gc25kX3BrdCAmIDB4ZmZmZmZmZmY7CiAgICAgICAgbm5ldy0+aWZfb2Vycm9ycyA9IHNuZF9lcnI7CiAgICAgICAgbm5ldy0+aWZfY29sbGlzaW9ucyA9IGNvbGw7CiAgICAgICAgaWYgKHNjYW5fbGluZV90b191c2UgPT0gc2Nhbl9saW5lXzJfMikgewogICAgICAgICAgICBubmV3LT5pZl9pYnl0ZXMgPSByZWNfb2N0ICYgMHhmZmZmZmZmZjsKICAgICAgICAgICAgbm5ldy0+aWZfb2J5dGVzID0gc25kX29jdCAmIDB4ZmZmZmZmZmY7CiAgICAgICAgICAgIG5uZXctPmlmX2lxZHJvcHMgPSByZWNfZHJvcDsKICAgICAgICAgICAgbm5ldy0+aWZfc25kLmlmcV9kcm9wcyA9IHNuZF9kcm9wOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIG5uZXctPmlmX2lieXRlcyA9IChyZWNfcGt0ICogMzA4KSAmIDB4ZmZmZmZmZmY7CiAgICAgICAgICAgIG5uZXctPmlmX29ieXRlcyA9IChzbmRfcGt0ICogMzA4KSAmIDB4ZmZmZmZmZmY7CiAgICAgICAgfQoKICAgICAgICAvKgogICAgICAgICAqIGlmbmFtZXMgYXJlIGdpdmVuIGFzIGBgICAgZXRoMCcnOiBzcGxpdCBpbiBgYGV0aCcnIGFuZCBgYDAnJzogCiAgICAgICAgICovCiAgICAgICAgZm9yIChpZm5hbWUgPSBpZm5hbWVfYnVmOyAqaWZuYW1lICYmICppZm5hbWUgPT0gJyAnOyBpZm5hbWUrKyk7CgogICAgICAgIC8qCiAgICAgICAgICogc2V0IG5hbWUgYW5kIGludGVyZmFjZSMgOiAKICAgICAgICAgKi8KICAgICAgICBubmV3LT5pZl9uYW1lID0gKGNoYXIgKikgc3RyZHVwKGlmbmFtZSk7CiAgICAgICAgZm9yIChwdHIgPSBubmV3LT5pZl9uYW1lOyAqcHRyICYmICgqcHRyIDwgJzAnIHx8ICpwdHIgPiAnOScpOwogICAgICAgICAgICAgcHRyKyspOwogICAgICAgIG5uZXctPmlmX3VuaXQgPSBzdHJkdXAoKnB0ciA/IHB0ciA6ICIiKTsKICAgICAgICAqcHRyID0gMDsKCiAgICAgICAgc3RybGNweShpZnJxLmlmcl9uYW1lLCBpZm5hbWUsIHNpemVvZihpZnJxLmlmcl9uYW1lKSk7CiAgICAgICAgaWYgKGlvY3RsKGZkLCBTSU9DR0lGQUREUiwgJmlmcnEpIDwgMCkKICAgICAgICAgICAgbWVtc2V0KChjaGFyICopICZubmV3LT5pZl9hZGRyLCAwLCBzaXplb2Yobm5ldy0+aWZfYWRkcikpOwogICAgICAgIGVsc2UKICAgICAgICAgICAgbm5ldy0+aWZfYWRkciA9IGlmcnEuaWZyX2FkZHI7CgogICAgICAgIHN0cmxjcHkoaWZycS5pZnJfbmFtZSwgaWZuYW1lLCBzaXplb2YoaWZycS5pZnJfbmFtZSkpOwogICAgICAgIGlmIChpb2N0bChmZCwgU0lPQ0dJRkJSREFERFIsICZpZnJxKSA8IDApCiAgICAgICAgICAgIG1lbXNldCgoY2hhciAqKSAmbm5ldy0+aWZ1X2Jyb2FkYWRkciwgMCwKICAgICAgICAgICAgICAgICAgIHNpemVvZihubmV3LT5pZnVfYnJvYWRhZGRyKSk7CiAgICAgICAgZWxzZQogICAgICAgICAgICBubmV3LT5pZnVfYnJvYWRhZGRyID0gaWZycS5pZnJfYnJvYWRhZGRyOwoKICAgICAgICBzdHJsY3B5KGlmcnEuaWZyX25hbWUsIGlmbmFtZSwgc2l6ZW9mKGlmcnEuaWZyX25hbWUpKTsKICAgICAgICBpZiAoaW9jdGwoZmQsIFNJT0NHSUZORVRNQVNLLCAmaWZycSkgPCAwKQogICAgICAgICAgICBtZW1zZXQoKGNoYXIgKikgJm5uZXctPmlhX3N1Ym5ldG1hc2ssIDAsCiAgICAgICAgICAgICAgICAgICBzaXplb2Yobm5ldy0+aWFfc3VibmV0bWFzaykpOwogICAgICAgIGVsc2UKICAgICAgICAgICAgbm5ldy0+aWFfc3VibmV0bWFzayA9IGlmcnEuaWZyX25ldG1hc2s7CgogICAgICAgIHN0cmxjcHkoaWZycS5pZnJfbmFtZSwgaWZuYW1lLCBzaXplb2YoaWZycS5pZnJfbmFtZSkpOwogICAgICAgIG5uZXctPmlmX2ZsYWdzID0gaW9jdGwoZmQsIFNJT0NHSUZGTEFHUywgJmlmcnEpIDwgMAogICAgICAgICAgICA/IDAgOiBpZnJxLmlmcl9mbGFnczsKCiAgICAgICAgbm5ldy0+aWZfdHlwZSA9IDA7CgogICAgICAgIC8qCiAgICAgICAgICogTk9URTogdGhpcyBpb2N0bCBkb2VzIG5vdCBndWFyYW50ZWUgNiBieXRlcyBvZiBhIHBoeXNhZGRyLgogICAgICAgICAqIEluIHBhcnRpY3VsYXIsIGEgJ3NpdDAnIGludGVyZmFjZSBvbmx5IGFwcGVhcnMgdG8gZ2V0IGJhY2sKICAgICAgICAgKiA0IGJ5dGVzIG9mIHNhX2RhdGEuCiAgICAgICAgICovCiAgICAgICAgbWVtc2V0KGlmcnEuaWZyX2h3YWRkci5zYV9kYXRhLCAoMCksIElGSFdBRERSTEVOKTsKICAgICAgICBzdHJsY3B5KGlmcnEuaWZyX25hbWUsIGlmbmFtZSwgc2l6ZW9mKGlmcnEuaWZyX25hbWUpKTsKICAgICAgICBpZiAoaW9jdGwoZmQsIFNJT0NHSUZIV0FERFIsICZpZnJxKSA8IDApCiAgICAgICAgICAgIG1lbXNldChubmV3LT5pZl9od2FkZHIsICgwKSwgSUZIV0FERFJMRU4pOwogICAgICAgIGVsc2UgewogICAgICAgICAgICBtZW1jcHkobm5ldy0+aWZfaHdhZGRyLCBpZnJxLmlmcl9od2FkZHIuc2FfZGF0YSwgSUZIV0FERFJMRU4pOwoKI2lmZGVmIEFSUEhSRF9MT09QQkFDSwogICAgICAgICAgICBzd2l0Y2ggKGlmcnEuaWZyX2h3YWRkci5zYV9mYW1pbHkpIHsKICAgICAgICAgICAgY2FzZSBBUlBIUkRfRVRIRVI6CiAgICAgICAgICAgICAgICBubmV3LT5pZl90eXBlID0gNjsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIEFSUEhSRF9UVU5ORUw6CiAgICAgICAgICAgIGNhc2UgQVJQSFJEX1RVTk5FTDY6CiNpZmRlZiBBUlBIUkRfSVBHUkUKICAgICAgICAgICAgY2FzZSBBUlBIUkRfSVBHUkU6CiNlbmRpZgogICAgICAgICAgICBjYXNlIEFSUEhSRF9TSVQ6CiAgICAgICAgICAgICAgICBubmV3LT5pZl90eXBlID0gMTMxOwogICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgIC8qIHR1bm5lbCAqLwogICAgICAgICAgICBjYXNlIEFSUEhSRF9TTElQOgogICAgICAgICAgICBjYXNlIEFSUEhSRF9DU0xJUDoKICAgICAgICAgICAgY2FzZSBBUlBIUkRfU0xJUDY6CiAgICAgICAgICAgIGNhc2UgQVJQSFJEX0NTTElQNjoKICAgICAgICAgICAgICAgIG5uZXctPmlmX3R5cGUgPSAyODsKICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAvKiBzbGlwICovCiAgICAgICAgICAgIGNhc2UgQVJQSFJEX1BQUDoKICAgICAgICAgICAgICAgIG5uZXctPmlmX3R5cGUgPSAyMzsKICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAvKiBwcHAgKi8KICAgICAgICAgICAgY2FzZSBBUlBIUkRfTE9PUEJBQ0s6CiAgICAgICAgICAgICAgICBubmV3LT5pZl90eXBlID0gMjQ7CiAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgLyogc29mdHdhcmVMb29wYmFjayAqLwogICAgICAgICAgICBjYXNlIEFSUEhSRF9GRERJOgogICAgICAgICAgICAgICAgbm5ldy0+aWZfdHlwZSA9IDE1OwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgQVJQSFJEX0FSQ05FVDoKICAgICAgICAgICAgICAgIG5uZXctPmlmX3R5cGUgPSAzNTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIEFSUEhSRF9MT0NBTFRMSzoKICAgICAgICAgICAgICAgIG5uZXctPmlmX3R5cGUgPSA0MjsKICAgICAgICAgICAgICAgIGJyZWFrOwojaWZkZWYgQVJQSFJEX0hJUFBJCiAgICAgICAgICAgIGNhc2UgQVJQSFJEX0hJUFBJOgogICAgICAgICAgICAgICAgbm5ldy0+aWZfdHlwZSA9IDQ3OwogICAgICAgICAgICAgICAgYnJlYWs7CiNlbmRpZgojaWZkZWYgQVJQSFJEX0FUTQogICAgICAgICAgICBjYXNlIEFSUEhSRF9BVE06CiAgICAgICAgICAgICAgICBubmV3LT5pZl90eXBlID0gMzc7CiAgICAgICAgICAgICAgICBicmVhazsKI2VuZGlmCiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogWFhYOiBtb3JlIGlmX2FycC5oOkFSUEhEUl94eHggdG8gSUFOQWlmVHlwZSBtYXBwaW5ncy4uLiAKICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICB9CiNlbmRpZgogICAgICAgIH0KCiAgICAgICAgc3RybGNweShpZnJxLmlmcl9uYW1lLCBpZm5hbWUsIHNpemVvZihpZnJxLmlmcl9uYW1lKSk7CiAgICAgICAgbm5ldy0+aWZfbWV0cmljID0gaW9jdGwoZmQsIFNJT0NHSUZNRVRSSUMsICZpZnJxKSA8IDAKICAgICAgICAgICAgPyAwIDogaWZycS5pZnJfbWV0cmljOwoKI2lmZGVmIFNJT0NHSUZNVFUKICAgICAgICBzdHJsY3B5KGlmcnEuaWZyX25hbWUsIGlmbmFtZSwgc2l6ZW9mKGlmcnEuaWZyX25hbWUpKTsKICAgICAgICBubmV3LT5pZl9tdHUgPSAoaW9jdGwoZmQsIFNJT0NHSUZNVFUsICZpZnJxKSA8IDApCiAgICAgICAgICAgID8gMCA6IGlmcnEuaWZyX210dTsKI2Vsc2UKICAgICAgICBubmV3LT5pZl9tdHUgPSAwOwojZW5kaWYKCiAgICAgICAgaWZfcHRyID0gbmV0c25tcF9hY2Nlc3NfaW50ZXJmYWNlX2VudHJ5X292ZXJyaWRlc19nZXQoaWZuYW1lKTsKICAgICAgICBpZiAoaWZfcHRyKSB7CiAgICAgICAgICAgIG5uZXctPmlmX3R5cGUgPSBpZl9wdHItPnR5cGU7CiAgICAgICAgICAgIG5uZXctPmlmX3NwZWVkID0gaWZfcHRyLT5zcGVlZDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBkbyBvbmx5IGd1ZXNzIGlmX3R5cGUgZnJvbSBuYW1lLCBpZiB3ZSBjb3VsZCBub3QgcmVhZAogICAgICAgICAgICAgKiAqIGl0IGJlZm9yZSBmcm9tIFNJT0NHSUZIV0FERFIgCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB1bnNpZ25lZCBpbnQgZGVmYXVsdHNwZWVkID0gTk9NSU5BTF9MSU5LX1NQRUVEOwogICAgICAgICAgICAgICAgaWYgKCEobm5ldy0+aWZfZmxhZ3MgJiBJRkZfUlVOTklORykpIHsKICAgICAgICAgICAgICAgICAgICAvKiAKICAgICAgICAgICAgICAgICAgICAgKiB1c2Ugc3BlZWQgMCBpZiB0aGUgaWYgc3BlZWQgY2Fubm90IGJlIGRldGVybWluZWQgKmFuZCogdGhlCiAgICAgICAgICAgICAgICAgICAgICogaW50ZXJmYWNlIGlzIGRvd24KICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICBkZWZhdWx0c3BlZWQgPSAwOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFubmV3LT5pZl90eXBlKQogICAgICAgICAgICAgICAgbm5ldy0+aWZfdHlwZSA9IGlmX3R5cGVfZnJvbV9uYW1lKG5uZXctPmlmX25hbWUpOwogICAgICAgICAgICBzd2l0Y2gobm5ldy0+aWZfdHlwZSkgewogICAgICAgICAgICBjYXNlIDY6CiAgICAgICAgICAgICAgICBubmV3LT5pZl9zcGVlZCA9IGdldElmU3BlZWQoZmQsIGlmcnEsIGRlZmF1bHRzcGVlZCk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAyNDoKICAgICAgICAgICAgICAgIG5uZXctPmlmX3NwZWVkID0gMTAwMDAwMDA7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSA5OgogICAgICAgICAgICAgICAgbm5ldy0+aWZfc3BlZWQgPSA0MDAwMDAwOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICBubmV3LT5pZl9zcGVlZCA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLypaZXJvIHNwZWVkIG1lYW5zIGxpbmsgcHJvYmxlbSovCiAgICAgICAgICAgIGlmKG5uZXctPmlmX3NwZWVkID09IDAgJiYgbm5ldy0+aWZfZmxhZ3MgJiBJRkZfVVApewogICAgICAgICAgICAgICAgbm5ldy0+aWZfZmxhZ3MgJj0gfklGRl9SVU5OSU5HOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB3aGlsZSAoZmdldHMgLi4uICovCgogICAgaWZuZXRhZGRyID0gaWZuZXRhZGRyX2xpc3Q7CgogICAgaWYgKHNubXBfZ2V0X2RvX2RlYnVnZ2luZygpKSB7CiAgICAgICAgewogICAgICAgICAgICBzdHJ1Y3QgaWZuZXQgICAqeCA9IGlmbmV0YWRkcjsKICAgICAgICAgICAgREVCVUdNU0dUTCgoIm1pYklJL2ludGVyZmFjZXMiLCAiKiBzZWU6IGtub3duIGludGVyZmFjZXM6IikpOwogICAgICAgICAgICB3aGlsZSAoeCkgewogICAgICAgICAgICAgICAgREVCVUdNU0coKCJtaWJJSS9pbnRlcmZhY2VzIiwgIiAlcyIsIHgtPmlmX25hbWUpKTsKICAgICAgICAgICAgICAgIHggPSB4LT5pZl9uZXh0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIERFQlVHTVNHKCgibWliSUkvaW50ZXJmYWNlcyIsICJcbiIpKTsKICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAvKiBYWFggKi8KICAgIH0KCiAgICBmY2xvc2UoZGV2aW4pOwogICAgY2xvc2UoZmQpOwojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxpbnV4ICovCn0KCgoKI2lmIGRlZmluZWQoc3VuVjMpIHx8IGRlZmluZWQobGludXgpCi8qCiAqICoqICA0LjIgQlNEIGRvZXNuJ3QgaGF2ZSBpZmFkZHIKICogKiogIAogKi8KaW50CkludGVyZmFjZV9TY2FuX05leHQoc2hvcnQgKkluZGV4LAogICAgICAgICAgICAgICAgICAgIGNoYXIgKk5hbWUsCiAgICAgICAgICAgICAgICAgICAgc3RydWN0IGlmbmV0ICpSZXRpZm5ldCwgc3RydWN0IGluX2lmYWRkciAqZHVtbXkpCnsKICAgIGludCByZXR1cm5JbmRleCA9IDA7CiAgICBpbnQgcmV0OwogICAgaWYgKEluZGV4KQogICAgICAgIHJldHVybkluZGV4ID0gKkluZGV4OwoKICAgIHJldCA9IEludGVyZmFjZV9TY2FuX05leHRJbnQoICZyZXR1cm5JbmRleCwgTmFtZSwgUmV0aWZuZXQsIGR1bW15ICk7CiAgICBpZiAoSW5kZXgpCiAgICAgICAgKkluZGV4ID0gKHJldHVybkluZGV4ICYgMHg4ZmZmKTsKICAgIHJldHVybiByZXQ7Cn0KCmludApJbnRlcmZhY2VfU2Nhbl9OZXh0SW50KGludCAqSW5kZXgsCiAgICAgICAgICAgICAgICAgICAgY2hhciAqTmFtZSwKICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaWZuZXQgKlJldGlmbmV0LCBzdHJ1Y3QgaW5faWZhZGRyICpkdW1teSkKewogICAgc3RydWN0IGlmbmV0ICAgIGlmbmV0OwogICAgcmVnaXN0ZXIgY2hhciAgKmNwOwoKICAgIHdoaWxlIChpZm5ldGFkZHIpIHsKICAgICAgICAvKgogICAgICAgICAqICAgICAgR2V0IHRoZSAiaWZuZXQiIHN0cnVjdHVyZSBhbmQgZXh0cmFjdCB0aGUgZGV2aWNlIG5hbWUKICAgICAgICAgKi8KI2lmbmRlZiBsaW51eAogICAgICAgIGlmICghTkVUU05NUF9LTE9PS1VQKGlmbmV0YWRkciwgKGNoYXIgKikgJmlmbmV0LCBzaXplb2YgaWZuZXQpKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJtaWJJSS9pbnRlcmZhY2VzOkludGVyZmFjZV9TY2FuX05leHQiLCAia2xvb2t1cCBmYWlsZWRcbiIpKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQoKICAgICAgICBpZiAoIU5FVFNOTVBfS0xPT0tVUChpZm5ldC5pZl9uYW1lLCAoY2hhciAqKSBzYXZlTmFtZSwgc2l6ZW9mIHNhdmVOYW1lKSkgewogICAgICAgICAgICBERUJVR01TR1RMKCgibWliSUkvaW50ZXJmYWNlczpJbnRlcmZhY2VfU2Nhbl9OZXh0IiwgImtsb29rdXAgZmFpbGVkXG4iKSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCiAgICAgICAvKgogICAgICAgICogVGhlIHB1cnBvc2Ugb2YgdGhpcyBjb21wYXJpc29uIGlzIGxvc3QgaW4gdGhlIG1pc3RzIG9mIHRpbWUuCiAgICAgICAgKiBJdCdzIGJlZW4gYXJvdW5kIGF0IGxlYXN0IGNtdS1zbm1wIDIuMS4yIGZvciBTVU52MyBzeXN0ZW1zIGFuZAogICAgICAgICogd2FzIGFwcGxpZWQgdG8gbGludXggc3lzdGVtcyBkdXJpbmcgdGhlIGNtdS1zbm1wLWxpbnV4IHByb2plY3QuCiAgICAgICAgKiBOby1vbmUgbm93IGtub3dzIHdoYXQgaXQgd2FzIGludGVuZGVkIGZvciwgYW5kIGl0IGJyZWFrcyBJUHY2CiAgICAgICAgKiB0dW5uZWwgaW50ZXJmYWNlcywgc28gaXQncyBiZWVuIG1vdmVkIG91dCBvZiB0aGUgTGludXggY29kZSBibG9jay4KICAgICAgICAqLwogICAgICAgIGlmIChzdHJjbXAoc2F2ZU5hbWUsICJpcCIpID09IDApIHsKICAgICAgICAgICAgaWZuZXRhZGRyID0gaWZuZXQuaWZfbmV4dDsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgfQojZWxzZQogICAgICAgIGlmbmV0ID0gKmlmbmV0YWRkcjsKICAgICAgICBzdHJsY3B5KHNhdmVOYW1lLCBpZm5ldC5pZl9uYW1lLCBzaXplb2Yoc2F2ZU5hbWUpKTsKI2VuZGlmCgogICAgICAgIHNhdmVOYW1lW3NpemVvZihzYXZlTmFtZSkgLSAxXSA9ICdcMCc7CiAgICAgICAgY3AgPSAoY2hhciAqKSBzdHJjaHIoc2F2ZU5hbWUsICdcMCcpOwojaWZkZWYgbGludXgKICAgICAgICBzdHJsY2F0KHNhdmVOYW1lLCBpZm5ldC5pZl91bml0LCBzaXplb2Yoc2F2ZU5hbWUpKTsKI2Vsc2UKICAgICAgICBzdHJpbmdfYXBwZW5kX2ludChjcCwgaWZuZXQuaWZfdW5pdCk7CiNlbmRpZgogICAgICAgIGlmICgxIHx8IHN0cmNtcChzYXZlTmFtZSwgImxvMCIpICE9IDApIHsgICAgICAgIC8qIFhYWCAqLwoKICAgICAgICAgICAgaWYgKEluZGV4KQogICAgICAgICAgICAgICAgKkluZGV4ID0gKytzYXZlSW5kZXg7CiAgICAgICAgICAgIGlmIChSZXRpZm5ldCkKICAgICAgICAgICAgICAgICpSZXRpZm5ldCA9IGlmbmV0OwogICAgICAgICAgICBpZiAoTmFtZSkKICAgICAgICAgICAgICAgIHN0cmNweShOYW1lLCBzYXZlTmFtZSk7CiAgICAgICAgICAgIHNhdmVpZm5ldCA9IGlmbmV0OwogICAgICAgICAgICBzYXZlaWZuZXRhZGRyID0gaWZuZXRhZGRyOwogICAgICAgICAgICBpZm5ldGFkZHIgPSBpZm5ldC5pZl9uZXh0OwoKICAgICAgICAgICAgcmV0dXJuICgxKTsgICAgICAgICAvKiBET05FICovCiAgICAgICAgfQogICAgICAgIGlmbmV0YWRkciA9IGlmbmV0LmlmX25leHQ7CiAgICB9CiAgICByZXR1cm4gKDApOyAgICAgICAgICAgICAgICAgLyogRU9GICovCn0KCiNpZmRlZiBsaW51eAppbnQKSW50ZXJmYWNlX0luZGV4X0J5X05hbWUoY2hhciAqTmFtZSwgaW50IExlbikKewogICAgaW50ICAgICAgICAgICAgIGlmSW5kZXggPSAwOwogICAgY2hhciAgICAgICAgICAgIGlmTmFtZVsyMF07CgogICAgSW50ZXJmYWNlX1NjYW5fSW5pdCgpOwogICAgd2hpbGUgKEludGVyZmFjZV9TY2FuX05leHRJbnQoJmlmSW5kZXgsIGlmTmFtZSwgTlVMTCwgTlVMTCkKICAgICAgICAgICAmJiBzdHJjbXAoTmFtZSwgaWZOYW1lKSk7CiAgICByZXR1cm4gaWZJbmRleDsKfQojZW5kaWYKCgojZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN1blYzIHx8IGxpbnV4ICovCgojaWYgZGVmaW5lZChuZXRic2QxKSB8fCBkZWZpbmVkKG9wZW5ic2QyKQojZGVmaW5lIGlhX25leHQgaWFfbGlzdC50cWVfbmV4dAojZGVmaW5lIGlmX25leHQgaWZfbGlzdC50cWVfbmV4dAojZW5kaWYKCiNpZiBkZWZpbmVkKGhwdXgxMSkKaW50CkludGVyZmFjZV9TY2FuX05leHQoc2hvcnQgKkluZGV4LCBjaGFyICpOYW1lLCBubWFwaV9waHlzdGF0ICogUmV0aWZuZXQpCnsKICAgIGludCByZXR1cm5JbmRleCA9IDA7CiAgICBpbnQgcmV0OwogICAgaWYgKEluZGV4KQogICAgICAgIHJldHVybkluZGV4ID0gKkluZGV4OwoKICAgIHJldCA9IEludGVyZmFjZV9TY2FuX05leHRJbnQoICZyZXR1cm5JbmRleCwgTmFtZSwgUmV0aWZuZXQgKTsKICAgIGlmIChJbmRleCkKICAgICAgICAqSW5kZXggPSAocmV0dXJuSW5kZXggJiAweDhmZmYpOwogICAgcmV0dXJuIHJldDsKfQoKCmludApJbnRlcmZhY2VfU2Nhbl9OZXh0SW50KGludCAqSW5kZXgsIGNoYXIgKk5hbWUsIG5tYXBpX3BoeXN0YXQgKiBSZXRpZm5ldCkKewogICAgc3RhdGljIG5tYXBpX3BoeXN0YXQgKmlmX3B0ciA9IChubWFwaV9waHlzdGF0ICopIDA7CiAgICBpbnQgICAgICAgICAgICAgY291bnQgPSBJbnRlcmZhY2VfU2Nhbl9HZXRfQ291bnQoKTsKICAgIHVuc2lnbmVkIGludCAgICB1bGVuOwogICAgaW50ICAgICAgICAgICAgIHJldDsKCiAgICBpZiAoIWlmX3B0cikgewogICAgICAgIGlmIChjb3VudCkgewogICAgICAgICAgICBpZl9wdHIgPQogICAgICAgICAgICAgICAgKG5tYXBpX3BoeXN0YXQgKikgbWFsbG9jKHNpemVvZihubWFwaV9waHlzdGF0KSAqIGNvdW50KTsKICAgICAgICAgICAgaWYgKGlmX3B0ciA9PSBOVUxMKQogICAgICAgICAgICAgICAgcmV0dXJuICgwKTsKCiAgICAgICAgfSBlbHNlCiAgICAgICAgICAgIHJldHVybiAoMCk7ICAgICAgICAgLyogRU9GICovCiAgICB9CgogICAgaWYgKHNhdmVJbmRleCA+PSBjb3VudCkKICAgICAgICByZXR1cm4gKDApOyAgICAgICAgICAgICAvKiBFT0YgKi8KCiAgICB1bGVuID0gKHVuc2lnbmVkIGludCkgY291bnQgKnNpemVvZihubWFwaV9waHlzdGF0KTsKICAgIGlmICgocmV0ID0gZ2V0X3BoeXNpY2FsX3N0YXQoaWZfcHRyLCAmdWxlbikpIDwgMCkKICAgICAgICByZXR1cm4gKDApOyAgICAgICAgICAgICAvKiBFT0YgKi8KCiAgICBpZiAoUmV0aWZuZXQpCiAgICAgICAgKlJldGlmbmV0ID0gaWZfcHRyW3NhdmVJbmRleF07CiAgICBpZiAoTmFtZSkKICAgICAgICBzdHJjcHkoTmFtZSwgaWZfcHRyW3NhdmVJbmRleF0ubm1fZGV2aWNlKTsKICAgIHNhdmVJbmRleCsrOwogICAgaWYgKEluZGV4KQogICAgICAgICpJbmRleCA9IHNhdmVJbmRleDsKICAgIHJldHVybiAoMSk7ICAgICAgICAgICAgICAgICAvKiBET05FICovCn0KCiNlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaHB1eDExICovCmludApJbnRlcmZhY2VfU2Nhbl9OZXh0KHNob3J0ICpJbmRleCwKICAgICAgICAgICAgICAgICAgICBjaGFyICpOYW1lLAogICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpZm5ldCAqUmV0aWZuZXQsIHN0cnVjdCBpbl9pZmFkZHIgKlJldGluX2lmYWRkcikKewogICAgaW50IHJldHVybkluZGV4ID0gMDsKICAgIGludCByZXQ7CiAgICBpZiAoSW5kZXgpCiAgICAgICAgcmV0dXJuSW5kZXggPSAqSW5kZXg7CgogICAgcmV0ID0gSW50ZXJmYWNlX1NjYW5fTmV4dEludCggJnJldHVybkluZGV4LCBOYW1lLCBSZXRpZm5ldCwgUmV0aW5faWZhZGRyICk7CiAgICBpZiAoSW5kZXgpCiAgICAgICAgKkluZGV4ID0gKHJldHVybkluZGV4ICYgMHg4ZmZmKTsKICAgIHJldHVybiByZXQ7Cn0KCgppbnQKSW50ZXJmYWNlX1NjYW5fTmV4dEludChpbnQgKkluZGV4LAogICAgICAgICAgICAgICAgICAgIGNoYXIgKk5hbWUsCiAgICAgICAgICAgICAgICAgICAgc3RydWN0IGlmbmV0ICpSZXRpZm5ldCwgc3RydWN0IGluX2lmYWRkciAqUmV0aW5faWZhZGRyKQp7CiAgICBzdHJ1Y3QgaWZuZXQgICAgaWZuZXQ7CiAgICBzdHJ1Y3QgaW5faWZhZGRyICppYSwgaW5faWZhZGRyOwogICAgc2hvcnQgICAgICAgICAgIGhhc19pcGFkZHIgPSAwOwojaWYgIUhBVkVfU1RSVUNUX0lGTkVUX0lGX1hOQU1FCiAgICByZWdpc3RlciBjaGFyICAqY3A7CiNlbmRpZgoKICAgIHdoaWxlIChpZm5ldGFkZHIpIHsKICAgICAgICAvKgogICAgICAgICAqICAgICAgR2V0IHRoZSAiaWZuZXQiIHN0cnVjdHVyZSBhbmQgZXh0cmFjdCB0aGUgZGV2aWNlIG5hbWUKICAgICAgICAgKi8KICAgICAgICBpZiAoIU5FVFNOTVBfS0xPT0tVUChpZm5ldGFkZHIsIChjaGFyICopICZpZm5ldCwgc2l6ZW9mIGlmbmV0KSkgewogICAgICAgICAgICBERUJVR01TR1RMKCgibWliSUkvaW50ZXJmYWNlczpJbnRlcmZhY2VfU2Nhbl9OZXh0IiwgImtsb29rdXAgZmFpbGVkXG4iKSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KI2lmIEhBVkVfU1RSVUNUX0lGTkVUX0lGX1hOQU1FCiNpZiBkZWZpbmVkKG5ldGJzZDEpIHx8IGRlZmluZWQob3BlbmJzZDIpCiAgICAgICAgc3RybGNweShzYXZlTmFtZSwgaWZuZXQuaWZfeG5hbWUsIHNpemVvZihzYXZlTmFtZSkpOwojZWxzZQogICAgICAgIGlmICghTkVUU05NUF9LTE9PS1VQKGlmbmV0LmlmX3huYW1lLCAoY2hhciAqKSBzYXZlTmFtZSwgc2l6ZW9mIHNhdmVOYW1lKSkgewogICAgICAgICAgICBERUJVR01TR1RMKCgibWliSUkvaW50ZXJmYWNlczpJbnRlcmZhY2VfU2Nhbl9OZXh0IiwgImtsb29rdXAgZmFpbGVkXG4iKSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KI2VuZGlmCiAgICAgICAgc2F2ZU5hbWVbc2l6ZW9mKHNhdmVOYW1lKSAtIDFdID0gJ1wwJzsKI2Vsc2UKICAgICAgICBpZiAoIU5FVFNOTVBfS0xPT0tVUChpZm5ldC5pZl9uYW1lLCAoY2hhciAqKSBzYXZlTmFtZSwgc2l6ZW9mIHNhdmVOYW1lKSkgewogICAgICAgICAgICBERUJVR01TR1RMKCgibWliSUkvaW50ZXJmYWNlczpJbnRlcmZhY2VfU2Nhbl9OZXh0IiwgImtsb29rdXAgZmFpbGVkXG4iKSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCiAgICAgICAgc2F2ZU5hbWVbc2l6ZW9mKHNhdmVOYW1lKSAtIDFdID0gJ1wwJzsKICAgICAgICBjcCA9IHN0cmNocihzYXZlTmFtZSwgJ1wwJyk7CiAgICAgICAgc3RyaW5nX2FwcGVuZF9pbnQoY3AsIGlmbmV0LmlmX3VuaXQpOwojZW5kaWYKICAgICAgICBpZiAoMSB8fCBzdHJjbXAoc2F2ZU5hbWUsICJsbzAiKSAhPSAwKSB7ICAgICAgICAvKiBYWFggKi8KICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogIFRyeSB0byBmaW5kIGFuIGFkZHJlc3MgZm9yIHRoaXMgaW50ZXJmYWNlCiAgICAgICAgICAgICAqLwoKI2lmZGVmIG5ldGJzZDEKICAgICAgICAgICAgaWEgPSAoc3RydWN0IGluX2lmYWRkciAqKSBpZm5ldC5pZl9hZGRybGlzdC50cWhfZmlyc3Q7CiNlbGlmIGRlZmluZWQoSUZBRERSX1NZTUJPTCkKICAgICAgICAgICAgYXV0b19ubGlzdChJRkFERFJfU1lNQk9MLCAoY2hhciAqKSAmaWEsIHNpemVvZihpYSkpOwojZW5kaWYKICAgICAgICAgICAgd2hpbGUgKGlhKSB7CiAgICAgICAgICAgICAgICBpZiAoIU5FVFNOTVBfS0xPT0tVUChpYSwgKGNoYXIgKikgJmluX2lmYWRkciwgc2l6ZW9mKGluX2lmYWRkcikpKSB7CiAgICAgICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoIm1pYklJL2ludGVyZmFjZXM6SW50ZXJmYWNlX1NjYW5fTmV4dCIsICJrbG9va3VwIGZhaWxlZFxuIikpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgewojaWZkZWYgbmV0YnNkMQojZGVmaW5lIENQKHgpCSgoY2hhciAqKSh4KSkKICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgICAgICAqY3A7CiAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNvY2thZGRyICpzYTsKICAgICAgICAgICAgICAgICAgICBjcCA9IChDUChpbl9pZmFkZHIuaWFfaWZhLmlmYV9hZGRyKSAtIENQKGlhKSkgKwogICAgICAgICAgICAgICAgICAgICAgICBDUCgmaW5faWZhZGRyKTsKICAgICAgICAgICAgICAgICAgICBzYSA9IChzdHJ1Y3Qgc29ja2FkZHIgKikgY3A7CgogICAgICAgICAgICAgICAgICAgIGlmIChzYS0+c2FfZmFtaWx5ID09IEFGX0lORVQpCiNlbmRpZgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5faWZhZGRyLmlhX2lmcCA9PSBpZm5ldGFkZHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc19pcGFkZHIgPSAxOyAgICAgLyogdGhpcyBJRiBoYXMgSVAtYWRkcmVzcyAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KI2lmZGVmIG5ldGJzZDEKICAgICAgICAgICAgICAgIGlhID0gKHN0cnVjdCBpbl9pZmFkZHIgKikgaW5faWZhZGRyLmlhX2lmYS5pZmFfbGlzdC4KICAgICAgICAgICAgICAgICAgICB0cWVfbmV4dDsKI2Vsc2UKICAgICAgICAgICAgICAgIGlhID0gaW5faWZhZGRyLmlhX25leHQ7CiNlbmRpZgogICAgICAgICAgICB9CgojaWYgIWRlZmluZWQobmV0YnNkMSkgJiYgIWRlZmluZWQoZnJlZWJzZDIpICYmICFkZWZpbmVkKG9wZW5ic2QyKSAmJiAhZGVmaW5lZChIQVZFX1NUUlVDVF9JRk5FVF9JRl9BRERSTElTVCkKICAgICAgICAgICAgaWZuZXQuaWZfYWRkcmxpc3QgPSAoc3RydWN0IGlmYWRkciAqKSBpYTsgICAvKiBXUk9ORyBEQVRBIFRZUEU7IE9OTFkgQSBGTEFHICovCiNlbmRpZgogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBpZm5ldC5pZl9hZGRybGlzdCA9IChzdHJ1Y3QgaWZhZGRyICopJmlhLT5pYV9pZmE7ICAgCiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIFdST05HIERBVEEgVFlQRTsgT05MWSBBIEZMQUcgCiAgICAgICAgICAgICAqLwoKICAgICAgICAgICAgaWYgKEluZGV4KQogICAgICAgICAgICAgICAgKkluZGV4ID0gKytzYXZlSW5kZXg7CiAgICAgICAgICAgIGlmIChSZXRpZm5ldCkKICAgICAgICAgICAgICAgICpSZXRpZm5ldCA9IGlmbmV0OwogICAgICAgICAgICBpZiAoUmV0aW5faWZhZGRyICYmIGhhc19pcGFkZHIpICAgICAvKiBhc3NpZ24gdGhlIGluX2lmYWRkciBvbmx5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGlmIHRoZSBJRiBoYXMgSVAtYWRkcmVzcyAqLwogICAgICAgICAgICAgICAgKlJldGluX2lmYWRkciA9IGluX2lmYWRkcjsKICAgICAgICAgICAgaWYgKE5hbWUpCiAgICAgICAgICAgICAgICBzdHJjcHkoTmFtZSwgc2F2ZU5hbWUpOwogICAgICAgICAgICBzYXZlaWZuZXQgPSBpZm5ldDsKICAgICAgICAgICAgc2F2ZWlmbmV0YWRkciA9IGlmbmV0YWRkcjsKICAgICAgICAgICAgc2F2ZWluX2lmYWRkciA9IGluX2lmYWRkcjsKICAgICAgICAgICAgaWZuZXRhZGRyID0gaWZuZXQuaWZfbmV4dDsKCiAgICAgICAgICAgIHJldHVybiAoMSk7ICAgICAgICAgLyogRE9ORSAqLwogICAgICAgIH0KICAgICAgICBpZm5ldGFkZHIgPSBpZm5ldC5pZl9uZXh0OwogICAgfQogICAgcmV0dXJuICgwKTsgICAgICAgICAgICAgICAgIC8qIEVPRiAqLwp9CgojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGhwdXgxMSAqLwoKI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdW5WMyB8fCBsaW51eCAqLwoKI2lmIGRlZmluZWQoaHB1eDExKQoKc3RhdGljIGludApJbnRlcmZhY2VfU2Nhbl9CeV9JbmRleChpbnQgSW5kZXgsIGNoYXIgKk5hbWUsIG5tYXBpX3BoeXN0YXQgKiBSZXRpZm5ldCkKewogICAgaW50ICAgICAgICAgICBpOwoKICAgIEludGVyZmFjZV9TY2FuX0luaXQoKTsKICAgIHdoaWxlIChJbnRlcmZhY2VfU2Nhbl9OZXh0SW50KCZpLCBOYW1lLCBSZXRpZm5ldCkpIHsKICAgICAgICBpZiAoaSA9PSBJbmRleCkKICAgICAgICAgICAgYnJlYWs7CiAgICB9CiAgICBpZiAoaSAhPSBJbmRleCkKICAgICAgICByZXR1cm4gKC0xKTsgICAgICAgICAgICAvKiBFcnJvciwgZG9lc24ndCBleGlzdCAqLwogICAgcmV0dXJuICgwKTsgICAgICAgICAgICAgICAgIC8qIERPTkUgKi8KfQoKI2Vsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBocHV4MTEgKi8KCnN0YXRpYyBpbnQKSW50ZXJmYWNlX1NjYW5fQnlfSW5kZXgoaW50IEluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpOYW1lLAogICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaWZuZXQgKlJldGlmbmV0LAogICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW5faWZhZGRyICpSZXRpbl9pZmFkZHIpCnsKICAgIGludCAgICAgICAgICAgaTsKCiAgICBJbnRlcmZhY2VfU2Nhbl9Jbml0KCk7CiAgICB3aGlsZSAoSW50ZXJmYWNlX1NjYW5fTmV4dEludCgmaSwgTmFtZSwgUmV0aWZuZXQsIFJldGluX2lmYWRkcikpIHsKICAgICAgICBpZiAoaSA9PSBJbmRleCkKICAgICAgICAgICAgYnJlYWs7CiAgICB9CiAgICBpZiAoaSAhPSBJbmRleCkKICAgICAgICByZXR1cm4gKC0xKTsgICAgICAgICAgICAvKiBFcnJvciwgZG9lc24ndCBleGlzdCAqLwogICAgcmV0dXJuICgwKTsgICAgICAgICAgICAgICAgIC8qIERPTkUgKi8KfQoKI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBocHV4MTEgKi8KCnN0YXRpYyBpbnQgICAgICBJbnRlcmZhY2VfQ291bnQgPSAwOwoKI2lmIGRlZmluZWQoaHB1eDExKQoKaW50CkludGVyZmFjZV9TY2FuX0dldF9Db3VudCh2b2lkKQp7CiAgICBpZiAoIUludGVyZmFjZV9Db3VudCkgewogICAgICAgIGludCAgICAgICAgICAgICBmZDsKICAgICAgICBzdHJ1Y3Qgbm1wYXJtcyAgcDsKICAgICAgICBpbnQgICAgICAgICAgICAgdmFsOwogICAgICAgIHVuc2lnbmVkIGludCAgICB1bGVuOwogICAgICAgIGludCAgICAgICAgICAgICByZXQ7CgogICAgICAgIGlmICgoZmQgPSBvcGVuX21pYigiL2Rldi9pcCIsIE9fUkRPTkxZLCAwLCBOTV9BU1lOQ19PRkYpKSA+PSAwKSB7CiAgICAgICAgICAgIHAub2JqaWQgPSBJRF9pZk51bWJlcjsKICAgICAgICAgICAgcC5idWZmZXIgPSAodm9pZCAqKSAmdmFsOwogICAgICAgICAgICB1bGVuID0gc2l6ZW9mKGludCk7CiAgICAgICAgICAgIHAubGVuID0gJnVsZW47CiAgICAgICAgICAgIGlmICgocmV0ID0gZ2V0X21pYl9pbmZvKGZkLCAmcCkpID09IDApCiAgICAgICAgICAgICAgICBJbnRlcmZhY2VfQ291bnQgPSB2YWw7CiAgICAgICAgICAgIGNsb3NlX21pYihmZCk7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIChJbnRlcmZhY2VfQ291bnQpOwp9CgojZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGhwdXgxMSAqLwoKaW50CkludGVyZmFjZV9TY2FuX0dldF9Db3VudCh2b2lkKQp7CiAgICBzdGF0aWMgdGltZV90ICAgc2Nhbl90aW1lID0gMDsKICAgIHRpbWVfdCAgICAgICAgICB0aW1lX25vdyA9IHRpbWUoTlVMTCk7CgogICAgaWYgKCFJbnRlcmZhY2VfQ291bnQgfHwgKHRpbWVfbm93ID4gc2Nhbl90aW1lICsgNjApKSB7CiAgICAgICAgc2Nhbl90aW1lID0gdGltZV9ub3c7CiAgICAgICAgSW50ZXJmYWNlX1NjYW5fSW5pdCgpOwogICAgICAgIEludGVyZmFjZV9Db3VudCA9IDA7CiAgICAgICAgd2hpbGUgKEludGVyZmFjZV9TY2FuX05leHRJbnQoTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCkgIT0gMCkgewogICAgICAgICAgICBJbnRlcmZhY2VfQ291bnQrKzsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gKEludGVyZmFjZV9Db3VudCk7Cn0KCgpzdGF0aWMgaW50CkludGVyZmFjZV9HZXRfRXRoZXJfQnlfSW5kZXgoaW50IEluZGV4LCB1X2NoYXIgKiBFdGhlckFkZHIpCnsKICAgIGludCAgICAgICAgICAgICBpOwojaWYgIShkZWZpbmVkKGxpbnV4KSB8fCBkZWZpbmVkKG5ldGJzZDEpIHx8IGRlZmluZWQoYnNkaTIpIHx8IGRlZmluZWQob3BlbmJzZDIpKQogICAgc3RydWN0IGFycGNvbSAgIGFycGNvbTsKI2Vsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpcyBsaW51eCBvciBuZXRic2QxICovCiAgICBzdHJ1Y3QgYXJwY29tIHsKICAgICAgICBjaGFyICAgICAgICAgICAgYWNfZW5hZGRyWzZdOwogICAgfSBhcnBjb207CiNpZiBkZWZpbmVkKG5ldGJzZDEpIHx8IGRlZmluZWQoYnNkaTIpIHx8IGRlZmluZWQob3BlbmJzZDIpCiAgICBzdHJ1Y3Qgc29ja2FkZHJfZGwgc2FkbDsKICAgIHN0cnVjdCBpZmFkZHIgICBpZmFkZHI7CiAgICB1X2xvbmcgICAgICAgICAgaWZhZGRyYWRkcjsKI2VuZGlmCiNlbmRpZgoKI2lmIGRlZmluZWQobWlwcykgfHwgZGVmaW5lZChocHV4KSB8fCBkZWZpbmVkKG9zZjQpIHx8IGRlZmluZWQob3NmMykgfHwgZGVmaW5lZChvc2Y1KQogICAgbWVtc2V0KGFycGNvbS5hY19lbmFkZHIsIDAsIHNpemVvZihhcnBjb20uYWNfZW5hZGRyKSk7CiNlbHNlCiAgICBtZW1zZXQoJmFycGNvbS5hY19lbmFkZHIsIDAsIHNpemVvZihhcnBjb20uYWNfZW5hZGRyKSk7CiNlbmRpZgogICAgbWVtc2V0KEV0aGVyQWRkciwgMCwgc2l6ZW9mKGFycGNvbS5hY19lbmFkZHIpKTsKCiAgICBpZiAoc2F2ZUluZGV4ICE9IEluZGV4KSB7ICAgLyogT3B0aW1pemF0aW9uISAqLwoKICAgICAgICBJbnRlcmZhY2VfU2Nhbl9Jbml0KCk7CgogICAgICAgIHdoaWxlIChJbnRlcmZhY2VfU2Nhbl9OZXh0SW50KCZpLCBOVUxMLCBOVUxMLCBOVUxMKSAhPSAwKSB7CiAgICAgICAgICAgIGlmIChpID09IEluZGV4KQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGlmIChpICE9IEluZGV4KQogICAgICAgICAgICByZXR1cm4gKC0xKTsgICAgICAgIC8qIEVycm9yLCBkb2Vzbid0IGV4aXN0ICovCiAgICB9CiNpZmRlZiBmcmVlYnNkMgogICAgaWYgKHNhdmVpZm5ldC5pZl90eXBlICE9IElGVF9FVEhFUikgewogICAgICAgIHJldHVybiAoMCk7ICAgICAgICAgICAgIC8qIE5vdCBhbiBldGhlcm5ldCBpZiAqLwogICAgfQojZW5kaWYKICAgIC8qCiAgICAgKiAgdGhlIGFycGNvbSBzdHJ1Y3R1cmUgaXMgYW4gZXh0ZW5kZWQgaWZuZXQgc3RydWN0dXJlIHdoaWNoCiAgICAgKiAgY29udGFpbnMgdGhlIGV0aGVybmV0IGFkZHJlc3MuCiAgICAgKi8KI2lmbmRlZiBsaW51eAojaWYgIShkZWZpbmVkKG5ldGJzZDEpIHx8IGRlZmluZWQoYnNkaTIpIHx8IGRlZmluZWQob3BlbmJzZDIpKQogICAgaWYgKCFORVRTTk1QX0tMT09LVVAoc2F2ZWlmbmV0YWRkciwgKGNoYXIgKikgJmFycGNvbSwgc2l6ZW9mIGFycGNvbSkpIHsKICAgICAgICBERUJVR01TR1RMKCgibWliSUkvaW50ZXJmYWNlczpJbnRlcmZhY2VfR2V0X0V0aGVyX0J5X0luZGV4IiwgImtsb29rdXAgZmFpbGVkXG4iKSk7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CiNlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmV0YnNkMSBvciBic2RpMiBvciBvcGVuYnNkMiAqLwoKI2lmIGRlZmluZWQobmV0YnNkMSkgfHwgZGVmaW5lZChvcGVuYnNkMikKI2RlZmluZSBpZl9hZGRybGlzdCBpZl9hZGRybGlzdC50cWhfZmlyc3QKI2RlZmluZSBpZmFfbmV4dCAgICBpZmFfbGlzdC50cWVfbmV4dAojZW5kaWYKCiAgICBpZmFkZHJhZGRyID0gKHVuc2lnbmVkIGxvbmcpIHNhdmVpZm5ldC5pZl9hZGRybGlzdDsKICAgIHdoaWxlIChpZmFkZHJhZGRyKSB7CiAgICAgICAgaWYgKCFORVRTTk1QX0tMT09LVVAoaWZhZGRyYWRkciwgKGNoYXIgKikgJmlmYWRkciwgc2l6ZW9mIGlmYWRkcikpIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoIm1pYklJL2ludGVyZmFjZXM6SW50ZXJmYWNlX0dldF9FdGhlcl9CeV9JbmRleCIsICJrbG9va3VwIGZhaWxlZFxuIikpOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgaWYgKCFORVRTTk1QX0tMT09LVVAoaWZhZGRyLmlmYV9hZGRyLCAoY2hhciAqKSAmc2FkbCwgc2l6ZW9mIHNhZGwpKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJtaWJJSS9pbnRlcmZhY2VzOkludGVyZmFjZV9HZXRfRXRoZXJfQnlfSW5kZXgiLCAia2xvb2t1cCBmYWlsZWRcbiIpKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGlmIChzYWRsLnNkbF9mYW1pbHkgPT0gQUZfTElOSwogICAgICAgICAgICAmJiAoc2F2ZWlmbmV0LmlmX3R5cGUgPT0gSUZUX0VUSEVSCiAgICAgICAgICAgICAgICB8fCBzYXZlaWZuZXQuaWZfdHlwZSA9PSBJRlRfSVNPODgwMjUKICAgICAgICAgICAgICAgIHx8IHNhdmVpZm5ldC5pZl90eXBlID09IElGVF9GRERJKSkgewogICAgICAgICAgICBtZW1jcHkoYXJwY29tLmFjX2VuYWRkciwgc2FkbC5zZGxfZGF0YSArIHNhZGwuc2RsX25sZW4sCiAgICAgICAgICAgICAgICAgICBzaXplb2YoYXJwY29tLmFjX2VuYWRkcikpOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgaWZhZGRyYWRkciA9ICh1bnNpZ25lZCBsb25nKSBpZmFkZHIuaWZhX25leHQ7CiAgICB9CiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmV0YnNkMSBvciBic2RpMiBvciBvcGVuYnNkMiAqLwoKI2Vsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsaW51eCAqLwogICAgbWVtY3B5KGFycGNvbS5hY19lbmFkZHIsIHNhdmVpZm5ldGFkZHItPmlmX2h3YWRkciwgNik7CiNlbmRpZgogICAgaWYgKHN0cm5jbXAoImxvIiwgc2F2ZU5hbWUsIDIpID09IDApIHsKICAgICAgICAvKgogICAgICAgICAqICBMb29wYmFjayBkb2Vzbid0IGhhdmUgYSBIVyBhZGRyLCBzbyByZXR1cm4gMDA6MDA6MDA6MDA6MDA6MDAKICAgICAgICAgKi8KICAgICAgICBtZW1zZXQoRXRoZXJBZGRyLCAwLCBzaXplb2YoYXJwY29tLmFjX2VuYWRkcikpOwoKICAgIH0gZWxzZSB7CgojaWYgZGVmaW5lZChtaXBzKSB8fCBkZWZpbmVkKGhwdXgpIHx8IGRlZmluZWQob3NmNCkgfHwgZGVmaW5lZChvc2YzKQogICAgICAgIG1lbWNweShFdGhlckFkZHIsIChjaGFyICopIGFycGNvbS5hY19lbmFkZHIsCiAgICAgICAgICAgICAgIHNpemVvZihhcnBjb20uYWNfZW5hZGRyKSk7CiNlbHNlCiAgICAgICAgbWVtY3B5KEV0aGVyQWRkciwgKGNoYXIgKikgJmFycGNvbS5hY19lbmFkZHIsCiAgICAgICAgICAgICAgIHNpemVvZihhcnBjb20uYWNfZW5hZGRyKSk7CiNlbmRpZgoKCiAgICB9CiAgICByZXR1cm4gKDApOyAgICAgICAgICAgICAgICAgLyogRE9ORSAqLwp9CgojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGhwdXgxMSAqLwoKI2Vsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzb2xhcmlzMiAqLwoKaW50CkludGVyZmFjZV9TY2FuX0dldF9Db3VudCh2b2lkKQp7CiAgICBpbnQgICAgICAgICAgICAgaSwgc2Q7CgogICAgaWYgKChzZCA9IHNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCAwKSkgPCAwKQogICAgICAgIHJldHVybiAoMCk7CiAgICBpZiAoaW9jdGwoc2QsIFNJT0NHSUZOVU0sICZpKSA9PSAtMSkgewogICAgICAgIGNsb3NlKHNkKTsKICAgICAgICByZXR1cm4gKDApOwogICAgfSBlbHNlIHsKICAgICAgICBjbG9zZShzZCk7CiAgICAgICAgcmV0dXJuIChpKTsKICAgIH0KfQoKaW50CkludGVyZmFjZV9JbmRleF9CeV9OYW1lKGNoYXIgKk5hbWUsIGludCBMZW4pCnsKICAgIHJldHVybiAoc29sYXJpczJfaWZfbmFtZXRvaW5kZXgoTmFtZSwgTGVuKSk7Cn0KCiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc29sYXJpczIgKi8KCiNlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSEFWRV9ORVRfSUZfTUlCX0ggKi8KCi8qCiAqIFRoaXMgY29kZSBhdHRlbXB0cyB0byBkbyB0aGUgcmlnaHQgdGhpbmcgZm9yIEZyZWVCU0QuICBOb3RlIHRoYXQKICogdGhlIHN0YXRpc3RpY3MgY291bGQgYmUgZ2F0aGVyZWQgdGhyb3VnaCB1c2Ugb2Ygb2YgdGhlCiAqIG5ldC5yb3V0ZS4wLmxpbmsuaWZsaXN0LjAgc3lzY3RsICh3aGljaCB3ZSBhbHJlYWR5IHVzZSB0byBnZXQgdGhlCiAqIGhhcmR3YXJlIGFkZHJlc3Mgb2YgdGhlIGludGVyZmFjZXMpLCByYXRoZXIgdGhhbiB1c2luZyB0aGUgaWZtaWIKICogY29kZSwgYnV0IGV2ZW50dWFsbHkgSSB3aWxsIGltcGxlbWVudCBkb3QzU3RhdHMgYW5kIHdlIHdpbGwgaGF2ZSB0bwogKiB1c2UgdGhlIGlmbWliIGludGVyZmFjZS4gIGlmbWliIGlzIGFsc28gYSBtdWNoIG1vcmUgbmF0dXJhbCB3YXkgb2YKICogbWFwcGluZyB0aGUgU05NUCBNSUIgb250byBzeXNjdGwoMykuCiAqLwoKI2luY2x1ZGUgPG5ldC9pZi5oPgojaW5jbHVkZSA8bmV0L2lmX2RsLmg+CiNpbmNsdWRlIDxuZXQvaWZfbWliLmg+CiNpbmNsdWRlIDxuZXQvcm91dGUuaD4KCnN0YXRpYyBpbnQgICAgICBoZWFkZXJfaW50ZXJmYWNlcyhzdHJ1Y3QgdmFyaWFibGUgKiwgb2lkICosIHNpemVfdCAqLCBpbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKiwgV3JpdGVNZXRob2QgKiogd3JpdGUpOwpzdGF0aWMgaW50ICAgICAgaGVhZGVyX2lmRW50cnkoc3RydWN0IHZhcmlhYmxlICosIG9pZCAqLCBzaXplX3QgKiwgaW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICosIFdyaXRlTWV0aG9kICoqIHdyaXRlKTsKdV9jaGFyICAgICAgICAgKnZhcl9pZkVudHJ5KHN0cnVjdCB2YXJpYWJsZSAqLCBvaWQgKiwgc2l6ZV90ICosIGludCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqLCBXcml0ZU1ldGhvZCAqKiB3cml0ZSk7CgpzdGF0aWMgY2hhciAgICAqcGh5c2FkZHJidWY7CnN0YXRpYyBpbnQgICAgICBucGh5c2FkZHJzOwpzdHJ1Y3Qgc29ja2FkZHJfZGwgKipwaHlzYWRkcnM7Cgp2b2lkCmluaXRfaW50ZXJmYWNlc19zZXR1cCh2b2lkKQp7CiAgICBpbnQgICAgICAgICAgICAgbmFkZHJzLCBpbGVuLCBiaXQ7CiAgICBzdGF0aWMgaW50ICAgICAgbWliWzZdCiAgICA9IHsgQ1RMX05FVCwgUEZfUk9VVEUsIDAsIEFGX0xJTkssIE5FVF9SVF9JRkxJU1QsIDAgfTsKICAgIGNoYXIgICAgICAgICAgICpjcDsKICAgIHNpemVfdCAgICAgICAgICBsZW47CiAgICBzdHJ1Y3QgcnRfbXNnaGRyICpydG07CiAgICBzdHJ1Y3QgaWZfbXNnaGRyICppZm07CiAgICBzdHJ1Y3QgaWZhX21zZ2hkciAqaWZhbTsKICAgIHN0cnVjdCBzb2NrYWRkciAqc2E7CgogICAgREVCVUdNU0dUTCgoIm1pYklJOmZyZWVic2QiLCAiaW5pdF9pbnRlcmZhY2VzX3NldHVwXG4iKSk7CgogICAgbmFkZHJzID0gMDsKICAgIGlmIChwaHlzYWRkcnMpCiAgICAgICAgZnJlZShwaHlzYWRkcnMpOwogICAgaWYgKHBoeXNhZGRyYnVmKQogICAgICAgIGZyZWUocGh5c2FkZHJidWYpOwogICAgcGh5c2FkZHJidWYgPSAwOwogICAgcGh5c2FkZHJzID0gMDsKICAgIG5waHlzYWRkcnMgPSAwOwogICAgbGVuID0gMDsKICAgIGlmIChzeXNjdGwobWliLCA2LCAwLCAmbGVuLCAwLCAwKSA8IDApIHsKICAgICAgICBERUJVR01TR1RMKCgibWliSUk6ZnJlZWJzZCIsICJzeXNjdGwgMSA8IDBcbiIpKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgY3AgPSBwaHlzYWRkcmJ1ZiA9IG1hbGxvYyhsZW4pOwogICAgaWYgKHBoeXNhZGRyYnVmID09IDApCiAgICAgICAgcmV0dXJuOwogICAgaWYgKHN5c2N0bChtaWIsIDYsIHBoeXNhZGRyYnVmLCAmbGVuLCAwLCAwKSA8IDApIHsKICAgICAgICBmcmVlKHBoeXNhZGRyYnVmKTsKICAgICAgICBwaHlzYWRkcmJ1ZiA9IDA7CiAgICAgICAgREVCVUdNU0dUTCgoIm1pYklJOmZyZWVic2QiLCAic3lzY3RsIDIgPCAwXG4iKSk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICBsb29wOgogICAgaWxlbiA9IGxlbjsKICAgIGNwID0gcGh5c2FkZHJidWY7CiAgICB3aGlsZSAoaWxlbiA+IDApIHsKICAgICAgICBydG0gPSAoc3RydWN0IHJ0X21zZ2hkciAqKSBjcDsKICAgICAgICBpZiAocnRtLT5ydG1fdmVyc2lvbiAhPSBSVE1fVkVSU0lPTiB8fCBydG0tPnJ0bV90eXBlICE9IFJUTV9JRklORk8pIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoIm1pYklJOmZyZWVic2QiLCAidmVyc2lvbjolZC8lZCB0eXBlOiVkLyVkXG4iLAogICAgICAgICAgICAgICAgICAgICAgICBydG0tPnJ0bV92ZXJzaW9uLCBSVE1fVkVSU0lPTiwgcnRtLT5ydG1fdHlwZSwgUlRNX0lGSU5GTykpOwogICAgICAgICAgICBmcmVlKHBoeXNhZGRycyk7CiAgICAgICAgICAgIHBoeXNhZGRycyA9IDA7CiAgICAgICAgICAgIGZyZWUocGh5c2FkZHJidWYpOwogICAgICAgICAgICBwaHlzYWRkcmJ1ZiA9IDA7CiAgICAgICAgfQogICAgICAgIGlmbSA9IChzdHJ1Y3QgaWZfbXNnaGRyICopIHJ0bTsKI2lmIGRlZmluZWQoZnJlZWJzZDMpIHx8IGRlZmluZWQoZnJlZWJzZDQpIHx8IGRlZmluZWQoZnJlZWJzZDUpCiAgICAgICAgaWYgKHBoeXNhZGRycyAhPSAwKQogICAgICAgICAgICBwaHlzYWRkcnNbbmFkZHJzXSA9ICh2b2lkICopIChpZm0gKyAxKTsKICAgICAgICBuYWRkcnMrKzsKI2VuZGlmCiAgICAgICAgaWxlbiAtPSBpZm0tPmlmbV9tc2dsZW47CiAgICAgICAgY3AgKz0gaWZtLT5pZm1fbXNnbGVuOwogICAgICAgIHJ0bSA9IChzdHJ1Y3QgcnRfbXNnaGRyICopIGNwOwogICAgICAgIHdoaWxlIChpbGVuID4gMCAmJiBydG0tPnJ0bV90eXBlID09IFJUTV9ORVdBRERSKSB7CiNpZiBkZWZpbmVkKGZyZWVic2QzKSB8fCBkZWZpbmVkKGZyZWVic2Q0KSB8fCBkZWZpbmVkKGZyZWVic2Q1KQogICAgICAgICAgICBpbGVuIC09IHJ0bS0+cnRtX21zZ2xlbjsKICAgICAgICAgICAgY3AgKz0gcnRtLT5ydG1fbXNnbGVuOwojZWxzZQogICAgICAgICAgICBpbnQgICAgICAgICAgICAgaXNfYWxpYXMgPSAwOwogICAgICAgICAgICBpZmFtID0gKHN0cnVjdCBpZmFfbXNnaGRyICopIHJ0bTsKICAgICAgICAgICAgaWxlbiAtPSBzaXplb2YoKmlmYW0pOwogICAgICAgICAgICBjcCArPSBzaXplb2YoKmlmYW0pOwogICAgICAgICAgICBzYSA9IChzdHJ1Y3Qgc29ja2FkZHIgKikgY3A7CiNkZWZpbmUgUk9VTkQoeCkgKCgoeCkgKyBzaXplb2YobG9uZykgLSAxKSAmIH5zaXplb2YobG9uZykpCiAgICAgICAgICAgIGZvciAoYml0ID0gMTsgYml0ICYmIGlsZW4gPiAwOyBiaXQgPDw9IDEpIHsKICAgICAgICAgICAgICAgIGlmICghKGlmYW0tPmlmYW1fYWRkcnMgJiBiaXQpKQogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgaWxlbiAtPSBST1VORChzYS0+c2FfbGVuKTsKICAgICAgICAgICAgICAgIGNwICs9IFJPVU5EKHNhLT5zYV9sZW4pOwoKICAgICAgICAgICAgICAgIGlmIChiaXQgPT0gUlRBX0lGQSkgewogICAgICAgICAgICAgICAgICAgIGlmIChwaHlzYWRkcnMpCiNkZWZpbmUgc2F0b3NkbChzYSkgKChzdHJ1Y3Qgc29ja2FkZHJfZGwgKikoc2EpKQogICAgICAgICAgICAgICAgICAgICAgICBwaHlzYWRkcnNbbmFkZHJzKytdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHNhdG9zZGwoc2EpOwogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgbmFkZHJzKys7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBzYSA9IChzdHJ1Y3Qgc29ja2FkZHIgKikgY3A7CiAgICAgICAgICAgIH0KI2VuZGlmCiAgICAgICAgICAgIHJ0bSA9IChzdHJ1Y3QgcnRfbXNnaGRyICopIGNwOwogICAgICAgIH0KICAgIH0KICAgIERFQlVHTVNHVEwoKCJtaWJJSTpmcmVlYnNkIiwgImZvdW5kICVkIGFkZHJzXG4iLCBuYWRkcnMpKTsKICAgIGlmIChwaHlzYWRkcnMpIHsKICAgICAgICBucGh5c2FkZHJzID0gbmFkZHJzOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIHBoeXNhZGRycyA9IG1hbGxvYyhuYWRkcnMgKiBzaXplb2YoKnBoeXNhZGRycykpOwogICAgaWYgKHBoeXNhZGRycyA9PSAwKQogICAgICAgIHJldHVybjsKICAgIG5hZGRycyA9IDA7CiAgICBnb3RvIGxvb3A7Cgp9CgpzdGF0aWMgaW50CmdldF9waHlzX2FkZHJlc3MoaW50IGlpbmRleCwgY2hhciAqKmFwLCBpbnQgKmxlbikKewogICAgaW50ICAgICAgICAgICAgIGk7CiAgICBpbnQgICAgICAgICAgICAgb25jZSA9IDE7CgogICAgZG8gewogICAgICAgIGZvciAoaSA9IDA7IGkgPCBucGh5c2FkZHJzOyBpKyspIHsKICAgICAgICAgICAgaWYgKHBoeXNhZGRyc1tpXS0+c2RsX2luZGV4ID09IGlpbmRleCkKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBpZiAoaSA8IG5waHlzYWRkcnMpCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGluaXRfaW50ZXJmYWNlc19zZXR1cCgpOwogICAgfSB3aGlsZSAob25jZS0tKTsKCiAgICBERUJVR01TR1RMKCgibWliSUk6ZnJlZWJzZCIsICJnZXRfcGh5c19hZGRyZXNzICVkLyVkXG4iLCBpLCBucGh5c2FkZHJzKSk7CiAgICBpZiAoaSA8IG5waHlzYWRkcnMpIHsKICAgICAgICAqYXAgPSBMTEFERFIocGh5c2FkZHJzW2ldKTsKICAgICAgICAqbGVuID0gcGh5c2FkZHJzW2ldLT5zZGxfYWxlbjsKICAgICAgICByZXR1cm4gMDsKICAgIH0KICAgIHJldHVybiAtMTsKfQoKaW50CkludGVyZmFjZV9TY2FuX0dldF9Db3VudCh2b2lkKQp7CiAgICBzdGF0aWMgaW50ICAgICAgY291bnRfb2lkWzVdID0geyBDVExfTkVULCBQRl9MSU5LLCBORVRMSU5LX0dFTkVSSUMsCiAgICAgICAgSUZNSUJfU1lTVEVNLCBJRk1JQl9JRkNPVU5UCiAgICB9OwogICAgc2l6ZV90ICAgICAgICAgIGxlbjsKICAgIGludCAgICAgICAgICAgICBjb3VudDsKCiAgICBsZW4gPSBzaXplb2YgY291bnQ7CiAgICBpZiAoc3lzY3RsKGNvdW50X29pZCwgNSwgJmNvdW50LCAmbGVuLCAodm9pZCAqKSAwLCAoc2l6ZV90KSAwKSA8IDApIHsKICAgICAgICBERUJVR01TR1RMKCgibWliSUk6ZnJlZWJzZCIsICJJbnRlcmZhY2VfU2Nhbl9HZXRfQ291bnQgZXJyXG4iKSk7CiAgICAgICAgcmV0dXJuIC0xOwogICAgfQogICAgREVCVUdNU0dUTCgoIm1pYklJOmZyZWVic2QiLCAiSW50ZXJmYWNlX1NjYW5fR2V0X0NvdW50ICVkXG4iLCBjb3VudCkpOwogICAgcmV0dXJuIGNvdW50Owp9CgoKdV9jaGFyICAgICAgICAgKgp2YXJfaWZFbnRyeShzdHJ1Y3QgdmFyaWFibGUgKiB2cCwKICAgICAgICAgICAgb2lkICogbmFtZSwKICAgICAgICAgICAgc2l6ZV90ICogbGVuZ3RoLAogICAgICAgICAgICBpbnQgZXhhY3QsIHNpemVfdCAqIHZhcl9sZW4sIFdyaXRlTWV0aG9kICoqIHdyaXRlX21ldGhvZCkKewogICAgaW50ICAgICAgICAgICAgIGludGVyZmFjZTsKICAgIHN0YXRpYyBpbnQgICAgICBzbmFtZVs2XSA9IHsgQ1RMX05FVCwgUEZfTElOSywgTkVUTElOS19HRU5FUklDLAogICAgICAgIElGTUlCX0lGREFUQSwgMCwgSUZEQVRBX0dFTkVSQUwKICAgIH07CiAgICBzdGF0aWMgc3RydWN0IGlmbWliZGF0YSBpZm1kOwogICAgc2l6ZV90ICAgICAgICAgIGxlbjsKICAgIGNoYXIgICAgICAgICAgICpjcDsKICAgIGNvbmZfaWZfbGlzdCAgICppZl9wdHIgPSBOVUxMOwoKICAgIGludGVyZmFjZSA9IGhlYWRlcl9pZkVudHJ5KHZwLCBuYW1lLCBsZW5ndGgsIGV4YWN0LCB2YXJfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVfbWV0aG9kKTsKICAgIGlmIChpbnRlcmZhY2UgPT0gTUFUQ0hfRkFJTEVEKQogICAgICAgIHJldHVybiBOVUxMOwoKICAgIHNuYW1lWzRdID0gaW50ZXJmYWNlOwogICAgbGVuID0gc2l6ZW9mIGlmbWQ7CiAgICBpZiAoc3lzY3RsKHNuYW1lLCA2LCAmaWZtZCwgJmxlbiwgMCwgMCkgPCAwKSB7CiAgICAgICAgREVCVUdNU0dUTCgoIm1pYklJOmZyZWVic2QiLCAidmFyX2lmRW50cnkgc3lzY3RsIGVyclxuIikpOwogICAgICAgIHJldHVybiBOVUxMOwogICAgfQogICAgLyoKICAgICAqIGhtbW0uLiB3aGVyZSB0byBnZXQgdGhlIGludGVyZmFjZSBuYW1lIHRvIGNoZWNrIG92ZXJyaWRlcz8KICAgICAqCiAgICAgKiBpZl9wdHIgPSBuZXRzbm1wX2FjY2Vzc19pbnRlcmZhY2VfZW50cnlfb3ZlcnJpZGVzX2dldChOYW1lKTsKICAgICAqLwoKICAgIHN3aXRjaCAodnAtPm1hZ2ljKSB7CiAgICBjYXNlIE5FVFNOTVBfSUZJTkRFWDoKICAgICAgICBsb25nX3JldHVybiA9IGludGVyZmFjZTsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGREVTQ1I6CiAgICAgICAgY3AgPSBpZm1kLmlmbWRfbmFtZTsKICAgICAgICAqdmFyX2xlbiA9IHN0cmxlbihjcCk7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgY3A7CiAgICBjYXNlIE5FVFNOTVBfSUZUWVBFOgogICAgICAgIGlmIChpZl9wdHIpCiAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gaWZfcHRyLT50eXBlOwogICAgICAgIGVsc2UKICAgICAgICBsb25nX3JldHVybiA9IGlmbWQuaWZtZF9kYXRhLmlmaV90eXBlOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIE5FVFNOTVBfSUZNVFU6CiAgICAgICAgbG9uZ19yZXR1cm4gPSAobG9uZykgaWZtZC5pZm1kX2RhdGEuaWZpX210dTsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGU1BFRUQ6CiAgICAgICAgaWYgKGlmX3B0cikKICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSBpZl9wdHItPnNwZWVkOwogICAgICAgIGVsc2UKICAgICAgICBsb25nX3JldHVybiA9IGlmbWQuaWZtZF9kYXRhLmlmaV9iYXVkcmF0ZTsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGUEhZU0FERFJFU1M6CiAgICAgICAgewogICAgICAgICAgICBjaGFyICAgICAgICAgICAqY3A7CiAgICAgICAgICAgIGlmIChnZXRfcGh5c19hZGRyZXNzKGludGVyZmFjZSwgJmNwLCB2YXJfbGVuKSkKICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICByZXR1cm4gY3A7CiAgICAgICAgfQogICAgY2FzZSBORVRTTk1QX0lGQURNSU5TVEFUVVM6CiAgICAgICAgbG9uZ19yZXR1cm4gPSBpZm1kLmlmbWRfZmxhZ3MgJiBJRkZfVVAgPyAxIDogMjsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGT1BFUlNUQVRVUzoKICAgICAgICBsb25nX3JldHVybiA9IGlmbWQuaWZtZF9mbGFncyAmIElGRl9SVU5OSU5HID8gMSA6IDI7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgTkVUU05NUF9JRkxBU1RDSEFOR0U6CiAgICAgICAgaWYgKGlmbWQuaWZtZF9kYXRhLmlmaV9sYXN0Y2hhbmdlLnR2X3NlYyA9PSAwICYmCiAgICAgICAgICAgIGlmbWQuaWZtZF9kYXRhLmlmaV9sYXN0Y2hhbmdlLnR2X3VzZWMgPT0gMCkgewogICAgICAgICAgICBsb25nX3JldHVybiA9IDA7CiAgICAgICAgfSBlbHNlIGlmIChpZm1kLmlmbWRfZGF0YS5pZmlfbGFzdGNoYW5nZS50dl9zZWMgPCBzdGFydHRpbWUudHZfc2VjKSB7CiAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gMDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBsb25nX3JldHVybiA9ICh1X2xvbmcpCiAgICAgICAgICAgICAgICAoKGlmbWQuaWZtZF9kYXRhLmlmaV9sYXN0Y2hhbmdlLnR2X3NlYyAtCiAgICAgICAgICAgICAgICAgIHN0YXJ0dGltZS50dl9zZWMpICogMTAwICsKICAgICAgICAgICAgICAgICAoKGlmbWQuaWZtZF9kYXRhLmlmaV9sYXN0Y2hhbmdlLnR2X3VzZWMgLQogICAgICAgICAgICAgICAgICAgc3RhcnR0aW1lLnR2X3VzZWMpIC8gMTAwMDApKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgTkVUU05NUF9JRklOT0NURVRTOgogICAgICAgIGxvbmdfcmV0dXJuID0gKHVfbG9uZykgaWZtZC5pZm1kX2RhdGEuaWZpX2lieXRlczsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGSU5VQ0FTVFBLVFM6CiAgICAgICAgbG9uZ19yZXR1cm4gPSAodV9sb25nKSBpZm1kLmlmbWRfZGF0YS5pZmlfaXBhY2tldHM7CiAgICAgICAgbG9uZ19yZXR1cm4gLT0gKHVfbG9uZykgaWZtZC5pZm1kX2RhdGEuaWZpX2ltY2FzdHM7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgTkVUU05NUF9JRklOTlVDQVNUUEtUUzoKICAgICAgICBsb25nX3JldHVybiA9ICh1X2xvbmcpIGlmbWQuaWZtZF9kYXRhLmlmaV9pbWNhc3RzOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIE5FVFNOTVBfSUZJTkRJU0NBUkRTOgogICAgICAgIGxvbmdfcmV0dXJuID0gKHVfbG9uZykgaWZtZC5pZm1kX2RhdGEuaWZpX2lxZHJvcHM7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgTkVUU05NUF9JRklORVJST1JTOgogICAgICAgIGxvbmdfcmV0dXJuID0gaWZtZC5pZm1kX2RhdGEuaWZpX2llcnJvcnM7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgTkVUU05NUF9JRklOVU5LTk9XTlBST1RPUzoKICAgICAgICBsb25nX3JldHVybiA9ICh1X2xvbmcpIGlmbWQuaWZtZF9kYXRhLmlmaV9ub3Byb3RvOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIE5FVFNOTVBfSUZPVVRPQ1RFVFM6CiAgICAgICAgbG9uZ19yZXR1cm4gPSAodV9sb25nKSBpZm1kLmlmbWRfZGF0YS5pZmlfb2J5dGVzOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIE5FVFNOTVBfSUZPVVRVQ0FTVFBLVFM6CiAgICAgICAgbG9uZ19yZXR1cm4gPSAodV9sb25nKSBpZm1kLmlmbWRfZGF0YS5pZmlfb3BhY2tldHM7CiAgICAgICAgbG9uZ19yZXR1cm4gLT0gKHVfbG9uZykgaWZtZC5pZm1kX2RhdGEuaWZpX29tY2FzdHM7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgTkVUU05NUF9JRk9VVE5VQ0FTVFBLVFM6CiAgICAgICAgbG9uZ19yZXR1cm4gPSAodV9sb25nKSBpZm1kLmlmbWRfZGF0YS5pZmlfb21jYXN0czsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGT1VURElTQ0FSRFM6CiAgICAgICAgbG9uZ19yZXR1cm4gPSBpZm1kLmlmbWRfc25kX2Ryb3BzOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIE5FVFNOTVBfSUZPVVRFUlJPUlM6CiAgICAgICAgbG9uZ19yZXR1cm4gPSBpZm1kLmlmbWRfZGF0YS5pZmlfb2Vycm9yczsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGT1VUUUxFTjoKICAgICAgICBsb25nX3JldHVybiA9IGlmbWQuaWZtZF9zbmRfbGVuOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIE5FVFNOTVBfSUZTUEVDSUZJQzoKICAgICAgICAqdmFyX2xlbiA9IG51bGxPaWRMZW47CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgbnVsbE9pZDsKICAgIGRlZmF1bHQ6CiAgICAgICAgREVCVUdNU0dUTCgoInNubXBkIiwgInVua25vd24gc3ViLWlkICVkIGluIHZhcl9pZkVudHJ5XG4iLAogICAgICAgICAgICAgICAgICAgIHZwLT5tYWdpYykpOwogICAgfQogICAgcmV0dXJuIE5VTEw7Cn0KCiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSEFWRV9ORVRfSUZfTUlCX0ggKi8KI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAhVVNFX1NZU0NUTF9JRkxJU1QgKi8KCiNlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV0lOMzIgY3lnd2luICovCiNpbmNsdWRlIDxpcGhscGFwaS5oPgoKV3JpdGVNZXRob2QgICAgIHdyaXRlSWZFbnRyeTsKbG9uZyAgICAgICAgICAgIGFkbWluX3N0YXR1cyA9IDA7CmxvbmcgICAgICAgICAgICBvbGRhZG1pbl9zdGF0dXMgPSAwOwoKc3RhdGljIGludApoZWFkZXJfaWZFbnRyeShzdHJ1Y3QgdmFyaWFibGUgKnZwLAogICAgICAgICAgICAgICBvaWQgKiBuYW1lLAogICAgICAgICAgICAgICBzaXplX3QgKiBsZW5ndGgsCiAgICAgICAgICAgICAgIGludCBleGFjdCwgc2l6ZV90ICogdmFyX2xlbiwgV3JpdGVNZXRob2QgKiogd3JpdGVfbWV0aG9kKQp7CiNkZWZpbmUgSUZFTlRSWV9OQU1FX0xFTkdUSAkxMAogICAgb2lkICAgICAgICAgICAgIG5ld25hbWVbTUFYX09JRF9MRU5dOwogICAgcmVnaXN0ZXIgaW50ICAgIGlmSW5kZXg7CiAgICBpbnQgICAgICAgICAgICAgcmVzdWx0LCBjb3VudDsKICAgIERXT1JEICAgICAgICAgICBzdGF0dXMgPSBOT19FUlJPUjsKICAgIERXT1JEICAgICAgICAgICBkd0FjdHVhbFNpemUgPSAwOwogICAgUE1JQl9JRlRBQkxFICAgIHBJZlRhYmxlID0gTlVMTDsKCiAgICBERUJVR01TR1RMKCgibWliSUkvaW50ZXJmYWNlcyIsICJ2YXJfaWZFbnRyeTogIikpOwogICAgREVCVUdNU0dPSUQoKCJtaWJJSS9pbnRlcmZhY2VzIiwgbmFtZSwgKmxlbmd0aCkpOwogICAgREVCVUdNU0coKCJtaWJJSS9pbnRlcmZhY2VzIiwgIiAlZFxuIiwgZXhhY3QpKTsKCiAgICBtZW1jcHkoKGNoYXIgKikgbmV3bmFtZSwgKGNoYXIgKikgdnAtPm5hbWUsCiAgICAgICAgICAgKGludCkgdnAtPm5hbWVsZW4gKiBzaXplb2Yob2lkKSk7CiAgICAvKgogICAgICogZmluZCAibmV4dCIgaWZJbmRleCAKICAgICAqLwoKICAgIHN0YXR1cyA9IEdldElmVGFibGUocElmVGFibGUsICZkd0FjdHVhbFNpemUsIFRSVUUpOwogICAgaWYgKHN0YXR1cyA9PSBFUlJPUl9JTlNVRkZJQ0lFTlRfQlVGRkVSKSB7CiAgICAgICAgcElmVGFibGUgPSBtYWxsb2MoZHdBY3R1YWxTaXplKTsKICAgICAgICBpZiAocElmVGFibGUpCiAgICAgICAgICAgIEdldElmVGFibGUocElmVGFibGUsICZkd0FjdHVhbFNpemUsIFRSVUUpOwogICAgfQogICAgY291bnQgPSBwSWZUYWJsZS0+ZHdOdW1FbnRyaWVzOwogICAgZm9yIChpZkluZGV4ID0gMDsgaWZJbmRleCA8IGNvdW50OyBpZkluZGV4KyspIHsKICAgICAgICBuZXduYW1lW0lGRU5UUllfTkFNRV9MRU5HVEhdID0KICAgICAgICAgICAgKG9pZCkgcElmVGFibGUtPnRhYmxlW2lmSW5kZXhdLmR3SW5kZXg7CiAgICAgICAgcmVzdWx0ID0KICAgICAgICAgICAgc25tcF9vaWRfY29tcGFyZShuYW1lLCAqbGVuZ3RoLCBuZXduYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpIHZwLT5uYW1lbGVuICsgMSk7CiAgICAgICAgaWYgKChleGFjdCAmJiAocmVzdWx0ID09IDApKSB8fCAoIWV4YWN0ICYmIChyZXN1bHQgPCAwKSkpCiAgICAgICAgICAgIGJyZWFrOwogICAgfQogICAgaWYgKGlmSW5kZXggPj0gY291bnQpIHsKICAgICAgICBERUJVR01TR1RMKCgibWliSUkvaW50ZXJmYWNlcyIsICIuLi4gaW5kZXggb3V0IG9mIHJhbmdlXG4iKSk7CiAgICAgICAgY291bnQgPSBNQVRDSF9GQUlMRUQ7CiAgICAgICAgZ290byBvdXQ7CiAgICB9CgogICAgbWVtY3B5KChjaGFyICopIG5hbWUsIChjaGFyICopIG5ld25hbWUsCiAgICAgICAgICAgKChpbnQpIHZwLT5uYW1lbGVuICsgMSkgKiBzaXplb2Yob2lkKSk7CiAgICAqbGVuZ3RoID0gdnAtPm5hbWVsZW4gKyAxOwogICAgKndyaXRlX21ldGhvZCA9IDA7CiAgICAqdmFyX2xlbiA9IHNpemVvZihsb25nKTsgICAgLyogZGVmYXVsdCB0byAnbG9uZycgcmVzdWx0cyAqLwoKICAgIERFQlVHTVNHVEwoKCJtaWJJSS9pbnRlcmZhY2VzIiwgIi4uLiBnZXQgSS9GIHN0YXRzICIpKTsKICAgIERFQlVHTVNHT0lEKCgibWliSUkvaW50ZXJmYWNlcyIsIG5hbWUsICpsZW5ndGgpKTsKICAgIERFQlVHTVNHKCgibWliSUkvaW50ZXJmYWNlcyIsICJcbiIpKTsKCiAgICBjb3VudCA9IHBJZlRhYmxlLT50YWJsZVtpZkluZGV4XS5kd0luZGV4OwpvdXQ6CiAgICBmcmVlKHBJZlRhYmxlKTsKICAgIHJldHVybiBjb3VudDsKfQoKCgp1X2NoYXIgICAgICAgICAqCnZhcl9pbnRlcmZhY2VzKHN0cnVjdCB2YXJpYWJsZSAqIHZwLAogICAgICAgICAgICAgICBvaWQgKiBuYW1lLAogICAgICAgICAgICAgICBzaXplX3QgKiBsZW5ndGgsCiAgICAgICAgICAgICAgIGludCBleGFjdCwgc2l6ZV90ICogdmFyX2xlbiwgV3JpdGVNZXRob2QgKiogd3JpdGVfbWV0aG9kKQp7CiAgICBpZiAoaGVhZGVyX2dlbmVyaWModnAsIG5hbWUsIGxlbmd0aCwgZXhhY3QsIHZhcl9sZW4sIHdyaXRlX21ldGhvZCkgPT0KICAgICAgICBNQVRDSF9GQUlMRUQpCiAgICAgICAgcmV0dXJuIE5VTEw7CgogICAgc3dpdGNoICh2cC0+bWFnaWMpIHsKICAgIGNhc2UgTkVUU05NUF9JRk5VTUJFUjoKICAgICAgICBuZXRzbm1wX2Fzc2VydChzaXplb2YoRFdPUkQpID09IHNpemVvZihsb25nX3JldHVybikpOwogICAgICAgIEdldE51bWJlck9mSW50ZXJmYWNlcygoRFdPUkQgKikgJmxvbmdfcmV0dXJuKTsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgZGVmYXVsdDoKICAgICAgICBERUJVR01TR1RMKCgic25tcGQiLCAidW5rbm93biBzdWItaWQgJWQgaW4gdmFyX2ludGVyZmFjZXNcbiIsCiAgICAgICAgICAgICAgICAgICAgdnAtPm1hZ2ljKSk7CiAgICB9CiAgICByZXR1cm4gTlVMTDsKfQoKdV9jaGFyICAgICAgICAgKgp2YXJfaWZFbnRyeShzdHJ1Y3QgdmFyaWFibGUgKiB2cCwKICAgICAgICAgICAgb2lkICogbmFtZSwKICAgICAgICAgICAgc2l6ZV90ICogbGVuZ3RoLAogICAgICAgICAgICBpbnQgZXhhY3QsIHNpemVfdCAqIHZhcl9sZW4sIFdyaXRlTWV0aG9kICoqIHdyaXRlX21ldGhvZCkKewogICAgaW50ICAgICAgICAgICAgIGlmSW5kZXg7CiAgICBzdGF0aWMgTUlCX0lGUk9XIGlmUm93OwogICAgY29uZl9pZl9saXN0ICAgKmlmX3B0ciA9IE5VTEw7CiAgICAKICAgIGlmSW5kZXggPQogICAgICAgIGhlYWRlcl9pZkVudHJ5KHZwLCBuYW1lLCBsZW5ndGgsIGV4YWN0LCB2YXJfbGVuLCB3cml0ZV9tZXRob2QpOwogICAgaWYgKGlmSW5kZXggPT0gTUFUQ0hfRkFJTEVEKQogICAgICAgIHJldHVybiBOVUxMOwogICAgLyoKICAgICAqIGhtbW0uLiB3aGVyZSB0byBnZXQgdGhlIGludGVyZmFjZSBuYW1lIHRvIGNoZWNrIG92ZXJyaWRlcz8KICAgICAqCiAgICAgKiBpZl9wdHIgPSBuZXRzbm1wX2FjY2Vzc19pbnRlcmZhY2VfZW50cnlfb3ZlcnJpZGVzX2dldChOYW1lKTsKICAgICAqLwoKICAgIC8qCiAgICAgKiBHZXQgdGhlIElmIFRhYmxlIFJvdyBieSBwYXNzaW5nIGluZGV4IGFzIGFyZ3VtZW50IAogICAgICovCiAgICBpZlJvdy5kd0luZGV4ID0gaWZJbmRleDsKICAgIGlmIChHZXRJZkVudHJ5KCZpZlJvdykgIT0gTk9fRVJST1IpCiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICBzd2l0Y2ggKHZwLT5tYWdpYykgewogICAgY2FzZSBORVRTTk1QX0lGSU5ERVg6CiAgICAgICAgbG9uZ19yZXR1cm4gPSBpZkluZGV4OwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIE5FVFNOTVBfSUZERVNDUjoKICAgICAgICAqdmFyX2xlbiA9IGlmUm93LmR3RGVzY3JMZW47CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgaWZSb3cuYkRlc2NyOwogICAgY2FzZSBORVRTTk1QX0lGVFlQRToKICAgICAgICBpZiAoaWZfcHRyKQogICAgICAgICAgICBsb25nX3JldHVybiA9IGlmX3B0ci0+dHlwZTsKICAgICAgICBlbHNlCiAgICAgICAgbG9uZ19yZXR1cm4gPSBpZlJvdy5kd1R5cGU7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgTkVUU05NUF9JRk1UVToKICAgICAgICBsb25nX3JldHVybiA9IChsb25nKSBpZlJvdy5kd010dTsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGU1BFRUQ6CiAgICAgICAgaWYgKGlmX3B0cikKICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSBpZl9wdHItPnNwZWVkOwogICAgICAgIGVsc2UKICAgICAgICBsb25nX3JldHVybiA9IChsb25nKSBpZlJvdy5kd1NwZWVkOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIE5FVFNOTVBfSUZQSFlTQUREUkVTUzoKICAgICAgICAqdmFyX2xlbiA9IGlmUm93LmR3UGh5c0FkZHJMZW47CiAgICAgICAgbWVtY3B5KHJldHVybl9idWYsIGlmUm93LmJQaHlzQWRkciwgKnZhcl9sZW4pOwogICAgICAgIHJldHVybiAodV9jaGFyICopIHJldHVybl9idWY7CiAgICBjYXNlIE5FVFNOTVBfSUZBRE1JTlNUQVRVUzoKICAgICAgICBsb25nX3JldHVybiA9IGlmUm93LmR3QWRtaW5TdGF0dXM7CiAgICAgICAgYWRtaW5fc3RhdHVzID0gbG9uZ19yZXR1cm47CiAgICAgICAgKndyaXRlX21ldGhvZCA9IHdyaXRlSWZFbnRyeTsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGT1BFUlNUQVRVUzoKICAgICAgICBsb25nX3JldHVybiA9CiAgICAgICAgICAgKE1JQl9JRl9PUEVSX1NUQVRVU19PUEVSQVRJT05BTCA9PSBpZlJvdy5kd09wZXJTdGF0dXMpID8gMSA6IDI7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgTkVUU05NUF9JRkxBU1RDSEFOR0U6CiAgICAgICAgbG9uZ19yZXR1cm4gPSAwIC8qIFhYWCBub3QgYSBVTklYIGVwb2NoYWwgdGltZSBpZlJvdy5kd0xhc3RDaGFuZ2UgKi8gOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIE5FVFNOTVBfSUZJTk9DVEVUUzoKICAgICAgICBsb25nX3JldHVybiA9IGlmUm93LmR3SW5PY3RldHM7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgTkVUU05NUF9JRklOVUNBU1RQS1RTOgogICAgICAgIGxvbmdfcmV0dXJuID0gaWZSb3cuZHdJblVjYXN0UGt0czsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGSU5OVUNBU1RQS1RTOgogICAgICAgIGxvbmdfcmV0dXJuID0gaWZSb3cuZHdJbk5VY2FzdFBrdHM7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgTkVUU05NUF9JRklORElTQ0FSRFM6CiAgICAgICAgbG9uZ19yZXR1cm4gPSBpZlJvdy5kd0luRGlzY2FyZHM7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgTkVUU05NUF9JRklORVJST1JTOgogICAgICAgIGxvbmdfcmV0dXJuID0gaWZSb3cuZHdJbkVycm9yczsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGSU5VTktOT1dOUFJPVE9TOgogICAgICAgIGxvbmdfcmV0dXJuID0gaWZSb3cuZHdJblVua25vd25Qcm90b3M7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgTkVUU05NUF9JRk9VVE9DVEVUUzoKICAgICAgICBsb25nX3JldHVybiA9IGlmUm93LmR3T3V0T2N0ZXRzOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIE5FVFNOTVBfSUZPVVRVQ0FTVFBLVFM6CiAgICAgICAgbG9uZ19yZXR1cm4gPSBpZlJvdy5kd091dFVjYXN0UGt0czsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGT1VUTlVDQVNUUEtUUzoKICAgICAgICBsb25nX3JldHVybiA9IGlmUm93LmR3T3V0TlVjYXN0UGt0czsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGT1VURElTQ0FSRFM6CiAgICAgICAgbG9uZ19yZXR1cm4gPSBpZlJvdy5kd091dERpc2NhcmRzOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIE5FVFNOTVBfSUZPVVRFUlJPUlM6CiAgICAgICAgbG9uZ19yZXR1cm4gPSBpZlJvdy5kd091dEVycm9yczsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGT1VUUUxFTjoKICAgICAgICBsb25nX3JldHVybiA9IGlmUm93LmR3T3V0UUxlbjsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGU1BFQ0lGSUM6CiAgICAgICAgKnZhcl9sZW4gPSBudWxsT2lkTGVuOwogICAgICAgIHJldHVybiAodV9jaGFyICopIG51bGxPaWQ7CiAgICBkZWZhdWx0OgogICAgICAgIERFQlVHTVNHVEwoKCJzbm1wZCIsICJ1bmtub3duIHN1Yi1pZCAlZCBpbiB2YXJfaWZFbnRyeVxuIiwKICAgICAgICAgICAgICAgICAgICB2cC0+bWFnaWMpKTsKICAgIH0KICAgIHJldHVybiBOVUxMOwp9CgoKaW50CndyaXRlSWZFbnRyeShpbnQgYWN0aW9uLAogICAgICAgICAgICAgdV9jaGFyICogdmFyX3ZhbCwKICAgICAgICAgICAgIHVfY2hhciB2YXJfdmFsX3R5cGUsCiAgICAgICAgICAgICBzaXplX3QgdmFyX3ZhbF9sZW4sCiAgICAgICAgICAgICB1X2NoYXIgKiBzdGF0UCwgb2lkICogbmFtZSwgc2l6ZV90IG5hbWVfbGVuKQp7CiAgICBNSUJfSUZST1cgICAgICAgaWZFbnRyeVJvdzsKICAgIGlmICgoY2hhcikgbmFtZVs5XSAhPSBORVRTTk1QX0lGQURNSU5TVEFUVVMpIHsKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9UV1JJVEFCTEU7CiAgICB9CgogICAgc3dpdGNoIChhY3Rpb24pIHsKICAgIGNhc2UgUkVTRVJWRTE6ICAgICAgICAgICAgIC8qIENoZWNrIHZhbHVlcyBmb3IgYWNjZXB0YWJpbGl0eSAqLwogICAgICAgIGlmICh2YXJfdmFsX3R5cGUgIT0gQVNOX0lOVEVHRVIpIHsKICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwgIm5vdCBpbnRlZ2VyXG4iKTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX1dST05HVFlQRTsKICAgICAgICB9CiAgICAgICAgaWYgKHZhcl92YWxfbGVuID4gc2l6ZW9mKGludCkpIHsKICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwgImJhZCBsZW5ndGhcbiIpOwogICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfV1JPTkdMRU5HVEg7CiAgICAgICAgfQoKICAgICAgICAvKgogICAgICAgICAqIFRoZSBkd0FkbWluU3RhdHVzIG1lbWJlciBjYW4gYmUgTUlCX0lGX0FETUlOX1NUQVRVU19VUCBvciBNSUJfSUZfQURNSU5fU1RBVFVTX0RPV04gCiAgICAgICAgICovCiAgICAgICAgaWYgKCEoKChpbnQpICgqdmFyX3ZhbCkgPT0gTUlCX0lGX0FETUlOX1NUQVRVU19VUCkgfHwKICAgICAgICAgICAgICAoKGludCkgKCp2YXJfdmFsKSA9PSBNSUJfSUZfQURNSU5fU1RBVFVTX0RPV04pKSkgewogICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLCAibm90IHN1cHBvcnRlZCBhZG1pbiBzdGF0ZVxuIik7CiAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9XUk9OR1ZBTFVFOwogICAgICAgIH0KICAgICAgICBicmVhazsKCiAgICBjYXNlIFJFU0VSVkUyOiAgICAgICAgICAgICAvKiBBbGxvY2F0ZSBtZW1vcnkgYW5kIHNpbWlsYXIgcmVzb3VyY2VzICovCiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBBQ1RJT046CiAgICAgICAgLyoKICAgICAgICAgKiBTYXZlIHRoZSBvbGQgdmFsdWUsIGluIGNhc2Ugb2YgVU5ETyAKICAgICAgICAgKi8KCiAgICAgICAgb2xkYWRtaW5fc3RhdHVzID0gYWRtaW5fc3RhdHVzOwogICAgICAgIGFkbWluX3N0YXR1cyA9IChpbnQpICp2YXJfdmFsOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgVU5ETzogICAgICAgICAgICAgICAgIC8qIFJldmVyc2UgdGhlIFNFVCBhY3Rpb24gYW5kIGZyZWUgcmVzb3VyY2VzICovCiAgICAgICAgYWRtaW5fc3RhdHVzID0gb2xkYWRtaW5fc3RhdHVzOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgQ09NTUlUOiAgICAgICAgICAgICAgIC8qIENvbmZpcm0gdGhlIFNFVCwgcGVyZm9ybWluZyBhbnkgaXJyZXZlcnNpYmxlIGFjdGlvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYW5kIGZyZWUgcmVzb3VyY2VzICovCiAgICAgICAgaWZFbnRyeVJvdy5kd0luZGV4ID0gKGludCkgbmFtZVsxMF07CiAgICAgICAgaWZFbnRyeVJvdy5kd0FkbWluU3RhdHVzID0gYWRtaW5fc3RhdHVzOwogICAgICAgIC8qCiAgICAgICAgICogT25seSBVUCBhbmQgRE9XTiBzdGF0dXMgYXJlIHN1cHBvcnRlZC4gVGhhdHMgd2h5IGRvbmUgaW4gQ09NTUlUIAogICAgICAgICAqLwogICAgICAgIGlmIChTZXRJZkVudHJ5KCZpZkVudHJ5Um93KSAhPSBOT19FUlJPUikgewogICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLAogICAgICAgICAgICAgICAgICAgICAiRXJyb3IgaW4gd3JpdGVJZkVudHJ5IGNhc2UgQ09NTUlUIHdpdGggaW5kZXg6ICVsdSAmIGFkbWluU3RhdHVzICVsdVxuIiwKICAgICAgICAgICAgICAgICAgICAgaWZFbnRyeVJvdy5kd0luZGV4LCBpZkVudHJ5Um93LmR3QWRtaW5TdGF0dXMpOwogICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfQ09NTUlURkFJTEVEOwogICAgICAgIH0KCiAgICBjYXNlIEZSRUU6ICAgICAgICAgICAgICAgICAvKiBGcmVlIGFueSByZXNvdXJjZXMgYWxsb2NhdGVkICovCiAgICAgICAgLyoKICAgICAgICAgKiBObyByZXNvdXJjZXMgaGF2ZSBiZWVuIGFsbG9jYXRlZCAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKICAgIH0KICAgIHJldHVybiBTTk1QX0VSUl9OT0VSUk9SOwp9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVuZCBvZiB3cml0ZUlmRW50cnkgKi8KI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXSU4zMiBjeWd3aW4gKi8K