LyoKICogIEludGVyZmFjZXMgTUlCIGdyb3VwIGltcGxlbWVudGF0aW9uIC0gaW50ZXJmYWNlcy5jCiAqCiAqLwoKLyogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29weXJpZ2h0KHMpLiAgU2VlCiAqIHRoZSBOZXQtU05NUCdzIENPUFlJTkcgZmlsZSBmb3IgbW9yZSBkZXRhaWxzIGFuZCBvdGhlciBjb3B5cmlnaHRzCiAqIHRoYXQgbWF5IGFwcGx5OgogKi8KLyoKICogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBjb3B5cmlnaHRlZCBieToKICogQ29weXJpZ2h0IKkgMjAwMyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqIFVzZSBpcyBzdWJqZWN0IHRvIGxpY2Vuc2UgdGVybXMgc3BlY2lmaWVkIGluIHRoZSBDT1BZSU5HIGZpbGUKICogZGlzdHJpYnV0ZWQgd2l0aCB0aGUgTmV0LVNOTVAgcGFja2FnZS4KICovCgojaW5jbHVkZSA8bmV0LXNubXAvbmV0LXNubXAtY29uZmlnLmg+CgojaWYgZGVmaW5lZChORVRTTk1QX0lGTkVUX05FRURTX0tFUk5FTCkgJiYgIWRlZmluZWQoX0tFUk5FTCkgJiYgIWRlZmluZWQoTkVUU05NUF9JRk5FVF9ORUVEU19LRVJORUxfTEFURSkKI2RlZmluZSBfS0VSTkVMIDEKI2RlZmluZSBfSV9ERUZJTkVEX0tFUk5FTAojZW5kaWYKCiNpZiBIQVZFX1NUUklOR19ICiNpbmNsdWRlIDxzdHJpbmcuaD4KI2Vsc2UKI2luY2x1ZGUgPHN0cmluZ3MuaD4KI2VuZGlmCgojaWYgSEFWRV9TVERMSUJfSAojaW5jbHVkZSA8c3RkbGliLmg+CiNlbmRpZgojaWYgSEFWRV9VTklTVERfSAojaW5jbHVkZSA8dW5pc3RkLmg+CiNlbmRpZgojaWYgSEFWRV9TWVNfUEFSQU1fSAojaW5jbHVkZSA8c3lzL3BhcmFtLmg+CiNlbmRpZgojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNpZiBkZWZpbmVkKE5FVFNOTVBfSUZORVRfTkVFRFNfS0VSTkVMKSAmJiAhZGVmaW5lZChfS0VSTkVMKSAmJiBkZWZpbmVkKE5FVFNOTVBfSUZORVRfTkVFRFNfS0VSTkVMX0xBVEUpCiNkZWZpbmUgX0tFUk5FTCAxCiNkZWZpbmUgX0lfREVGSU5FRF9LRVJORUwKI2VuZGlmCiNpZiBIQVZFX1NZU19TT0NLRVRfSAojaW5jbHVkZSA8c3lzL3NvY2tldC5oPgojZW5kaWYKI2lmbmRlZiBTVFJFQU1fTkVFRFNfS0VSTkVMX0lTTEFORFMKI2lmIEhBVkVfU1lTX1NUUkVBTV9ICiNpbmNsdWRlIDxzeXMvc3RyZWFtLmg+CiNlbmRpZgojZW5kaWYKI2lmIEhBVkVfU1lTX1NPQ0tFVFZBUl9ICiNpbmNsdWRlIDxzeXMvc29ja2V0dmFyLmg+CiNlbmRpZgoKI2lmIFRJTUVfV0lUSF9TWVNfVElNRQojIGluY2x1ZGUgPHN5cy90aW1lLmg+CiMgaW5jbHVkZSA8dGltZS5oPgojZWxzZQojIGlmIEhBVkVfU1lTX1RJTUVfSAojICBpbmNsdWRlIDxzeXMvdGltZS5oPgojIGVsc2UKIyAgaW5jbHVkZSA8dGltZS5oPgojIGVuZGlmCiNlbmRpZgojaWYgSEFWRV9TWVNfU09DS0lPX0gKI2luY2x1ZGUgPHN5cy9zb2NraW8uaD4KI2VuZGlmCiNpZiBIQVZFX0ZDTlRMX0gKI2luY2x1ZGUgPGZjbnRsLmg+CiNlbmRpZgojaWYgSEFWRV9TWVNfSU9DVExfSAojaW5jbHVkZSA8c3lzL2lvY3RsLmg+CiNlbmRpZgojaWYgSEFWRV9ORVRJTkVUX0lOX0gKI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KI2VuZGlmCiNpZiBIQVZFX05FVF9JRl9ICiNpbmNsdWRlIDxuZXQvaWYuaD4KI2VuZGlmCiNpZiBIQVZFX05FVElORVRfSU5fVkFSX0gKI2luY2x1ZGUgPG5ldGluZXQvaW5fdmFyLmg+CiNlbmRpZgojaWYgSEFWRV9ORVRfSUZfVkFSX0gKI2luY2x1ZGUgPG5ldC9pZl92YXIuaD4KI2VuZGlmCiNpZmRlZiBfSV9ERUZJTkVEX0tFUk5FTAojdW5kZWYgX0tFUk5FTAojZW5kaWYKI2lmZGVmIFNUUkVBTV9ORUVEU19LRVJORUxfSVNMQU5EUwojaWYgSEFWRV9TWVNfU1RSRUFNX0gKI2luY2x1ZGUgPHN5cy9zdHJlYW0uaD4KI2VuZGlmCiNlbmRpZgojaWYgSEFWRV9ORVRfUk9VVEVfSAojaW5jbHVkZSA8bmV0L3JvdXRlLmg+CiNlbmRpZgojaWYgSEFWRV9ORVRJTkVUX0lOX1NZU1RNX0gKI2luY2x1ZGUgPG5ldGluZXQvaW5fc3lzdG0uaD4KI2VuZGlmCiNpZiBIQVZFX1NZU19IQVNISU5HX0gKI2luY2x1ZGUgPHN5cy9oYXNoaW5nLmg+CiNlbmRpZgojaWYgSEFWRV9ORVRJTkVUX0lOX1ZBUl9ICiNpbmNsdWRlIDxuZXRpbmV0L2luX3Zhci5oPgojZW5kaWYKI2lmIEhBVkVfTkVUSU5FVF9JUF9ICiNpbmNsdWRlIDxuZXRpbmV0L2lwLmg+CiNlbmRpZgojaWZkZWYgTkVUU05NUF9FTkFCTEVfSVBWNgojaWYgSEFWRV9ORVRJTkVUX0lQNl9ICiNpbmNsdWRlIDxuZXRpbmV0L2lwNi5oPgojZW5kaWYKI2VuZGlmCiNpZiBIQVZFX1NZU19RVUVVRV9ICiNpbmNsdWRlIDxzeXMvcXVldWUuaD4KI2VuZGlmCiNpZiBIQVZFX05FVElORVRfSVBfVkFSX0gKI2luY2x1ZGUgPG5ldGluZXQvaXBfdmFyLmg+CiNlbmRpZgojaWZkZWYgTkVUU05NUF9FTkFCTEVfSVBWNgojaWYgSEFWRV9ORVRORVRTTk1QX0VOQUJMRV9JUFY2X0lQNl9WQVJfSAojaW5jbHVkZSA8bmV0aW5ldDYvaXA2X3Zhci5oPgojZW5kaWYKI2VuZGlmCiNpZiBIQVZFX05FVElORVRfSU5fUENCX0gKI2luY2x1ZGUgPG5ldGluZXQvaW5fcGNiLmg+CiNlbmRpZgojaWYgSEFWRV9ORVRJTkVUX0lGX0VUSEVSX0gKI2luY2x1ZGUgPG5ldGluZXQvaWZfZXRoZXIuaD4KI2VuZGlmCiNpZiBIQVZFX05FVF9JRl9UWVBFU19ICiNpbmNsdWRlIDxuZXQvaWZfdHlwZXMuaD4KI2VuZGlmCiNpZiBIQVZFX05FVF9JRl9ETF9ICiNpZm5kZWYgZHluaXgKI2luY2x1ZGUgPG5ldC9pZl9kbC5oPgojZWxzZQojaW5jbHVkZSA8c3lzL25ldC9pZl9kbC5oPgojZW5kaWYKI2VuZGlmCiNpZiBIQVZFX0lORVRfTUlCMl9ICiNpbmNsdWRlIDxpbmV0L21pYjIuaD4KI2VuZGlmCiNpZiBIQVZFX0lPQ1RMU19ICiNpbmNsdWRlIDxpb2N0bHMuaD4KI2VuZGlmCgojaWZkZWYgc29sYXJpczIKIyBpbmNsdWRlIDxlcnJuby5oPgojaW5jbHVkZSAia2VybmVsX3N1bm9zNS5oIgojZWxzZQojaW5jbHVkZSAia2VybmVsLmgiCiNlbmRpZgoKI2lmZGVmIGhwdXgKI2luY2x1ZGUgPHN5cy9taWIuaD4KI2luY2x1ZGUgPG5ldGluZXQvbWliX2tlcm4uaD4KI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBocHV4ICovCgojaWZkZWYgY3lnd2luCiNpbmNsdWRlIDx3aW5kb3dzLmg+CiNlbmRpZgoKI2lmIEhBVkVfU1lTX1NZU0NUTF9ICiNpbmNsdWRlIDxzeXMvc3lzY3RsLmg+CgojaWYgZGVmaW5lZChmcmVlYnNkMykgfHwgZGVmaW5lZChmcmVlYnNkNCkgfHwgZGVmaW5lZChmcmVlYnNkNSkKIyAgICBkZWZpbmUgVVNFX1NZU0NUTF9JRkxJU1QKI2Vsc2UKIyBpZiBkZWZpbmVkKENUTF9ORVQpICYmICFkZWZpbmVkKGZyZWVic2QyKSAmJiAhZGVmaW5lZChuZXRic2QxKQojICBpZmRlZiBQRl9ST1VURQojICAgaWZkZWYgTkVUX1JUX0lGTElTVAojICAgIGlmbmRlZiBuZXRic2QxCiMgICAgIGRlZmluZSBVU0VfU1lTQ1RMX0lGTElTVAojICAgIGVuZGlmCiMgICBlbmRpZgojICBlbmRpZgojIGVuZGlmCiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGVmaW5lZChmcmVlYnNkMykgKi8KI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBIQVZFX1NZU19TWVNDVExfSCAqLwoKI2lmIEhBVkVfT1NSRUxEQVRFX0gKI2luY2x1ZGUgPG9zcmVsZGF0ZS5oPgojZW5kaWYKI2lmZGVmIE5FVFNOTVBfQ0FOX1VTRV9TWVNDVEwKI2luY2x1ZGUgPHN5cy9zeXNjdGwuaD4KI2VuZGlmCgojaW5jbHVkZSA8bmV0LXNubXAvbmV0LXNubXAtaW5jbHVkZXMuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL2FnZW50L25ldC1zbm1wLWFnZW50LWluY2x1ZGVzLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9hZ2VudC9hdXRvX25saXN0Lmg+CiNpbmNsdWRlIDxuZXQtc25tcC9hZ2VudC9zeXNPUlRhYmxlLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9kYXRhX2FjY2Vzcy9pbnRlcmZhY2UuaD4KCiNpbmNsdWRlICJpbnRlcmZhY2VzLmgiCiNpbmNsdWRlICJzdHJ1Y3QuaCIKI2luY2x1ZGUgInV0aWxfZnVuY3MvaGVhZGVyX2dlbmVyaWMuaCIKCi8qIGlmIHlvdSB3YW50IGNhY2hpbmcgZW5hYmxlZCBmb3Igc3BlZWQgcmV0cmlldmFsIHB1cnBvc2VzLCBzZXQgdGhpcyB0byA1PyovCiNkZWZpbmUgTUlOTE9BREZSRVEgMCAgICAgICAgICAgICAgICAgICAgIC8qIG1pbiByZWxvYWQgZnJlcXVlbmN5IGluIHNlY29uZHMgKi8KI2lmZGVmIGxpbnV4CnN0YXRpYyB1bnNpZ25lZCBsb25nIExhc3RMb2FkID0gMDsgICAgICAgIC8qIEVUIGluIHNlY3MgYXQgbGFzdCB0YWJsZSBsb2FkICovCiNlbmRpZgoKI2RlZmluZSBzdGFydHRpbWUgKCooY29uc3Qgc3RydWN0IHRpbWV2YWwqKW5ldHNubXBfZ2V0X2FnZW50X3N0YXJ0dGltZSgpKQoKc3RydWN0IHZhcmlhYmxlMyBpbnRlcmZhY2VzX3ZhcmlhYmxlc1tdID0gewogICAge05FVFNOTVBfSUZOVU1CRVIsIEFTTl9JTlRFR0VSLCBORVRTTk1QX09MREFQSV9ST05MWSwKICAgICB2YXJfaW50ZXJmYWNlcywgMSwgezF9fSwKICAgIHtORVRTTk1QX0lGSU5ERVgsIEFTTl9JTlRFR0VSLCBORVRTTk1QX09MREFQSV9ST05MWSwKICAgICB2YXJfaWZFbnRyeSwgMywgezIsIDEsIDF9fSwKICAgIHtORVRTTk1QX0lGREVTQ1IsIEFTTl9PQ1RFVF9TVFIsIE5FVFNOTVBfT0xEQVBJX1JPTkxZLAogICAgIHZhcl9pZkVudHJ5LCAzLCB7MiwgMSwgMn19LAogICAge05FVFNOTVBfSUZUWVBFLCBBU05fSU5URUdFUiwgTkVUU05NUF9PTERBUElfUk9OTFksCiAgICAgdmFyX2lmRW50cnksIDMsIHsyLCAxLCAzfX0sCiAgICB7TkVUU05NUF9JRk1UVSwgQVNOX0lOVEVHRVIsIE5FVFNOTVBfT0xEQVBJX1JPTkxZLAogICAgIHZhcl9pZkVudHJ5LCAzLCB7MiwgMSwgNH19LAogICAge05FVFNOTVBfSUZTUEVFRCwgQVNOX0dBVUdFLCBORVRTTk1QX09MREFQSV9ST05MWSwKICAgICB2YXJfaWZFbnRyeSwgMywgezIsIDEsIDV9fSwKICAgIHtORVRTTk1QX0lGUEhZU0FERFJFU1MsIEFTTl9PQ1RFVF9TVFIsIE5FVFNOTVBfT0xEQVBJX1JPTkxZLAogICAgIHZhcl9pZkVudHJ5LCAzLCB7MiwgMSwgNn19LAojaWYgZGVmaW5lZCAoV0lOMzIpIHx8IGRlZmluZWQgKGN5Z3dpbikKICAgIHtORVRTTk1QX0lGQURNSU5TVEFUVVMsIEFTTl9JTlRFR0VSLCBORVRTTk1QX09MREFQSV9SV1JJVEUsCiAgICAgdmFyX2lmRW50cnksIDMsIHsyLCAxLCA3fX0sCiNlbHNlCiAgICB7TkVUU05NUF9JRkFETUlOU1RBVFVTLCBBU05fSU5URUdFUiwgTkVUU05NUF9PTERBUElfUk9OTFksCiAgICAgdmFyX2lmRW50cnksIDMsIHsyLCAxLCA3fX0sCiNlbmRpZgogICAge05FVFNOTVBfSUZPUEVSU1RBVFVTLCBBU05fSU5URUdFUiwgTkVUU05NUF9PTERBUElfUk9OTFksCiAgICAgdmFyX2lmRW50cnksIDMsIHsyLCAxLCA4fX0sCiAgICB7TkVUU05NUF9JRkxBU1RDSEFOR0UsIEFTTl9USU1FVElDS1MsIE5FVFNOTVBfT0xEQVBJX1JPTkxZLAogICAgIHZhcl9pZkVudHJ5LCAzLCB7MiwgMSwgOX19LAogICAge05FVFNOTVBfSUZJTk9DVEVUUywgQVNOX0NPVU5URVIsIE5FVFNOTVBfT0xEQVBJX1JPTkxZLAogICAgIHZhcl9pZkVudHJ5LCAzLCB7MiwgMSwgMTB9fSwKICAgIHtORVRTTk1QX0lGSU5VQ0FTVFBLVFMsIEFTTl9DT1VOVEVSLCBORVRTTk1QX09MREFQSV9ST05MWSwKICAgICB2YXJfaWZFbnRyeSwgMywgezIsIDEsIDExfX0sCiAgICB7TkVUU05NUF9JRklOTlVDQVNUUEtUUywgQVNOX0NPVU5URVIsIE5FVFNOTVBfT0xEQVBJX1JPTkxZLAogICAgIHZhcl9pZkVudHJ5LCAzLCB7MiwgMSwgMTJ9fSwKICAgIHtORVRTTk1QX0lGSU5ESVNDQVJEUywgQVNOX0NPVU5URVIsIE5FVFNOTVBfT0xEQVBJX1JPTkxZLAogICAgIHZhcl9pZkVudHJ5LCAzLCB7MiwgMSwgMTN9fSwKICAgIHtORVRTTk1QX0lGSU5FUlJPUlMsIEFTTl9DT1VOVEVSLCBORVRTTk1QX09MREFQSV9ST05MWSwKICAgICB2YXJfaWZFbnRyeSwgMywgezIsIDEsIDE0fX0sCiAgICB7TkVUU05NUF9JRklOVU5LTk9XTlBST1RPUywgQVNOX0NPVU5URVIsIE5FVFNOTVBfT0xEQVBJX1JPTkxZLAogICAgIHZhcl9pZkVudHJ5LCAzLCB7MiwgMSwgMTV9fSwKICAgIHtORVRTTk1QX0lGT1VUT0NURVRTLCBBU05fQ09VTlRFUiwgTkVUU05NUF9PTERBUElfUk9OTFksCiAgICAgdmFyX2lmRW50cnksIDMsIHsyLCAxLCAxNn19LAogICAge05FVFNOTVBfSUZPVVRVQ0FTVFBLVFMsIEFTTl9DT1VOVEVSLCBORVRTTk1QX09MREFQSV9ST05MWSwKICAgICB2YXJfaWZFbnRyeSwgMywgezIsIDEsIDE3fX0sCiAgICB7TkVUU05NUF9JRk9VVE5VQ0FTVFBLVFMsIEFTTl9DT1VOVEVSLCBORVRTTk1QX09MREFQSV9ST05MWSwKICAgICB2YXJfaWZFbnRyeSwgMywgezIsIDEsIDE4fX0sCiAgICB7TkVUU05NUF9JRk9VVERJU0NBUkRTLCBBU05fQ09VTlRFUiwgTkVUU05NUF9PTERBUElfUk9OTFksCiAgICAgdmFyX2lmRW50cnksIDMsIHsyLCAxLCAxOX19LAogICAge05FVFNOTVBfSUZPVVRFUlJPUlMsIEFTTl9DT1VOVEVSLCBORVRTTk1QX09MREFQSV9ST05MWSwKICAgICB2YXJfaWZFbnRyeSwgMywgezIsIDEsIDIwfX0sCiAgICB7TkVUU05NUF9JRk9VVFFMRU4sIEFTTl9HQVVHRSwgTkVUU05NUF9PTERBUElfUk9OTFksCiAgICAgdmFyX2lmRW50cnksIDMsIHsyLCAxLCAyMX19LAogICAge05FVFNOTVBfSUZTUEVDSUZJQywgQVNOX09CSkVDVF9JRCwgTkVUU05NUF9PTERBUElfUk9OTFksCiAgICAgdmFyX2lmRW50cnksIDMsIHsyLCAxLCAyMn19Cn07CgovKgogKiBEZWZpbmUgdGhlIE9JRCBwb2ludGVyIHRvIHRoZSB0b3Agb2YgdGhlIG1pYiB0cmVlIHRoYXQgd2UncmUKICogcmVnaXN0ZXJpbmcgdW5kZXJuZWF0aCwgYW5kIHRoZSBPSUQgb2YgdGhlIE1JQiBtb2R1bGUgCiAqLwpvaWQgICAgICAgICAgICAgaW50ZXJmYWNlc192YXJpYWJsZXNfb2lkW10gPSB7IFNOTVBfT0lEX01JQjIsIDIgfTsKb2lkICAgICAgICAgICAgIGludGVyZmFjZXNfbW9kdWxlX29pZFtdID0geyBTTk1QX09JRF9NSUIyLCAzMSB9OwoKdm9pZAppbml0X2ludGVyZmFjZXModm9pZCkKewogICAgLyoKICAgICAqIHJlZ2lzdGVyIG91cnNlbHZlcyB3aXRoIHRoZSBhZ2VudCB0byBoYW5kbGUgb3VyIG1pYiB0cmVlIAogICAgICovCiAgICBSRUdJU1RFUl9NSUIoIm1pYklJL2ludGVyZmFjZXMiLCBpbnRlcmZhY2VzX3ZhcmlhYmxlcywgdmFyaWFibGUzLAogICAgICAgICAgICAgICAgIGludGVyZmFjZXNfdmFyaWFibGVzX29pZCk7CiAgICBSRUdJU1RFUl9TWVNPUl9FTlRSWShpbnRlcmZhY2VzX21vZHVsZV9vaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAiVGhlIE1JQiBtb2R1bGUgdG8gZGVzY3JpYmUgZ2VuZXJpYyBvYmplY3RzIGZvciBuZXR3b3JrIGludGVyZmFjZSBzdWItbGF5ZXJzIik7CgojaWZuZGVmIFVTRV9TWVNDVExfSUZMSVNUCiNpZiBIQVZFX05FVF9JRl9NSUJfSAogICAgaW5pdF9pbnRlcmZhY2VzX3NldHVwKCk7CiNlbmRpZgojZW5kaWYKI2lmZGVmIHNvbGFyaXMyCiAgICBpbml0X2tlcm5lbF9zdW5vczUoKTsKI2VuZGlmCn0KCiNpZmRlZiBsaW51eAovKgogKiBpZl90eXBlX2Zyb21fbmFtZQogKiBSZXR1cm4gaW50ZXJmYWNlIHR5cGUgdXNpbmcgdGhlIGludGVyZmFjZSBuYW1lIGFzIGEgY2x1ZS4KICogUmV0dXJucyAxIHRvIGltcGx5ICJvdGhlciIgdHlwZSBpZiBuYW1lIG5vdCByZWNvZ25pemVkLiAKICovCnN0YXRpYyBpbnQKaWZfdHlwZV9mcm9tX25hbWUoY29uc3QgY2hhciAqcGNjaCkKewogICAgdHlwZWRlZiBzdHJ1Y3QgX21hdGNoX2lmIHsKICAgICAgICBpbnQgICAgICAgICAgICAgbWlfdHlwZTsKICAgICAgICBjb25zdCBjaGFyICAgICAqbWlfbmFtZTsKICAgIH0gICAgICAgICAgICAgICpwbWF0Y2hfaWYsIG1hdGNoX2lmOwoKICAgIHN0YXRpYyBtYXRjaF9pZiBsbWF0Y2hfaWZbXSA9IHsKICAgICAgICB7MjQsICJsbyJ9LAogICAgICAgIHs2LCAiZXRoIn0sCiAgICAgICAgezksICJ0ciJ9LAogICAgICAgIHsyMywgInBwcCJ9LAogICAgICAgIHsyOCwgInNsIn0sCiAgICAgICAgezAsIDB9ICAgICAgICAgICAgICAgICAgLyogZW5kIG9mIGxpc3QgKi8KICAgIH07CgogICAgaW50ICAgICAgICAgICAgIGlpLCBsZW47CiAgICByZWdpc3RlciBwbWF0Y2hfaWYgcG07CgogICAgZm9yIChpaSA9IDAsIHBtID0gbG1hdGNoX2lmOyBwbS0+bWlfbmFtZTsgcG0rKykgewogICAgICAgIGxlbiA9IHN0cmxlbihwbS0+bWlfbmFtZSk7CiAgICAgICAgaWYgKDAgPT0gc3RybmNtcChwY2NoLCBwbS0+bWlfbmFtZSwgbGVuKSkgewogICAgICAgICAgICByZXR1cm4gKHBtLT5taV90eXBlKTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gKDEpOyAgICAgICAgICAgICAgICAgLyogaW4gY2FzZSBzZWFyY2ggZmFpbHMgKi8KfQojZW5kaWYKCgojaWZkZWYgbGludXgKc3RhdGljIHN0cnVjdCBpZm5ldCAqaWZuZXRhZGRyX2xpc3Q7CiNlbmRpZgoKCi8qCiAqIGhlYWRlcl9pZkVudHJ5KC4uLgogKiBBcmd1bWVudHM6CiAqIHZwICAgICBJTiAgICAgIC0gcG9pbnRlciB0byB2YXJpYWJsZSBlbnRyeSB0aGF0IHBvaW50cyBoZXJlCiAqIG5hbWUgICAgSU4vT1VUICAtIElOL25hbWUgcmVxdWVzdGVkLCBPVVQvbmFtZSBmb3VuZAogKiBsZW5ndGggIElOL09VVCAgLSBsZW5ndGggb2YgSU4vT1VUIG9pZCdzIAogKiBleGFjdCAgIElOICAgICAgLSBUUlVFIGlmIGFuIGV4YWN0IG1hdGNoIHdhcyByZXF1ZXN0ZWQKICogdmFyX2xlbiBPVVQgICAgIC0gbGVuZ3RoIG9mIHZhcmlhYmxlIG9yIDAgaWYgZnVuY3Rpb24gcmV0dXJuZWQKICogd3JpdGVfbWV0aG9kCiAqIAogKi8KI2lmICFkZWZpbmVkIChXSU4zMikgJiYgIWRlZmluZWQgKGN5Z3dpbikKc3RhdGljIGludApoZWFkZXJfaWZFbnRyeShzdHJ1Y3QgdmFyaWFibGUgKnZwLAogICAgICAgICAgICAgICBvaWQgKiBuYW1lLAogICAgICAgICAgICAgICBzaXplX3QgKiBsZW5ndGgsCiAgICAgICAgICAgICAgIGludCBleGFjdCwgc2l6ZV90ICogdmFyX2xlbiwgV3JpdGVNZXRob2QgKiogd3JpdGVfbWV0aG9kKQp7CiNkZWZpbmUgSUZFTlRSWV9OQU1FX0xFTkdUSAkxMAogICAgb2lkICAgICAgICAgICAgIG5ld25hbWVbTUFYX09JRF9MRU5dOwogICAgcmVnaXN0ZXIgaW50ICAgIGludGVyZmFjZTsKICAgIGludCAgICAgICAgICAgICByZXN1bHQsIGNvdW50OwoKICAgIERFQlVHTVNHVEwoKCJtaWJJSS9pbnRlcmZhY2VzIiwgInZhcl9pZkVudHJ5OiAiKSk7CiAgICBERUJVR01TR09JRCgoIm1pYklJL2ludGVyZmFjZXMiLCBuYW1lLCAqbGVuZ3RoKSk7CiAgICBERUJVR01TRygoIm1pYklJL2ludGVyZmFjZXMiLCAiICVkXG4iLCBleGFjdCkpOwoKICAgIG1lbWNweSgoY2hhciAqKSBuZXduYW1lLCAoY2hhciAqKSB2cC0+bmFtZSwKICAgICAgICAgICAoaW50KSB2cC0+bmFtZWxlbiAqIHNpemVvZihvaWQpKTsKICAgIC8qCiAgICAgKiBmaW5kICJuZXh0IiBpbnRlcmZhY2UgCiAgICAgKi8KICAgIGNvdW50ID0gSW50ZXJmYWNlX1NjYW5fR2V0X0NvdW50KCk7CiAgICBmb3IgKGludGVyZmFjZSA9IDE7IGludGVyZmFjZSA8PSBjb3VudDsgaW50ZXJmYWNlKyspIHsKICAgICAgICBuZXduYW1lW0lGRU5UUllfTkFNRV9MRU5HVEhdID0gKG9pZCkgaW50ZXJmYWNlOwogICAgICAgIHJlc3VsdCA9CiAgICAgICAgICAgIHNubXBfb2lkX2NvbXBhcmUobmFtZSwgKmxlbmd0aCwgbmV3bmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSB2cC0+bmFtZWxlbiArIDEpOwogICAgICAgIGlmICgoZXhhY3QgJiYgKHJlc3VsdCA9PSAwKSkgfHwgKCFleGFjdCAmJiAocmVzdWx0IDwgMCkpKQogICAgICAgICAgICBicmVhazsKICAgIH0KICAgIGlmIChpbnRlcmZhY2UgPiBjb3VudCkgewogICAgICAgIERFQlVHTVNHVEwoKCJtaWJJSS9pbnRlcmZhY2VzIiwgIi4uLiBpbmRleCBvdXQgb2YgcmFuZ2VcbiIpKTsKICAgICAgICByZXR1cm4gTUFUQ0hfRkFJTEVEOwogICAgfQoKCiAgICBtZW1jcHkoKGNoYXIgKikgbmFtZSwgKGNoYXIgKikgbmV3bmFtZSwKICAgICAgICAgICAoKGludCkgdnAtPm5hbWVsZW4gKyAxKSAqIHNpemVvZihvaWQpKTsKICAgICpsZW5ndGggPSB2cC0+bmFtZWxlbiArIDE7CiAgICAqd3JpdGVfbWV0aG9kID0gMDsKICAgICp2YXJfbGVuID0gc2l6ZW9mKGxvbmcpOyAgICAvKiBkZWZhdWx0IHRvICdsb25nJyByZXN1bHRzICovCgogICAgREVCVUdNU0dUTCgoIm1pYklJL2ludGVyZmFjZXMiLCAiLi4uIGdldCBJL0Ygc3RhdHMgIikpOwogICAgREVCVUdNU0dPSUQoKCJtaWJJSS9pbnRlcmZhY2VzIiwgbmFtZSwgKmxlbmd0aCkpOwogICAgREVCVUdNU0coKCJtaWJJSS9pbnRlcmZhY2VzIiwgIlxuIikpOwoKICAgIHJldHVybiBpbnRlcmZhY2U7Cn0KCgoKdV9jaGFyICAgICAgICAgKgp2YXJfaW50ZXJmYWNlcyhzdHJ1Y3QgdmFyaWFibGUgKiB2cCwKICAgICAgICAgICAgICAgb2lkICogbmFtZSwKICAgICAgICAgICAgICAgc2l6ZV90ICogbGVuZ3RoLAogICAgICAgICAgICAgICBpbnQgZXhhY3QsIHNpemVfdCAqIHZhcl9sZW4sIFdyaXRlTWV0aG9kICoqIHdyaXRlX21ldGhvZCkKewogICAgaWYgKGhlYWRlcl9nZW5lcmljKHZwLCBuYW1lLCBsZW5ndGgsIGV4YWN0LCB2YXJfbGVuLCB3cml0ZV9tZXRob2QpID09CiAgICAgICAgTUFUQ0hfRkFJTEVEKQogICAgICAgIHJldHVybiBOVUxMOwoKICAgIHN3aXRjaCAodnAtPm1hZ2ljKSB7CiAgICBjYXNlIE5FVFNOTVBfSUZOVU1CRVI6CiAgICAgICAgbG9uZ19yZXR1cm4gPSBJbnRlcmZhY2VfU2Nhbl9HZXRfQ291bnQoKTsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgZGVmYXVsdDoKICAgICAgICBERUJVR01TR1RMKCgic25tcGQiLCAidW5rbm93biBzdWItaWQgJWQgaW4gdmFyX2ludGVyZmFjZXNcbiIsCiAgICAgICAgICAgICAgICAgICAgdnAtPm1hZ2ljKSk7CiAgICB9CiAgICByZXR1cm4gTlVMTDsKfQoKI2lmZGVmIFVTRV9TWVNDVExfSUZMSVNUCgpzdGF0aWMgdV9jaGFyICAqaWZfbGlzdCA9IDA7CnN0YXRpYyBjb25zdCB1X2NoYXIgKmlmX2xpc3RfZW5kOwpzdGF0aWMgc2l6ZV90ICAgaWZfbGlzdF9zaXplID0gMDsKCnN0cnVjdCBzbWFsbF9pZmFkZHIgewogICAgc3RydWN0IGluX2FkZHIgIHNpZmFfYWRkcjsKICAgIHN0cnVjdCBpbl9hZGRyICBzaWZhX25ldG1hc2s7CiAgICBzdHJ1Y3QgaW5fYWRkciAgc2lmYV9icm9hZGNhc3Q7Cn07CgpleHRlcm4gY29uc3Qgc3RydWN0IHNvY2thZGRyICpnZXRfYWRkcmVzcyhjb25zdCB2b2lkICosIGludCwgaW50KTsKZXh0ZXJuIGNvbnN0IHN0cnVjdCBpbl9hZGRyICpnZXRfaW5fYWRkcmVzcyhjb25zdCB2b2lkICosIGludCwgaW50KTsKc3RhdGljIGludCAgICAgIEludGVyZmFjZV9TY2FuX0J5X0luZGV4KGludCwgc3RydWN0IGlmX21zZ2hkciAqLCBjaGFyICosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc21hbGxfaWZhZGRyICopOwpzdGF0aWMgaW50ICAgICAgSW50ZXJmYWNlX0dldF9FdGhlcl9CeV9JbmRleChpbnQsIHVfY2hhciAqKTsKCnN0YXRpYyBpbnQKSW50ZXJmYWNlX1NjYW5fQnlfSW5kZXgoaW50IGlpbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGlmX21zZ2hkciAqaWZfbXNnLAogICAgICAgICAgICAgICAgICAgICAgICBjaGFyICppZl9uYW1lLCBzdHJ1Y3Qgc21hbGxfaWZhZGRyICpzaWZhKQp7CiAgICB1X2NoYXIgICAgICAgICAqY3A7CiAgICBzdHJ1Y3QgaWZfbXNnaGRyICppZnA7CiAgICBpbnQgICAgICAgICAgICAgaGF2ZV9pZmluZm8gPSAwLCBoYXZlX2FkZHIgPSAwOwoKICAgIGlmIChOVUxMICE9IHNpZmEpCiAgICAgICAgbWVtc2V0KHNpZmEsIDAsIHNpemVvZigqc2lmYSkpOwogICAgZm9yIChjcCA9IGlmX2xpc3Q7IGNwIDwgaWZfbGlzdF9lbmQ7IGNwICs9IGlmcC0+aWZtX21zZ2xlbikgewogICAgICAgIGlmcCA9IChzdHJ1Y3QgaWZfbXNnaGRyICopIGNwOwogICAgICAgIERFQlVHTVNHVEwoKCJtaWJJSS9pbnRlcmZhY2VzIiwgImlmbV90eXBlID0gJWQsIGlmbV9pbmRleCA9ICVkXG4iLAogICAgICAgICAgICAgICAgICAgIGlmcC0+aWZtX3R5cGUsIGlmcC0+aWZtX2luZGV4KSk7CgogICAgICAgIHN3aXRjaCAoaWZwLT5pZm1fdHlwZSkgewogICAgICAgIGNhc2UgUlRNX0lGSU5GTzoKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHNvY2thZGRyICphOwoKICAgICAgICAgICAgICAgIGlmIChpZnAtPmlmbV9pbmRleCA9PSBpaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICBhID0gZ2V0X2FkZHJlc3MoaWZwICsgMSwgaWZwLT5pZm1fYWRkcnMsIFJUQV9JRlApOwogICAgICAgICAgICAgICAgICAgIGlmIChhID09IE5VTEwpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgICAgIHNwcmludGYoaWZfbmFtZSwgIiUuKnMiLCAoKGNvbnN0IHVfY2hhciAqKSBhKVs1XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoY29uc3Qgc3RydWN0IHNvY2thZGRyX2luICopIGEpLT5zaW5femVybyk7CiAgICAgICAgICAgICAgICAgICAgKmlmX21zZyA9ICppZnA7CiAgICAgICAgICAgICAgICAgICAgKytoYXZlX2lmaW5mbzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFJUTV9ORVdBRERSOgogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzdHJ1Y3QgaWZhX21zZ2hkciAqaWZhcCA9IChzdHJ1Y3QgaWZhX21zZ2hkciAqKSBjcDsKCiAgICAgICAgICAgICAgICBpZiAoKE5VTEwgIT0gc2lmYSkgJiYgKGlmYXAtPmlmYW1faW5kZXggPT0gaWluZGV4KSkgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBpbl9hZGRyICppYTsKCiAgICAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgICAgKiBJIGRvbid0IGtub3cgd2h5IHRoZSBub3JtYWwgZ2V0X2FkZHJlc3MoKSBkb2Vzbid0CiAgICAgICAgICAgICAgICAgICAgICogd29yayBvbiBJUklYIDYuMi4gIE1heWJlIHRoaXMgaGFzIHRvIGRvIHdpdGggdGhlCiAgICAgICAgICAgICAgICAgICAgICogZXhpc3RlbmNlIG9mIHN0cnVjdCBzb2NrYWRkcl9uZXcuICBIb3BlZnVsbHksIG9uCiAgICAgICAgICAgICAgICAgICAgICogb3RoZXIgc3lzdGVtcyB3ZSBjYW4gc2ltcGx5IHVzZSBnZXRfaW5fYWRkcmVzcwogICAgICAgICAgICAgICAgICAgICAqIHRocmVlIHRpbWVzLCB3aXRoIChpZmFwKzEpIGFzIHRoZSBzdGFydGluZwogICAgICAgICAgICAgICAgICAgICAqIGFkZHJlc3MuIAogICAgICAgICAgICAgICAgICAgICAqLwoKICAgICAgICAgICAgICAgICAgICBzaWZhLT5zaWZhX25ldG1hc2sgPQogICAgICAgICAgICAgICAgICAgICAgICAqKChzdHJ1Y3QgaW5fYWRkciAqKSAoKGNoYXIgKikgKGlmYXAgKyAxKSArIDQpKTsKICAgICAgICAgICAgICAgICAgICBpYSA9IGdldF9pbl9hZGRyZXNzKChjaGFyICopIChpZmFwICsgMSkgKyA4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZhcC0+aWZhbV9hZGRycyAmPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgflJUQV9ORVRNQVNLLCBSVEFfSUZBKTsKICAgICAgICAgICAgICAgICAgICBpZiAoaWEgPT0gTlVMTCkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CgogICAgICAgICAgICAgICAgICAgIHNpZmEtPnNpZmFfYWRkciA9ICppYTsKICAgICAgICAgICAgICAgICAgICBpYSA9IGdldF9pbl9hZGRyZXNzKChjaGFyICopIChpZmFwICsgMSkgKyA4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZhcC0+aWZhbV9hZGRycyAmPSB+UlRBX05FVE1BU0ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVEFfQlJEKTsKICAgICAgICAgICAgICAgICAgICBpZiAoaWEgPT0gTlVMTCkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CgogICAgICAgICAgICAgICAgICAgIHNpZmEtPnNpZmFfYnJvYWRjYXN0ID0gKmlhOwogICAgICAgICAgICAgICAgICAgICsraGF2ZV9hZGRyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJtaWJJSS9pbnRlcmZhY2VzIiwKICAgICAgICAgICAgICAgICAgICAgICAgInJvdXRpbmcgc29ja2V0OiB1bmtub3duIG1lc3NhZ2UgdHlwZSAlZFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgaWZwLT5pZm1fdHlwZSkpOwogICAgICAgIH0KICAgIH0KICAgIGlmIChoYXZlX2lmaW5mbyAmJiAoTlVMTCA9PSBzaWZhKSB8fCAoaGF2ZV9hZGRyKSkgewogICAgICAgIHJldHVybiAwOwogICAgfSBlbHNlIGlmIChoYXZlX2lmaW5mbyAmJiAhKGlmX21zZy0+aWZtX2ZsYWdzICYgSUZGX1VQKSkKICAgICAgICByZXR1cm4gMDsKICAgIGVsc2UgewogICAgICAgIHJldHVybiAtMTsKICAgIH0KfQoKaW50CkludGVyZmFjZV9TY2FuX0dldF9Db3VudCh2b2lkKQp7CiAgICB1X2NoYXIgICAgICAgICAqY3A7CiAgICBzdHJ1Y3QgaWZfbXNnaGRyICppZnA7CiAgICBsb25nICAgICAgICAgICAgbiA9IDA7CgogICAgSW50ZXJmYWNlX1NjYW5fSW5pdCgpOwoKICAgIGlmIChpZl9saXN0X3NpemUpIHsKICAgICAgICBmb3IgKGNwID0gaWZfbGlzdCwgbiA9IDA7IGNwIDwgaWZfbGlzdF9lbmQ7IGNwICs9IGlmcC0+aWZtX21zZ2xlbikgewogICAgICAgICAgICBpZnAgPSAoc3RydWN0IGlmX21zZ2hkciAqKSBjcDsKICAgIAogICAgICAgICAgICBpZiAoaWZwLT5pZm1fdHlwZSA9PSBSVE1fSUZJTkZPKSB7CiAgICAgICAgICAgICAgICArK247CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gbjsKfQoKdm9pZApJbnRlcmZhY2VfU2Nhbl9Jbml0KHZvaWQpCnsKICAgIGludCAgICAgICAgICAgICBuYW1lW10gPSB7IENUTF9ORVQsIFBGX1JPVVRFLCAwLCAwLCBORVRfUlRfSUZMSVNULCAwIH07CiAgICBzaXplX3QgICAgICAgICAgc2l6ZTsKCiAgICBpZiAoc3lzY3RsKG5hbWUsIHNpemVvZihuYW1lKSAvIHNpemVvZihpbnQpLCAwLCAmc2l6ZSwgMCwgMCkgPT0gLTEpIHsKICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLCAic3lzY3RsIHNpemUgZmFpbFxuIik7CiAgICB9IGVsc2UgewogICAgICAgIGlmIChpZl9saXN0ID09IDAgfHwgaWZfbGlzdF9zaXplIDwgc2l6ZSkgewogICAgICAgICAgICBpZiAoaWZfbGlzdCAhPSAwKSB7CiAgICAgICAgICAgICAgICBmcmVlKGlmX2xpc3QpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmX2xpc3QgICAgICA9IE5VTEw7CiAgICAgICAgICAgIGlmX2xpc3Rfc2l6ZSA9IDA7CiAgICAgICAgICAgIGlmX2xpc3RfZW5kICA9IDA7CiAgICAgICAgICAgIGlmICgoaWZfbGlzdCA9IG1hbGxvYyhzaXplKSkgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwKICAgICAgICAgICAgICAgICAgICAgICAgICJvdXQgb2YgbWVtb3J5IGFsbG9jYXRpbmcgcm91dGUgdGFibGUgKHNpemUgPSAlZClcbiIsIHNpemUpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmX2xpc3Rfc2l6ZSA9IHNpemU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc2l6ZSA9IGlmX2xpc3Rfc2l6ZTsKICAgICAgICB9CiAgICAgICAgaWYgKHN5c2N0bChuYW1lLCBzaXplb2YobmFtZSkgLyBzaXplb2YoaW50KSwKICAgICAgICAgICAgICAgICAgIGlmX2xpc3QsICZzaXplLCAwLCAwKSA9PSAtMSkgewogICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLCAic3lzY3RsIGdldCBmYWlsXG4iKTsKICAgICAgICB9CiAgICAgICAgaWZfbGlzdF9lbmQgPSBpZl9saXN0ICsgc2l6ZTsKICAgIH0KfQoKdV9jaGFyICAgICAgICAgKgp2YXJfaWZFbnRyeShzdHJ1Y3QgdmFyaWFibGUgKnZwLAogICAgICAgICAgICBvaWQgKiBuYW1lLAogICAgICAgICAgICBzaXplX3QgKiBsZW5ndGgsCiAgICAgICAgICAgIGludCBleGFjdCwgc2l6ZV90ICogdmFyX2xlbiwgV3JpdGVNZXRob2QgKiogd3JpdGVfbWV0aG9kKQp7CiAgICBpbnQgICAgICAgICAgICAgaW50ZXJmYWNlOwogICAgc3RydWN0IGlmX21zZ2hkciBpZl9tc2c7CiAgICBzdGF0aWMgY2hhciAgICAgaWZfbmFtZVsxMDBdOwogICAgY29uZl9pZl9saXN0ICAgKmlmX3B0cjsKICAgIGNoYXIgICAgICAgICAgICpjcDsKCiAgICBpbnRlcmZhY2UgPQogICAgICAgIGhlYWRlcl9pZkVudHJ5KHZwLCBuYW1lLCBsZW5ndGgsIGV4YWN0LCB2YXJfbGVuLCB3cml0ZV9tZXRob2QpOwogICAgaWYgKGludGVyZmFjZSA9PSBNQVRDSF9GQUlMRUQpCiAgICAgICAgcmV0dXJuIE5VTEw7CgogICAgaWYgKEludGVyZmFjZV9TY2FuX0J5X0luZGV4KGludGVyZmFjZSwgJmlmX21zZywgaWZfbmFtZSwgTlVMTCkgIT0gMCkKICAgICAgICByZXR1cm4gTlVMTDsKICAgIGlmX3B0ciA9IG5ldHNubXBfYWNjZXNzX2ludGVyZmFjZV9lbnRyeV9vdmVycmlkZXNfZ2V0KGlmX25hbWUpOwoKICAgIHN3aXRjaCAodnAtPm1hZ2ljKSB7CiAgICBjYXNlIE5FVFNOTVBfSUZJTkRFWDoKICAgICAgICBsb25nX3JldHVybiA9IGludGVyZmFjZTsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGREVTQ1I6CiAgICAgICAgY3AgPSBpZl9uYW1lOwogICAgICAgICp2YXJfbGVuID0gc3RybGVuKGlmX25hbWUpOwogICAgICAgIHJldHVybiAodV9jaGFyICopIGNwOwogICAgY2FzZSBORVRTTk1QX0lGVFlQRToKICAgICAgICBpZiAoaWZfcHRyKQogICAgICAgICAgICBsb25nX3JldHVybiA9IGlmX3B0ci0+dHlwZTsKICAgICAgICBlbHNlCiAgICAgICAgbG9uZ19yZXR1cm4gPSAobG9uZykgaWZfbXNnLmlmbV9kYXRhLmlmaV90eXBlOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIE5FVFNOTVBfSUZNVFU6CiAgICAgICAgbG9uZ19yZXR1cm4gPSAobG9uZykgaWZfbXNnLmlmbV9kYXRhLmlmaV9tdHU7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgTkVUU05NUF9JRlNQRUVEOgogICAgICAgIGlmIChpZl9wdHIpCiAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gaWZfcHRyLT5zcGVlZDsKICAgICAgICBlbHNlIHsKI2lmIEhBVkVfU1RSVUNUX0lGTkVUX0lGX0JBVURSQVRFX0lGU19WQUxVRQogICAgICAgIGxvbmdfcmV0dXJuID0gKHVfbG9uZykgaWZfbXNnLmlmbV9kYXRhLmlmaV9iYXVkcmF0ZS5pZnNfdmFsdWUgPDwKICAgICAgICAgICAgaWZfbXNnLmlmbV9kYXRhLmlmaV9iYXVkcmF0ZS5pZnNfbG9nMjsKI2Vsc2UKICAgICAgICBsb25nX3JldHVybiA9ICh1X2xvbmcpIGlmX21zZy5pZm1fZGF0YS5pZmlfYmF1ZHJhdGU7CiNlbmRpZgogICAgICAgIH0KICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGUEhZU0FERFJFU1M6CiAgICAgICAgLyoKICAgICAgICAgKiBYWFggCiAgICAgICAgICovCiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICBjYXNlIE5FVFNOTVBfSUZBRE1JTlNUQVRVUzoKICAgICAgICBsb25nX3JldHVybiA9IGlmX21zZy5pZm1fZmxhZ3MgJiBJRkZfVVAgPyAxIDogMjsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGT1BFUlNUQVRVUzoKICAgICAgICBsb25nX3JldHVybiA9IGlmX21zZy5pZm1fZmxhZ3MgJiBJRkZfUlVOTklORyA/IDEgOiAyOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICAgICAgLyoKICAgICAgICAgKiBpZkxhc3RDaGFuZ2UgCiAgICAgICAgICovCiAgICBjYXNlIE5FVFNOTVBfSUZJTk9DVEVUUzoKICAgICAgICBsb25nX3JldHVybiA9ICh1X2xvbmcpIGlmX21zZy5pZm1fZGF0YS5pZmlfaWJ5dGVzOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIE5FVFNOTVBfSUZJTlVDQVNUUEtUUzoKICAgICAgICBsb25nX3JldHVybiA9CiAgICAgICAgICAgICh1X2xvbmcpIGlmX21zZy5pZm1fZGF0YS5pZmlfaXBhY2tldHMgLQogICAgICAgICAgICBpZl9tc2cuaWZtX2RhdGEuaWZpX2ltY2FzdHM7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgTkVUU05NUF9JRklOTlVDQVNUUEtUUzoKICAgICAgICBsb25nX3JldHVybiA9ICh1X2xvbmcpIGlmX21zZy5pZm1fZGF0YS5pZmlfaW1jYXN0czsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGSU5ESVNDQVJEUzoKICAgICAgICBsb25nX3JldHVybiA9ICh1X2xvbmcpIGlmX21zZy5pZm1fZGF0YS5pZmlfaXFkcm9wczsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGSU5FUlJPUlM6CiAgICAgICAgbG9uZ19yZXR1cm4gPSAodV9sb25nKSBpZl9tc2cuaWZtX2RhdGEuaWZpX2llcnJvcnM7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgTkVUU05NUF9JRklOVU5LTk9XTlBST1RPUzoKICAgICAgICBsb25nX3JldHVybiA9ICh1X2xvbmcpIGlmX21zZy5pZm1fZGF0YS5pZmlfbm9wcm90bzsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGT1VUT0NURVRTOgogICAgICAgIGxvbmdfcmV0dXJuID0gKHVfbG9uZykgaWZfbXNnLmlmbV9kYXRhLmlmaV9vYnl0ZXM7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgTkVUU05NUF9JRk9VVFVDQVNUUEtUUzoKICAgICAgICBsb25nX3JldHVybiA9CiAgICAgICAgICAgICh1X2xvbmcpIGlmX21zZy5pZm1fZGF0YS5pZmlfb3BhY2tldHMgLQogICAgICAgICAgICBpZl9tc2cuaWZtX2RhdGEuaWZpX29tY2FzdHM7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgTkVUU05NUF9JRk9VVE5VQ0FTVFBLVFM6CiAgICAgICAgbG9uZ19yZXR1cm4gPSAodV9sb25nKSBpZl9tc2cuaWZtX2RhdGEuaWZpX29tY2FzdHM7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgTkVUU05NUF9JRk9VVERJU0NBUkRTOgojaWZkZWYgaWZfb2Ryb3BzCiAgICAgICAgbG9uZ19yZXR1cm4gPSAodV9sb25nKSBpZl9tc2cuaWZtX2RhdGEuaWZpX29kcm9wczsKI2Vsc2UKI2lmIE5FVFNOTVBfTk9fRFVNTVlfVkFMVUVTCiAgICAgICAgcmV0dXJuIE5VTEw7CiNlbmRpZgogICAgICAgIGxvbmdfcmV0dXJuID0gMDsKI2VuZGlmCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgTkVUU05NUF9JRk9VVEVSUk9SUzoKICAgICAgICBsb25nX3JldHVybiA9ICh1X2xvbmcpIGlmX21zZy5pZm1fZGF0YS5pZmlfb2Vycm9yczsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGTEFTVENIQU5HRToKI2lmZGVmIGlyaXg2CiAgICAgICAgbG9uZ19yZXR1cm4gPSAwOwojZWxzZQogICAgICAgIGlmIChpZl9tc2cuaWZtX2RhdGEuaWZpX2xhc3RjaGFuZ2UudHZfc2VjID09IDAgJiYKI2lmIFNUUlVDVF9JRk5FVF9IQVNfSUZfTEFTVENIQU5HRV9UVl9OU0VDCiAgICAgICAgICAgIGlmX21zZy5pZm1fZGF0YS5pZmlfbGFzdGNoYW5nZS50dl9uc2VjID09IDAKI2Vsc2UKICAgICAgICAgICAgaWZfbXNnLmlmbV9kYXRhLmlmaV9sYXN0Y2hhbmdlLnR2X3VzZWMgPT0gMAojZW5kaWYKICAgICAgICAgICApCiAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gMDsKICAgICAgICBlbHNlIGlmIChpZl9tc2cuaWZtX2RhdGEuaWZpX2xhc3RjaGFuZ2UudHZfc2VjIDwgc3RhcnR0aW1lLnR2X3NlYykKICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSAwOwogICAgICAgIGVsc2UgewogICAgICAgICAgICBsb25nX3JldHVybiA9ICh1X2xvbmcpCiAgICAgICAgICAgICAgICAoKGlmX21zZy5pZm1fZGF0YS5pZmlfbGFzdGNoYW5nZS50dl9zZWMgLQogICAgICAgICAgICAgICAgICBzdGFydHRpbWUudHZfc2VjKSAqIDEwMCArCiAgICAgICAgICAgICAgICAgKAojaWYgU1RSVUNUX0lGTkVUX0hBU19JRl9MQVNUQ0hBTkdFX1RWX05TRUMKICAgICAgICAgICAgICAgICAgaWZfbXNnLmlmbV9kYXRhLmlmaV9sYXN0Y2hhbmdlLnR2X25zZWMgLyAxMDAwCiNlbHNlCiAgICAgICAgICAgICAgICAgIGlmX21zZy5pZm1fZGF0YS5pZmlfbGFzdGNoYW5nZS50dl91c2VjCiNlbmRpZgogICAgICAgICAgICAgICAgICAtIHN0YXJ0dGltZS50dl91c2VjKSAvIDEwMDAwKTsKICAgICAgICB9CiNlbmRpZgogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBkZWZhdWx0OgogICAgICAgIHJldHVybiAwOwogICAgfQp9CgppbnQKSW50ZXJmYWNlX1NjYW5fTmV4dChzaG9ydCAqSW5kZXgsCiAgICAgICAgICAgICAgICAgICAgY2hhciAqTmFtZSwKICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaWZuZXQgKlJldGlmbmV0LCBzdHJ1Y3QgaW5faWZhZGRyICpSZXRpbl9pZmFkZHIpCnsKICAgIHJldHVybiAwOwp9CgppbnQKSW50ZXJmYWNlX1NjYW5fTmV4dEludChpbnQgKkluZGV4LAogICAgICAgICAgICAgICAgICAgIGNoYXIgKk5hbWUsCiAgICAgICAgICAgICAgICAgICAgc3RydWN0IGlmbmV0ICpSZXRpZm5ldCwgc3RydWN0IGluX2lmYWRkciAqUmV0aW5faWZhZGRyKQp7CiAgICByZXR1cm4gMDsKfQoKI2Vsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBub3QgVVNFX1NZU0NUTF9JRkxJU1QgKi8KCiAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKgoJICoKCSAqICBLZXJuZWwgJiBpbnRlcmZhY2UgaW5mb3JtYXRpb24sCgkgKiAgIGFuZCBpbnRlcm5hbCBmb3J3YXJkIGRlY2xhcmF0aW9ucwoJICoKCSAqKioqKioqKioqKioqKioqKioqKiovCgojaWZuZGVmIEhBVkVfTkVUX0lGX01JQl9ICgojaWZuZGVmIHNvbGFyaXMyCiNpZm5kZWYgaHB1eDExCnN0YXRpYyBpbnQgICAgICBJbnRlcmZhY2VfU2Nhbl9CeV9JbmRleChpbnQsIGNoYXIgKiwgc3RydWN0IGlmbmV0ICosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW5faWZhZGRyICopOwpzdGF0aWMgaW50ICAgICAgSW50ZXJmYWNlX0dldF9FdGhlcl9CeV9JbmRleChpbnQsIHVfY2hhciAqKTsKI2Vsc2UKc3RhdGljIGludCAgICAgIEludGVyZmFjZV9TY2FuX0J5X0luZGV4KGludCwgY2hhciAqLCBubWFwaV9waHlzdGF0ICopOwojZW5kaWYKI2VuZGlmCgoKCiAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKgoJICoKCSAqICBTeXN0ZW0gc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gZnVuY3Rpb25zCgkgKgoJICoqKioqKioqKioqKioqKioqKioqKi8KCgojaWZuZGVmIHNvbGFyaXMyCiNpZm5kZWYgaHB1eAoKdV9jaGFyICAgICAgICAgKgp2YXJfaWZFbnRyeShzdHJ1Y3QgdmFyaWFibGUgKnZwLAogICAgICAgICAgICBvaWQgKiBuYW1lLAogICAgICAgICAgICBzaXplX3QgKiBsZW5ndGgsCiAgICAgICAgICAgIGludCBleGFjdCwgc2l6ZV90ICogdmFyX2xlbiwgV3JpdGVNZXRob2QgKiogd3JpdGVfbWV0aG9kKQp7CiAgICBzdGF0aWMgc3RydWN0IGlmbmV0IGlmbmV0OwogICAgaW50ICAgICAgICAgICAgIGludGVyZmFjZTsKICAgIHN0YXRpYyBzdHJ1Y3QgaW5faWZhZGRyIGluX2lmYWRkcjsKICAgIHN0YXRpYyBjaGFyICAgICBOYW1lWzE2XTsKICAgIGNoYXIgICAgICAgICAgICpjcDsKICAgIGNvbmZfaWZfbGlzdCAgICppZl9wdHI7CiNpZiBIQVZFX1NUUlVDVF9JRk5FVF9JRl9MQVNUQ0hBTkdFX1RWX1NFQwogICAgc3RydWN0IHRpbWV2YWwgIG5vdzsKI2VuZGlmCgogICAgaW50ZXJmYWNlID0KICAgICAgICBoZWFkZXJfaWZFbnRyeSh2cCwgbmFtZSwgbGVuZ3RoLCBleGFjdCwgdmFyX2xlbiwgd3JpdGVfbWV0aG9kKTsKICAgIGlmIChpbnRlcmZhY2UgPT0gTUFUQ0hfRkFJTEVEKQogICAgICAgIHJldHVybiBOVUxMOwoKICAgIEludGVyZmFjZV9TY2FuX0J5X0luZGV4KGludGVyZmFjZSwgTmFtZSwgJmlmbmV0LCAmaW5faWZhZGRyKTsKICAgIGlmX3B0ciA9IG5ldHNubXBfYWNjZXNzX2ludGVyZmFjZV9lbnRyeV9vdmVycmlkZXNfZ2V0KE5hbWUpOwoKICAgIHN3aXRjaCAodnAtPm1hZ2ljKSB7CiAgICBjYXNlIE5FVFNOTVBfSUZJTkRFWDoKICAgICAgICBsb25nX3JldHVybiA9IGludGVyZmFjZTsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGREVTQ1I6CiAgICAgICAgY3AgPSBOYW1lOwogICAgICAgICp2YXJfbGVuID0gc3RybGVuKGNwKTsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSBjcDsKICAgIGNhc2UgTkVUU05NUF9JRlRZUEU6CiAgICAgICAgaWYgKGlmX3B0cikKICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSBpZl9wdHItPnR5cGU7CiAgICAgICAgZWxzZSB7CiNpZiBIQVZFX1NUUlVDVF9JRk5FVF9JRl9UWVBFCiAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gaWZuZXQuaWZfdHlwZTsKI2Vsc2UKICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSAxOyAgICAvKiBPVEhFUiAqLwojZW5kaWYKICAgICAgICB9CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgTkVUU05NUF9JRk1UVTp7CiAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gKGxvbmcpIGlmbmV0LmlmX210dTsKICAgICAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgICAgICB9CiAgICBjYXNlIE5FVFNOTVBfSUZTUEVFRDoKICAgICAgICBpZiAoaWZfcHRyKQogICAgICAgICAgICBsb25nX3JldHVybiA9IGlmX3B0ci0+c3BlZWQ7CiAgICAgICAgZWxzZSB7CiNpZiBIQVZFX1NUUlVDVF9JRk5FVF9JRl9CQVVEUkFURQogICAgICAgICAgICBsb25nX3JldHVybiA9IGlmbmV0LmlmX2JhdWRyYXRlOwojZWxpZiBIQVZFX1NUUlVDVF9JRk5FVF9JRl9TUEVFRAogICAgICAgICAgICBsb25nX3JldHVybiA9IGlmbmV0LmlmX3NwZWVkOwojZWxpZiBIQVZFX1NUUlVDVF9JRk5FVF9JRl9UWVBFICYmIGRlZmluZWQoSUZUX0VUSEVSKQogICAgICAgICAgICBpZiAoaWZuZXQuaWZfdHlwZSA9PSBJRlRfRVRIRVIpCiAgICAgICAgICAgICAgICBsb25nX3JldHVybiA9IDEwMDAwMDAwOwogICAgICAgICAgICBpZiAoaWZuZXQuaWZfdHlwZSA9PSBJRlRfUDEwKQogICAgICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSAxMDAwMDAwMDsKICAgICAgICAgICAgaWYgKGlmbmV0LmlmX3R5cGUgPT0gSUZUX1A4MCkKICAgICAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gODAwMDAwMDA7CiAgICAgICAgICAgIGlmIChpZm5ldC5pZl90eXBlID09IElGVF9JU0ROQkFTSUMpCiAgICAgICAgICAgICAgICBsb25nX3JldHVybiA9IDY0MDAwOyAgICAvKiBFRFNTMSBvbmx5ICovCiAgICAgICAgICAgIGlmIChpZm5ldC5pZl90eXBlID09IElGVF9JU0ROUFJJTUFSWSkKICAgICAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gNjQwMDAgKiAzMDsKI2Vsc2UKI2lmIE5FVFNOTVBfTk9fRFVNTVlfVkFMVUVTCiAgICAgICAgICAgIHJldHVybiBOVUxMOwojZW5kaWYKICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSAodV9sb25nKSAxMDAwMDAwMDsKI2VuZGlmCiAgICAgICAgfQogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIE5FVFNOTVBfSUZQSFlTQUREUkVTUzoKICAgICAgICBJbnRlcmZhY2VfR2V0X0V0aGVyX0J5X0luZGV4KGludGVyZmFjZSwgcmV0dXJuX2J1Zik7CiNpZiBkZWZpbmVkKGFpeDQpIHx8IGRlZmluZWQoYWl4NSkgfHwgZGVmaW5lZChhaXg2KSB8fCBkZWZpbmVkKGFpeDcpCgkqdmFyX2xlbiA9IDA7CiNlbHNlCiAgICAgICAgaWYgKChyZXR1cm5fYnVmWzBdID09IDApICYmIChyZXR1cm5fYnVmWzFdID09IDApICYmCiAgICAgICAgICAgIChyZXR1cm5fYnVmWzJdID09IDApICYmIChyZXR1cm5fYnVmWzNdID09IDApICYmCiAgICAgICAgICAgIChyZXR1cm5fYnVmWzRdID09IDApICYmIChyZXR1cm5fYnVmWzVdID09IDApKQogICAgICAgICAgICAqdmFyX2xlbiA9IDA7CiAgICAgICAgZWxzZQogICAgICAgICAgICAqdmFyX2xlbiA9IDY7CiNlbmRpZgogICAgICAgIHJldHVybiAodV9jaGFyICopIHJldHVybl9idWY7CiAgICBjYXNlIE5FVFNOTVBfSUZBRE1JTlNUQVRVUzoKICAgICAgICBsb25nX3JldHVybiA9IGlmbmV0LmlmX2ZsYWdzICYgSUZGX1VQID8gMSA6IDI7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgTkVUU05NUF9JRk9QRVJTVEFUVVM6CiAgICAgICAgbG9uZ19yZXR1cm4gPSBpZm5ldC5pZl9mbGFncyAmIElGRl9SVU5OSU5HID8gMSA6IDI7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgTkVUU05NUF9JRkxBU1RDSEFOR0U6CiNpZiBkZWZpbmVkKEhBVkVfU1RSVUNUX0lGTkVUX0lGX0xBU1RDSEFOR0VfVFZfU0VDKSAmJiAhKGRlZmluZWQoZnJlZWJzZDIpICYmIF9fRnJlZUJTRF92ZXJzaW9uIDwgMTk5NjA3KQogICAgICAgIC8qCiAgICAgICAgICogWFhYIC0gU05NUCdzIGlmTGFzdGNoYW5nZSBpcyB0aW1lIHdoZW4gb3AuIHN0YXR1cyBjaGFuZ2VkCiAgICAgICAgICogKiBGcmVlQlNEJ3MgaWZfbGFzdGNoYW5nZSBpcyB0aW1lIHdoZW4gcGFja2V0IHdhcyBpbnB1dCBvciBvdXRwdXQKICAgICAgICAgKiAqIChhdCBsZWFzdCBpbiAyLjEuMC1SRUxFQVNFLiBDaGFuZ2VkIGluIGxhdGVyIHZlcnNpb25zIG9mIHRoZSBrZXJuZWw/KQogICAgICAgICAqLwogICAgICAgIC8qCiAgICAgICAgICogRnJlZUJTRCdzIGlmX2xhc3RjaGFuZ2UgYmVmb3JlIHRoZSAyLjEuNSByZWxlYXNlIGlzIHRoZSB0aW1lIHdoZW4KICAgICAgICAgKiAqIGEgcGFja2V0IHdhcyBsYXN0IGlucHV0IG9yIG91dHB1dC4gIEluIHRoZSAyLjEuNSBhbmQgbGF0ZXIgcmVsZWFzZXMsCiAgICAgICAgICogKiB0aGlzIGlzIGZpeGVkLCB0aHVzIHRoZSAxOTk2MDcgY29tcGFyaXNvbi4KICAgICAgICAgKi8KICAgICAgICBpZiAoaWZuZXQuaWZfbGFzdGNoYW5nZS50dl9zZWMgPT0gMCAmJgogICAgICAgICAgICBpZm5ldC5pZl9sYXN0Y2hhbmdlLnR2X3VzZWMgPT0gMCkKICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSAwOwogICAgICAgIGVsc2UgaWYgKGlmbmV0LmlmX2xhc3RjaGFuZ2UudHZfc2VjIDwgc3RhcnR0aW1lLnR2X3NlYykKICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSAwOwogICAgICAgIGVsc2UgewogICAgICAgICAgICBsb25nX3JldHVybiA9ICh1X2xvbmcpCiAgICAgICAgICAgICAgICAoKGlmbmV0LmlmX2xhc3RjaGFuZ2UudHZfc2VjIC0gc3RhcnR0aW1lLnR2X3NlYykgKiAxMDAKICAgICAgICAgICAgICAgICArIChpZm5ldC5pZl9sYXN0Y2hhbmdlLnR2X3VzZWMgLQogICAgICAgICAgICAgICAgICAgIHN0YXJ0dGltZS50dl91c2VjKSAvIDEwMDAwKTsKICAgICAgICB9CiNlbHNlCiNpZiBORVRTTk1QX05PX0RVTU1ZX1ZBTFVFUwogICAgICAgIHJldHVybiBOVUxMOwojZW5kaWYKICAgICAgICBsb25nX3JldHVybiA9IDA7ICAgICAgICAvKiBYWFggKi8KI2VuZGlmCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgTkVUU05NUF9JRklOT0NURVRTOgojaWZkZWYgSEFWRV9TVFJVQ1RfSUZORVRfSUZfSUJZVEVTCiNpZiBkZWZpbmVkKGFpeDQpIHx8IGRlZmluZWQoYWl4NSkgfHwgZGVmaW5lZChhaXg2KSB8fCBkZWZpbmVkKGFpeDcpCiAgICAgICAgbG9uZ19yZXR1cm4gPSAodV9sb25nKSBpZm5ldC5pZl9pYnl0ZXMgJiAweGZmZmZmZmZmOwojZWxzZQogICAgICAgIGxvbmdfcmV0dXJuID0gKHVfbG9uZykgaWZuZXQuaWZfaWJ5dGVzOwojZW5kaWYKI2Vsc2UKI2lmIE5FVFNOTVBfTk9fRFVNTVlfVkFMVUVTCiAgICAgICAgcmV0dXJuIE5VTEw7CiNlbmRpZgogICAgICAgIGxvbmdfcmV0dXJuID0gKHVfbG9uZykgaWZuZXQuaWZfaXBhY2tldHMgKiAzMDg7IC8qIFhYWCAqLwojZW5kaWYKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGSU5VQ0FTVFBLVFM6CiAgICAgICAgewojaWYgZGVmaW5lZChhaXg0KSB8fCBkZWZpbmVkKGFpeDUpIHx8IGRlZmluZWQoYWl4NikgfHwgZGVmaW5lZChhaXg3KQogICAgICAgICAgICBsb25nX3JldHVybiA9ICh1X2xvbmcpIGlmbmV0LmlmX2lwYWNrZXRzICYgMHhmZmZmZmZmZjsKI2Vsc2UKICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSAodV9sb25nKSBpZm5ldC5pZl9pcGFja2V0czsKI2VuZGlmCiNpZiBIQVZFX1NUUlVDVF9JRk5FVF9JRl9JTUNBU1RTCiNpZiBkZWZpbmVkKGFpeDQpIHx8IGRlZmluZWQoYWl4NSkgfHwgZGVmaW5lZChhaXg2KSB8fCBkZWZpbmVkKGFpeDcpCiAgICAgICAgICAgIGxvbmdfcmV0dXJuIC09ICh1X2xvbmcpIGlmbmV0LmlmX2ltY2FzdHMgJiAweGZmZmZmZmZmOwojZWxzZQogICAgICAgICAgICBsb25nX3JldHVybiAtPSAodV9sb25nKSBpZm5ldC5pZl9pbWNhc3RzOwojZW5kaWYKI2VuZGlmCiAgICAgICAgfQogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIE5FVFNOTVBfSUZJTk5VQ0FTVFBLVFM6CiNpZiBIQVZFX1NUUlVDVF9JRk5FVF9JRl9JTUNBU1RTCiNpZiBkZWZpbmVkKGFpeDQpIHx8IGRlZmluZWQoYWl4NSkgfHwgZGVmaW5lZChhaXg2KSB8fCBkZWZpbmVkKGFpeDcpCiAgICAgICAgbG9uZ19yZXR1cm4gPSAodV9sb25nKSBpZm5ldC5pZl9pbWNhc3RzICYgMHhmZmZmZmZmZjsKI2Vsc2UKICAgICAgICBsb25nX3JldHVybiA9ICh1X2xvbmcpIGlmbmV0LmlmX2ltY2FzdHM7CiNlbmRpZgojZWxzZQojaWYgTkVUU05NUF9OT19EVU1NWV9WQUxVRVMKICAgICAgICByZXR1cm4gTlVMTDsKI2VuZGlmCiAgICAgICAgbG9uZ19yZXR1cm4gPSAodV9sb25nKSAwOyAgICAgICAvKiBYWFggKi8KI2VuZGlmCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgTkVUU05NUF9JRklORElTQ0FSRFM6CiNpZiBIQVZFX1NUUlVDVF9JRk5FVF9JRl9JUURST1BTCiNpZiBkZWZpbmVkKGFpeDQpIHx8IGRlZmluZWQoYWl4NSkgfHwgZGVmaW5lZChhaXg2KSB8fCBkZWZpbmVkKGFpeDcpCiAgICAgICAgbG9uZ19yZXR1cm4gPSAodV9sb25nKSBpZm5ldC5pZl9pcWRyb3BzICYgMHhmZmZmZmZmZjsKI2Vsc2UKICAgICAgICBsb25nX3JldHVybiA9ICh1X2xvbmcpIGlmbmV0LmlmX2lxZHJvcHM7CiNlbmRpZgojZWxzZQojaWYgTkVUU05NUF9OT19EVU1NWV9WQUxVRVMKICAgICAgICByZXR1cm4gTlVMTDsKI2VuZGlmCiAgICAgICAgbG9uZ19yZXR1cm4gPSAodV9sb25nKSAwOyAgICAgICAvKiBYWFggKi8KI2VuZGlmCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgTkVUU05NUF9JRklORVJST1JTOgojaWYgZGVmaW5lZChhaXg0KSB8fCBkZWZpbmVkKGFpeDUpIHx8IGRlZmluZWQoYWl4NikgfHwgZGVmaW5lZChhaXg3KQogICAgICAgIGxvbmdfcmV0dXJuID0gKHVfbG9uZykgaWZuZXQuaWZfaWVycm9ycyAmIDB4ZmZmZmZmZmY7CiNlbHNlCiAgICAgICAgbG9uZ19yZXR1cm4gPSAodV9sb25nKSBpZm5ldC5pZl9pZXJyb3JzOwojZW5kaWYKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGSU5VTktOT1dOUFJPVE9TOgojaWYgSEFWRV9TVFJVQ1RfSUZORVRfSUZfTk9QUk9UTwojaWYgZGVmaW5lZChhaXg0KSB8fCBkZWZpbmVkKGFpeDUpIHx8IGRlZmluZWQoYWl4NikgfHwgZGVmaW5lZChhaXg3KQogICAgICAgIGxvbmdfcmV0dXJuID0gKHVfbG9uZykgaWZuZXQuaWZfbm9wcm90byAmIDB4ZmZmZmZmZmY7CiNlbHNlCiAgICAgICAgbG9uZ19yZXR1cm4gPSAodV9sb25nKSBpZm5ldC5pZl9ub3Byb3RvOwojZW5kaWYKI2Vsc2UKI2lmIE5FVFNOTVBfTk9fRFVNTVlfVkFMVUVTCiAgICAgICAgcmV0dXJuIE5VTEw7CiNlbmRpZgogICAgICAgIGxvbmdfcmV0dXJuID0gKHVfbG9uZykgMDsgICAgICAgLyogWFhYICovCiNlbmRpZgogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIE5FVFNOTVBfSUZPVVRPQ1RFVFM6CiNpZmRlZiBIQVZFX1NUUlVDVF9JRk5FVF9JRl9PQllURVMKI2lmIGRlZmluZWQoYWl4NCkgfHwgZGVmaW5lZChhaXg1KSB8fCBkZWZpbmVkKGFpeDYpIHx8IGRlZmluZWQoYWl4NykKICAgICAgICBsb25nX3JldHVybiA9ICh1X2xvbmcpIGlmbmV0LmlmX29ieXRlcyAmIDB4ZmZmZmZmZmY7CiNlbHNlCiAgICAgICAgbG9uZ19yZXR1cm4gPSAodV9sb25nKSBpZm5ldC5pZl9vYnl0ZXM7CiNlbmRpZgojZWxzZQojaWYgTkVUU05NUF9OT19EVU1NWV9WQUxVRVMKICAgICAgICByZXR1cm4gTlVMTDsKI2VuZGlmCiAgICAgICAgbG9uZ19yZXR1cm4gPSAodV9sb25nKSBpZm5ldC5pZl9vcGFja2V0cyAqIDMwODsgLyogWFhYICovCiNlbmRpZgogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIE5FVFNOTVBfSUZPVVRVQ0FTVFBLVFM6CiAgICAgICAgewojaWYgZGVmaW5lZChhaXg0KSB8fCBkZWZpbmVkKGFpeDUpIHx8IGRlZmluZWQoYWl4NikgfHwgZGVmaW5lZChhaXg3KQogICAgICAgICAgICBsb25nX3JldHVybiA9ICh1X2xvbmcpIGlmbmV0LmlmX29wYWNrZXRzICYgMHhmZmZmZmZmZjsKI2Vsc2UKICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSAodV9sb25nKSBpZm5ldC5pZl9vcGFja2V0czsKI2VuZGlmCiNpZiBIQVZFX1NUUlVDVF9JRk5FVF9JRl9PTUNBU1RTCiNpZiBkZWZpbmVkKGFpeDQpIHx8IGRlZmluZWQoYWl4NSkgfHwgZGVmaW5lZChhaXg2KSB8fCBkZWZpbmVkKGFpeDcpCiAgICAgICAgICAgIGxvbmdfcmV0dXJuIC09ICh1X2xvbmcpIGlmbmV0LmlmX29tY2FzdHMgJiAweGZmZmZmZmZmOwojZWxzZQogICAgICAgICAgICBsb25nX3JldHVybiAtPSAodV9sb25nKSBpZm5ldC5pZl9vbWNhc3RzOwojZW5kaWYKI2VuZGlmCiAgICAgICAgfQogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIE5FVFNOTVBfSUZPVVROVUNBU1RQS1RTOgojaWYgSEFWRV9TVFJVQ1RfSUZORVRfSUZfT01DQVNUUwojaWYgZGVmaW5lZChhaXg0KSB8fCBkZWZpbmVkKGFpeDUpIHx8IGRlZmluZWQoYWl4NikgfHwgZGVmaW5lZChhaXg3KQogICAgICAgIGxvbmdfcmV0dXJuID0gKHVfbG9uZykgaWZuZXQuaWZfb21jYXN0cyAmIDB4ZmZmZmZmZmY7CiNlbHNlCiAgICAgICAgbG9uZ19yZXR1cm4gPSAodV9sb25nKSBpZm5ldC5pZl9vbWNhc3RzOwojZW5kaWYKI2Vsc2UKI2lmIE5FVFNOTVBfTk9fRFVNTVlfVkFMVUVTCiAgICAgICAgcmV0dXJuIE5VTEw7CiNlbmRpZgogICAgICAgIGxvbmdfcmV0dXJuID0gKHVfbG9uZykgMDsgICAgICAgLyogWFhYICovCiNlbmRpZgogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIE5FVFNOTVBfSUZPVVRESVNDQVJEUzoKI2lmIGRlZmluZWQoYWl4NCkgfHwgZGVmaW5lZChhaXg1KSB8fCBkZWZpbmVkKGFpeDYpIHx8IGRlZmluZWQoYWl4NykKICAgICAgICBsb25nX3JldHVybiA9IGlmbmV0LmlmX3NuZC5pZnFfZHJvcHMgJiAweGZmZmZmZmZmOwojZWxzZQogICAgICAgIGxvbmdfcmV0dXJuID0gaWZuZXQuaWZfc25kLmlmcV9kcm9wczsKI2VuZGlmCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgTkVUU05NUF9JRk9VVEVSUk9SUzoKI2lmIGRlZmluZWQoYWl4NCkgfHwgZGVmaW5lZChhaXg1KSB8fCBkZWZpbmVkKGFpeDYpIHx8IGRlZmluZWQoYWl4NykKICAgICAgICBsb25nX3JldHVybiA9IGlmbmV0LmlmX29lcnJvcnMgJiAweGZmZmZmZmZmOwojZWxzZQogICAgICAgIGxvbmdfcmV0dXJuID0gaWZuZXQuaWZfb2Vycm9yczsKI2VuZGlmCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgTkVUU05NUF9JRk9VVFFMRU46CiNpZiBkZWZpbmVkKGFpeDQpIHx8IGRlZmluZWQoYWl4NSkgfHwgZGVmaW5lZChhaXg2KSB8fCBkZWZpbmVkKGFpeDcpCiAgICAgICAgbG9uZ19yZXR1cm4gPSBpZm5ldC5pZl9zbmQuaWZxX2xlbiAmIDB4ZmZmZmZmZmY7CiNlbHNlCiAgICAgICAgbG9uZ19yZXR1cm4gPSBpZm5ldC5pZl9zbmQuaWZxX2xlbjsKI2VuZGlmCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgTkVUU05NUF9JRlNQRUNJRklDOgogICAgICAgICp2YXJfbGVuID0gbnVsbE9pZExlbjsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSBudWxsT2lkOwogICAgZGVmYXVsdDoKICAgICAgICBERUJVR01TR1RMKCgic25tcGQiLCAidW5rbm93biBzdWItaWQgJWQgaW4gdmFyX2lmRW50cnlcbiIsCiAgICAgICAgICAgICAgICAgICAgdnAtPm1hZ2ljKSk7CiAgICB9CiAgICByZXR1cm4gTlVMTDsKfQoKI2Vsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBocHV4ICovCgp1X2NoYXIgICAgICAgICAqCnZhcl9pZkVudHJ5KHN0cnVjdCB2YXJpYWJsZSAqdnAsCiAgICAgICAgICAgIG9pZCAqIG5hbWUsCiAgICAgICAgICAgIHNpemVfdCAqIGxlbmd0aCwKICAgICAgICAgICAgaW50IGV4YWN0LCBzaXplX3QgKiB2YXJfbGVuLCBXcml0ZU1ldGhvZCAqKiB3cml0ZV9tZXRob2QpCnsKI2lmIGRlZmluZWQoaHB1eDExKQogICAgc3RhdGljIG5tYXBpX3BoeXN0YXQgaWZuZXQ7CiNlbHNlCiAgICBzdGF0aWMgc3RydWN0IGlmbmV0IGlmbmV0OwojZW5kaWYKICAgIHJlZ2lzdGVyIGludCAgICBpbnRlcmZhY2U7CiNpZiAhZGVmaW5lZChocHV4MTEpCiAgICBzdGF0aWMgc3RydWN0IGluX2lmYWRkciBpbl9pZmFkZHJWYXI7CiNlbmRpZgojaWYgZGVmaW5lZChocHV4MTEpCiAgICBzdGF0aWMgY2hhciAgICAgTmFtZVtNQVhfUEhZU0FERFJfTEVOXTsKI2Vsc2UKICAgIHN0YXRpYyBjaGFyICAgICBOYW1lWzE2XTsKI2VuZGlmCiAgICByZWdpc3RlciBjaGFyICAqY3A7CiNpZiBIQVZFX1NUUlVDVF9JRk5FVF9JRl9MQVNUQ0hBTkdFX1RWX1NFQwogICAgc3RydWN0IHRpbWV2YWwgIG5vdzsKI2VuZGlmCiNpZiAhZGVmaW5lZChocHV4MTEpCiAgICBzdHJ1Y3Qgbm1wYXJtcyAgaHBfbm1wYXJtczsKICAgIHN0YXRpYyBtaWJfaWZFbnRyeSBocF9pZkVudHJ5OwogICAgaW50ICAgICAgICAgICAgIGhwX2ZkOwogICAgaW50ICAgICAgICAgICAgIGhwX2xlbiA9IHNpemVvZihocF9pZkVudHJ5KTsKI2VuZGlmCiAgICBjb25mX2lmX2xpc3QgICAqaWZfcHRyOwoKICAgIGludGVyZmFjZSA9CiAgICAgICAgaGVhZGVyX2lmRW50cnkodnAsIG5hbWUsIGxlbmd0aCwgZXhhY3QsIHZhcl9sZW4sIHdyaXRlX21ldGhvZCk7CiAgICBpZiAoaW50ZXJmYWNlID09IE1BVENIX0ZBSUxFRCkKICAgICAgICByZXR1cm4gTlVMTDsKCiNpZiBkZWZpbmVkKGhwdXgxMSkKICAgIEludGVyZmFjZV9TY2FuX0J5X0luZGV4KGludGVyZmFjZSwgTmFtZSwgJmlmbmV0KTsKI2Vsc2UKICAgIEludGVyZmFjZV9TY2FuX0J5X0luZGV4KGludGVyZmFjZSwgTmFtZSwgJmlmbmV0LCAmaW5faWZhZGRyVmFyKTsKI2VuZGlmCgojaWYgIWRlZmluZWQoaHB1eDExKQogICAgLyoKICAgICAqIEFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGludGVyZmFjZXMgaXMgYXZhaWxhYmxlIHVuZGVyCiAgICAgKiBIUC1VWCB0aHJvdWdoIHRoZSBuZXR3b3JrIG1hbmFnZW1lbnQgaW50ZXJmYWNlICcvZGV2L25ldG1hbicKICAgICAqLwogICAgaHBfaWZFbnRyeS5pZkluZGV4ID0gaW50ZXJmYWNlOwogICAgaHBfbm1wYXJtcy5vYmppZCA9IElEX2lmRW50cnk7CiAgICBocF9ubXBhcm1zLmJ1ZmZlciA9IChjaGFyICopICZocF9pZkVudHJ5OwogICAgaHBfbm1wYXJtcy5sZW4gPSAmaHBfbGVuOwogICAgaWYgKChocF9mZCA9IG9wZW4oIi9kZXYvbmV0bWFuIiwgT19SRE9OTFkpKSAhPSAtMSkgewogICAgICAgIGlmIChpb2N0bChocF9mZCwgTk1JT0dFVCwgJmhwX25tcGFybXMpICE9IC0xKSB7CiAgICAgICAgICAgIGNsb3NlKGhwX2ZkKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjbG9zZShocF9mZCk7CiAgICAgICAgICAgIGhwX2ZkID0gLTE7ICAgICAgICAgLyogZmFpbGVkICovCiAgICAgICAgfQogICAgfQojZW5kaWYKICAgIGlmX3B0ciA9IG5ldHNubXBfYWNjZXNzX2ludGVyZmFjZV9lbnRyeV9vdmVycmlkZXNfZ2V0KE5hbWUpOwoKICAgIHN3aXRjaCAodnAtPm1hZ2ljKSB7CiAgICBjYXNlIE5FVFNOTVBfSUZJTkRFWDoKICAgICAgICBsb25nX3JldHVybiA9IGludGVyZmFjZTsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGREVTQ1I6CiNpZiBkZWZpbmVkKGhwdXgxMSkKICAgICAgICBjcCA9IGlmbmV0LmlmX2VudHJ5LmlmRGVzY3I7CiNlbHNlCiAgICAgICAgaWYgKGhwX2ZkICE9IC0xKQogICAgICAgICAgICBjcCA9IGhwX2lmRW50cnkuaWZEZXNjcjsKICAgICAgICBlbHNlCiAgICAgICAgICAgIGNwID0gTmFtZTsKI2VuZGlmCiAgICAgICAgKnZhcl9sZW4gPSBzdHJsZW4oY3ApOwogICAgICAgIHJldHVybiAodV9jaGFyICopIGNwOwogICAgY2FzZSBORVRTTk1QX0lGVFlQRToKICAgICAgICBpZiAoaWZfcHRyKQogICAgICAgICAgICBsb25nX3JldHVybiA9IGlmX3B0ci0+dHlwZTsKICAgICAgICBlbHNlIHsKI2lmIGRlZmluZWQoaHB1eDExKQogICAgICAgIGxvbmdfcmV0dXJuID0gaWZuZXQuaWZfZW50cnkuaWZUeXBlOwojZWxzZQogICAgICAgIGlmIChocF9mZCAhPSAtMSkKICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSBocF9pZkVudHJ5LmlmVHlwZTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gMTsgICAgLyogT1RIRVIgKi8KI2VuZGlmCiAgICAgICAgfQogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIE5FVFNOTVBfSUZNVFU6ewojaWYgZGVmaW5lZChocHV4MTEpCiAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gKGxvbmcpIGlmbmV0LmlmX2VudHJ5LmlmTXR1OwojZWxzZQogICAgICAgICAgICBsb25nX3JldHVybiA9IChsb25nKSBpZm5ldC5pZl9tdHU7CiNlbmRpZgogICAgICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgICAgIH0KICAgIGNhc2UgTkVUU05NUF9JRlNQRUVEOgogICAgICAgIGlmIChpZl9wdHIpCiAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gaWZfcHRyLT5zcGVlZDsKICAgICAgICBlbHNlIHsKI2lmIGRlZmluZWQoaHB1eDExKQogICAgICAgIGxvbmdfcmV0dXJuID0gaWZuZXQuaWZfZW50cnkuaWZTcGVlZDsKI2Vsc2UKICAgICAgICBpZiAoaHBfZmQgIT0gLTEpCiAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gaHBfaWZFbnRyeS5pZlNwZWVkOwogICAgICAgIGVsc2UKICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSAodV9sb25nKSAxOyAgIC8qIE9USEVSICovCiNlbmRpZgogICAgICAgIH0KICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGUEhZU0FERFJFU1M6CiNpZiBkZWZpbmVkKGhwdXgxMSkKICAgICAgICAqdmFyX2xlbiA9IGlmbmV0LmlmX2VudHJ5LmlmUGh5c0FkZHJlc3Mub19sZW5ndGg7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgaWZuZXQuaWZfZW50cnkuaWZQaHlzQWRkcmVzcy5vX2J5dGVzOwojZWxzZQogICAgICAgIEludGVyZmFjZV9HZXRfRXRoZXJfQnlfSW5kZXgoaW50ZXJmYWNlLCByZXR1cm5fYnVmKTsKICAgICAgICBpZiAoKHJldHVybl9idWZbMF0gPT0gMCkgJiYgKHJldHVybl9idWZbMV0gPT0gMCkgJiYKICAgICAgICAgICAgKHJldHVybl9idWZbMl0gPT0gMCkgJiYgKHJldHVybl9idWZbM10gPT0gMCkgJiYKICAgICAgICAgICAgKHJldHVybl9idWZbNF0gPT0gMCkgJiYgKHJldHVybl9idWZbNV0gPT0gMCkpCiAgICAgICAgICAgICp2YXJfbGVuID0gMDsKICAgICAgICBlbHNlCiAgICAgICAgICAgICp2YXJfbGVuID0gNjsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSByZXR1cm5fYnVmOwojZW5kaWYKICAgIGNhc2UgTkVUU05NUF9JRkFETUlOU1RBVFVTOgojaWYgZGVmaW5lZChocHV4MTEpCiAgICAgICAgbG9uZ19yZXR1cm4gPSBpZm5ldC5pZl9lbnRyeS5pZkFkbWluOwojZWxzZQogICAgICAgIGxvbmdfcmV0dXJuID0gaWZuZXQuaWZfZmxhZ3MgJiBJRkZfVVAgPyAxIDogMjsKI2VuZGlmCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgTkVUU05NUF9JRk9QRVJTVEFUVVM6CiNpZiBkZWZpbmVkKGhwdXgxMSkKICAgICAgICBsb25nX3JldHVybiA9IGlmbmV0LmlmX2VudHJ5LmlmT3BlcjsKI2Vsc2UKICAgICAgICBsb25nX3JldHVybiA9IGlmbmV0LmlmX2ZsYWdzICYgSUZGX1JVTk5JTkcgPyAxIDogMjsKI2VuZGlmCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgTkVUU05NUF9JRkxBU1RDSEFOR0U6CiNpZiBkZWZpbmVkKGhwdXgxMSkKICAgICAgICBsb25nX3JldHVybiA9IGlmbmV0LmlmX2VudHJ5LmlmTGFzdENoYW5nZTsKI2Vsc2UKICAgICAgICBpZiAoaHBfZmQgIT0gLTEpCiAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gaHBfaWZFbnRyeS5pZkxhc3RDaGFuZ2U7CiAgICAgICAgZWxzZQogICAgICAgICAgICBsb25nX3JldHVybiA9IDA7ICAgIC8qIFhYWCAqLwojZW5kaWYKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGSU5PQ1RFVFM6CiNpZiBkZWZpbmVkKGhwdXgxMSkKICAgICAgICBsb25nX3JldHVybiA9IGlmbmV0LmlmX2VudHJ5LmlmSW5PY3RldHM7CiNlbHNlCiAgICAgICAgaWYgKGhwX2ZkICE9IC0xKQogICAgICAgICAgICBsb25nX3JldHVybiA9IGhwX2lmRW50cnkuaWZJbk9jdGV0czsKICAgICAgICBlbHNlCiAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gKHVfbG9uZykgaWZuZXQuaWZfaXBhY2tldHMgKiAzMDg7ICAgICAvKiBYWFggKi8KI2VuZGlmCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgTkVUU05NUF9JRklOVUNBU1RQS1RTOgojaWYgZGVmaW5lZChocHV4MTEpCiAgICAgICAgbG9uZ19yZXR1cm4gPSBpZm5ldC5pZl9lbnRyeS5pZkluVWNhc3RQa3RzOwojZWxzZQogICAgICAgIGlmIChocF9mZCAhPSAtMSkKICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSBocF9pZkVudHJ5LmlmSW5VY2FzdFBrdHM7CiAgICAgICAgZWxzZQogICAgICAgICAgICBsb25nX3JldHVybiA9ICh1X2xvbmcpIGlmbmV0LmlmX2lwYWNrZXRzOwojZW5kaWYKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGSU5OVUNBU1RQS1RTOgojaWYgZGVmaW5lZChocHV4MTEpCiAgICAgICAgbG9uZ19yZXR1cm4gPSBpZm5ldC5pZl9lbnRyeS5pZkluTlVjYXN0UGt0czsKI2Vsc2UKICAgICAgICBpZiAoaHBfZmQgIT0gLTEpCiAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gaHBfaWZFbnRyeS5pZkluTlVjYXN0UGt0czsKICAgICAgICBlbHNlCiAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gKHVfbG9uZykgMDsgICAvKiBYWFggKi8KI2VuZGlmCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgTkVUU05NUF9JRklORElTQ0FSRFM6CiNpZiBkZWZpbmVkKGhwdXgxMSkKICAgICAgICBsb25nX3JldHVybiA9IGlmbmV0LmlmX2VudHJ5LmlmSW5EaXNjYXJkczsKI2Vsc2UKICAgICAgICBpZiAoaHBfZmQgIT0gLTEpCiAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gaHBfaWZFbnRyeS5pZkluRGlzY2FyZHM7CiAgICAgICAgZWxzZQogICAgICAgICAgICBsb25nX3JldHVybiA9ICh1X2xvbmcpIDA7ICAgLyogWFhYICovCiNlbmRpZgogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIE5FVFNOTVBfSUZJTkVSUk9SUzoKI2lmIGRlZmluZWQoaHB1eDExKQogICAgICAgIGxvbmdfcmV0dXJuID0gaWZuZXQuaWZfZW50cnkuaWZJbkVycm9yczsKI2Vsc2UKICAgICAgICBsb25nX3JldHVybiA9IGlmbmV0LmlmX2llcnJvcnM7CiNlbmRpZgogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIE5FVFNOTVBfSUZJTlVOS05PV05QUk9UT1M6CiNpZiBkZWZpbmVkKGhwdXgxMSkKICAgICAgICBsb25nX3JldHVybiA9IGlmbmV0LmlmX2VudHJ5LmlmSW5Vbmtub3duUHJvdG9zOwojZWxzZQogICAgICAgIGlmIChocF9mZCAhPSAtMSkKICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSBocF9pZkVudHJ5LmlmSW5Vbmtub3duUHJvdG9zOwogICAgICAgIGVsc2UKICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSAodV9sb25nKSAwOyAgIC8qIFhYWCAqLwojZW5kaWYKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGT1VUT0NURVRTOgojaWYgZGVmaW5lZChocHV4MTEpCiAgICAgICAgbG9uZ19yZXR1cm4gPSBpZm5ldC5pZl9lbnRyeS5pZk91dE9jdGV0czsKI2Vsc2UKICAgICAgICBpZiAoaHBfZmQgIT0gLTEpCiAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gaHBfaWZFbnRyeS5pZk91dE9jdGV0czsKICAgICAgICBlbHNlCiAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gKHVfbG9uZykgaWZuZXQuaWZfb3BhY2tldHMgKiAzMDg7ICAgICAvKiBYWFggKi8KI2VuZGlmCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgTkVUU05NUF9JRk9VVFVDQVNUUEtUUzoKI2lmIGRlZmluZWQoaHB1eDExKQogICAgICAgIGxvbmdfcmV0dXJuID0gaWZuZXQuaWZfZW50cnkuaWZPdXRVY2FzdFBrdHM7CiNlbHNlCiAgICAgICAgaWYgKGhwX2ZkICE9IC0xKQogICAgICAgICAgICBsb25nX3JldHVybiA9IGhwX2lmRW50cnkuaWZPdXRVY2FzdFBrdHM7CiAgICAgICAgZWxzZQogICAgICAgICAgICBsb25nX3JldHVybiA9ICh1X2xvbmcpIGlmbmV0LmlmX29wYWNrZXRzOwojZW5kaWYKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGT1VUTlVDQVNUUEtUUzoKI2lmIGRlZmluZWQoaHB1eDExKQogICAgICAgIGxvbmdfcmV0dXJuID0gaWZuZXQuaWZfZW50cnkuaWZPdXROVWNhc3RQa3RzOwojZWxzZQogICAgICAgIGlmIChocF9mZCAhPSAtMSkKICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSBocF9pZkVudHJ5LmlmT3V0TlVjYXN0UGt0czsKICAgICAgICBlbHNlCiAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gKHVfbG9uZykgMDsgICAvKiBYWFggKi8KI2VuZGlmCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgTkVUU05NUF9JRk9VVERJU0NBUkRTOgojaWYgZGVmaW5lZChocHV4MTEpCiAgICAgICAgbG9uZ19yZXR1cm4gPSBpZm5ldC5pZl9lbnRyeS5pZk91dERpc2NhcmRzOwojZWxzZQogICAgICAgIGxvbmdfcmV0dXJuID0gaWZuZXQuaWZfc25kLmlmcV9kcm9wczsKI2VuZGlmCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgTkVUU05NUF9JRk9VVEVSUk9SUzoKI2lmIGRlZmluZWQoaHB1eDExKQogICAgICAgIGxvbmdfcmV0dXJuID0gaWZuZXQuaWZfZW50cnkuaWZPdXRFcnJvcnM7CiNlbHNlCiAgICAgICAgbG9uZ19yZXR1cm4gPSBpZm5ldC5pZl9vZXJyb3JzOwojZW5kaWYKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGT1VUUUxFTjoKI2lmIGRlZmluZWQoaHB1eDExKQogICAgICAgIGxvbmdfcmV0dXJuID0gaWZuZXQuaWZfZW50cnkuaWZPdXRRbGVuOwojZWxzZQogICAgICAgIGxvbmdfcmV0dXJuID0gaWZuZXQuaWZfc25kLmlmcV9sZW47CiNlbmRpZgogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIE5FVFNOTVBfSUZTUEVDSUZJQzoKICAgICAgICAqdmFyX2xlbiA9IG51bGxPaWRMZW47CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgbnVsbE9pZDsKICAgIGRlZmF1bHQ6CiAgICAgICAgREVCVUdNU0dUTCgoInNubXBkIiwgInVua25vd24gc3ViLWlkICVkIGluIHZhcl9pZkVudHJ5XG4iLAogICAgICAgICAgICAgICAgICAgIHZwLT5tYWdpYykpOwogICAgfQogICAgcmV0dXJuIE5VTEw7Cn0KCiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaHB1eCAqLwojZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNvbGFyaXMyICovCgpzdGF0aWMgaW50CklGX2NtcCh2b2lkICphZGRyLCB2b2lkICplcCkKewogICAgREVCVUdNU0dUTCgoIm1pYklJL2ludGVyZmFjZXMiLCAiLi4uIElGX2NtcCAlZCAlZFxuIiwKICAgICAgICAgICAgICAgICgobWliMl9pZkVudHJ5X3QgKikgZXApLT5pZkluZGV4LAogICAgICAgICAgICAgICAgKChtaWIyX2lmRW50cnlfdCAqKSBhZGRyKS0+aWZJbmRleCkpOwogICAgaWYgKCgobWliMl9pZkVudHJ5X3QgKikgZXApLT5pZkluZGV4ID09CiAgICAgICAgKChtaWIyX2lmRW50cnlfdCAqKSBhZGRyKS0+aWZJbmRleCkKICAgICAgICByZXR1cm4gKDApOwogICAgZWxzZQogICAgICAgIHJldHVybiAoMSk7Cn0KCnVfY2hhciAgICAgICAgICoKdmFyX2lmRW50cnkoc3RydWN0IHZhcmlhYmxlICogdnAsCiAgICAgICAgICAgIG9pZCAqIG5hbWUsCiAgICAgICAgICAgIHNpemVfdCAqIGxlbmd0aCwKICAgICAgICAgICAgaW50IGV4YWN0LCBzaXplX3QgKiB2YXJfbGVuLCBXcml0ZU1ldGhvZCAqKiB3cml0ZV9tZXRob2QpCnsKICAgIGludCAgICAgICAgICAgICBpbnRlcmZhY2U7CiAgICBtaWIyX2lmRW50cnlfdCAgaWZzdGF0OwogICAgY29uZl9pZl9saXN0ICAgKmlmX3B0ciA9IE5VTEw7CgogICAgaW50ZXJmYWNlID0KICAgICAgICBoZWFkZXJfaWZFbnRyeSh2cCwgbmFtZSwgbGVuZ3RoLCBleGFjdCwgdmFyX2xlbiwgd3JpdGVfbWV0aG9kKTsKICAgIGlmIChpbnRlcmZhY2UgPT0gTUFUQ0hfRkFJTEVEKQogICAgICAgIHJldHVybiBOVUxMOwoKICAgIGlmIChnZXRNaWJzdGF0KE1JQl9JTlRFUkZBQ0VTLCAmaWZzdGF0LCBzaXplb2YobWliMl9pZkVudHJ5X3QpLAogICAgICAgICAgICAgICAgICAgR0VUX0VYQUNULCAmSUZfY21wLCAmaW50ZXJmYWNlKSAhPSAwKSB7CiAgICAgICAgREVCVUdNU0dUTCgoIm1pYklJL2ludGVyZmFjZXMiLCAiLi4uIG5vIG1pYiBzdGF0c1xuIikpOwogICAgICAgIHJldHVybiBOVUxMOwogICAgfQogICAgLyoKICAgICAqIGhtbW0uLiB3aGVyZSB0byBnZXQgdGhlIGludGVyZmFjZSBuYW1lIHRvIGNoZWNrIG92ZXJyaWRlcz8KICAgICAqCiAgICAgKiBpZl9wdHIgPSBuZXRzbm1wX2FjY2Vzc19pbnRlcmZhY2VfZW50cnlfb3ZlcnJpZGVzX2dldChOYW1lKTsKICAgICAqLwogICAgc3dpdGNoICh2cC0+bWFnaWMpIHsKICAgIGNhc2UgTkVUU05NUF9JRklOREVYOgogICAgICAgIGxvbmdfcmV0dXJuID0gaWZzdGF0LmlmSW5kZXg7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgTkVUU05NUF9JRkRFU0NSOgogICAgICAgICp2YXJfbGVuID0gaWZzdGF0LmlmRGVzY3Iub19sZW5ndGg7CiAgICAgICAgKHZvaWQpIG1lbWNweShyZXR1cm5fYnVmLCBpZnN0YXQuaWZEZXNjci5vX2J5dGVzLCAqdmFyX2xlbik7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgcmV0dXJuX2J1ZjsKICAgIGNhc2UgTkVUU05NUF9JRlRZUEU6CiAgICAgICAgaWYgKGlmX3B0cikKICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSBpZl9wdHItPnR5cGU7CiAgICAgICAgZWxzZQogICAgICAgIGxvbmdfcmV0dXJuID0gKHVfbG9uZykgaWZzdGF0LmlmVHlwZTsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGTVRVOgogICAgICAgIGxvbmdfcmV0dXJuID0gKHVfbG9uZykgaWZzdGF0LmlmTXR1OwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIE5FVFNOTVBfSUZTUEVFRDoKICAgICAgICBpZiAoaWZfcHRyKQogICAgICAgICAgICBsb25nX3JldHVybiA9IGlmX3B0ci0+c3BlZWQ7CiAgICAgICAgZWxzZQogICAgICAgIGxvbmdfcmV0dXJuID0gKHVfbG9uZykgaWZzdGF0LmlmU3BlZWQ7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgTkVUU05NUF9JRlBIWVNBRERSRVNTOgogICAgICAgICp2YXJfbGVuID0gaWZzdGF0LmlmUGh5c0FkZHJlc3Mub19sZW5ndGg7CiAgICAgICAgKHZvaWQpIG1lbWNweShyZXR1cm5fYnVmLCBpZnN0YXQuaWZQaHlzQWRkcmVzcy5vX2J5dGVzLCAqdmFyX2xlbik7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgcmV0dXJuX2J1ZjsKICAgIGNhc2UgTkVUU05NUF9JRkFETUlOU1RBVFVTOgogICAgICAgIGxvbmdfcmV0dXJuID0gKHVfbG9uZykgaWZzdGF0LmlmQWRtaW5TdGF0dXM7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgTkVUU05NUF9JRk9QRVJTVEFUVVM6CiAgICAgICAgbG9uZ19yZXR1cm4gPSAodV9sb25nKSBpZnN0YXQuaWZPcGVyU3RhdHVzOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIE5FVFNOTVBfSUZMQVNUQ0hBTkdFOgogICAgICAgIGxvbmdfcmV0dXJuID0gKHVfbG9uZykgaWZzdGF0LmlmTGFzdENoYW5nZTsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGSU5PQ1RFVFM6CiAgICAgICAgbG9uZ19yZXR1cm4gPSAodV9sb25nKSBpZnN0YXQuaWZJbk9jdGV0czsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGSU5VQ0FTVFBLVFM6CiAgICAgICAgbG9uZ19yZXR1cm4gPSAodV9sb25nKSBpZnN0YXQuaWZJblVjYXN0UGt0czsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGSU5OVUNBU1RQS1RTOgogICAgICAgIGxvbmdfcmV0dXJuID0gKHVfbG9uZykgaWZzdGF0LmlmSW5OVWNhc3RQa3RzOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIE5FVFNOTVBfSUZJTkRJU0NBUkRTOgogICAgICAgIGxvbmdfcmV0dXJuID0gKHVfbG9uZykgaWZzdGF0LmlmSW5EaXNjYXJkczsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGSU5FUlJPUlM6CiAgICAgICAgbG9uZ19yZXR1cm4gPSAodV9sb25nKSBpZnN0YXQuaWZJbkVycm9yczsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGSU5VTktOT1dOUFJPVE9TOgogICAgICAgIGxvbmdfcmV0dXJuID0gKHVfbG9uZykgaWZzdGF0LmlmSW5Vbmtub3duUHJvdG9zOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIE5FVFNOTVBfSUZPVVRPQ1RFVFM6CiAgICAgICAgbG9uZ19yZXR1cm4gPSAodV9sb25nKSBpZnN0YXQuaWZPdXRPY3RldHM7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgTkVUU05NUF9JRk9VVFVDQVNUUEtUUzoKICAgICAgICBsb25nX3JldHVybiA9ICh1X2xvbmcpIGlmc3RhdC5pZk91dFVjYXN0UGt0czsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGT1VUTlVDQVNUUEtUUzoKICAgICAgICBsb25nX3JldHVybiA9ICh1X2xvbmcpIGlmc3RhdC5pZk91dE5VY2FzdFBrdHM7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgTkVUU05NUF9JRk9VVERJU0NBUkRTOgogICAgICAgIGxvbmdfcmV0dXJuID0gKHVfbG9uZykgaWZzdGF0LmlmT3V0RGlzY2FyZHM7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgTkVUU05NUF9JRk9VVEVSUk9SUzoKICAgICAgICBsb25nX3JldHVybiA9ICh1X2xvbmcpIGlmc3RhdC5pZk91dEVycm9yczsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGT1VUUUxFTjoKICAgICAgICBsb25nX3JldHVybiA9ICh1X2xvbmcpIGlmc3RhdC5pZk91dFFMZW47CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgTkVUU05NUF9JRlNQRUNJRklDOgoJbG9uZ19yZXR1cm4gPSAodV9sb25nKSBpZnN0YXQuaWZTcGVjaWZpYzsKCXJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBkZWZhdWx0OgogICAgICAgIERFQlVHTVNHVEwoKCJzbm1wZCIsICJ1bmtub3duIHN1Yi1pZCAlZCBpbiB2YXJfaWZFbnRyeVxuIiwKICAgICAgICAgICAgICAgICAgICB2cC0+bWFnaWMpKTsKICAgIH0KICAgIHJldHVybiBOVUxMOwp9CgojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNvbGFyaXMyICovCgoKCiAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKgoJICoKCSAqICBJbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiBmdW5jdGlvbnMKCSAqCgkgKioqKioqKioqKioqKioqKioqKioqLwoKCiNpZm5kZWYgc29sYXJpczIKCiNpZiAhZGVmaW5lZChzdW5WMykgJiYgIWRlZmluZWQobGludXgpICYmICFkZWZpbmVkKGhwdXgxMSkKc3RhdGljIHN0cnVjdCBpbl9pZmFkZHIgc2F2ZWluX2lmYWRkcjsKI2VuZGlmCiNpZiAhZGVmaW5lZChocHV4MTEpCnN0YXRpYyBzdHJ1Y3QgaWZuZXQgKmlmbmV0YWRkciwgc2F2ZWlmbmV0LCAqc2F2ZWlmbmV0YWRkcjsKc3RhdGljIGNoYXIgICAgIHNhdmVOYW1lWzE2XTsKI2VuZGlmCnN0YXRpYyBpbnQgICAgICBzYXZlSW5kZXggPSAwOwoKLyoqCiogRGV0ZXJtaW5lcyBuZXR3b3JrIGludGVyZmFjZSBzcGVlZC4gSXQgaXMgc3lzdGVtIHNwZWNpZmljLiBPbmx5IGxpbnV4CiogcmVhbGl6YXRpb24gaXMgbWFkZS4gCiovCnVuc2lnbmVkIGludCBnZXRJZlNwZWVkKGludCBmZCwgc3RydWN0IGlmcmVxIGlmciwgdW5zaWduZWQgaW50IGRlZmF1bHRzcGVlZCkKewojaWZkZWYgbGludXgKICAgIC8qKiB0ZW1wb3JhcnkgZXhwb3NlIGludGVybmFsIHVudGlsIHRoaXMgbW9kdWxlIGNhbiBiZSByZS13cml0dGVuICovCiAgICBleHRlcm4gdW5zaWduZWQgaW50CiAgICAgICAgbmV0c25tcF9saW51eF9pbnRlcmZhY2VfZ2V0X2lmX3NwZWVkKGludCBmZCwgY29uc3QgY2hhciAqbmFtZSwKICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBkZWZhdWx0c3BlZWQpOwoKICAgIHJldHVybiBuZXRzbm1wX2xpbnV4X2ludGVyZmFjZV9nZXRfaWZfc3BlZWQoZmQsIGlmci5pZnJfbmFtZSwgZGVmYXVsdHNwZWVkKTsKI2Vsc2UgLyohbGludXgqLwkJCSAgIAogICAgcmV0dXJuIGRlZmF1bHRzcGVlZDsKI2VuZGlmIAp9Cgp2b2lkCkludGVyZmFjZV9TY2FuX0luaXQodm9pZCkKewojaWZkZWYgbGludXgKICAgIGNoYXIgICAgICAgICAgICBsaW5lWzI1Nl0sIGlmbmFtZV9idWZbNjRdLCAqaWZuYW1lLCAqcHRyOwogICAgc3RydWN0IGlmcmVxICAgIGlmcnE7CiAgICBzdHJ1Y3QgaWZuZXQgICoqaWZuZXRhZGRyX3B0cjsKICAgIEZJTEUgICAgICAgICAgICpkZXZpbjsKICAgIGludCAgICAgICAgICAgICBpLCBmZDsKICAgIGNvbmZfaWZfbGlzdCAgICppZl9wdHI7CiAgICAvKgogICAgICogc2NhbmxpbmVfMl8yOgogICAgICogIFsgICAgICAgICAgICAgICBJTiAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAqICAgYnl0ZSBwa3RzIGVycnMgZHJvcCBmaWZvIGZyYW1lIGNtcHJzIG1jc3QgfAogICAgICogIFsgICAgICAgICAgICAgICBPVVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICogICBieXRlIHBrdHMgZXJycyBkcm9wIGZpZm8gY29sbHMgY2FycmllciBjb21wcmVzc2VkCiAgICAgKi8KI2lmZGVmIFNDTnVNQVgKICAgIHVpbnRtYXhfdCAgICAgICByZWNfcGt0LCByZWNfb2N0LCByZWNfZXJyLCByZWNfZHJvcDsKICAgIHVpbnRtYXhfdCAgICAgICBzbmRfcGt0LCBzbmRfb2N0LCBzbmRfZXJyLCBzbmRfZHJvcCwgY29sbDsKICAgIGNvbnN0IGNoYXIgICAgICpzY2FuX2xpbmVfMl8yID0KICAgICAgICAiJSIgICBTQ051TUFYICIgJSIgIFNDTnVNQVggIiAlIiAgU0NOdU1BWCAiICUiICBTQ051TUFYCiAgICAgICAgIiAlKiIgU0NOdU1BWCAiICUqIiBTQ051TUFYICIgJSoiIFNDTnVNQVggIiAlKiIgU0NOdU1BWAogICAgICAgICIgJSIgIFNDTnVNQVggIiAlIiAgU0NOdU1BWCAiICUiICBTQ051TUFYICIgJSIgIFNDTnVNQVgKICAgICAgICAiICUqIiBTQ051TUFYICIgJSIgIFNDTnVNQVg7CiAgICBjb25zdCBjaGFyICAgICAqc2Nhbl9saW5lXzJfMCA9CiAgICAgICAgIiUiICAgU0NOdU1BWCAiICUiICBTQ051TUFYICIgJSoiIFNDTnVNQVggIiAlKiIgU0NOdU1BWAogICAgICAgICIgJSoiIFNDTnVNQVggIiAlIiAgU0NOdU1BWCAiICUiICBTQ051TUFYICIgJSoiIFNDTnVNQVgKICAgICAgICAiICUqIiBTQ051TUFYICIgJSIgIFNDTnVNQVg7CiNlbHNlCiAgICB1bnNpZ25lZCBsb25nICAgcmVjX3BrdCwgcmVjX29jdCwgcmVjX2VyciwgcmVjX2Ryb3A7CiAgICB1bnNpZ25lZCBsb25nICAgc25kX3BrdCwgc25kX29jdCwgc25kX2Vyciwgc25kX2Ryb3AsIGNvbGw7CiAgICBjb25zdCBjaGFyICAgICAqc2Nhbl9saW5lXzJfMiA9CiAgICAgICAgIiVsdSAlbHUgJWx1ICVsdSAlKmx1ICUqbHUgJSpsdSAlKmx1ICVsdSAlbHUgJWx1ICVsdSAlKmx1ICVsdSI7CiAgICBjb25zdCBjaGFyICAgICAqc2Nhbl9saW5lXzJfMCA9CiAgICAgICAgIiVsdSAlbHUgJSpsdSAlKmx1ICUqbHUgJWx1ICVsdSAlKmx1ICUqbHUgJWx1IjsKI2VuZGlmCiAgICBjb25zdCBjaGFyICAgICAqc2Nhbl9saW5lX3RvX3VzZTsKICAgIHN0cnVjdCB0aW1ldmFsIGV0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVsYXBzZWQgdGltZSAqLwoKI2VuZGlmCgojaWYgIWRlZmluZWQoaHB1eDExKSAmJiBkZWZpbmVkKElGTkVUX1NZTUJPTCkKICAgIGF1dG9fbmxpc3QoSUZORVRfU1lNQk9MLCAoY2hhciAqKSAmaWZuZXRhZGRyLCBzaXplb2YoaWZuZXRhZGRyKSk7CiNlbmRpZgogICAgc2F2ZUluZGV4ID0gMDsKCgojaWZkZWYgbGludXgKICAgIC8qICBkaXNhbGxvdyByZWxvYWRpbmcgb2Ygc3RydWN0dXJlcyB0b28gb2Z0ZW4gKi8KICAgIGdldHRpbWVvZmRheSAoICZldCwgKCBzdHJ1Y3QgdGltZXpvbmUgKiApIDAgKTsgIC8qICBnZXQgdGltZS1vZi1kYXkgKi8KICAgIGlmICggZXQudHZfc2VjIDwgTGFzdExvYWQgKyBNSU5MT0FERlJFUSApIHsgICAgIC8qICBvbmx5IHJlbG9hZCBzbyBvZnRlbiAqLwogICAgICBpZm5ldGFkZHIgPSBpZm5ldGFkZHJfbGlzdDsgICAgICAgICAgICAgICAgICAgLyogIGluaXRpYWxpemUgcG9pbnRlciAqLwogICAgICByZXR1cm47CiAgICB9CiAgICBMYXN0TG9hZCA9IGV0LnR2X3NlYzsKCiAgICAvKgogICAgICogZnJlZSBvbGQgbGlzdDogCiAgICAgKi8KICAgIHdoaWxlIChpZm5ldGFkZHJfbGlzdCkgewogICAgICAgIHN0cnVjdCBpZm5ldCAgICpvbGQgPSBpZm5ldGFkZHJfbGlzdDsKICAgICAgICBpZm5ldGFkZHJfbGlzdCA9IGlmbmV0YWRkcl9saXN0LT5pZl9uZXh0OwogICAgICAgIGZyZWUob2xkLT5pZl9uYW1lKTsKICAgICAgICBmcmVlKG9sZC0+aWZfdW5pdCk7CiAgICAgICAgZnJlZShvbGQpOwogICAgfQoKICAgIGlmbmV0YWRkciA9IDA7CiAgICBpZm5ldGFkZHJfcHRyID0gJmlmbmV0YWRkcl9saXN0OwoKICAgIGlmICgoZmQgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19ER1JBTSwgMCkpIDwgMCkgewogICAgICAgIERFQlVHTVNHVEwoKCJzbm1wZCIsCiAgICAgICAgICAgICAgICAgICAgInNvY2tldCBvcGVuIGZhaWx1cmUgaW4gSW50ZXJmYWNlX1NjYW5fSW5pdFxuIikpOwogICAgICAgIHJldHVybjsgLyoqIGV4aXQgKDEpOyAqKi8KICAgIH0KCiAgICAvKgogICAgICogYnVpbGQgdXAgaWZuZXRhZGRyIGxpc3QgYnkgaGFuZDogCiAgICAgKi8KCiAgICAvKgogICAgICogYXQgbGVhc3QgbGludXggdjEuMy41MyBzYXlzIEVNRklMRSB3aXRob3V0IHJlYXNvbi4uLiAKICAgICAqLwogICAgaWYgKCEoZGV2aW4gPSBmb3BlbigiL3Byb2MvbmV0L2RldiIsICJyIikpKSB7CiAgICAgICAgY2xvc2UoZmQpOwogICAgICAgIE5FVFNOTVBfTE9HT05DRSgoTE9HX0VSUiwgImNhbm5vdCBvcGVuIC9wcm9jL25ldC9kZXYuXG4iKSk7CiAgICAgICAgcmV0dXJuOyAvKiogZXhpdCAoMSk7ICoqLwogICAgfQoKICAgIGkgPSAwOwoKICAgIC8qCiAgICAgKiByZWFkIHRoZSBzZWNvbmQgbGluZSAoYSBoZWFkZXIpIGFuZCBkZXRlcm1pbmUgdGhlIGZpZWxkcyB3ZQogICAgICogc2hvdWxkIHJlYWQgZnJvbS4gIFRoaXMgc2hvdWxkIGJlIGRvbmUgaW4gYSBiZXR0ZXIgd2F5IGJ5CiAgICAgKiBhY3R1YWxseSBsb29raW5nIGZvciB0aGUgZmllbGQgbmFtZXMgd2Ugd2FudC4gIEJ1dCB0aGF0cyB0b28KICAgICAqIG11Y2ggd29yayBmb3IgdG9kYXkuICAtLSBXZXMgCiAgICAgKi8KICAgIGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgZGV2aW4pOwogICAgZmdldHMobGluZSwgc2l6ZW9mKGxpbmUpLCBkZXZpbik7CiAgICBpZiAoc3Ryc3RyKGxpbmUsICJjb21wcmVzc2VkIikpIHsKICAgICAgICBzY2FuX2xpbmVfdG9fdXNlID0gc2Nhbl9saW5lXzJfMjsKICAgICAgICBERUJVR01TR1RMKCgibWliSUkvaW50ZXJmYWNlcyIsCiAgICAgICAgICAgICAgICAgICAgInVzaW5nIGxpbnV4IDIuMiBrZXJuZWwgL3Byb2MvbmV0L2RldlxuIikpOwogICAgfSBlbHNlIHsKICAgICAgICBzY2FuX2xpbmVfdG9fdXNlID0gc2Nhbl9saW5lXzJfMDsKICAgICAgICBERUJVR01TR1RMKCgibWliSUkvaW50ZXJmYWNlcyIsCiAgICAgICAgICAgICAgICAgICAgInVzaW5nIGxpbnV4IDIuMCBrZXJuZWwgL3Byb2MvbmV0L2RldlxuIikpOwogICAgfQoKCiAgICB3aGlsZSAoZmdldHMobGluZSwgc2l6ZW9mKGxpbmUpLCBkZXZpbikpIHsKICAgICAgICBzdHJ1Y3QgaWZuZXQgICAqbm5ldzsKICAgICAgICBjaGFyICAgICAgICAgICAqc3RhdHMsICppZnN0YXJ0ID0gbGluZTsKCiAgICAgICAgaWYgKGxpbmVbc3RybGVuKGxpbmUpIC0gMV0gPT0gJ1xuJykKICAgICAgICAgICAgbGluZVtzdHJsZW4obGluZSkgLSAxXSA9ICdcMCc7CgogICAgICAgIHdoaWxlICgqaWZzdGFydCAmJiAqaWZzdGFydCA9PSAnICcpCiAgICAgICAgICAgIGlmc3RhcnQrKzsKCiAgICAgICAgaWYgKCEqaWZzdGFydCB8fCAoKHN0YXRzID0gc3RycmNocihpZnN0YXJ0LCAnOicpKSA9PSBOVUxMKSkgewogICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLAogICAgICAgICAgICAgICAgICAgICAiL3Byb2MvbmV0L2RldiBkYXRhIGZvcm1hdCBlcnJvciwgbGluZSA9PXwlc3wiLCBsaW5lKTsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGlmICgoc2Nhbl9saW5lX3RvX3VzZSA9PSBzY2FuX2xpbmVfMl8yKSAmJiAoKHN0YXRzIC0gbGluZSkgPCA2KSkgewogICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLAogICAgICAgICAgICAgICAgICAgICAiL3Byb2MvbmV0L2RldiBkYXRhIGZvcm1hdCBlcnJvciwgbGluZSA9PXwlc3wiLCBsaW5lKTsKICAgICAgICB9CgogICAgICAgICpzdGF0cyAgID0gMDsKICAgICAgICBzdHJsY3B5KGlmbmFtZV9idWYsIGlmc3RhcnQsIHNpemVvZihpZm5hbWVfYnVmKSk7CiAgICAgICAgKnN0YXRzKysgPSAnOic7CiAgICAgICAgd2hpbGUgKCpzdGF0cyA9PSAnICcpCiAgICAgICAgICAgIHN0YXRzKys7CgogICAgICAgIGlmICgoc2Nhbl9saW5lX3RvX3VzZSA9PSBzY2FuX2xpbmVfMl8yICYmCiAgICAgICAgICAgICBzc2NhbmYoc3RhdHMsIHNjYW5fbGluZV90b191c2UsICZyZWNfb2N0LCAmcmVjX3BrdCwgJnJlY19lcnIsCiAgICAgICAgICAgICAgICAgICAgJnJlY19kcm9wLCAmc25kX29jdCwgJnNuZF9wa3QsICZzbmRfZXJyLCAmc25kX2Ryb3AsCiAgICAgICAgICAgICAgICAgICAgJmNvbGwpICE9IDkpIHx8IChzY2FuX2xpbmVfdG9fdXNlID09IHNjYW5fbGluZV8yXzAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHNzY2FuZihzdGF0cywgc2Nhbl9saW5lX3RvX3VzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVjX3BrdCwgJnJlY19lcnIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNuZF9wa3QsICZzbmRfZXJyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb2xsKSAhPSA1KSkgewogICAgICAgICAgICBpZiAoKHNjYW5fbGluZV90b191c2UgPT0gc2Nhbl9saW5lXzJfMikKICAgICAgICAgICAgICAgICYmICFzdHJzdHIobGluZSwgIk5vIHN0YXRpc3RpY3MgYXZhaWxhYmxlIikpCiAgICAgICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLAogICAgICAgICAgICAgICAgICAgICAgICAgIi9wcm9jL25ldC9kZXYgZGF0YSBmb3JtYXQgZXJyb3IsIGxpbmUgPT18JXN8IiwKICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUpOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CgogICAgICAgIG5uZXcgPSAoc3RydWN0IGlmbmV0ICopIGNhbGxvYygxLCBzaXplb2Yoc3RydWN0IGlmbmV0KSk7CiAgICAgICAgaWYgKG5uZXcgPT0gTlVMTCkKICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAvKiBhbGxvYyBlcnJvciAqLwoKICAgICAgICAvKgogICAgICAgICAqIGNoYWluIGluOiAKICAgICAgICAgKi8KICAgICAgICAqaWZuZXRhZGRyX3B0ciA9IG5uZXc7CiAgICAgICAgaWZuZXRhZGRyX3B0ciA9ICZubmV3LT5pZl9uZXh0OwogICAgICAgIGkrKzsKCiAgICAgICAgLyoKICAgICAgICAgKiBsaW51eCBwcmV2aW91cyB0byAxLjMufjEzIG1heSBtaXNzIHRyYW5zbWl0dGVkIGxvb3BiYWNrIHBrdHM6IAogICAgICAgICAqLwogICAgICAgIGlmICghc3RyY21wKGlmbmFtZV9idWYsICJsbyIpICYmIHJlY19wa3QgPiAwICYmICFzbmRfcGt0KQogICAgICAgICAgICBzbmRfcGt0ID0gcmVjX3BrdDsKCiAgICAgICAgbm5ldy0+aWZfaXBhY2tldHMgPSByZWNfcGt0ICYgMHhmZmZmZmZmZjsKICAgICAgICBubmV3LT5pZl9pZXJyb3JzID0gcmVjX2VycjsKICAgICAgICBubmV3LT5pZl9vcGFja2V0cyA9IHNuZF9wa3QgJiAweGZmZmZmZmZmOwogICAgICAgIG5uZXctPmlmX29lcnJvcnMgPSBzbmRfZXJyOwogICAgICAgIG5uZXctPmlmX2NvbGxpc2lvbnMgPSBjb2xsOwogICAgICAgIGlmIChzY2FuX2xpbmVfdG9fdXNlID09IHNjYW5fbGluZV8yXzIpIHsKICAgICAgICAgICAgbm5ldy0+aWZfaWJ5dGVzID0gcmVjX29jdCAmIDB4ZmZmZmZmZmY7CiAgICAgICAgICAgIG5uZXctPmlmX29ieXRlcyA9IHNuZF9vY3QgJiAweGZmZmZmZmZmOwogICAgICAgICAgICBubmV3LT5pZl9pcWRyb3BzID0gcmVjX2Ryb3A7CiAgICAgICAgICAgIG5uZXctPmlmX3NuZC5pZnFfZHJvcHMgPSBzbmRfZHJvcDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBubmV3LT5pZl9pYnl0ZXMgPSAocmVjX3BrdCAqIDMwOCkgJiAweGZmZmZmZmZmOwogICAgICAgICAgICBubmV3LT5pZl9vYnl0ZXMgPSAoc25kX3BrdCAqIDMwOCkgJiAweGZmZmZmZmZmOwogICAgICAgIH0KCiAgICAgICAgLyoKICAgICAgICAgKiBpZm5hbWVzIGFyZSBnaXZlbiBhcyBgYCAgIGV0aDAnJzogc3BsaXQgaW4gYGBldGgnJyBhbmQgYGAwJyc6IAogICAgICAgICAqLwogICAgICAgIGZvciAoaWZuYW1lID0gaWZuYW1lX2J1ZjsgKmlmbmFtZSAmJiAqaWZuYW1lID09ICcgJzsgaWZuYW1lKyspOwoKICAgICAgICAvKgogICAgICAgICAqIHNldCBuYW1lIGFuZCBpbnRlcmZhY2UjIDogCiAgICAgICAgICovCiAgICAgICAgbm5ldy0+aWZfbmFtZSA9IChjaGFyICopIHN0cmR1cChpZm5hbWUpOwogICAgICAgIGZvciAocHRyID0gbm5ldy0+aWZfbmFtZTsgKnB0ciAmJiAoKnB0ciA8ICcwJyB8fCAqcHRyID4gJzknKTsKICAgICAgICAgICAgIHB0cisrKTsKICAgICAgICBubmV3LT5pZl91bml0ID0gc3RyZHVwKCpwdHIgPyBwdHIgOiAiIik7CiAgICAgICAgKnB0ciA9IDA7CgogICAgICAgIHN0cmxjcHkoaWZycS5pZnJfbmFtZSwgaWZuYW1lLCBzaXplb2YoaWZycS5pZnJfbmFtZSkpOwogICAgICAgIGlmIChpb2N0bChmZCwgU0lPQ0dJRkFERFIsICZpZnJxKSA8IDApCiAgICAgICAgICAgIG1lbXNldCgoY2hhciAqKSAmbm5ldy0+aWZfYWRkciwgMCwgc2l6ZW9mKG5uZXctPmlmX2FkZHIpKTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIG5uZXctPmlmX2FkZHIgPSBpZnJxLmlmcl9hZGRyOwoKICAgICAgICBzdHJsY3B5KGlmcnEuaWZyX25hbWUsIGlmbmFtZSwgc2l6ZW9mKGlmcnEuaWZyX25hbWUpKTsKICAgICAgICBpZiAoaW9jdGwoZmQsIFNJT0NHSUZCUkRBRERSLCAmaWZycSkgPCAwKQogICAgICAgICAgICBtZW1zZXQoKGNoYXIgKikgJm5uZXctPmlmdV9icm9hZGFkZHIsIDAsCiAgICAgICAgICAgICAgICAgICBzaXplb2Yobm5ldy0+aWZ1X2Jyb2FkYWRkcikpOwogICAgICAgIGVsc2UKICAgICAgICAgICAgbm5ldy0+aWZ1X2Jyb2FkYWRkciA9IGlmcnEuaWZyX2Jyb2FkYWRkcjsKCiAgICAgICAgc3RybGNweShpZnJxLmlmcl9uYW1lLCBpZm5hbWUsIHNpemVvZihpZnJxLmlmcl9uYW1lKSk7CiAgICAgICAgaWYgKGlvY3RsKGZkLCBTSU9DR0lGTkVUTUFTSywgJmlmcnEpIDwgMCkKICAgICAgICAgICAgbWVtc2V0KChjaGFyICopICZubmV3LT5pYV9zdWJuZXRtYXNrLCAwLAogICAgICAgICAgICAgICAgICAgc2l6ZW9mKG5uZXctPmlhX3N1Ym5ldG1hc2spKTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIG5uZXctPmlhX3N1Ym5ldG1hc2sgPSBpZnJxLmlmcl9uZXRtYXNrOwoKICAgICAgICBzdHJsY3B5KGlmcnEuaWZyX25hbWUsIGlmbmFtZSwgc2l6ZW9mKGlmcnEuaWZyX25hbWUpKTsKICAgICAgICBubmV3LT5pZl9mbGFncyA9IGlvY3RsKGZkLCBTSU9DR0lGRkxBR1MsICZpZnJxKSA8IDAKICAgICAgICAgICAgPyAwIDogaWZycS5pZnJfZmxhZ3M7CgogICAgICAgIG5uZXctPmlmX3R5cGUgPSAwOwoKICAgICAgICAvKgogICAgICAgICAqIE5PVEU6IHRoaXMgaW9jdGwgZG9lcyBub3QgZ3VhcmFudGVlIDYgYnl0ZXMgb2YgYSBwaHlzYWRkci4KICAgICAgICAgKiBJbiBwYXJ0aWN1bGFyLCBhICdzaXQwJyBpbnRlcmZhY2Ugb25seSBhcHBlYXJzIHRvIGdldCBiYWNrCiAgICAgICAgICogNCBieXRlcyBvZiBzYV9kYXRhLgogICAgICAgICAqLwogICAgICAgIG1lbXNldChpZnJxLmlmcl9od2FkZHIuc2FfZGF0YSwgKDApLCBJRkhXQUREUkxFTik7CiAgICAgICAgc3RybGNweShpZnJxLmlmcl9uYW1lLCBpZm5hbWUsIHNpemVvZihpZnJxLmlmcl9uYW1lKSk7CiAgICAgICAgaWYgKGlvY3RsKGZkLCBTSU9DR0lGSFdBRERSLCAmaWZycSkgPCAwKQogICAgICAgICAgICBtZW1zZXQobm5ldy0+aWZfaHdhZGRyLCAoMCksIElGSFdBRERSTEVOKTsKICAgICAgICBlbHNlIHsKICAgICAgICAgICAgbWVtY3B5KG5uZXctPmlmX2h3YWRkciwgaWZycS5pZnJfaHdhZGRyLnNhX2RhdGEsIElGSFdBRERSTEVOKTsKCiNpZmRlZiBBUlBIUkRfTE9PUEJBQ0sKICAgICAgICAgICAgc3dpdGNoIChpZnJxLmlmcl9od2FkZHIuc2FfZmFtaWx5KSB7CiAgICAgICAgICAgIGNhc2UgQVJQSFJEX0VUSEVSOgogICAgICAgICAgICAgICAgbm5ldy0+aWZfdHlwZSA9IDY7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSBBUlBIUkRfVFVOTkVMOgogICAgICAgICAgICBjYXNlIEFSUEhSRF9UVU5ORUw2OgojaWZkZWYgQVJQSFJEX0lQR1JFCiAgICAgICAgICAgIGNhc2UgQVJQSFJEX0lQR1JFOgojZW5kaWYKICAgICAgICAgICAgY2FzZSBBUlBIUkRfU0lUOgogICAgICAgICAgICAgICAgbm5ldy0+aWZfdHlwZSA9IDEzMTsKICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAvKiB0dW5uZWwgKi8KICAgICAgICAgICAgY2FzZSBBUlBIUkRfU0xJUDoKICAgICAgICAgICAgY2FzZSBBUlBIUkRfQ1NMSVA6CiAgICAgICAgICAgIGNhc2UgQVJQSFJEX1NMSVA2OgogICAgICAgICAgICBjYXNlIEFSUEhSRF9DU0xJUDY6CiAgICAgICAgICAgICAgICBubmV3LT5pZl90eXBlID0gMjg7CiAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgLyogc2xpcCAqLwogICAgICAgICAgICBjYXNlIEFSUEhSRF9QUFA6CiAgICAgICAgICAgICAgICBubmV3LT5pZl90eXBlID0gMjM7CiAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgLyogcHBwICovCiAgICAgICAgICAgIGNhc2UgQVJQSFJEX0xPT1BCQUNLOgogICAgICAgICAgICAgICAgbm5ldy0+aWZfdHlwZSA9IDI0OwogICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgIC8qIHNvZnR3YXJlTG9vcGJhY2sgKi8KICAgICAgICAgICAgY2FzZSBBUlBIUkRfRkRESToKICAgICAgICAgICAgICAgIG5uZXctPmlmX3R5cGUgPSAxNTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIEFSUEhSRF9BUkNORVQ6CiAgICAgICAgICAgICAgICBubmV3LT5pZl90eXBlID0gMzU7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSBBUlBIUkRfTE9DQUxUTEs6CiAgICAgICAgICAgICAgICBubmV3LT5pZl90eXBlID0gNDI7CiAgICAgICAgICAgICAgICBicmVhazsKI2lmZGVmIEFSUEhSRF9ISVBQSQogICAgICAgICAgICBjYXNlIEFSUEhSRF9ISVBQSToKICAgICAgICAgICAgICAgIG5uZXctPmlmX3R5cGUgPSA0NzsKICAgICAgICAgICAgICAgIGJyZWFrOwojZW5kaWYKI2lmZGVmIEFSUEhSRF9BVE0KICAgICAgICAgICAgY2FzZSBBUlBIUkRfQVRNOgogICAgICAgICAgICAgICAgbm5ldy0+aWZfdHlwZSA9IDM3OwogICAgICAgICAgICAgICAgYnJlYWs7CiNlbmRpZgogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIFhYWDogbW9yZSBpZl9hcnAuaDpBUlBIRFJfeHh4IHRvIElBTkFpZlR5cGUgbWFwcGluZ3MuLi4gCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgfQojZW5kaWYKICAgICAgICB9CgogICAgICAgIHN0cmxjcHkoaWZycS5pZnJfbmFtZSwgaWZuYW1lLCBzaXplb2YoaWZycS5pZnJfbmFtZSkpOwogICAgICAgIG5uZXctPmlmX21ldHJpYyA9IGlvY3RsKGZkLCBTSU9DR0lGTUVUUklDLCAmaWZycSkgPCAwCiAgICAgICAgICAgID8gMCA6IGlmcnEuaWZyX21ldHJpYzsKCiNpZmRlZiBTSU9DR0lGTVRVCiAgICAgICAgc3RybGNweShpZnJxLmlmcl9uYW1lLCBpZm5hbWUsIHNpemVvZihpZnJxLmlmcl9uYW1lKSk7CiAgICAgICAgbm5ldy0+aWZfbXR1ID0gKGlvY3RsKGZkLCBTSU9DR0lGTVRVLCAmaWZycSkgPCAwKQogICAgICAgICAgICA/IDAgOiBpZnJxLmlmcl9tdHU7CiNlbHNlCiAgICAgICAgbm5ldy0+aWZfbXR1ID0gMDsKI2VuZGlmCgogICAgICAgIGlmX3B0ciA9IG5ldHNubXBfYWNjZXNzX2ludGVyZmFjZV9lbnRyeV9vdmVycmlkZXNfZ2V0KGlmbmFtZSk7CiAgICAgICAgaWYgKGlmX3B0cikgewogICAgICAgICAgICBubmV3LT5pZl90eXBlID0gaWZfcHRyLT50eXBlOwogICAgICAgICAgICBubmV3LT5pZl9zcGVlZCA9IGlmX3B0ci0+c3BlZWQ7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogZG8gb25seSBndWVzcyBpZl90eXBlIGZyb20gbmFtZSwgaWYgd2UgY291bGQgbm90IHJlYWQKICAgICAgICAgICAgICogKiBpdCBiZWZvcmUgZnJvbSBTSU9DR0lGSFdBRERSIAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdW5zaWduZWQgaW50IGRlZmF1bHRzcGVlZCA9IE5PTUlOQUxfTElOS19TUEVFRDsKICAgICAgICAgICAgICAgIGlmICghKG5uZXctPmlmX2ZsYWdzICYgSUZGX1JVTk5JTkcpKSB7CiAgICAgICAgICAgICAgICAgICAgLyogCiAgICAgICAgICAgICAgICAgICAgICogdXNlIHNwZWVkIDAgaWYgdGhlIGlmIHNwZWVkIGNhbm5vdCBiZSBkZXRlcm1pbmVkICphbmQqIHRoZQogICAgICAgICAgICAgICAgICAgICAqIGludGVyZmFjZSBpcyBkb3duCiAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdHNwZWVkID0gMDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghbm5ldy0+aWZfdHlwZSkKICAgICAgICAgICAgICAgIG5uZXctPmlmX3R5cGUgPSBpZl90eXBlX2Zyb21fbmFtZShubmV3LT5pZl9uYW1lKTsKICAgICAgICAgICAgc3dpdGNoKG5uZXctPmlmX3R5cGUpIHsKICAgICAgICAgICAgY2FzZSA2OgogICAgICAgICAgICAgICAgbm5ldy0+aWZfc3BlZWQgPSBnZXRJZlNwZWVkKGZkLCBpZnJxLCBkZWZhdWx0c3BlZWQpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgMjQ6CiAgICAgICAgICAgICAgICBubmV3LT5pZl9zcGVlZCA9IDEwMDAwMDAwOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgOToKICAgICAgICAgICAgICAgIG5uZXctPmlmX3NwZWVkID0gNDAwMDAwMDsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgbm5ldy0+aWZfc3BlZWQgPSAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qWmVybyBzcGVlZCBtZWFucyBsaW5rIHByb2JsZW0qLwogICAgICAgICAgICBpZihubmV3LT5pZl9zcGVlZCA9PSAwICYmIG5uZXctPmlmX2ZsYWdzICYgSUZGX1VQKXsKICAgICAgICAgICAgICAgIG5uZXctPmlmX2ZsYWdzICY9IH5JRkZfUlVOTklORzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogd2hpbGUgKGZnZXRzIC4uLiAqLwoKICAgIGlmbmV0YWRkciA9IGlmbmV0YWRkcl9saXN0OwoKICAgIGlmIChzbm1wX2dldF9kb19kZWJ1Z2dpbmcoKSkgewogICAgICAgIHsKICAgICAgICAgICAgc3RydWN0IGlmbmV0ICAgKnggPSBpZm5ldGFkZHI7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJtaWJJSS9pbnRlcmZhY2VzIiwgIiogc2VlOiBrbm93biBpbnRlcmZhY2VzOiIpKTsKICAgICAgICAgICAgd2hpbGUgKHgpIHsKICAgICAgICAgICAgICAgIERFQlVHTVNHKCgibWliSUkvaW50ZXJmYWNlcyIsICIgJXMiLCB4LT5pZl9uYW1lKSk7CiAgICAgICAgICAgICAgICB4ID0geC0+aWZfbmV4dDsKICAgICAgICAgICAgfQogICAgICAgICAgICBERUJVR01TRygoIm1pYklJL2ludGVyZmFjZXMiLCAiXG4iKSk7CiAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgLyogWFhYICovCiAgICB9CgogICAgZmNsb3NlKGRldmluKTsKICAgIGNsb3NlKGZkKTsKI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsaW51eCAqLwp9CgoKCiNpZiBkZWZpbmVkKHN1blYzKSB8fCBkZWZpbmVkKGxpbnV4KQovKgogKiAqKiAgNC4yIEJTRCBkb2Vzbid0IGhhdmUgaWZhZGRyCiAqICoqICAKICovCmludApJbnRlcmZhY2VfU2Nhbl9OZXh0KHNob3J0ICpJbmRleCwKICAgICAgICAgICAgICAgICAgICBjaGFyICpOYW1lLAogICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpZm5ldCAqUmV0aWZuZXQsIHN0cnVjdCBpbl9pZmFkZHIgKmR1bW15KQp7CiAgICBpbnQgcmV0dXJuSW5kZXggPSAwOwogICAgaW50IHJldDsKICAgIGlmIChJbmRleCkKICAgICAgICByZXR1cm5JbmRleCA9ICpJbmRleDsKCiAgICByZXQgPSBJbnRlcmZhY2VfU2Nhbl9OZXh0SW50KCAmcmV0dXJuSW5kZXgsIE5hbWUsIFJldGlmbmV0LCBkdW1teSApOwogICAgaWYgKEluZGV4KQogICAgICAgICpJbmRleCA9IChyZXR1cm5JbmRleCAmIDB4OGZmZik7CiAgICByZXR1cm4gcmV0Owp9CgppbnQKSW50ZXJmYWNlX1NjYW5fTmV4dEludChpbnQgKkluZGV4LAogICAgICAgICAgICAgICAgICAgIGNoYXIgKk5hbWUsCiAgICAgICAgICAgICAgICAgICAgc3RydWN0IGlmbmV0ICpSZXRpZm5ldCwgc3RydWN0IGluX2lmYWRkciAqZHVtbXkpCnsKICAgIHN0cnVjdCBpZm5ldCAgICBpZm5ldDsKICAgIHJlZ2lzdGVyIGNoYXIgICpjcDsKCiAgICB3aGlsZSAoaWZuZXRhZGRyKSB7CiAgICAgICAgLyoKICAgICAgICAgKiAgICAgIEdldCB0aGUgImlmbmV0IiBzdHJ1Y3R1cmUgYW5kIGV4dHJhY3QgdGhlIGRldmljZSBuYW1lCiAgICAgICAgICovCiNpZm5kZWYgbGludXgKICAgICAgICBpZiAoIU5FVFNOTVBfS0xPT0tVUChpZm5ldGFkZHIsIChjaGFyICopICZpZm5ldCwgc2l6ZW9mIGlmbmV0KSkgewogICAgICAgICAgICBERUJVR01TR1RMKCgibWliSUkvaW50ZXJmYWNlczpJbnRlcmZhY2VfU2Nhbl9OZXh0IiwgImtsb29rdXAgZmFpbGVkXG4iKSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCiAgICAgICAgaWYgKCFORVRTTk1QX0tMT09LVVAoaWZuZXQuaWZfbmFtZSwgKGNoYXIgKikgc2F2ZU5hbWUsIHNpemVvZiBzYXZlTmFtZSkpIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoIm1pYklJL2ludGVyZmFjZXM6SW50ZXJmYWNlX1NjYW5fTmV4dCIsICJrbG9va3VwIGZhaWxlZFxuIikpOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgICAgLyoKICAgICAgICAqIFRoZSBwdXJwb3NlIG9mIHRoaXMgY29tcGFyaXNvbiBpcyBsb3N0IGluIHRoZSBtaXN0cyBvZiB0aW1lLgogICAgICAgICogSXQncyBiZWVuIGFyb3VuZCBhdCBsZWFzdCBjbXUtc25tcCAyLjEuMiBmb3IgU1VOdjMgc3lzdGVtcyBhbmQKICAgICAgICAqIHdhcyBhcHBsaWVkIHRvIGxpbnV4IHN5c3RlbXMgZHVyaW5nIHRoZSBjbXUtc25tcC1saW51eCBwcm9qZWN0LgogICAgICAgICogTm8tb25lIG5vdyBrbm93cyB3aGF0IGl0IHdhcyBpbnRlbmRlZCBmb3IsIGFuZCBpdCBicmVha3MgSVB2NgogICAgICAgICogdHVubmVsIGludGVyZmFjZXMsIHNvIGl0J3MgYmVlbiBtb3ZlZCBvdXQgb2YgdGhlIExpbnV4IGNvZGUgYmxvY2suCiAgICAgICAgKi8KICAgICAgICBpZiAoc3RyY21wKHNhdmVOYW1lLCAiaXAiKSA9PSAwKSB7CiAgICAgICAgICAgIGlmbmV0YWRkciA9IGlmbmV0LmlmX25leHQ7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KI2Vsc2UKICAgICAgICBpZm5ldCA9ICppZm5ldGFkZHI7CiAgICAgICAgc3RybGNweShzYXZlTmFtZSwgaWZuZXQuaWZfbmFtZSwgc2l6ZW9mKHNhdmVOYW1lKSk7CiNlbmRpZgoKICAgICAgICBzYXZlTmFtZVtzaXplb2Yoc2F2ZU5hbWUpIC0gMV0gPSAnXDAnOwogICAgICAgIGNwID0gKGNoYXIgKikgc3RyY2hyKHNhdmVOYW1lLCAnXDAnKTsKI2lmZGVmIGxpbnV4CiAgICAgICAgc3RybGNhdChzYXZlTmFtZSwgaWZuZXQuaWZfdW5pdCwgc2l6ZW9mKHNhdmVOYW1lKSk7CiNlbHNlCiAgICAgICAgc3RyaW5nX2FwcGVuZF9pbnQoY3AsIGlmbmV0LmlmX3VuaXQpOwojZW5kaWYKICAgICAgICBpZiAoMSB8fCBzdHJjbXAoc2F2ZU5hbWUsICJsbzAiKSAhPSAwKSB7ICAgICAgICAvKiBYWFggKi8KCiAgICAgICAgICAgIGlmIChJbmRleCkKICAgICAgICAgICAgICAgICpJbmRleCA9ICsrc2F2ZUluZGV4OwogICAgICAgICAgICBpZiAoUmV0aWZuZXQpCiAgICAgICAgICAgICAgICAqUmV0aWZuZXQgPSBpZm5ldDsKICAgICAgICAgICAgaWYgKE5hbWUpCiAgICAgICAgICAgICAgICBzdHJjcHkoTmFtZSwgc2F2ZU5hbWUpOwogICAgICAgICAgICBzYXZlaWZuZXQgPSBpZm5ldDsKICAgICAgICAgICAgc2F2ZWlmbmV0YWRkciA9IGlmbmV0YWRkcjsKICAgICAgICAgICAgaWZuZXRhZGRyID0gaWZuZXQuaWZfbmV4dDsKCiAgICAgICAgICAgIHJldHVybiAoMSk7ICAgICAgICAgLyogRE9ORSAqLwogICAgICAgIH0KICAgICAgICBpZm5ldGFkZHIgPSBpZm5ldC5pZl9uZXh0OwogICAgfQogICAgcmV0dXJuICgwKTsgICAgICAgICAgICAgICAgIC8qIEVPRiAqLwp9CgojaWZkZWYgbGludXgKaW50CkludGVyZmFjZV9JbmRleF9CeV9OYW1lKGNoYXIgKk5hbWUsIGludCBMZW4pCnsKICAgIGludCAgICAgICAgICAgICBpZkluZGV4ID0gMDsKICAgIGNoYXIgICAgICAgICAgICBpZk5hbWVbMjBdOwoKICAgIEludGVyZmFjZV9TY2FuX0luaXQoKTsKICAgIHdoaWxlIChJbnRlcmZhY2VfU2Nhbl9OZXh0SW50KCZpZkluZGV4LCBpZk5hbWUsIE5VTEwsIE5VTEwpCiAgICAgICAgICAgJiYgc3RyY21wKE5hbWUsIGlmTmFtZSkpOwogICAgcmV0dXJuIGlmSW5kZXg7Cn0KI2VuZGlmCgoKI2Vsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzdW5WMyB8fCBsaW51eCAqLwoKI2lmIGRlZmluZWQobmV0YnNkMSkgfHwgZGVmaW5lZChvcGVuYnNkMikKI2RlZmluZSBpYV9uZXh0IGlhX2xpc3QudHFlX25leHQKI2RlZmluZSBpZl9uZXh0IGlmX2xpc3QudHFlX25leHQKI2VuZGlmCgojaWYgZGVmaW5lZChocHV4MTEpCmludApJbnRlcmZhY2VfU2Nhbl9OZXh0KHNob3J0ICpJbmRleCwgY2hhciAqTmFtZSwgbm1hcGlfcGh5c3RhdCAqIFJldGlmbmV0KQp7CiAgICBpbnQgcmV0dXJuSW5kZXggPSAwOwogICAgaW50IHJldDsKICAgIGlmIChJbmRleCkKICAgICAgICByZXR1cm5JbmRleCA9ICpJbmRleDsKCiAgICByZXQgPSBJbnRlcmZhY2VfU2Nhbl9OZXh0SW50KCAmcmV0dXJuSW5kZXgsIE5hbWUsIFJldGlmbmV0ICk7CiAgICBpZiAoSW5kZXgpCiAgICAgICAgKkluZGV4ID0gKHJldHVybkluZGV4ICYgMHg4ZmZmKTsKICAgIHJldHVybiByZXQ7Cn0KCgppbnQKSW50ZXJmYWNlX1NjYW5fTmV4dEludChpbnQgKkluZGV4LCBjaGFyICpOYW1lLCBubWFwaV9waHlzdGF0ICogUmV0aWZuZXQpCnsKICAgIHN0YXRpYyBubWFwaV9waHlzdGF0ICppZl9wdHIgPSAobm1hcGlfcGh5c3RhdCAqKSAwOwogICAgaW50ICAgICAgICAgICAgIGNvdW50ID0gSW50ZXJmYWNlX1NjYW5fR2V0X0NvdW50KCk7CiAgICB1bnNpZ25lZCBpbnQgICAgdWxlbjsKICAgIGludCAgICAgICAgICAgICByZXQ7CgogICAgaWYgKCFpZl9wdHIpIHsKICAgICAgICBpZiAoY291bnQpIHsKICAgICAgICAgICAgaWZfcHRyID0KICAgICAgICAgICAgICAgIChubWFwaV9waHlzdGF0ICopIG1hbGxvYyhzaXplb2Yobm1hcGlfcGh5c3RhdCkgKiBjb3VudCk7CiAgICAgICAgICAgIGlmIChpZl9wdHIgPT0gTlVMTCkKICAgICAgICAgICAgICAgIHJldHVybiAoMCk7CgogICAgICAgIH0gZWxzZQogICAgICAgICAgICByZXR1cm4gKDApOyAgICAgICAgIC8qIEVPRiAqLwogICAgfQoKICAgIGlmIChzYXZlSW5kZXggPj0gY291bnQpCiAgICAgICAgcmV0dXJuICgwKTsgICAgICAgICAgICAgLyogRU9GICovCgogICAgdWxlbiA9ICh1bnNpZ25lZCBpbnQpIGNvdW50ICpzaXplb2Yobm1hcGlfcGh5c3RhdCk7CiAgICBpZiAoKHJldCA9IGdldF9waHlzaWNhbF9zdGF0KGlmX3B0ciwgJnVsZW4pKSA8IDApCiAgICAgICAgcmV0dXJuICgwKTsgICAgICAgICAgICAgLyogRU9GICovCgogICAgaWYgKFJldGlmbmV0KQogICAgICAgICpSZXRpZm5ldCA9IGlmX3B0cltzYXZlSW5kZXhdOwogICAgaWYgKE5hbWUpCiAgICAgICAgc3RyY3B5KE5hbWUsIGlmX3B0cltzYXZlSW5kZXhdLm5tX2RldmljZSk7CiAgICBzYXZlSW5kZXgrKzsKICAgIGlmIChJbmRleCkKICAgICAgICAqSW5kZXggPSBzYXZlSW5kZXg7CiAgICByZXR1cm4gKDEpOyAgICAgICAgICAgICAgICAgLyogRE9ORSAqLwp9CgojZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGhwdXgxMSAqLwppbnQKSW50ZXJmYWNlX1NjYW5fTmV4dChzaG9ydCAqSW5kZXgsCiAgICAgICAgICAgICAgICAgICAgY2hhciAqTmFtZSwKICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaWZuZXQgKlJldGlmbmV0LCBzdHJ1Y3QgaW5faWZhZGRyICpSZXRpbl9pZmFkZHIpCnsKICAgIGludCByZXR1cm5JbmRleCA9IDA7CiAgICBpbnQgcmV0OwogICAgaWYgKEluZGV4KQogICAgICAgIHJldHVybkluZGV4ID0gKkluZGV4OwoKICAgIHJldCA9IEludGVyZmFjZV9TY2FuX05leHRJbnQoICZyZXR1cm5JbmRleCwgTmFtZSwgUmV0aWZuZXQsIFJldGluX2lmYWRkciApOwogICAgaWYgKEluZGV4KQogICAgICAgICpJbmRleCA9IChyZXR1cm5JbmRleCAmIDB4OGZmZik7CiAgICByZXR1cm4gcmV0Owp9CgoKaW50CkludGVyZmFjZV9TY2FuX05leHRJbnQoaW50ICpJbmRleCwKICAgICAgICAgICAgICAgICAgICBjaGFyICpOYW1lLAogICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpZm5ldCAqUmV0aWZuZXQsIHN0cnVjdCBpbl9pZmFkZHIgKlJldGluX2lmYWRkcikKewogICAgc3RydWN0IGlmbmV0ICAgIGlmbmV0OwogICAgc3RydWN0IGluX2lmYWRkciAqaWEsIGluX2lmYWRkcjsKICAgIHNob3J0ICAgICAgICAgICBoYXNfaXBhZGRyID0gMDsKI2lmICFIQVZFX1NUUlVDVF9JRk5FVF9JRl9YTkFNRQogICAgcmVnaXN0ZXIgY2hhciAgKmNwOwojZW5kaWYKCiAgICB3aGlsZSAoaWZuZXRhZGRyKSB7CiAgICAgICAgLyoKICAgICAgICAgKiAgICAgIEdldCB0aGUgImlmbmV0IiBzdHJ1Y3R1cmUgYW5kIGV4dHJhY3QgdGhlIGRldmljZSBuYW1lCiAgICAgICAgICovCiAgICAgICAgaWYgKCFORVRTTk1QX0tMT09LVVAoaWZuZXRhZGRyLCAoY2hhciAqKSAmaWZuZXQsIHNpemVvZiBpZm5ldCkpIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoIm1pYklJL2ludGVyZmFjZXM6SW50ZXJmYWNlX1NjYW5fTmV4dCIsICJrbG9va3VwIGZhaWxlZFxuIikpOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiNpZiBIQVZFX1NUUlVDVF9JRk5FVF9JRl9YTkFNRQojaWYgZGVmaW5lZChuZXRic2QxKSB8fCBkZWZpbmVkKG9wZW5ic2QyKQogICAgICAgIHN0cmxjcHkoc2F2ZU5hbWUsIGlmbmV0LmlmX3huYW1lLCBzaXplb2Yoc2F2ZU5hbWUpKTsKI2Vsc2UKICAgICAgICBpZiAoIU5FVFNOTVBfS0xPT0tVUChpZm5ldC5pZl94bmFtZSwgKGNoYXIgKikgc2F2ZU5hbWUsIHNpemVvZiBzYXZlTmFtZSkpIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoIm1pYklJL2ludGVyZmFjZXM6SW50ZXJmYWNlX1NjYW5fTmV4dCIsICJrbG9va3VwIGZhaWxlZFxuIikpOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiNlbmRpZgogICAgICAgIHNhdmVOYW1lW3NpemVvZihzYXZlTmFtZSkgLSAxXSA9ICdcMCc7CiNlbHNlCiAgICAgICAgaWYgKCFORVRTTk1QX0tMT09LVVAoaWZuZXQuaWZfbmFtZSwgKGNoYXIgKikgc2F2ZU5hbWUsIHNpemVvZiBzYXZlTmFtZSkpIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoIm1pYklJL2ludGVyZmFjZXM6SW50ZXJmYWNlX1NjYW5fTmV4dCIsICJrbG9va3VwIGZhaWxlZFxuIikpOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgICAgIHNhdmVOYW1lW3NpemVvZihzYXZlTmFtZSkgLSAxXSA9ICdcMCc7CiAgICAgICAgY3AgPSBzdHJjaHIoc2F2ZU5hbWUsICdcMCcpOwogICAgICAgIHN0cmluZ19hcHBlbmRfaW50KGNwLCBpZm5ldC5pZl91bml0KTsKI2VuZGlmCiAgICAgICAgaWYgKDEgfHwgc3RyY21wKHNhdmVOYW1lLCAibG8wIikgIT0gMCkgeyAgICAgICAgLyogWFhYICovCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqICBUcnkgdG8gZmluZCBhbiBhZGRyZXNzIGZvciB0aGlzIGludGVyZmFjZQogICAgICAgICAgICAgKi8KCiNpZmRlZiBuZXRic2QxCiAgICAgICAgICAgIGlhID0gKHN0cnVjdCBpbl9pZmFkZHIgKikgaWZuZXQuaWZfYWRkcmxpc3QudHFoX2ZpcnN0OwojZWxpZiBkZWZpbmVkKElGQUREUl9TWU1CT0wpCiAgICAgICAgICAgIGF1dG9fbmxpc3QoSUZBRERSX1NZTUJPTCwgKGNoYXIgKikgJmlhLCBzaXplb2YoaWEpKTsKI2VuZGlmCiAgICAgICAgICAgIHdoaWxlIChpYSkgewogICAgICAgICAgICAgICAgaWYgKCFORVRTTk1QX0tMT09LVVAoaWEsIChjaGFyICopICZpbl9pZmFkZHIsIHNpemVvZihpbl9pZmFkZHIpKSkgewogICAgICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJtaWJJSS9pbnRlcmZhY2VzOkludGVyZmFjZV9TY2FuX05leHQiLCAia2xvb2t1cCBmYWlsZWRcbiIpKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHsKI2lmZGVmIG5ldGJzZDEKI2RlZmluZSBDUCh4KQkoKGNoYXIgKikoeCkpCiAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICAgICAgKmNwOwogICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzb2NrYWRkciAqc2E7CiAgICAgICAgICAgICAgICAgICAgY3AgPSAoQ1AoaW5faWZhZGRyLmlhX2lmYS5pZmFfYWRkcikgLSBDUChpYSkpICsKICAgICAgICAgICAgICAgICAgICAgICAgQ1AoJmluX2lmYWRkcik7CiAgICAgICAgICAgICAgICAgICAgc2EgPSAoc3RydWN0IHNvY2thZGRyICopIGNwOwoKICAgICAgICAgICAgICAgICAgICBpZiAoc2EtPnNhX2ZhbWlseSA9PSBBRl9JTkVUKQojZW5kaWYKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluX2lmYWRkci5pYV9pZnAgPT0gaWZuZXRhZGRyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNfaXBhZGRyID0gMTsgICAgIC8qIHRoaXMgSUYgaGFzIElQLWFkZHJlc3MgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiNpZmRlZiBuZXRic2QxCiAgICAgICAgICAgICAgICBpYSA9IChzdHJ1Y3QgaW5faWZhZGRyICopIGluX2lmYWRkci5pYV9pZmEuaWZhX2xpc3QuCiAgICAgICAgICAgICAgICAgICAgdHFlX25leHQ7CiNlbHNlCiAgICAgICAgICAgICAgICBpYSA9IGluX2lmYWRkci5pYV9uZXh0OwojZW5kaWYKICAgICAgICAgICAgfQoKI2lmICFkZWZpbmVkKG5ldGJzZDEpICYmICFkZWZpbmVkKGZyZWVic2QyKSAmJiAhZGVmaW5lZChvcGVuYnNkMikgJiYgIWRlZmluZWQoSEFWRV9TVFJVQ1RfSUZORVRfSUZfQUREUkxJU1QpCiAgICAgICAgICAgIGlmbmV0LmlmX2FkZHJsaXN0ID0gKHN0cnVjdCBpZmFkZHIgKikgaWE7ICAgLyogV1JPTkcgREFUQSBUWVBFOyBPTkxZIEEgRkxBRyAqLwojZW5kaWYKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogaWZuZXQuaWZfYWRkcmxpc3QgPSAoc3RydWN0IGlmYWRkciAqKSZpYS0+aWFfaWZhOyAgIAogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBXUk9ORyBEQVRBIFRZUEU7IE9OTFkgQSBGTEFHIAogICAgICAgICAgICAgKi8KCiAgICAgICAgICAgIGlmIChJbmRleCkKICAgICAgICAgICAgICAgICpJbmRleCA9ICsrc2F2ZUluZGV4OwogICAgICAgICAgICBpZiAoUmV0aWZuZXQpCiAgICAgICAgICAgICAgICAqUmV0aWZuZXQgPSBpZm5ldDsKICAgICAgICAgICAgaWYgKFJldGluX2lmYWRkciAmJiBoYXNfaXBhZGRyKSAgICAgLyogYXNzaWduIHRoZSBpbl9pZmFkZHIgb25seQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBpZiB0aGUgSUYgaGFzIElQLWFkZHJlc3MgKi8KICAgICAgICAgICAgICAgICpSZXRpbl9pZmFkZHIgPSBpbl9pZmFkZHI7CiAgICAgICAgICAgIGlmIChOYW1lKQogICAgICAgICAgICAgICAgc3RyY3B5KE5hbWUsIHNhdmVOYW1lKTsKICAgICAgICAgICAgc2F2ZWlmbmV0ID0gaWZuZXQ7CiAgICAgICAgICAgIHNhdmVpZm5ldGFkZHIgPSBpZm5ldGFkZHI7CiAgICAgICAgICAgIHNhdmVpbl9pZmFkZHIgPSBpbl9pZmFkZHI7CiAgICAgICAgICAgIGlmbmV0YWRkciA9IGlmbmV0LmlmX25leHQ7CgogICAgICAgICAgICByZXR1cm4gKDEpOyAgICAgICAgIC8qIERPTkUgKi8KICAgICAgICB9CiAgICAgICAgaWZuZXRhZGRyID0gaWZuZXQuaWZfbmV4dDsKICAgIH0KICAgIHJldHVybiAoMCk7ICAgICAgICAgICAgICAgICAvKiBFT0YgKi8KfQoKI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBocHV4MTEgKi8KCiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3VuVjMgfHwgbGludXggKi8KCiNpZiBkZWZpbmVkKGhwdXgxMSkKCnN0YXRpYyBpbnQKSW50ZXJmYWNlX1NjYW5fQnlfSW5kZXgoaW50IEluZGV4LCBjaGFyICpOYW1lLCBubWFwaV9waHlzdGF0ICogUmV0aWZuZXQpCnsKICAgIGludCAgICAgICAgICAgaTsKCiAgICBJbnRlcmZhY2VfU2Nhbl9Jbml0KCk7CiAgICB3aGlsZSAoSW50ZXJmYWNlX1NjYW5fTmV4dEludCgmaSwgTmFtZSwgUmV0aWZuZXQpKSB7CiAgICAgICAgaWYgKGkgPT0gSW5kZXgpCiAgICAgICAgICAgIGJyZWFrOwogICAgfQogICAgaWYgKGkgIT0gSW5kZXgpCiAgICAgICAgcmV0dXJuICgtMSk7ICAgICAgICAgICAgLyogRXJyb3IsIGRvZXNuJ3QgZXhpc3QgKi8KICAgIHJldHVybiAoMCk7ICAgICAgICAgICAgICAgICAvKiBET05FICovCn0KCiNlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaHB1eDExICovCgpzdGF0aWMgaW50CkludGVyZmFjZV9TY2FuX0J5X0luZGV4KGludCBJbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGlmbmV0ICpSZXRpZm5ldCwKICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGluX2lmYWRkciAqUmV0aW5faWZhZGRyKQp7CiAgICBpbnQgICAgICAgICAgIGk7CgogICAgSW50ZXJmYWNlX1NjYW5fSW5pdCgpOwogICAgd2hpbGUgKEludGVyZmFjZV9TY2FuX05leHRJbnQoJmksIE5hbWUsIFJldGlmbmV0LCBSZXRpbl9pZmFkZHIpKSB7CiAgICAgICAgaWYgKGkgPT0gSW5kZXgpCiAgICAgICAgICAgIGJyZWFrOwogICAgfQogICAgaWYgKGkgIT0gSW5kZXgpCiAgICAgICAgcmV0dXJuICgtMSk7ICAgICAgICAgICAgLyogRXJyb3IsIGRvZXNuJ3QgZXhpc3QgKi8KICAgIHJldHVybiAoMCk7ICAgICAgICAgICAgICAgICAvKiBET05FICovCn0KCiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaHB1eDExICovCgpzdGF0aWMgaW50ICAgICAgSW50ZXJmYWNlX0NvdW50ID0gMDsKCiNpZiBkZWZpbmVkKGhwdXgxMSkKCmludApJbnRlcmZhY2VfU2Nhbl9HZXRfQ291bnQodm9pZCkKewogICAgaWYgKCFJbnRlcmZhY2VfQ291bnQpIHsKICAgICAgICBpbnQgICAgICAgICAgICAgZmQ7CiAgICAgICAgc3RydWN0IG5tcGFybXMgIHA7CiAgICAgICAgaW50ICAgICAgICAgICAgIHZhbDsKICAgICAgICB1bnNpZ25lZCBpbnQgICAgdWxlbjsKICAgICAgICBpbnQgICAgICAgICAgICAgcmV0OwoKICAgICAgICBpZiAoKGZkID0gb3Blbl9taWIoIi9kZXYvaXAiLCBPX1JET05MWSwgMCwgTk1fQVNZTkNfT0ZGKSkgPj0gMCkgewogICAgICAgICAgICBwLm9iamlkID0gSURfaWZOdW1iZXI7CiAgICAgICAgICAgIHAuYnVmZmVyID0gKHZvaWQgKikgJnZhbDsKICAgICAgICAgICAgdWxlbiA9IHNpemVvZihpbnQpOwogICAgICAgICAgICBwLmxlbiA9ICZ1bGVuOwogICAgICAgICAgICBpZiAoKHJldCA9IGdldF9taWJfaW5mbyhmZCwgJnApKSA9PSAwKQogICAgICAgICAgICAgICAgSW50ZXJmYWNlX0NvdW50ID0gdmFsOwogICAgICAgICAgICBjbG9zZV9taWIoZmQpOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAoSW50ZXJmYWNlX0NvdW50KTsKfQoKI2Vsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBocHV4MTEgKi8KCmludApJbnRlcmZhY2VfU2Nhbl9HZXRfQ291bnQodm9pZCkKewogICAgc3RhdGljIHRpbWVfdCAgIHNjYW5fdGltZSA9IDA7CiAgICB0aW1lX3QgICAgICAgICAgdGltZV9ub3cgPSB0aW1lKE5VTEwpOwoKICAgIGlmICghSW50ZXJmYWNlX0NvdW50IHx8ICh0aW1lX25vdyA+IHNjYW5fdGltZSArIDYwKSkgewogICAgICAgIHNjYW5fdGltZSA9IHRpbWVfbm93OwogICAgICAgIEludGVyZmFjZV9TY2FuX0luaXQoKTsKICAgICAgICBJbnRlcmZhY2VfQ291bnQgPSAwOwogICAgICAgIHdoaWxlIChJbnRlcmZhY2VfU2Nhbl9OZXh0SW50KE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpICE9IDApIHsKICAgICAgICAgICAgSW50ZXJmYWNlX0NvdW50Kys7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIChJbnRlcmZhY2VfQ291bnQpOwp9CgoKc3RhdGljIGludApJbnRlcmZhY2VfR2V0X0V0aGVyX0J5X0luZGV4KGludCBJbmRleCwgdV9jaGFyICogRXRoZXJBZGRyKQp7CiAgICBpbnQgICAgICAgICAgICAgaTsKI2lmICEoZGVmaW5lZChsaW51eCkgfHwgZGVmaW5lZChuZXRic2QxKSB8fCBkZWZpbmVkKGJzZGkyKSB8fCBkZWZpbmVkKG9wZW5ic2QyKSkKICAgIHN0cnVjdCBhcnBjb20gICBhcnBjb207CiNlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaXMgbGludXggb3IgbmV0YnNkMSAqLwogICAgc3RydWN0IGFycGNvbSB7CiAgICAgICAgY2hhciAgICAgICAgICAgIGFjX2VuYWRkcls2XTsKICAgIH0gYXJwY29tOwojaWYgZGVmaW5lZChuZXRic2QxKSB8fCBkZWZpbmVkKGJzZGkyKSB8fCBkZWZpbmVkKG9wZW5ic2QyKQogICAgc3RydWN0IHNvY2thZGRyX2RsIHNhZGw7CiAgICBzdHJ1Y3QgaWZhZGRyICAgaWZhZGRyOwogICAgdV9sb25nICAgICAgICAgIGlmYWRkcmFkZHI7CiNlbmRpZgojZW5kaWYKCiNpZiBkZWZpbmVkKG1pcHMpIHx8IGRlZmluZWQoaHB1eCkgfHwgZGVmaW5lZChvc2Y0KSB8fCBkZWZpbmVkKG9zZjMpIHx8IGRlZmluZWQob3NmNSkKICAgIG1lbXNldChhcnBjb20uYWNfZW5hZGRyLCAwLCBzaXplb2YoYXJwY29tLmFjX2VuYWRkcikpOwojZWxzZQogICAgbWVtc2V0KCZhcnBjb20uYWNfZW5hZGRyLCAwLCBzaXplb2YoYXJwY29tLmFjX2VuYWRkcikpOwojZW5kaWYKICAgIG1lbXNldChFdGhlckFkZHIsIDAsIHNpemVvZihhcnBjb20uYWNfZW5hZGRyKSk7CgogICAgaWYgKHNhdmVJbmRleCAhPSBJbmRleCkgeyAgIC8qIE9wdGltaXphdGlvbiEgKi8KCiAgICAgICAgSW50ZXJmYWNlX1NjYW5fSW5pdCgpOwoKICAgICAgICB3aGlsZSAoSW50ZXJmYWNlX1NjYW5fTmV4dEludCgmaSwgTlVMTCwgTlVMTCwgTlVMTCkgIT0gMCkgewogICAgICAgICAgICBpZiAoaSA9PSBJbmRleCkKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBpZiAoaSAhPSBJbmRleCkKICAgICAgICAgICAgcmV0dXJuICgtMSk7ICAgICAgICAvKiBFcnJvciwgZG9lc24ndCBleGlzdCAqLwogICAgfQojaWZkZWYgZnJlZWJzZDIKICAgIGlmIChzYXZlaWZuZXQuaWZfdHlwZSAhPSBJRlRfRVRIRVIpIHsKICAgICAgICByZXR1cm4gKDApOyAgICAgICAgICAgICAvKiBOb3QgYW4gZXRoZXJuZXQgaWYgKi8KICAgIH0KI2VuZGlmCiAgICAvKgogICAgICogIHRoZSBhcnBjb20gc3RydWN0dXJlIGlzIGFuIGV4dGVuZGVkIGlmbmV0IHN0cnVjdHVyZSB3aGljaAogICAgICogIGNvbnRhaW5zIHRoZSBldGhlcm5ldCBhZGRyZXNzLgogICAgICovCiNpZm5kZWYgbGludXgKI2lmICEoZGVmaW5lZChuZXRic2QxKSB8fCBkZWZpbmVkKGJzZGkyKSB8fCBkZWZpbmVkKG9wZW5ic2QyKSkKICAgIGlmICghTkVUU05NUF9LTE9PS1VQKHNhdmVpZm5ldGFkZHIsIChjaGFyICopICZhcnBjb20sIHNpemVvZiBhcnBjb20pKSB7CiAgICAgICAgREVCVUdNU0dUTCgoIm1pYklJL2ludGVyZmFjZXM6SW50ZXJmYWNlX0dldF9FdGhlcl9CeV9JbmRleCIsICJrbG9va3VwIGZhaWxlZFxuIikpOwogICAgICAgIHJldHVybiAwOwogICAgfQojZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5ldGJzZDEgb3IgYnNkaTIgb3Igb3BlbmJzZDIgKi8KCiNpZiBkZWZpbmVkKG5ldGJzZDEpIHx8IGRlZmluZWQob3BlbmJzZDIpCiNkZWZpbmUgaWZfYWRkcmxpc3QgaWZfYWRkcmxpc3QudHFoX2ZpcnN0CiNkZWZpbmUgaWZhX25leHQgICAgaWZhX2xpc3QudHFlX25leHQKI2VuZGlmCgogICAgaWZhZGRyYWRkciA9ICh1bnNpZ25lZCBsb25nKSBzYXZlaWZuZXQuaWZfYWRkcmxpc3Q7CiAgICB3aGlsZSAoaWZhZGRyYWRkcikgewogICAgICAgIGlmICghTkVUU05NUF9LTE9PS1VQKGlmYWRkcmFkZHIsIChjaGFyICopICZpZmFkZHIsIHNpemVvZiBpZmFkZHIpKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJtaWJJSS9pbnRlcmZhY2VzOkludGVyZmFjZV9HZXRfRXRoZXJfQnlfSW5kZXgiLCAia2xvb2t1cCBmYWlsZWRcbiIpKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGlmICghTkVUU05NUF9LTE9PS1VQKGlmYWRkci5pZmFfYWRkciwgKGNoYXIgKikgJnNhZGwsIHNpemVvZiBzYWRsKSkgewogICAgICAgICAgICBERUJVR01TR1RMKCgibWliSUkvaW50ZXJmYWNlczpJbnRlcmZhY2VfR2V0X0V0aGVyX0J5X0luZGV4IiwgImtsb29rdXAgZmFpbGVkXG4iKSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBpZiAoc2FkbC5zZGxfZmFtaWx5ID09IEFGX0xJTksKICAgICAgICAgICAgJiYgKHNhdmVpZm5ldC5pZl90eXBlID09IElGVF9FVEhFUgogICAgICAgICAgICAgICAgfHwgc2F2ZWlmbmV0LmlmX3R5cGUgPT0gSUZUX0lTTzg4MDI1CiAgICAgICAgICAgICAgICB8fCBzYXZlaWZuZXQuaWZfdHlwZSA9PSBJRlRfRkRESSkpIHsKICAgICAgICAgICAgbWVtY3B5KGFycGNvbS5hY19lbmFkZHIsIHNhZGwuc2RsX2RhdGEgKyBzYWRsLnNkbF9ubGVuLAogICAgICAgICAgICAgICAgICAgc2l6ZW9mKGFycGNvbS5hY19lbmFkZHIpKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGlmYWRkcmFkZHIgPSAodW5zaWduZWQgbG9uZykgaWZhZGRyLmlmYV9uZXh0OwogICAgfQojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5ldGJzZDEgb3IgYnNkaTIgb3Igb3BlbmJzZDIgKi8KCiNlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGludXggKi8KICAgIG1lbWNweShhcnBjb20uYWNfZW5hZGRyLCBzYXZlaWZuZXRhZGRyLT5pZl9od2FkZHIsIDYpOwojZW5kaWYKICAgIGlmIChzdHJuY21wKCJsbyIsIHNhdmVOYW1lLCAyKSA9PSAwKSB7CiAgICAgICAgLyoKICAgICAgICAgKiAgTG9vcGJhY2sgZG9lc24ndCBoYXZlIGEgSFcgYWRkciwgc28gcmV0dXJuIDAwOjAwOjAwOjAwOjAwOjAwCiAgICAgICAgICovCiAgICAgICAgbWVtc2V0KEV0aGVyQWRkciwgMCwgc2l6ZW9mKGFycGNvbS5hY19lbmFkZHIpKTsKCiAgICB9IGVsc2UgewoKI2lmIGRlZmluZWQobWlwcykgfHwgZGVmaW5lZChocHV4KSB8fCBkZWZpbmVkKG9zZjQpIHx8IGRlZmluZWQob3NmMykKICAgICAgICBtZW1jcHkoRXRoZXJBZGRyLCAoY2hhciAqKSBhcnBjb20uYWNfZW5hZGRyLAogICAgICAgICAgICAgICBzaXplb2YoYXJwY29tLmFjX2VuYWRkcikpOwojZWxzZQogICAgICAgIG1lbWNweShFdGhlckFkZHIsIChjaGFyICopICZhcnBjb20uYWNfZW5hZGRyLAogICAgICAgICAgICAgICBzaXplb2YoYXJwY29tLmFjX2VuYWRkcikpOwojZW5kaWYKCgogICAgfQogICAgcmV0dXJuICgwKTsgICAgICAgICAgICAgICAgIC8qIERPTkUgKi8KfQoKI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBocHV4MTEgKi8KCiNlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc29sYXJpczIgKi8KCmludApJbnRlcmZhY2VfU2Nhbl9HZXRfQ291bnQodm9pZCkKewogICAgaW50ICAgICAgICAgICAgIGksIHNkOwoKICAgIGlmICgoc2QgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19ER1JBTSwgMCkpIDwgMCkKICAgICAgICByZXR1cm4gKDApOwogICAgaWYgKGlvY3RsKHNkLCBTSU9DR0lGTlVNLCAmaSkgPT0gLTEpIHsKICAgICAgICBjbG9zZShzZCk7CiAgICAgICAgcmV0dXJuICgwKTsKICAgIH0gZWxzZSB7CiAgICAgICAgY2xvc2Uoc2QpOwogICAgICAgIHJldHVybiAoaSk7CiAgICB9Cn0KCmludApJbnRlcmZhY2VfSW5kZXhfQnlfTmFtZShjaGFyICpOYW1lLCBpbnQgTGVuKQp7CiAgICByZXR1cm4gKHNvbGFyaXMyX2lmX25hbWV0b2luZGV4KE5hbWUsIExlbikpOwp9CgojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNvbGFyaXMyICovCgojZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEhBVkVfTkVUX0lGX01JQl9IICovCgovKgogKiBUaGlzIGNvZGUgYXR0ZW1wdHMgdG8gZG8gdGhlIHJpZ2h0IHRoaW5nIGZvciBGcmVlQlNELiAgTm90ZSB0aGF0CiAqIHRoZSBzdGF0aXN0aWNzIGNvdWxkIGJlIGdhdGhlcmVkIHRocm91Z2ggdXNlIG9mIG9mIHRoZQogKiBuZXQucm91dGUuMC5saW5rLmlmbGlzdC4wIHN5c2N0bCAod2hpY2ggd2UgYWxyZWFkeSB1c2UgdG8gZ2V0IHRoZQogKiBoYXJkd2FyZSBhZGRyZXNzIG9mIHRoZSBpbnRlcmZhY2VzKSwgcmF0aGVyIHRoYW4gdXNpbmcgdGhlIGlmbWliCiAqIGNvZGUsIGJ1dCBldmVudHVhbGx5IEkgd2lsbCBpbXBsZW1lbnQgZG90M1N0YXRzIGFuZCB3ZSB3aWxsIGhhdmUgdG8KICogdXNlIHRoZSBpZm1pYiBpbnRlcmZhY2UuICBpZm1pYiBpcyBhbHNvIGEgbXVjaCBtb3JlIG5hdHVyYWwgd2F5IG9mCiAqIG1hcHBpbmcgdGhlIFNOTVAgTUlCIG9udG8gc3lzY3RsKDMpLgogKi8KCiNpbmNsdWRlIDxuZXQvaWYuaD4KI2luY2x1ZGUgPG5ldC9pZl9kbC5oPgojaW5jbHVkZSA8bmV0L2lmX21pYi5oPgojaW5jbHVkZSA8bmV0L3JvdXRlLmg+CgpzdGF0aWMgaW50ICAgICAgaGVhZGVyX2ludGVyZmFjZXMoc3RydWN0IHZhcmlhYmxlICosIG9pZCAqLCBzaXplX3QgKiwgaW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICosIFdyaXRlTWV0aG9kICoqIHdyaXRlKTsKc3RhdGljIGludCAgICAgIGhlYWRlcl9pZkVudHJ5KHN0cnVjdCB2YXJpYWJsZSAqLCBvaWQgKiwgc2l6ZV90ICosIGludCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqLCBXcml0ZU1ldGhvZCAqKiB3cml0ZSk7CnVfY2hhciAgICAgICAgICp2YXJfaWZFbnRyeShzdHJ1Y3QgdmFyaWFibGUgKiwgb2lkICosIHNpemVfdCAqLCBpbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKiwgV3JpdGVNZXRob2QgKiogd3JpdGUpOwoKc3RhdGljIGNoYXIgICAgKnBoeXNhZGRyYnVmOwpzdGF0aWMgaW50ICAgICAgbnBoeXNhZGRyczsKc3RydWN0IHNvY2thZGRyX2RsICoqcGh5c2FkZHJzOwoKdm9pZAppbml0X2ludGVyZmFjZXNfc2V0dXAodm9pZCkKewogICAgaW50ICAgICAgICAgICAgIG5hZGRycywgaWxlbiwgYml0OwogICAgc3RhdGljIGludCAgICAgIG1pYls2XQogICAgPSB7IENUTF9ORVQsIFBGX1JPVVRFLCAwLCBBRl9MSU5LLCBORVRfUlRfSUZMSVNULCAwIH07CiAgICBjaGFyICAgICAgICAgICAqY3A7CiAgICBzaXplX3QgICAgICAgICAgbGVuOwogICAgc3RydWN0IHJ0X21zZ2hkciAqcnRtOwogICAgc3RydWN0IGlmX21zZ2hkciAqaWZtOwogICAgc3RydWN0IGlmYV9tc2doZHIgKmlmYW07CiAgICBzdHJ1Y3Qgc29ja2FkZHIgKnNhOwoKICAgIERFQlVHTVNHVEwoKCJtaWJJSTpmcmVlYnNkIiwgImluaXRfaW50ZXJmYWNlc19zZXR1cFxuIikpOwoKICAgIG5hZGRycyA9IDA7CiAgICBpZiAocGh5c2FkZHJzKQogICAgICAgIGZyZWUocGh5c2FkZHJzKTsKICAgIGlmIChwaHlzYWRkcmJ1ZikKICAgICAgICBmcmVlKHBoeXNhZGRyYnVmKTsKICAgIHBoeXNhZGRyYnVmID0gMDsKICAgIHBoeXNhZGRycyA9IDA7CiAgICBucGh5c2FkZHJzID0gMDsKICAgIGxlbiA9IDA7CiAgICBpZiAoc3lzY3RsKG1pYiwgNiwgMCwgJmxlbiwgMCwgMCkgPCAwKSB7CiAgICAgICAgREVCVUdNU0dUTCgoIm1pYklJOmZyZWVic2QiLCAic3lzY3RsIDEgPCAwXG4iKSk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGNwID0gcGh5c2FkZHJidWYgPSBtYWxsb2MobGVuKTsKICAgIGlmIChwaHlzYWRkcmJ1ZiA9PSAwKQogICAgICAgIHJldHVybjsKICAgIGlmIChzeXNjdGwobWliLCA2LCBwaHlzYWRkcmJ1ZiwgJmxlbiwgMCwgMCkgPCAwKSB7CiAgICAgICAgZnJlZShwaHlzYWRkcmJ1Zik7CiAgICAgICAgcGh5c2FkZHJidWYgPSAwOwogICAgICAgIERFQlVHTVNHVEwoKCJtaWJJSTpmcmVlYnNkIiwgInN5c2N0bCAyIDwgMFxuIikpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgbG9vcDoKICAgIGlsZW4gPSBsZW47CiAgICBjcCA9IHBoeXNhZGRyYnVmOwogICAgd2hpbGUgKGlsZW4gPiAwKSB7CiAgICAgICAgcnRtID0gKHN0cnVjdCBydF9tc2doZHIgKikgY3A7CiAgICAgICAgaWYgKHJ0bS0+cnRtX3ZlcnNpb24gIT0gUlRNX1ZFUlNJT04gfHwgcnRtLT5ydG1fdHlwZSAhPSBSVE1fSUZJTkZPKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJtaWJJSTpmcmVlYnNkIiwgInZlcnNpb246JWQvJWQgdHlwZTolZC8lZFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgcnRtLT5ydG1fdmVyc2lvbiwgUlRNX1ZFUlNJT04sIHJ0bS0+cnRtX3R5cGUsIFJUTV9JRklORk8pKTsKICAgICAgICAgICAgZnJlZShwaHlzYWRkcnMpOwogICAgICAgICAgICBwaHlzYWRkcnMgPSAwOwogICAgICAgICAgICBmcmVlKHBoeXNhZGRyYnVmKTsKICAgICAgICAgICAgcGh5c2FkZHJidWYgPSAwOwogICAgICAgIH0KICAgICAgICBpZm0gPSAoc3RydWN0IGlmX21zZ2hkciAqKSBydG07CiNpZiBkZWZpbmVkKGZyZWVic2QzKSB8fCBkZWZpbmVkKGZyZWVic2Q0KSB8fCBkZWZpbmVkKGZyZWVic2Q1KQogICAgICAgIGlmIChwaHlzYWRkcnMgIT0gMCkKICAgICAgICAgICAgcGh5c2FkZHJzW25hZGRyc10gPSAodm9pZCAqKSAoaWZtICsgMSk7CiAgICAgICAgbmFkZHJzKys7CiNlbmRpZgogICAgICAgIGlsZW4gLT0gaWZtLT5pZm1fbXNnbGVuOwogICAgICAgIGNwICs9IGlmbS0+aWZtX21zZ2xlbjsKICAgICAgICBydG0gPSAoc3RydWN0IHJ0X21zZ2hkciAqKSBjcDsKICAgICAgICB3aGlsZSAoaWxlbiA+IDAgJiYgcnRtLT5ydG1fdHlwZSA9PSBSVE1fTkVXQUREUikgewojaWYgZGVmaW5lZChmcmVlYnNkMykgfHwgZGVmaW5lZChmcmVlYnNkNCkgfHwgZGVmaW5lZChmcmVlYnNkNSkKICAgICAgICAgICAgaWxlbiAtPSBydG0tPnJ0bV9tc2dsZW47CiAgICAgICAgICAgIGNwICs9IHJ0bS0+cnRtX21zZ2xlbjsKI2Vsc2UKICAgICAgICAgICAgaW50ICAgICAgICAgICAgIGlzX2FsaWFzID0gMDsKICAgICAgICAgICAgaWZhbSA9IChzdHJ1Y3QgaWZhX21zZ2hkciAqKSBydG07CiAgICAgICAgICAgIGlsZW4gLT0gc2l6ZW9mKCppZmFtKTsKICAgICAgICAgICAgY3AgKz0gc2l6ZW9mKCppZmFtKTsKICAgICAgICAgICAgc2EgPSAoc3RydWN0IHNvY2thZGRyICopIGNwOwojZGVmaW5lIFJPVU5EKHgpICgoKHgpICsgc2l6ZW9mKGxvbmcpIC0gMSkgJiB+c2l6ZW9mKGxvbmcpKQogICAgICAgICAgICBmb3IgKGJpdCA9IDE7IGJpdCAmJiBpbGVuID4gMDsgYml0IDw8PSAxKSB7CiAgICAgICAgICAgICAgICBpZiAoIShpZmFtLT5pZmFtX2FkZHJzICYgYml0KSkKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIGlsZW4gLT0gUk9VTkQoc2EtPnNhX2xlbik7CiAgICAgICAgICAgICAgICBjcCArPSBST1VORChzYS0+c2FfbGVuKTsKCiAgICAgICAgICAgICAgICBpZiAoYml0ID09IFJUQV9JRkEpIHsKICAgICAgICAgICAgICAgICAgICBpZiAocGh5c2FkZHJzKQojZGVmaW5lIHNhdG9zZGwoc2EpICgoc3RydWN0IHNvY2thZGRyX2RsICopKHNhKSkKICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2FkZHJzW25hZGRycysrXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBzYXRvc2RsKHNhKTsKICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIG5hZGRycysrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgc2EgPSAoc3RydWN0IHNvY2thZGRyICopIGNwOwogICAgICAgICAgICB9CiNlbmRpZgogICAgICAgICAgICBydG0gPSAoc3RydWN0IHJ0X21zZ2hkciAqKSBjcDsKICAgICAgICB9CiAgICB9CiAgICBERUJVR01TR1RMKCgibWliSUk6ZnJlZWJzZCIsICJmb3VuZCAlZCBhZGRyc1xuIiwgbmFkZHJzKSk7CiAgICBpZiAocGh5c2FkZHJzKSB7CiAgICAgICAgbnBoeXNhZGRycyA9IG5hZGRyczsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBwaHlzYWRkcnMgPSBtYWxsb2MobmFkZHJzICogc2l6ZW9mKCpwaHlzYWRkcnMpKTsKICAgIGlmIChwaHlzYWRkcnMgPT0gMCkKICAgICAgICByZXR1cm47CiAgICBuYWRkcnMgPSAwOwogICAgZ290byBsb29wOwoKfQoKc3RhdGljIGludApnZXRfcGh5c19hZGRyZXNzKGludCBpaW5kZXgsIGNoYXIgKiphcCwgaW50ICpsZW4pCnsKICAgIGludCAgICAgICAgICAgICBpOwogICAgaW50ICAgICAgICAgICAgIG9uY2UgPSAxOwoKICAgIGRvIHsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnBoeXNhZGRyczsgaSsrKSB7CiAgICAgICAgICAgIGlmIChwaHlzYWRkcnNbaV0tPnNkbF9pbmRleCA9PSBpaW5kZXgpCiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgaWYgKGkgPCBucGh5c2FkZHJzKQogICAgICAgICAgICBicmVhazsKICAgICAgICBpbml0X2ludGVyZmFjZXNfc2V0dXAoKTsKICAgIH0gd2hpbGUgKG9uY2UtLSk7CgogICAgREVCVUdNU0dUTCgoIm1pYklJOmZyZWVic2QiLCAiZ2V0X3BoeXNfYWRkcmVzcyAlZC8lZFxuIiwgaSwgbnBoeXNhZGRycykpOwogICAgaWYgKGkgPCBucGh5c2FkZHJzKSB7CiAgICAgICAgKmFwID0gTExBRERSKHBoeXNhZGRyc1tpXSk7CiAgICAgICAgKmxlbiA9IHBoeXNhZGRyc1tpXS0+c2RsX2FsZW47CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICByZXR1cm4gLTE7Cn0KCmludApJbnRlcmZhY2VfU2Nhbl9HZXRfQ291bnQodm9pZCkKewogICAgc3RhdGljIGludCAgICAgIGNvdW50X29pZFs1XSA9IHsgQ1RMX05FVCwgUEZfTElOSywgTkVUTElOS19HRU5FUklDLAogICAgICAgIElGTUlCX1NZU1RFTSwgSUZNSUJfSUZDT1VOVAogICAgfTsKICAgIHNpemVfdCAgICAgICAgICBsZW47CiAgICBpbnQgICAgICAgICAgICAgY291bnQ7CgogICAgbGVuID0gc2l6ZW9mIGNvdW50OwogICAgaWYgKHN5c2N0bChjb3VudF9vaWQsIDUsICZjb3VudCwgJmxlbiwgKHZvaWQgKikgMCwgKHNpemVfdCkgMCkgPCAwKSB7CiAgICAgICAgREVCVUdNU0dUTCgoIm1pYklJOmZyZWVic2QiLCAiSW50ZXJmYWNlX1NjYW5fR2V0X0NvdW50IGVyclxuIikpOwogICAgICAgIHJldHVybiAtMTsKICAgIH0KICAgIERFQlVHTVNHVEwoKCJtaWJJSTpmcmVlYnNkIiwgIkludGVyZmFjZV9TY2FuX0dldF9Db3VudCAlZFxuIiwgY291bnQpKTsKICAgIHJldHVybiBjb3VudDsKfQoKCnVfY2hhciAgICAgICAgICoKdmFyX2lmRW50cnkoc3RydWN0IHZhcmlhYmxlICogdnAsCiAgICAgICAgICAgIG9pZCAqIG5hbWUsCiAgICAgICAgICAgIHNpemVfdCAqIGxlbmd0aCwKICAgICAgICAgICAgaW50IGV4YWN0LCBzaXplX3QgKiB2YXJfbGVuLCBXcml0ZU1ldGhvZCAqKiB3cml0ZV9tZXRob2QpCnsKICAgIGludCAgICAgICAgICAgICBpbnRlcmZhY2U7CiAgICBzdGF0aWMgaW50ICAgICAgc25hbWVbNl0gPSB7IENUTF9ORVQsIFBGX0xJTkssIE5FVExJTktfR0VORVJJQywKICAgICAgICBJRk1JQl9JRkRBVEEsIDAsIElGREFUQV9HRU5FUkFMCiAgICB9OwogICAgc3RhdGljIHN0cnVjdCBpZm1pYmRhdGEgaWZtZDsKICAgIHNpemVfdCAgICAgICAgICBsZW47CiAgICBjaGFyICAgICAgICAgICAqY3A7CiAgICBjb25mX2lmX2xpc3QgICAqaWZfcHRyID0gTlVMTDsKCiAgICBpbnRlcmZhY2UgPSBoZWFkZXJfaWZFbnRyeSh2cCwgbmFtZSwgbGVuZ3RoLCBleGFjdCwgdmFyX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlX21ldGhvZCk7CiAgICBpZiAoaW50ZXJmYWNlID09IE1BVENIX0ZBSUxFRCkKICAgICAgICByZXR1cm4gTlVMTDsKCiAgICBzbmFtZVs0XSA9IGludGVyZmFjZTsKICAgIGxlbiA9IHNpemVvZiBpZm1kOwogICAgaWYgKHN5c2N0bChzbmFtZSwgNiwgJmlmbWQsICZsZW4sIDAsIDApIDwgMCkgewogICAgICAgIERFQlVHTVNHVEwoKCJtaWJJSTpmcmVlYnNkIiwgInZhcl9pZkVudHJ5IHN5c2N0bCBlcnJcbiIpKTsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KICAgIC8qCiAgICAgKiBobW1tLi4gd2hlcmUgdG8gZ2V0IHRoZSBpbnRlcmZhY2UgbmFtZSB0byBjaGVjayBvdmVycmlkZXM/CiAgICAgKgogICAgICogaWZfcHRyID0gbmV0c25tcF9hY2Nlc3NfaW50ZXJmYWNlX2VudHJ5X292ZXJyaWRlc19nZXQoTmFtZSk7CiAgICAgKi8KCiAgICBzd2l0Y2ggKHZwLT5tYWdpYykgewogICAgY2FzZSBORVRTTk1QX0lGSU5ERVg6CiAgICAgICAgbG9uZ19yZXR1cm4gPSBpbnRlcmZhY2U7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgTkVUU05NUF9JRkRFU0NSOgogICAgICAgIGNwID0gaWZtZC5pZm1kX25hbWU7CiAgICAgICAgKnZhcl9sZW4gPSBzdHJsZW4oY3ApOwogICAgICAgIHJldHVybiAodV9jaGFyICopIGNwOwogICAgY2FzZSBORVRTTk1QX0lGVFlQRToKICAgICAgICBpZiAoaWZfcHRyKQogICAgICAgICAgICBsb25nX3JldHVybiA9IGlmX3B0ci0+dHlwZTsKICAgICAgICBlbHNlCiAgICAgICAgbG9uZ19yZXR1cm4gPSBpZm1kLmlmbWRfZGF0YS5pZmlfdHlwZTsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGTVRVOgogICAgICAgIGxvbmdfcmV0dXJuID0gKGxvbmcpIGlmbWQuaWZtZF9kYXRhLmlmaV9tdHU7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgTkVUU05NUF9JRlNQRUVEOgogICAgICAgIGlmIChpZl9wdHIpCiAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gaWZfcHRyLT5zcGVlZDsKICAgICAgICBlbHNlCiAgICAgICAgbG9uZ19yZXR1cm4gPSBpZm1kLmlmbWRfZGF0YS5pZmlfYmF1ZHJhdGU7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgTkVUU05NUF9JRlBIWVNBRERSRVNTOgogICAgICAgIHsKICAgICAgICAgICAgY2hhciAgICAgICAgICAgKmNwOwogICAgICAgICAgICBpZiAoZ2V0X3BoeXNfYWRkcmVzcyhpbnRlcmZhY2UsICZjcCwgdmFyX2xlbikpCiAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgcmV0dXJuIGNwOwogICAgICAgIH0KICAgIGNhc2UgTkVUU05NUF9JRkFETUlOU1RBVFVTOgogICAgICAgIGxvbmdfcmV0dXJuID0gaWZtZC5pZm1kX2ZsYWdzICYgSUZGX1VQID8gMSA6IDI7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgTkVUU05NUF9JRk9QRVJTVEFUVVM6CiAgICAgICAgbG9uZ19yZXR1cm4gPSBpZm1kLmlmbWRfZmxhZ3MgJiBJRkZfUlVOTklORyA/IDEgOiAyOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIE5FVFNOTVBfSUZMQVNUQ0hBTkdFOgogICAgICAgIGlmIChpZm1kLmlmbWRfZGF0YS5pZmlfbGFzdGNoYW5nZS50dl9zZWMgPT0gMCAmJgogICAgICAgICAgICBpZm1kLmlmbWRfZGF0YS5pZmlfbGFzdGNoYW5nZS50dl91c2VjID09IDApIHsKICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSAwOwogICAgICAgIH0gZWxzZSBpZiAoaWZtZC5pZm1kX2RhdGEuaWZpX2xhc3RjaGFuZ2UudHZfc2VjIDwgc3RhcnR0aW1lLnR2X3NlYykgewogICAgICAgICAgICBsb25nX3JldHVybiA9IDA7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSAodV9sb25nKQogICAgICAgICAgICAgICAgKChpZm1kLmlmbWRfZGF0YS5pZmlfbGFzdGNoYW5nZS50dl9zZWMgLQogICAgICAgICAgICAgICAgICBzdGFydHRpbWUudHZfc2VjKSAqIDEwMCArCiAgICAgICAgICAgICAgICAgKChpZm1kLmlmbWRfZGF0YS5pZmlfbGFzdGNoYW5nZS50dl91c2VjIC0KICAgICAgICAgICAgICAgICAgIHN0YXJ0dGltZS50dl91c2VjKSAvIDEwMDAwKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIE5FVFNOTVBfSUZJTk9DVEVUUzoKICAgICAgICBsb25nX3JldHVybiA9ICh1X2xvbmcpIGlmbWQuaWZtZF9kYXRhLmlmaV9pYnl0ZXM7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgTkVUU05NUF9JRklOVUNBU1RQS1RTOgogICAgICAgIGxvbmdfcmV0dXJuID0gKHVfbG9uZykgaWZtZC5pZm1kX2RhdGEuaWZpX2lwYWNrZXRzOwogICAgICAgIGxvbmdfcmV0dXJuIC09ICh1X2xvbmcpIGlmbWQuaWZtZF9kYXRhLmlmaV9pbWNhc3RzOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIE5FVFNOTVBfSUZJTk5VQ0FTVFBLVFM6CiAgICAgICAgbG9uZ19yZXR1cm4gPSAodV9sb25nKSBpZm1kLmlmbWRfZGF0YS5pZmlfaW1jYXN0czsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGSU5ESVNDQVJEUzoKICAgICAgICBsb25nX3JldHVybiA9ICh1X2xvbmcpIGlmbWQuaWZtZF9kYXRhLmlmaV9pcWRyb3BzOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIE5FVFNOTVBfSUZJTkVSUk9SUzoKICAgICAgICBsb25nX3JldHVybiA9IGlmbWQuaWZtZF9kYXRhLmlmaV9pZXJyb3JzOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIE5FVFNOTVBfSUZJTlVOS05PV05QUk9UT1M6CiAgICAgICAgbG9uZ19yZXR1cm4gPSAodV9sb25nKSBpZm1kLmlmbWRfZGF0YS5pZmlfbm9wcm90bzsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGT1VUT0NURVRTOgogICAgICAgIGxvbmdfcmV0dXJuID0gKHVfbG9uZykgaWZtZC5pZm1kX2RhdGEuaWZpX29ieXRlczsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGT1VUVUNBU1RQS1RTOgogICAgICAgIGxvbmdfcmV0dXJuID0gKHVfbG9uZykgaWZtZC5pZm1kX2RhdGEuaWZpX29wYWNrZXRzOwogICAgICAgIGxvbmdfcmV0dXJuIC09ICh1X2xvbmcpIGlmbWQuaWZtZF9kYXRhLmlmaV9vbWNhc3RzOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIE5FVFNOTVBfSUZPVVROVUNBU1RQS1RTOgogICAgICAgIGxvbmdfcmV0dXJuID0gKHVfbG9uZykgaWZtZC5pZm1kX2RhdGEuaWZpX29tY2FzdHM7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgTkVUU05NUF9JRk9VVERJU0NBUkRTOgogICAgICAgIGxvbmdfcmV0dXJuID0gaWZtZC5pZm1kX3NuZF9kcm9wczsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGT1VURVJST1JTOgogICAgICAgIGxvbmdfcmV0dXJuID0gaWZtZC5pZm1kX2RhdGEuaWZpX29lcnJvcnM7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgTkVUU05NUF9JRk9VVFFMRU46CiAgICAgICAgbG9uZ19yZXR1cm4gPSBpZm1kLmlmbWRfc25kX2xlbjsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGU1BFQ0lGSUM6CiAgICAgICAgKnZhcl9sZW4gPSBudWxsT2lkTGVuOwogICAgICAgIHJldHVybiAodV9jaGFyICopIG51bGxPaWQ7CiAgICBkZWZhdWx0OgogICAgICAgIERFQlVHTVNHVEwoKCJzbm1wZCIsICJ1bmtub3duIHN1Yi1pZCAlZCBpbiB2YXJfaWZFbnRyeVxuIiwKICAgICAgICAgICAgICAgICAgICB2cC0+bWFnaWMpKTsKICAgIH0KICAgIHJldHVybiBOVUxMOwp9CgojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEhBVkVfTkVUX0lGX01JQl9IICovCiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIVVTRV9TWVNDVExfSUZMSVNUICovCgojZWxpZiBkZWZpbmVkKEhBVkVfSVBITFBBUElfSCkgIC8qIFdJTjMyIGN5Z3dpbiAqLwojaW5jbHVkZSA8aXBobHBhcGkuaD4KCldyaXRlTWV0aG9kICAgICB3cml0ZUlmRW50cnk7CmxvbmcgICAgICAgICAgICBhZG1pbl9zdGF0dXMgPSAwOwpsb25nICAgICAgICAgICAgb2xkYWRtaW5fc3RhdHVzID0gMDsKCnN0YXRpYyBpbnQKaGVhZGVyX2lmRW50cnkoc3RydWN0IHZhcmlhYmxlICp2cCwKICAgICAgICAgICAgICAgb2lkICogbmFtZSwKICAgICAgICAgICAgICAgc2l6ZV90ICogbGVuZ3RoLAogICAgICAgICAgICAgICBpbnQgZXhhY3QsIHNpemVfdCAqIHZhcl9sZW4sIFdyaXRlTWV0aG9kICoqIHdyaXRlX21ldGhvZCkKewojZGVmaW5lIElGRU5UUllfTkFNRV9MRU5HVEgJMTAKICAgIG9pZCAgICAgICAgICAgICBuZXduYW1lW01BWF9PSURfTEVOXTsKICAgIHJlZ2lzdGVyIGludCAgICBpZkluZGV4OwogICAgaW50ICAgICAgICAgICAgIHJlc3VsdCwgY291bnQ7CiAgICBEV09SRCAgICAgICAgICAgc3RhdHVzID0gTk9fRVJST1I7CiAgICBEV09SRCAgICAgICAgICAgZHdBY3R1YWxTaXplID0gMDsKICAgIFBNSUJfSUZUQUJMRSAgICBwSWZUYWJsZSA9IE5VTEw7CgogICAgREVCVUdNU0dUTCgoIm1pYklJL2ludGVyZmFjZXMiLCAidmFyX2lmRW50cnk6ICIpKTsKICAgIERFQlVHTVNHT0lEKCgibWliSUkvaW50ZXJmYWNlcyIsIG5hbWUsICpsZW5ndGgpKTsKICAgIERFQlVHTVNHKCgibWliSUkvaW50ZXJmYWNlcyIsICIgJWRcbiIsIGV4YWN0KSk7CgogICAgbWVtY3B5KChjaGFyICopIG5ld25hbWUsIChjaGFyICopIHZwLT5uYW1lLAogICAgICAgICAgIChpbnQpIHZwLT5uYW1lbGVuICogc2l6ZW9mKG9pZCkpOwogICAgLyoKICAgICAqIGZpbmQgIm5leHQiIGlmSW5kZXggCiAgICAgKi8KCiAgICBzdGF0dXMgPSBHZXRJZlRhYmxlKHBJZlRhYmxlLCAmZHdBY3R1YWxTaXplLCBUUlVFKTsKICAgIGlmIChzdGF0dXMgPT0gRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUikgewogICAgICAgIHBJZlRhYmxlID0gbWFsbG9jKGR3QWN0dWFsU2l6ZSk7CiAgICAgICAgaWYgKHBJZlRhYmxlKQogICAgICAgICAgICBHZXRJZlRhYmxlKHBJZlRhYmxlLCAmZHdBY3R1YWxTaXplLCBUUlVFKTsKICAgIH0KICAgIGNvdW50ID0gcElmVGFibGUtPmR3TnVtRW50cmllczsKICAgIGZvciAoaWZJbmRleCA9IDA7IGlmSW5kZXggPCBjb3VudDsgaWZJbmRleCsrKSB7CiAgICAgICAgbmV3bmFtZVtJRkVOVFJZX05BTUVfTEVOR1RIXSA9CiAgICAgICAgICAgIChvaWQpIHBJZlRhYmxlLT50YWJsZVtpZkluZGV4XS5kd0luZGV4OwogICAgICAgIHJlc3VsdCA9CiAgICAgICAgICAgIHNubXBfb2lkX2NvbXBhcmUobmFtZSwgKmxlbmd0aCwgbmV3bmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSB2cC0+bmFtZWxlbiArIDEpOwogICAgICAgIGlmICgoZXhhY3QgJiYgKHJlc3VsdCA9PSAwKSkgfHwgKCFleGFjdCAmJiAocmVzdWx0IDwgMCkpKQogICAgICAgICAgICBicmVhazsKICAgIH0KICAgIGlmIChpZkluZGV4ID49IGNvdW50KSB7CiAgICAgICAgREVCVUdNU0dUTCgoIm1pYklJL2ludGVyZmFjZXMiLCAiLi4uIGluZGV4IG91dCBvZiByYW5nZVxuIikpOwogICAgICAgIGNvdW50ID0gTUFUQ0hfRkFJTEVEOwogICAgICAgIGdvdG8gb3V0OwogICAgfQoKICAgIG1lbWNweSgoY2hhciAqKSBuYW1lLCAoY2hhciAqKSBuZXduYW1lLAogICAgICAgICAgICgoaW50KSB2cC0+bmFtZWxlbiArIDEpICogc2l6ZW9mKG9pZCkpOwogICAgKmxlbmd0aCA9IHZwLT5uYW1lbGVuICsgMTsKICAgICp3cml0ZV9tZXRob2QgPSAwOwogICAgKnZhcl9sZW4gPSBzaXplb2YobG9uZyk7ICAgIC8qIGRlZmF1bHQgdG8gJ2xvbmcnIHJlc3VsdHMgKi8KCiAgICBERUJVR01TR1RMKCgibWliSUkvaW50ZXJmYWNlcyIsICIuLi4gZ2V0IEkvRiBzdGF0cyAiKSk7CiAgICBERUJVR01TR09JRCgoIm1pYklJL2ludGVyZmFjZXMiLCBuYW1lLCAqbGVuZ3RoKSk7CiAgICBERUJVR01TRygoIm1pYklJL2ludGVyZmFjZXMiLCAiXG4iKSk7CgogICAgY291bnQgPSBwSWZUYWJsZS0+dGFibGVbaWZJbmRleF0uZHdJbmRleDsKb3V0OgogICAgZnJlZShwSWZUYWJsZSk7CiAgICByZXR1cm4gY291bnQ7Cn0KCgoKdV9jaGFyICAgICAgICAgKgp2YXJfaW50ZXJmYWNlcyhzdHJ1Y3QgdmFyaWFibGUgKiB2cCwKICAgICAgICAgICAgICAgb2lkICogbmFtZSwKICAgICAgICAgICAgICAgc2l6ZV90ICogbGVuZ3RoLAogICAgICAgICAgICAgICBpbnQgZXhhY3QsIHNpemVfdCAqIHZhcl9sZW4sIFdyaXRlTWV0aG9kICoqIHdyaXRlX21ldGhvZCkKewogICAgaWYgKGhlYWRlcl9nZW5lcmljKHZwLCBuYW1lLCBsZW5ndGgsIGV4YWN0LCB2YXJfbGVuLCB3cml0ZV9tZXRob2QpID09CiAgICAgICAgTUFUQ0hfRkFJTEVEKQogICAgICAgIHJldHVybiBOVUxMOwoKICAgIHN3aXRjaCAodnAtPm1hZ2ljKSB7CiAgICBjYXNlIE5FVFNOTVBfSUZOVU1CRVI6CiAgICAgICAgbmV0c25tcF9hc3NlcnQoc2l6ZW9mKERXT1JEKSA9PSBzaXplb2YobG9uZ19yZXR1cm4pKTsKICAgICAgICBHZXROdW1iZXJPZkludGVyZmFjZXMoKERXT1JEICopICZsb25nX3JldHVybik7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGRlZmF1bHQ6CiAgICAgICAgREVCVUdNU0dUTCgoInNubXBkIiwgInVua25vd24gc3ViLWlkICVkIGluIHZhcl9pbnRlcmZhY2VzXG4iLAogICAgICAgICAgICAgICAgICAgIHZwLT5tYWdpYykpOwogICAgfQogICAgcmV0dXJuIE5VTEw7Cn0KCnVfY2hhciAgICAgICAgICoKdmFyX2lmRW50cnkoc3RydWN0IHZhcmlhYmxlICogdnAsCiAgICAgICAgICAgIG9pZCAqIG5hbWUsCiAgICAgICAgICAgIHNpemVfdCAqIGxlbmd0aCwKICAgICAgICAgICAgaW50IGV4YWN0LCBzaXplX3QgKiB2YXJfbGVuLCBXcml0ZU1ldGhvZCAqKiB3cml0ZV9tZXRob2QpCnsKICAgIGludCAgICAgICAgICAgICBpZkluZGV4OwogICAgc3RhdGljIE1JQl9JRlJPVyBpZlJvdzsKICAgIGNvbmZfaWZfbGlzdCAgICppZl9wdHIgPSBOVUxMOwogICAgCiAgICBpZkluZGV4ID0KICAgICAgICBoZWFkZXJfaWZFbnRyeSh2cCwgbmFtZSwgbGVuZ3RoLCBleGFjdCwgdmFyX2xlbiwgd3JpdGVfbWV0aG9kKTsKICAgIGlmIChpZkluZGV4ID09IE1BVENIX0ZBSUxFRCkKICAgICAgICByZXR1cm4gTlVMTDsKICAgIC8qCiAgICAgKiBobW1tLi4gd2hlcmUgdG8gZ2V0IHRoZSBpbnRlcmZhY2UgbmFtZSB0byBjaGVjayBvdmVycmlkZXM/CiAgICAgKgogICAgICogaWZfcHRyID0gbmV0c25tcF9hY2Nlc3NfaW50ZXJmYWNlX2VudHJ5X292ZXJyaWRlc19nZXQoTmFtZSk7CiAgICAgKi8KCiAgICAvKgogICAgICogR2V0IHRoZSBJZiBUYWJsZSBSb3cgYnkgcGFzc2luZyBpbmRleCBhcyBhcmd1bWVudCAKICAgICAqLwogICAgaWZSb3cuZHdJbmRleCA9IGlmSW5kZXg7CiAgICBpZiAoR2V0SWZFbnRyeSgmaWZSb3cpICE9IE5PX0VSUk9SKQogICAgICAgIHJldHVybiBOVUxMOwogICAgc3dpdGNoICh2cC0+bWFnaWMpIHsKICAgIGNhc2UgTkVUU05NUF9JRklOREVYOgogICAgICAgIGxvbmdfcmV0dXJuID0gaWZJbmRleDsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGREVTQ1I6CiAgICAgICAgKnZhcl9sZW4gPSBpZlJvdy5kd0Rlc2NyTGVuOwogICAgICAgIHJldHVybiAodV9jaGFyICopIGlmUm93LmJEZXNjcjsKICAgIGNhc2UgTkVUU05NUF9JRlRZUEU6CiAgICAgICAgaWYgKGlmX3B0cikKICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSBpZl9wdHItPnR5cGU7CiAgICAgICAgZWxzZQogICAgICAgIGxvbmdfcmV0dXJuID0gaWZSb3cuZHdUeXBlOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIE5FVFNOTVBfSUZNVFU6CiAgICAgICAgbG9uZ19yZXR1cm4gPSAobG9uZykgaWZSb3cuZHdNdHU7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgTkVUU05NUF9JRlNQRUVEOgogICAgICAgIGlmIChpZl9wdHIpCiAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gKGxvbmcpIGlmX3B0ci0+c3BlZWQ7CiAgICAgICAgZWxzZQogICAgICAgIGxvbmdfcmV0dXJuID0gKGxvbmcpIGlmUm93LmR3U3BlZWQ7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgTkVUU05NUF9JRlBIWVNBRERSRVNTOgogICAgICAgICp2YXJfbGVuID0gaWZSb3cuZHdQaHlzQWRkckxlbjsKICAgICAgICBtZW1jcHkocmV0dXJuX2J1ZiwgaWZSb3cuYlBoeXNBZGRyLCAqdmFyX2xlbik7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgcmV0dXJuX2J1ZjsKICAgIGNhc2UgTkVUU05NUF9JRkFETUlOU1RBVFVTOgogICAgICAgIGxvbmdfcmV0dXJuID0gaWZSb3cuZHdBZG1pblN0YXR1czsKICAgICAgICBhZG1pbl9zdGF0dXMgPSBsb25nX3JldHVybjsKICAgICAgICAqd3JpdGVfbWV0aG9kID0gd3JpdGVJZkVudHJ5OwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIE5FVFNOTVBfSUZPUEVSU1RBVFVTOgogICAgICAgIGxvbmdfcmV0dXJuID0KICAgICAgICAgICAoTUlCX0lGX09QRVJfU1RBVFVTX09QRVJBVElPTkFMID09IGlmUm93LmR3T3BlclN0YXR1cykgPyAxIDogMjsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGTEFTVENIQU5HRToKICAgICAgICBsb25nX3JldHVybiA9IDAgLyogWFhYIG5vdCBhIFVOSVggZXBvY2hhbCB0aW1lIGlmUm93LmR3TGFzdENoYW5nZSAqLyA7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgTkVUU05NUF9JRklOT0NURVRTOgogICAgICAgIGxvbmdfcmV0dXJuID0gaWZSb3cuZHdJbk9jdGV0czsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGSU5VQ0FTVFBLVFM6CiAgICAgICAgbG9uZ19yZXR1cm4gPSBpZlJvdy5kd0luVWNhc3RQa3RzOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIE5FVFNOTVBfSUZJTk5VQ0FTVFBLVFM6CiAgICAgICAgbG9uZ19yZXR1cm4gPSBpZlJvdy5kd0luTlVjYXN0UGt0czsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGSU5ESVNDQVJEUzoKICAgICAgICBsb25nX3JldHVybiA9IGlmUm93LmR3SW5EaXNjYXJkczsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGSU5FUlJPUlM6CiAgICAgICAgbG9uZ19yZXR1cm4gPSBpZlJvdy5kd0luRXJyb3JzOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIE5FVFNOTVBfSUZJTlVOS05PV05QUk9UT1M6CiAgICAgICAgbG9uZ19yZXR1cm4gPSBpZlJvdy5kd0luVW5rbm93blByb3RvczsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGT1VUT0NURVRTOgogICAgICAgIGxvbmdfcmV0dXJuID0gaWZSb3cuZHdPdXRPY3RldHM7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgTkVUU05NUF9JRk9VVFVDQVNUUEtUUzoKICAgICAgICBsb25nX3JldHVybiA9IGlmUm93LmR3T3V0VWNhc3RQa3RzOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIE5FVFNOTVBfSUZPVVROVUNBU1RQS1RTOgogICAgICAgIGxvbmdfcmV0dXJuID0gaWZSb3cuZHdPdXROVWNhc3RQa3RzOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIE5FVFNOTVBfSUZPVVRESVNDQVJEUzoKICAgICAgICBsb25nX3JldHVybiA9IGlmUm93LmR3T3V0RGlzY2FyZHM7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgTkVUU05NUF9JRk9VVEVSUk9SUzoKICAgICAgICBsb25nX3JldHVybiA9IGlmUm93LmR3T3V0RXJyb3JzOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIE5FVFNOTVBfSUZPVVRRTEVOOgogICAgICAgIGxvbmdfcmV0dXJuID0gaWZSb3cuZHdPdXRRTGVuOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIE5FVFNOTVBfSUZTUEVDSUZJQzoKICAgICAgICAqdmFyX2xlbiA9IG51bGxPaWRMZW47CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgbnVsbE9pZDsKICAgIGRlZmF1bHQ6CiAgICAgICAgREVCVUdNU0dUTCgoInNubXBkIiwgInVua25vd24gc3ViLWlkICVkIGluIHZhcl9pZkVudHJ5XG4iLAogICAgICAgICAgICAgICAgICAgIHZwLT5tYWdpYykpOwogICAgfQogICAgcmV0dXJuIE5VTEw7Cn0KCgppbnQKd3JpdGVJZkVudHJ5KGludCBhY3Rpb24sCiAgICAgICAgICAgICB1X2NoYXIgKiB2YXJfdmFsLAogICAgICAgICAgICAgdV9jaGFyIHZhcl92YWxfdHlwZSwKICAgICAgICAgICAgIHNpemVfdCB2YXJfdmFsX2xlbiwKICAgICAgICAgICAgIHVfY2hhciAqIHN0YXRQLCBvaWQgKiBuYW1lLCBzaXplX3QgbmFtZV9sZW4pCnsKICAgIE1JQl9JRlJPVyAgICAgICBpZkVudHJ5Um93OwogICAgaWYgKChjaGFyKSBuYW1lWzldICE9IE5FVFNOTVBfSUZBRE1JTlNUQVRVUykgewogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1RXUklUQUJMRTsKICAgIH0KCiAgICBzd2l0Y2ggKGFjdGlvbikgewogICAgY2FzZSBSRVNFUlZFMTogICAgICAgICAgICAgLyogQ2hlY2sgdmFsdWVzIGZvciBhY2NlcHRhYmlsaXR5ICovCiAgICAgICAgaWYgKHZhcl92YWxfdHlwZSAhPSBBU05fSU5URUdFUikgewogICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLCAibm90IGludGVnZXJcbiIpOwogICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfV1JPTkdUWVBFOwogICAgICAgIH0KICAgICAgICBpZiAodmFyX3ZhbF9sZW4gPiBzaXplb2YoaW50KSkgewogICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLCAiYmFkIGxlbmd0aFxuIik7CiAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9XUk9OR0xFTkdUSDsKICAgICAgICB9CgogICAgICAgIC8qCiAgICAgICAgICogVGhlIGR3QWRtaW5TdGF0dXMgbWVtYmVyIGNhbiBiZSBNSUJfSUZfQURNSU5fU1RBVFVTX1VQIG9yIE1JQl9JRl9BRE1JTl9TVEFUVVNfRE9XTiAKICAgICAgICAgKi8KICAgICAgICBpZiAoISgoKGludCkgKCp2YXJfdmFsKSA9PSBNSUJfSUZfQURNSU5fU1RBVFVTX1VQKSB8fAogICAgICAgICAgICAgICgoaW50KSAoKnZhcl92YWwpID09IE1JQl9JRl9BRE1JTl9TVEFUVVNfRE9XTikpKSB7CiAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsICJub3Qgc3VwcG9ydGVkIGFkbWluIHN0YXRlXG4iKTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX1dST05HVkFMVUU7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgUkVTRVJWRTI6ICAgICAgICAgICAgIC8qIEFsbG9jYXRlIG1lbW9yeSBhbmQgc2ltaWxhciByZXNvdXJjZXMgKi8KICAgICAgICBicmVhazsKCiAgICBjYXNlIEFDVElPTjoKICAgICAgICAvKgogICAgICAgICAqIFNhdmUgdGhlIG9sZCB2YWx1ZSwgaW4gY2FzZSBvZiBVTkRPIAogICAgICAgICAqLwoKICAgICAgICBvbGRhZG1pbl9zdGF0dXMgPSBhZG1pbl9zdGF0dXM7CiAgICAgICAgYWRtaW5fc3RhdHVzID0gKGludCkgKnZhcl92YWw7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBVTkRPOiAgICAgICAgICAgICAgICAgLyogUmV2ZXJzZSB0aGUgU0VUIGFjdGlvbiBhbmQgZnJlZSByZXNvdXJjZXMgKi8KICAgICAgICBhZG1pbl9zdGF0dXMgPSBvbGRhZG1pbl9zdGF0dXM7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBDT01NSVQ6ICAgICAgICAgICAgICAgLyogQ29uZmlybSB0aGUgU0VULCBwZXJmb3JtaW5nIGFueSBpcnJldmVyc2libGUgYWN0aW9ucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBhbmQgZnJlZSByZXNvdXJjZXMgKi8KICAgICAgICBpZkVudHJ5Um93LmR3SW5kZXggPSAoaW50KSBuYW1lWzEwXTsKICAgICAgICBpZkVudHJ5Um93LmR3QWRtaW5TdGF0dXMgPSBhZG1pbl9zdGF0dXM7CiAgICAgICAgLyoKICAgICAgICAgKiBPbmx5IFVQIGFuZCBET1dOIHN0YXR1cyBhcmUgc3VwcG9ydGVkLiBUaGF0cyB3aHkgZG9uZSBpbiBDT01NSVQgCiAgICAgICAgICovCiAgICAgICAgaWYgKFNldElmRW50cnkoJmlmRW50cnlSb3cpICE9IE5PX0VSUk9SKSB7CiAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsCiAgICAgICAgICAgICAgICAgICAgICJFcnJvciBpbiB3cml0ZUlmRW50cnkgY2FzZSBDT01NSVQgd2l0aCBpbmRleDogJWx1ICYgYWRtaW5TdGF0dXMgJWx1XG4iLAogICAgICAgICAgICAgICAgICAgICBpZkVudHJ5Um93LmR3SW5kZXgsIGlmRW50cnlSb3cuZHdBZG1pblN0YXR1cyk7CiAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9DT01NSVRGQUlMRUQ7CiAgICAgICAgfQoKICAgIGNhc2UgRlJFRTogICAgICAgICAgICAgICAgIC8qIEZyZWUgYW55IHJlc291cmNlcyBhbGxvY2F0ZWQgKi8KICAgICAgICAvKgogICAgICAgICAqIE5vIHJlc291cmNlcyBoYXZlIGJlZW4gYWxsb2NhdGVkIAogICAgICAgICAqLwogICAgICAgIGJyZWFrOwogICAgfQogICAgcmV0dXJuIFNOTVBfRVJSX05PRVJST1I7Cn0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZW5kIG9mIHdyaXRlSWZFbnRyeSAqLwojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdJTjMyIGN5Z3dpbiAqLwo=