LyoKICpDb3B5cmlnaHQoYykyMDA0LENpc2NvIFVSUCBpbWJ1cnNlcyBhbmQgTmV0d29yayBJbmZvcm1hdGlvbiBDZW50ZXIgaW4gQmVpamluZyBVbml2ZXJzaXR5IG9mIFBvc3RzIGFuZCBUZWxlY29tbXVuaWNhdGlvbnMgcmVzZWFyY2hlcy4KICoKICpBbGwgcmlnaHQgcmVzZXJ2ZWQKICoKICpGaWxlIE5hbWU6dHJhY2VSb3V0ZUN0bFRhYmxlLmMKICpGaWxlIERlc2NyaXB0aW9uOlJvd3Mgb2YgdHJhY2VSb3V0ZUN0bFRhYmxlIE1JQiBhZGQgZGVsZXRlIGFucyByZWFkLgogKiAgICAgICAgICAgICAgUm93cyBvZiB0cmFjZVJvdXRlUmVzdWx0c1RhYmxlIE1JQiBhZGQgYW5kIGRlbGV0ZS4KICogICAgICAgICAgICAgIFJvd3Mgb2YgdHJhY2VSb3V0ZVByb2JlSGlzdG9yeVRhYmxlIE1JQiBhZGQgYW5kIGRlbGV0ZS4KICogICAgICAgICAgICAgIFJvd3Mgb2YgdHJhY2VSb3V0ZUhvcHNUYWJsZSBNSUIgYWRkIGFuZCBkZWxldGUuCiAqICAgICAgICAgICAgICBUaGUgbWFpbiBmdW5jdGlvbiBpcyBhbHNvIGhlcmUuCiAqCiAqQ3VycmVudCBWZXJzaW9uOjEuMAogKkF1dGhvcjpDaGVuSmluZwogKkRhdGU6MjAwNC44LjIwCiAqLwoKCiNpbmNsdWRlIDxuZXQtc25tcC9uZXQtc25tcC1jb25maWcuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL25ldC1zbm1wLWluY2x1ZGVzLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9hZ2VudC9uZXQtc25tcC1hZ2VudC1pbmNsdWRlcy5oPgojaW5jbHVkZSA8cHRocmVhZC5oPgojaW5jbHVkZSA8bWF0aC5oPgoKI2luY2x1ZGUgInRyYWNlUm91dGVDdGxUYWJsZS5oIgojaW5jbHVkZSAidHJhY2VSb3V0ZVJlc3VsdHNUYWJsZS5oIgojaW5jbHVkZSAidHJhY2VSb3V0ZVByb2JlSGlzdG9yeVRhYmxlLmgiCiNpbmNsdWRlICJ0cmFjZVJvdXRlSG9wc1RhYmxlLmgiCiNpbmNsdWRlICJoZWFkZXJfY29tcGxleC5oIgoKb2lkICAgICAgICAgICAgIHRyYWNlUm91dGVDdGxUYWJsZV92YXJpYWJsZXNfb2lkW10gPQogICAgeyAxLCAzLCA2LCAxLCAyLCAxLCA4MSwgMSwgMiB9OwoKLyogdHJhcCAqLwpvaWQgICAgICAgICAgICAgdHJhY2VSb3V0ZVBhdGhDaGFuZ2VbXSA9IHsgMSwgMywgNiwgMSwgMiwgMSwgODEsIDAsIDEgfTsKb2lkICAgICAgICAgICAgIHRyYWNlUm91dGVUZXN0RmFpbGVkW10gPSB7IDEsIDMsIDYsIDEsIDIsIDEsIDgxLCAwLCAyIH07Cm9pZCAgICAgICAgICAgICB0cmFjZVJvdXRlVGVzdENvbXBsZXRlZFtdID0geyAxLCAzLCA2LCAxLCAyLCAxLCA4MSwgMCwgMyB9OwoKc3RydWN0IHZhcmlhYmxlMiB0cmFjZVJvdXRlQ3RsVGFibGVfdmFyaWFibGVzW10gPSB7CiAgICAvKgogICAgICogbWFnaWMgbnVtYmVyICAgICAgICAsIHZhcmlhYmxlIHR5cGUgLCByby9ydyAsIGNhbGxiYWNrIGZuICAsIEwsIG9pZHN1ZmZpeCAKICAgICAqLwoKICAgIHtDT0xVTU5fVFJBQ0VST1VURUNUTFRBUkdFVEFERFJFU1NUWVBFLCBBU05fSU5URUdFUiwgTkVUU05NUF9PTERBUElfUldSSVRFLAogICAgIHZhcl90cmFjZVJvdXRlQ3RsVGFibGUsIDIsIHsxLCAzfX0sCiAgICB7Q09MVU1OX1RSQUNFUk9VVEVDVExUQVJHRVRBRERSRVNTLCAgIEFTTl9PQ1RFVF9TVFIsIE5FVFNOTVBfT0xEQVBJX1JXUklURSwKICAgICB2YXJfdHJhY2VSb3V0ZUN0bFRhYmxlLCAyLCB7MSwgNH19LAogICAge0NPTFVNTl9UUkFDRVJPVVRFQ1RMQllQQVNTUk9VVEVUQUJMRSwgIEFTTl9JTlRFR0VSLCBORVRTTk1QX09MREFQSV9SV1JJVEUsCiAgICAgdmFyX3RyYWNlUm91dGVDdGxUYWJsZSwgMiwgezEsIDV9fSwKICAgIHtDT0xVTU5fVFJBQ0VST1VURUNUTERBVEFTSVpFLCAgICAgQVNOX1VOU0lHTkVELCBORVRTTk1QX09MREFQSV9SV1JJVEUsCiAgICAgdmFyX3RyYWNlUm91dGVDdGxUYWJsZSwgMiwgezEsIDZ9fSwKICAgIHtDT0xVTU5fVFJBQ0VST1VURUNUTFRJTUVPVVQsICAgICAgQVNOX1VOU0lHTkVELCBORVRTTk1QX09MREFQSV9SV1JJVEUsCiAgICAgdmFyX3RyYWNlUm91dGVDdGxUYWJsZSwgMiwgezEsIDd9fSwKICAgIHtDT0xVTU5fVFJBQ0VST1VURUNUTFBST0JFU1BFUkhPUCwgQVNOX1VOU0lHTkVELCBORVRTTk1QX09MREFQSV9SV1JJVEUsCiAgICAgdmFyX3RyYWNlUm91dGVDdGxUYWJsZSwgMiwgezEsIDh9fSwKICAgIHtDT0xVTU5fVFJBQ0VST1VURUNUTFBPUlQsICAgICAgICAgQVNOX1VOU0lHTkVELCBORVRTTk1QX09MREFQSV9SV1JJVEUsCiAgICAgdmFyX3RyYWNlUm91dGVDdGxUYWJsZSwgMiwgezEsIDl9fSwKICAgIHtDT0xVTU5fVFJBQ0VST1VURUNUTE1BWFRUTCwgICAgICAgQVNOX1VOU0lHTkVELCBORVRTTk1QX09MREFQSV9SV1JJVEUsCiAgICAgdmFyX3RyYWNlUm91dGVDdGxUYWJsZSwgMiwgezEsIDEwfX0sCiAgICB7Q09MVU1OX1RSQUNFUk9VVEVDVExEU0ZJRUxELCAgICAgIEFTTl9VTlNJR05FRCwgTkVUU05NUF9PTERBUElfUldSSVRFLAogICAgIHZhcl90cmFjZVJvdXRlQ3RsVGFibGUsIDIsIHsxLCAxMX19LAogICAge0NPTFVNTl9UUkFDRVJPVVRFQ1RMU09VUkNFQUREUkVTU1RZUEUsIEFTTl9JTlRFR0VSLCBORVRTTk1QX09MREFQSV9SV1JJVEUsCiAgICAgdmFyX3RyYWNlUm91dGVDdGxUYWJsZSwgMiwgezEsIDEyfX0sCiAgICB7Q09MVU1OX1RSQUNFUk9VVEVDVExTT1VSQ0VBRERSRVNTLCAgIEFTTl9PQ1RFVF9TVFIsIE5FVFNOTVBfT0xEQVBJX1JXUklURSwKICAgICB2YXJfdHJhY2VSb3V0ZUN0bFRhYmxlLCAyLCB7MSwgMTN9fSwKICAgIHtDT0xVTU5fVFJBQ0VST1VURUNUTElGSU5ERVgsICAgICAgIEFTTl9JTlRFR0VSLCBORVRTTk1QX09MREFQSV9SV1JJVEUsCiAgICAgdmFyX3RyYWNlUm91dGVDdGxUYWJsZSwgMiwgezEsIDE0fX0sCiAgICB7Q09MVU1OX1RSQUNFUk9VVEVDVExNSVNDT1BUSU9OUywgQVNOX09DVEVUX1NUUiwgTkVUU05NUF9PTERBUElfUldSSVRFLAogICAgIHZhcl90cmFjZVJvdXRlQ3RsVGFibGUsIDIsIHsxLCAxNX19LAogICAge0NPTFVNTl9UUkFDRVJPVVRFQ1RMTUFYRkFJTFVSRVMsICBBU05fVU5TSUdORUQsIE5FVFNOTVBfT0xEQVBJX1JXUklURSwKICAgICB2YXJfdHJhY2VSb3V0ZUN0bFRhYmxlLCAyLCB7MSwgMTZ9fSwKICAgIHtDT0xVTU5fVFJBQ0VST1VURUNUTERPTlRGUkFHTUVOVCwgIEFTTl9JTlRFR0VSLCBORVRTTk1QX09MREFQSV9SV1JJVEUsCiAgICAgdmFyX3RyYWNlUm91dGVDdGxUYWJsZSwgMiwgezEsIDE3fX0sCiAgICB7Q09MVU1OX1RSQUNFUk9VVEVDVExJTklUSUFMVFRMLCAgIEFTTl9VTlNJR05FRCwgTkVUU05NUF9PTERBUElfUldSSVRFLAogICAgIHZhcl90cmFjZVJvdXRlQ3RsVGFibGUsIDIsIHsxLCAxOH19LAogICAge0NPTFVNTl9UUkFDRVJPVVRFQ1RMRlJFUVVFTkNZLCAgICBBU05fVU5TSUdORUQsIE5FVFNOTVBfT0xEQVBJX1JXUklURSwKICAgICB2YXJfdHJhY2VSb3V0ZUN0bFRhYmxlLCAyLCB7MSwgMTl9fSwKICAgIHtDT0xVTU5fVFJBQ0VST1VURUNUTFNUT1JBR0VUWVBFLCAgIEFTTl9JTlRFR0VSLCBORVRTTk1QX09MREFQSV9SV1JJVEUsCiAgICAgdmFyX3RyYWNlUm91dGVDdGxUYWJsZSwgMiwgezEsIDIwfX0sCiAgICB7Q09MVU1OX1RSQUNFUk9VVEVDVExBRE1JTlNUQVRVUywgICBBU05fSU5URUdFUiwgTkVUU05NUF9PTERBUElfUldSSVRFLAogICAgIHZhcl90cmFjZVJvdXRlQ3RsVGFibGUsIDIsIHsxLCAyMX19LAogICAge0NPTFVNTl9UUkFDRVJPVVRFQ1RMREVTQ1IsICAgICAgIEFTTl9PQ1RFVF9TVFIsIE5FVFNOTVBfT0xEQVBJX1JXUklURSwKICAgICB2YXJfdHJhY2VSb3V0ZUN0bFRhYmxlLCAyLCB7MSwgMjJ9fSwKICAgIHtDT0xVTU5fVFJBQ0VST1VURUNUTE1BWFJPV1MsICAgICAgQVNOX1VOU0lHTkVELCBORVRTTk1QX09MREFQSV9SV1JJVEUsCiAgICAgdmFyX3RyYWNlUm91dGVDdGxUYWJsZSwgMiwgezEsIDIzfX0sCiAgICB7Q09MVU1OX1RSQUNFUk9VVEVDVExUUkFQR0VORVJBVElPTiwgIEFTTl9PQ1RFVF9TVFIsIE5FVFNOTVBfT0xEQVBJX1JXUklURSwKICAgICB2YXJfdHJhY2VSb3V0ZUN0bFRhYmxlLCAyLCB7MSwgMjR9fSwKICAgIHtDT0xVTU5fVFJBQ0VST1VURUNUTENSRUFURUhPUFNFTlRSSUVTLCBBU05fSU5URUdFUiwgTkVUU05NUF9PTERBUElfUldSSVRFLAogICAgIHZhcl90cmFjZVJvdXRlQ3RsVGFibGUsIDIsIHsxLCAyNX19LAogICAge0NPTFVNTl9UUkFDRVJPVVRFQ1RMVFlQRSwgICAgICAgIEFTTl9PQkpFQ1RfSUQsIE5FVFNOTVBfT0xEQVBJX1JXUklURSwKICAgICB2YXJfdHJhY2VSb3V0ZUN0bFRhYmxlLCAyLCB7MSwgMjZ9fSwKICAgIHtDT0xVTU5fVFJBQ0VST1VURUNUTFJPV1NUQVRVUywgICAgIEFTTl9JTlRFR0VSLCBORVRTTk1QX09MREFQSV9SV1JJVEUsCiAgICAgdmFyX3RyYWNlUm91dGVDdGxUYWJsZSwgMiwgezEsIDI3fX0KCn07CgovKgogKiBnbG9iYWwgc3RvcmFnZSBvZiBvdXIgZGF0YSwgc2F2ZWQgaW4gYW5kIGNvbmZpZ3VyZWQgYnkgaGVhZGVyX2NvbXBsZXgoKSAKICovCgpzdHJ1Y3QgaGVhZGVyX2NvbXBsZXhfaW5kZXggKnRyYWNlUm91dGVDdGxUYWJsZVN0b3JhZ2UgPSBOVUxMOwpzdHJ1Y3QgaGVhZGVyX2NvbXBsZXhfaW5kZXggKnRyYWNlUm91dGVSZXN1bHRzVGFibGVTdG9yYWdlID0gTlVMTDsKc3RydWN0IGhlYWRlcl9jb21wbGV4X2luZGV4ICp0cmFjZVJvdXRlUHJvYmVIaXN0b3J5VGFibGVTdG9yYWdlID0gTlVMTDsKc3RydWN0IGhlYWRlcl9jb21wbGV4X2luZGV4ICp0cmFjZVJvdXRlSG9wc1RhYmxlU3RvcmFnZSA9IE5VTEw7CgppbnQKdHJhY2VSb3V0ZVJlc3VsdHNUYWJsZV9hZGQoc3RydWN0IHRyYWNlUm91dGVDdGxUYWJsZV9kYXRhICp0aGVkYXRhKTsKaW50CnRyYWNlUm91dGVSZXN1bHRzVGFibGVfZGVsKHN0cnVjdCB0cmFjZVJvdXRlQ3RsVGFibGVfZGF0YSAqdGhlZGF0YSk7Cgp2b2lkCmluaXRfdHJhY2VSb3V0ZUN0bFRhYmxlKHZvaWQpCnsKICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlQ3RsVGFibGUiLCAiaW5pdGlhbGl6aW5nLi4uICAiKSk7CiAgICAvKgogICAgICogcmVnaXN0ZXIgb3Vyc2VsdmVzIHdpdGggdGhlIGFnZW50IHRvIGhhbmRsZSBvdXIgbWliIHRyZWUgCiAgICAgKi8KICAgIFJFR0lTVEVSX01JQigidHJhY2VSb3V0ZUN0bFRhYmxlIiwgdHJhY2VSb3V0ZUN0bFRhYmxlX3ZhcmlhYmxlcywKICAgICAgICAgICAgICAgICB2YXJpYWJsZTIsIHRyYWNlUm91dGVDdGxUYWJsZV92YXJpYWJsZXNfb2lkKTsKCiAgICAvKgogICAgICogcmVnaXN0ZXIgb3VyIGNvbmZpZyBoYW5kbGVyKHMpIHRvIGRlYWwgd2l0aCByZWdpc3RyYXRpb25zIAogICAgICovCiAgICBzbm1wZF9yZWdpc3Rlcl9jb25maWdfaGFuZGxlcigidHJhY2VSb3V0ZUN0bFRhYmxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlX3RyYWNlUm91dGVDdGxUYWJsZSwgTlVMTCwgTlVMTCk7CgogICAgLyoKICAgICAqIHdlIG5lZWQgdG8gYmUgY2FsbGVkIGJhY2sgbGF0ZXIgdG8gc3RvcmUgb3VyIGRhdGEgCiAgICAgKi8KICAgIHNubXBfcmVnaXN0ZXJfY2FsbGJhY2soU05NUF9DQUxMQkFDS19MSUJSQVJZLCBTTk1QX0NBTExCQUNLX1NUT1JFX0RBVEEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlX3RyYWNlUm91dGVDdGxUYWJsZSwgTlVMTCk7CgogICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVDdGxUYWJsZSIsICJkb25lLlxuIikpOwp9CgoKdm9pZAppbml0X3RyUmVzdWx0c1RhYmxlKHN0cnVjdCB0cmFjZVJvdXRlQ3RsVGFibGVfZGF0YSAqaXRlbSkKewogICAgc3RydWN0IHRyYWNlUm91dGVSZXN1bHRzVGFibGVfZGF0YSAqU3RvcmFnZVRtcCA9IE5VTEw7CiAgICBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKnZhcnMgPSBOVUxMOwogICAgY2hhciAgICAgICAgICAgKmhvc3QgPSBOVUxMOwoKICAgIGhvc3QgPQogICAgICAgIChjaGFyICopIG1hbGxvYyhzaXplb2YoY2hhcikgKgogICAgICAgICAgICAgICAgICAgICAgICAoaXRlbS0+dHJhY2VSb3V0ZUN0bFRhcmdldEFkZHJlc3NMZW4gKyAxKSk7CgogICAgaWYgKGhvc3QgPT0gTlVMTCkgewogICAgICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlQ3RsVGFibGUiLCAiaG9zdCBjYWxsb2MgJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoZXJybm8pKSk7CiAgICAgICAgZXhpdCgxKTsKICAgIH0KCiAgICBtZW1zZXQoaG9zdCwgJ1wwJywKCSAgIHNpemVvZihjaGFyKSAqIChpdGVtLT50cmFjZVJvdXRlQ3RsVGFyZ2V0QWRkcmVzc0xlbiArIDEpKTsKICAgIHN0cmNweShob3N0LCBpdGVtLT50cmFjZVJvdXRlQ3RsVGFyZ2V0QWRkcmVzcyk7CiAgICBob3N0W2l0ZW0tPnRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzTGVuXSA9ICdcMCc7CgogICAgU3RvcmFnZVRtcCA9IFNOTVBfTUFMTE9DX1NUUlVDVCh0cmFjZVJvdXRlUmVzdWx0c1RhYmxlX2RhdGEpOwogICAgaWYgKFN0b3JhZ2VUbXAgPT0gTlVMTCkgewogICAgICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlQ3RsVGFibGUiLCAiU3RvcmFnZVRtcCBtYWxsb2MgJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoZXJybm8pKSk7CiAgICAgICAgZXhpdCgxKTsKICAgIH0KCiAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleCA9CiAgICAgICAgKGNoYXIgKikgbWFsbG9jKHNpemVvZihjaGFyKSAqCiAgICAgICAgICAgICAgICAgICAgICAgIChpdGVtLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleExlbiArIDEpKTsKICAgIGlmIChTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleCA9PSBOVUxMKSB7CiAgICAgICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVDdGxUYWJsZSIsCiAgICAgICAgICAgICAgICAgICAgInRyYWNlUm91dGVDdGxPd25lckluZGV4IG1hbGxvYyAlc1xuIiwKICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcihlcnJubykpKTsKICAgICAgICBleGl0KDEpOwogICAgfQoKICAgIG1lbWNweShTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleCwKICAgICAgICAgICBpdGVtLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleCwKICAgICAgICAgICBpdGVtLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleExlbiArIDEpOwogICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXhbaXRlbS0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXhMZW5dID0KICAgICAgICAnXDAnOwogICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXhMZW4gPQogICAgICAgIGl0ZW0tPnRyYWNlUm91dGVDdGxPd25lckluZGV4TGVuOwoKICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUZXN0TmFtZSA9CiAgICAgICAgKGNoYXIgKikgbWFsbG9jKHNpemVvZihjaGFyKSAqCiAgICAgICAgICAgICAgICAgICAgICAgIChpdGVtLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWVMZW4gKyAxKSk7CiAgICBpZiAoU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lID09IE5VTEwpIHsKICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZUN0bFRhYmxlIiwKICAgICAgICAgICAgICAgICAgICAidHJhY2VSb3V0ZUN0bFRlc3ROYW1lIG1hbGxvYyAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKSk7CiAgICAgICAgZXhpdCgxKTsKICAgIH0KCiAgICBtZW1jcHkoU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lLCBpdGVtLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWUsCiAgICAgICAgICAgaXRlbS0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lTGVuICsgMSk7CiAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWVbaXRlbS0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lTGVuXSA9CiAgICAgICAgJ1wwJzsKICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUZXN0TmFtZUxlbiA9IGl0ZW0tPnRyYWNlUm91dGVDdGxUZXN0TmFtZUxlbjsKCiAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlUmVzdWx0c09wZXJTdGF0dXMgPSAxOwoKICAgIGlmIChpdGVtLT50cmFjZVJvdXRlQ3RsVGFyZ2V0QWRkcmVzc1R5cGUgPT0gMQogICAgICAgIHx8IGl0ZW0tPnRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzVHlwZSA9PSAxNikgewogICAgICAgIHN0cnVjdCBzb2NrYWRkciB3aGVyZXRvOyAgICAgICAgLyogV2hvIHRvIHRyeSB0byByZWFjaCAqLwogICAgICAgIHJlZ2lzdGVyIHN0cnVjdCBzb2NrYWRkcl9pbiAqdG8gPSAoc3RydWN0IHNvY2thZGRyX2luICopICZ3aGVyZXRvOwogICAgICAgIHJlZ2lzdGVyIHN0cnVjdCBob3N0aW5mbyAqaGkgPSBOVUxMOwogICAgICAgIGhpID0gZ2V0aG9zdGluZm8oaG9zdCk7CiAgICAgICAgaWYgKGhpID09IE5VTEwpIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVDdGxUYWJsZSIsICJoaSBjYWxsb2MgJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKGVycm5vKSkpOwogICAgICAgICAgICBleGl0KDEpOwogICAgICAgIH0KCiAgICAgICAgc2V0c2luKHRvLCBoaS0+YWRkcnNbMF0pOwogICAgICAgIGlmIChpbmV0X250b2EodG8tPnNpbl9hZGRyKSA9PSBOVUxMKSB7CiAgICAgICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVSZXN1bHRzSXBUZ3RBZGRyVHlwZSA9IDA7CiAgICAgICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVSZXN1bHRzSXBUZ3RBZGRyID0gc3RyZHVwKCIiKTsKICAgICAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZVJlc3VsdHNJcFRndEFkZHJMZW4gPSAwOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVSZXN1bHRzSXBUZ3RBZGRyVHlwZSA9IDE7CiAgICAgICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVSZXN1bHRzSXBUZ3RBZGRyID0KICAgICAgICAgICAgICAgIChjaGFyICopIG1hbGxvYyhzaXplb2YoY2hhcikgKgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHJsZW4oaW5ldF9udG9hKHRvLT5zaW5fYWRkcikpICsgMSkpOwogICAgICAgICAgICBpZiAoU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZVJlc3VsdHNJcFRndEFkZHIgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVDdGxUYWJsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHJhY2VSb3V0ZVJlc3VsdHNJcFRndEFkZHIgbWFsbG9jICVzXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoZXJybm8pKSk7CiAgICAgICAgICAgICAgICBleGl0KDEpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBtZW1jcHkoU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZVJlc3VsdHNJcFRndEFkZHIsCiAgICAgICAgICAgICAgICAgICBpbmV0X250b2EodG8tPnNpbl9hZGRyKSwKICAgICAgICAgICAgICAgICAgIHN0cmxlbihpbmV0X250b2EodG8tPnNpbl9hZGRyKSkgKyAxKTsKICAgICAgICAgICAgU3RvcmFnZVRtcC0+CiAgICAgICAgICAgICAgICB0cmFjZVJvdXRlUmVzdWx0c0lwVGd0QWRkcltzdHJsZW4oaW5ldF9udG9hKHRvLT5zaW5fYWRkcikpXQogICAgICAgICAgICAgICAgPSAnXDAnOwogICAgICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlUmVzdWx0c0lwVGd0QWRkckxlbiA9CiAgICAgICAgICAgICAgICBzdHJsZW4oaW5ldF9udG9hKHRvLT5zaW5fYWRkcikpOwogICAgICAgIH0KICAgIH0KICAgIGlmIChpdGVtLT50cmFjZVJvdXRlQ3RsVGFyZ2V0QWRkcmVzc1R5cGUgPT0gMikgewoKICAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfaW42IHdoZXJldG87ICAgIC8qIFdobyB0byB0cnkgdG8gcmVhY2ggKi8KICAgICAgICByZWdpc3RlciBzdHJ1Y3Qgc29ja2FkZHJfaW42ICp0byA9CiAgICAgICAgICAgIChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopICZ3aGVyZXRvOwogICAgICAgIHN0cnVjdCBob3N0ZW50ICpocCA9IE5VTEw7CiAgICAgICAgLyogc3RydWN0IGhvc3RlbnYgaHA7ICovCiAgICAgICAgY2hhciAgICAgICAgICAgIHBhWzY0XTsKICAgICAgICBtZW1zZXQocGEsICdcMCcsIDY0KTsKCiAgICAgICAgdG8tPnNpbjZfZmFtaWx5ID0gQUZfSU5FVDY7CiAgICAgICAgdG8tPnNpbjZfcG9ydCA9IGh0b25zKDMzNDM0KTsKCiAgICAgICAgaWYgKGluZXRfcHRvbihBRl9JTkVUNiwgaG9zdCwgJnRvLT5zaW42X2FkZHIpID4gMCkgewogICAgICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlUmVzdWx0c0lwVGd0QWRkclR5cGUgPSAyOwogICAgICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlUmVzdWx0c0lwVGd0QWRkciA9CiAgICAgICAgICAgICAgICAoY2hhciAqKSBtYWxsb2Moc2l6ZW9mKGNoYXIpICogKHN0cmxlbihob3N0KSArIDEpKTsKICAgICAgICAgICAgaWYgKFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVSZXN1bHRzSXBUZ3RBZGRyID09IE5VTEwpIHsKICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlQ3RsVGFibGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInRyYWNlUm91dGVSZXN1bHRzSXBUZ3RBZGRyIG1hbGxvYyAlc1xuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKGVycm5vKSkpOwogICAgICAgICAgICAgICAgZXhpdCgxKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBtZW1zZXQoU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZVJlc3VsdHNJcFRndEFkZHIsICdcMCcsCiAgICAgICAgICAgICAgICAgIHNpemVvZihjaGFyKSAqIChzdHJsZW4oaG9zdCkgKyAxKSk7CiAgICAgICAgICAgIG1lbWNweShTdG9yYWdlVG1wLT50cmFjZVJvdXRlUmVzdWx0c0lwVGd0QWRkciwgaG9zdCwKICAgICAgICAgICAgICAgICAgIHN0cmxlbihob3N0KSArIDEpOwogICAgICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlUmVzdWx0c0lwVGd0QWRkcltzdHJsZW4oaG9zdCldID0gJ1wwJzsKICAgICAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZVJlc3VsdHNJcFRndEFkZHJMZW4gPSBzdHJsZW4oaG9zdCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaHAgPSBnZXRob3N0YnluYW1lMihob3N0LCBBRl9JTkVUNik7CiAgICAgICAgICAgIGlmIChocCAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAgICAqaG9zdG5hbWU7CiAgICAgICAgICAgICAgICBtZW1tb3ZlKChjYWRkcl90KSAmIHRvLT5zaW42X2FkZHIsIGhwLT5oX2FkZHIsIDE2KTsKICAgICAgICAgICAgICAgIGhvc3RuYW1lID0gaW5ldF9udG9wKEFGX0lORVQ2LCAmdG8tPnNpbjZfYWRkciwgcGEsIDY0KTsKICAgICAgICAgICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVSZXN1bHRzSXBUZ3RBZGRyVHlwZSA9IDI7CiAgICAgICAgICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlUmVzdWx0c0lwVGd0QWRkciA9CiAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikgbWFsbG9jKHNpemVvZihjaGFyKSAqIChzdHJsZW4oaG9zdG5hbWUpICsgMSkpOwogICAgICAgICAgICAgICAgaWYgKFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVSZXN1bHRzSXBUZ3RBZGRyID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZUN0bFRhYmxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHJhY2VSb3V0ZVJlc3VsdHNJcFRndEFkZHIgbWFsbG9jICVzXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKGVycm5vKSkpOwogICAgICAgICAgICAgICAgICAgIGV4aXQoMSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBtZW1zZXQoU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZVJlc3VsdHNJcFRndEFkZHIsICdcMCcsCiAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoY2hhcikgKiAoc3RybGVuKGhvc3QpICsgMSkpOwogICAgICAgICAgICAgICAgbWVtY3B5KFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVSZXN1bHRzSXBUZ3RBZGRyLCBob3N0bmFtZSwKICAgICAgICAgICAgICAgICAgICAgICBzdHJsZW4oaG9zdG5hbWUpICsgMSk7CiAgICAgICAgICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlUmVzdWx0c0lwVGd0QWRkcltzdHJsZW4oaG9zdG5hbWUpXSA9CiAgICAgICAgICAgICAgICAgICAgJ1wwJzsKICAgICAgICAgICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVSZXN1bHRzSXBUZ3RBZGRyTGVuID0KICAgICAgICAgICAgICAgICAgICBzdHJsZW4oaG9zdG5hbWUpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVDdGxUYWJsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHJhY2Vyb3V0ZTogdW5rbm93biBob3N0ICVzXG4iLCBob3N0KSk7CgogICAgICAgICAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZVJlc3VsdHNJcFRndEFkZHJUeXBlID0gMDsKICAgICAgICAgICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVSZXN1bHRzSXBUZ3RBZGRyID0gc3RyZHVwKCIiKTsKICAgICAgICAgICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVSZXN1bHRzSXBUZ3RBZGRyTGVuID0gMDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlUmVzdWx0c0N1ckhvcENvdW50ID0gMDsKICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVSZXN1bHRzQ3VyUHJvYmVDb3VudCA9IDA7CiAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlUmVzdWx0c1Rlc3RBdHRlbXB0cyA9IDA7CiAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlUmVzdWx0c1Rlc3RTdWNjZXNzZXMgPSAwOwoKICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVSZXN1bHRzTGFzdEdvb2RQYXRoTGVuID0gMDsKCiAgICBpdGVtLT50cmFjZVJvdXRlUmVzdWx0cyA9IFN0b3JhZ2VUbXA7CgogICAgc25tcF92YXJsaXN0X2FkZF92YXJpYWJsZSgmdmFycywgTlVMTCwgMCwgQVNOX09DVEVUX1NUUiwgKGNoYXIgKikgaXRlbS0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXgsIGl0ZW0tPnRyYWNlUm91dGVDdGxPd25lckluZGV4TGVuKTsgLyogIHRyYWNlUm91dGVDdGxPd25lckluZGV4ICAqLwogICAgc25tcF92YXJsaXN0X2FkZF92YXJpYWJsZSgmdmFycywgTlVMTCwgMCwgQVNOX09DVEVUX1NUUiwgKGNoYXIgKikgaXRlbS0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lLCBpdGVtLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWVMZW4pOyAgICAgLyogIHRyYWNlUm91dGVDdGxUZXN0TmFtZSAgKi8KICAgIGlmICgoaGVhZGVyX2NvbXBsZXhfZ2V0KHRyYWNlUm91dGVSZXN1bHRzVGFibGVTdG9yYWdlLCB2YXJzKSkgIT0gTlVMTCkgewogICAgICAgIHRyYWNlUm91dGVSZXN1bHRzVGFibGVfZGVsKGl0ZW0pOwogICAgfQogICAgc25tcF9mcmVlX3ZhcmJpbmQodmFycyk7CiAgICB2YXJzID0gTlVMTDsKICAgIGlmIChpdGVtLT50cmFjZVJvdXRlUmVzdWx0cyAhPSBOVUxMKSB7CiAgICAgICAgaWYgKHRyYWNlUm91dGVSZXN1bHRzVGFibGVfYWRkKGl0ZW0pICE9IFNOTVBFUlJfU1VDQ0VTUykgewogICAgICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZVJlc3VsdHNUYWJsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJpbml0IGFuIGVudHJ5IGVycm9yXG4iKSk7CiAgICAgICAgfQogICAgfQoKfQoKCgppbnQKbW9kaWZ5X3RyUmVzdWx0c09wZXIoc3RydWN0IHRyYWNlUm91dGVDdGxUYWJsZV9kYXRhICp0aGVkYXRhLCBsb25nIHZhbCkKewogICAgbmV0c25tcF92YXJpYWJsZV9saXN0ICp2YXJzID0gTlVMTDsKICAgIHN0cnVjdCB0cmFjZVJvdXRlUmVzdWx0c1RhYmxlX2RhdGEgKlN0b3JhZ2VUbXAgPSBOVUxMOwoKICAgIHNubXBfdmFybGlzdF9hZGRfdmFyaWFibGUoJnZhcnMsIE5VTEwsIDAsIEFTTl9PQ1RFVF9TVFIsIChjaGFyICopIHRoZWRhdGEtPnRyYWNlUm91dGVDdGxPd25lckluZGV4LCB0aGVkYXRhLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleExlbik7ICAgLyogdHJhY2VSb3V0ZUN0bE93bmVySW5kZXggKi8KICAgIHNubXBfdmFybGlzdF9hZGRfdmFyaWFibGUoJnZhcnMsIE5VTEwsIDAsIEFTTl9PQ1RFVF9TVFIsIChjaGFyICopIHRoZWRhdGEtPnRyYWNlUm91dGVDdGxUZXN0TmFtZSwgdGhlZGF0YS0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lTGVuKTsgICAgICAgLyogdHJhY2VSb3V0ZUN0bFRlc3ROYW1lICovCgogICAgaWYgKChTdG9yYWdlVG1wID0KICAgICAgICAgaGVhZGVyX2NvbXBsZXhfZ2V0KHRyYWNlUm91dGVSZXN1bHRzVGFibGVTdG9yYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFycykpID09IE5VTEwpIHsKICAgICAgICBzbm1wX2ZyZWVfdmFyYmluZCh2YXJzKTsKICAgICAgICB2YXJzID0gTlVMTDsKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9TVUNITkFNRTsKICAgIH0gZWxzZSB7CiAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZVJlc3VsdHNPcGVyU3RhdHVzID0gdmFsOwogICAgICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlUmVzdWx0c09wZXJTdGF0dXMiLCAiZG9uZS5cbiIpKTsKICAgICAgICBzbm1wX2ZyZWVfdmFyYmluZCh2YXJzKTsKICAgICAgICB2YXJzID0gTlVMTDsKICAgICAgICByZXR1cm4gU05NUEVSUl9TVUNDRVNTOwogICAgfQp9CgoKc3RydWN0IHRyYWNlUm91dGVDdGxUYWJsZV9kYXRhICoKY3JlYXRlX3RyYWNlUm91dGVDdGxUYWJsZV9kYXRhKHZvaWQpCnsKICAgIHN0cnVjdCB0cmFjZVJvdXRlQ3RsVGFibGVfZGF0YSAqU3RvcmFnZU5ldyA9IE5VTEw7CiAgICBTdG9yYWdlTmV3ID0gU05NUF9NQUxMT0NfU1RSVUNUKHRyYWNlUm91dGVDdGxUYWJsZV9kYXRhKTsKICAgIGlmIChTdG9yYWdlTmV3ID09IE5VTEwpIHsKICAgICAgICBleGl0KDEpOwogICAgfQogICAgU3RvcmFnZU5ldy0+dHJhY2VSb3V0ZUN0bFRhcmdldEFkZHJlc3NUeXBlID0gMTsKICAgIFN0b3JhZ2VOZXctPnRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzID0gc3RyZHVwKCIiKTsKICAgIFN0b3JhZ2VOZXctPnRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzTGVuID0gMDsKICAgIFN0b3JhZ2VOZXctPnRyYWNlUm91dGVDdGxCeVBhc3NSb3V0ZVRhYmxlID0gMjsKICAgIFN0b3JhZ2VOZXctPnRyYWNlUm91dGVDdGxEYXRhU2l6ZSA9IDA7CiAgICBTdG9yYWdlTmV3LT50cmFjZVJvdXRlQ3RsVGltZU91dCA9IDM7CiAgICBTdG9yYWdlTmV3LT50cmFjZVJvdXRlQ3RsUHJvYmVzUGVySG9wID0gMzsKICAgIFN0b3JhZ2VOZXctPnRyYWNlUm91dGVDdGxQb3J0ID0gMzM0MzQ7CiAgICBTdG9yYWdlTmV3LT50cmFjZVJvdXRlQ3RsTWF4VHRsID0gMzA7CiAgICBTdG9yYWdlTmV3LT50cmFjZVJvdXRlQ3RsRFNGaWVsZCA9IDA7CiAgICBTdG9yYWdlTmV3LT50cmFjZVJvdXRlQ3RsU291cmNlQWRkcmVzc1R5cGUgPSAwOwogICAgU3RvcmFnZU5ldy0+dHJhY2VSb3V0ZUN0bFNvdXJjZUFkZHJlc3MgPSBzdHJkdXAoIiIpOwogICAgU3RvcmFnZU5ldy0+dHJhY2VSb3V0ZUN0bFNvdXJjZUFkZHJlc3NMZW4gPSAwOwogICAgU3RvcmFnZU5ldy0+dHJhY2VSb3V0ZUN0bElmSW5kZXggPSAwOwogICAgU3RvcmFnZU5ldy0+dHJhY2VSb3V0ZUN0bE1pc2NPcHRpb25zID0gc3RyZHVwKCIiKTsKICAgIFN0b3JhZ2VOZXctPnRyYWNlUm91dGVDdGxNaXNjT3B0aW9uc0xlbiA9IDA7CiAgICBTdG9yYWdlTmV3LT50cmFjZVJvdXRlQ3RsTWF4RmFpbHVyZXMgPSA1OwogICAgU3RvcmFnZU5ldy0+dHJhY2VSb3V0ZUN0bERvbnRGcmFnbWVudCA9IDI7CiAgICBTdG9yYWdlTmV3LT50cmFjZVJvdXRlQ3RsSW5pdGlhbFR0bCA9IDE7CiAgICBTdG9yYWdlTmV3LT50cmFjZVJvdXRlQ3RsRnJlcXVlbmN5ID0gMDsKICAgIFN0b3JhZ2VOZXctPnRyYWNlUm91dGVDdGxTdG9yYWdlVHlwZSA9IFNUX05PTlZPTEFUSUxFOwogICAgU3RvcmFnZU5ldy0+dHJhY2VSb3V0ZUN0bEFkbWluU3RhdHVzID0gMjsKICAgIFN0b3JhZ2VOZXctPnRyYWNlUm91dGVDdGxEZXNjciA9IChjaGFyICopIG1hbGxvYyhzdHJsZW4oIjAwIikgKyAxKTsKICAgIGlmIChTdG9yYWdlTmV3LT50cmFjZVJvdXRlQ3RsRGVzY3IgPT0gTlVMTCkgewogICAgICAgIGV4aXQoMSk7CiAgICB9CiAgICBtZW1jcHkoU3RvcmFnZU5ldy0+dHJhY2VSb3V0ZUN0bERlc2NyLCAiMDAiLCBzdHJsZW4oIjAwIikgKyAxKTsKICAgIFN0b3JhZ2VOZXctPnRyYWNlUm91dGVDdGxEZXNjcltzdHJsZW4oIjAwIildID0gJ1wwJzsKICAgIFN0b3JhZ2VOZXctPnRyYWNlUm91dGVDdGxEZXNjckxlbiA9CiAgICAgICAgc3RybGVuKFN0b3JhZ2VOZXctPnRyYWNlUm91dGVDdGxEZXNjcik7CgogICAgU3RvcmFnZU5ldy0+dHJhY2VSb3V0ZUN0bE1heFJvd3MgPSA1MDsKICAgIFN0b3JhZ2VOZXctPnRyYWNlUm91dGVDdGxUcmFwR2VuZXJhdGlvbiA9IHN0cmR1cCgiIik7CiAgICBTdG9yYWdlTmV3LT50cmFjZVJvdXRlQ3RsVHJhcEdlbmVyYXRpb25MZW4gPSAwOwogICAgU3RvcmFnZU5ldy0+dHJhY2VSb3V0ZUN0bENyZWF0ZUhvcHNFbnRyaWVzID0gMjsKCiAgICBTdG9yYWdlTmV3LT50cmFjZVJvdXRlQ3RsVHlwZSA9IGNhbGxvYygxLCBzaXplb2Yob2lkKSAqIHNpemVvZigyKSk7IC8qIDAuMCAqLwogICAgU3RvcmFnZU5ldy0+dHJhY2VSb3V0ZUN0bFR5cGVMZW4gPSAyOwoKICAgIFN0b3JhZ2VOZXctPnRyYWNlUm91dGVSZXN1bHRzID0gTlVMTDsKICAgIFN0b3JhZ2VOZXctPnRyYWNlUm91dGVQcm9iZUhpcyA9IE5VTEw7CiAgICBTdG9yYWdlTmV3LT50cmFjZVJvdXRlSG9wcyA9IE5VTEw7CgogICAgU3RvcmFnZU5ldy0+c3RvcmFnZVR5cGUgPSBTVF9OT05WT0xBVElMRTsKICAgIC8qIFN0b3JhZ2VOZXctPnRyYWNlUm91dGVQcm9iZUhpc3RvcnlNYXhJbmRleD0wOyAqLwogICAgcmV0dXJuIFN0b3JhZ2VOZXc7Cn0KCgovKgogKiB0cmFjZVJvdXRlQ3RsVGFibGVfYWRkKCk6IGFkZHMgYSBzdHJ1Y3R1cmUgbm9kZSB0byBvdXIgZGF0YSBzZXQgCiAqLwppbnQKdHJhY2VSb3V0ZUN0bFRhYmxlX2FkZChzdHJ1Y3QgdHJhY2VSb3V0ZUN0bFRhYmxlX2RhdGEgKnRoZWRhdGEpCnsKICAgIG5ldHNubXBfdmFyaWFibGVfbGlzdCAqdmFycyA9IE5VTEw7CgoKICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlQ3RsVGFibGUiLCAiYWRkaW5nIGRhdGEuLi4gICIpKTsKICAgIC8qCiAgICAgKiBhZGQgdGhlIGluZGV4IHZhcmlhYmxlcyB0byB0aGUgdmFyYmluZCBsaXN0LCB3aGljaCBpcyAKICAgICAqIHVzZWQgYnkgaGVhZGVyX2NvbXBsZXggdG8gaW5kZXggdGhlIGRhdGEgCiAgICAgKi8KCgogICAgc25tcF92YXJsaXN0X2FkZF92YXJpYWJsZSgmdmFycywgTlVMTCwgMCwgQVNOX09DVEVUX1NUUiwgKGNoYXIgKikgdGhlZGF0YS0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXgsIHRoZWRhdGEtPnRyYWNlUm91dGVDdGxPd25lckluZGV4TGVuKTsgICAvKiB0cmFjZVJvdXRlQ3RsT3duZXJJbmRleCAqLwogICAgc25tcF92YXJsaXN0X2FkZF92YXJpYWJsZSgmdmFycywgTlVMTCwgMCwgQVNOX09DVEVUX1NUUiwgKGNoYXIgKikgdGhlZGF0YS0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lLCB0aGVkYXRhLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWVMZW4pOyAgICAgICAvKiB0cmFjZVJvdXRlQ3RsT3BlcmF0aW9uTmFtZSAqLwoKICAgIGlmIChoZWFkZXJfY29tcGxleF9hZGRfZGF0YSgmdHJhY2VSb3V0ZUN0bFRhYmxlU3RvcmFnZSwgdmFycywgdGhlZGF0YSkKICAgICAgICA9PSBOVUxMKSB7CiAgICAgICAgdmFycyA9IE5VTEw7CiAgICAgICAgcmV0dXJuIFNOTVBFUlJfR0VORVJSOwogICAgfSBlbHNlIHsKCiAgICAgICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVDdGxUYWJsZSIsICJyZWdpc3RlcmVkIGFuIGVudHJ5XG4iKSk7CgoKICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZUN0bFRhYmxlIiwgImRvbmUuXG4iKSk7CiAgICAgICAgdmFycyA9IE5VTEw7CiAgICAgICAgcmV0dXJuIFNOTVBFUlJfU1VDQ0VTUzsKICAgIH0KfQoKaW50CnRyYWNlUm91dGVSZXN1bHRzVGFibGVfYWRkKHN0cnVjdCB0cmFjZVJvdXRlQ3RsVGFibGVfZGF0YSAqdGhlZGF0YSkKewogICAgbmV0c25tcF92YXJpYWJsZV9saXN0ICp2YXJzX2xpc3QgPSBOVUxMOwogICAgc3RydWN0IHRyYWNlUm91dGVSZXN1bHRzVGFibGVfZGF0YSAqcCA9IE5VTEw7CiAgICBwID0gdGhlZGF0YS0+dHJhY2VSb3V0ZVJlc3VsdHM7CiAgICBpZiAodGhlZGF0YS0+dHJhY2VSb3V0ZVJlc3VsdHMgIT0gTlVMTCkgewogICAgICAgIHNubXBfdmFybGlzdF9hZGRfdmFyaWFibGUoJnZhcnNfbGlzdCwgTlVMTCwgMCwgQVNOX09DVEVUX1NUUiwgKGNoYXIgKikgcC0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXgsIHAtPnRyYWNlUm91dGVDdGxPd25lckluZGV4TGVuKTsgICAgICAvKiB0cmFjZVJvdXRlQ3RsT3duZXJJbmRleCAqLwogICAgICAgIHNubXBfdmFybGlzdF9hZGRfdmFyaWFibGUoJnZhcnNfbGlzdCwgTlVMTCwgMCwgQVNOX09DVEVUX1NUUiwgKGNoYXIgKikgcC0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lLCBwLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWVMZW4pOyAgLyogdHJhY2VSb3V0ZUN0bFRlc3ROYW1lICovCiAgICAgICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVSZXN1bHRzVGFibGUiLCAiYWRkaW5nIGRhdGEuLi4gICIpKTsKICAgICAgICAvKgogICAgICAgICAqIGFkZCB0aGUgaW5kZXggdmFyaWFibGVzIHRvIHRoZSB2YXJiaW5kIGxpc3QsIHdoaWNoIGlzIAogICAgICAgICAqIHVzZWQgYnkgaGVhZGVyX2NvbXBsZXggdG8gaW5kZXggdGhlIGRhdGEgCiAgICAgICAgICovCgogICAgICAgIGhlYWRlcl9jb21wbGV4X2FkZF9kYXRhKCZ0cmFjZVJvdXRlUmVzdWx0c1RhYmxlU3RvcmFnZSwgdmFyc19saXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHApOwogICAgICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlUmVzdWx0c1RhYmxlIiwgIm91dCBmaW5pc2hlZFxuIikpOwogICAgICAgIHZhcnNfbGlzdCA9IE5VTEw7CiAgICAgICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVSZXN1bHRzVGFibGUiLCAiZG9uZS5cbiIpKTsKICAgICAgICByZXR1cm4gU05NUEVSUl9TVUNDRVNTOwogICAgfSBlbHNlIHsKICAgICAgICB2YXJzX2xpc3QgPSBOVUxMOwogICAgICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlUmVzdWx0c1RhYmxlIiwgImVycm9yLlxuIikpOwogICAgICAgIHJldHVybiBTTk1QX0VSUl9JTkNPTlNJU1RFTlROQU1FOwogICAgfQp9CgoKaW50CnRyYWNlUm91dGVQcm9iZUhpc3RvcnlUYWJsZV9hZGQoc3RydWN0IHRyYWNlUm91dGVQcm9iZUhpc3RvcnlUYWJsZV9kYXRhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnRoZWRhdGEpCnsKICAgIG5ldHNubXBfdmFyaWFibGVfbGlzdCAqdmFyc19saXN0ID0gTlVMTDsKICAgIGlmICh0aGVkYXRhICE9IE5VTEwpIHsKICAgICAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzX2xpc3QsIE5VTEwsIDAsIEFTTl9PQ1RFVF9TVFIsIChjaGFyICopIHRoZWRhdGEtPnRyYWNlUm91dGVDdGxPd25lckluZGV4LCB0aGVkYXRhLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleExlbik7ICAvKiB0cmFjZVJvdXRlQ3RsT3duZXJJbmRleCAqLwogICAgICAgIHNubXBfdmFybGlzdF9hZGRfdmFyaWFibGUoJnZhcnNfbGlzdCwgTlVMTCwgMCwgQVNOX09DVEVUX1NUUiwgKGNoYXIgKikgdGhlZGF0YS0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lLCB0aGVkYXRhLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWVMZW4pOyAgICAgIC8qIHRyYWNlUm91dGVDdGxUZXN0TmFtZSAqLwogICAgICAgIHNubXBfdmFybGlzdF9hZGRfdmFyaWFibGUoJnZhcnNfbGlzdCwgTlVMTCwgMCwgQVNOX1VOU0lHTkVELCAoY2hhciAqKSAmdGhlZGF0YS0+dHJhY2VSb3V0ZVByb2JlSGlzdG9yeUluZGV4LCBzaXplb2YodGhlZGF0YS0+dHJhY2VSb3V0ZVByb2JlSGlzdG9yeUluZGV4KSk7ICAgICAvKiB0cmFjZVJvdXRlUHJvYmVIaXN0b3J5SW5kZXggKi8KICAgICAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzX2xpc3QsIE5VTEwsIDAsIEFTTl9VTlNJR05FRCwgKGNoYXIgKikgJnRoZWRhdGEtPnRyYWNlUm91dGVQcm9iZUhpc3RvcnlIb3BJbmRleCwgc2l6ZW9mKHRoZWRhdGEtPnRyYWNlUm91dGVQcm9iZUhpc3RvcnlIb3BJbmRleCkpOyAgICAgICAvKiB0cmFjZVJvdXRlUHJvYmVIaXN0b3J5SG9wSW5kZXggKi8KICAgICAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzX2xpc3QsIE5VTEwsIDAsIEFTTl9VTlNJR05FRCwgKGNoYXIgKikgJnRoZWRhdGEtPnRyYWNlUm91dGVQcm9iZUhpc3RvcnlQcm9iZUluZGV4LCBzaXplb2YodGhlZGF0YS0+dHJhY2VSb3V0ZVByb2JlSGlzdG9yeVByb2JlSW5kZXgpKTsgICAvKiB0cmFjZVJvdXRlUHJvYmVIaXN0b3J5UHJvYmVJbmRleCAqLwoKICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZVByb2JlSGlzdG9yeVRhYmxlIiwgImFkZGluZyBkYXRhLi4uICAiKSk7CiAgICAgICAgLyoKICAgICAgICAgKiBhZGQgdGhlIGluZGV4IHZhcmlhYmxlcyB0byB0aGUgdmFyYmluZCBsaXN0LCB3aGljaCBpcyAKICAgICAgICAgKiB1c2VkIGJ5IGhlYWRlcl9jb21wbGV4IHRvIGluZGV4IHRoZSBkYXRhIAogICAgICAgICAqLwoKICAgICAgICBpZiAoaGVhZGVyX2NvbXBsZXhfYWRkX2RhdGEKICAgICAgICAgICAgKCZ0cmFjZVJvdXRlUHJvYmVIaXN0b3J5VGFibGVTdG9yYWdlLCB2YXJzX2xpc3QsCiAgICAgICAgICAgICB0aGVkYXRhKSA9PSBOVUxMKSB7CiAgICAgICAgICAgIHZhcnNfbGlzdCA9IE5VTEw7CiAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9JTkNPTlNJU1RFTlROQU1FOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlUHJvYmVIaXN0b3J5VGFibGUiLCAib3V0IGZpbmlzaGVkXG4iKSk7CgogICAgICAgICAgICB2YXJzX2xpc3QgPSBOVUxMOwoKICAgICAgICAgICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVQcm9iZUhpc3RvcnlUYWJsZSIsICJkb25lLlxuIikpOwogICAgICAgICAgICByZXR1cm4gU05NUEVSUl9TVUNDRVNTOwogICAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX0lOQ09OU0lTVEVOVE5BTUU7CiAgICB9Cn0KCmludAp0cmFjZVJvdXRlUHJvYmVIaXN0b3J5VGFibGVfYWRkYWxsKHN0cnVjdCB0cmFjZVJvdXRlQ3RsVGFibGVfZGF0YSAqdGhlZGF0YSkKewogICAgbmV0c25tcF92YXJpYWJsZV9saXN0ICp2YXJzX2xpc3QgPSBOVUxMOwogICAgc3RydWN0IHRyYWNlUm91dGVQcm9iZUhpc3RvcnlUYWJsZV9kYXRhICpwID0gTlVMTDsKICAgIHAgPSB0aGVkYXRhLT50cmFjZVJvdXRlUHJvYmVIaXM7CiAgICBpZiAodGhlZGF0YS0+dHJhY2VSb3V0ZVByb2JlSGlzICE9IE5VTEwpCiAgICAgICAgZG8gewogICAgICAgICAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzX2xpc3QsIE5VTEwsIDAsIEFTTl9PQ1RFVF9TVFIsIChjaGFyICopIHAtPnRyYWNlUm91dGVDdGxPd25lckluZGV4LCBwLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleExlbik7ICAvKiB0cmFjZVJvdXRlQ3RsT3duZXJJbmRleCAqLwogICAgICAgICAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzX2xpc3QsIE5VTEwsIDAsIEFTTl9PQ1RFVF9TVFIsIChjaGFyICopIHAtPnRyYWNlUm91dGVDdGxUZXN0TmFtZSwgcC0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lTGVuKTsgICAgICAvKiB0cmFjZVJvdXRlQ3RsVGVzdE5hbWUgKi8KICAgICAgICAgICAgc25tcF92YXJsaXN0X2FkZF92YXJpYWJsZSgmdmFyc19saXN0LCBOVUxMLCAwLCBBU05fVU5TSUdORUQsIChjaGFyICopICZwLT50cmFjZVJvdXRlUHJvYmVIaXN0b3J5SW5kZXgsIHNpemVvZihwLT50cmFjZVJvdXRlUHJvYmVIaXN0b3J5SW5kZXgpKTsgICAgIC8qIHRyYWNlUm91dGVQcm9iZUhpc3RvcnlJbmRleCAqLwogICAgICAgICAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzX2xpc3QsIE5VTEwsIDAsIEFTTl9VTlNJR05FRCwgKGNoYXIgKikgJnAtPnRyYWNlUm91dGVQcm9iZUhpc3RvcnlIb3BJbmRleCwgc2l6ZW9mKHAtPnRyYWNlUm91dGVQcm9iZUhpc3RvcnlIb3BJbmRleCkpOyAgICAgICAvKiB0cmFjZVJvdXRlUHJvYmVIaXN0b3J5SG9wSW5kZXggKi8KICAgICAgICAgICAgc25tcF92YXJsaXN0X2FkZF92YXJpYWJsZSgmdmFyc19saXN0LCBOVUxMLCAwLCBBU05fVU5TSUdORUQsIChjaGFyICopICZwLT50cmFjZVJvdXRlUHJvYmVIaXN0b3J5UHJvYmVJbmRleCwgc2l6ZW9mKHAtPnRyYWNlUm91dGVQcm9iZUhpc3RvcnlQcm9iZUluZGV4KSk7ICAgLyogdHJhY2VSb3V0ZVByb2JlSGlzdG9yeVByb2JlSW5kZXggKi8KCiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlUHJvYmVIaXN0b3J5VGFibGUiLAogICAgICAgICAgICAgICAgICAgICAgICAiYWRkaW5nIGRhdGEuLi4gICIpKTsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogYWRkIHRoZSBpbmRleCB2YXJpYWJsZXMgdG8gdGhlIHZhcmJpbmQgbGlzdCwgd2hpY2ggaXMgCiAgICAgICAgICAgICAqIHVzZWQgYnkgaGVhZGVyX2NvbXBsZXggdG8gaW5kZXggdGhlIGRhdGEgCiAgICAgICAgICAgICAqLwoKICAgICAgICAgICAgaWYgKGhlYWRlcl9jb21wbGV4X2FkZF9kYXRhCiAgICAgICAgICAgICAgICAoJnRyYWNlUm91dGVQcm9iZUhpc3RvcnlUYWJsZVN0b3JhZ2UsIHZhcnNfbGlzdCwKICAgICAgICAgICAgICAgICBwKSA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICB2YXJzX2xpc3QgPSBOVUxMOwogICAgICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX0lOQ09OU0lTVEVOVE5BTUU7CiAgICAgICAgICAgIH0gZWxzZSB7CgogICAgICAgICAgICAgICAgc3RydWN0IGhlYWRlcl9jb21wbGV4X2luZGV4ICp0ZW1wID0gTlVMTDsKICAgICAgICAgICAgICAgIHRlbXAgPSB0cmFjZVJvdXRlUHJvYmVIaXN0b3J5VGFibGVTdG9yYWdlOwogICAgICAgICAgICAgICAgaWYgKHRyYWNlUm91dGVQcm9iZUhpc3RvcnlUYWJsZVN0b3JhZ2UgIT0gTlVMTCkKICAgICAgICAgICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlUHJvYmVIaXN0b3J5VGFibGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWRkaW5nIGRhdGEsdmFyc19vaWQ9IikpOwogICAgICAgICAgICAgICAgICAgICAgICBERUJVR01TR09JRCgoInRyYWNlUm91dGVQcm9iZUhpc3RvcnlUYWJsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAtPm5hbWUsIHRlbXAtPm5hbWVsZW4pKTsKICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVQcm9iZUhpc3RvcnlUYWJsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcbiAiKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAgPSB0ZW1wLT5uZXh0OwogICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKHRlbXAgIT0gTlVMTCk7CgogICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVQcm9iZUhpc3RvcnlUYWJsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3V0IGZpbmlzaGVkXG4iKSk7CiAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZVByb2JlSGlzdG9yeVRhYmxlIiwgImRvbmUuXG4iKSk7CiAgICAgICAgICAgICAgICB2YXJzX2xpc3QgPSBOVUxMOwogICAgICAgICAgICAgICAgcmV0dXJuIFNOTVBFUlJfU1VDQ0VTUzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcCA9IHAtPm5leHQ7CiAgICAgICAgfSB3aGlsZSAocCAhPSBOVUxMKTsKICAgIGVsc2UgewogICAgICAgIHJldHVybiBTTk1QX0VSUl9JTkNPTlNJU1RFTlROQU1FOwogICAgfQoKfQoKCgppbnQKdHJhY2VSb3V0ZUhvcHNUYWJsZV9hZGQoc3RydWN0IHRyYWNlUm91dGVIb3BzVGFibGVfZGF0YSAqdGhlZGF0YSkKewogICAgbmV0c25tcF92YXJpYWJsZV9saXN0ICp2YXJzX2xpc3QgPSBOVUxMOwoKICAgIGlmICh0aGVkYXRhICE9IE5VTEwpIHsKICAgICAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzX2xpc3QsIE5VTEwsIDAsIEFTTl9PQ1RFVF9TVFIsIChjaGFyICopIHRoZWRhdGEtPnRyYWNlUm91dGVDdGxPd25lckluZGV4LCB0aGVkYXRhLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleExlbik7ICAvKiB0cmFjZVJvdXRlQ3RsT3duZXJJbmRleCAqLwogICAgICAgIHNubXBfdmFybGlzdF9hZGRfdmFyaWFibGUoJnZhcnNfbGlzdCwgTlVMTCwgMCwgQVNOX09DVEVUX1NUUiwgKGNoYXIgKikgdGhlZGF0YS0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lLCB0aGVkYXRhLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWVMZW4pOyAgICAgIC8qIHRyYWNlUm91dGVDdGxUZXN0TmFtZSAqLwogICAgICAgIHNubXBfdmFybGlzdF9hZGRfdmFyaWFibGUoJnZhcnNfbGlzdCwgTlVMTCwgMCwgQVNOX1VOU0lHTkVELCAoY2hhciAqKSAmdGhlZGF0YS0+dHJhY2VSb3V0ZUhvcHNIb3BJbmRleCwgc2l6ZW9mKHRoZWRhdGEtPnRyYWNlUm91dGVIb3BzSG9wSW5kZXgpKTsgICAgICAgLyogdHJhY2VSb3V0ZUhvcHNIb3BJbmRleCAqLwoKICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZUhvcHNUYWJsZSIsICJhZGRpbmcgZGF0YS4uLiAgIikpOwogICAgICAgIC8qCiAgICAgICAgICogYWRkIHRoZSBpbmRleCB2YXJpYWJsZXMgdG8gdGhlIHZhcmJpbmQgbGlzdCwgd2hpY2ggaXMgCiAgICAgICAgICogdXNlZCBieSBoZWFkZXJfY29tcGxleCB0byBpbmRleCB0aGUgZGF0YSAKICAgICAgICAgKi8KCiAgICAgICAgaWYgKGhlYWRlcl9jb21wbGV4X2FkZF9kYXRhCiAgICAgICAgICAgICgmdHJhY2VSb3V0ZUhvcHNUYWJsZVN0b3JhZ2UsIHZhcnNfbGlzdCwgdGhlZGF0YSkgPT0gTlVMTCkgewogICAgICAgICAgICB2YXJzX2xpc3QgPSBOVUxMOwogICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfSU5DT05TSVNURU5UTkFNRTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZUhvcHNUYWJsZSIsICJvdXQgZmluaXNoZWRcbiIpKTsKICAgICAgICAgICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVIb3BzVGFibGUiLCAiZG9uZS5cbiIpKTsKICAgICAgICAgICAgdmFyc19saXN0ID0gTlVMTDsKICAgICAgICAgICAgcmV0dXJuIFNOTVBFUlJfU1VDQ0VTUzsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gU05NUEVSUl9HRU5FUlI7Cn0KCmludAp0cmFjZVJvdXRlSG9wc1RhYmxlX2FkZGFsbChzdHJ1Y3QgdHJhY2VSb3V0ZUN0bFRhYmxlX2RhdGEgKnRoZWRhdGEpCnsKICAgIG5ldHNubXBfdmFyaWFibGVfbGlzdCAqdmFyc19saXN0ID0gTlVMTDsKICAgIHN0cnVjdCB0cmFjZVJvdXRlSG9wc1RhYmxlX2RhdGEgKnAgPSBOVUxMOwogICAgdmFyc19saXN0ID0gTlVMTDsKICAgIHAgPSB0aGVkYXRhLT50cmFjZVJvdXRlSG9wczsKICAgIGlmICh0aGVkYXRhLT50cmFjZVJvdXRlSG9wcyAhPSBOVUxMKSB7CiAgICAgICAgZG8gewogICAgICAgICAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzX2xpc3QsIE5VTEwsIDAsIEFTTl9PQ1RFVF9TVFIsIChjaGFyICopIHAtPnRyYWNlUm91dGVDdGxPd25lckluZGV4LCBwLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleExlbik7ICAvKiB0cmFjZVJvdXRlQ3RsT3duZXJJbmRleCAqLwogICAgICAgICAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzX2xpc3QsIE5VTEwsIDAsIEFTTl9PQ1RFVF9TVFIsIChjaGFyICopIHAtPnRyYWNlUm91dGVDdGxUZXN0TmFtZSwgcC0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lTGVuKTsgICAgICAvKiB0cmFjZVJvdXRlQ3RsVGVzdE5hbWUgKi8KICAgICAgICAgICAgc25tcF92YXJsaXN0X2FkZF92YXJpYWJsZSgmdmFyc19saXN0LCBOVUxMLCAwLCBBU05fVU5TSUdORUQsIChjaGFyICopICZwLT50cmFjZVJvdXRlSG9wc0hvcEluZGV4LCBzaXplb2YocC0+dHJhY2VSb3V0ZUhvcHNIb3BJbmRleCkpOyAgICAgICAvKiB0cmFjZVJvdXRlSG9wc0hvcEluZGV4ICovCgogICAgICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZUhvcHNUYWJsZSIsICJhZGRpbmcgZGF0YS4uLiAgIikpOwogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBhZGQgdGhlIGluZGV4IHZhcmlhYmxlcyB0byB0aGUgdmFyYmluZCBsaXN0LCB3aGljaCBpcyAKICAgICAgICAgICAgICogdXNlZCBieSBoZWFkZXJfY29tcGxleCB0byBpbmRleCB0aGUgZGF0YSAKICAgICAgICAgICAgICovCgogICAgICAgICAgICBpZiAoaGVhZGVyX2NvbXBsZXhfYWRkX2RhdGEKICAgICAgICAgICAgICAgICgmdHJhY2VSb3V0ZUhvcHNUYWJsZVN0b3JhZ2UsIHZhcnNfbGlzdCwgcCkgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgdmFyc19saXN0ID0gTlVMTDsKICAgICAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9JTkNPTlNJU1RFTlROQU1FOwogICAgICAgICAgICB9IGVsc2UgewoKICAgICAgICAgICAgICAgIHN0cnVjdCBoZWFkZXJfY29tcGxleF9pbmRleCAqdGVtcCA9IE5VTEw7CiAgICAgICAgICAgICAgICB0ZW1wID0gdHJhY2VSb3V0ZUhvcHNUYWJsZVN0b3JhZ2U7CiAgICAgICAgICAgICAgICBpZiAodHJhY2VSb3V0ZUhvcHNUYWJsZVN0b3JhZ2UgIT0gTlVMTCkKICAgICAgICAgICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlUHJvYmVIaXN0b3J5VGFibGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWRkaW5nIGRhdGEsdmFyc19vaWQ9IikpOwogICAgICAgICAgICAgICAgICAgICAgICBERUJVR01TR09JRCgoInRyYWNlUm91dGVQcm9iZUhpc3RvcnlUYWJsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAtPm5hbWUsIHRlbXAtPm5hbWVsZW4pKTsKICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVQcm9iZUhpc3RvcnlUYWJsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcbiAiKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAgPSB0ZW1wLT5uZXh0OwogICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKHRlbXAgIT0gTlVMTCk7CiAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZUhvcHNUYWJsZSIsICJvdXQgZmluaXNoZWRcbiIpKTsKCiAgICAgICAgICAgICAgICB2YXJzX2xpc3QgPSBOVUxMOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHAgPSBwLT5uZXh0OwogICAgICAgIH0gd2hpbGUgKHAgIT0gTlVMTCk7CiAgICAgICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVIb3BzVGFibGUiLCAiZG9uZS5cbiIpKTsKICAgICAgICByZXR1cm4gU05NUEVSUl9TVUNDRVNTOwogICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gU05NUF9FUlJfSU5DT05TSVNURU5UTkFNRTsKICAgIH0KCn0KCgp1bnNpZ25lZCBsb25nCnRyYWNlUm91dGVQcm9iZUhpc3RvcnlUYWJsZV9jb3VudChzdHJ1Y3QgdHJhY2VSb3V0ZUN0bFRhYmxlX2RhdGEgKnRoZWRhdGEpCnsKICAgIHN0cnVjdCBoZWFkZXJfY29tcGxleF9pbmRleCAqaGNpcHRyMiA9IE5VTEw7CiAgICBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKnZhcnMgPSBOVUxMOwogICAgb2lkICAgICAgICAgICAgIG5ld29pZFtNQVhfT0lEX0xFTl07CiAgICBzaXplX3QgICAgICAgICAgbmV3b2lkX2xlbjsKICAgIHVuc2lnbmVkIGxvbmcgICBjb3VudCA9IDA7CgogICAgc25tcF92YXJsaXN0X2FkZF92YXJpYWJsZSgmdmFycywgTlVMTCwgMCwgQVNOX09DVEVUX1NUUiwgKGNoYXIgKikgdGhlZGF0YS0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXgsIHRoZWRhdGEtPnRyYWNlUm91dGVDdGxPd25lckluZGV4TGVuKTsgICAvKiB0cmFjZVJvdXRlQ3RsT3duZXJJbmRleCAqLwogICAgc25tcF92YXJsaXN0X2FkZF92YXJpYWJsZSgmdmFycywgTlVMTCwgMCwgQVNOX09DVEVUX1NUUiwgKGNoYXIgKikgdGhlZGF0YS0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lLCB0aGVkYXRhLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWVMZW4pOyAgICAgICAvKiB0cmFjZVJvdXRlQ3RsVGVzdE5hbWUgKi8KCiAgICBoZWFkZXJfY29tcGxleF9nZW5lcmF0ZV9vaWQobmV3b2lkLCAmbmV3b2lkX2xlbiwgTlVMTCwgMCwgdmFycyk7CgogICAgdmFycyA9IE5VTEw7CiAgICBmb3IgKGhjaXB0cjIgPSB0cmFjZVJvdXRlUHJvYmVIaXN0b3J5VGFibGVTdG9yYWdlOyBoY2lwdHIyICE9IE5VTEw7CiAgICAgICAgIGhjaXB0cjIgPSBoY2lwdHIyLT5uZXh0KSB7CiAgICAgICAgaWYgKHNubXBfb2lkX2NvbXBhcmUobmV3b2lkLCBuZXdvaWRfbGVuLCBoY2lwdHIyLT5uYW1lLCBuZXdvaWRfbGVuKQogICAgICAgICAgICA9PSAwKSB7CiAgICAgICAgICAgIGNvdW50ID0gY291bnQgKyAxOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBjb3VudDsKfQoKCgp1bnNpZ25lZCBsb25nCnRyYWNlUm91dGVIb3BzVGFibGVfY291bnQoc3RydWN0IHRyYWNlUm91dGVDdGxUYWJsZV9kYXRhICp0aGVkYXRhKQp7CiAgICBzdHJ1Y3QgaGVhZGVyX2NvbXBsZXhfaW5kZXggKmhjaXB0cjIgPSBOVUxMOwogICAgbmV0c25tcF92YXJpYWJsZV9saXN0ICp2YXJzID0gTlVMTDsKICAgIG9pZCAgICAgICAgICAgICBuZXdvaWRbTUFYX09JRF9MRU5dOwogICAgc2l6ZV90ICAgICAgICAgIG5ld29pZF9sZW47CiAgICB1bnNpZ25lZCBsb25nICAgY291bnQgPSAwOwoKICAgIHNubXBfdmFybGlzdF9hZGRfdmFyaWFibGUoJnZhcnMsIE5VTEwsIDAsIEFTTl9PQ1RFVF9TVFIsIChjaGFyICopIHRoZWRhdGEtPnRyYWNlUm91dGVDdGxPd25lckluZGV4LCB0aGVkYXRhLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleExlbik7ICAgLyogdHJhY2VSb3V0ZUN0bE93bmVySW5kZXggKi8KICAgIHNubXBfdmFybGlzdF9hZGRfdmFyaWFibGUoJnZhcnMsIE5VTEwsIDAsIEFTTl9PQ1RFVF9TVFIsIChjaGFyICopIHRoZWRhdGEtPnRyYWNlUm91dGVDdGxUZXN0TmFtZSwgdGhlZGF0YS0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lTGVuKTsgICAgICAgLyogdHJhY2VSb3V0ZUN0bE9wZXJhdGlvbk5hbWUgKi8KCiAgICBoZWFkZXJfY29tcGxleF9nZW5lcmF0ZV9vaWQobmV3b2lkLCAmbmV3b2lkX2xlbiwgTlVMTCwgMCwgdmFycyk7CgogICAgdmFycyA9IE5VTEw7CiAgICBmb3IgKGhjaXB0cjIgPSB0cmFjZVJvdXRlSG9wc1RhYmxlU3RvcmFnZTsgaGNpcHRyMiAhPSBOVUxMOwogICAgICAgICBoY2lwdHIyID0gaGNpcHRyMi0+bmV4dCkgewogICAgICAgIGlmIChzbm1wX29pZF9jb21wYXJlKG5ld29pZCwgbmV3b2lkX2xlbiwgaGNpcHRyMi0+bmFtZSwgbmV3b2lkX2xlbikKICAgICAgICAgICAgPT0gMCkgewogICAgICAgICAgICBjb3VudCA9IGNvdW50ICsgMTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gY291bnQ7Cn0KCgoKdm9pZAp0cmFjZVJvdXRlUHJvYmVIaXN0b3J5VGFibGVfZGVsTGFzdChzdHJ1Y3QgdHJhY2VSb3V0ZUN0bFRhYmxlX2RhdGEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnRoZWRhdGEpCnsKICAgIHN0cnVjdCBoZWFkZXJfY29tcGxleF9pbmRleCAqaGNpcHRyMiA9IE5VTEw7CiAgICBzdHJ1Y3QgaGVhZGVyX2NvbXBsZXhfaW5kZXggKmhjaWxhc3QgPSBOVUxMOwogICAgc3RydWN0IHRyYWNlUm91dGVQcm9iZUhpc3RvcnlUYWJsZV9kYXRhICpTdG9yYWdlVG1wID0gTlVMTDsKICAgIG5ldHNubXBfdmFyaWFibGVfbGlzdCAqdmFycyA9IE5VTEw7CiAgICBvaWQgICAgICAgICAgICAgbmV3b2lkW01BWF9PSURfTEVOXTsKICAgIHNpemVfdCAgICAgICAgICBuZXdvaWRfbGVuID0gMDsKICAgIHRpbWVfdCAgICAgICAgICBsYXN0X3RpbWUgPSAyMTQ3NDgzNjQ3OwogICAgdGltZV90ICAgICAgICAgIHRwOwoKICAgIHNubXBfdmFybGlzdF9hZGRfdmFyaWFibGUoJnZhcnMsIE5VTEwsIDAsIEFTTl9PQ1RFVF9TVFIsIChjaGFyICopIHRoZWRhdGEtPnRyYWNlUm91dGVDdGxPd25lckluZGV4LCB0aGVkYXRhLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleExlbik7ICAgLyogdHJhY2VSb3V0ZUN0bE93bmVySW5kZXggKi8KICAgIHNubXBfdmFybGlzdF9hZGRfdmFyaWFibGUoJnZhcnMsIE5VTEwsIDAsIEFTTl9PQ1RFVF9TVFIsIChjaGFyICopIHRoZWRhdGEtPnRyYWNlUm91dGVDdGxUZXN0TmFtZSwgdGhlZGF0YS0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lTGVuKTsgICAgICAgLyogdHJhY2VSb3V0ZUN0bE9wZXJhdGlvbk5hbWUgKi8KCiAgICBtZW1zZXQobmV3b2lkLCAnXDAnLCBzaXplb2Yob2lkKSAqIE1BWF9PSURfTEVOKTsKICAgIGhlYWRlcl9jb21wbGV4X2dlbmVyYXRlX29pZChuZXdvaWQsICZuZXdvaWRfbGVuLCBOVUxMLCAwLCB2YXJzKTsKCiAgICBmb3IgKGhjaWxhc3QgPSBoY2lwdHIyID0gdHJhY2VSb3V0ZVByb2JlSGlzdG9yeVRhYmxlU3RvcmFnZTsKICAgICAgICAgaGNpcHRyMiAhPSBOVUxMOyBoY2lwdHIyID0gaGNpcHRyMi0+bmV4dCkgewogICAgICAgIGlmIChzbm1wX29pZF9jb21wYXJlKG5ld29pZCwgbmV3b2lkX2xlbiwgaGNpcHRyMi0+bmFtZSwgbmV3b2lkX2xlbikKICAgICAgICAgICAgPT0gMCkgewoKICAgICAgICAgICAgU3RvcmFnZVRtcCA9CiAgICAgICAgICAgICAgICBoZWFkZXJfY29tcGxleF9nZXRfZnJvbV9vaWQKICAgICAgICAgICAgICAgICh0cmFjZVJvdXRlUHJvYmVIaXN0b3J5VGFibGVTdG9yYWdlLCBoY2lwdHIyLT5uYW1lLAogICAgICAgICAgICAgICAgIGhjaXB0cjItPm5hbWVsZW4pOwogICAgICAgICAgICB0cCA9IFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVQcm9iZUhpc3RvcnlUaW1lX3RpbWU7CgogICAgICAgICAgICBpZiAobGFzdF90aW1lID4gdHApIHsKICAgICAgICAgICAgICAgIGxhc3RfdGltZSA9IHRwOwogICAgICAgICAgICAgICAgaGNpbGFzdCA9IGhjaXB0cjI7CiAgICAgICAgICAgIH0KCiAgICAgICAgfQogICAgfQogICAgaGVhZGVyX2NvbXBsZXhfZXh0cmFjdF9lbnRyeSgmdHJhY2VSb3V0ZVByb2JlSGlzdG9yeVRhYmxlU3RvcmFnZSwgaGNpbGFzdCk7CiAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZVByb2JlSGlzdG9yeVRhYmxlIiwKICAgICAgICAgICAgICAgICJkZWxldGUgdGhlIGxhc3Qgb25lIHN1Y2Nlc3MhXG4iKSk7CiAgICB2YXJzID0gTlVMTDsKfQoKCgp2b2lkCnRyYWNlUm91dGVDdGxUYWJsZV9jbGVhbmVyKHN0cnVjdCBoZWFkZXJfY29tcGxleF9pbmRleCAqdGhlc3R1ZmYpCnsKICAgIHN0cnVjdCBoZWFkZXJfY29tcGxleF9pbmRleCAqaGNpcHRyID0gTlVMTDsKICAgIHN0cnVjdCB0cmFjZVJvdXRlQ3RsVGFibGVfZGF0YSAqU3RvcmFnZURlbCA9IE5VTEw7CiAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZUN0bFRhYmxlIiwgImNsZWFuZXJvdXQgICIpKTsKICAgIGZvciAoaGNpcHRyID0gdGhlc3R1ZmY7IGhjaXB0ciAhPSBOVUxMOyBoY2lwdHIgPSBoY2lwdHItPm5leHQpIHsKICAgICAgICBTdG9yYWdlRGVsID0KICAgICAgICAgICAgaGVhZGVyX2NvbXBsZXhfZXh0cmFjdF9lbnRyeSgmdHJhY2VSb3V0ZUN0bFRhYmxlU3RvcmFnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoY2lwdHIpOwogICAgICAgIGlmIChTdG9yYWdlRGVsICE9IE5VTEwpIHsKICAgICAgICAgICAgZnJlZShTdG9yYWdlRGVsLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleCk7CiAgICAgICAgICAgIFN0b3JhZ2VEZWwtPnRyYWNlUm91dGVDdGxPd25lckluZGV4ID0gTlVMTDsKICAgICAgICAgICAgZnJlZShTdG9yYWdlRGVsLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWUpOwogICAgICAgICAgICBTdG9yYWdlRGVsLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWUgPSBOVUxMOwogICAgICAgICAgICBmcmVlKFN0b3JhZ2VEZWwtPnRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzKTsKICAgICAgICAgICAgU3RvcmFnZURlbC0+dHJhY2VSb3V0ZUN0bFRhcmdldEFkZHJlc3MgPSBOVUxMOwogICAgICAgICAgICBmcmVlKFN0b3JhZ2VEZWwtPnRyYWNlUm91dGVDdGxTb3VyY2VBZGRyZXNzKTsKICAgICAgICAgICAgU3RvcmFnZURlbC0+dHJhY2VSb3V0ZUN0bFNvdXJjZUFkZHJlc3MgPSBOVUxMOwogICAgICAgICAgICBmcmVlKFN0b3JhZ2VEZWwtPnRyYWNlUm91dGVDdGxNaXNjT3B0aW9ucyk7CiAgICAgICAgICAgIFN0b3JhZ2VEZWwtPnRyYWNlUm91dGVDdGxNaXNjT3B0aW9ucyA9IE5VTEw7CiAgICAgICAgICAgIGZyZWUoU3RvcmFnZURlbC0+dHJhY2VSb3V0ZUN0bERlc2NyKTsKICAgICAgICAgICAgU3RvcmFnZURlbC0+dHJhY2VSb3V0ZUN0bERlc2NyID0gTlVMTDsKICAgICAgICAgICAgZnJlZShTdG9yYWdlRGVsLT50cmFjZVJvdXRlQ3RsVHJhcEdlbmVyYXRpb24pOwogICAgICAgICAgICBTdG9yYWdlRGVsLT50cmFjZVJvdXRlQ3RsVHJhcEdlbmVyYXRpb24gPSBOVUxMOwogICAgICAgICAgICBmcmVlKFN0b3JhZ2VEZWwtPnRyYWNlUm91dGVDdGxUeXBlKTsKICAgICAgICAgICAgU3RvcmFnZURlbC0+dHJhY2VSb3V0ZUN0bFR5cGUgPSBOVUxMOwogICAgICAgICAgICBmcmVlKFN0b3JhZ2VEZWwpOwogICAgICAgICAgICBTdG9yYWdlRGVsID0gTlVMTDsKCiAgICAgICAgfQogICAgICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlQ3RsVGFibGUiLCAiY2xlYW5lciAgIikpOwogICAgfQp9CgoKLyoKICogcGFyc2VfbXRlT2JqZWN0c1RhYmxlKCk6CiAqICAgcGFyc2VzIC5jb25mIGZpbGUgZW50cmllcyBuZWVkZWQgdG8gY29uZmlndXJlIHRoZSBtaWIuCiAqLwp2b2lkCnBhcnNlX3RyYWNlUm91dGVDdGxUYWJsZShjb25zdCBjaGFyICp0b2tlbiwgY2hhciAqbGluZSkKewogICAgc2l6ZV90ICAgICAgICAgIHRtcGludDsKICAgIHN0cnVjdCB0cmFjZVJvdXRlQ3RsVGFibGVfZGF0YSAqU3RvcmFnZVRtcCA9CiAgICAgICAgU05NUF9NQUxMT0NfU1RSVUNUKHRyYWNlUm91dGVDdGxUYWJsZV9kYXRhKTsKCiAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZUN0bFRhYmxlIiwgInBhcnNpbmcgY29uZmlnLi4uICAiKSk7CgoKICAgIGlmIChTdG9yYWdlVG1wID09IE5VTEwpIHsKICAgICAgICBjb25maWdfcGVycm9yKCJtYWxsb2MgZmFpbHVyZSIpOwogICAgICAgIHJldHVybjsKICAgIH0KCgogICAgbGluZSA9CiAgICAgICAgcmVhZF9jb25maWdfcmVhZF9kYXRhKEFTTl9PQ1RFVF9TVFIsIGxpbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxPd25lckluZGV4TGVuKTsKICAgIGlmIChTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleCA9PSBOVUxMKSB7CiAgICAgICAgY29uZmlnX3BlcnJvcigiaW52YWxpZCBzcGVjaWZpY2F0aW9uIGZvciB0cmFjZVJvdXRlQ3RsT3duZXJJbmRleCIpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBsaW5lID0KICAgICAgICByZWFkX2NvbmZpZ19yZWFkX2RhdGEoQVNOX09DVEVUX1NUUiwgbGluZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUZXN0TmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUZXN0TmFtZUxlbik7CiAgICBpZiAoU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lID09IE5VTEwpIHsKICAgICAgICBjb25maWdfcGVycm9yKCJpbnZhbGlkIHNwZWNpZmljYXRpb24gZm9yIHRyYWNlUm91dGVDdGxUZXN0TmFtZSIpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBsaW5lID0KICAgICAgICByZWFkX2NvbmZpZ19yZWFkX2RhdGEoQVNOX0lOVEVHRVIsIGxpbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVGFyZ2V0QWRkcmVzc1R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0bXBpbnQpOwoKICAgIGxpbmUgPQogICAgICAgIHJlYWRfY29uZmlnX3JlYWRfZGF0YShBU05fT0NURVRfU1RSLCBsaW5lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFRhcmdldEFkZHJlc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVGFyZ2V0QWRkcmVzc0xlbik7CiAgICBpZiAoU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFRhcmdldEFkZHJlc3MgPT0gTlVMTCkgewogICAgICAgIGNvbmZpZ19wZXJyb3IKICAgICAgICAgICAgKCJpbnZhbGlkIHNwZWNpZmljYXRpb24gZm9yIHRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzIik7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGxpbmUgPQogICAgICAgIHJlYWRfY29uZmlnX3JlYWRfZGF0YShBU05fSU5URUdFUiwgbGluZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxCeVBhc3NSb3V0ZVRhYmxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG1waW50KTsKICAgIGxpbmUgPQogICAgICAgIHJlYWRfY29uZmlnX3JlYWRfZGF0YShBU05fVU5TSUdORUQsIGxpbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsRGF0YVNpemUsICZ0bXBpbnQpOwoKICAgIGxpbmUgPQogICAgICAgIHJlYWRfY29uZmlnX3JlYWRfZGF0YShBU05fVU5TSUdORUQsIGxpbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVGltZU91dCwgJnRtcGludCk7CgogICAgbGluZSA9CiAgICAgICAgcmVhZF9jb25maWdfcmVhZF9kYXRhKEFTTl9VTlNJR05FRCwgbGluZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxQcm9iZXNQZXJIb3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0bXBpbnQpOwoKICAgIGxpbmUgPQogICAgICAgIHJlYWRfY29uZmlnX3JlYWRfZGF0YShBU05fVU5TSUdORUQsIGxpbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsUG9ydCwgJnRtcGludCk7CgogICAgbGluZSA9CiAgICAgICAgcmVhZF9jb25maWdfcmVhZF9kYXRhKEFTTl9VTlNJR05FRCwgbGluZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxNYXhUdGwsICZ0bXBpbnQpOwoKICAgIGxpbmUgPQogICAgICAgIHJlYWRfY29uZmlnX3JlYWRfZGF0YShBU05fVU5TSUdORUQsIGxpbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsRFNGaWVsZCwgJnRtcGludCk7CgogICAgbGluZSA9CiAgICAgICAgcmVhZF9jb25maWdfcmVhZF9kYXRhKEFTTl9JTlRFR0VSLCBsaW5lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFNvdXJjZUFkZHJlc3NUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG1waW50KTsKCiAgICBsaW5lID0KICAgICAgICByZWFkX2NvbmZpZ19yZWFkX2RhdGEoQVNOX09DVEVUX1NUUiwgbGluZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxTb3VyY2VBZGRyZXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFNvdXJjZUFkZHJlc3NMZW4pOwogICAgaWYgKFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxTb3VyY2VBZGRyZXNzID09IE5VTEwpIHsKICAgICAgICBjb25maWdfcGVycm9yCiAgICAgICAgICAgICgiaW52YWxpZCBzcGVjaWZpY2F0aW9uIGZvciB0cmFjZVJvdXRlQ3RsU291cmNlQWRkcmVzcyIpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBsaW5lID0KICAgICAgICByZWFkX2NvbmZpZ19yZWFkX2RhdGEoQVNOX0lOVEVHRVIsIGxpbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsSWZJbmRleCwgJnRtcGludCk7CgogICAgbGluZSA9CiAgICAgICAgcmVhZF9jb25maWdfcmVhZF9kYXRhKEFTTl9PQ1RFVF9TVFIsIGxpbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsTWlzY09wdGlvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsTWlzY09wdGlvbnNMZW4pOwogICAgaWYgKFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxNaXNjT3B0aW9ucyA9PSBOVUxMKSB7CiAgICAgICAgY29uZmlnX3BlcnJvcgogICAgICAgICAgICAoImludmFsaWQgc3BlY2lmaWNhdGlvbiBmb3IgdHJhY2VSb3V0ZUN0bE1pc2NPcHRpb25zIik7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGxpbmUgPQogICAgICAgIHJlYWRfY29uZmlnX3JlYWRfZGF0YShBU05fVU5TSUdORUQsIGxpbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsTWF4RmFpbHVyZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0bXBpbnQpOwoKICAgIGxpbmUgPQogICAgICAgIHJlYWRfY29uZmlnX3JlYWRfZGF0YShBU05fSU5URUdFUiwgbGluZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxEb250RnJhZ21lbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0bXBpbnQpOwoKICAgIGxpbmUgPQogICAgICAgIHJlYWRfY29uZmlnX3JlYWRfZGF0YShBU05fVU5TSUdORUQsIGxpbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsSW5pdGlhbFR0bCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRtcGludCk7CgogICAgbGluZSA9CiAgICAgICAgcmVhZF9jb25maWdfcmVhZF9kYXRhKEFTTl9VTlNJR05FRCwgbGluZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxGcmVxdWVuY3ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0bXBpbnQpOwoKICAgIGxpbmUgPQogICAgICAgIHJlYWRfY29uZmlnX3JlYWRfZGF0YShBU05fSU5URUdFUiwgbGluZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxTdG9yYWdlVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRtcGludCk7CgogICAgbGluZSA9CiAgICAgICAgcmVhZF9jb25maWdfcmVhZF9kYXRhKEFTTl9JTlRFR0VSLCBsaW5lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bEFkbWluU3RhdHVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG1waW50KTsKCiAgICBsaW5lID0KICAgICAgICByZWFkX2NvbmZpZ19yZWFkX2RhdGEoQVNOX09DVEVUX1NUUiwgbGluZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxEZXNjciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxEZXNjckxlbik7CiAgICBpZiAoU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bERlc2NyID09IE5VTEwpIHsKICAgICAgICBjb25maWdfcGVycm9yKCJpbnZhbGlkIHNwZWNpZmljYXRpb24gZm9yIHRyYWNlUm91dGVDdGxUcmFwRGVzY3IiKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbGluZSA9CiAgICAgICAgcmVhZF9jb25maWdfcmVhZF9kYXRhKEFTTl9VTlNJR05FRCwgbGluZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxNYXhSb3dzLCAmdG1waW50KTsKCiAgICBsaW5lID0KICAgICAgICByZWFkX2NvbmZpZ19yZWFkX2RhdGEoQVNOX09DVEVUX1NUUiwgbGluZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUcmFwR2VuZXJhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUcmFwR2VuZXJhdGlvbkxlbik7CiAgICBpZiAoU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFRyYXBHZW5lcmF0aW9uID09IE5VTEwpIHsKICAgICAgICBjb25maWdfcGVycm9yCiAgICAgICAgICAgICgiaW52YWxpZCBzcGVjaWZpY2F0aW9uIGZvciB0cmFjZVJvdXRlQ3RsVHJhcEdlbmVyYXRpb24iKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbGluZSA9CiAgICAgICAgcmVhZF9jb25maWdfcmVhZF9kYXRhKEFTTl9JTlRFR0VSLCBsaW5lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bENyZWF0ZUhvcHNFbnRyaWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG1waW50KTsKCiAgICBsaW5lID0KICAgICAgICByZWFkX2NvbmZpZ19yZWFkX2RhdGEoQVNOX09CSkVDVF9JRCwgbGluZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFR5cGVMZW4pOwogICAgaWYgKFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUeXBlID09IE5VTEwpIHsKICAgICAgICBjb25maWdfcGVycm9yKCJpbnZhbGlkIHNwZWNpZmljYXRpb24gZm9yIHRyYWNlUm91dGVDdGxUeXBlIik7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGxpbmUgPQogICAgICAgIHJlYWRfY29uZmlnX3JlYWRfZGF0YShBU05fSU5URUdFUiwgbGluZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxSb3dTdGF0dXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0bXBpbnQpOwoKICAgIGxpbmUgPQogICAgICAgIHJlYWRfY29uZmlnX3JlYWRfZGF0YShBU05fVU5TSUdORUQsIGxpbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT50cmFjZVJvdXRlUHJvYmVIaXN0b3J5TWF4SW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0bXBpbnQpOwoKICAgIFN0b3JhZ2VUbXAtPnN0b3JhZ2VUeXBlID0gU1RfTk9OVk9MQVRJTEU7CiAgICB0cmFjZVJvdXRlQ3RsVGFibGVfYWRkKFN0b3JhZ2VUbXApOwogICAgLyogICAgIHRyYWNlUm91dGVDdGxUYWJsZV9jbGVhbmVyKHRyYWNlUm91dGVDdGxUYWJsZVN0b3JhZ2UpOyAqLwoKICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlQ3RsVGFibGUiLCAiZG9uZS5cbiIpKTsKfQoKCgovKgogKiBzdG9yZV90cmFjZVJvdXRlQ3RsVGFibGUoKToKICogICBzdG9yZXMgLmNvbmYgZmlsZSBlbnRyaWVzIG5lZWRlZCB0byBjb25maWd1cmUgdGhlIG1pYi4KICovCmludApzdG9yZV90cmFjZVJvdXRlQ3RsVGFibGUoaW50IG1ham9ySUQsIGludCBtaW5vcklELCB2b2lkICpzZXJ2ZXJhcmcsCiAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjbGllbnRhcmcpCnsKICAgIGNoYXIgICAgICAgICAgICBsaW5lW1NOTVBfTUFYQlVGXTsKICAgIGNoYXIgICAgICAgICAgICpjcHRyID0gTlVMTDsKICAgIHNpemVfdCAgICAgICAgICB0bXBpbnQ7CiAgICBzdHJ1Y3QgdHJhY2VSb3V0ZUN0bFRhYmxlX2RhdGEgKlN0b3JhZ2VUbXAgPSBOVUxMOwogICAgc3RydWN0IGhlYWRlcl9jb21wbGV4X2luZGV4ICpoY2luZGV4ID0gTlVMTDsKCgogICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVDdGxUYWJsZSIsICJzdG9yaW5nIGRhdGEuLi4gICIpKTsKCgogICAgZm9yIChoY2luZGV4ID0gdHJhY2VSb3V0ZUN0bFRhYmxlU3RvcmFnZTsgaGNpbmRleCAhPSBOVUxMOwogICAgICAgICBoY2luZGV4ID0gaGNpbmRleC0+bmV4dCkgewogICAgICAgIFN0b3JhZ2VUbXAgPSAoc3RydWN0IHRyYWNlUm91dGVDdGxUYWJsZV9kYXRhICopIGhjaW5kZXgtPmRhdGE7CgogICAgICAgIGlmIChTdG9yYWdlVG1wLT5zdG9yYWdlVHlwZSAhPSBTVF9SRUFET05MWSkgewogICAgICAgICAgICBtZW1zZXQobGluZSwgMCwgc2l6ZW9mKGxpbmUpKTsKICAgICAgICAgICAgc3RyY2F0KGxpbmUsICJ0cmFjZVJvdXRlQ3RsVGFibGUgIik7CiAgICAgICAgICAgIGNwdHIgPSBsaW5lICsgc3RybGVuKGxpbmUpOwoKICAgICAgICAgICAgY3B0ciA9CiAgICAgICAgICAgICAgICByZWFkX2NvbmZpZ19zdG9yZV9kYXRhKEFTTl9PQ1RFVF9TVFIsIGNwdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VSb3V0ZUN0bE93bmVySW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VSb3V0ZUN0bE93bmVySW5kZXhMZW4pOwogICAgICAgICAgICBjcHRyID0KICAgICAgICAgICAgICAgIHJlYWRfY29uZmlnX3N0b3JlX2RhdGEoQVNOX09DVEVUX1NUUiwgY3B0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUZXN0TmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZVJvdXRlQ3RsVGVzdE5hbWVMZW4pOwogICAgICAgICAgICBjcHRyID0KICAgICAgICAgICAgICAgIHJlYWRfY29uZmlnX3N0b3JlX2RhdGEoQVNOX0lOVEVHRVIsIGNwdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VSb3V0ZUN0bFRhcmdldEFkZHJlc3NUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG1waW50KTsKICAgICAgICAgICAgY3B0ciA9CiAgICAgICAgICAgICAgICByZWFkX2NvbmZpZ19zdG9yZV9kYXRhKEFTTl9PQ1RFVF9TVFIsIGNwdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VSb3V0ZUN0bFRhcmdldEFkZHJlc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VSb3V0ZUN0bFRhcmdldEFkZHJlc3NMZW4pOwogICAgICAgICAgICBjcHRyID0KICAgICAgICAgICAgICAgIHJlYWRfY29uZmlnX3N0b3JlX2RhdGEoQVNOX0lOVEVHRVIsIGNwdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VSb3V0ZUN0bEJ5UGFzc1JvdXRlVGFibGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0bXBpbnQpOwogICAgICAgICAgICBjcHRyID0KICAgICAgICAgICAgICAgIHJlYWRfY29uZmlnX3N0b3JlX2RhdGEoQVNOX1VOU0lHTkVELCBjcHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bERhdGFTaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG1waW50KTsKICAgICAgICAgICAgY3B0ciA9CiAgICAgICAgICAgICAgICByZWFkX2NvbmZpZ19zdG9yZV9kYXRhKEFTTl9VTlNJR05FRCwgY3B0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUaW1lT3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG1waW50KTsKICAgICAgICAgICAgY3B0ciA9CiAgICAgICAgICAgICAgICByZWFkX2NvbmZpZ19zdG9yZV9kYXRhKEFTTl9VTlNJR05FRCwgY3B0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZVJvdXRlQ3RsUHJvYmVzUGVySG9wLCAmdG1waW50KTsKICAgICAgICAgICAgY3B0ciA9CiAgICAgICAgICAgICAgICByZWFkX2NvbmZpZ19zdG9yZV9kYXRhKEFTTl9VTlNJR05FRCwgY3B0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxQb3J0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG1waW50KTsKICAgICAgICAgICAgY3B0ciA9CiAgICAgICAgICAgICAgICByZWFkX2NvbmZpZ19zdG9yZV9kYXRhKEFTTl9VTlNJR05FRCwgY3B0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxNYXhUdGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0bXBpbnQpOwogICAgICAgICAgICBjcHRyID0KICAgICAgICAgICAgICAgIHJlYWRfY29uZmlnX3N0b3JlX2RhdGEoQVNOX1VOU0lHTkVELCBjcHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bERTRmllbGQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0bXBpbnQpOwoKICAgICAgICAgICAgY3B0ciA9CiAgICAgICAgICAgICAgICByZWFkX2NvbmZpZ19zdG9yZV9kYXRhKEFTTl9JTlRFR0VSLCBjcHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlUm91dGVDdGxTb3VyY2VBZGRyZXNzVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRtcGludCk7CiAgICAgICAgICAgIGNwdHIgPQogICAgICAgICAgICAgICAgcmVhZF9jb25maWdfc3RvcmVfZGF0YShBU05fT0NURVRfU1RSLCBjcHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlUm91dGVDdGxTb3VyY2VBZGRyZXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlUm91dGVDdGxTb3VyY2VBZGRyZXNzTGVuKTsKICAgICAgICAgICAgY3B0ciA9CiAgICAgICAgICAgICAgICByZWFkX2NvbmZpZ19zdG9yZV9kYXRhKEFTTl9JTlRFR0VSLCBjcHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bElmSW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0bXBpbnQpOwogICAgICAgICAgICBjcHRyID0KICAgICAgICAgICAgICAgIHJlYWRfY29uZmlnX3N0b3JlX2RhdGEoQVNOX09DVEVUX1NUUiwgY3B0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZVJvdXRlQ3RsTWlzY09wdGlvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VSb3V0ZUN0bE1pc2NPcHRpb25zTGVuKTsKICAgICAgICAgICAgY3B0ciA9CiAgICAgICAgICAgICAgICByZWFkX2NvbmZpZ19zdG9yZV9kYXRhKEFTTl9VTlNJR05FRCwgY3B0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZVJvdXRlQ3RsTWF4RmFpbHVyZXMsICZ0bXBpbnQpOwogICAgICAgICAgICBjcHRyID0KICAgICAgICAgICAgICAgIHJlYWRfY29uZmlnX3N0b3JlX2RhdGEoQVNOX0lOVEVHRVIsIGNwdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VSb3V0ZUN0bERvbnRGcmFnbWVudCwgJnRtcGludCk7CiAgICAgICAgICAgIGNwdHIgPQogICAgICAgICAgICAgICAgcmVhZF9jb25maWdfc3RvcmVfZGF0YShBU05fVU5TSUdORUQsIGNwdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VSb3V0ZUN0bEluaXRpYWxUdGwsICZ0bXBpbnQpOwogICAgICAgICAgICBjcHRyID0KICAgICAgICAgICAgICAgIHJlYWRfY29uZmlnX3N0b3JlX2RhdGEoQVNOX1VOU0lHTkVELCBjcHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bEZyZXF1ZW5jeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRtcGludCk7CgogICAgICAgICAgICBjcHRyID0KICAgICAgICAgICAgICAgIHJlYWRfY29uZmlnX3N0b3JlX2RhdGEoQVNOX0lOVEVHRVIsIGNwdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VSb3V0ZUN0bFN0b3JhZ2VUeXBlLCAmdG1waW50KTsKICAgICAgICAgICAgY3B0ciA9CiAgICAgICAgICAgICAgICByZWFkX2NvbmZpZ19zdG9yZV9kYXRhKEFTTl9JTlRFR0VSLCBjcHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlUm91dGVDdGxBZG1pblN0YXR1cywgJnRtcGludCk7CiAgICAgICAgICAgIGNwdHIgPQogICAgICAgICAgICAgICAgcmVhZF9jb25maWdfc3RvcmVfZGF0YShBU05fT0NURVRfU1RSLCBjcHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bERlc2NyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bERlc2NyTGVuKTsKICAgICAgICAgICAgY3B0ciA9CiAgICAgICAgICAgICAgICByZWFkX2NvbmZpZ19zdG9yZV9kYXRhKEFTTl9VTlNJR05FRCwgY3B0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxNYXhSb3dzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG1waW50KTsKICAgICAgICAgICAgY3B0ciA9CiAgICAgICAgICAgICAgICByZWFkX2NvbmZpZ19zdG9yZV9kYXRhKEFTTl9PQ1RFVF9TVFIsIGNwdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VSb3V0ZUN0bFRyYXBHZW5lcmF0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlUm91dGVDdGxUcmFwR2VuZXJhdGlvbkxlbik7CiAgICAgICAgICAgIGNwdHIgPQogICAgICAgICAgICAgICAgcmVhZF9jb25maWdfc3RvcmVfZGF0YShBU05fSU5URUdFUiwgY3B0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZVJvdXRlQ3RsQ3JlYXRlSG9wc0VudHJpZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0bXBpbnQpOwogICAgICAgICAgICBjcHRyID0KICAgICAgICAgICAgICAgIHJlYWRfY29uZmlnX3N0b3JlX2RhdGEoQVNOX09CSkVDVF9JRCwgY3B0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFR5cGVMZW4pOwogICAgICAgICAgICBjcHRyID0KICAgICAgICAgICAgICAgIHJlYWRfY29uZmlnX3N0b3JlX2RhdGEoQVNOX0lOVEVHRVIsIGNwdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsUm93U3RhdHVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG1waW50KTsKICAgICAgICAgICAgY3B0ciA9CiAgICAgICAgICAgICAgICByZWFkX2NvbmZpZ19zdG9yZV9kYXRhKEFTTl9VTlNJR05FRCwgY3B0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZVJvdXRlUHJvYmVIaXN0b3J5TWF4SW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0bXBpbnQpOwoKCgogICAgICAgICAgICBzbm1wZF9zdG9yZV9jb25maWcobGluZSk7CiAgICAgICAgfQogICAgfQogICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVDdGxUYWJsZSIsICJkb25lLlxuIikpOwogICAgcmV0dXJuIFNOTVBFUlJfU1VDQ0VTUzsKfQoKCgoKLyoKICogdmFyX3RyYWNlUm91dGVDdGxUYWJsZSgpOgogKiAgIEhhbmRsZSB0aGlzIHRhYmxlIHNlcGFyYXRlbHkgZnJvbSB0aGUgc2NhbGFyIHZhbHVlIGNhc2UuCiAqICAgVGhlIHdvcmtpbmdzIG9mIHRoaXMgYXJlIGJhc2ljYWxseSB0aGUgc2FtZSBhcyBmb3IgdmFyX210ZU9iamVjdHNUYWJsZSBhYm92ZS4KICovCnVuc2lnbmVkIGNoYXIgICoKdmFyX3RyYWNlUm91dGVDdGxUYWJsZShzdHJ1Y3QgdmFyaWFibGUgKnZwLAogICAgICAgICAgICAgICAgICAgICAgIG9pZCAqIG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICpsZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgaW50IGV4YWN0LAogICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqdmFyX2xlbiwgV3JpdGVNZXRob2QgKiogd3JpdGVfbWV0aG9kKQp7CgogICAgc3RydWN0IHRyYWNlUm91dGVDdGxUYWJsZV9kYXRhICpTdG9yYWdlVG1wID0gTlVMTDsKCiAgICAvKgogICAgICogdGhpcyBhc3N1bWVzIHlvdSBoYXZlIHJlZ2lzdGVyZWQgYWxsIHlvdXIgZGF0YSBwcm9wZXJseQogICAgICovCiAgICBpZiAoKFN0b3JhZ2VUbXAgPQogICAgICAgICBoZWFkZXJfY29tcGxleCh0cmFjZVJvdXRlQ3RsVGFibGVTdG9yYWdlLCB2cCwgbmFtZSwgbGVuZ3RoLCBleGFjdCwKICAgICAgICAgICAgICAgICAgICAgICAgdmFyX2xlbiwgd3JpdGVfbWV0aG9kKSkgPT0gTlVMTCkgewogICAgICAgIGlmICh2cC0+bWFnaWMgPT0gQ09MVU1OX1RSQUNFUk9VVEVDVExST1dTVEFUVVMpCiAgICAgICAgICAgICp3cml0ZV9tZXRob2QgPSB3cml0ZV90cmFjZVJvdXRlQ3RsUm93U3RhdHVzOwoKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KCiAgICAvKgogICAgICogdGhpcyBpcyB3aGVyZSB3ZSBkbyB0aGUgdmFsdWUgYXNzaWdubWVudHMgZm9yIHRoZSBtaWIgcmVzdWx0cy4KICAgICAqLwogICAgc3dpdGNoICh2cC0+bWFnaWMpIHsKCgogICAgY2FzZSBDT0xVTU5fVFJBQ0VST1VURUNUTFRBUkdFVEFERFJFU1NUWVBFOgogICAgICAgICp3cml0ZV9tZXRob2QgPSB3cml0ZV90cmFjZVJvdXRlQ3RsVGFyZ2V0QWRkcmVzc1R5cGU7CiAgICAgICAgKnZhcl9sZW4gPSBzaXplb2YoU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFRhcmdldEFkZHJlc3NUeXBlKTsKCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVGFyZ2V0QWRkcmVzc1R5cGU7CgogICAgY2FzZSBDT0xVTU5fVFJBQ0VST1VURUNUTFRBUkdFVEFERFJFU1M6CiAgICAgICAgKndyaXRlX21ldGhvZCA9IHdyaXRlX3RyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzOwogICAgICAgICp2YXJfbGVuID0gKFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzTGVuKTsKCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFRhcmdldEFkZHJlc3M7CgogICAgY2FzZSBDT0xVTU5fVFJBQ0VST1VURUNUTEJZUEFTU1JPVVRFVEFCTEU6CiAgICAgICAgKndyaXRlX21ldGhvZCA9IHdyaXRlX3RyYWNlUm91dGVDdGxCeVBhc3NSb3V0ZVRhYmxlOwogICAgICAgICp2YXJfbGVuID0gc2l6ZW9mKFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxCeVBhc3NSb3V0ZVRhYmxlKTsKCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsQnlQYXNzUm91dGVUYWJsZTsKCiAgICBjYXNlIENPTFVNTl9UUkFDRVJPVVRFQ1RMREFUQVNJWkU6CiAgICAgICAgKndyaXRlX21ldGhvZCA9IHdyaXRlX3RyYWNlUm91dGVDdGxEYXRhU2l6ZTsKICAgICAgICAqdmFyX2xlbiA9IHNpemVvZihTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsRGF0YVNpemUpOwoKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxEYXRhU2l6ZTsKCiAgICBjYXNlIENPTFVNTl9UUkFDRVJPVVRFQ1RMVElNRU9VVDoKICAgICAgICAqd3JpdGVfbWV0aG9kID0gd3JpdGVfdHJhY2VSb3V0ZUN0bFRpbWVPdXQ7CiAgICAgICAgKnZhcl9sZW4gPSBzaXplb2YoU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFRpbWVPdXQpOwoKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUaW1lT3V0OwoKICAgIGNhc2UgQ09MVU1OX1RSQUNFUk9VVEVDVExQUk9CRVNQRVJIT1A6CiAgICAgICAgKndyaXRlX21ldGhvZCA9IHdyaXRlX3RyYWNlUm91dGVDdGxQcm9iZXNQZXJIb3A7CiAgICAgICAgKnZhcl9sZW4gPSBzaXplb2YoU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFByb2Jlc1BlckhvcCk7CgogICAgICAgIHJldHVybiAodV9jaGFyICopICYgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFByb2Jlc1BlckhvcDsKCiAgICBjYXNlIENPTFVNTl9UUkFDRVJPVVRFQ1RMUE9SVDoKICAgICAgICAqd3JpdGVfbWV0aG9kID0gd3JpdGVfdHJhY2VSb3V0ZUN0bFBvcnQ7CiAgICAgICAgKnZhcl9sZW4gPSBzaXplb2YoU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFBvcnQpOwoKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxQb3J0OwoKICAgIGNhc2UgQ09MVU1OX1RSQUNFUk9VVEVDVExNQVhUVEw6CiAgICAgICAgKndyaXRlX21ldGhvZCA9IHdyaXRlX3RyYWNlUm91dGVDdGxNYXhUdGw7CiAgICAgICAgKnZhcl9sZW4gPSBzaXplb2YoU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bE1heFR0bCk7CgogICAgICAgIHJldHVybiAodV9jaGFyICopICYgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bE1heFR0bDsKCiAgICBjYXNlIENPTFVNTl9UUkFDRVJPVVRFQ1RMRFNGSUVMRDoKICAgICAgICAqd3JpdGVfbWV0aG9kID0gd3JpdGVfdHJhY2VSb3V0ZUN0bERTRmllbGQ7CiAgICAgICAgKnZhcl9sZW4gPSBzaXplb2YoU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bERTRmllbGQpOwoKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxEU0ZpZWxkOwoKICAgIGNhc2UgQ09MVU1OX1RSQUNFUk9VVEVDVExTT1VSQ0VBRERSRVNTVFlQRToKICAgICAgICAqd3JpdGVfbWV0aG9kID0gd3JpdGVfdHJhY2VSb3V0ZUN0bFNvdXJjZUFkZHJlc3NUeXBlOwogICAgICAgICp2YXJfbGVuID0gc2l6ZW9mKFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxTb3VyY2VBZGRyZXNzVHlwZSk7CgogICAgICAgIHJldHVybiAodV9jaGFyICopICYgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFNvdXJjZUFkZHJlc3NUeXBlOwoKICAgIGNhc2UgQ09MVU1OX1RSQUNFUk9VVEVDVExTT1VSQ0VBRERSRVNTOgogICAgICAgICp3cml0ZV9tZXRob2QgPSB3cml0ZV90cmFjZVJvdXRlQ3RsU291cmNlQWRkcmVzczsKICAgICAgICAqdmFyX2xlbiA9IChTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsU291cmNlQWRkcmVzc0xlbik7CgogICAgICAgIHJldHVybiAodV9jaGFyICopIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxTb3VyY2VBZGRyZXNzOwoKICAgIGNhc2UgQ09MVU1OX1RSQUNFUk9VVEVDVExJRklOREVYOgogICAgICAgICp3cml0ZV9tZXRob2QgPSB3cml0ZV90cmFjZVJvdXRlQ3RsSWZJbmRleDsKICAgICAgICAqdmFyX2xlbiA9IHNpemVvZihTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsSWZJbmRleCk7CgogICAgICAgIHJldHVybiAodV9jaGFyICopICYgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bElmSW5kZXg7CgogICAgY2FzZSBDT0xVTU5fVFJBQ0VST1VURUNUTE1JU0NPUFRJT05TOgogICAgICAgICp3cml0ZV9tZXRob2QgPSB3cml0ZV90cmFjZVJvdXRlQ3RsTWlzY09wdGlvbnM7CiAgICAgICAgKnZhcl9sZW4gPSAoU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bE1pc2NPcHRpb25zTGVuKTsKCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bE1pc2NPcHRpb25zOwoKICAgIGNhc2UgQ09MVU1OX1RSQUNFUk9VVEVDVExNQVhGQUlMVVJFUzoKICAgICAgICAqd3JpdGVfbWV0aG9kID0gd3JpdGVfdHJhY2VSb3V0ZUN0bE1heEZhaWx1cmVzOwogICAgICAgICp2YXJfbGVuID0gc2l6ZW9mKFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxNYXhGYWlsdXJlcyk7CgogICAgICAgIHJldHVybiAodV9jaGFyICopICYgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bE1heEZhaWx1cmVzOwoKICAgIGNhc2UgQ09MVU1OX1RSQUNFUk9VVEVDVExET05URlJBR01FTlQ6CiAgICAgICAgKndyaXRlX21ldGhvZCA9IHdyaXRlX3RyYWNlUm91dGVDdGxEb250RnJhZ21lbnQ7CiAgICAgICAgKnZhcl9sZW4gPSBzaXplb2YoU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bERvbnRGcmFnbWVudCk7CgogICAgICAgIHJldHVybiAodV9jaGFyICopICYgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bERvbnRGcmFnbWVudDsKCiAgICBjYXNlIENPTFVNTl9UUkFDRVJPVVRFQ1RMSU5JVElBTFRUTDoKICAgICAgICAqd3JpdGVfbWV0aG9kID0gd3JpdGVfdHJhY2VSb3V0ZUN0bEluaXRpYWxUdGw7CiAgICAgICAgKnZhcl9sZW4gPSBzaXplb2YoU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bEluaXRpYWxUdGwpOwoKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxJbml0aWFsVHRsOwoKICAgIGNhc2UgQ09MVU1OX1RSQUNFUk9VVEVDVExGUkVRVUVOQ1k6CiAgICAgICAgKndyaXRlX21ldGhvZCA9IHdyaXRlX3RyYWNlUm91dGVDdGxGcmVxdWVuY3k7CiAgICAgICAgKnZhcl9sZW4gPSBzaXplb2YoU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bEZyZXF1ZW5jeSk7CgogICAgICAgIHJldHVybiAodV9jaGFyICopICYgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bEZyZXF1ZW5jeTsKCiAgICBjYXNlIENPTFVNTl9UUkFDRVJPVVRFQ1RMU1RPUkFHRVRZUEU6CiAgICAgICAgKndyaXRlX21ldGhvZCA9IHdyaXRlX3RyYWNlUm91dGVDdGxTdG9yYWdlVHlwZTsKICAgICAgICAqdmFyX2xlbiA9IHNpemVvZihTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsU3RvcmFnZVR5cGUpOwoKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxTdG9yYWdlVHlwZTsKCiAgICBjYXNlIENPTFVNTl9UUkFDRVJPVVRFQ1RMQURNSU5TVEFUVVM6CiAgICAgICAgKndyaXRlX21ldGhvZCA9IHdyaXRlX3RyYWNlUm91dGVDdGxBZG1pblN0YXR1czsKICAgICAgICAqdmFyX2xlbiA9IHNpemVvZihTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsQWRtaW5TdGF0dXMpOwoKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxBZG1pblN0YXR1czsKCiAgICBjYXNlIENPTFVNTl9UUkFDRVJPVVRFQ1RMREVTQ1I6CiAgICAgICAgKndyaXRlX21ldGhvZCA9IHdyaXRlX3RyYWNlUm91dGVDdGxEZXNjcjsKICAgICAgICAqdmFyX2xlbiA9IChTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsRGVzY3JMZW4pOwoKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsRGVzY3I7CgogICAgY2FzZSBDT0xVTU5fVFJBQ0VST1VURUNUTE1BWFJPV1M6CiAgICAgICAgKndyaXRlX21ldGhvZCA9IHdyaXRlX3RyYWNlUm91dGVDdGxNYXhSb3dzOwogICAgICAgICp2YXJfbGVuID0gc2l6ZW9mKFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxNYXhSb3dzKTsKCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsTWF4Um93czsKCiAgICBjYXNlIENPTFVNTl9UUkFDRVJPVVRFQ1RMVFJBUEdFTkVSQVRJT046CiAgICAgICAgKndyaXRlX21ldGhvZCA9IHdyaXRlX3RyYWNlUm91dGVDdGxUcmFwR2VuZXJhdGlvbjsKICAgICAgICAqdmFyX2xlbiA9IChTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVHJhcEdlbmVyYXRpb25MZW4pOwoKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVHJhcEdlbmVyYXRpb247CgogICAgY2FzZSBDT0xVTU5fVFJBQ0VST1VURUNUTENSRUFURUhPUFNFTlRSSUVTOgogICAgICAgICp3cml0ZV9tZXRob2QgPSB3cml0ZV90cmFjZVJvdXRlQ3RsQ3JlYXRlSG9wc0VudHJpZXM7CiAgICAgICAgKnZhcl9sZW4gPSBzaXplb2YoU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bENyZWF0ZUhvcHNFbnRyaWVzKTsKCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsQ3JlYXRlSG9wc0VudHJpZXM7CgogICAgY2FzZSBDT0xVTU5fVFJBQ0VST1VURUNUTFRZUEU6CiAgICAgICAgKndyaXRlX21ldGhvZCA9IHdyaXRlX3RyYWNlUm91dGVDdGxUeXBlOwogICAgICAgICp2YXJfbGVuID0gKFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUeXBlTGVuKSAqIHNpemVvZihvaWQpOwoKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVHlwZTsKCiAgICBjYXNlIENPTFVNTl9UUkFDRVJPVVRFQ1RMUk9XU1RBVFVTOgogICAgICAgICp3cml0ZV9tZXRob2QgPSB3cml0ZV90cmFjZVJvdXRlQ3RsUm93U3RhdHVzOwogICAgICAgICp2YXJfbGVuID0gc2l6ZW9mKFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxSb3dTdGF0dXMpOwoKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxSb3dTdGF0dXM7CgogICAgZGVmYXVsdDoKICAgICAgICBFUlJPUl9NU0coIiIpOwogICAgfQogICAgcmV0dXJuIE5VTEw7Cn0KCgoKaW50CnRyYWNlUm91dGVSZXN1bHRzVGFibGVfZGVsKHN0cnVjdCB0cmFjZVJvdXRlQ3RsVGFibGVfZGF0YSAqdGhlZGF0YSkKewogICAgc3RydWN0IGhlYWRlcl9jb21wbGV4X2luZGV4ICpoY2lwdHIyID0gTlVMTDsKICAgIG5ldHNubXBfdmFyaWFibGVfbGlzdCAqdmFycyA9IE5VTEw7CiAgICBvaWQgICAgICAgICAgICAgbmV3b2lkW01BWF9PSURfTEVOXTsKICAgIHNpemVfdCAgICAgICAgICBuZXdvaWRfbGVuID0gMDsKCiAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzLCBOVUxMLCAwLCBBU05fT0NURVRfU1RSLCAoY2hhciAqKSB0aGVkYXRhLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleCwgdGhlZGF0YS0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXhMZW4pOyAgIC8qIHRyYWNlUm91dGVDdGxPd25lckluZGV4ICovCiAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzLCBOVUxMLCAwLCBBU05fT0NURVRfU1RSLCAoY2hhciAqKSB0aGVkYXRhLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWUsIHRoZWRhdGEtPnRyYWNlUm91dGVDdGxUZXN0TmFtZUxlbik7ICAgICAgIC8qIHRyYWNlUm91dGVDdGxUZXN0TmFtZSAqLwoKICAgIG1lbXNldChuZXdvaWQsICdcMCcsIHNpemVvZihvaWQpICogTUFYX09JRF9MRU4pOwogICAgaGVhZGVyX2NvbXBsZXhfZ2VuZXJhdGVfb2lkKG5ld29pZCwgJm5ld29pZF9sZW4sIE5VTEwsIDAsIHZhcnMpOwoKICAgIGZvciAoaGNpcHRyMiA9IHRyYWNlUm91dGVSZXN1bHRzVGFibGVTdG9yYWdlOyBoY2lwdHIyICE9IE5VTEw7CiAgICAgICAgIGhjaXB0cjIgPSBoY2lwdHIyLT5uZXh0KSB7CiAgICAgICAgaWYgKHNubXBfb2lkX2NvbXBhcmUobmV3b2lkLCBuZXdvaWRfbGVuLCBoY2lwdHIyLT5uYW1lLCBuZXdvaWRfbGVuKQogICAgICAgICAgICA9PSAwKSB7CiAgICAgICAgICAgIGhlYWRlcl9jb21wbGV4X2V4dHJhY3RfZW50cnkoJnRyYWNlUm91dGVSZXN1bHRzVGFibGVTdG9yYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhjaXB0cjIpOwogICAgICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZVJlc3VsdHNUYWJsZSIsICJkZWxldGUgIHN1Y2Nlc3MhXG4iKSk7CgogICAgICAgIH0KICAgIH0KICAgIHZhcnMgPSBOVUxMOwogICAgcmV0dXJuIFNOTVBFUlJfU1VDQ0VTUzsKfQoKCgoKaW50CnRyYWNlUm91dGVQcm9iZUhpc3RvcnlUYWJsZV9kZWwoc3RydWN0IHRyYWNlUm91dGVDdGxUYWJsZV9kYXRhICp0aGVkYXRhKQp7CiAgICBzdHJ1Y3QgaGVhZGVyX2NvbXBsZXhfaW5kZXggKmhjaXB0cjIgPSBOVUxMOwogICAgbmV0c25tcF92YXJpYWJsZV9saXN0ICp2YXJzID0gTlVMTDsKICAgIG9pZCAgICAgICAgICAgICBuZXdvaWRbTUFYX09JRF9MRU5dOwogICAgc2l6ZV90ICAgICAgICAgIG5ld29pZF9sZW4gPSAwOwoKICAgIHNubXBfdmFybGlzdF9hZGRfdmFyaWFibGUoJnZhcnMsIE5VTEwsIDAsIEFTTl9PQ1RFVF9TVFIsIChjaGFyICopIHRoZWRhdGEtPnRyYWNlUm91dGVDdGxPd25lckluZGV4LCB0aGVkYXRhLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleExlbik7ICAgLyogdHJhY2VSb3V0ZUN0bE93bmVySW5kZXggKi8KICAgIHNubXBfdmFybGlzdF9hZGRfdmFyaWFibGUoJnZhcnMsIE5VTEwsIDAsIEFTTl9PQ1RFVF9TVFIsIChjaGFyICopIHRoZWRhdGEtPnRyYWNlUm91dGVDdGxUZXN0TmFtZSwgdGhlZGF0YS0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lTGVuKTsgICAgICAgLyogdHJhY2VSb3V0ZUN0bE9wZXJhdGlvbk5hbWUgKi8KCiAgICBtZW1zZXQobmV3b2lkLCAnXDAnLCBzaXplb2Yob2lkKSAqIE1BWF9PSURfTEVOKTsKCiAgICBoZWFkZXJfY29tcGxleF9nZW5lcmF0ZV9vaWQobmV3b2lkLCAmbmV3b2lkX2xlbiwgTlVMTCwgMCwgdmFycyk7CgogICAgZm9yIChoY2lwdHIyID0gdHJhY2VSb3V0ZVByb2JlSGlzdG9yeVRhYmxlU3RvcmFnZTsgaGNpcHRyMiAhPSBOVUxMOwogICAgICAgICBoY2lwdHIyID0gaGNpcHRyMi0+bmV4dCkgewogICAgICAgIGlmIChzbm1wX29pZF9jb21wYXJlKG5ld29pZCwgbmV3b2lkX2xlbiwgaGNpcHRyMi0+bmFtZSwgbmV3b2lkX2xlbikKICAgICAgICAgICAgPT0gMCkgewogICAgICAgICAgICBoZWFkZXJfY29tcGxleF9leHRyYWN0X2VudHJ5KCZ0cmFjZVJvdXRlUHJvYmVIaXN0b3J5VGFibGVTdG9yYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhjaXB0cjIpOwogICAgICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZVByb2JlSGlzdG9yeVRhYmxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlbGV0ZSAgc3VjY2VzcyFcbiIpKTsKCiAgICAgICAgfQogICAgfQogICAgdmFycyA9IE5VTEw7CiAgICByZXR1cm4gU05NUEVSUl9TVUNDRVNTOwp9CgoKaW50CnRyYWNlUm91dGVIb3BzVGFibGVfZGVsKHN0cnVjdCB0cmFjZVJvdXRlQ3RsVGFibGVfZGF0YSAqdGhlZGF0YSkKewogICAgc3RydWN0IGhlYWRlcl9jb21wbGV4X2luZGV4ICpoY2lwdHIyID0gTlVMTDsKICAgIG5ldHNubXBfdmFyaWFibGVfbGlzdCAqdmFycyA9IE5VTEw7CiAgICBvaWQgICAgICAgICAgICAgbmV3b2lkW01BWF9PSURfTEVOXTsKICAgIHNpemVfdCAgICAgICAgICBuZXdvaWRfbGVuID0gMDsKCiAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzLCBOVUxMLCAwLCBBU05fT0NURVRfU1RSLCAoY2hhciAqKSB0aGVkYXRhLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleCwgdGhlZGF0YS0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXhMZW4pOyAgIC8qIHRyYWNlUm91dGVDdGxPd25lckluZGV4ICovCiAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzLCBOVUxMLCAwLCBBU05fT0NURVRfU1RSLCAoY2hhciAqKSB0aGVkYXRhLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWUsIHRoZWRhdGEtPnRyYWNlUm91dGVDdGxUZXN0TmFtZUxlbik7ICAgICAgIC8qIHRyYWNlUm91dGVDdGxUZXN0TmFtZSAqLwoKICAgIG1lbXNldChuZXdvaWQsICdcMCcsIHNpemVvZihvaWQpICogTUFYX09JRF9MRU4pOwoKICAgIGhlYWRlcl9jb21wbGV4X2dlbmVyYXRlX29pZChuZXdvaWQsICZuZXdvaWRfbGVuLCBOVUxMLCAwLCB2YXJzKTsKCiAgICBmb3IgKGhjaXB0cjIgPSB0cmFjZVJvdXRlSG9wc1RhYmxlU3RvcmFnZTsgaGNpcHRyMiAhPSBOVUxMOwogICAgICAgICBoY2lwdHIyID0gaGNpcHRyMi0+bmV4dCkgewogICAgICAgIGlmIChzbm1wX29pZF9jb21wYXJlKG5ld29pZCwgbmV3b2lkX2xlbiwgaGNpcHRyMi0+bmFtZSwgbmV3b2lkX2xlbikKICAgICAgICAgICAgPT0gMCkgewogICAgICAgICAgICBoZWFkZXJfY29tcGxleF9leHRyYWN0X2VudHJ5KCZ0cmFjZVJvdXRlSG9wc1RhYmxlU3RvcmFnZSwgaGNpcHRyMik7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlSG9wc1RhYmxlIiwgImRlbGV0ZSAgc3VjY2VzcyFcbiIpKTsKCiAgICAgICAgfQogICAgfQogICAgdmFycyA9IE5VTEw7CiAgICByZXR1cm4gU05NUEVSUl9TVUNDRVNTOwp9CgovKgogKiBzZW5kIHRyYXAgCiAqLwoKdm9pZApzZW5kX3RyYWNlUm91dGVfdHJhcChzdHJ1Y3QgdHJhY2VSb3V0ZUN0bFRhYmxlX2RhdGEgKml0ZW0sCiAgICAgICAgICAgICAgICAgICAgIG9pZCAqIHRyYXBfb2lkLCBzaXplX3QgdHJhcF9vaWRfbGVuKQp7CiAgICBzdGF0aWMgb2lkICAgICAgb2JqaWRfc25tcHRyYXBbXSA9IHsgMSwgMywgNiwgMSwgNiwgMywgMSwgMSwgNCwgMSwgMCB9OyAgICAgLyogc25tcFRyYXBJT0QuMCAqLwogICAgc3RydWN0IHRyYWNlUm91dGVIb3BzVGFibGVfZGF0YSAqU3RvcmFnZUhvcHMgPSBOVUxMOwogICAgbmV0c25tcF92YXJpYWJsZV9saXN0ICp2YXJfbGlzdCA9IE5VTEw7CiAgICBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKnZhcnMgPSBOVUxMOwogICAgbmV0c25tcF92YXJpYWJsZV9saXN0ICp2YXJfaG9wcyA9IE5VTEw7CiAgICBvaWQgICAgICAgICAgICAgbmV3b2lkW01BWF9PSURfTEVOXTsKICAgIHNpemVfdCAgICAgICAgICBuZXdvaWRfbGVuID0gMDsKCiAgICBvaWQgICAgICAgICAgICAgaW5kZXhvaWRbTUFYX09JRF9MRU5dOwogICAgc2l6ZV90ICAgICAgICAgIGluZGV4b2lkX2xlbiA9IDA7CgogICAgc3RydWN0IGhlYWRlcl9jb21wbGV4X2luZGV4ICpoY2lwdHI7CiAgICBvaWQgICAgICAgICAgICAgdGVtcG9pZFtNQVhfT0lEX0xFTl07CiAgICBzaXplX3QgICAgICAgICAgdGVtcG9pZF9sZW4gPSAwOwoKICAgIG9pZCAgICAgICAgICAgICB0cmFjZVJvdXRlQ3RsVGFyZ2V0QWRkcmVzc1tdID0KICAgICAgICB7IDEsIDMsIDYsIDEsIDIsIDEsIDgxLCAxLCAyLCAxLCA0IH07CiAgICBvaWQgICAgICAgICAgICAgdHJhY2VSb3V0ZUhvcHNJcFRnQWRkcmVzc1tdID0KICAgICAgICB7IDEsIDMsIDYsIDEsIDIsIDEsIDgxLCAxLCA1LCAxLCAzIH07CgogICAgc25tcF92YXJsaXN0X2FkZF92YXJpYWJsZSgmdmFycywgTlVMTCwgMCwgQVNOX09DVEVUX1NUUiwgKGNoYXIgKikgaXRlbS0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXgsIGl0ZW0tPnRyYWNlUm91dGVDdGxPd25lckluZGV4TGVuKTsgLyogdHJhY2VSb3V0ZUN0bE93bmVySW5kZXggKi8KICAgIHNubXBfdmFybGlzdF9hZGRfdmFyaWFibGUoJnZhcnMsIE5VTEwsIDAsIEFTTl9PQ1RFVF9TVFIsIChjaGFyICopIGl0ZW0tPnRyYWNlUm91dGVDdGxUZXN0TmFtZSwgaXRlbS0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lTGVuKTsgICAgIC8qIHRyYWNlUm91dGVDdGxUZXN0TmFtZSAqLwoKICAgIC8qCiAgICAgKiBzbm1wVHJhcCBvaWQgCiAgICAgKi8KICAgIHNubXBfdmFybGlzdF9hZGRfdmFyaWFibGUoJnZhcl9saXN0LCBvYmppZF9zbm1wdHJhcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9iamlkX3NubXB0cmFwKSAvIHNpemVvZihvaWQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU05fT0JKRUNUX0lELCAodV9jaGFyICopIHRyYXBfb2lkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFwX29pZF9sZW4gKiBzaXplb2Yob2lkKSk7CgogICAgLyoKICAgICAqIHRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzIAogICAgICovCiAgICBtZW1zZXQobmV3b2lkLCAnXDAnLCBNQVhfT0lEX0xFTiAqIHNpemVvZihvaWQpKTsKICAgIGhlYWRlcl9jb21wbGV4X2dlbmVyYXRlX29pZChuZXdvaWQsICZuZXdvaWRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih0cmFjZVJvdXRlQ3RsVGFyZ2V0QWRkcmVzcykgLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihvaWQpLCB2YXJzKTsKCiAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJfbGlzdCwgbmV3b2lkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdvaWRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU05fT0NURVRfU1RSLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodV9jaGFyICopIGl0ZW0tPnRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLT50cmFjZVJvdXRlQ3RsVGFyZ2V0QWRkcmVzc0xlbik7CgogICAgZm9yIChoY2lwdHIgPSB0cmFjZVJvdXRlSG9wc1RhYmxlU3RvcmFnZTsgaGNpcHRyICE9IE5VTEw7CiAgICAgICAgIGhjaXB0ciA9IGhjaXB0ci0+bmV4dCkgewoJbWVtc2V0KGluZGV4b2lkLCAnXDAnLCBNQVhfT0lEX0xFTiAqIHNpemVvZihvaWQpKTsKICAgICAgICBoZWFkZXJfY29tcGxleF9nZW5lcmF0ZV9vaWQoaW5kZXhvaWQsICZpbmRleG9pZF9sZW4sIE5VTEwsIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcnMpOwogICAgICAgIGlmIChzbm1wX29pZF9jb21wYXJlCiAgICAgICAgICAgIChpbmRleG9pZCwgaW5kZXhvaWRfbGVuLCBoY2lwdHItPm5hbWUsIGluZGV4b2lkX2xlbikgPT0gMCkgewogICAgICAgICAgICBTdG9yYWdlSG9wcyA9CiAgICAgICAgICAgICAgICAoc3RydWN0IHRyYWNlUm91dGVIb3BzVGFibGVfZGF0YSAqKQogICAgICAgICAgICAgICAgaGVhZGVyX2NvbXBsZXhfZ2V0X2Zyb21fb2lkKHRyYWNlUm91dGVIb3BzVGFibGVTdG9yYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhjaXB0ci0+bmFtZSwgaGNpcHRyLT5uYW1lbGVuKTsKICAgICAgICAgICAgbWVtc2V0KHRlbXBvaWQsICdcMCcsIE1BWF9PSURfTEVOICogc2l6ZW9mKG9pZCkpOwogICAgICAgICAgICBoZWFkZXJfY29tcGxleF9nZW5lcmF0ZV9vaWQodGVtcG9pZCwgJnRlbXBvaWRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VSb3V0ZUhvcHNJcFRnQWRkcmVzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih0cmFjZVJvdXRlSG9wc0lwVGdBZGRyZXNzKSAvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yob2lkKSwgdmFycyk7CiAgICAgICAgICAgIHNubXBfdmFybGlzdF9hZGRfdmFyaWFibGUoJnZhcl9ob3BzLCBOVUxMLCAwLCBBU05fVU5TSUdORUQsIChjaGFyICopICZTdG9yYWdlSG9wcy0+dHJhY2VSb3V0ZUhvcHNIb3BJbmRleCwgc2l6ZW9mKFN0b3JhZ2VIb3BzLT50cmFjZVJvdXRlSG9wc0hvcEluZGV4KSk7ICAgIC8qIHRyYWNlUm91dGVDdGxUZXN0TmFtZSAqLwogICAgICAgICAgICBtZW1zZXQobmV3b2lkLCAnXDAnLCBNQVhfT0lEX0xFTiAqIHNpemVvZihvaWQpKTsKICAgICAgICAgICAgaGVhZGVyX2NvbXBsZXhfZ2VuZXJhdGVfb2lkKG5ld29pZCwgJm5ld29pZF9sZW4sIHRlbXBvaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wb2lkX2xlbiwgdmFyX2hvcHMpOwogICAgICAgICAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJfbGlzdCwgbmV3b2lkLCBuZXdvaWRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTTl9PQ1RFVF9TVFIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVfY2hhciAqKSBTdG9yYWdlSG9wcy0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VSb3V0ZUhvcHNJcFRndEFkZHJlc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RvcmFnZUhvcHMtPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlUm91dGVIb3BzSXBUZ3RBZGRyZXNzTGVuKTsKCiAgICAgICAgICAgIHZhcl9ob3BzID0gTlVMTDsKICAgICAgICB9CiAgICB9CgogICAgLyoKICAgICAqIFhYWDogc3R1ZmYgYmFzZWQgb24gZXZlbnQgdGFibGUgCiAgICAgKi8KCiAgICBERUJVR01TRygoInBpbmdUZXN0OnNlbmRfdHJhY2VSb3V0ZV90cmFwIiwgInN1Y2Nlc3MhXG4iKSk7CgogICAgc2VuZF92MnRyYXAodmFyX2xpc3QpOwogICAgc25tcF9mcmVlX3ZhcmJpbmQodmFycyk7CiAgICB2YXJzID0gTlVMTDsKICAgIHNubXBfZnJlZV92YXJiaW5kKHZhcl9saXN0KTsKICAgIHZhcl9saXN0ID0gTlVMTDsKfQoKCmludAp3cml0ZV90cmFjZVJvdXRlQ3RsVGFyZ2V0QWRkcmVzc1R5cGUoaW50IGFjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHZhcl92YWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgdmFyX3ZhbF90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHZhcl92YWxfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogc3RhdFAsIG9pZCAqIG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbmFtZV9sZW4pCnsKICAgIHN0YXRpYyBzaXplX3QgICB0bXB2YXI7CiAgICBzdHJ1Y3QgdHJhY2VSb3V0ZUN0bFRhYmxlX2RhdGEgKlN0b3JhZ2VUbXAgPSBOVUxMOwogICAgc2l6ZV90ICAgICAgICAgIG5ld2xlbiA9CiAgICAgICAgbmFtZV9sZW4gLQogICAgICAgIChzaXplb2YodHJhY2VSb3V0ZUN0bFRhYmxlX3ZhcmlhYmxlc19vaWQpIC8gc2l6ZW9mKG9pZCkgKyAzIC0gMSk7CgogICAgaWYgKChTdG9yYWdlVG1wID0KICAgICAgICAgaGVhZGVyX2NvbXBsZXgodHJhY2VSb3V0ZUN0bFRhYmxlU3RvcmFnZSwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgJm5hbWVbc2l6ZW9mKHRyYWNlUm91dGVDdGxUYWJsZV92YXJpYWJsZXNfb2lkKSAvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihvaWQpICsgMyAtIDFdLCAmbmV3bGVuLCAxLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkgPT0gTlVMTCkKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9TVUNITkFNRTsgICAgIC8qIHJlbW92ZSBpZiB5b3Ugc3VwcG9ydCBjcmVhdGlvbiBoZXJlICovCgogICAgaWYgKFN0b3JhZ2VUbXAgJiYgU3RvcmFnZVRtcC0+c3RvcmFnZVR5cGUgPT0gU1RfUkVBRE9OTFkpIHsKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9UV1JJVEFCTEU7CiAgICB9CgogICAgaWYgKFN0b3JhZ2VUbXAgJiYgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFJvd1N0YXR1cyA9PSBSU19BQ1RJVkUpIHsKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9UV1JJVEFCTEU7CiAgICB9CiAgICBzd2l0Y2ggKGFjdGlvbikgewogICAgY2FzZSBSRVNFUlZFMToKICAgICAgICBpZiAodmFyX3ZhbF90eXBlICE9IEFTTl9JTlRFR0VSKSB7CiAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsCiAgICAgICAgICAgICAgICAgICAgICJ3cml0ZSB0byB0cmFjZVJvdXRlQ3RsVGFyZ2V0QWRkcmVzc1R5cGUgbm90IEFTTl9JTlRFR0VSXG4iKTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX1dST05HVFlQRTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgUkVTRVJWRTI6CiAgICAgICAgLyoKICAgICAgICAgKiBtZW1vcnkgcmVzZXZlcmF0aW9uLCBmaW5hbCBwcmVwYXJhdGlvbi4uLiAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBGUkVFOgogICAgICAgIC8qCiAgICAgICAgICogUmVsZWFzZSBhbnkgcmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIGFsbG9jYXRlZCAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBBQ1RJT046CiAgICAgICAgLyoKICAgICAgICAgKiBUaGUgdmFyaWFibGUgaGFzIGJlZW4gc3RvcmVkIGluIG9iamlkIGZvcgogICAgICAgICAqIHlvdSB0byB1c2UsIGFuZCB5b3UgaGF2ZSBqdXN0IGJlZW4gYXNrZWQgdG8gZG8gc29tZXRoaW5nIHdpdGgKICAgICAgICAgKiBpdC4gIE5vdGUgdGhhdCBhbnl0aGluZyBkb25lIGhlcmUgbXVzdCBiZSByZXZlcnNhYmxlIGluIHRoZSBVTkRPIGNhc2UgCiAgICAgICAgICovCiAgICAgICAgdG1wdmFyID0gU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFRhcmdldEFkZHJlc3NUeXBlOwogICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzVHlwZSA9ICooKGxvbmcgKikgdmFyX3ZhbCk7CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgVU5ETzoKICAgICAgICAvKgogICAgICAgICAqIEJhY2sgb3V0IGFueSBjaGFuZ2VzIG1hZGUgaW4gdGhlIEFDVElPTiBjYXNlIAogICAgICAgICAqLwogICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzVHlwZSA9IHRtcHZhcjsKICAgICAgICBicmVhazsKCgogICAgY2FzZSBDT01NSVQ6CiAgICAgICAgLyoKICAgICAgICAgKiBUaGluZ3MgYXJlIHdvcmtpbmcgd2VsbCwgc28gaXQncyBub3cgc2FmZSB0byBtYWtlIHRoZSBjaGFuZ2UKICAgICAgICAgKiBwZXJtYW5lbnRseS4gIE1ha2Ugc3VyZSB0aGF0IGFueXRoaW5nIGRvbmUgaGVyZSBjYW4ndCBmYWlsISAKICAgICAgICAgKi8KICAgICAgICBzbm1wX3N0b3JlX25lZWRlZChOVUxMKTsKICAgICAgICBicmVhazsKICAgIH0KICAgIHJldHVybiBTTk1QX0VSUl9OT0VSUk9SOwp9CgoKCmludAp3cml0ZV90cmFjZVJvdXRlQ3RsVGFyZ2V0QWRkcmVzcyhpbnQgYWN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiB2YXJfdmFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgdmFyX3ZhbF90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgdmFyX3ZhbF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHN0YXRQLCBvaWQgKiBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbmFtZV9sZW4pCnsKICAgIHN0YXRpYyBjaGFyICAgICp0bXB2YXI7CiAgICBzdGF0aWMgc2l6ZV90ICAgdG1wbGVuOwogICAgc3RydWN0IHRyYWNlUm91dGVDdGxUYWJsZV9kYXRhICpTdG9yYWdlVG1wID0gTlVMTDsKICAgIHNpemVfdCAgICAgICAgICBuZXdsZW4gPQogICAgICAgIG5hbWVfbGVuIC0KICAgICAgICAoc2l6ZW9mKHRyYWNlUm91dGVDdGxUYWJsZV92YXJpYWJsZXNfb2lkKSAvIHNpemVvZihvaWQpICsgMyAtIDEpOwoKICAgIGlmICgoU3RvcmFnZVRtcCA9CiAgICAgICAgIGhlYWRlcl9jb21wbGV4KHRyYWNlUm91dGVDdGxUYWJsZVN0b3JhZ2UsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICZuYW1lW3NpemVvZih0cmFjZVJvdXRlQ3RsVGFibGVfdmFyaWFibGVzX29pZCkgLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yob2lkKSArIDMgLSAxXSwgJm5ld2xlbiwgMSwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpID09IE5VTEwpCiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PU1VDSE5BTUU7ICAgICAvKiByZW1vdmUgaWYgeW91IHN1cHBvcnQgY3JlYXRpb24gaGVyZSAqLwoKICAgIGlmIChTdG9yYWdlVG1wICYmIFN0b3JhZ2VUbXAtPnN0b3JhZ2VUeXBlID09IFNUX1JFQURPTkxZKSB7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PVFdSSVRBQkxFOwogICAgfQoKICAgIGlmIChTdG9yYWdlVG1wICYmIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxSb3dTdGF0dXMgPT0gUlNfQUNUSVZFKSB7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PVFdSSVRBQkxFOwogICAgfQoKICAgIHN3aXRjaCAoYWN0aW9uKSB7CiAgICBjYXNlIFJFU0VSVkUxOgogICAgICAgIGlmICh2YXJfdmFsX3R5cGUgIT0gQVNOX09DVEVUX1NUUikgewogICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLAogICAgICAgICAgICAgICAgICAgICAid3JpdGUgdG8gdHJhY2VSb3V0ZUN0bFRhcmdldEFkZHJlc3Mgbm90IEFTTl9PQ1RFVF9TVFJcbiIpOwogICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfV1JPTkdUWVBFOwogICAgICAgIH0KICAgICAgICBicmVhazsKCgogICAgY2FzZSBSRVNFUlZFMjoKICAgICAgICAvKgogICAgICAgICAqIG1lbW9yeSByZXNldmVyYXRpb24sIGZpbmFsIHByZXBhcmF0aW9uLi4uIAogICAgICAgICAqLwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIEZSRUU6CiAgICAgICAgLyoKICAgICAgICAgKiBSZWxlYXNlIGFueSByZXNvdXJjZXMgdGhhdCBoYXZlIGJlZW4gYWxsb2NhdGVkIAogICAgICAgICAqLwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIEFDVElPTjoKICAgICAgICAvKgogICAgICAgICAqIFRoZSB2YXJpYWJsZSBoYXMgYmVlbiBzdG9yZWQgaW4gbG9uZ19yZXQgZm9yCiAgICAgICAgICogeW91IHRvIHVzZSwgYW5kIHlvdSBoYXZlIGp1c3QgYmVlbiBhc2tlZCB0byBkbyBzb21ldGhpbmcgd2l0aAogICAgICAgICAqIGl0LiAgTm90ZSB0aGF0IGFueXRoaW5nIGRvbmUgaGVyZSBtdXN0IGJlIHJldmVyc2FibGUgaW4gdGhlIFVORE8gY2FzZSAKICAgICAgICAgKi8KICAgICAgICB0bXB2YXIgPSBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVGFyZ2V0QWRkcmVzczsKICAgICAgICB0bXBsZW4gPSBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVGFyZ2V0QWRkcmVzc0xlbjsKCiAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFRhcmdldEFkZHJlc3MgPQogICAgICAgICAgICAoY2hhciAqKSBtYWxsb2ModmFyX3ZhbF9sZW4gKyAxKTsKICAgICAgICBpZiAoU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFRhcmdldEFkZHJlc3MgPT0gTlVMTCkgewogICAgICAgICAgICBleGl0KDEpOwogICAgICAgIH0KICAgICAgICBtZW1jcHkoU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFRhcmdldEFkZHJlc3MsIHZhcl92YWwsCiAgICAgICAgICAgICAgIHZhcl92YWxfbGVuKTsKICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVGFyZ2V0QWRkcmVzc1t2YXJfdmFsX2xlbl0gPSAnXDAnOwogICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzTGVuID0gdmFyX3ZhbF9sZW47CgogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIFVORE86CiAgICAgICAgLyoKICAgICAgICAgKiBCYWNrIG91dCBhbnkgY2hhbmdlcyBtYWRlIGluIHRoZSBBQ1RJT04gY2FzZSAKICAgICAgICAgKi8KICAgICAgICBTTk1QX0ZSRUUoU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFRhcmdldEFkZHJlc3MpOwogICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzID0gTlVMTDsKCiAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFRhcmdldEFkZHJlc3MgPSB0bXB2YXI7CiAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFRhcmdldEFkZHJlc3NMZW4gPSB0bXBsZW47CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgQ09NTUlUOgogICAgICAgIC8qCiAgICAgICAgICogVGhpbmdzIGFyZSB3b3JraW5nIHdlbGwsIHNvIGl0J3Mgbm93IHNhZmUgdG8gbWFrZSB0aGUgY2hhbmdlCiAgICAgICAgICogcGVybWFuZW50bHkuICBNYWtlIHN1cmUgdGhhdCBhbnl0aGluZyBkb25lIGhlcmUgY2FuJ3QgZmFpbCEgCiAgICAgICAgICovCiAgICAgICAgU05NUF9GUkVFKHRtcHZhcik7CiAgICAgICAgc25tcF9zdG9yZV9uZWVkZWQoTlVMTCk7CiAgICAgICAgYnJlYWs7CiAgICB9CiAgICByZXR1cm4gU05NUF9FUlJfTk9FUlJPUjsKfQoKaW50CndyaXRlX3RyYWNlUm91dGVDdGxCeVBhc3NSb3V0ZVRhYmxlKGludCBhY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHZhcl92YWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciB2YXJfdmFsX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB2YXJfdmFsX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogc3RhdFAsIG9pZCAqIG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBuYW1lX2xlbikKewogICAgc3RhdGljIHNpemVfdCAgIHRtcHZhcjsKICAgIHN0cnVjdCB0cmFjZVJvdXRlQ3RsVGFibGVfZGF0YSAqU3RvcmFnZVRtcCA9IE5VTEw7CiAgICBzaXplX3QgICAgICAgICAgbmV3bGVuID0KICAgICAgICBuYW1lX2xlbiAtCiAgICAgICAgKHNpemVvZih0cmFjZVJvdXRlQ3RsVGFibGVfdmFyaWFibGVzX29pZCkgLyBzaXplb2Yob2lkKSArIDMgLSAxKTsKCiAgICBpZiAoKFN0b3JhZ2VUbXAgPQogICAgICAgICBoZWFkZXJfY29tcGxleCh0cmFjZVJvdXRlQ3RsVGFibGVTdG9yYWdlLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAmbmFtZVtzaXplb2YodHJhY2VSb3V0ZUN0bFRhYmxlX3ZhcmlhYmxlc19vaWQpIC8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9pZCkgKyAzIC0gMV0sICZuZXdsZW4sIDEsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKSA9PSBOVUxMKQogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1NVQ0hOQU1FOyAgICAgLyogcmVtb3ZlIGlmIHlvdSBzdXBwb3J0IGNyZWF0aW9uIGhlcmUgKi8KCiAgICBpZiAoU3RvcmFnZVRtcCAmJiBTdG9yYWdlVG1wLT5zdG9yYWdlVHlwZSA9PSBTVF9SRUFET05MWSkgewogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1RXUklUQUJMRTsKICAgIH0KCiAgICBpZiAoU3RvcmFnZVRtcCAmJiBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsUm93U3RhdHVzID09IFJTX0FDVElWRSkgewogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1RXUklUQUJMRTsKICAgIH0KICAgIHN3aXRjaCAoYWN0aW9uKSB7CiAgICBjYXNlIFJFU0VSVkUxOgogICAgICAgIGlmICh2YXJfdmFsX3R5cGUgIT0gQVNOX0lOVEVHRVIpIHsKICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwKICAgICAgICAgICAgICAgICAgICAgIndyaXRlIHRvIHRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzVHlwZSBub3QgQVNOX0lOVEVHRVJcbiIpOwogICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfV1JPTkdUWVBFOwogICAgICAgIH0KICAgICAgICBicmVhazsKCgogICAgY2FzZSBSRVNFUlZFMjoKICAgICAgICAvKgogICAgICAgICAqIG1lbW9yeSByZXNldmVyYXRpb24sIGZpbmFsIHByZXBhcmF0aW9uLi4uIAogICAgICAgICAqLwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIEZSRUU6CiAgICAgICAgLyoKICAgICAgICAgKiBSZWxlYXNlIGFueSByZXNvdXJjZXMgdGhhdCBoYXZlIGJlZW4gYWxsb2NhdGVkIAogICAgICAgICAqLwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIEFDVElPTjoKICAgICAgICAvKgogICAgICAgICAqIFRoZSB2YXJpYWJsZSBoYXMgYmVlbiBzdG9yZWQgaW4gb2JqaWQgZm9yCiAgICAgICAgICogeW91IHRvIHVzZSwgYW5kIHlvdSBoYXZlIGp1c3QgYmVlbiBhc2tlZCB0byBkbyBzb21ldGhpbmcgd2l0aAogICAgICAgICAqIGl0LiAgTm90ZSB0aGF0IGFueXRoaW5nIGRvbmUgaGVyZSBtdXN0IGJlIHJldmVyc2FibGUgaW4gdGhlIFVORE8gY2FzZSAKICAgICAgICAgKi8KICAgICAgICB0bXB2YXIgPSBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsQnlQYXNzUm91dGVUYWJsZTsKICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsQnlQYXNzUm91dGVUYWJsZSA9ICooKGxvbmcgKikgdmFyX3ZhbCk7CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgVU5ETzoKICAgICAgICAvKgogICAgICAgICAqIEJhY2sgb3V0IGFueSBjaGFuZ2VzIG1hZGUgaW4gdGhlIEFDVElPTiBjYXNlIAogICAgICAgICAqLwogICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxCeVBhc3NSb3V0ZVRhYmxlID0gdG1wdmFyOwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIENPTU1JVDoKICAgICAgICAvKgogICAgICAgICAqIFRoaW5ncyBhcmUgd29ya2luZyB3ZWxsLCBzbyBpdCdzIG5vdyBzYWZlIHRvIG1ha2UgdGhlIGNoYW5nZQogICAgICAgICAqIHBlcm1hbmVudGx5LiAgTWFrZSBzdXJlIHRoYXQgYW55dGhpbmcgZG9uZSBoZXJlIGNhbid0IGZhaWwhIAogICAgICAgICAqLwogICAgICAgIHNubXBfc3RvcmVfbmVlZGVkKE5VTEwpOwogICAgICAgIGJyZWFrOwogICAgfQogICAgcmV0dXJuIFNOTVBfRVJSX05PRVJST1I7Cgp9CgppbnQKd3JpdGVfdHJhY2VSb3V0ZUN0bERhdGFTaXplKGludCBhY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiB2YXJfdmFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyIHZhcl92YWxfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB2YXJfdmFsX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHN0YXRQLCBvaWQgKiBuYW1lLCBzaXplX3QgbmFtZV9sZW4pCnsKICAgIHN0YXRpYyBzaXplX3QgICB0bXB2YXI7CiAgICBzdHJ1Y3QgdHJhY2VSb3V0ZUN0bFRhYmxlX2RhdGEgKlN0b3JhZ2VUbXAgPSBOVUxMOwogICAgc2l6ZV90ICAgICAgICAgIG5ld2xlbiA9CiAgICAgICAgbmFtZV9sZW4gLQogICAgICAgIChzaXplb2YodHJhY2VSb3V0ZUN0bFRhYmxlX3ZhcmlhYmxlc19vaWQpIC8gc2l6ZW9mKG9pZCkgKyAzIC0gMSk7CgogICAgaWYgKChTdG9yYWdlVG1wID0KICAgICAgICAgaGVhZGVyX2NvbXBsZXgodHJhY2VSb3V0ZUN0bFRhYmxlU3RvcmFnZSwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgJm5hbWVbc2l6ZW9mKHRyYWNlUm91dGVDdGxUYWJsZV92YXJpYWJsZXNfb2lkKSAvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihvaWQpICsgMyAtIDFdLCAmbmV3bGVuLCAxLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkgPT0gTlVMTCkKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9TVUNITkFNRTsgICAgIC8qIHJlbW92ZSBpZiB5b3Ugc3VwcG9ydCBjcmVhdGlvbiBoZXJlICovCgogICAgaWYgKFN0b3JhZ2VUbXAgJiYgU3RvcmFnZVRtcC0+c3RvcmFnZVR5cGUgPT0gU1RfUkVBRE9OTFkpIHsKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9UV1JJVEFCTEU7CiAgICB9CgogICAgaWYgKFN0b3JhZ2VUbXAgJiYgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFJvd1N0YXR1cyA9PSBSU19BQ1RJVkUpIHsKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9UV1JJVEFCTEU7CiAgICB9CiAgICBzd2l0Y2ggKGFjdGlvbikgewogICAgY2FzZSBSRVNFUlZFMToKICAgICAgICBpZiAodmFyX3ZhbF90eXBlICE9IEFTTl9VTlNJR05FRCkgewogICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLAogICAgICAgICAgICAgICAgICAgICAid3JpdGUgdG8gdHJhY2VSb3V0ZUN0bERhdGFTaXplIG5vdCBBU05fVU5TSUdORURcbiIpOwogICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfV1JPTkdUWVBFOwogICAgICAgIH0KICAgICAgICBicmVhazsKCgogICAgY2FzZSBSRVNFUlZFMjoKICAgICAgICAvKgogICAgICAgICAqIG1lbW9yeSByZXNldmVyYXRpb24sIGZpbmFsIHByZXBhcmF0aW9uLi4uIAogICAgICAgICAqLwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIEZSRUU6CiAgICAgICAgLyoKICAgICAgICAgKiBSZWxlYXNlIGFueSByZXNvdXJjZXMgdGhhdCBoYXZlIGJlZW4gYWxsb2NhdGVkIAogICAgICAgICAqLwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIEFDVElPTjoKICAgICAgICAvKgogICAgICAgICAqIFRoZSB2YXJpYWJsZSBoYXMgYmVlbiBzdG9yZWQgaW4gb2JqaWQgZm9yCiAgICAgICAgICogeW91IHRvIHVzZSwgYW5kIHlvdSBoYXZlIGp1c3QgYmVlbiBhc2tlZCB0byBkbyBzb21ldGhpbmcgd2l0aAogICAgICAgICAqIGl0LiAgTm90ZSB0aGF0IGFueXRoaW5nIGRvbmUgaGVyZSBtdXN0IGJlIHJldmVyc2FibGUgaW4gdGhlIFVORE8gY2FzZSAKICAgICAgICAgKi8KICAgICAgICB0bXB2YXIgPSBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsRGF0YVNpemU7CiAgICAgICAgaWYgKCgqKChsb25nICopIHZhcl92YWwpKSA+PSAwICYmICgqKChsb25nICopIHZhcl92YWwpKSA8PSA2NTUwNykKICAgICAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bERhdGFTaXplID0gKigobG9uZyAqKSB2YXJfdmFsKTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxEYXRhU2l6ZSA9IDU2OwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIFVORE86CiAgICAgICAgLyoKICAgICAgICAgKiBCYWNrIG91dCBhbnkgY2hhbmdlcyBtYWRlIGluIHRoZSBBQ1RJT04gY2FzZSAKICAgICAgICAgKi8KICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsRGF0YVNpemUgPSB0bXB2YXI7CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgQ09NTUlUOgogICAgICAgIC8qCiAgICAgICAgICogVGhpbmdzIGFyZSB3b3JraW5nIHdlbGwsIHNvIGl0J3Mgbm93IHNhZmUgdG8gbWFrZSB0aGUgY2hhbmdlCiAgICAgICAgICogcGVybWFuZW50bHkuICBNYWtlIHN1cmUgdGhhdCBhbnl0aGluZyBkb25lIGhlcmUgY2FuJ3QgZmFpbCEgCiAgICAgICAgICovCiAgICAgICAgc25tcF9zdG9yZV9uZWVkZWQoTlVMTCk7CiAgICAgICAgYnJlYWs7CiAgICB9CiAgICByZXR1cm4gU05NUF9FUlJfTk9FUlJPUjsKfQoKCgoKaW50CndyaXRlX3RyYWNlUm91dGVDdGxUaW1lT3V0KGludCBhY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHZhcl92YWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciB2YXJfdmFsX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB2YXJfdmFsX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogc3RhdFAsIG9pZCAqIG5hbWUsIHNpemVfdCBuYW1lX2xlbikKewogICAgc3RhdGljIHNpemVfdCAgIHRtcHZhcjsKICAgIHN0cnVjdCB0cmFjZVJvdXRlQ3RsVGFibGVfZGF0YSAqU3RvcmFnZVRtcCA9IE5VTEw7CiAgICBzaXplX3QgICAgICAgICAgbmV3bGVuID0KICAgICAgICBuYW1lX2xlbiAtCiAgICAgICAgKHNpemVvZih0cmFjZVJvdXRlQ3RsVGFibGVfdmFyaWFibGVzX29pZCkgLyBzaXplb2Yob2lkKSArIDMgLSAxKTsKCiAgICBpZiAoKFN0b3JhZ2VUbXAgPQogICAgICAgICBoZWFkZXJfY29tcGxleCh0cmFjZVJvdXRlQ3RsVGFibGVTdG9yYWdlLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAmbmFtZVtzaXplb2YodHJhY2VSb3V0ZUN0bFRhYmxlX3ZhcmlhYmxlc19vaWQpIC8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9pZCkgKyAzIC0gMV0sICZuZXdsZW4sIDEsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKSA9PSBOVUxMKQogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1NVQ0hOQU1FOyAgICAgLyogcmVtb3ZlIGlmIHlvdSBzdXBwb3J0IGNyZWF0aW9uIGhlcmUgKi8KCiAgICBpZiAoU3RvcmFnZVRtcCAmJiBTdG9yYWdlVG1wLT5zdG9yYWdlVHlwZSA9PSBTVF9SRUFET05MWSkgewogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1RXUklUQUJMRTsKICAgIH0KCiAgICBpZiAoU3RvcmFnZVRtcCAmJiBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsUm93U3RhdHVzID09IFJTX0FDVElWRSkgewogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1RXUklUQUJMRTsKICAgIH0KICAgIHN3aXRjaCAoYWN0aW9uKSB7CiAgICBjYXNlIFJFU0VSVkUxOgogICAgICAgIGlmICh2YXJfdmFsX3R5cGUgIT0gQVNOX1VOU0lHTkVEKSB7CiAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsCiAgICAgICAgICAgICAgICAgICAgICJ3cml0ZSB0byB0cmFjZVJvdXRlQ3RsRGF0YVNpemUgbm90IEFTTl9VTlNJR05FRFxuIik7CiAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9XUk9OR1RZUEU7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIFJFU0VSVkUyOgogICAgICAgIC8qCiAgICAgICAgICogbWVtb3J5IHJlc2V2ZXJhdGlvbiwgZmluYWwgcHJlcGFyYXRpb24uLi4gCiAgICAgICAgICovCiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgRlJFRToKICAgICAgICAvKgogICAgICAgICAqIFJlbGVhc2UgYW55IHJlc291cmNlcyB0aGF0IGhhdmUgYmVlbiBhbGxvY2F0ZWQgCiAgICAgICAgICovCiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgQUNUSU9OOgogICAgICAgIC8qCiAgICAgICAgICogVGhlIHZhcmlhYmxlIGhhcyBiZWVuIHN0b3JlZCBpbiBvYmppZCBmb3IKICAgICAgICAgKiB5b3UgdG8gdXNlLCBhbmQgeW91IGhhdmUganVzdCBiZWVuIGFza2VkIHRvIGRvIHNvbWV0aGluZyB3aXRoCiAgICAgICAgICogaXQuICBOb3RlIHRoYXQgYW55dGhpbmcgZG9uZSBoZXJlIG11c3QgYmUgcmV2ZXJzYWJsZSBpbiB0aGUgVU5ETyBjYXNlIAogICAgICAgICAqLwogICAgICAgIHRtcHZhciA9IFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUaW1lT3V0OwoKICAgICAgICBpZiAoKCooKGxvbmcgKikgdmFyX3ZhbCkpID49IDEgJiYgKCooKGxvbmcgKikgdmFyX3ZhbCkpIDw9IDYwKQogICAgICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVGltZU91dCA9ICooKGxvbmcgKikgdmFyX3ZhbCk7CiAgICAgICAgZWxzZQogICAgICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVGltZU91dCA9IDM7CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgVU5ETzoKICAgICAgICAvKgogICAgICAgICAqIEJhY2sgb3V0IGFueSBjaGFuZ2VzIG1hZGUgaW4gdGhlIEFDVElPTiBjYXNlIAogICAgICAgICAqLwogICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUaW1lT3V0ID0gdG1wdmFyOwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIENPTU1JVDoKICAgICAgICAvKgogICAgICAgICAqIFRoaW5ncyBhcmUgd29ya2luZyB3ZWxsLCBzbyBpdCdzIG5vdyBzYWZlIHRvIG1ha2UgdGhlIGNoYW5nZQogICAgICAgICAqIHBlcm1hbmVudGx5LiAgTWFrZSBzdXJlIHRoYXQgYW55dGhpbmcgZG9uZSBoZXJlIGNhbid0IGZhaWwhIAogICAgICAgICAqLwogICAgICAgIHNubXBfc3RvcmVfbmVlZGVkKE5VTEwpOwogICAgICAgIGJyZWFrOwogICAgfQogICAgcmV0dXJuIFNOTVBfRVJSX05PRVJST1I7Cn0KCgoKCgppbnQKd3JpdGVfdHJhY2VSb3V0ZUN0bFByb2Jlc1BlckhvcChpbnQgYWN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHZhcl92YWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyIHZhcl92YWxfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgdmFyX3ZhbF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogc3RhdFAsIG9pZCAqIG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG5hbWVfbGVuKQp7CiAgICBzdGF0aWMgc2l6ZV90ICAgdG1wdmFyOwogICAgc3RydWN0IHRyYWNlUm91dGVDdGxUYWJsZV9kYXRhICpTdG9yYWdlVG1wID0gTlVMTDsKICAgIHNpemVfdCAgICAgICAgICBuZXdsZW4gPQogICAgICAgIG5hbWVfbGVuIC0KICAgICAgICAoc2l6ZW9mKHRyYWNlUm91dGVDdGxUYWJsZV92YXJpYWJsZXNfb2lkKSAvIHNpemVvZihvaWQpICsgMyAtIDEpOwoKICAgIGlmICgoU3RvcmFnZVRtcCA9CiAgICAgICAgIGhlYWRlcl9jb21wbGV4KHRyYWNlUm91dGVDdGxUYWJsZVN0b3JhZ2UsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICZuYW1lW3NpemVvZih0cmFjZVJvdXRlQ3RsVGFibGVfdmFyaWFibGVzX29pZCkgLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yob2lkKSArIDMgLSAxXSwgJm5ld2xlbiwgMSwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpID09IE5VTEwpCiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PU1VDSE5BTUU7ICAgICAvKiByZW1vdmUgaWYgeW91IHN1cHBvcnQgY3JlYXRpb24gaGVyZSAqLwoKICAgIGlmIChTdG9yYWdlVG1wICYmIFN0b3JhZ2VUbXAtPnN0b3JhZ2VUeXBlID09IFNUX1JFQURPTkxZKSB7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PVFdSSVRBQkxFOwogICAgfQoKICAgIGlmIChTdG9yYWdlVG1wICYmIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxSb3dTdGF0dXMgPT0gUlNfQUNUSVZFKSB7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PVFdSSVRBQkxFOwogICAgfQogICAgc3dpdGNoIChhY3Rpb24pIHsKICAgIGNhc2UgUkVTRVJWRTE6CiAgICAgICAgaWYgKHZhcl92YWxfdHlwZSAhPSBBU05fVU5TSUdORUQpIHsKICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwKICAgICAgICAgICAgICAgICAgICAgIndyaXRlIHRvIHRyYWNlUm91dGVDdGxEYXRhU2l6ZSBub3QgQVNOX1VOU0lHTkVEXG4iKTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX1dST05HVFlQRTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgUkVTRVJWRTI6CiAgICAgICAgLyoKICAgICAgICAgKiBtZW1vcnkgcmVzZXZlcmF0aW9uLCBmaW5hbCBwcmVwYXJhdGlvbi4uLiAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBGUkVFOgogICAgICAgIC8qCiAgICAgICAgICogUmVsZWFzZSBhbnkgcmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIGFsbG9jYXRlZCAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBBQ1RJT046CiAgICAgICAgLyoKICAgICAgICAgKiBUaGUgdmFyaWFibGUgaGFzIGJlZW4gc3RvcmVkIGluIG9iamlkIGZvcgogICAgICAgICAqIHlvdSB0byB1c2UsIGFuZCB5b3UgaGF2ZSBqdXN0IGJlZW4gYXNrZWQgdG8gZG8gc29tZXRoaW5nIHdpdGgKICAgICAgICAgKiBpdC4gIE5vdGUgdGhhdCBhbnl0aGluZyBkb25lIGhlcmUgbXVzdCBiZSByZXZlcnNhYmxlIGluIHRoZSBVTkRPIGNhc2UgCiAgICAgICAgICovCiAgICAgICAgdG1wdmFyID0gU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFByb2Jlc1BlckhvcDsKCiAgICAgICAgaWYgKCgqKChsb25nICopIHZhcl92YWwpKSA+PSAxICYmICgqKChsb25nICopIHZhcl92YWwpKSA8PSAxMCkKICAgICAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFByb2Jlc1BlckhvcCA9ICooKGxvbmcgKikgdmFyX3ZhbCk7CiAgICAgICAgZWxzZQogICAgICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsUHJvYmVzUGVySG9wID0gMzsKICAgICAgICBicmVhazsKCgogICAgY2FzZSBVTkRPOgogICAgICAgIC8qCiAgICAgICAgICogQmFjayBvdXQgYW55IGNoYW5nZXMgbWFkZSBpbiB0aGUgQUNUSU9OIGNhc2UgCiAgICAgICAgICovCiAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFByb2Jlc1BlckhvcCA9IHRtcHZhcjsKICAgICAgICBicmVhazsKCgogICAgY2FzZSBDT01NSVQ6CiAgICAgICAgLyoKICAgICAgICAgKiBUaGluZ3MgYXJlIHdvcmtpbmcgd2VsbCwgc28gaXQncyBub3cgc2FmZSB0byBtYWtlIHRoZSBjaGFuZ2UKICAgICAgICAgKiBwZXJtYW5lbnRseS4gIE1ha2Ugc3VyZSB0aGF0IGFueXRoaW5nIGRvbmUgaGVyZSBjYW4ndCBmYWlsISAKICAgICAgICAgKi8KICAgICAgICBzbm1wX3N0b3JlX25lZWRlZChOVUxMKTsKICAgICAgICBicmVhazsKICAgIH0KICAgIHJldHVybiBTTk1QX0VSUl9OT0VSUk9SOwp9CgoKCmludAp3cml0ZV90cmFjZVJvdXRlQ3RsUG9ydChpbnQgYWN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiB2YXJfdmFsLAogICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgdmFyX3ZhbF90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgdmFyX3ZhbF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHN0YXRQLCBvaWQgKiBuYW1lLCBzaXplX3QgbmFtZV9sZW4pCnsKICAgIHN0YXRpYyBzaXplX3QgICB0bXB2YXI7CiAgICBzdHJ1Y3QgdHJhY2VSb3V0ZUN0bFRhYmxlX2RhdGEgKlN0b3JhZ2VUbXAgPSBOVUxMOwogICAgc2l6ZV90ICAgICAgICAgIG5ld2xlbiA9CiAgICAgICAgbmFtZV9sZW4gLQogICAgICAgIChzaXplb2YodHJhY2VSb3V0ZUN0bFRhYmxlX3ZhcmlhYmxlc19vaWQpIC8gc2l6ZW9mKG9pZCkgKyAzIC0gMSk7CgogICAgaWYgKChTdG9yYWdlVG1wID0KICAgICAgICAgaGVhZGVyX2NvbXBsZXgodHJhY2VSb3V0ZUN0bFRhYmxlU3RvcmFnZSwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgJm5hbWVbc2l6ZW9mKHRyYWNlUm91dGVDdGxUYWJsZV92YXJpYWJsZXNfb2lkKSAvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihvaWQpICsgMyAtIDFdLCAmbmV3bGVuLCAxLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkgPT0gTlVMTCkKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9TVUNITkFNRTsgICAgIC8qIHJlbW92ZSBpZiB5b3Ugc3VwcG9ydCBjcmVhdGlvbiBoZXJlICovCgogICAgaWYgKFN0b3JhZ2VUbXAgJiYgU3RvcmFnZVRtcC0+c3RvcmFnZVR5cGUgPT0gU1RfUkVBRE9OTFkpIHsKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9UV1JJVEFCTEU7CiAgICB9CgogICAgc3dpdGNoIChhY3Rpb24pIHsKICAgIGNhc2UgUkVTRVJWRTE6CiAgICAgICAgaWYgKHZhcl92YWxfdHlwZSAhPSBBU05fVU5TSUdORUQpIHsKICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwKICAgICAgICAgICAgICAgICAgICAgIndyaXRlIHRvIHRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzVHlwZSBub3QgQVNOX1VOU0lHTkVEXG4iKTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX1dST05HVFlQRTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgUkVTRVJWRTI6CiAgICAgICAgLyoKICAgICAgICAgKiBtZW1vcnkgcmVzZXZlcmF0aW9uLCBmaW5hbCBwcmVwYXJhdGlvbi4uLiAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBGUkVFOgogICAgICAgIC8qCiAgICAgICAgICogUmVsZWFzZSBhbnkgcmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIGFsbG9jYXRlZCAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBBQ1RJT046CiAgICAgICAgLyoKICAgICAgICAgKiBUaGUgdmFyaWFibGUgaGFzIGJlZW4gc3RvcmVkIGluIG9iamlkIGZvcgogICAgICAgICAqIHlvdSB0byB1c2UsIGFuZCB5b3UgaGF2ZSBqdXN0IGJlZW4gYXNrZWQgdG8gZG8gc29tZXRoaW5nIHdpdGgKICAgICAgICAgKiBpdC4gIE5vdGUgdGhhdCBhbnl0aGluZyBkb25lIGhlcmUgbXVzdCBiZSByZXZlcnNhYmxlIGluIHRoZSBVTkRPIGNhc2UgCiAgICAgICAgICovCiAgICAgICAgdG1wdmFyID0gU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFBvcnQ7CiAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFBvcnQgPSAqKChsb25nICopIHZhcl92YWwpOwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIFVORE86CiAgICAgICAgLyoKICAgICAgICAgKiBCYWNrIG91dCBhbnkgY2hhbmdlcyBtYWRlIGluIHRoZSBBQ1RJT04gY2FzZSAKICAgICAgICAgKi8KICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsUG9ydCA9IHRtcHZhcjsKICAgICAgICBicmVhazsKCgogICAgY2FzZSBDT01NSVQ6CiAgICAgICAgLyoKICAgICAgICAgKiBUaGluZ3MgYXJlIHdvcmtpbmcgd2VsbCwgc28gaXQncyBub3cgc2FmZSB0byBtYWtlIHRoZSBjaGFuZ2UKICAgICAgICAgKiBwZXJtYW5lbnRseS4gIE1ha2Ugc3VyZSB0aGF0IGFueXRoaW5nIGRvbmUgaGVyZSBjYW4ndCBmYWlsISAKICAgICAgICAgKi8KICAgICAgICBzbm1wX3N0b3JlX25lZWRlZChOVUxMKTsKICAgICAgICBicmVhazsKICAgIH0KICAgIHJldHVybiBTTk1QX0VSUl9OT0VSUk9SOwp9CgoKCgppbnQKd3JpdGVfdHJhY2VSb3V0ZUN0bE1heFR0bChpbnQgYWN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHZhcl92YWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyIHZhcl92YWxfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgdmFyX3ZhbF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogc3RhdFAsIG9pZCAqIG5hbWUsIHNpemVfdCBuYW1lX2xlbikKewogICAgc3RhdGljIHNpemVfdCAgIHRtcHZhcjsKICAgIHN0cnVjdCB0cmFjZVJvdXRlQ3RsVGFibGVfZGF0YSAqU3RvcmFnZVRtcCA9IE5VTEw7CiAgICBzaXplX3QgICAgICAgICAgbmV3bGVuID0KICAgICAgICBuYW1lX2xlbiAtCiAgICAgICAgKHNpemVvZih0cmFjZVJvdXRlQ3RsVGFibGVfdmFyaWFibGVzX29pZCkgLyBzaXplb2Yob2lkKSArIDMgLSAxKTsKCiAgICBpZiAoKFN0b3JhZ2VUbXAgPQogICAgICAgICBoZWFkZXJfY29tcGxleCh0cmFjZVJvdXRlQ3RsVGFibGVTdG9yYWdlLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAmbmFtZVtzaXplb2YodHJhY2VSb3V0ZUN0bFRhYmxlX3ZhcmlhYmxlc19vaWQpIC8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9pZCkgKyAzIC0gMV0sICZuZXdsZW4sIDEsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKSA9PSBOVUxMKQogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1NVQ0hOQU1FOyAgICAgLyogcmVtb3ZlIGlmIHlvdSBzdXBwb3J0IGNyZWF0aW9uIGhlcmUgKi8KCiAgICBpZiAoU3RvcmFnZVRtcCAmJiBTdG9yYWdlVG1wLT5zdG9yYWdlVHlwZSA9PSBTVF9SRUFET05MWSkgewogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1RXUklUQUJMRTsKICAgIH0KCiAgICBpZiAoU3RvcmFnZVRtcCAmJiBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsUm93U3RhdHVzID09IFJTX0FDVElWRSkgewogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1RXUklUQUJMRTsKICAgIH0KICAgIHN3aXRjaCAoYWN0aW9uKSB7CiAgICBjYXNlIFJFU0VSVkUxOgogICAgICAgIGlmICh2YXJfdmFsX3R5cGUgIT0gQVNOX1VOU0lHTkVEKSB7CiAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsCiAgICAgICAgICAgICAgICAgICAgICJ3cml0ZSB0byB0cmFjZVJvdXRlQ3RsRGF0YVNpemUgbm90IEFTTl9VTlNJR05FRFxuIik7CiAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9XUk9OR1RZUEU7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIFJFU0VSVkUyOgogICAgICAgIC8qCiAgICAgICAgICogbWVtb3J5IHJlc2V2ZXJhdGlvbiwgZmluYWwgcHJlcGFyYXRpb24uLi4gCiAgICAgICAgICovCiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgRlJFRToKICAgICAgICAvKgogICAgICAgICAqIFJlbGVhc2UgYW55IHJlc291cmNlcyB0aGF0IGhhdmUgYmVlbiBhbGxvY2F0ZWQgCiAgICAgICAgICovCiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgQUNUSU9OOgogICAgICAgIC8qCiAgICAgICAgICogVGhlIHZhcmlhYmxlIGhhcyBiZWVuIHN0b3JlZCBpbiBvYmppZCBmb3IKICAgICAgICAgKiB5b3UgdG8gdXNlLCBhbmQgeW91IGhhdmUganVzdCBiZWVuIGFza2VkIHRvIGRvIHNvbWV0aGluZyB3aXRoCiAgICAgICAgICogaXQuICBOb3RlIHRoYXQgYW55dGhpbmcgZG9uZSBoZXJlIG11c3QgYmUgcmV2ZXJzYWJsZSBpbiB0aGUgVU5ETyBjYXNlIAogICAgICAgICAqLwogICAgICAgIHRtcHZhciA9IFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxNYXhUdGw7CiAgICAgICAgaWYgKCgqKChsb25nICopIHZhcl92YWwpKSA+PSAxICYmICgqKChsb25nICopIHZhcl92YWwpKSA8PSAyNTUpCiAgICAgICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxNYXhUdGwgPSAqKChsb25nICopIHZhcl92YWwpOwogICAgICAgIGVsc2UKICAgICAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bE1heFR0bCA9IDMwOwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIFVORE86CiAgICAgICAgLyoKICAgICAgICAgKiBCYWNrIG91dCBhbnkgY2hhbmdlcyBtYWRlIGluIHRoZSBBQ1RJT04gY2FzZSAKICAgICAgICAgKi8KICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsTWF4VHRsID0gdG1wdmFyOwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIENPTU1JVDoKICAgICAgICAvKgogICAgICAgICAqIFRoaW5ncyBhcmUgd29ya2luZyB3ZWxsLCBzbyBpdCdzIG5vdyBzYWZlIHRvIG1ha2UgdGhlIGNoYW5nZQogICAgICAgICAqIHBlcm1hbmVudGx5LiAgTWFrZSBzdXJlIHRoYXQgYW55dGhpbmcgZG9uZSBoZXJlIGNhbid0IGZhaWwhIAogICAgICAgICAqLwogICAgICAgIHNubXBfc3RvcmVfbmVlZGVkKE5VTEwpOwogICAgICAgIGJyZWFrOwogICAgfQogICAgcmV0dXJuIFNOTVBfRVJSX05PRVJST1I7Cn0KCgppbnQKd3JpdGVfdHJhY2VSb3V0ZUN0bERTRmllbGQoaW50IGFjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogdmFyX3ZhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyIHZhcl92YWxfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHZhcl92YWxfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiBzdGF0UCwgb2lkICogbmFtZSwgc2l6ZV90IG5hbWVfbGVuKQp7CiAgICBzdGF0aWMgc2l6ZV90ICAgdG1wdmFyOwogICAgc3RydWN0IHRyYWNlUm91dGVDdGxUYWJsZV9kYXRhICpTdG9yYWdlVG1wID0gTlVMTDsKICAgIHNpemVfdCAgICAgICAgICBuZXdsZW4gPQogICAgICAgIG5hbWVfbGVuIC0KICAgICAgICAoc2l6ZW9mKHRyYWNlUm91dGVDdGxUYWJsZV92YXJpYWJsZXNfb2lkKSAvIHNpemVvZihvaWQpICsgMyAtIDEpOwoKICAgIGlmICgoU3RvcmFnZVRtcCA9CiAgICAgICAgIGhlYWRlcl9jb21wbGV4KHRyYWNlUm91dGVDdGxUYWJsZVN0b3JhZ2UsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICZuYW1lW3NpemVvZih0cmFjZVJvdXRlQ3RsVGFibGVfdmFyaWFibGVzX29pZCkgLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yob2lkKSArIDMgLSAxXSwgJm5ld2xlbiwgMSwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpID09IE5VTEwpCiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PU1VDSE5BTUU7ICAgICAvKiByZW1vdmUgaWYgeW91IHN1cHBvcnQgY3JlYXRpb24gaGVyZSAqLwoKICAgIGlmIChTdG9yYWdlVG1wICYmIFN0b3JhZ2VUbXAtPnN0b3JhZ2VUeXBlID09IFNUX1JFQURPTkxZKSB7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PVFdSSVRBQkxFOwogICAgfQoKICAgIGlmIChTdG9yYWdlVG1wICYmIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxSb3dTdGF0dXMgPT0gUlNfQUNUSVZFKSB7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PVFdSSVRBQkxFOwogICAgfQogICAgc3dpdGNoIChhY3Rpb24pIHsKICAgIGNhc2UgUkVTRVJWRTE6CiAgICAgICAgaWYgKHZhcl92YWxfdHlwZSAhPSBBU05fVU5TSUdORUQpIHsKICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwKICAgICAgICAgICAgICAgICAgICAgIndyaXRlIHRvIHRyYWNlUm91dGVDdGxEYXRhU2l6ZSBub3QgQVNOX1VOU0lHTkVEXG4iKTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX1dST05HVFlQRTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgUkVTRVJWRTI6CiAgICAgICAgLyoKICAgICAgICAgKiBtZW1vcnkgcmVzZXZlcmF0aW9uLCBmaW5hbCBwcmVwYXJhdGlvbi4uLiAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBGUkVFOgogICAgICAgIC8qCiAgICAgICAgICogUmVsZWFzZSBhbnkgcmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIGFsbG9jYXRlZCAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBBQ1RJT046CiAgICAgICAgLyoKICAgICAgICAgKiBUaGUgdmFyaWFibGUgaGFzIGJlZW4gc3RvcmVkIGluIG9iamlkIGZvcgogICAgICAgICAqIHlvdSB0byB1c2UsIGFuZCB5b3UgaGF2ZSBqdXN0IGJlZW4gYXNrZWQgdG8gZG8gc29tZXRoaW5nIHdpdGgKICAgICAgICAgKiBpdC4gIE5vdGUgdGhhdCBhbnl0aGluZyBkb25lIGhlcmUgbXVzdCBiZSByZXZlcnNhYmxlIGluIHRoZSBVTkRPIGNhc2UgCiAgICAgICAgICovCiAgICAgICAgdG1wdmFyID0gU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bERTRmllbGQ7CiAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bERTRmllbGQgPSAqKChsb25nICopIHZhcl92YWwpOwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIFVORE86CiAgICAgICAgLyoKICAgICAgICAgKiBCYWNrIG91dCBhbnkgY2hhbmdlcyBtYWRlIGluIHRoZSBBQ1RJT04gY2FzZSAKICAgICAgICAgKi8KICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsRFNGaWVsZCA9IHRtcHZhcjsKICAgICAgICBicmVhazsKCgogICAgY2FzZSBDT01NSVQ6CiAgICAgICAgLyoKICAgICAgICAgKiBUaGluZ3MgYXJlIHdvcmtpbmcgd2VsbCwgc28gaXQncyBub3cgc2FmZSB0byBtYWtlIHRoZSBjaGFuZ2UKICAgICAgICAgKiBwZXJtYW5lbnRseS4gIE1ha2Ugc3VyZSB0aGF0IGFueXRoaW5nIGRvbmUgaGVyZSBjYW4ndCBmYWlsISAKICAgICAgICAgKi8KICAgICAgICBzbm1wX3N0b3JlX25lZWRlZChOVUxMKTsKICAgICAgICBicmVhazsKICAgIH0KICAgIHJldHVybiBTTk1QX0VSUl9OT0VSUk9SOwp9CgppbnQKd3JpdGVfdHJhY2VSb3V0ZUN0bFNvdXJjZUFkZHJlc3NUeXBlKGludCBhY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiB2YXJfdmFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyIHZhcl92YWxfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB2YXJfdmFsX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHN0YXRQLCBvaWQgKiBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG5hbWVfbGVuKQp7CiAgICBzdGF0aWMgc2l6ZV90ICAgdG1wdmFyOwogICAgc3RydWN0IHRyYWNlUm91dGVDdGxUYWJsZV9kYXRhICpTdG9yYWdlVG1wID0gTlVMTDsKICAgIHNpemVfdCAgICAgICAgICBuZXdsZW4gPQogICAgICAgIG5hbWVfbGVuIC0KICAgICAgICAoc2l6ZW9mKHRyYWNlUm91dGVDdGxUYWJsZV92YXJpYWJsZXNfb2lkKSAvIHNpemVvZihvaWQpICsgMyAtIDEpOwoKICAgIGlmICgoU3RvcmFnZVRtcCA9CiAgICAgICAgIGhlYWRlcl9jb21wbGV4KHRyYWNlUm91dGVDdGxUYWJsZVN0b3JhZ2UsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICZuYW1lW3NpemVvZih0cmFjZVJvdXRlQ3RsVGFibGVfdmFyaWFibGVzX29pZCkgLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yob2lkKSArIDMgLSAxXSwgJm5ld2xlbiwgMSwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpID09IE5VTEwpCiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PU1VDSE5BTUU7ICAgICAvKiByZW1vdmUgaWYgeW91IHN1cHBvcnQgY3JlYXRpb24gaGVyZSAqLwoKICAgIGlmIChTdG9yYWdlVG1wICYmIFN0b3JhZ2VUbXAtPnN0b3JhZ2VUeXBlID09IFNUX1JFQURPTkxZKSB7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PVFdSSVRBQkxFOwogICAgfQoKICAgIGlmIChTdG9yYWdlVG1wICYmIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxSb3dTdGF0dXMgPT0gUlNfQUNUSVZFKSB7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PVFdSSVRBQkxFOwogICAgfQogICAgc3dpdGNoIChhY3Rpb24pIHsKICAgIGNhc2UgUkVTRVJWRTE6CiAgICAgICAgaWYgKHZhcl92YWxfdHlwZSAhPSBBU05fSU5URUdFUikgewogICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLAogICAgICAgICAgICAgICAgICAgICAid3JpdGUgdG8gdHJhY2VSb3V0ZUN0bE1heFJvd3Mgbm90IEFTTl9JTlRFR0VSXG4iKTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX1dST05HVFlQRTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgUkVTRVJWRTI6CiAgICAgICAgLyoKICAgICAgICAgKiBtZW1vcnkgcmVzZXZlcmF0aW9uLCBmaW5hbCBwcmVwYXJhdGlvbi4uLiAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBGUkVFOgogICAgICAgIC8qCiAgICAgICAgICogUmVsZWFzZSBhbnkgcmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIGFsbG9jYXRlZCAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBBQ1RJT046CiAgICAgICAgLyoKICAgICAgICAgKiBUaGUgdmFyaWFibGUgaGFzIGJlZW4gc3RvcmVkIGluIG9iamlkIGZvcgogICAgICAgICAqIHlvdSB0byB1c2UsIGFuZCB5b3UgaGF2ZSBqdXN0IGJlZW4gYXNrZWQgdG8gZG8gc29tZXRoaW5nIHdpdGgKICAgICAgICAgKiBpdC4gIE5vdGUgdGhhdCBhbnl0aGluZyBkb25lIGhlcmUgbXVzdCBiZSByZXZlcnNhYmxlIGluIHRoZSBVTkRPIGNhc2UgCiAgICAgICAgICovCiAgICAgICAgdG1wdmFyID0gU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFNvdXJjZUFkZHJlc3NUeXBlOwogICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxTb3VyY2VBZGRyZXNzVHlwZSA9ICooKGxvbmcgKikgdmFyX3ZhbCk7CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgVU5ETzoKICAgICAgICAvKgogICAgICAgICAqIEJhY2sgb3V0IGFueSBjaGFuZ2VzIG1hZGUgaW4gdGhlIEFDVElPTiBjYXNlIAogICAgICAgICAqLwogICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxTb3VyY2VBZGRyZXNzVHlwZSA9IHRtcHZhcjsKICAgICAgICBicmVhazsKCgogICAgY2FzZSBDT01NSVQ6CiAgICAgICAgLyoKICAgICAgICAgKiBUaGluZ3MgYXJlIHdvcmtpbmcgd2VsbCwgc28gaXQncyBub3cgc2FmZSB0byBtYWtlIHRoZSBjaGFuZ2UKICAgICAgICAgKiBwZXJtYW5lbnRseS4gIE1ha2Ugc3VyZSB0aGF0IGFueXRoaW5nIGRvbmUgaGVyZSBjYW4ndCBmYWlsISAKICAgICAgICAgKi8KICAgICAgICBzbm1wX3N0b3JlX25lZWRlZChOVUxMKTsKICAgICAgICBicmVhazsKICAgIH0KICAgIHJldHVybiBTTk1QX0VSUl9OT0VSUk9SOwp9CgppbnQKd3JpdGVfdHJhY2VSb3V0ZUN0bFNvdXJjZUFkZHJlc3MoaW50IGFjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogdmFyX3ZhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyIHZhcl92YWxfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHZhcl92YWxfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiBzdGF0UCwgb2lkICogbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG5hbWVfbGVuKQp7CiAgICBzdGF0aWMgY2hhciAgICAqdG1wdmFyOwogICAgc3RhdGljIHNpemVfdCAgIHRtcGxlbjsKICAgIHN0cnVjdCB0cmFjZVJvdXRlQ3RsVGFibGVfZGF0YSAqU3RvcmFnZVRtcCA9IE5VTEw7CiAgICBzaXplX3QgICAgICAgICAgbmV3bGVuID0KICAgICAgICBuYW1lX2xlbiAtCiAgICAgICAgKHNpemVvZih0cmFjZVJvdXRlQ3RsVGFibGVfdmFyaWFibGVzX29pZCkgLyBzaXplb2Yob2lkKSArIDMgLSAxKTsKCiAgICBpZiAoKFN0b3JhZ2VUbXAgPQogICAgICAgICBoZWFkZXJfY29tcGxleCh0cmFjZVJvdXRlQ3RsVGFibGVTdG9yYWdlLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAmbmFtZVtzaXplb2YodHJhY2VSb3V0ZUN0bFRhYmxlX3ZhcmlhYmxlc19vaWQpIC8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9pZCkgKyAzIC0gMV0sICZuZXdsZW4sIDEsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKSA9PSBOVUxMKQogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1NVQ0hOQU1FOyAgICAgLyogcmVtb3ZlIGlmIHlvdSBzdXBwb3J0IGNyZWF0aW9uIGhlcmUgKi8KCiAgICBpZiAoU3RvcmFnZVRtcCAmJiBTdG9yYWdlVG1wLT5zdG9yYWdlVHlwZSA9PSBTVF9SRUFET05MWSkgewogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1RXUklUQUJMRTsKICAgIH0KCiAgICBpZiAoU3RvcmFnZVRtcCAmJiBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsUm93U3RhdHVzID09IFJTX0FDVElWRSkgewogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1RXUklUQUJMRTsKICAgIH0KCiAgICBzd2l0Y2ggKGFjdGlvbikgewogICAgY2FzZSBSRVNFUlZFMToKICAgICAgICBpZiAodmFyX3ZhbF90eXBlICE9IEFTTl9PQ1RFVF9TVFIpIHsKICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwKICAgICAgICAgICAgICAgICAgICAgIndyaXRlIHRvIHRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzIG5vdCBBU05fT0NURVRfU1RSXG4iKTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX1dST05HVFlQRTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgUkVTRVJWRTI6CiAgICAgICAgLyoKICAgICAgICAgKiBtZW1vcnkgcmVzZXZlcmF0aW9uLCBmaW5hbCBwcmVwYXJhdGlvbi4uLiAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBGUkVFOgogICAgICAgIC8qCiAgICAgICAgICogUmVsZWFzZSBhbnkgcmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIGFsbG9jYXRlZCAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBBQ1RJT046CiAgICAgICAgLyoKICAgICAgICAgKiBUaGUgdmFyaWFibGUgaGFzIGJlZW4gc3RvcmVkIGluIGxvbmdfcmV0IGZvcgogICAgICAgICAqIHlvdSB0byB1c2UsIGFuZCB5b3UgaGF2ZSBqdXN0IGJlZW4gYXNrZWQgdG8gZG8gc29tZXRoaW5nIHdpdGgKICAgICAgICAgKiBpdC4gIE5vdGUgdGhhdCBhbnl0aGluZyBkb25lIGhlcmUgbXVzdCBiZSByZXZlcnNhYmxlIGluIHRoZSBVTkRPIGNhc2UgCiAgICAgICAgICovCiAgICAgICAgdG1wdmFyID0gU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFNvdXJjZUFkZHJlc3M7CiAgICAgICAgdG1wbGVuID0gU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFNvdXJjZUFkZHJlc3NMZW47CiAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFNvdXJjZUFkZHJlc3MgPQogICAgICAgICAgICAoY2hhciAqKSBtYWxsb2ModmFyX3ZhbF9sZW4gKyAxKTsKICAgICAgICBpZiAoU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFNvdXJjZUFkZHJlc3MgPT0gTlVMTCkgewogICAgICAgICAgICBleGl0KDEpOwogICAgICAgIH0KICAgICAgICBtZW1jcHkoU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFNvdXJjZUFkZHJlc3MsIHZhcl92YWwsCiAgICAgICAgICAgICAgIHZhcl92YWxfbGVuICsgMSk7CiAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFNvdXJjZUFkZHJlc3NbdmFyX3ZhbF9sZW5dID0gJ1wwJzsKICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsU291cmNlQWRkcmVzc0xlbiA9IHZhcl92YWxfbGVuOwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIFVORE86CiAgICAgICAgLyoKICAgICAgICAgKiBCYWNrIG91dCBhbnkgY2hhbmdlcyBtYWRlIGluIHRoZSBBQ1RJT04gY2FzZSAKICAgICAgICAgKi8KICAgICAgICBTTk1QX0ZSRUUoU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFNvdXJjZUFkZHJlc3MpOwogICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxTb3VyY2VBZGRyZXNzID0gTlVMTDsKICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsU291cmNlQWRkcmVzcyA9IHRtcHZhcjsKICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsU291cmNlQWRkcmVzc0xlbiA9IHRtcGxlbjsKICAgICAgICBicmVhazsKCgogICAgY2FzZSBDT01NSVQ6CiAgICAgICAgLyoKICAgICAgICAgKiBUaGluZ3MgYXJlIHdvcmtpbmcgd2VsbCwgc28gaXQncyBub3cgc2FmZSB0byBtYWtlIHRoZSBjaGFuZ2UKICAgICAgICAgKiBwZXJtYW5lbnRseS4gIE1ha2Ugc3VyZSB0aGF0IGFueXRoaW5nIGRvbmUgaGVyZSBjYW4ndCBmYWlsISAKICAgICAgICAgKi8KICAgICAgICBTTk1QX0ZSRUUodG1wdmFyKTsKICAgICAgICBzbm1wX3N0b3JlX25lZWRlZChOVUxMKTsKICAgICAgICBicmVhazsKICAgIH0KICAgIHJldHVybiBTTk1QX0VSUl9OT0VSUk9SOwp9CgoKCgppbnQKd3JpdGVfdHJhY2VSb3V0ZUN0bElmSW5kZXgoaW50IGFjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogdmFyX3ZhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyIHZhcl92YWxfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHZhcl92YWxfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiBzdGF0UCwgb2lkICogbmFtZSwgc2l6ZV90IG5hbWVfbGVuKQp7CiAgICBzdGF0aWMgc2l6ZV90ICAgdG1wdmFyOwogICAgc3RydWN0IHRyYWNlUm91dGVDdGxUYWJsZV9kYXRhICpTdG9yYWdlVG1wID0gTlVMTDsKICAgIHNpemVfdCAgICAgICAgICBuZXdsZW4gPQogICAgICAgIG5hbWVfbGVuIC0KICAgICAgICAoc2l6ZW9mKHRyYWNlUm91dGVDdGxUYWJsZV92YXJpYWJsZXNfb2lkKSAvIHNpemVvZihvaWQpICsgMyAtIDEpOwoKICAgIGlmICgoU3RvcmFnZVRtcCA9CiAgICAgICAgIGhlYWRlcl9jb21wbGV4KHRyYWNlUm91dGVDdGxUYWJsZVN0b3JhZ2UsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICZuYW1lW3NpemVvZih0cmFjZVJvdXRlQ3RsVGFibGVfdmFyaWFibGVzX29pZCkgLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yob2lkKSArIDMgLSAxXSwgJm5ld2xlbiwgMSwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpID09IE5VTEwpCiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PU1VDSE5BTUU7ICAgICAvKiByZW1vdmUgaWYgeW91IHN1cHBvcnQgY3JlYXRpb24gaGVyZSAqLwoKICAgIGlmIChTdG9yYWdlVG1wICYmIFN0b3JhZ2VUbXAtPnN0b3JhZ2VUeXBlID09IFNUX1JFQURPTkxZKSB7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PVFdSSVRBQkxFOwogICAgfQoKICAgIGlmIChTdG9yYWdlVG1wICYmIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxSb3dTdGF0dXMgPT0gUlNfQUNUSVZFKSB7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PVFdSSVRBQkxFOwogICAgfQogICAgc3dpdGNoIChhY3Rpb24pIHsKICAgIGNhc2UgUkVTRVJWRTE6CiAgICAgICAgaWYgKHZhcl92YWxfdHlwZSAhPSBBU05fSU5URUdFUikgewogICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLAogICAgICAgICAgICAgICAgICAgICAid3JpdGUgdG8gdHJhY2VSb3V0ZUN0bE1heFJvd3Mgbm90IEFTTl9JTlRFR0VSXG4iKTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX1dST05HVFlQRTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgUkVTRVJWRTI6CiAgICAgICAgLyoKICAgICAgICAgKiBtZW1vcnkgcmVzZXZlcmF0aW9uLCBmaW5hbCBwcmVwYXJhdGlvbi4uLiAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBGUkVFOgogICAgICAgIC8qCiAgICAgICAgICogUmVsZWFzZSBhbnkgcmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIGFsbG9jYXRlZCAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBBQ1RJT046CiAgICAgICAgLyoKICAgICAgICAgKiBUaGUgdmFyaWFibGUgaGFzIGJlZW4gc3RvcmVkIGluIG9iamlkIGZvcgogICAgICAgICAqIHlvdSB0byB1c2UsIGFuZCB5b3UgaGF2ZSBqdXN0IGJlZW4gYXNrZWQgdG8gZG8gc29tZXRoaW5nIHdpdGgKICAgICAgICAgKiBpdC4gIE5vdGUgdGhhdCBhbnl0aGluZyBkb25lIGhlcmUgbXVzdCBiZSByZXZlcnNhYmxlIGluIHRoZSBVTkRPIGNhc2UgCiAgICAgICAgICovCiAgICAgICAgdG1wdmFyID0gU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bElmSW5kZXg7CiAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bElmSW5kZXggPSAqKChsb25nICopIHZhcl92YWwpOwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIFVORE86CiAgICAgICAgLyoKICAgICAgICAgKiBCYWNrIG91dCBhbnkgY2hhbmdlcyBtYWRlIGluIHRoZSBBQ1RJT04gY2FzZSAKICAgICAgICAgKi8KICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsSWZJbmRleCA9IHRtcHZhcjsKICAgICAgICBicmVhazsKCgogICAgY2FzZSBDT01NSVQ6CiAgICAgICAgLyoKICAgICAgICAgKiBUaGluZ3MgYXJlIHdvcmtpbmcgd2VsbCwgc28gaXQncyBub3cgc2FmZSB0byBtYWtlIHRoZSBjaGFuZ2UKICAgICAgICAgKiBwZXJtYW5lbnRseS4gIE1ha2Ugc3VyZSB0aGF0IGFueXRoaW5nIGRvbmUgaGVyZSBjYW4ndCBmYWlsISAKICAgICAgICAgKi8KICAgICAgICBzbm1wX3N0b3JlX25lZWRlZChOVUxMKTsKICAgICAgICBicmVhazsKICAgIH0KICAgIHJldHVybiBTTk1QX0VSUl9OT0VSUk9SOwp9CgoKCmludAp3cml0ZV90cmFjZVJvdXRlQ3RsTWlzY09wdGlvbnMoaW50IGFjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHZhcl92YWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgdmFyX3ZhbF90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHZhcl92YWxfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogc3RhdFAsIG9pZCAqIG5hbWUsIHNpemVfdCBuYW1lX2xlbikKewogICAgc3RhdGljIGNoYXIgICAgKnRtcHZhcjsKICAgIHN0YXRpYyBzaXplX3QgICB0bXBsZW47CiAgICBzdHJ1Y3QgdHJhY2VSb3V0ZUN0bFRhYmxlX2RhdGEgKlN0b3JhZ2VUbXAgPSBOVUxMOwogICAgc2l6ZV90ICAgICAgICAgIG5ld2xlbiA9CiAgICAgICAgbmFtZV9sZW4gLQogICAgICAgIChzaXplb2YodHJhY2VSb3V0ZUN0bFRhYmxlX3ZhcmlhYmxlc19vaWQpIC8gc2l6ZW9mKG9pZCkgKyAzIC0gMSk7CgogICAgaWYgKChTdG9yYWdlVG1wID0KICAgICAgICAgaGVhZGVyX2NvbXBsZXgodHJhY2VSb3V0ZUN0bFRhYmxlU3RvcmFnZSwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgJm5hbWVbc2l6ZW9mKHRyYWNlUm91dGVDdGxUYWJsZV92YXJpYWJsZXNfb2lkKSAvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihvaWQpICsgMyAtIDFdLCAmbmV3bGVuLCAxLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkgPT0gTlVMTCkKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9TVUNITkFNRTsgICAgIC8qIHJlbW92ZSBpZiB5b3Ugc3VwcG9ydCBjcmVhdGlvbiBoZXJlICovCgogICAgaWYgKFN0b3JhZ2VUbXAgJiYgU3RvcmFnZVRtcC0+c3RvcmFnZVR5cGUgPT0gU1RfUkVBRE9OTFkpIHsKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9UV1JJVEFCTEU7CiAgICB9CgogICAgaWYgKFN0b3JhZ2VUbXAgJiYgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFJvd1N0YXR1cyA9PSBSU19BQ1RJVkUpIHsKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9UV1JJVEFCTEU7CiAgICB9CgogICAgc3dpdGNoIChhY3Rpb24pIHsKICAgIGNhc2UgUkVTRVJWRTE6CiAgICAgICAgaWYgKHZhcl92YWxfdHlwZSAhPSBBU05fT0NURVRfU1RSKSB7CiAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsCiAgICAgICAgICAgICAgICAgICAgICJ3cml0ZSB0byB0cmFjZVJvdXRlQ3RsVGFyZ2V0QWRkcmVzcyBub3QgQVNOX09DVEVUX1NUUlxuIik7CiAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9XUk9OR1RZUEU7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIFJFU0VSVkUyOgogICAgICAgIC8qCiAgICAgICAgICogbWVtb3J5IHJlc2V2ZXJhdGlvbiwgZmluYWwgcHJlcGFyYXRpb24uLi4gCiAgICAgICAgICovCiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgRlJFRToKICAgICAgICAvKgogICAgICAgICAqIFJlbGVhc2UgYW55IHJlc291cmNlcyB0aGF0IGhhdmUgYmVlbiBhbGxvY2F0ZWQgCiAgICAgICAgICovCiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgQUNUSU9OOgogICAgICAgIC8qCiAgICAgICAgICogVGhlIHZhcmlhYmxlIGhhcyBiZWVuIHN0b3JlZCBpbiBsb25nX3JldCBmb3IKICAgICAgICAgKiB5b3UgdG8gdXNlLCBhbmQgeW91IGhhdmUganVzdCBiZWVuIGFza2VkIHRvIGRvIHNvbWV0aGluZyB3aXRoCiAgICAgICAgICogaXQuICBOb3RlIHRoYXQgYW55dGhpbmcgZG9uZSBoZXJlIG11c3QgYmUgcmV2ZXJzYWJsZSBpbiB0aGUgVU5ETyBjYXNlIAogICAgICAgICAqLwogICAgICAgIHRtcHZhciA9IFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxNaXNjT3B0aW9uczsKICAgICAgICB0bXBsZW4gPSBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsTWlzY09wdGlvbnNMZW47CiAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bE1pc2NPcHRpb25zID0KICAgICAgICAgICAgKGNoYXIgKikgbWFsbG9jKHZhcl92YWxfbGVuICsgMSk7CiAgICAgICAgaWYgKFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxNaXNjT3B0aW9ucyA9PSBOVUxMKSB7CiAgICAgICAgICAgIGV4aXQoMSk7CiAgICAgICAgfQogICAgICAgIG1lbWNweShTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsTWlzY09wdGlvbnMsIHZhcl92YWwsCiAgICAgICAgICAgICAgIHZhcl92YWxfbGVuICsgMSk7CiAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bE1pc2NPcHRpb25zW3Zhcl92YWxfbGVuXSA9ICdcMCc7CiAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bE1pc2NPcHRpb25zTGVuID0gdmFyX3ZhbF9sZW47CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgVU5ETzoKICAgICAgICAvKgogICAgICAgICAqIEJhY2sgb3V0IGFueSBjaGFuZ2VzIG1hZGUgaW4gdGhlIEFDVElPTiBjYXNlIAogICAgICAgICAqLwogICAgICAgIFNOTVBfRlJFRShTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsTWlzY09wdGlvbnMpOwogICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxNaXNjT3B0aW9ucyA9IE5VTEw7CiAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bE1pc2NPcHRpb25zID0gdG1wdmFyOwogICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxNaXNjT3B0aW9uc0xlbiA9IHRtcGxlbjsKICAgICAgICBicmVhazsKCgogICAgY2FzZSBDT01NSVQ6CiAgICAgICAgLyoKICAgICAgICAgKiBUaGluZ3MgYXJlIHdvcmtpbmcgd2VsbCwgc28gaXQncyBub3cgc2FmZSB0byBtYWtlIHRoZSBjaGFuZ2UKICAgICAgICAgKiBwZXJtYW5lbnRseS4gIE1ha2Ugc3VyZSB0aGF0IGFueXRoaW5nIGRvbmUgaGVyZSBjYW4ndCBmYWlsISAKICAgICAgICAgKi8KICAgICAgICBTTk1QX0ZSRUUodG1wdmFyKTsKICAgICAgICBzbm1wX3N0b3JlX25lZWRlZChOVUxMKTsKICAgICAgICBicmVhazsKICAgIH0KICAgIHJldHVybiBTTk1QX0VSUl9OT0VSUk9SOwp9CgppbnQKd3JpdGVfdHJhY2VSb3V0ZUN0bE1heEZhaWx1cmVzKGludCBhY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiB2YXJfdmFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyIHZhcl92YWxfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB2YXJfdmFsX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHN0YXRQLCBvaWQgKiBuYW1lLCBzaXplX3QgbmFtZV9sZW4pCnsKICAgIHN0YXRpYyBzaXplX3QgICB0bXB2YXI7CiAgICBzdHJ1Y3QgdHJhY2VSb3V0ZUN0bFRhYmxlX2RhdGEgKlN0b3JhZ2VUbXAgPSBOVUxMOwogICAgc2l6ZV90ICAgICAgICAgIG5ld2xlbiA9CiAgICAgICAgbmFtZV9sZW4gLQogICAgICAgIChzaXplb2YodHJhY2VSb3V0ZUN0bFRhYmxlX3ZhcmlhYmxlc19vaWQpIC8gc2l6ZW9mKG9pZCkgKyAzIC0gMSk7CgogICAgaWYgKChTdG9yYWdlVG1wID0KICAgICAgICAgaGVhZGVyX2NvbXBsZXgodHJhY2VSb3V0ZUN0bFRhYmxlU3RvcmFnZSwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgJm5hbWVbc2l6ZW9mKHRyYWNlUm91dGVDdGxUYWJsZV92YXJpYWJsZXNfb2lkKSAvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihvaWQpICsgMyAtIDFdLCAmbmV3bGVuLCAxLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkgPT0gTlVMTCkKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9TVUNITkFNRTsgICAgIC8qIHJlbW92ZSBpZiB5b3Ugc3VwcG9ydCBjcmVhdGlvbiBoZXJlICovCgogICAgaWYgKFN0b3JhZ2VUbXAgJiYgU3RvcmFnZVRtcC0+c3RvcmFnZVR5cGUgPT0gU1RfUkVBRE9OTFkpIHsKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9UV1JJVEFCTEU7CiAgICB9CgogICAgaWYgKFN0b3JhZ2VUbXAgJiYgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFJvd1N0YXR1cyA9PSBSU19BQ1RJVkUpIHsKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9UV1JJVEFCTEU7CiAgICB9CiAgICBzd2l0Y2ggKGFjdGlvbikgewogICAgY2FzZSBSRVNFUlZFMToKICAgICAgICBpZiAodmFyX3ZhbF90eXBlICE9IEFTTl9VTlNJR05FRCkgewogICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLAogICAgICAgICAgICAgICAgICAgICAid3JpdGUgdG8gdHJhY2VSb3V0ZUN0bFRyYXBUZXN0RmFpbHVyZUZpbHRlciBub3QgQVNOX1VOU0lHTkVEXG4iKTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX1dST05HVFlQRTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgUkVTRVJWRTI6CiAgICAgICAgLyoKICAgICAgICAgKiBtZW1vcnkgcmVzZXZlcmF0aW9uLCBmaW5hbCBwcmVwYXJhdGlvbi4uLiAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBGUkVFOgogICAgICAgIC8qCiAgICAgICAgICogUmVsZWFzZSBhbnkgcmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIGFsbG9jYXRlZCAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBBQ1RJT046CiAgICAgICAgLyoKICAgICAgICAgKiBUaGUgdmFyaWFibGUgaGFzIGJlZW4gc3RvcmVkIGluIG9iamlkIGZvcgogICAgICAgICAqIHlvdSB0byB1c2UsIGFuZCB5b3UgaGF2ZSBqdXN0IGJlZW4gYXNrZWQgdG8gZG8gc29tZXRoaW5nIHdpdGgKICAgICAgICAgKiBpdC4gIE5vdGUgdGhhdCBhbnl0aGluZyBkb25lIGhlcmUgbXVzdCBiZSByZXZlcnNhYmxlIGluIHRoZSBVTkRPIGNhc2UgCiAgICAgICAgICovCiAgICAgICAgdG1wdmFyID0gU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bE1heEZhaWx1cmVzOwogICAgICAgIGlmICgoKigobG9uZyAqKSB2YXJfdmFsKSkgPj0gMCAmJiAoKigobG9uZyAqKSB2YXJfdmFsKSkgPD0gMTUpCiAgICAgICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxNYXhGYWlsdXJlcyA9ICooKGxvbmcgKikgdmFyX3ZhbCk7CiAgICAgICAgZWxzZQogICAgICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsTWF4RmFpbHVyZXMgPSAxOwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIFVORE86CiAgICAgICAgLyoKICAgICAgICAgKiBCYWNrIG91dCBhbnkgY2hhbmdlcyBtYWRlIGluIHRoZSBBQ1RJT04gY2FzZSAKICAgICAgICAgKi8KICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsTWF4RmFpbHVyZXMgPSB0bXB2YXI7CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgQ09NTUlUOgogICAgICAgIC8qCiAgICAgICAgICogVGhpbmdzIGFyZSB3b3JraW5nIHdlbGwsIHNvIGl0J3Mgbm93IHNhZmUgdG8gbWFrZSB0aGUgY2hhbmdlCiAgICAgICAgICogcGVybWFuZW50bHkuICBNYWtlIHN1cmUgdGhhdCBhbnl0aGluZyBkb25lIGhlcmUgY2FuJ3QgZmFpbCEgCiAgICAgICAgICovCiAgICAgICAgc25tcF9zdG9yZV9uZWVkZWQoTlVMTCk7CiAgICAgICAgYnJlYWs7CiAgICB9CiAgICByZXR1cm4gU05NUF9FUlJfTk9FUlJPUjsKfQoKCgoKCmludAp3cml0ZV90cmFjZVJvdXRlQ3RsRG9udEZyYWdtZW50KGludCBhY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogdmFyX3ZhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgdmFyX3ZhbF90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB2YXJfdmFsX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiBzdGF0UCwgb2lkICogbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbmFtZV9sZW4pCnsKICAgIHN0YXRpYyBzaXplX3QgICB0bXB2YXI7CiAgICBzdHJ1Y3QgdHJhY2VSb3V0ZUN0bFRhYmxlX2RhdGEgKlN0b3JhZ2VUbXAgPSBOVUxMOwogICAgc2l6ZV90ICAgICAgICAgIG5ld2xlbiA9CiAgICAgICAgbmFtZV9sZW4gLQogICAgICAgIChzaXplb2YodHJhY2VSb3V0ZUN0bFRhYmxlX3ZhcmlhYmxlc19vaWQpIC8gc2l6ZW9mKG9pZCkgKyAzIC0gMSk7CgogICAgaWYgKChTdG9yYWdlVG1wID0KICAgICAgICAgaGVhZGVyX2NvbXBsZXgodHJhY2VSb3V0ZUN0bFRhYmxlU3RvcmFnZSwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgJm5hbWVbc2l6ZW9mKHRyYWNlUm91dGVDdGxUYWJsZV92YXJpYWJsZXNfb2lkKSAvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihvaWQpICsgMyAtIDFdLCAmbmV3bGVuLCAxLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkgPT0gTlVMTCkKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9TVUNITkFNRTsgICAgIC8qIHJlbW92ZSBpZiB5b3Ugc3VwcG9ydCBjcmVhdGlvbiBoZXJlICovCgogICAgaWYgKFN0b3JhZ2VUbXAgJiYgU3RvcmFnZVRtcC0+c3RvcmFnZVR5cGUgPT0gU1RfUkVBRE9OTFkpIHsKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9UV1JJVEFCTEU7CiAgICB9CgogICAgaWYgKFN0b3JhZ2VUbXAgJiYgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFJvd1N0YXR1cyA9PSBSU19BQ1RJVkUpIHsKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9UV1JJVEFCTEU7CiAgICB9CiAgICBzd2l0Y2ggKGFjdGlvbikgewogICAgY2FzZSBSRVNFUlZFMToKICAgICAgICBpZiAodmFyX3ZhbF90eXBlICE9IEFTTl9JTlRFR0VSKSB7CiAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsCiAgICAgICAgICAgICAgICAgICAgICJ3cml0ZSB0byB0cmFjZVJvdXRlQ3RsTWF4Um93cyBub3QgQVNOX0lOVEVHRVJcbiIpOwogICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfV1JPTkdUWVBFOwogICAgICAgIH0KICAgICAgICBicmVhazsKCgogICAgY2FzZSBSRVNFUlZFMjoKICAgICAgICAvKgogICAgICAgICAqIG1lbW9yeSByZXNldmVyYXRpb24sIGZpbmFsIHByZXBhcmF0aW9uLi4uIAogICAgICAgICAqLwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIEZSRUU6CiAgICAgICAgLyoKICAgICAgICAgKiBSZWxlYXNlIGFueSByZXNvdXJjZXMgdGhhdCBoYXZlIGJlZW4gYWxsb2NhdGVkIAogICAgICAgICAqLwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIEFDVElPTjoKICAgICAgICAvKgogICAgICAgICAqIFRoZSB2YXJpYWJsZSBoYXMgYmVlbiBzdG9yZWQgaW4gb2JqaWQgZm9yCiAgICAgICAgICogeW91IHRvIHVzZSwgYW5kIHlvdSBoYXZlIGp1c3QgYmVlbiBhc2tlZCB0byBkbyBzb21ldGhpbmcgd2l0aAogICAgICAgICAqIGl0LiAgTm90ZSB0aGF0IGFueXRoaW5nIGRvbmUgaGVyZSBtdXN0IGJlIHJldmVyc2FibGUgaW4gdGhlIFVORE8gY2FzZSAKICAgICAgICAgKi8KICAgICAgICB0bXB2YXIgPSBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsRG9udEZyYWdtZW50OwogICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxEb250RnJhZ21lbnQgPSAqKChsb25nICopIHZhcl92YWwpOwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIFVORE86CiAgICAgICAgLyoKICAgICAgICAgKiBCYWNrIG91dCBhbnkgY2hhbmdlcyBtYWRlIGluIHRoZSBBQ1RJT04gY2FzZSAKICAgICAgICAgKi8KICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsRG9udEZyYWdtZW50ID0gdG1wdmFyOwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIENPTU1JVDoKICAgICAgICAvKgogICAgICAgICAqIFRoaW5ncyBhcmUgd29ya2luZyB3ZWxsLCBzbyBpdCdzIG5vdyBzYWZlIHRvIG1ha2UgdGhlIGNoYW5nZQogICAgICAgICAqIHBlcm1hbmVudGx5LiAgTWFrZSBzdXJlIHRoYXQgYW55dGhpbmcgZG9uZSBoZXJlIGNhbid0IGZhaWwhIAogICAgICAgICAqLwogICAgICAgIHNubXBfc3RvcmVfbmVlZGVkKE5VTEwpOwogICAgICAgIGJyZWFrOwogICAgfQogICAgcmV0dXJuIFNOTVBfRVJSX05PRVJST1I7Cn0KCgoKCmludAp3cml0ZV90cmFjZVJvdXRlQ3RsSW5pdGlhbFR0bChpbnQgYWN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiB2YXJfdmFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgdmFyX3ZhbF90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgdmFyX3ZhbF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHN0YXRQLCBvaWQgKiBuYW1lLCBzaXplX3QgbmFtZV9sZW4pCnsKICAgIHN0YXRpYyBzaXplX3QgICB0bXB2YXI7CiAgICBzdHJ1Y3QgdHJhY2VSb3V0ZUN0bFRhYmxlX2RhdGEgKlN0b3JhZ2VUbXAgPSBOVUxMOwogICAgc2l6ZV90ICAgICAgICAgIG5ld2xlbiA9CiAgICAgICAgbmFtZV9sZW4gLQogICAgICAgIChzaXplb2YodHJhY2VSb3V0ZUN0bFRhYmxlX3ZhcmlhYmxlc19vaWQpIC8gc2l6ZW9mKG9pZCkgKyAzIC0gMSk7CgogICAgaWYgKChTdG9yYWdlVG1wID0KICAgICAgICAgaGVhZGVyX2NvbXBsZXgodHJhY2VSb3V0ZUN0bFRhYmxlU3RvcmFnZSwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgJm5hbWVbc2l6ZW9mKHRyYWNlUm91dGVDdGxUYWJsZV92YXJpYWJsZXNfb2lkKSAvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihvaWQpICsgMyAtIDFdLCAmbmV3bGVuLCAxLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkgPT0gTlVMTCkKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9TVUNITkFNRTsgICAgIC8qIHJlbW92ZSBpZiB5b3Ugc3VwcG9ydCBjcmVhdGlvbiBoZXJlICovCgogICAgaWYgKFN0b3JhZ2VUbXAgJiYgU3RvcmFnZVRtcC0+c3RvcmFnZVR5cGUgPT0gU1RfUkVBRE9OTFkpIHsKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9UV1JJVEFCTEU7CiAgICB9CgogICAgaWYgKFN0b3JhZ2VUbXAgJiYgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFJvd1N0YXR1cyA9PSBSU19BQ1RJVkUpIHsKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9UV1JJVEFCTEU7CiAgICB9CiAgICBzd2l0Y2ggKGFjdGlvbikgewogICAgY2FzZSBSRVNFUlZFMToKICAgICAgICBpZiAodmFyX3ZhbF90eXBlICE9IEFTTl9VTlNJR05FRCkgewogICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLAogICAgICAgICAgICAgICAgICAgICAid3JpdGUgdG8gdHJhY2VSb3V0ZUN0bFRyYXBUZXN0RmFpbHVyZUZpbHRlciBub3QgQVNOX1VOU0lHTkVEXG4iKTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX1dST05HVFlQRTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgUkVTRVJWRTI6CiAgICAgICAgLyoKICAgICAgICAgKiBtZW1vcnkgcmVzZXZlcmF0aW9uLCBmaW5hbCBwcmVwYXJhdGlvbi4uLiAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBGUkVFOgogICAgICAgIC8qCiAgICAgICAgICogUmVsZWFzZSBhbnkgcmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIGFsbG9jYXRlZCAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBBQ1RJT046CiAgICAgICAgLyoKICAgICAgICAgKiBUaGUgdmFyaWFibGUgaGFzIGJlZW4gc3RvcmVkIGluIG9iamlkIGZvcgogICAgICAgICAqIHlvdSB0byB1c2UsIGFuZCB5b3UgaGF2ZSBqdXN0IGJlZW4gYXNrZWQgdG8gZG8gc29tZXRoaW5nIHdpdGgKICAgICAgICAgKiBpdC4gIE5vdGUgdGhhdCBhbnl0aGluZyBkb25lIGhlcmUgbXVzdCBiZSByZXZlcnNhYmxlIGluIHRoZSBVTkRPIGNhc2UgCiAgICAgICAgICovCiAgICAgICAgdG1wdmFyID0gU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bEluaXRpYWxUdGw7CiAgICAgICAgaWYgKCgqKChsb25nICopIHZhcl92YWwpKSA+PSAwICYmICgqKChsb25nICopIHZhcl92YWwpKSA8PSAyNTUpCiAgICAgICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxJbml0aWFsVHRsID0gKigobG9uZyAqKSB2YXJfdmFsKTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxJbml0aWFsVHRsID0gMTsKICAgICAgICBicmVhazsKCgogICAgY2FzZSBVTkRPOgogICAgICAgIC8qCiAgICAgICAgICogQmFjayBvdXQgYW55IGNoYW5nZXMgbWFkZSBpbiB0aGUgQUNUSU9OIGNhc2UgCiAgICAgICAgICovCiAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bEluaXRpYWxUdGwgPSB0bXB2YXI7CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgQ09NTUlUOgogICAgICAgIC8qCiAgICAgICAgICogVGhpbmdzIGFyZSB3b3JraW5nIHdlbGwsIHNvIGl0J3Mgbm93IHNhZmUgdG8gbWFrZSB0aGUgY2hhbmdlCiAgICAgICAgICogcGVybWFuZW50bHkuICBNYWtlIHN1cmUgdGhhdCBhbnl0aGluZyBkb25lIGhlcmUgY2FuJ3QgZmFpbCEgCiAgICAgICAgICovCiAgICAgICAgc25tcF9zdG9yZV9uZWVkZWQoTlVMTCk7CiAgICAgICAgYnJlYWs7CiAgICB9CiAgICByZXR1cm4gU05NUF9FUlJfTk9FUlJPUjsKfQoKCmludAp3cml0ZV90cmFjZVJvdXRlQ3RsRnJlcXVlbmN5KGludCBhY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogdmFyX3ZhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgdmFyX3ZhbF90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB2YXJfdmFsX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiBzdGF0UCwgb2lkICogbmFtZSwgc2l6ZV90IG5hbWVfbGVuKQp7CiAgICBzdGF0aWMgc2l6ZV90ICAgdG1wdmFyOwogICAgc3RydWN0IHRyYWNlUm91dGVDdGxUYWJsZV9kYXRhICpTdG9yYWdlVG1wID0gTlVMTDsKICAgIHNpemVfdCAgICAgICAgICBuZXdsZW4gPQogICAgICAgIG5hbWVfbGVuIC0KICAgICAgICAoc2l6ZW9mKHRyYWNlUm91dGVDdGxUYWJsZV92YXJpYWJsZXNfb2lkKSAvIHNpemVvZihvaWQpICsgMyAtIDEpOwoKICAgIGlmICgoU3RvcmFnZVRtcCA9CiAgICAgICAgIGhlYWRlcl9jb21wbGV4KHRyYWNlUm91dGVDdGxUYWJsZVN0b3JhZ2UsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICZuYW1lW3NpemVvZih0cmFjZVJvdXRlQ3RsVGFibGVfdmFyaWFibGVzX29pZCkgLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yob2lkKSArIDMgLSAxXSwgJm5ld2xlbiwgMSwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpID09IE5VTEwpCiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PU1VDSE5BTUU7ICAgICAvKiByZW1vdmUgaWYgeW91IHN1cHBvcnQgY3JlYXRpb24gaGVyZSAqLwoKICAgIGlmIChTdG9yYWdlVG1wICYmIFN0b3JhZ2VUbXAtPnN0b3JhZ2VUeXBlID09IFNUX1JFQURPTkxZKSB7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PVFdSSVRBQkxFOwogICAgfQoKICAgIGlmIChTdG9yYWdlVG1wICYmIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxSb3dTdGF0dXMgPT0gUlNfQUNUSVZFKSB7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PVFdSSVRBQkxFOwogICAgfQogICAgc3dpdGNoIChhY3Rpb24pIHsKICAgIGNhc2UgUkVTRVJWRTE6CiAgICAgICAgaWYgKHZhcl92YWxfdHlwZSAhPSBBU05fVU5TSUdORUQpIHsKICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwKICAgICAgICAgICAgICAgICAgICAgIndyaXRlIHRvIHRyYWNlUm91dGVDdGxTb3VyY2VBZGRyZXNzVHlwZSBub3QgQVNOX1VOU0lHTkVEXG4iKTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX1dST05HVFlQRTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgUkVTRVJWRTI6CiAgICAgICAgLyoKICAgICAgICAgKiBtZW1vcnkgcmVzZXZlcmF0aW9uLCBmaW5hbCBwcmVwYXJhdGlvbi4uLiAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBGUkVFOgogICAgICAgIC8qCiAgICAgICAgICogUmVsZWFzZSBhbnkgcmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIGFsbG9jYXRlZCAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBBQ1RJT046CiAgICAgICAgLyoKICAgICAgICAgKiBUaGUgdmFyaWFibGUgaGFzIGJlZW4gc3RvcmVkIGluIG9iamlkIGZvcgogICAgICAgICAqIHlvdSB0byB1c2UsIGFuZCB5b3UgaGF2ZSBqdXN0IGJlZW4gYXNrZWQgdG8gZG8gc29tZXRoaW5nIHdpdGgKICAgICAgICAgKiBpdC4gIE5vdGUgdGhhdCBhbnl0aGluZyBkb25lIGhlcmUgbXVzdCBiZSByZXZlcnNhYmxlIGluIHRoZSBVTkRPIGNhc2UgCiAgICAgICAgICovCiAgICAgICAgdG1wdmFyID0gU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bEZyZXF1ZW5jeTsKICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsRnJlcXVlbmN5ID0gKigobG9uZyAqKSB2YXJfdmFsKTsKICAgICAgICBicmVhazsKCgogICAgY2FzZSBVTkRPOgogICAgICAgIC8qCiAgICAgICAgICogQmFjayBvdXQgYW55IGNoYW5nZXMgbWFkZSBpbiB0aGUgQUNUSU9OIGNhc2UgCiAgICAgICAgICovCiAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bEZyZXF1ZW5jeSA9IHRtcHZhcjsKICAgICAgICBicmVhazsKCgogICAgY2FzZSBDT01NSVQ6CiAgICAgICAgLyoKICAgICAgICAgKiBUaGluZ3MgYXJlIHdvcmtpbmcgd2VsbCwgc28gaXQncyBub3cgc2FmZSB0byBtYWtlIHRoZSBjaGFuZ2UKICAgICAgICAgKiBwZXJtYW5lbnRseS4gIE1ha2Ugc3VyZSB0aGF0IGFueXRoaW5nIGRvbmUgaGVyZSBjYW4ndCBmYWlsISAKICAgICAgICAgKi8KICAgICAgICBzbm1wX3N0b3JlX25lZWRlZChOVUxMKTsKICAgICAgICBicmVhazsKICAgIH0KICAgIHJldHVybiBTTk1QX0VSUl9OT0VSUk9SOwp9CgoKCgppbnQKd3JpdGVfdHJhY2VSb3V0ZUN0bFN0b3JhZ2VUeXBlKGludCBhY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiB2YXJfdmFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyIHZhcl92YWxfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB2YXJfdmFsX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHN0YXRQLCBvaWQgKiBuYW1lLCBzaXplX3QgbmFtZV9sZW4pCnsKICAgIHN0YXRpYyBzaXplX3QgICB0bXB2YXI7CiAgICBpbnQgICAgICAgICAgICAgc2V0X3ZhbHVlOwogICAgc3RydWN0IHRyYWNlUm91dGVDdGxUYWJsZV9kYXRhICpTdG9yYWdlVG1wID0gTlVMTDsKICAgIHNpemVfdCAgICAgICAgICBuZXdsZW4gPQogICAgICAgIG5hbWVfbGVuIC0KICAgICAgICAoc2l6ZW9mKHRyYWNlUm91dGVDdGxUYWJsZV92YXJpYWJsZXNfb2lkKSAvIHNpemVvZihvaWQpICsgMyAtIDEpOwoKICAgIGlmICgoU3RvcmFnZVRtcCA9CiAgICAgICAgIGhlYWRlcl9jb21wbGV4KHRyYWNlUm91dGVDdGxUYWJsZVN0b3JhZ2UsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICZuYW1lW3NpemVvZih0cmFjZVJvdXRlQ3RsVGFibGVfdmFyaWFibGVzX29pZCkgLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yob2lkKSArIDMgLSAxXSwgJm5ld2xlbiwgMSwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpID09IE5VTEwpCiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PU1VDSE5BTUU7ICAgICAvKiByZW1vdmUgaWYgeW91IHN1cHBvcnQgY3JlYXRpb24gaGVyZSAqLwoKICAgIGlmIChTdG9yYWdlVG1wICYmIFN0b3JhZ2VUbXAtPnN0b3JhZ2VUeXBlID09IFNUX1JFQURPTkxZKSB7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PVFdSSVRBQkxFOwogICAgfQoKICAgIGlmIChTdG9yYWdlVG1wICYmIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxSb3dTdGF0dXMgPT0gUlNfQUNUSVZFKSB7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PVFdSSVRBQkxFOwogICAgfQoKCiAgICBzZXRfdmFsdWUgPSAqKChsb25nICopIHZhcl92YWwpOwoKICAgIHN3aXRjaCAoYWN0aW9uKSB7CiAgICBjYXNlIFJFU0VSVkUxOgogICAgICAgIGlmICh2YXJfdmFsX3R5cGUgIT0gQVNOX0lOVEVHRVIpIHsKICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwKICAgICAgICAgICAgICAgICAgICAgIndyaXRlIHRvIHRyYWNlUm91dGVDdGxNYXhSb3dzIG5vdCBBU05fSU5URUdFUlxuIik7CiAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9XUk9OR1RZUEU7CiAgICAgICAgfQoKICAgICAgICBpZiAoKFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxTdG9yYWdlVHlwZSA9PSAyCiAgICAgICAgICAgICB8fCBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsU3RvcmFnZVR5cGUgPT0gMykKICAgICAgICAgICAgJiYgKHNldF92YWx1ZSA9PSA0IHx8IHNldF92YWx1ZSA9PSA1KSkgewogICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfV1JPTkdWQUxVRTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBSRVNFUlZFMjoKICAgICAgICAvKgogICAgICAgICAqIG1lbW9yeSByZXNldmVyYXRpb24sIGZpbmFsIHByZXBhcmF0aW9uLi4uIAogICAgICAgICAqLwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIEZSRUU6CiAgICAgICAgLyoKICAgICAgICAgKiBSZWxlYXNlIGFueSByZXNvdXJjZXMgdGhhdCBoYXZlIGJlZW4gYWxsb2NhdGVkIAogICAgICAgICAqLwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIEFDVElPTjoKICAgICAgICAvKgogICAgICAgICAqIFRoZSB2YXJpYWJsZSBoYXMgYmVlbiBzdG9yZWQgaW4gb2JqaWQgZm9yCiAgICAgICAgICogeW91IHRvIHVzZSwgYW5kIHlvdSBoYXZlIGp1c3QgYmVlbiBhc2tlZCB0byBkbyBzb21ldGhpbmcgd2l0aAogICAgICAgICAqIGl0LiAgTm90ZSB0aGF0IGFueXRoaW5nIGRvbmUgaGVyZSBtdXN0IGJlIHJldmVyc2FibGUgaW4gdGhlIFVORE8gY2FzZSAKICAgICAgICAgKi8KICAgICAgICB0bXB2YXIgPSBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsU3RvcmFnZVR5cGU7CiAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFN0b3JhZ2VUeXBlID0gKigobG9uZyAqKSB2YXJfdmFsKTsKICAgICAgICBicmVhazsKCgogICAgY2FzZSBVTkRPOgogICAgICAgIC8qCiAgICAgICAgICogQmFjayBvdXQgYW55IGNoYW5nZXMgbWFkZSBpbiB0aGUgQUNUSU9OIGNhc2UgCiAgICAgICAgICovCiAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFN0b3JhZ2VUeXBlID0gdG1wdmFyOwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIENPTU1JVDoKICAgICAgICAvKgogICAgICAgICAqIFRoaW5ncyBhcmUgd29ya2luZyB3ZWxsLCBzbyBpdCdzIG5vdyBzYWZlIHRvIG1ha2UgdGhlIGNoYW5nZQogICAgICAgICAqIHBlcm1hbmVudGx5LiAgTWFrZSBzdXJlIHRoYXQgYW55dGhpbmcgZG9uZSBoZXJlIGNhbid0IGZhaWwhIAogICAgICAgICAqLwogICAgICAgIHNubXBfc3RvcmVfbmVlZGVkKE5VTEwpOwogICAgICAgIGJyZWFrOwogICAgfQogICAgcmV0dXJuIFNOTVBfRVJSX05PRVJST1I7Cn0KCgoKaW50CndyaXRlX3RyYWNlUm91dGVDdGxBZG1pblN0YXR1cyhpbnQgYWN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogdmFyX3ZhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciB2YXJfdmFsX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgdmFyX3ZhbF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiBzdGF0UCwgb2lkICogbmFtZSwgc2l6ZV90IG5hbWVfbGVuKQp7CiAgICBzdGF0aWMgc2l6ZV90ICAgdG1wdmFyOwogICAgc3RydWN0IHRyYWNlUm91dGVDdGxUYWJsZV9kYXRhICpTdG9yYWdlVG1wID0gTlVMTDsKICAgIG5ldHNubXBfdmFyaWFibGVfbGlzdCAqdmFycyA9IE5VTEw7CiAgICBzdHJ1Y3QgdHJhY2VSb3V0ZVJlc3VsdHNUYWJsZV9kYXRhICpTdG9yYWdlTmV3ID0gTlVMTDsKICAgIHNpemVfdCAgICAgICAgICBuZXdsZW4gPQogICAgICAgIG5hbWVfbGVuIC0KICAgICAgICAoc2l6ZW9mKHRyYWNlUm91dGVDdGxUYWJsZV92YXJpYWJsZXNfb2lkKSAvIHNpemVvZihvaWQpICsgMyAtIDEpOwoKICAgIGlmICgoU3RvcmFnZVRtcCA9CiAgICAgICAgIGhlYWRlcl9jb21wbGV4KHRyYWNlUm91dGVDdGxUYWJsZVN0b3JhZ2UsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICZuYW1lW3NpemVvZih0cmFjZVJvdXRlQ3RsVGFibGVfdmFyaWFibGVzX29pZCkgLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yob2lkKSArIDMgLSAxXSwgJm5ld2xlbiwgMSwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpID09IE5VTEwpCiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PU1VDSE5BTUU7ICAgICAvKiByZW1vdmUgaWYgeW91IHN1cHBvcnQgY3JlYXRpb24gaGVyZSAqLwoKICAgIGlmIChTdG9yYWdlVG1wICYmIFN0b3JhZ2VUbXAtPnN0b3JhZ2VUeXBlID09IFNUX1JFQURPTkxZKSB7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PVFdSSVRBQkxFOwogICAgfQoKICAgIHN3aXRjaCAoYWN0aW9uKSB7CiAgICBjYXNlIFJFU0VSVkUxOgogICAgICAgIGlmICh2YXJfdmFsX3R5cGUgIT0gQVNOX0lOVEVHRVIpIHsKICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwKICAgICAgICAgICAgICAgICAgICAgIndyaXRlIHRvIHRyYWNlUm91dGVDdGxJZkluZGV4IG5vdCBBU05fSU5URUdFUlxuIik7CiAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9XUk9OR1RZUEU7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIFJFU0VSVkUyOgogICAgICAgIC8qCiAgICAgICAgICogbWVtb3J5IHJlc2V2ZXJhdGlvbiwgZmluYWwgcHJlcGFyYXRpb24uLi4gCiAgICAgICAgICovCiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgRlJFRToKICAgICAgICAvKgogICAgICAgICAqIFJlbGVhc2UgYW55IHJlc291cmNlcyB0aGF0IGhhdmUgYmVlbiBhbGxvY2F0ZWQgCiAgICAgICAgICovCiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgQUNUSU9OOgogICAgICAgIC8qCiAgICAgICAgICogVGhlIHZhcmlhYmxlIGhhcyBiZWVuIHN0b3JlZCBpbiBvYmppZCBmb3IKICAgICAgICAgKiB5b3UgdG8gdXNlLCBhbmQgeW91IGhhdmUganVzdCBiZWVuIGFza2VkIHRvIGRvIHNvbWV0aGluZyB3aXRoCiAgICAgICAgICogaXQuICBOb3RlIHRoYXQgYW55dGhpbmcgZG9uZSBoZXJlIG11c3QgYmUgcmV2ZXJzYWJsZSBpbiB0aGUgVU5ETyBjYXNlIAogICAgICAgICAqLwogICAgICAgIHRtcHZhciA9IFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxBZG1pblN0YXR1czsKICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsQWRtaW5TdGF0dXMgPSAqKChsb25nICopIHZhcl92YWwpOwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIFVORE86CiAgICAgICAgLyoKICAgICAgICAgKiBCYWNrIG91dCBhbnkgY2hhbmdlcyBtYWRlIGluIHRoZSBBQ1RJT04gY2FzZSAKICAgICAgICAgKi8KICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsQWRtaW5TdGF0dXMgPSB0bXB2YXI7CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgQ09NTUlUOgogICAgICAgIC8qCiAgICAgICAgICogVGhpbmdzIGFyZSB3b3JraW5nIHdlbGwsIHNvIGl0J3Mgbm93IHNhZmUgdG8gbWFrZSB0aGUgY2hhbmdlCiAgICAgICAgICogcGVybWFuZW50bHkuICBNYWtlIHN1cmUgdGhhdCBhbnl0aGluZyBkb25lIGhlcmUgY2FuJ3QgZmFpbCEgCiAgICAgICAgICovCgogICAgICAgIHNubXBfdmFybGlzdF9hZGRfdmFyaWFibGUoJnZhcnMsIE5VTEwsIDAsIEFTTl9PQ1RFVF9TVFIsIChjaGFyICopIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxPd25lckluZGV4LCBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleExlbik7IC8qICB0cmFjZVJvdXRlQ3RsT3duZXJJbmRleCAgKi8KICAgICAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzLCBOVUxMLCAwLCBBU05fT0NURVRfU1RSLCAoY2hhciAqKSBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWUsIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUZXN0TmFtZUxlbik7ICAgICAvKiAgdHJhY2VSb3V0ZUN0bFRlc3ROYW1lICAqLwogICAgICAgIFN0b3JhZ2VOZXcgPQogICAgICAgICAgICBoZWFkZXJfY29tcGxleF9nZXQodHJhY2VSb3V0ZVJlc3VsdHNUYWJsZVN0b3JhZ2UsIHZhcnMpOwoKICAgICAgICBpZiAoU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bEFkbWluU3RhdHVzID09IDEKICAgICAgICAgICAgJiYgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFJvd1N0YXR1cyA9PSBSU19BQ1RJVkUpIHsKICAgICAgICAgICAgaWYgKFN0b3JhZ2VOZXcgPT0gTlVMTCkKICAgICAgICAgICAgICAgIGluaXRfdHJSZXN1bHRzVGFibGUoU3RvcmFnZVRtcCk7CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZVJlc3VsdHMtPgogICAgICAgICAgICAgICAgICAgIHRyYWNlUm91dGVSZXN1bHRzT3BlclN0YXR1cyA9IDE7CiAgICAgICAgICAgICAgICBtb2RpZnlfdHJSZXN1bHRzT3BlcihTdG9yYWdlVG1wLCAxKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bEZyZXF1ZW5jeSAhPSAwKQogICAgICAgICAgICAgICAgU3RvcmFnZVRtcC0+dGltZXJfaWQgPQogICAgICAgICAgICAgICAgICAgIHNubXBfYWxhcm1fcmVnaXN0ZXIoU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bEZyZXF1ZW5jeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNBX1JFUEVBVCwgcnVuX3RyYWNlUm91dGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdG9yYWdlVG1wKTsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgU3RvcmFnZVRtcC0+dGltZXJfaWQgPSBzbm1wX2FsYXJtX3JlZ2lzdGVyKDEsIDAsIHJ1bl90cmFjZVJvdXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0b3JhZ2VUbXApOwoKICAgICAgICB9IGVsc2UgaWYgKFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxBZG1pblN0YXR1cyA9PSAyCiAgICAgICAgICAgICAgICAgICAmJiBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsUm93U3RhdHVzID09IFJTX0FDVElWRSkgewogICAgICAgICAgICBzbm1wX2FsYXJtX3VucmVnaXN0ZXIoU3RvcmFnZVRtcC0+dGltZXJfaWQpOwogICAgICAgICAgICBpZiAoU3RvcmFnZU5ldyA9PSBOVUxMKQogICAgICAgICAgICAgICAgaW5pdF90clJlc3VsdHNUYWJsZShTdG9yYWdlVG1wKTsKICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlUmVzdWx0cy0+CiAgICAgICAgICAgICAgICAgICAgdHJhY2VSb3V0ZVJlc3VsdHNPcGVyU3RhdHVzID0gMjsKICAgICAgICAgICAgICAgIG1vZGlmeV90clJlc3VsdHNPcGVyKFN0b3JhZ2VUbXAsIDIpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHNubXBfc3RvcmVfbmVlZGVkKE5VTEwpOwogICAgICAgIGJyZWFrOwogICAgfQogICAgcmV0dXJuIFNOTVBfRVJSX05PRVJST1I7Cn0KCgoKCmludAp3cml0ZV90cmFjZVJvdXRlQ3RsRGVzY3IoaW50IGFjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHZhcl92YWwsCiAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgdmFyX3ZhbF90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHZhcl92YWxfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogc3RhdFAsIG9pZCAqIG5hbWUsIHNpemVfdCBuYW1lX2xlbikKewogICAgc3RhdGljIGNoYXIgICAgKnRtcHZhcjsKICAgIHN0YXRpYyBzaXplX3QgICB0bXBsZW47CiAgICBzdHJ1Y3QgdHJhY2VSb3V0ZUN0bFRhYmxlX2RhdGEgKlN0b3JhZ2VUbXAgPSBOVUxMOwogICAgc2l6ZV90ICAgICAgICAgIG5ld2xlbiA9CiAgICAgICAgbmFtZV9sZW4gLQogICAgICAgIChzaXplb2YodHJhY2VSb3V0ZUN0bFRhYmxlX3ZhcmlhYmxlc19vaWQpIC8gc2l6ZW9mKG9pZCkgKyAzIC0gMSk7CgoKICAgIGlmICgoU3RvcmFnZVRtcCA9CiAgICAgICAgIGhlYWRlcl9jb21wbGV4KHRyYWNlUm91dGVDdGxUYWJsZVN0b3JhZ2UsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICZuYW1lW3NpemVvZih0cmFjZVJvdXRlQ3RsVGFibGVfdmFyaWFibGVzX29pZCkgLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yob2lkKSArIDMgLSAxXSwgJm5ld2xlbiwgMSwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpID09IE5VTEwpCiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PU1VDSE5BTUU7ICAgICAvKiByZW1vdmUgaWYgeW91IHN1cHBvcnQgY3JlYXRpb24gaGVyZSAqLwoKICAgIGlmIChTdG9yYWdlVG1wICYmIFN0b3JhZ2VUbXAtPnN0b3JhZ2VUeXBlID09IFNUX1JFQURPTkxZKSB7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PVFdSSVRBQkxFOwogICAgfQoKICAgIGlmIChTdG9yYWdlVG1wICYmIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxSb3dTdGF0dXMgPT0gUlNfQUNUSVZFKSB7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PVFdSSVRBQkxFOwogICAgfQoKICAgIHN3aXRjaCAoYWN0aW9uKSB7CiAgICBjYXNlIFJFU0VSVkUxOgogICAgICAgIGlmICh2YXJfdmFsX3R5cGUgIT0gQVNOX09DVEVUX1NUUikgewogICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLAogICAgICAgICAgICAgICAgICAgICAid3JpdGUgdG8gdHJhY2VSb3V0ZUN0bFRhcmdldEFkZHJlc3Mgbm90IEFTTl9PQ1RFVF9TVFJcbiIpOwogICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfV1JPTkdUWVBFOwogICAgICAgIH0KICAgICAgICBicmVhazsKCgogICAgY2FzZSBSRVNFUlZFMjoKICAgICAgICAvKgogICAgICAgICAqIG1lbW9yeSByZXNldmVyYXRpb24sIGZpbmFsIHByZXBhcmF0aW9uLi4uIAogICAgICAgICAqLwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIEZSRUU6CiAgICAgICAgLyoKICAgICAgICAgKiBSZWxlYXNlIGFueSByZXNvdXJjZXMgdGhhdCBoYXZlIGJlZW4gYWxsb2NhdGVkIAogICAgICAgICAqLwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIEFDVElPTjoKICAgICAgICAvKgogICAgICAgICAqIFRoZSB2YXJpYWJsZSBoYXMgYmVlbiBzdG9yZWQgaW4gbG9uZ19yZXQgZm9yCiAgICAgICAgICogeW91IHRvIHVzZSwgYW5kIHlvdSBoYXZlIGp1c3QgYmVlbiBhc2tlZCB0byBkbyBzb21ldGhpbmcgd2l0aAogICAgICAgICAqIGl0LiAgTm90ZSB0aGF0IGFueXRoaW5nIGRvbmUgaGVyZSBtdXN0IGJlIHJldmVyc2FibGUgaW4gdGhlIFVORE8gY2FzZSAKICAgICAgICAgKi8KICAgICAgICB0bXB2YXIgPSBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsRGVzY3I7CiAgICAgICAgdG1wbGVuID0gU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bERlc2NyTGVuOwoKICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsRGVzY3IgPSAoY2hhciAqKSBtYWxsb2ModmFyX3ZhbF9sZW4gKyAxKTsKICAgICAgICBpZiAoU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bERlc2NyID09IE5VTEwpIHsKICAgICAgICAgICAgZXhpdCgxKTsKICAgICAgICB9CiAgICAgICAgbWVtY3B5KFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxEZXNjciwgdmFyX3ZhbCwgdmFyX3ZhbF9sZW4gKyAxKTsKICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsRGVzY3JbdmFyX3ZhbF9sZW5dID0gJ1wwJzsKICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsRGVzY3JMZW4gPSB2YXJfdmFsX2xlbjsKCiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgVU5ETzoKICAgICAgICAvKgogICAgICAgICAqIEJhY2sgb3V0IGFueSBjaGFuZ2VzIG1hZGUgaW4gdGhlIEFDVElPTiBjYXNlIAogICAgICAgICAqLwogICAgICAgIFNOTVBfRlJFRShTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsRGVzY3IpOwogICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxEZXNjciA9IE5VTEw7CiAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bERlc2NyID0gdG1wdmFyOwogICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxEZXNjckxlbiA9IHRtcGxlbjsKICAgICAgICBicmVhazsKCgogICAgY2FzZSBDT01NSVQ6CiAgICAgICAgLyoKICAgICAgICAgKiBUaGluZ3MgYXJlIHdvcmtpbmcgd2VsbCwgc28gaXQncyBub3cgc2FmZSB0byBtYWtlIHRoZSBjaGFuZ2UKICAgICAgICAgKiBwZXJtYW5lbnRseS4gIE1ha2Ugc3VyZSB0aGF0IGFueXRoaW5nIGRvbmUgaGVyZSBjYW4ndCBmYWlsISAKICAgICAgICAgKi8KICAgICAgICBTTk1QX0ZSRUUodG1wdmFyKTsKICAgICAgICBzbm1wX3N0b3JlX25lZWRlZChOVUxMKTsKICAgICAgICBicmVhazsKICAgIH0KICAgIHJldHVybiBTTk1QX0VSUl9OT0VSUk9SOwp9CgoKCgoKaW50CndyaXRlX3RyYWNlUm91dGVDdGxNYXhSb3dzKGludCBhY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHZhcl92YWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciB2YXJfdmFsX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB2YXJfdmFsX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogc3RhdFAsIG9pZCAqIG5hbWUsIHNpemVfdCBuYW1lX2xlbikKewogICAgc3RhdGljIHNpemVfdCAgIHRtcHZhcjsKICAgIHN0cnVjdCB0cmFjZVJvdXRlQ3RsVGFibGVfZGF0YSAqU3RvcmFnZVRtcCA9IE5VTEw7CiAgICBzaXplX3QgICAgICAgICAgbmV3bGVuID0KICAgICAgICBuYW1lX2xlbiAtCiAgICAgICAgKHNpemVvZih0cmFjZVJvdXRlQ3RsVGFibGVfdmFyaWFibGVzX29pZCkgLyBzaXplb2Yob2lkKSArIDMgLSAxKTsKCiAgICBpZiAoKFN0b3JhZ2VUbXAgPQogICAgICAgICBoZWFkZXJfY29tcGxleCh0cmFjZVJvdXRlQ3RsVGFibGVTdG9yYWdlLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAmbmFtZVtzaXplb2YodHJhY2VSb3V0ZUN0bFRhYmxlX3ZhcmlhYmxlc19vaWQpIC8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9pZCkgKyAzIC0gMV0sICZuZXdsZW4sIDEsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKSA9PSBOVUxMKQogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1NVQ0hOQU1FOyAgICAgLyogcmVtb3ZlIGlmIHlvdSBzdXBwb3J0IGNyZWF0aW9uIGhlcmUgKi8KCiAgICBpZiAoU3RvcmFnZVRtcCAmJiBTdG9yYWdlVG1wLT5zdG9yYWdlVHlwZSA9PSBTVF9SRUFET05MWSkgewogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1RXUklUQUJMRTsKICAgIH0KCiAgICBpZiAoU3RvcmFnZVRtcCAmJiBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsUm93U3RhdHVzID09IFJTX0FDVElWRSkgewogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1RXUklUQUJMRTsKICAgIH0KICAgIHN3aXRjaCAoYWN0aW9uKSB7CiAgICBjYXNlIFJFU0VSVkUxOgogICAgICAgIGlmICh2YXJfdmFsX3R5cGUgIT0gQVNOX1VOU0lHTkVEKSB7CiAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsCiAgICAgICAgICAgICAgICAgICAgICJ3cml0ZSB0byB0cmFjZVJvdXRlQ3RsRFNGaWVsZCBub3QgQVNOX1VOU0lHTkVEXG4iKTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX1dST05HVFlQRTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgUkVTRVJWRTI6CiAgICAgICAgLyoKICAgICAgICAgKiBtZW1vcnkgcmVzZXZlcmF0aW9uLCBmaW5hbCBwcmVwYXJhdGlvbi4uLiAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBGUkVFOgogICAgICAgIC8qCiAgICAgICAgICogUmVsZWFzZSBhbnkgcmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIGFsbG9jYXRlZCAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBBQ1RJT046CiAgICAgICAgLyoKICAgICAgICAgKiBUaGUgdmFyaWFibGUgaGFzIGJlZW4gc3RvcmVkIGluIG9iamlkIGZvcgogICAgICAgICAqIHlvdSB0byB1c2UsIGFuZCB5b3UgaGF2ZSBqdXN0IGJlZW4gYXNrZWQgdG8gZG8gc29tZXRoaW5nIHdpdGgKICAgICAgICAgKiBpdC4gIE5vdGUgdGhhdCBhbnl0aGluZyBkb25lIGhlcmUgbXVzdCBiZSByZXZlcnNhYmxlIGluIHRoZSBVTkRPIGNhc2UgCiAgICAgICAgICovCiAgICAgICAgdG1wdmFyID0gU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bE1heFJvd3M7CiAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bE1heFJvd3MgPSAqKChsb25nICopIHZhcl92YWwpOwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIFVORE86CiAgICAgICAgLyoKICAgICAgICAgKiBCYWNrIG91dCBhbnkgY2hhbmdlcyBtYWRlIGluIHRoZSBBQ1RJT04gY2FzZSAKICAgICAgICAgKi8KICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsTWF4Um93cyA9IHRtcHZhcjsKICAgICAgICBicmVhazsKCgogICAgY2FzZSBDT01NSVQ6CiAgICAgICAgLyoKICAgICAgICAgKiBUaGluZ3MgYXJlIHdvcmtpbmcgd2VsbCwgc28gaXQncyBub3cgc2FmZSB0byBtYWtlIHRoZSBjaGFuZ2UKICAgICAgICAgKiBwZXJtYW5lbnRseS4gIE1ha2Ugc3VyZSB0aGF0IGFueXRoaW5nIGRvbmUgaGVyZSBjYW4ndCBmYWlsISAKICAgICAgICAgKi8KICAgICAgICBzbm1wX3N0b3JlX25lZWRlZChOVUxMKTsKICAgICAgICBicmVhazsKICAgIH0KICAgIHJldHVybiBTTk1QX0VSUl9OT0VSUk9SOwp9CgppbnQKd3JpdGVfdHJhY2VSb3V0ZUN0bFRyYXBHZW5lcmF0aW9uKGludCBhY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiB2YXJfdmFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyIHZhcl92YWxfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB2YXJfdmFsX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHN0YXRQLCBvaWQgKiBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG5hbWVfbGVuKQp7CiAgICBzdGF0aWMgY2hhciAgICAqdG1wdmFyOwogICAgc3RhdGljIHNpemVfdCAgIHRtcGxlbjsKICAgIHN0cnVjdCB0cmFjZVJvdXRlQ3RsVGFibGVfZGF0YSAqU3RvcmFnZVRtcCA9IE5VTEw7CiAgICBzaXplX3QgICAgICAgICAgbmV3bGVuID0KICAgICAgICBuYW1lX2xlbiAtCiAgICAgICAgKHNpemVvZih0cmFjZVJvdXRlQ3RsVGFibGVfdmFyaWFibGVzX29pZCkgLyBzaXplb2Yob2lkKSArIDMgLSAxKTsKICAgIGlmICgoU3RvcmFnZVRtcCA9CiAgICAgICAgIGhlYWRlcl9jb21wbGV4KHRyYWNlUm91dGVDdGxUYWJsZVN0b3JhZ2UsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICZuYW1lW3NpemVvZih0cmFjZVJvdXRlQ3RsVGFibGVfdmFyaWFibGVzX29pZCkgLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yob2lkKSArIDMgLSAxXSwgJm5ld2xlbiwgMSwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpID09IE5VTEwpCiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PU1VDSE5BTUU7ICAgICAvKiByZW1vdmUgaWYgeW91IHN1cHBvcnQgY3JlYXRpb24gaGVyZSAqLwoKICAgIGlmIChTdG9yYWdlVG1wICYmIFN0b3JhZ2VUbXAtPnN0b3JhZ2VUeXBlID09IFNUX1JFQURPTkxZKSB7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PVFdSSVRBQkxFOwogICAgfQoKICAgIGlmIChTdG9yYWdlVG1wICYmIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxSb3dTdGF0dXMgPT0gUlNfQUNUSVZFKSB7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PVFdSSVRBQkxFOwogICAgfQoKICAgIHN3aXRjaCAoYWN0aW9uKSB7CiAgICBjYXNlIFJFU0VSVkUxOgogICAgICAgIGlmICh2YXJfdmFsX3R5cGUgIT0gQVNOX09DVEVUX1NUUikgewogICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLAogICAgICAgICAgICAgICAgICAgICAid3JpdGUgdG8gdHJhY2VSb3V0ZUN0bFRhcmdldEFkZHJlc3Mgbm90IEFTTl9PQ1RFVF9TVFJcbiIpOwogICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfV1JPTkdUWVBFOwogICAgICAgIH0KICAgICAgICBicmVhazsKCgogICAgY2FzZSBSRVNFUlZFMjoKICAgICAgICAvKgogICAgICAgICAqIG1lbW9yeSByZXNldmVyYXRpb24sIGZpbmFsIHByZXBhcmF0aW9uLi4uIAogICAgICAgICAqLwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIEZSRUU6CiAgICAgICAgLyoKICAgICAgICAgKiBSZWxlYXNlIGFueSByZXNvdXJjZXMgdGhhdCBoYXZlIGJlZW4gYWxsb2NhdGVkIAogICAgICAgICAqLwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIEFDVElPTjoKICAgICAgICAvKgogICAgICAgICAqIFRoZSB2YXJpYWJsZSBoYXMgYmVlbiBzdG9yZWQgaW4gbG9uZ19yZXQgZm9yCiAgICAgICAgICogeW91IHRvIHVzZSwgYW5kIHlvdSBoYXZlIGp1c3QgYmVlbiBhc2tlZCB0byBkbyBzb21ldGhpbmcgd2l0aAogICAgICAgICAqIGl0LiAgTm90ZSB0aGF0IGFueXRoaW5nIGRvbmUgaGVyZSBtdXN0IGJlIHJldmVyc2FibGUgaW4gdGhlIFVORE8gY2FzZSAKICAgICAgICAgKi8KICAgICAgICB0bXB2YXIgPSBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVHJhcEdlbmVyYXRpb247CiAgICAgICAgdG1wbGVuID0gU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFRyYXBHZW5lcmF0aW9uTGVuOwogICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUcmFwR2VuZXJhdGlvbiA9CiAgICAgICAgICAgIChjaGFyICopIG1hbGxvYyh2YXJfdmFsX2xlbiArIDEpOwogICAgICAgIGlmIChTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVHJhcEdlbmVyYXRpb24gPT0gTlVMTCkgewogICAgICAgICAgICBleGl0KDEpOwogICAgICAgIH0KCiAgICAgICAgbWVtY3B5KFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUcmFwR2VuZXJhdGlvbiwgdmFyX3ZhbCwKICAgICAgICAgICAgICAgdmFyX3ZhbF9sZW4gKyAxKTsKICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVHJhcEdlbmVyYXRpb25bdmFyX3ZhbF9sZW5dID0gJ1wwJzsKICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVHJhcEdlbmVyYXRpb25MZW4gPSB2YXJfdmFsX2xlbjsKCiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgVU5ETzoKICAgICAgICAvKgogICAgICAgICAqIEJhY2sgb3V0IGFueSBjaGFuZ2VzIG1hZGUgaW4gdGhlIEFDVElPTiBjYXNlIAogICAgICAgICAqLwogICAgICAgIFNOTVBfRlJFRShTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVHJhcEdlbmVyYXRpb24pOwogICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUcmFwR2VuZXJhdGlvbiA9IE5VTEw7CiAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFRyYXBHZW5lcmF0aW9uID0gdG1wdmFyOwogICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUcmFwR2VuZXJhdGlvbkxlbiA9IHRtcGxlbjsKICAgICAgICBicmVhazsKCgogICAgY2FzZSBDT01NSVQ6CiAgICAgICAgLyoKICAgICAgICAgKiBUaGluZ3MgYXJlIHdvcmtpbmcgd2VsbCwgc28gaXQncyBub3cgc2FmZSB0byBtYWtlIHRoZSBjaGFuZ2UKICAgICAgICAgKiBwZXJtYW5lbnRseS4gIE1ha2Ugc3VyZSB0aGF0IGFueXRoaW5nIGRvbmUgaGVyZSBjYW4ndCBmYWlsISAKICAgICAgICAgKi8KICAgICAgICBTTk1QX0ZSRUUodG1wdmFyKTsKICAgICAgICBzbm1wX3N0b3JlX25lZWRlZChOVUxMKTsKICAgICAgICBicmVhazsKICAgIH0KICAgIHJldHVybiBTTk1QX0VSUl9OT0VSUk9SOwp9CgppbnQKd3JpdGVfdHJhY2VSb3V0ZUN0bENyZWF0ZUhvcHNFbnRyaWVzKGludCBhY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiB2YXJfdmFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyIHZhcl92YWxfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB2YXJfdmFsX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHN0YXRQLCBvaWQgKiBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG5hbWVfbGVuKQp7CiAgICBzdGF0aWMgc2l6ZV90ICAgdG1wdmFyOwogICAgc3RydWN0IHRyYWNlUm91dGVDdGxUYWJsZV9kYXRhICpTdG9yYWdlVG1wID0gTlVMTDsKICAgIHNpemVfdCAgICAgICAgICBuZXdsZW4gPQogICAgICAgIG5hbWVfbGVuIC0KICAgICAgICAoc2l6ZW9mKHRyYWNlUm91dGVDdGxUYWJsZV92YXJpYWJsZXNfb2lkKSAvIHNpemVvZihvaWQpICsgMyAtIDEpOwoKICAgIGlmICgoU3RvcmFnZVRtcCA9CiAgICAgICAgIGhlYWRlcl9jb21wbGV4KHRyYWNlUm91dGVDdGxUYWJsZVN0b3JhZ2UsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICZuYW1lW3NpemVvZih0cmFjZVJvdXRlQ3RsVGFibGVfdmFyaWFibGVzX29pZCkgLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yob2lkKSArIDMgLSAxXSwgJm5ld2xlbiwgMSwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpID09IE5VTEwpCiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PU1VDSE5BTUU7ICAgICAvKiByZW1vdmUgaWYgeW91IHN1cHBvcnQgY3JlYXRpb24gaGVyZSAqLwoKICAgIGlmIChTdG9yYWdlVG1wICYmIFN0b3JhZ2VUbXAtPnN0b3JhZ2VUeXBlID09IFNUX1JFQURPTkxZKSB7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PVFdSSVRBQkxFOwogICAgfQoKICAgIGlmIChTdG9yYWdlVG1wICYmIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxSb3dTdGF0dXMgPT0gUlNfQUNUSVZFKSB7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PVFdSSVRBQkxFOwogICAgfQogICAgc3dpdGNoIChhY3Rpb24pIHsKICAgIGNhc2UgUkVTRVJWRTE6CiAgICAgICAgaWYgKHZhcl92YWxfdHlwZSAhPSBBU05fSU5URUdFUikgewogICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLAogICAgICAgICAgICAgICAgICAgICAid3JpdGUgdG8gdHJhY2VSb3V0ZUN0bERTRmllbGQgbm90IEFTTl9JTlRFR0VSXG4iKTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX1dST05HVFlQRTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgUkVTRVJWRTI6CiAgICAgICAgLyoKICAgICAgICAgKiBtZW1vcnkgcmVzZXZlcmF0aW9uLCBmaW5hbCBwcmVwYXJhdGlvbi4uLiAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBGUkVFOgogICAgICAgIC8qCiAgICAgICAgICogUmVsZWFzZSBhbnkgcmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIGFsbG9jYXRlZCAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBBQ1RJT046CiAgICAgICAgLyoKICAgICAgICAgKiBUaGUgdmFyaWFibGUgaGFzIGJlZW4gc3RvcmVkIGluIG9iamlkIGZvcgogICAgICAgICAqIHlvdSB0byB1c2UsIGFuZCB5b3UgaGF2ZSBqdXN0IGJlZW4gYXNrZWQgdG8gZG8gc29tZXRoaW5nIHdpdGgKICAgICAgICAgKiBpdC4gIE5vdGUgdGhhdCBhbnl0aGluZyBkb25lIGhlcmUgbXVzdCBiZSByZXZlcnNhYmxlIGluIHRoZSBVTkRPIGNhc2UgCiAgICAgICAgICovCiAgICAgICAgdG1wdmFyID0gU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bENyZWF0ZUhvcHNFbnRyaWVzOwogICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxDcmVhdGVIb3BzRW50cmllcyA9ICooKGxvbmcgKikgdmFyX3ZhbCk7CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgVU5ETzoKICAgICAgICAvKgogICAgICAgICAqIEJhY2sgb3V0IGFueSBjaGFuZ2VzIG1hZGUgaW4gdGhlIEFDVElPTiBjYXNlIAogICAgICAgICAqLwogICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxDcmVhdGVIb3BzRW50cmllcyA9IHRtcHZhcjsKICAgICAgICBicmVhazsKCgogICAgY2FzZSBDT01NSVQ6CiAgICAgICAgLyoKICAgICAgICAgKiBUaGluZ3MgYXJlIHdvcmtpbmcgd2VsbCwgc28gaXQncyBub3cgc2FmZSB0byBtYWtlIHRoZSBjaGFuZ2UKICAgICAgICAgKiBwZXJtYW5lbnRseS4gIE1ha2Ugc3VyZSB0aGF0IGFueXRoaW5nIGRvbmUgaGVyZSBjYW4ndCBmYWlsISAKICAgICAgICAgKi8KICAgICAgICBzbm1wX3N0b3JlX25lZWRlZChOVUxMKTsKICAgICAgICBicmVhazsKICAgIH0KICAgIHJldHVybiBTTk1QX0VSUl9OT0VSUk9SOwp9CgppbnQKd3JpdGVfdHJhY2VSb3V0ZUN0bFR5cGUoaW50IGFjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogdmFyX3ZhbCwKICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyIHZhcl92YWxfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHZhcl92YWxfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiBzdGF0UCwgb2lkICogbmFtZSwgc2l6ZV90IG5hbWVfbGVuKQp7CiAgICBzdGF0aWMgb2lkICAgICAqdG1wdmFyOwogICAgc3RhdGljIHNpemVfdCAgIHRtcGxlbjsKICAgIHN0cnVjdCB0cmFjZVJvdXRlQ3RsVGFibGVfZGF0YSAqU3RvcmFnZVRtcCA9IE5VTEw7CiAgICBzaXplX3QgICAgICAgICAgbmV3bGVuID0KICAgICAgICBuYW1lX2xlbiAtCiAgICAgICAgKHNpemVvZih0cmFjZVJvdXRlQ3RsVGFibGVfdmFyaWFibGVzX29pZCkgLyBzaXplb2Yob2lkKSArIDMgLSAxKTsKCiAgICBpZiAoKFN0b3JhZ2VUbXAgPQogICAgICAgICBoZWFkZXJfY29tcGxleCh0cmFjZVJvdXRlQ3RsVGFibGVTdG9yYWdlLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAmbmFtZVtzaXplb2YodHJhY2VSb3V0ZUN0bFRhYmxlX3ZhcmlhYmxlc19vaWQpIC8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9pZCkgKyAzIC0gMV0sICZuZXdsZW4sIDEsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKSA9PSBOVUxMKQogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1NVQ0hOQU1FOyAgICAgLyogcmVtb3ZlIGlmIHlvdSBzdXBwb3J0IGNyZWF0aW9uIGhlcmUgKi8KCiAgICBpZiAoU3RvcmFnZVRtcCAmJiBTdG9yYWdlVG1wLT5zdG9yYWdlVHlwZSA9PSBTVF9SRUFET05MWSkgewogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1RXUklUQUJMRTsKICAgIH0KCiAgICBpZiAoU3RvcmFnZVRtcCAmJiBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsUm93U3RhdHVzID09IFJTX0FDVElWRSkgewogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1RXUklUQUJMRTsKICAgIH0KCiAgICBzd2l0Y2ggKGFjdGlvbikgewogICAgY2FzZSBSRVNFUlZFMToKICAgICAgICBpZiAodmFyX3ZhbF90eXBlICE9IEFTTl9PQkpFQ1RfSUQpIHsKICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwKICAgICAgICAgICAgICAgICAgICAgIndyaXRlIHRvIHRyYWNlUm91dGVDdGxUeXBlIG5vdCBBU05fT0JKRUNUX0lEXG4iKTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX1dST05HVFlQRTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgUkVTRVJWRTI6CiAgICAgICAgLyoKICAgICAgICAgKiBtZW1vcnkgcmVzZXZlcmF0aW9uLCBmaW5hbCBwcmVwYXJhdGlvbi4uLiAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBGUkVFOgogICAgICAgIC8qCiAgICAgICAgICogUmVsZWFzZSBhbnkgcmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIGFsbG9jYXRlZCAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBBQ1RJT046CiAgICAgICAgLyoKICAgICAgICAgKiBUaGUgdmFyaWFibGUgaGFzIGJlZW4gc3RvcmVkIGluIGxvbmdfcmV0IGZvcgogICAgICAgICAqIHlvdSB0byB1c2UsIGFuZCB5b3UgaGF2ZSBqdXN0IGJlZW4gYXNrZWQgdG8gZG8gc29tZXRoaW5nIHdpdGgKICAgICAgICAgKiBpdC4gIE5vdGUgdGhhdCBhbnl0aGluZyBkb25lIGhlcmUgbXVzdCBiZSByZXZlcnNhYmxlIGluIHRoZSBVTkRPIGNhc2UgCiAgICAgICAgICovCiAgICAgICAgdG1wdmFyID0gU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFR5cGU7CiAgICAgICAgdG1wbGVuID0gU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFR5cGVMZW47CgogICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUeXBlID0gKG9pZCAqKSBtYWxsb2ModmFyX3ZhbF9sZW4pOwogICAgICAgIGlmIChTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVHlwZSA9PSBOVUxMKSB7CiAgICAgICAgICAgIGV4aXQoMSk7CiAgICAgICAgfQogICAgICAgIG1lbWNweShTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVHlwZSwgdmFyX3ZhbCwgdmFyX3ZhbF9sZW4pOwogICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUeXBlTGVuID0gdmFyX3ZhbF9sZW4gLyBzaXplb2Yob2lkKTsKICAgICAgICBicmVhazsKCgogICAgY2FzZSBVTkRPOgogICAgICAgIC8qCiAgICAgICAgICogQmFjayBvdXQgYW55IGNoYW5nZXMgbWFkZSBpbiB0aGUgQUNUSU9OIGNhc2UgCiAgICAgICAgICovCiAgICAgICAgU05NUF9GUkVFKFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUeXBlKTsKICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVHlwZSA9IE5VTEw7CiAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFR5cGUgPSB0bXB2YXI7CiAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFR5cGVMZW4gPSB0bXBsZW47CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgQ09NTUlUOgogICAgICAgIC8qCiAgICAgICAgICogVGhpbmdzIGFyZSB3b3JraW5nIHdlbGwsIHNvIGl0J3Mgbm93IHNhZmUgdG8gbWFrZSB0aGUgY2hhbmdlCiAgICAgICAgICogcGVybWFuZW50bHkuICBNYWtlIHN1cmUgdGhhdCBhbnl0aGluZyBkb25lIGhlcmUgY2FuJ3QgZmFpbCEgCiAgICAgICAgICovCiAgICAgICAgU05NUF9GUkVFKHRtcHZhcik7CiAgICAgICAgc25tcF9zdG9yZV9uZWVkZWQoTlVMTCk7CiAgICAgICAgYnJlYWs7CiAgICB9CiAgICByZXR1cm4gU05NUF9FUlJfTk9FUlJPUjsKfQoKaW50CndyaXRlX3RyYWNlUm91dGVDdGxSb3dTdGF0dXMoaW50IGFjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiB2YXJfdmFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciB2YXJfdmFsX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHZhcl92YWxfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHN0YXRQLCBvaWQgKiBuYW1lLCBzaXplX3QgbmFtZV9sZW4pCnsKICAgIHN0cnVjdCB0cmFjZVJvdXRlQ3RsVGFibGVfZGF0YSAqU3RvcmFnZVRtcCA9IE5VTEw7CiAgICBzdGF0aWMgc3RydWN0IHRyYWNlUm91dGVDdGxUYWJsZV9kYXRhICpTdG9yYWdlTmV3ID0gTlVMTDsKICAgIHN0YXRpYyBzdHJ1Y3QgdHJhY2VSb3V0ZUN0bFRhYmxlX2RhdGEgKlN0b3JhZ2VEZWwgPSBOVUxMOwogICAgc2l6ZV90ICAgICAgICAgIG5ld2xlbiA9CiAgICAgICAgbmFtZV9sZW4gLQogICAgICAgIChzaXplb2YodHJhY2VSb3V0ZUN0bFRhYmxlX3ZhcmlhYmxlc19vaWQpIC8gc2l6ZW9mKG9pZCkgKyAzIC0gMSk7CiAgICBzdGF0aWMgaW50ICAgICAgb2xkX3ZhbHVlOwogICAgaW50ICAgICAgICAgICAgIHNldF92YWx1ZTsKICAgIHN0YXRpYyBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKnZhcnMgPSBOVUxMOwogICAgc3RydWN0IGhlYWRlcl9jb21wbGV4X2luZGV4ICpoY2lwdHIgPSBOVUxMOwoKICAgIFN0b3JhZ2VUbXAgPQogICAgICAgIGhlYWRlcl9jb21wbGV4KHRyYWNlUm91dGVDdGxUYWJsZVN0b3JhZ2UsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgJm5hbWVbc2l6ZW9mKHRyYWNlUm91dGVDdGxUYWJsZV92YXJpYWJsZXNfb2lkKSAvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9pZCkgKyAzIC0gMV0sICZuZXdsZW4sIDEsIE5VTEwsIE5VTEwpOwoKICAgIGlmICh2YXJfdmFsX3R5cGUgIT0gQVNOX0lOVEVHRVIgfHwgdmFyX3ZhbCA9PSBOVUxMKSB7CiAgICAgICAgc25tcF9sb2coTE9HX0VSUiwKICAgICAgICAgICAgICAgICAid3JpdGUgdG8gdHJhY2VSb3V0ZUN0bFJvd1N0YXR1cyBub3QgQVNOX0lOVEVHRVJcbiIpOwogICAgICAgIHJldHVybiBTTk1QX0VSUl9XUk9OR1RZUEU7CiAgICB9CiAgICBpZiAoU3RvcmFnZVRtcCAmJiBTdG9yYWdlVG1wLT5zdG9yYWdlVHlwZSA9PSBTVF9SRUFET05MWSkgewogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1RXUklUQUJMRTsKICAgIH0KCiAgICBzZXRfdmFsdWUgPSAqKChsb25nICopIHZhcl92YWwpOwoKCiAgICAvKgogICAgICogY2hlY2sgbGVnYWwgcmFuZ2UsIGFuZCBub3RSZWFkeSBpcyByZXNlcnZlZCBmb3IgdXMsIG5vdCBhIHVzZXIgCiAgICAgKi8KICAgIGlmIChzZXRfdmFsdWUgPCAxIHx8IHNldF92YWx1ZSA+IDYgfHwgc2V0X3ZhbHVlID09IFJTX05PVFJFQURZKQogICAgICAgIHJldHVybiBTTk1QX0VSUl9JTkNPTlNJU1RFTlRWQUxVRTsKCgogICAgc3dpdGNoIChhY3Rpb24pIHsKICAgIGNhc2UgUkVTRVJWRTE6CiAgICAgICAgLyoKICAgICAgICAgKiBzdGFnZSBvbmU6IHRlc3QgdmFsaWRpdHkgCiAgICAgICAgICovCiAgICAgICAgaWYgKFN0b3JhZ2VUbXAgPT0gTlVMTCkgewogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBjcmVhdGUgdGhlIHJvdyBub3c/IAogICAgICAgICAgICAgKi8KCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIGRpdGNoIGlsbGVnYWwgdmFsdWVzIG5vdyAKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGlmIChzZXRfdmFsdWUgPT0gUlNfQUNUSVZFIHx8IHNldF92YWx1ZSA9PSBSU19OT1RJTlNFUlZJQ0UpIHsKCiAgICAgICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfSU5DT05TSVNURU5UVkFMVUU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIGRlc3Ryb3lpbmcgYSBub24tZXhpc3RlbnQgcm93IGlzIGFjdHVhbGx5IGxlZ2FsIAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgaWYgKHNldF92YWx1ZSA9PSBSU19ERVNUUk9ZKSB7CgogICAgICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PRVJST1I7CiAgICAgICAgICAgIH0KCgogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBpbGxlZ2FsIGNyZWF0aW9uIHZhbHVlcyAKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGlmIChzZXRfdmFsdWUgPT0gUlNfQUNUSVZFIHx8IHNldF92YWx1ZSA9PSBSU19OT1RJTlNFUlZJQ0UpIHsKICAgICAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9JTkNPTlNJU1RFTlRWQUxVRTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIHJvdyBleGlzdHMuICBDaGVjayBmb3IgYSB2YWxpZCBzdGF0ZSBjaGFuZ2UgCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBpZiAoc2V0X3ZhbHVlID09IFJTX0NSRUFURUFOREdPCiAgICAgICAgICAgICAgICB8fCBzZXRfdmFsdWUgPT0gUlNfQ1JFQVRFQU5EV0FJVCkgewogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIGNhbid0IGNyZWF0ZSBhIHJvdyB0aGF0IGV4aXN0cyAKICAgICAgICAgICAgICAgICAqLwoKICAgICAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9JTkNPTlNJU1RFTlRWQUxVRTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogWFhYOiBpbnRlcmFjdGlvbiB3aXRoIHJvdyBzdG9yYWdlIHR5cGUgbmVlZGVkIAogICAgICAgICAgICAgKi8KCiAgICAgICAgICAgIGlmIChTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsUm93U3RhdHVzID09IFJTX0FDVElWRSAmJgogICAgICAgICAgICAgICAgc2V0X3ZhbHVlICE9IFJTX0RFU1RST1kpIHsKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiAiT25jZSBtYWRlIGFjdGl2ZSBhbiBlbnRyeSBtYXkgbm90IGJlIG1vZGlmaWVkIGV4Y2VwdCB0byAKICAgICAgICAgICAgICAgICAqIGRlbGV0ZSBpdC4iICBYWFg6IGRvZXNuJ3QgdGhpcyBpbiBmYWN0IGFwcGx5IHRvIEFMTAogICAgICAgICAgICAgICAgICogY29sdW1ucyBvZiB0aGUgdGFibGUgYW5kIG5vdCBqdXN0IHRoaXMgb25lPyAgCiAgICAgICAgICAgICAgICAgKi8KCiAgICAgICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfSU5DT05TSVNURU5UVkFMVUU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKFN0b3JhZ2VUbXAtPnN0b3JhZ2VUeXBlICE9IFNUX05PTlZPTEFUSUxFKSB7CgogICAgICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PVFdSSVRBQkxFOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBicmVhazsKCgoKCiAgICBjYXNlIFJFU0VSVkUyOgogICAgICAgIC8qCiAgICAgICAgICogbWVtb3J5IHJlc2V2ZXJhdGlvbiwgZmluYWwgcHJlcGFyYXRpb24uLi4gCiAgICAgICAgICovCiAgICAgICAgaWYgKFN0b3JhZ2VUbXAgPT0gTlVMTCkgewoKICAgICAgICAgICAgaWYgKHNldF92YWx1ZSA9PSBSU19ERVNUUk9ZKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9FUlJPUjsKICAgICAgICAgICAgfQogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBjcmVhdGlvbiAKICAgICAgICAgICAgICovCgoKICAgICAgICAgICAgc25tcF92YXJsaXN0X2FkZF92YXJpYWJsZSgmdmFycywgTlVMTCwgMCwgQVNOX09DVEVUX1NUUiwgTlVMTCwgMCk7ICAvKiB0cmFjZVJvdXRlQ3RsT3duZXJJbmRleCAqLwogICAgICAgICAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzLCBOVUxMLCAwLCBBU05fT0NURVRfU1RSLCBOVUxMLCAwKTsgIC8qIHRyYWNlUm91dGVDdGxUZXN0TmFtZSAqLwoKICAgICAgICAgICAgaWYgKGhlYWRlcl9jb21wbGV4X3BhcnNlX29pZAogICAgICAgICAgICAgICAgKCYKICAgICAgICAgICAgICAgICAobmFtZQogICAgICAgICAgICAgICAgICBbc2l6ZW9mKHRyYWNlUm91dGVDdGxUYWJsZV92YXJpYWJsZXNfb2lkKSAvIHNpemVvZihvaWQpICsKICAgICAgICAgICAgICAgICAgIDJdKSwgbmV3bGVuLCB2YXJzKSAhPSBTTk1QRVJSX1NVQ0NFU1MpIHsKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiBYWFg6IGZyZWUsIHplcm8gdmFycyAKICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX0lOQ09OU0lTVEVOVE5BTUU7CiAgICAgICAgICAgIH0KCgogICAgICAgICAgICBTdG9yYWdlTmV3ID0gY3JlYXRlX3RyYWNlUm91dGVDdGxUYWJsZV9kYXRhKCk7CiAgICAgICAgICAgIGlmICh2YXJzLT52YWxfbGVuIDw9IDMyKSB7CiAgICAgICAgICAgICAgICBTdG9yYWdlTmV3LT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleCA9CiAgICAgICAgICAgICAgICAgICAgbWFsbG9jKHZhcnMtPnZhbF9sZW4gKyAxKTsKICAgICAgICAgICAgICAgIG1lbWNweShTdG9yYWdlTmV3LT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleCwKICAgICAgICAgICAgICAgICAgICAgICB2YXJzLT52YWwuc3RyaW5nLCB2YXJzLT52YWxfbGVuKTsKICAgICAgICAgICAgICAgIFN0b3JhZ2VOZXctPnRyYWNlUm91dGVDdGxPd25lckluZGV4W3ZhcnMtPnZhbF9sZW5dID0gJ1wwJzsKICAgICAgICAgICAgICAgIFN0b3JhZ2VOZXctPnRyYWNlUm91dGVDdGxPd25lckluZGV4TGVuID0gdmFycy0+dmFsX2xlbjsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIFN0b3JhZ2VOZXctPnRyYWNlUm91dGVDdGxPd25lckluZGV4ID0gbWFsbG9jKDMzKTsKICAgICAgICAgICAgICAgIG1lbWNweShTdG9yYWdlTmV3LT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleCwKICAgICAgICAgICAgICAgICAgICAgICB2YXJzLT52YWwuc3RyaW5nLCAzMik7CiAgICAgICAgICAgICAgICBTdG9yYWdlTmV3LT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleFszMl0gPSAnXDAnOwogICAgICAgICAgICAgICAgU3RvcmFnZU5ldy0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXhMZW4gPSAzMjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFycyA9IHZhcnMtPm5leHRfdmFyaWFibGU7CgogICAgICAgICAgICBpZiAodmFycy0+dmFsX2xlbiA8PSAzMikgewogICAgICAgICAgICAgICAgU3RvcmFnZU5ldy0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lID0KICAgICAgICAgICAgICAgICAgICBtYWxsb2ModmFycy0+dmFsX2xlbiArIDEpOwogICAgICAgICAgICAgICAgbWVtY3B5KFN0b3JhZ2VOZXctPnRyYWNlUm91dGVDdGxUZXN0TmFtZSwgdmFycy0+dmFsLnN0cmluZywKICAgICAgICAgICAgICAgICAgICAgICB2YXJzLT52YWxfbGVuKTsKICAgICAgICAgICAgICAgIFN0b3JhZ2VOZXctPnRyYWNlUm91dGVDdGxUZXN0TmFtZVt2YXJzLT52YWxfbGVuXSA9ICdcMCc7CiAgICAgICAgICAgICAgICBTdG9yYWdlTmV3LT50cmFjZVJvdXRlQ3RsVGVzdE5hbWVMZW4gPSB2YXJzLT52YWxfbGVuOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgU3RvcmFnZU5ldy0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lID0gbWFsbG9jKDMzKTsKICAgICAgICAgICAgICAgIG1lbWNweShTdG9yYWdlTmV3LT50cmFjZVJvdXRlQ3RsVGVzdE5hbWUsIHZhcnMtPnZhbC5zdHJpbmcsCiAgICAgICAgICAgICAgICAgICAgICAgMzIpOwogICAgICAgICAgICAgICAgU3RvcmFnZU5ldy0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lWzMyXSA9ICdcMCc7CiAgICAgICAgICAgICAgICBTdG9yYWdlTmV3LT50cmFjZVJvdXRlQ3RsVGVzdE5hbWVMZW4gPSAzMjsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXJzID0gdmFycy0+bmV4dF92YXJpYWJsZTsKCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIFhYWDogZmlsbCBpbiBkZWZhdWx0IHJvdyB2YWx1ZXMgaGVyZSBpbnRvIFN0b3JhZ2VOZXcgCiAgICAgICAgICAgICAqLwoKICAgICAgICAgICAgU3RvcmFnZU5ldy0+dHJhY2VSb3V0ZUN0bFJvd1N0YXR1cyA9IHNldF92YWx1ZTsKCgogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBYWFg6IGZyZWUsIHplcm8gdmFycywgbm8gbG9uZ2VyIG5lZWRlZD8gCiAgICAgICAgICAgICAqLwogICAgICAgIH0KICAgICAgICBzbm1wX2ZyZWVfdmFyYmluZCh2YXJzKTsKICAgICAgICB2YXJzID0gTlVMTDsKICAgICAgICBicmVhazsKCiAgICBjYXNlIEZSRUU6CiAgICAgICAgLyoKICAgICAgICAgKiBYWFg6IGZyZWUsIHplcm8gdmFycyAKICAgICAgICAgKi8KICAgICAgICBzbm1wX2ZyZWVfdmFyYmluZCh2YXJzKTsKICAgICAgICB2YXJzID0gTlVMTDsKICAgICAgICAvKgogICAgICAgICAqIFJlbGVhc2UgYW55IHJlc291cmNlcyB0aGF0IGhhdmUgYmVlbiBhbGxvY2F0ZWQgCiAgICAgICAgICovCiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBBQ1RJT046CiAgICAgICAgLyoKICAgICAgICAgKiBUaGUgdmFyaWFibGUgaGFzIGJlZW4gc3RvcmVkIGluIHNldF92YWx1ZSBmb3IgeW91IHRvCiAgICAgICAgICogdXNlLCBhbmQgeW91IGhhdmUganVzdCBiZWVuIGFza2VkIHRvIGRvIHNvbWV0aGluZyB3aXRoCiAgICAgICAgICogaXQuICBOb3RlIHRoYXQgYW55dGhpbmcgZG9uZSBoZXJlIG11c3QgYmUgcmV2ZXJzYWJsZSBpbgogICAgICAgICAqIHRoZSBVTkRPIGNhc2UgCiAgICAgICAgICovCgogICAgICAgIGlmIChTdG9yYWdlVG1wID09IE5VTEwpIHsKICAgICAgICAgICAgaWYgKHNldF92YWx1ZSA9PSBSU19ERVNUUk9ZKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9FUlJPUjsKICAgICAgICAgICAgfQogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiByb3cgY3JlYXRpb24sIHNvIGFkZCBpdCAKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGlmIChTdG9yYWdlTmV3ICE9IE5VTEwpIHsKI2lmIDEKICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlQ3RsVGFibGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIndyaXRlX3RyYWNlUm91dGVDdGxSb3dTdGF0dXMgZW50ZXJpbmcgbmV3PSVkLi4uICBcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb24pKTsKI2VuZGlmCiAgICAgICAgICAgICAgICB0cmFjZVJvdXRlQ3RsVGFibGVfYWRkKFN0b3JhZ2VOZXcpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBYWFg6IGFjaywgYW5kIGlmIGl0IGlzIE5VTEw/IAogICAgICAgICAgICAgKi8KICAgICAgICB9IGVsc2UgaWYgKHNldF92YWx1ZSAhPSBSU19ERVNUUk9ZKSB7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIHNldCB0aGUgZmxhZz8gCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBvbGRfdmFsdWUgPSBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsUm93U3RhdHVzOwogICAgICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsUm93U3RhdHVzID0gKigobG9uZyAqKSB2YXJfdmFsKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBkZXN0cm95Li4uICBleHRyYWN0IGl0IGZvciBub3cgCiAgICAgICAgICAgICAqLwoKICAgICAgICAgICAgaGNpcHRyID0KICAgICAgICAgICAgICAgIGhlYWRlcl9jb21wbGV4X2ZpbmRfZW50cnkodHJhY2VSb3V0ZUN0bFRhYmxlU3RvcmFnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RvcmFnZVRtcCk7CiAgICAgICAgICAgIFN0b3JhZ2VEZWwgPQogICAgICAgICAgICAgICAgaGVhZGVyX2NvbXBsZXhfZXh0cmFjdF9lbnRyeSgmdHJhY2VSb3V0ZUN0bFRhYmxlU3RvcmFnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGNpcHRyKTsKICAgICAgICAgICAgc25tcF9hbGFybV91bnJlZ2lzdGVyKFN0b3JhZ2VEZWwtPnRpbWVyX2lkKTsKCiAgICAgICAgICAgIHRyYWNlUm91dGVSZXN1bHRzVGFibGVfZGVsKFN0b3JhZ2VUbXApOwogICAgICAgICAgICB0cmFjZVJvdXRlUHJvYmVIaXN0b3J5VGFibGVfZGVsKFN0b3JhZ2VUbXApOwogICAgICAgICAgICB0cmFjZVJvdXRlSG9wc1RhYmxlX2RlbChTdG9yYWdlVG1wKTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CgoKCgogICAgY2FzZSBVTkRPOgogICAgICAgIC8qCiAgICAgICAgICogQmFjayBvdXQgYW55IGNoYW5nZXMgbWFkZSBpbiB0aGUgQUNUSU9OIGNhc2UgCiAgICAgICAgICovCiAgICAgICAgaWYgKFN0b3JhZ2VUbXAgPT0gTlVMTCkgewogICAgICAgICAgICBpZiAoc2V0X3ZhbHVlID09IFJTX0RFU1RST1kpIHsKICAgICAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9OT0VSUk9SOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIHJvdyBjcmVhdGlvbiwgc28gcmVtb3ZlIGl0IGFnYWluIAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgaGNpcHRyID0KICAgICAgICAgICAgICAgIGhlYWRlcl9jb21wbGV4X2ZpbmRfZW50cnkodHJhY2VSb3V0ZUN0bFRhYmxlU3RvcmFnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RvcmFnZVRtcCk7CiAgICAgICAgICAgIFN0b3JhZ2VEZWwgPQogICAgICAgICAgICAgICAgaGVhZGVyX2NvbXBsZXhfZXh0cmFjdF9lbnRyeSgmdHJhY2VSb3V0ZUN0bFRhYmxlU3RvcmFnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGNpcHRyKTsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogWFhYOiBmcmVlIGl0IAogICAgICAgICAgICAgKi8KICAgICAgICB9IGVsc2UgaWYgKFN0b3JhZ2VEZWwgIT0gTlVMTCkgewogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiByb3cgZGVsZXRpb24sIHNvIGFkZCBpdCBhZ2FpbiAKICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRyYWNlUm91dGVDdGxUYWJsZV9hZGQoU3RvcmFnZURlbCk7CiAgICAgICAgICAgIHRyYWNlUm91dGVSZXN1bHRzVGFibGVfYWRkKFN0b3JhZ2VEZWwpOwogICAgICAgICAgICB0cmFjZVJvdXRlUHJvYmVIaXN0b3J5VGFibGVfYWRkYWxsKFN0b3JhZ2VEZWwpOwogICAgICAgICAgICB0cmFjZVJvdXRlSG9wc1RhYmxlX2FkZGFsbChTdG9yYWdlRGVsKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsUm93U3RhdHVzID0gb2xkX3ZhbHVlOwogICAgICAgIH0KICAgICAgICBicmVhazsKCgoKCiAgICBjYXNlIENPTU1JVDoKICAgICAgICAvKgogICAgICAgICAqIFRoaW5ncyBhcmUgd29ya2luZyB3ZWxsLCBzbyBpdCdzIG5vdyBzYWZlIHRvIG1ha2UgdGhlIGNoYW5nZQogICAgICAgICAqIHBlcm1hbmVudGx5LiAgTWFrZSBzdXJlIHRoYXQgYW55dGhpbmcgZG9uZSBoZXJlIGNhbid0IGZhaWwhIAogICAgICAgICAqLwogICAgICAgIGlmIChTdG9yYWdlVG1wID09IE5VTEwpIHsKICAgICAgICAgICAgaWYgKHNldF92YWx1ZSA9PSBSU19ERVNUUk9ZKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9FUlJPUjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoU3RvcmFnZURlbCAhPSBOVUxMKSB7CiAgICAgICAgICAgIGZyZWUoU3RvcmFnZURlbC0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXgpOwogICAgICAgICAgICBTdG9yYWdlRGVsLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleCA9IE5VTEw7CiAgICAgICAgICAgIGZyZWUoU3RvcmFnZURlbC0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lKTsKICAgICAgICAgICAgU3RvcmFnZURlbC0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lID0gTlVMTDsKICAgICAgICAgICAgZnJlZShTdG9yYWdlRGVsLT50cmFjZVJvdXRlQ3RsVGFyZ2V0QWRkcmVzcyk7CiAgICAgICAgICAgIFN0b3JhZ2VEZWwtPnRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzID0gTlVMTDsKICAgICAgICAgICAgZnJlZShTdG9yYWdlRGVsLT50cmFjZVJvdXRlQ3RsU291cmNlQWRkcmVzcyk7CiAgICAgICAgICAgIFN0b3JhZ2VEZWwtPnRyYWNlUm91dGVDdGxTb3VyY2VBZGRyZXNzID0gTlVMTDsKICAgICAgICAgICAgZnJlZShTdG9yYWdlRGVsLT50cmFjZVJvdXRlQ3RsTWlzY09wdGlvbnMpOwogICAgICAgICAgICBTdG9yYWdlRGVsLT50cmFjZVJvdXRlQ3RsTWlzY09wdGlvbnMgPSBOVUxMOwogICAgICAgICAgICBmcmVlKFN0b3JhZ2VEZWwtPnRyYWNlUm91dGVDdGxEZXNjcik7CiAgICAgICAgICAgIFN0b3JhZ2VEZWwtPnRyYWNlUm91dGVDdGxEZXNjciA9IE5VTEw7CiAgICAgICAgICAgIGZyZWUoU3RvcmFnZURlbC0+dHJhY2VSb3V0ZUN0bFRyYXBHZW5lcmF0aW9uKTsKICAgICAgICAgICAgU3RvcmFnZURlbC0+dHJhY2VSb3V0ZUN0bFRyYXBHZW5lcmF0aW9uID0gTlVMTDsKICAgICAgICAgICAgZnJlZShTdG9yYWdlRGVsLT50cmFjZVJvdXRlQ3RsVHlwZSk7CiAgICAgICAgICAgIFN0b3JhZ2VEZWwtPnRyYWNlUm91dGVDdGxUeXBlID0gTlVMTDsKICAgICAgICAgICAgZnJlZShTdG9yYWdlRGVsKTsKICAgICAgICAgICAgU3RvcmFnZURlbCA9IE5VTEw7CgogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBYWFg6IGZyZWUgaXQsIGl0cyBkZWFkIAogICAgICAgICAgICAgKi8KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAoU3RvcmFnZVRtcAogICAgICAgICAgICAgICAgJiYgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFJvd1N0YXR1cyA9PSBSU19DUkVBVEVBTkRHTykgewogICAgICAgICAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFJvd1N0YXR1cyA9IFJTX0FDVElWRTsKICAgICAgICAgICAgfSBlbHNlIGlmIChTdG9yYWdlVG1wICYmCiAgICAgICAgICAgICAgICAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFJvd1N0YXR1cyA9PQogICAgICAgICAgICAgICAgICAgICAgIFJTX0NSRUFURUFORFdBSVQpIHsKCiAgICAgICAgICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsUm93U3RhdHVzID0gUlNfTk9USU5TRVJWSUNFOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChTdG9yYWdlVG1wICYmIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxSb3dTdGF0dXMgPT0gUlNfQUNUSVZFKSB7CiNpZiAxCiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlQ3RsVGFibGUiLAogICAgICAgICAgICAgICAgICAgICAgICAid3JpdGVfdHJhY2VSb3V0ZUN0bFJvd1N0YXR1cyBlbnRlcmluZyBydW5iZWZvcmU9JWxkLi4uICBcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzVHlwZSkpOwoKI2VuZGlmCiAgICAgICAgICAgIGlmIChTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsQWRtaW5TdGF0dXMgPT0gMSkgewogICAgICAgICAgICAgICAgaW5pdF90clJlc3VsdHNUYWJsZShTdG9yYWdlVG1wKTsKICAgICAgICAgICAgICAgIGlmIChTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsRnJlcXVlbmN5ICE9IDApCiAgICAgICAgICAgICAgICAgICAgU3RvcmFnZVRtcC0+dGltZXJfaWQgPQogICAgICAgICAgICAgICAgICAgICAgICBzbm1wX2FsYXJtX3JlZ2lzdGVyKFN0b3JhZ2VUbXAtPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlUm91dGVDdGxGcmVxdWVuY3ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0FfUkVQRUFULCBydW5fdHJhY2VSb3V0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdG9yYWdlVG1wKTsKICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICBTdG9yYWdlVG1wLT50aW1lcl9pZCA9CiAgICAgICAgICAgICAgICAgICAgICAgIHNubXBfYWxhcm1fcmVnaXN0ZXIoMSwgMCwgcnVuX3RyYWNlUm91dGUsIFN0b3JhZ2VUbXApOwoKICAgICAgICAgICAgfQoKICAgICAgICB9CiAgICAgICAgc25tcF9zdG9yZV9uZWVkZWQoTlVMTCk7CiAgICAgICAgYnJlYWs7CiAgICB9CiAgICByZXR1cm4gU05NUF9FUlJfTk9FUlJPUjsKfQoKCnZvaWQKcnVuX3RyYWNlUm91dGUodW5zaWduZWQgaW50IGNsaWVudHJlZywgdm9pZCAqY2xpZW50YXJnKQp7CiAgICBzdHJ1Y3QgdHJhY2VSb3V0ZUN0bFRhYmxlX2RhdGEgKml0ZW0gPSBjbGllbnRhcmc7CiAgICB1X3Nob3J0ICAgICAgICAgcG9ydCA9IGl0ZW0tPnRyYWNlUm91dGVDdGxQb3J0OyAgICAgLyogc3RhcnQgdWRwIGRlc3QgcG9ydCAjIGZvciBwcm9iZSBwYWNrZXRzIM/gtbHT2mN0bHBvcnQgKi8KICAgIGludCAgICAgICAgICAgICB3YWl0dGltZSA9IGl0ZW0tPnRyYWNlUm91dGVDdGxUaW1lT3V0OyAgICAgIC8qIHRpbWUgdG8gd2FpdCBmb3IgcmVzcG9uc2UgKGluIHNlY29uZHMpIM/gtcjT2mN0bHRpbWVvdXQgKi8KICAgIGludCAgICAgICAgICAgICBucHJvYmVzID0gaXRlbS0+dHJhY2VSb3V0ZUN0bFByb2Jlc1BlckhvcDsKCiAgICBpZiAoaXRlbS0+dHJhY2VSb3V0ZUN0bEluaXRpYWxUdGwgPiBpdGVtLT50cmFjZVJvdXRlQ3RsTWF4VHRsKSB7CiAgICAgICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVDdGxUYWJsZSIsCiAgICAgICAgICAgICAgICAgICAgImZpcnN0IHR0bCAoJWx1KSBtYXkgbm90IGJlIGdyZWF0ZXIgdGhhbiBtYXggdHRsICglbHUpXG4iLAogICAgICAgICAgICAgICAgICAgIGl0ZW0tPnRyYWNlUm91dGVDdGxJbml0aWFsVHRsLAogICAgICAgICAgICAgICAgICAgIGl0ZW0tPnRyYWNlUm91dGVDdGxNYXhUdGwpKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgY2hhciAgICAgICAgICAgKm9sZF9Ib3BzQWRkcmVzc1syNTVdOwogICAgaW50ICAgICAgICAgICAgIGNvdW50ID0gMDsKICAgIGludCAgICAgICAgICAgICBmbGFnID0gMDsKCiAgICBpZiAoaXRlbS0+dHJhY2VSb3V0ZUN0bFRhcmdldEFkZHJlc3NUeXBlID09IDEKICAgICAgICB8fCBpdGVtLT50cmFjZVJvdXRlQ3RsVGFyZ2V0QWRkcmVzc1R5cGUgPT0gMTYpIHsKICAgICAgICByZWdpc3RlciBpbnQgICAgY29kZSwgbjsKICAgICAgICBjb25zdCAgICBjaGFyICAqY3A7CiAgICAgICAgcmVnaXN0ZXIgY29uc3QgY2hhciAqZXJyOwogICAgICAgIHJlZ2lzdGVyIHVfY2hhciAqb3V0cDsKICAgICAgICByZWdpc3RlciB1X2ludDMyX3QgKmFwOwogICAgICAgIHN0cnVjdCBzb2NrYWRkciB3aGVyZXRvOyAgICAgICAgLyogV2hvIHRvIHRyeSB0byByZWFjaCAqLwogICAgICAgIHN0cnVjdCBzb2NrYWRkciB3aGVyZWZyb207ICAgICAgLyogV2hvIHdlIGFyZSAqLwoKICAgICAgICByZWdpc3RlciBzdHJ1Y3Qgc29ja2FkZHJfaW4gKmZyb20gPQogICAgICAgICAgICAoc3RydWN0IHNvY2thZGRyX2luICopICZ3aGVyZWZyb207CiAgICAgICAgcmVnaXN0ZXIgc3RydWN0IHNvY2thZGRyX2luICp0byA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikgJndoZXJldG87CiAgICAgICAgcmVnaXN0ZXIgc3RydWN0IGhvc3RpbmZvICpoaTsKICAgICAgICBpbnQgICAgICAgICAgICAgb24gPSAxOwogICAgICAgIHJlZ2lzdGVyIHN0cnVjdCBwcm90b2VudCAqcGU7CiAgICAgICAgcmVnaXN0ZXIgaW50ICAgIHR0bCwgcHJvYmUsIGk7CiAgICAgICAgcmVnaXN0ZXIgaW50ICAgIHNlcSA9IDA7CiAgICAgICAgaW50ICAgICAgICAgICAgIHRvcyA9IDAsIHNldHRvcyA9IDA7CiAgICAgICAgcmVnaXN0ZXIgaW50ICAgIGxzcnIgPSAwOwogICAgICAgIHJlZ2lzdGVyIHVfc2hvcnQgb2ZmID0gMDsKICAgICAgICBzdHJ1Y3QgaWZhZGRybGlzdCAqYWw7CiAgICAgICAgY2hhciAgICAgICAgICAgIGVycmJ1ZlsxMzJdOwogICAgICAgIGludCAgICAgICAgICAgICBtaW5wYWNrZXQgPSAwOyAgLyogbWluIGlwIHBhY2tldCBzaXplICovCgoKICAgICAgICBzdHJ1Y3QgaXAgICAgICAqb3V0aXA7ICAvKiBsYXN0IG91dHB1dCAodWRwKSBwYWNrZXQgKi8KICAgICAgICBzdHJ1Y3QgdWRwaGRyICAqb3V0dWRwOyAvKiBsYXN0IG91dHB1dCAodWRwKSBwYWNrZXQgKi8KICAgICAgICBpbnQgICAgICAgICAgICAgcGFja2xlbiA9IDA7ICAgIC8qIHRvdGFsIGxlbmd0aCBvZiBwYWNrZXQgKi8KICAgICAgICBpbnQgICAgICAgICAgICAgb3B0bGVuID0gMDsgICAgIC8qIGxlbmd0aCBvZiBpcCBvcHRpb25zICovCiAgICAgICAgaW50ICAgICAgICAgICAgIG9wdGlvbnMgPSAwOyAgICAvKiBzb2NrZXQgb3B0aW9ucyAqLwogICAgICAgIGludCAgICAgICAgICAgICBzOyAgICAgIC8qIHJlY2VpdmUgKGljbXApIHNvY2tldCBmaWxlIGRlc2NyaXB0b3IgKi8KICAgICAgICBpbnQgICAgICAgICAgICAgc25kc29jazsgICAgICAgIC8qIHNlbmQgKHVkcC9pY21wKSBzb2NrZXQgZmlsZSBkZXNjcmlwdG9yICovCgogICAgICAgIHVfc2hvcnQgICAgICAgICBpZGVudDsKICAgICAgICAvKgogICAgICAgICAqIGxvb3NlIHNvdXJjZSByb3V0ZSBnYXRld2F5IGxpc3QgKGluY2x1ZGluZyByb29tIGZvciBmaW5hbCBkZXN0aW5hdGlvbikgCiAgICAgICAgICovCiAgICAgICAgdV9pbnQzMl90ICAgICAgIGd3bGlzdFtOR0FURVdBWVMgKyAxXTsKICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBkZXZudWxsW10gPSAiL2Rldi9udWxsIjsKICAgICAgICBjaGFyICAgICAgICAgICAqZGV2aWNlID0gTlVMTDsKICAgICAgICBjaGFyICAgICAgICAgICAqc291cmNlID0gTlVMTDsKICAgICAgICBjaGFyICAgICAgICAgICAqaG9zdG5hbWU7CiAgICAgICAgdV9pbnQgICAgICAgICAgIHBhdXNlbXNlY3MgPSAwOwogICAgICAgIHVfY2hhciAgICAgICAgICBwYWNrZXRbNTEyXTsgICAgLyogbGFzdCBpbmJvdW5kIChpY21wKSBwYWNrZXQgKi8KCiAgICAgICAgaW50ICAgICAgICAgICAgIHBtdHUgPSAwOyAgICAgICAvKiBQYXRoIE1UVSBEaXNjb3ZlcnkgKFJGQzExOTEpICovCgogICAgICAgIHN0cnVjdCBvdXRkYXRhICpvdXRkYXRhOyAgICAgICAgLyogbGFzdCBvdXRwdXQgKHVkcCkgcGFja2V0ICovCgogICAgICAgIG1pbnBhY2tldCA9IHNpemVvZigqb3V0aXApICsgc2l6ZW9mKCpvdXRkYXRhKSArIG9wdGxlbjsKICAgICAgICBtaW5wYWNrZXQgKz0gc2l6ZW9mKCpvdXR1ZHApOwogICAgICAgIHBhY2tsZW4gPSBtaW5wYWNrZXQ7ICAgIC8qIG1pbmltdW0gc2l6ZWQgcGFja2V0ICovCgogICAgICAgIGhvc3RuYW1lID0KICAgICAgICAgICAgKGNoYXIgKikgbWFsbG9jKGl0ZW0tPnRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzTGVuICsgMSk7CiAgICAgICAgaWYgKGhvc3RuYW1lID09IE5VTEwpCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICBtZW1jcHkoaG9zdG5hbWUsIGl0ZW0tPnRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzLAogICAgICAgICAgICAgICBpdGVtLT50cmFjZVJvdXRlQ3RsVGFyZ2V0QWRkcmVzc0xlbiArIDEpOwogICAgICAgIGhvc3RuYW1lW2l0ZW0tPnRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzTGVuXSA9ICdcMCc7CgogICAgICAgIGhpID0gZ2V0aG9zdGluZm8oaG9zdG5hbWUpOwogICAgICAgIHNldHNpbih0bywgaGktPmFkZHJzWzBdKTsKICAgICAgICBpZiAoaGktPm4gPiAxKQogICAgICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZUN0bFRhYmxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgIldhcm5pbmc6ICVzIGhhcyBtdWx0aXBsZSBhZGRyZXNzZXM7IHVzaW5nICVzXG4iLAogICAgICAgICAgICAgICAgICAgICAgICBob3N0bmFtZSwgaW5ldF9udG9hKHRvLT5zaW5fYWRkcikpKTsKICAgICAgICBob3N0bmFtZSA9IGhpLT5uYW1lOwogICAgICAgIGhpLT5uYW1lID0gTlVMTDsKICAgICAgICBmcmVlaG9zdGluZm8oaGkpOwoKCiAgICAgICAgbmV0c25tcF9zZXRfbGluZV9idWZmZXJpbmcoc3Rkb3V0KTsKCiAgICAgICAgb3V0aXAgPSAoc3RydWN0IGlwICopIG1hbGxvYyhwYWNrbGVuKTsKICAgICAgICBpZiAob3V0aXAgPT0gTlVMTCkgewogICAgICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZUN0bFRhYmxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgIm1hbGxvYzogJXNcbiIsIHN0cmVycm9yKGVycm5vKSkpOwogICAgICAgICAgICBleGl0KDEpOwogICAgICAgIH0KICAgICAgICBtZW1zZXQoKGNoYXIgKikgb3V0aXAsIDAsIHBhY2tsZW4pOwoKICAgICAgICBvdXRpcC0+aXBfdiA9IElQVkVSU0lPTjsKICAgICAgICBpZiAoc2V0dG9zKQogICAgICAgICAgICBvdXRpcC0+aXBfdG9zID0gdG9zOwojaWZkZWYgQllURVNXQVBfSVBfSERSCiAgICAgICAgb3V0aXAtPmlwX2xlbiA9IGh0b25zKHBhY2tsZW4pOwogICAgICAgIG91dGlwLT5pcF9vZmYgPSBodG9ucyhvZmYpOwojZWxzZQogICAgICAgIG91dGlwLT5pcF9sZW4gPSBwYWNrbGVuOwogICAgICAgIG91dGlwLT5pcF9vZmYgPSBvZmY7CiNlbmRpZgogICAgICAgIG91dHAgPSAodV9jaGFyICopIChvdXRpcCArIDEpOwojaWZkZWYgSEFWRV9SQVdfT1BUSU9OUwogICAgICAgIGlmIChsc3JyID4gMCkgewogICAgICAgICAgICByZWdpc3RlciB1X2NoYXIgKm9wdGxpc3Q7CgogICAgICAgICAgICBvcHRsaXN0ID0gb3V0cDsKICAgICAgICAgICAgb3V0cCArPSBvcHRsZW47CgogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBmaW5hbCBob3AgCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnd2xpc3RbbHNycl0gPSB0by0+c2luX2FkZHIuc19hZGRyOwoKICAgICAgICAgICAgb3V0aXAtPmlwX2RzdC5zX2FkZHIgPSBnd2xpc3RbMF07CgogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBmb3JjZSA0IGJ5dGUgYWxpZ25tZW50IAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgb3B0bGlzdFswXSA9IElQT1BUX05PUDsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogbG9vc2Ugc291cmNlIHJvdXRlIG9wdGlvbiAKICAgICAgICAgICAgICovCiAgICAgICAgICAgIG9wdGxpc3RbMV0gPSBJUE9QVF9MU1JSOwogICAgICAgICAgICBpID0gbHNyciAqIHNpemVvZihnd2xpc3RbMF0pOwogICAgICAgICAgICBvcHRsaXN0WzJdID0gaSArIDM7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIFBvaW50ZXIgdG8gTFNSUiBhZGRyZXNzZXMgCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBvcHRsaXN0WzNdID0gSVBPUFRfTUlOT0ZGOwogICAgICAgICAgICBtZW1jcHkob3B0bGlzdCArIDQsIGd3bGlzdCArIDEsIGkpOwogICAgICAgIH0gZWxzZQojZW5kaWYKICAgICAgICAgICAgb3V0aXAtPmlwX2RzdCA9IHRvLT5zaW5fYWRkcjsKICAgICAgICBvdXRpcC0+aXBfaGwgPSAob3V0cCAtICh1X2NoYXIgKikgb3V0aXApID4+IDI7CiAgICAgICAgaWRlbnQgPSAoZ2V0cGlkKCkgJiAweGZmZmYpIHwgMHg4MDAwOwoKICAgICAgICBvdXRpcC0+aXBfcCA9IElQUFJPVE9fVURQOwoKICAgICAgICBvdXR1ZHAgPSAoc3RydWN0IHVkcGhkciAqKSBvdXRwOwogICAgICAgIG91dHVkcC0+c291cmNlID0gaHRvbnMoaWRlbnQpOwogICAgICAgIG91dHVkcC0+bGVuID0KICAgICAgICAgICAgaHRvbnMoKHVfc2hvcnQpIChwYWNrbGVuIC0gKHNpemVvZigqb3V0aXApICsgb3B0bGVuKSkpOwogICAgICAgIG91dGRhdGEgPSAoc3RydWN0IG91dGRhdGEgKikgKG91dHVkcCArIDEpOwoKICAgICAgICBjcCA9ICJpY21wIjsKICAgICAgICBpZiAoKHBlID0gZ2V0cHJvdG9ieW5hbWUoY3ApKSA9PSBOVUxMKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlQ3RsVGFibGUiLAogICAgICAgICAgICAgICAgICAgICAgICAidW5rbm93biBwcm90b2NvbCAlc1xuIiwgY3ApKTsKICAgICAgICAgICAgZXhpdCgxKTsKICAgICAgICB9CgogICAgICAgIC8qCiAgICAgICAgICogSW5zdXJlIHRoZSBzb2NrZXQgZmRzIHdvbid0IGJlIDAsIDEgb3IgMiAKICAgICAgICAgKi8KICAgICAgICBpZiAob3BlbihkZXZudWxsLCBPX1JET05MWSkgPCAwIHx8CiAgICAgICAgICAgIG9wZW4oZGV2bnVsbCwgT19SRE9OTFkpIDwgMCB8fCBvcGVuKGRldm51bGwsIE9fUkRPTkxZKSA8IDApIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVDdGxUYWJsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJvcGVuIFwiJXNcIjogJXNcbiIsIGRldm51bGwsIHN0cmVycm9yKGVycm5vKSkpOwogICAgICAgICAgICBleGl0KDEpOwogICAgICAgIH0KICAgICAgICBpZiAoKHMgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19SQVcsIHBlLT5wX3Byb3RvKSkgPCAwKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlQ3RsVGFibGUiLAogICAgICAgICAgICAgICAgICAgICAgICAiaWNtcCBzb2NrZXQ6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpKTsKICAgICAgICAgICAgZXhpdCgxKTsKICAgICAgICB9CiAgICAgICAgaWYgKG9wdGlvbnMgJiBTT19ERUJVRykKICAgICAgICAgICAgKHZvaWQpIHNldHNvY2tvcHQocywgU09MX1NPQ0tFVCwgU09fREVCVUcsIChjaGFyICopICZvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9uKSk7CiAgICAgICAgaWYgKG9wdGlvbnMgJiBTT19ET05UUk9VVEUpCiAgICAgICAgICAgICh2b2lkKSBzZXRzb2Nrb3B0KHMsIFNPTF9TT0NLRVQsIFNPX0RPTlRST1VURSwgKGNoYXIgKikgJm9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yob24pKTsKI2lmbmRlZiBfX2hwdXgKICAgICAgICBwcmludGYoInJhd1xuIik7CiAgICAgICAgc25kc29jayA9IHNvY2tldChBRl9JTkVULCBTT0NLX1JBVywgSVBQUk9UT19SQVcpOwojZWxzZQogICAgICAgIHByaW50ZigidWRwXG4iKTsKICAgICAgICBzbmRzb2NrID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfUkFXLCBJUFBST1RPX1VEUCk7CiNlbmRpZgogICAgICAgIGlmIChzbmRzb2NrIDwgMCkgewogICAgICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZUN0bFRhYmxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgInJhdyBzb2NrZXQ6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpKTsKICAgICAgICAgICAgZXhpdCgxKTsKICAgICAgICB9CiNpZiBkZWZpbmVkKElQX09QVElPTlMpICYmICFkZWZpbmVkKEhBVkVfUkFXX09QVElPTlMpCiAgICAgICAgaWYgKGxzcnIgPiAwKSB7CiAgICAgICAgICAgIHVfY2hhciAgICAgICAgICBvcHRsaXN0W01BWF9JUE9QVExFTl07CgogICAgICAgICAgICBjcCA9ICJpcCI7CiAgICAgICAgICAgIGlmICgocGUgPSBnZXRwcm90b2J5bmFtZShjcCkpID09IE5VTEwpIHsKICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlQ3RsVGFibGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInVua25vd24gcHJvdG9jb2wgJXNcbiIsIGNwKSk7CiAgICAgICAgICAgICAgICBleGl0KDEpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIGZpbmFsIGhvcCAKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGd3bGlzdFtsc3JyXSA9IHRvLT5zaW5fYWRkci5zX2FkZHI7CiAgICAgICAgICAgICsrbHNycjsKCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIGZvcmNlIDQgYnl0ZSBhbGlnbm1lbnQgCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBvcHRsaXN0WzBdID0gSVBPUFRfTk9QOwogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBsb29zZSBzb3VyY2Ugcm91dGUgb3B0aW9uIAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgb3B0bGlzdFsxXSA9IElQT1BUX0xTUlI7CiAgICAgICAgICAgIGkgPSBsc3JyICogc2l6ZW9mKGd3bGlzdFswXSk7CiAgICAgICAgICAgIG9wdGxpc3RbMl0gPSBpICsgMzsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogUG9pbnRlciB0byBMU1JSIGFkZHJlc3NlcyAKICAgICAgICAgICAgICovCiAgICAgICAgICAgIG9wdGxpc3RbM10gPSBJUE9QVF9NSU5PRkY7CiAgICAgICAgICAgIG1lbWNweShvcHRsaXN0ICsgNCwgZ3dsaXN0LCBpKTsKCiAgICAgICAgICAgIGlmICgoc2V0c29ja29wdChzbmRzb2NrLCBwZS0+cF9wcm90bywgSVBfT1BUSU9OUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopIG9wdGxpc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpICsgc2l6ZW9mKGd3bGlzdFswXSkpKSA8IDApIHsKICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlQ3RsVGFibGUiLCAiSVBfT1BUSU9OUzogJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcihlcnJubykpKTsKICAgICAgICAgICAgICAgIGV4aXQoMSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiNlbmRpZgojaWZkZWYgU09fU05EQlVGCiAgICAgICAgaWYgKHNldHNvY2tvcHQoc25kc29jaywgU09MX1NPQ0tFVCwgU09fU05EQlVGLCAoY2hhciAqKSAmcGFja2xlbiwKICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YocGFja2xlbikpIDwgMCkgewogICAgICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZUN0bFRhYmxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgIlNPX1NOREJVRjogJXNcbiIsIHN0cmVycm9yKGVycm5vKSkpOwogICAgICAgICAgICBleGl0KDEpOwogICAgICAgIH0KI2VuZGlmCiNpZmRlZiBJUF9IRFJJTkNMCiAgICAgICAgaWYgKHNldHNvY2tvcHQoc25kc29jaywgSVBQUk9UT19JUCwgSVBfSERSSU5DTCwgKGNoYXIgKikgJm9uLAogICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihvbikpIDwgMCkgewogICAgICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZUN0bFRhYmxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgIklQX0hEUklOQ0w6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpKTsKICAgICAgICAgICAgZXhpdCgxKTsKICAgICAgICB9CiNlbHNlCiNpZmRlZiBJUF9UT1MKICAgICAgICBpZiAoc2V0dG9zICYmIHNldHNvY2tvcHQoc25kc29jaywgSVBQUk9UT19JUCwgSVBfVE9TLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKSAmdG9zLCBzaXplb2YodG9zKSkgPCAwKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlQ3RsVGFibGUiLAogICAgICAgICAgICAgICAgICAgICAgICAic2V0c29ja29wdCB0b3MgJWQ6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpKTsKICAgICAgICAgICAgZXhpdCgxKTsKICAgICAgICB9CiNlbmRpZgojZW5kaWYKICAgICAgICBpZiAob3B0aW9ucyAmIFNPX0RFQlVHKQogICAgICAgICAgICAodm9pZCkgc2V0c29ja29wdChzbmRzb2NrLCBTT0xfU09DS0VULCBTT19ERUJVRywgKGNoYXIgKikgJm9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yob24pKTsKICAgICAgICBpZiAob3B0aW9ucyAmIFNPX0RPTlRST1VURSkKICAgICAgICAgICAgKHZvaWQpIHNldHNvY2tvcHQoc25kc29jaywgU09MX1NPQ0tFVCwgU09fRE9OVFJPVVRFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKSAmb24sIHNpemVvZihvbikpOwogICAgICAgIC8qCiAgICAgICAgICogR2V0IHRoZSBpbnRlcmZhY2UgYWRkcmVzcyBsaXN0IAogICAgICAgICAqLwogICAgICAgIG4gPSBpZmFkZHJsaXN0KCZhbCwgZXJyYnVmKTsKICAgICAgICBpZiAobiA8IDApIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVDdGxUYWJsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICIgaWZhZGRybGlzdDogJXNcbiIsIGVycmJ1ZikpOwogICAgICAgICAgICBleGl0KDEpOwogICAgICAgIH0KICAgICAgICBpZiAobiA9PSAwKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlQ3RsVGFibGUiLAogICAgICAgICAgICAgICAgICAgICAgICAiIENhbid0IGZpbmQgYW55IG5ldHdvcmsgaW50ZXJmYWNlc1xuIikpOwoKICAgICAgICAgICAgZXhpdCgxKTsKICAgICAgICB9CgogICAgICAgIC8qCiAgICAgICAgICogTG9vayBmb3IgYSBzcGVjaWZpYyBkZXZpY2UgCiAgICAgICAgICovCiAgICAgICAgaWYgKGRldmljZSAhPSBOVUxMKSB7CiAgICAgICAgICAgIGZvciAoaSA9IG47IGkgPiAwOyAtLWksICsrYWwpCiAgICAgICAgICAgICAgICBpZiAoc3RyY21wKGRldmljZSwgYWwtPmRldmljZSkgPT0gMCkKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgaWYgKGkgPD0gMCkgewogICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVDdGxUYWJsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIENhbid0IGZpbmQgaW50ZXJmYWNlICUuMzJzXG4iLCBkZXZpY2UpKTsKCiAgICAgICAgICAgICAgICBleGl0KDEpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qCiAgICAgICAgICogRGV0ZXJtaW5lIG91ciBzb3VyY2UgYWRkcmVzcyAKICAgICAgICAgKi8KICAgICAgICBpZiAoc291cmNlID09IE5VTEwpIHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogSWYgYSBkZXZpY2Ugd2FzIHNwZWNpZmllZCwgdXNlIHRoZSBpbnRlcmZhY2UgYWRkcmVzcy4KICAgICAgICAgICAgICogT3RoZXJ3aXNlLCB0cnkgdG8gZGV0ZXJtaW5lIG91ciBzb3VyY2UgYWRkcmVzcy4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGlmIChkZXZpY2UgIT0gTlVMTCkKICAgICAgICAgICAgICAgIHNldHNpbihmcm9tLCBhbC0+YWRkcik7CiAgICAgICAgICAgIGVsc2UgaWYgKChlcnIgPSBmaW5kc2FkZHIodG8sIGZyb20pKSAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZUN0bFRhYmxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgZmluZHNhZGRyOiAlc1xuIiwgZXJyKSk7CiAgICAgICAgICAgICAgICBleGl0KDEpOwogICAgICAgICAgICB9CgogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGhpID0gZ2V0aG9zdGluZm8oc291cmNlKTsKICAgICAgICAgICAgc291cmNlID0gaGktPm5hbWU7CiAgICAgICAgICAgIGhpLT5uYW1lID0gTlVMTDsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogSWYgdGhlIGRldmljZSB3YXMgc3BlY2lmaWVkIG1ha2Ugc3VyZSBpdAogICAgICAgICAgICAgKiBjb3JyZXNwb25kcyB0byB0aGUgc291cmNlIGFkZHJlc3Mgc3BlY2lmaWVkLgogICAgICAgICAgICAgKiBPdGhlcndpc2UsIHVzZSB0aGUgZmlyc3QgYWRkcmVzcyAoYW5kIHdhcm4gaWYKICAgICAgICAgICAgICogdGhlcmUgYXJlIG1vcmUgdGhhbiBvbmUpLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgaWYgKGRldmljZSAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICBmb3IgKGkgPSBoaS0+biwgYXAgPSBoaS0+YWRkcnM7IGkgPiAwOyAtLWksICsrYXApCiAgICAgICAgICAgICAgICAgICAgaWYgKCphcCA9PSBhbC0+YWRkcikKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBpZiAoaSA8PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVDdGxUYWJsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAlcyBpcyBub3Qgb24gaW50ZXJmYWNlICUuMzJzXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZSwgZGV2aWNlKSk7CgogICAgICAgICAgICAgICAgICAgIGV4aXQoMSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBzZXRzaW4oZnJvbSwgKmFwKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHNldHNpbihmcm9tLCBoaS0+YWRkcnNbMF0pOwogICAgICAgICAgICAgICAgaWYgKGhpLT5uID4gMSkKICAgICAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZUN0bFRhYmxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIFdhcm5pbmc6ICVzIGhhcyBtdWx0aXBsZSBhZGRyZXNzZXM7IHVzaW5nICVzXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZSwgaW5ldF9udG9hKGZyb20tPnNpbl9hZGRyKSkpOwoKICAgICAgICAgICAgfQogICAgICAgICAgICBmcmVlaG9zdGluZm8oaGkpOwogICAgICAgIH0KICAgICAgICAvKgogICAgICAgICAqIFJldmVydCB0byBub24tcHJpdmlsZWdlZCB1c2VyIGFmdGVyIG9wZW5pbmcgc29ja2V0cyAKICAgICAgICAgKi8KICAgICAgICBzZXRnaWQoZ2V0Z2lkKCkpOwogICAgICAgIHNldHVpZChnZXR1aWQoKSk7CgogICAgICAgIG91dGlwLT5pcF9zcmMgPSBmcm9tLT5zaW5fYWRkcjsKI2lmbmRlZiBJUF9IRFJJTkNMCiAgICAgICAgaWYgKGJpbmQoc25kc29jaywgKHN0cnVjdCBzb2NrYWRkciAqKSBmcm9tLCBzaXplb2YoKmZyb20pKSA8IDApIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVDdGxUYWJsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICIgYmluZDogJXNcbiIsIHN0cmVycm9yKGVycm5vKSkpOwogICAgICAgICAgICBleGl0KDEpOwogICAgICAgIH0KI2VuZGlmCiAgICAgICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVDdGxUYWJsZSIsCiAgICAgICAgICAgICAgICAgICAgIiB0byAlcyAoJXMpIiwgaG9zdG5hbWUsIGluZXRfbnRvYSh0by0+c2luX2FkZHIpKSk7CgogICAgICAgIGlmIChzb3VyY2UpCiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlQ3RsVGFibGUiLCAiIGZyb20gJXMiLCBzb3VyY2UpKTsKCiAgICAgICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVDdGxUYWJsZSIsCiAgICAgICAgICAgICAgICAgICAgIiwgJWx1IGhvcHMgbWF4LCAlZCBieXRlIHBhY2tldHNcbiIsCiAgICAgICAgICAgICAgICAgICAgaXRlbS0+dHJhY2VSb3V0ZUN0bE1heFR0bCwgcGFja2xlbikpOwogICAgICAgICh2b2lkKSBmZmx1c2goc3RkZXJyKTsKCiAgICAgICAgc3RydWN0IHRyYWNlUm91dGVSZXN1bHRzVGFibGVfZGF0YSAqU3RvcmFnZVJlc3VsdHMgPSBOVUxMOwogICAgICAgIG5ldHNubXBfdmFyaWFibGVfbGlzdCAqdmFyc19yZXN1bHRzID0gTlVMTDsKCiAgICAgICAgc3RydWN0IHRyYWNlUm91dGVIb3BzVGFibGVfZGF0YSAqdGVtcCA9IE5VTEw7CiAgICAgICAgc3RydWN0IHRyYWNlUm91dGVIb3BzVGFibGVfZGF0YSAqY3VycmVudF90ZW1wID0gTlVMTDsKICAgICAgICBzdHJ1Y3QgdHJhY2VSb3V0ZUhvcHNUYWJsZV9kYXRhICpjdXJyZW50ID0gTlVMTDsKCiAgICAgICAgdW5zaWduZWQgbG9uZyAgIGluZGV4ID0gMDsKCiAgICAgICAgc3RydWN0IHRyYWNlUm91dGVQcm9iZUhpc3RvcnlUYWJsZV9kYXRhICp0ZW1wX2hpcyA9IE5VTEw7CiAgICAgICAgc3RydWN0IHRyYWNlUm91dGVQcm9iZUhpc3RvcnlUYWJsZV9kYXRhICpjdXJyZW50X3RlbXBfaGlzID0gTlVMTDsKCiAgICAgICAgc25tcF92YXJsaXN0X2FkZF92YXJpYWJsZSgmdmFyc19yZXN1bHRzLCBOVUxMLCAwLCBBU05fT0NURVRfU1RSLCAoY2hhciAqKSBpdGVtLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleCwgaXRlbS0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXhMZW4pOyAgICAgLyogIHRyYWNlUm91dGVDdGxPd25lckluZGV4ICAqLwogICAgICAgIHNubXBfdmFybGlzdF9hZGRfdmFyaWFibGUoJnZhcnNfcmVzdWx0cywgTlVMTCwgMCwgQVNOX09DVEVUX1NUUiwgKGNoYXIgKikgaXRlbS0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lLCBpdGVtLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWVMZW4pOyAvKiAgdHJhY2VSb3V0ZUN0bFRlc3ROYW1lICAqLwogICAgICAgIGlmICgoU3RvcmFnZVJlc3VsdHMgPQogICAgICAgICAgICAgaGVhZGVyX2NvbXBsZXhfZ2V0KHRyYWNlUm91dGVSZXN1bHRzVGFibGVTdG9yYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcnNfcmVzdWx0cykpID09IE5VTEwpCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICBzbm1wX2ZyZWVfdmFyYmluZCh2YXJzX3Jlc3VsdHMpOwogICAgICAgIHZhcnNfcmVzdWx0cyA9IE5VTEw7CgoKICAgICAgICBmb3IgKHR0bCA9IGl0ZW0tPnRyYWNlUm91dGVDdGxJbml0aWFsVHRsOwogICAgICAgICAgICAgdHRsIDw9IGl0ZW0tPnRyYWNlUm91dGVDdGxNYXhUdGw7ICsrdHRsKSB7CgogICAgICAgICAgICB1X2ludDMyX3QgICAgICAgbGFzdGFkZHIgPSAwOwogICAgICAgICAgICBpbnQgICAgICAgICAgICAgZ290bGFzdGFkZHIgPSAwOwogICAgICAgICAgICBpbnQgICAgICAgICAgICAgZ290X3RoZXJlID0gMDsKICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHVucmVhY2hhYmxlID0gMDsKICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlbnRmaXJzdCA9IDA7CiAgICAgICAgICAgIHRpbWVfdCAgICAgICAgICB0aW1lcCA9IDA7CgogICAgICAgICAgICBTdG9yYWdlUmVzdWx0cy0+dHJhY2VSb3V0ZVJlc3VsdHNDdXJIb3BDb3VudCA9IHR0bDsKICAgICAgICAgICAgaWYgKGl0ZW0tPnRyYWNlUm91dGVDdGxDcmVhdGVIb3BzRW50cmllcyA9PSAxKSB7CiAgICAgICAgICAgICAgICBpZiAodHRsID09IGl0ZW0tPnRyYWNlUm91dGVDdGxJbml0aWFsVHRsKSB7CiAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIGsgPSAwOwogICAgICAgICAgICAgICAgICAgIGNvdW50ID0gdHJhY2VSb3V0ZUhvcHNUYWJsZV9jb3VudChpdGVtKTsKCgogICAgICAgICAgICAgICAgICAgIHN0cnVjdCB0cmFjZVJvdXRlSG9wc1RhYmxlX2RhdGEgKlN0b3JhZ2VUbXAgPSBOVUxMOwogICAgICAgICAgICAgICAgICAgIHN0cnVjdCBoZWFkZXJfY29tcGxleF9pbmRleCAqaGNpcHRyMiA9IE5VTEw7CiAgICAgICAgICAgICAgICAgICAgbmV0c25tcF92YXJpYWJsZV9saXN0ICp2YXJzID0gTlVMTDsKICAgICAgICAgICAgICAgICAgICBvaWQgICAgICAgICAgICAgbmV3b2lkW01BWF9PSURfTEVOXTsKICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICAgbmV3b2lkX2xlbjsKCiAgICAgICAgICAgICAgICAgICAgc25tcF92YXJsaXN0X2FkZF92YXJpYWJsZSgmdmFycywgTlVMTCwgMCwgQVNOX09DVEVUX1NUUiwgKGNoYXIgKikgaXRlbS0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXgsIGl0ZW0tPnRyYWNlUm91dGVDdGxPd25lckluZGV4TGVuKTsgLyogdHJhY2VSb3V0ZUN0bE93bmVySW5kZXggKi8KICAgICAgICAgICAgICAgICAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzLCBOVUxMLCAwLCBBU05fT0NURVRfU1RSLCAoY2hhciAqKSBpdGVtLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWUsIGl0ZW0tPnRyYWNlUm91dGVDdGxUZXN0TmFtZUxlbik7ICAgICAvKiB0cmFjZVJvdXRlQ3RsVGVzdE5hbWUgKi8KCiAgICAgICAgICAgICAgICAgICAgaGVhZGVyX2NvbXBsZXhfZ2VuZXJhdGVfb2lkKG5ld29pZCwgJm5ld29pZF9sZW4sIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIHZhcnMpOwoKICAgICAgICAgICAgICAgICAgICBmb3IgKGhjaXB0cjIgPSB0cmFjZVJvdXRlSG9wc1RhYmxlU3RvcmFnZTsKICAgICAgICAgICAgICAgICAgICAgICAgIGhjaXB0cjIgIT0gTlVMTDsgaGNpcHRyMiA9IGhjaXB0cjItPm5leHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNubXBfb2lkX2NvbXBhcmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZXdvaWQsIG5ld29pZF9sZW4sIGhjaXB0cjItPm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3b2lkX2xlbikgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RvcmFnZVRtcCA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyX2NvbXBsZXhfZXh0cmFjdF9lbnRyeQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgmdHJhY2VSb3V0ZUhvcHNUYWJsZVN0b3JhZ2UsIGhjaXB0cjIpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZF9Ib3BzQWRkcmVzc1trXSA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikgbWFsbG9jKFN0b3JhZ2VUbXAtPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZVJvdXRlSG9wc0lwVGd0QWRkcmVzc0xlbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9sZF9Ib3BzQWRkcmVzc1trXSA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpdCgxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZF9Ib3BzQWRkcmVzc1trXSA9IG5ldHNubXBfbWVtZHVwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVIb3BzSXBUZ3RBZGRyZXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0b3JhZ2VUbXAtPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlUm91dGVIb3BzSXBUZ3RBZGRyZXNzTGVuICsgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRfSG9wc0FkZHJlc3Nba11bU3RvcmFnZVRtcC0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VSb3V0ZUhvcHNJcFRndEFkZHJlc3NMZW5dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnXDAnOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGsrKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0b3JhZ2VUbXAgPSBOVUxMOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHRyYWNlUm91dGVIb3BzVGFibGVfZGVsKGl0ZW0pOwogICAgICAgICAgICAgICAgICAgIGluZGV4ID0gMDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB0ZW1wID0gU05NUF9NQUxMT0NfU1RSVUNUKHRyYWNlUm91dGVIb3BzVGFibGVfZGF0YSk7CiAgICAgICAgICAgICAgICB0ZW1wLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleCA9CiAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikgbWFsbG9jKGl0ZW0tPnRyYWNlUm91dGVDdGxPd25lckluZGV4TGVuICsgMSk7CiAgICAgICAgICAgICAgICBtZW1jcHkodGVtcC0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgaXRlbS0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgaXRlbS0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXhMZW4gKyAxKTsKICAgICAgICAgICAgICAgIHRlbXAtPnRyYWNlUm91dGVDdGxPd25lckluZGV4W2l0ZW0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VSb3V0ZUN0bE93bmVySW5kZXhMZW5dID0KICAgICAgICAgICAgICAgICAgICAnXDAnOwogICAgICAgICAgICAgICAgdGVtcC0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXhMZW4gPQogICAgICAgICAgICAgICAgICAgIGl0ZW0tPnRyYWNlUm91dGVDdGxPd25lckluZGV4TGVuOwoKICAgICAgICAgICAgICAgIHRlbXAtPnRyYWNlUm91dGVDdGxUZXN0TmFtZSA9CiAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikgbWFsbG9jKGl0ZW0tPnRyYWNlUm91dGVDdGxUZXN0TmFtZUxlbiArIDEpOwogICAgICAgICAgICAgICAgbWVtY3B5KHRlbXAtPnRyYWNlUm91dGVDdGxUZXN0TmFtZSwKICAgICAgICAgICAgICAgICAgICAgICBpdGVtLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgaXRlbS0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lTGVuICsgMSk7CiAgICAgICAgICAgICAgICB0ZW1wLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWVbaXRlbS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VSb3V0ZUN0bFRlc3ROYW1lTGVuXSA9CiAgICAgICAgICAgICAgICAgICAgJ1wwJzsKICAgICAgICAgICAgICAgIHRlbXAtPnRyYWNlUm91dGVDdGxUZXN0TmFtZUxlbiA9CiAgICAgICAgICAgICAgICAgICAgaXRlbS0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lTGVuOwoKICAgICAgICAgICAgICAgIC8qIGFkZCBsb2NrIHRvIHByb3RlY3QgKi8KICAgICAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdCBjb3VudGVyX211dGV4ID0gUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUjsKICAgICAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmY291bnRlcl9tdXRleCk7CiAgICAgICAgICAgICAgICB0ZW1wLT50cmFjZVJvdXRlSG9wc0hvcEluZGV4ID0gKytpbmRleDsKICAgICAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZjb3VudGVyX211dGV4KTsKICAgICAgICAgICAgICAgIC8qIGVuZHNhZHNhZHNhZCAqLwoKCiAgICAgICAgICAgICAgICB0ZW1wLT50cmFjZVJvdXRlSG9wc0lwVGd0QWRkcmVzc1R5cGUgPSAwOwogICAgICAgICAgICAgICAgdGVtcC0+dHJhY2VSb3V0ZUhvcHNJcFRndEFkZHJlc3MgPSBzdHJkdXAoIiIpOwogICAgICAgICAgICAgICAgdGVtcC0+dHJhY2VSb3V0ZUhvcHNJcFRndEFkZHJlc3NMZW4gPSAwOwogICAgICAgICAgICAgICAgdGVtcC0+dHJhY2VSb3V0ZUhvcHNNaW5SdHQgPSAwOwogICAgICAgICAgICAgICAgdGVtcC0+dHJhY2VSb3V0ZUhvcHNNYXhSdHQgPSAwOwogICAgICAgICAgICAgICAgdGVtcC0+dHJhY2VSb3V0ZUhvcHNBdmVyYWdlUnR0ID0gMDsKICAgICAgICAgICAgICAgIHRlbXAtPnRyYWNlUm91dGVIb3BzUnR0U3VtT2ZTcXVhcmVzID0gMDsKICAgICAgICAgICAgICAgIHRlbXAtPnRyYWNlUm91dGVIb3BzU2VudFByb2JlcyA9IDA7CiAgICAgICAgICAgICAgICB0ZW1wLT50cmFjZVJvdXRlSG9wc1Byb2JlUmVzcG9uc2VzID0gMDsKCiAgICAgICAgICAgICAgICB0ZW1wLT50cmFjZVJvdXRlSG9wc0xhc3RHb29kUHJvYmVMZW4gPSAwOwogICAgICAgICAgICAgICAgaWYgKGluZGV4ID09IDEpCiAgICAgICAgICAgICAgICAgICAgaXRlbS0+dHJhY2VSb3V0ZUhvcHMgPSB0ZW1wOwogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgKGN1cnJlbnRfdGVtcCktPm5leHQgPSB0ZW1wOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGN1cnJlbnRfdGVtcCA9IHRlbXA7CgogICAgICAgICAgICAgICAgaWYgKGluZGV4ICsgMSA+PSBpdGVtLT50cmFjZVJvdXRlQ3RsTWF4VHRsKSB7CiAgICAgICAgICAgICAgICAgICAgY3VycmVudF90ZW1wLT5uZXh0ID0gTlVMTDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoaXRlbS0+dHJhY2VSb3V0ZUhvcHMgIT0gTlVMTCkKCiAgICAgICAgICAgICAgICAgICAgaWYgKHRyYWNlUm91dGVIb3BzVGFibGVfYWRkKGN1cnJlbnRfdGVtcCkgIT0KICAgICAgICAgICAgICAgICAgICAgICAgU05NUEVSUl9TVUNDRVNTKQogICAgICAgICAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZUhvcHNUYWJsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWdpc3RlcmVkIGFuIGVudHJ5IGVycm9yXG4iKSk7CgogICAgICAgICAgICB9CiAgICAgICAgICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgbWF4UnR0ID0gMDsKICAgICAgICAgICAgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBtaW5SdHQgPSAwOwogICAgICAgICAgICByZWdpc3RlciB1bnNpZ25lZCBsb25nIGF2ZXJhZ2VSdHQgPSAwOwogICAgICAgICAgICByZWdpc3RlciB1bnNpZ25lZCBsb25nIHN1bVJ0dCA9IDA7CiAgICAgICAgICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgcmVzcG9uc2VQcm9iZSA9IDA7CiAgICAgICAgICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgc3VtT2ZTcXVhcmUgPSAwOwogICAgICAgICAgICBmb3IgKHByb2JlID0gMDsgcHJvYmUgPCBucHJvYmVzOyArK3Byb2JlKSB7CiAgICAgICAgICAgICAgICByZWdpc3RlciBpbnQgICAgY2M7CiAgICAgICAgICAgICAgICBzdHJ1Y3QgdGltZXZhbCAgdDEsIHQyOwogICAgICAgICAgICAgICAgc3RydWN0IHRpbWV6b25lIHR6OwogICAgICAgICAgICAgICAgcmVnaXN0ZXIgc3RydWN0IGlwICppcCA9IE5VTEw7CiAgICAgICAgICAgICAgICByZWdpc3RlciB1bnNpZ25lZCBsb25nIFJ0dCA9IDA7CgogICAgICAgICAgICAgICAgaWYgKHNlbnRmaXJzdCAmJiBwYXVzZW1zZWNzID4gMCkKICAgICAgICAgICAgICAgICAgICB1c2xlZXAocGF1c2Vtc2VjcyAqIDEwMDApOwogICAgICAgICAgICAgICAgKHZvaWQpIGdldHRpbWVvZmRheSgmdDEsICZ0eik7CiAgICAgICAgICAgICAgICBzZW5kX3Byb2JlKHRvLCArK3NlcSwgdHRsLCAmdDEsIG91dGlwLCBvdXR1ZHAsIHBhY2tsZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGxlbiwgaG9zdG5hbWUsIGlkZW50LCBzbmRzb2NrLCBwb3J0LAogICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRkYXRhKTsKICAgICAgICAgICAgICAgICsrc2VudGZpcnN0OwogICAgICAgICAgICAgICAgd2hpbGUgKChjYyA9CiAgICAgICAgICAgICAgICAgICAgICAgIHdhaXRfZm9yX3JlcGx5KHMsIGZyb20sICZ0MSwgcGFja2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YWl0dGltZSkpICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAodm9pZCkgZ2V0dGltZW9mZGF5KCZ0MiwgJnR6KTsKICAgICAgICAgICAgICAgICAgICB0aW1lcCA9IDA7CiAgICAgICAgICAgICAgICAgICAgdGltZSgmdGltZXApOwogICAgICAgICAgICAgICAgICAgIGkgPSBwYWNrZXRfb2socGFja2V0LCBjYywgZnJvbSwgc2VxLCBpZGVudCwgcG10dSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQpOwogICAgICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICAgICogU2tpcCBzaG9ydCBwYWNrZXQgCiAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT0gMCkKICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFnb3RsYXN0YWRkciB8fCBmcm9tLT5zaW5fYWRkci5zX2FkZHIgIT0gbGFzdGFkZHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgc3RydWN0IGlwICppcDsKICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgaW50ICAgIGhsZW47CiAgICAgICAgICAgICAgICAgICAgICAgIGlwID0gKHN0cnVjdCBpcCAqKSBwYWNrZXQ7CiAgICAgICAgICAgICAgICAgICAgICAgIGhsZW4gPSBpcC0+aXBfaGwgPDwgMjsKICAgICAgICAgICAgICAgICAgICAgICAgY2MgLT0gaGxlbjsKICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVDdGxUYWJsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgJXMiLCBpbmV0X250b2EoZnJvbS0+c2luX2FkZHIpKSk7CgoKICAgICAgICAgICAgICAgICAgICAgICAgbGFzdGFkZHIgPSBmcm9tLT5zaW5fYWRkci5zX2FkZHI7CiAgICAgICAgICAgICAgICAgICAgICAgICsrZ290bGFzdGFkZHI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIFJ0dCA9IGRlbHRhVCgmdDEsICZ0Mik7CiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VQcm9iZSA9IHJlc3BvbnNlUHJvYmUgKyAxOwogICAgICAgICAgICAgICAgICAgIGlmIChwcm9iZSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1pblJ0dCA9IFJ0dDsKICAgICAgICAgICAgICAgICAgICAgICAgbWF4UnR0ID0gUnR0OwogICAgICAgICAgICAgICAgICAgICAgICBhdmVyYWdlUnR0ID0gUnR0OwogICAgICAgICAgICAgICAgICAgICAgICBzdW1SdHQgPSBSdHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIHN1bU9mU3F1YXJlID0gUnR0ICogUnR0OwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChSdHQgPCBtaW5SdHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5SdHQgPSBSdHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChSdHQgPiBtYXhSdHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhSdHQgPSBSdHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIHN1bVJ0dCA9IChzdW1SdHQpICsgUnR0OwogICAgICAgICAgICAgICAgICAgICAgICBhdmVyYWdlUnR0ID0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdW5kKChkb3VibGUpIChzdW1SdHQpIC8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkb3VibGUpIHJlc3BvbnNlUHJvYmUpOwogICAgICAgICAgICAgICAgICAgICAgICBzdW1PZlNxdWFyZSA9IHN1bU9mU3F1YXJlICsgUnR0ICogUnR0OwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgU3RvcmFnZVJlc3VsdHMtPnRyYWNlUm91dGVSZXN1bHRzQ3VyUHJvYmVDb3VudCA9CiAgICAgICAgICAgICAgICAgICAgICAgIHByb2JlICsgMTsKICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PSAtMikgewojaWZuZGVmIEFSQ0hBSUMKICAgICAgICAgICAgICAgICAgICAgICAgaXAgPSAoc3RydWN0IGlwICopIHBhY2tldDsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlwLT5pcF90dGwgPD0gMSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50ZigiICEiKTsKI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgICAgICsrZ290X3RoZXJlOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgICAgKiB0aW1lIGV4Y2VlZGVkIGluIHRyYW5zaXQgCiAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT0gLTEpCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNvZGUgPSBpIC0gMTsKICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGNvZGUpIHsKCiAgICAgICAgICAgICAgICAgICAgY2FzZSBJQ01QX1VOUkVBQ0hfUE9SVDoKI2lmbmRlZiBBUkNIQUlDCiAgICAgICAgICAgICAgICAgICAgICAgIGlwID0gKHN0cnVjdCBpcCAqKSBwYWNrZXQ7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpcC0+aXBfdHRsIDw9IDEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmludGYoIiAhIik7CiNlbmRpZgogICAgICAgICAgICAgICAgICAgICAgICArK2dvdF90aGVyZTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgICAgIGNhc2UgSUNNUF9VTlJFQUNIX05FVDoKICAgICAgICAgICAgICAgICAgICAgICAgKyt1bnJlYWNoYWJsZTsKICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRmKCIgIU4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgICAgIGNhc2UgSUNNUF9VTlJFQUNIX0hPU1Q6CiAgICAgICAgICAgICAgICAgICAgICAgICsrdW5yZWFjaGFibGU7CiAgICAgICAgICAgICAgICAgICAgICAgIFByaW50ZigiICFIIik7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgICAgICBjYXNlIElDTVBfVU5SRUFDSF9QUk9UT0NPTDoKICAgICAgICAgICAgICAgICAgICAgICAgKytnb3RfdGhlcmU7CiAgICAgICAgICAgICAgICAgICAgICAgIFByaW50ZigiICFQIik7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgICAgICBjYXNlIElDTVBfVU5SRUFDSF9ORUVERlJBRzoKICAgICAgICAgICAgICAgICAgICAgICAgKyt1bnJlYWNoYWJsZTsKICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRmKCIgIUYtJWQiLCBwbXR1KTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgICAgIGNhc2UgSUNNUF9VTlJFQUNIX1NSQ0ZBSUw6CiAgICAgICAgICAgICAgICAgICAgICAgICsrdW5yZWFjaGFibGU7CiAgICAgICAgICAgICAgICAgICAgICAgIFByaW50ZigiICFTIik7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgICAgICBjYXNlIElDTVBfVU5SRUFDSF9GSUxURVJfUFJPSElCOgogICAgICAgICAgICAgICAgICAgICAgICArK3VucmVhY2hhYmxlOwogICAgICAgICAgICAgICAgICAgICAgICBQcmludGYoIiAhWCIpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICAgICAgY2FzZSBJQ01QX1VOUkVBQ0hfSE9TVF9QUkVDRURFTkNFOgogICAgICAgICAgICAgICAgICAgICAgICArK3VucmVhY2hhYmxlOwogICAgICAgICAgICAgICAgICAgICAgICBQcmludGYoIiAhViIpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICAgICAgY2FzZSBJQ01QX1VOUkVBQ0hfUFJFQ0VERU5DRV9DVVRPRkY6CiAgICAgICAgICAgICAgICAgICAgICAgICsrdW5yZWFjaGFibGU7CiAgICAgICAgICAgICAgICAgICAgICAgIFByaW50ZigiICFDIik7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICArK3VucmVhY2hhYmxlOwogICAgICAgICAgICAgICAgICAgICAgICBQcmludGYoIiAhPCVkPiIsIGNvZGUpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoY2MgPT0gMCkgewogICAgICAgICAgICAgICAgICAgIHRpbWVwID0gMDsKICAgICAgICAgICAgICAgICAgICB0aW1lKCZ0aW1lcCk7CiAgICAgICAgICAgICAgICAgICAgUHJpbnRmKCIgKiIpOwogICAgICAgICAgICAgICAgICAgIFJ0dCA9IChpdGVtLT50cmFjZVJvdXRlQ3RsVGltZU91dCkgKiAxMDAwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGl0ZW0tPnRyYWNlUm91dGVDdGxNYXhSb3dzICE9IDApIHsKCiAgICAgICAgICAgICAgICAgICAgdGVtcF9oaXMgPQogICAgICAgICAgICAgICAgICAgICAgICBTTk1QX01BTExPQ19TVFJVQ1QKICAgICAgICAgICAgICAgICAgICAgICAgKHRyYWNlUm91dGVQcm9iZUhpc3RvcnlUYWJsZV9kYXRhKTsKICAgICAgICAgICAgICAgICAgICB0ZW1wX2hpcy0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXggPQogICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKSBtYWxsb2MoaXRlbS0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXhMZW4gKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7CiAgICAgICAgICAgICAgICAgICAgbWVtY3B5KHRlbXBfaGlzLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPnRyYWNlUm91dGVDdGxPd25lckluZGV4TGVuICsgMSk7CiAgICAgICAgICAgICAgICAgICAgdGVtcF9oaXMtPnRyYWNlUm91dGVDdGxPd25lckluZGV4W2l0ZW0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZVJvdXRlQ3RsT3duZXJJbmRleExlbl0KICAgICAgICAgICAgICAgICAgICAgICAgPSAnXDAnOwogICAgICAgICAgICAgICAgICAgIHRlbXBfaGlzLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleExlbiA9CiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPnRyYWNlUm91dGVDdGxPd25lckluZGV4TGVuOwoKICAgICAgICAgICAgICAgICAgICB0ZW1wX2hpcy0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lID0KICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikgbWFsbG9jKGl0ZW0tPnRyYWNlUm91dGVDdGxUZXN0TmFtZUxlbiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsKICAgICAgICAgICAgICAgICAgICBtZW1jcHkodGVtcF9oaXMtPnRyYWNlUm91dGVDdGxUZXN0TmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWVMZW4gKyAxKTsKICAgICAgICAgICAgICAgICAgICB0ZW1wX2hpcy0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lW2l0ZW0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VSb3V0ZUN0bFRlc3ROYW1lTGVuXQogICAgICAgICAgICAgICAgICAgICAgICA9ICdcMCc7CiAgICAgICAgICAgICAgICAgICAgdGVtcF9oaXMtPnRyYWNlUm91dGVDdGxUZXN0TmFtZUxlbiA9CiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPnRyYWNlUm91dGVDdGxUZXN0TmFtZUxlbjsKCiAgICAgICAgICAgICAgICAgICAgLyogYWRkIGxvY2sgdG8gcHJvdGVjdCAqLwogICAgICAgICAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdCBjb3VudGVyX211dGV4ID0KICAgICAgICAgICAgICAgICAgICAgICAgUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUjsKICAgICAgICAgICAgICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJmNvdW50ZXJfbXV0ZXgpOwogICAgICAgICAgICAgICAgICAgIGlmIChpdGVtLT50cmFjZVJvdXRlUHJvYmVIaXN0b3J5TWF4SW5kZXggPj0KICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpICgyMTQ3NDgzNjQ3KSkKICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS0+dHJhY2VSb3V0ZVByb2JlSGlzdG9yeU1heEluZGV4ID0gMDsKICAgICAgICAgICAgICAgICAgICB0ZW1wX2hpcy0+dHJhY2VSb3V0ZVByb2JlSGlzdG9yeUluZGV4ID0KICAgICAgICAgICAgICAgICAgICAgICAgKysoaXRlbS0+dHJhY2VSb3V0ZVByb2JlSGlzdG9yeU1heEluZGV4KTsKICAgICAgICAgICAgICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmY291bnRlcl9tdXRleCk7CiAgICAgICAgICAgICAgICAgICAgLyogZW5kc2Fkc2Fkc2FkICovCiAgICAgICAgICAgICAgICAgICAgdGVtcF9oaXMtPnRyYWNlUm91dGVQcm9iZUhpc3RvcnlIb3BJbmRleCA9IHR0bDsKICAgICAgICAgICAgICAgICAgICB0ZW1wX2hpcy0+dHJhY2VSb3V0ZVByb2JlSGlzdG9yeVByb2JlSW5kZXggPSBwcm9iZSArIDE7CgogICAgICAgICAgICAgICAgICAgIHRlbXBfaGlzLT50cmFjZVJvdXRlUHJvYmVIaXN0b3J5SEFkZHJUeXBlID0gMTsKICAgICAgICAgICAgICAgICAgICB0ZW1wX2hpcy0+dHJhY2VSb3V0ZVByb2JlSGlzdG9yeUhBZGRyID0KICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikgbWFsbG9jKHN0cmxlbihpbmV0X250b2EoZnJvbS0+c2luX2FkZHIpKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsKICAgICAgICAgICAgICAgICAgICBzdHJjcHkodGVtcF9oaXMtPnRyYWNlUm91dGVQcm9iZUhpc3RvcnlIQWRkciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgKGluZXRfbnRvYShmcm9tLT5zaW5fYWRkcikpKTsKICAgICAgICAgICAgICAgICAgICB0ZW1wX2hpcy0+CiAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlUm91dGVQcm9iZUhpc3RvcnlIQWRkcltzdHJsZW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbmV0X250b2EKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZnJvbS0+c2luX2FkZHIpKV0gPQogICAgICAgICAgICAgICAgICAgICAgICAnXDAnOwogICAgICAgICAgICAgICAgICAgIHRlbXBfaGlzLT50cmFjZVJvdXRlUHJvYmVIaXN0b3J5SEFkZHJMZW4gPQogICAgICAgICAgICAgICAgICAgICAgICBzdHJsZW4oaW5ldF9udG9hKGZyb20tPnNpbl9hZGRyKSk7CgogICAgICAgICAgICAgICAgICAgIHRlbXBfaGlzLT50cmFjZVJvdXRlUHJvYmVIaXN0b3J5UmVzcG9uc2UgPSBSdHQ7CiAgICAgICAgICAgICAgICAgICAgdGVtcF9oaXMtPnRyYWNlUm91dGVQcm9iZUhpc3RvcnlTdGF0dXMgPSAxOwogICAgICAgICAgICAgICAgICAgIHRlbXBfaGlzLT50cmFjZVJvdXRlUHJvYmVIaXN0b3J5TGFzdFJDID0gMDsKCgkJICAgIHRlbXBfaGlzLT50cmFjZVJvdXRlUHJvYmVIaXN0b3J5VGltZV90aW1lID0gdGltZXA7CiAgICAgICAgICAgICAgICAgICAgdGVtcF9oaXMtPnRyYWNlUm91dGVQcm9iZUhpc3RvcnlUaW1lID0KICAgICAgICAgICAgICAgICAgICAgICAgbmV0c25tcF9tZW1kdXAoZGF0ZV9uX3RpbWUoJnRpbWVwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZW1wX2hpcy0+dHJhY2VSb3V0ZVByb2JlSGlzdG9yeVRpbWVMZW4pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHByb2JlID09IDApCiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPnRyYWNlUm91dGVQcm9iZUhpcyA9IHRlbXBfaGlzOwogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAoY3VycmVudF90ZW1wX2hpcyktPm5leHQgPSB0ZW1wX2hpczsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfdGVtcF9oaXMgPSB0ZW1wX2hpczsKCiAgICAgICAgICAgICAgICAgICAgaWYgKHByb2JlICsgMSA+PSBucHJvYmVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfdGVtcF9oaXMtPm5leHQgPSBOVUxMOwoKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGlmIChpdGVtLT50cmFjZVJvdXRlUHJvYmVIaXMgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodHJhY2VSb3V0ZVByb2JlSGlzdG9yeVRhYmxlX2NvdW50KGl0ZW0pIDwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPnRyYWNlUm91dGVDdGxNYXhSb3dzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHJhY2VSb3V0ZVByb2JlSGlzdG9yeVRhYmxlX2FkZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjdXJyZW50X3RlbXBfaGlzKSAhPSBTTk1QRVJSX1NVQ0NFU1MpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVQcm9iZUhpc3RvcnlUYWJsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlZ2lzdGVyZWQgYW4gZW50cnkgZXJyb3JcbiIpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlUm91dGVQcm9iZUhpc3RvcnlUYWJsZV9kZWxMYXN0KGl0ZW0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRyYWNlUm91dGVQcm9iZUhpc3RvcnlUYWJsZV9hZGQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY3VycmVudF90ZW1wX2hpcykgIT0gU05NUEVSUl9TVUNDRVNTKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlUHJvYmVIaXN0b3J5VGFibGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWdpc3RlcmVkIGFuIGVudHJ5IGVycm9yXG4iKSk7CgogICAgICAgICAgICAgICAgICAgICAgICB9CgkJICAgIH0KCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKGl0ZW0tPnRyYWNlUm91dGVDdGxDcmVhdGVIb3BzRW50cmllcyA9PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgbmV0c25tcF92YXJpYWJsZV9saXN0ICp2YXJzX2hvcHMgPSBOVUxMOwogICAgICAgICAgICAgICAgICAgIHNubXBfdmFybGlzdF9hZGRfdmFyaWFibGUoJnZhcnNfaG9wcywgTlVMTCwgMCwgQVNOX09DVEVUX1NUUiwgKGNoYXIgKikgaXRlbS0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXgsIGl0ZW0tPnRyYWNlUm91dGVDdGxPd25lckluZGV4TGVuKTsgICAgLyogIHRyYWNlUm91dGVDdGxPd25lckluZGV4ICAqLwogICAgICAgICAgICAgICAgICAgIHNubXBfdmFybGlzdF9hZGRfdmFyaWFibGUoJnZhcnNfaG9wcywgTlVMTCwgMCwgQVNOX09DVEVUX1NUUiwgKGNoYXIgKikgaXRlbS0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lLCBpdGVtLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWVMZW4pOyAgICAgICAgLyogIHRyYWNlUm91dGVDdGxUZXN0TmFtZSAgKi8KICAgICAgICAgICAgICAgICAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzX2hvcHMsIE5VTEwsIDAsIEFTTl9VTlNJR05FRCwgKGNoYXIgKikgJmluZGV4LCBzaXplb2YoaW5kZXgpKTsgICAgICAgLyogIHRyYWNlUm91dGVIb3BzSW5kZXggICovCiAgICAgICAgICAgICAgICAgICAgaWYgKChjdXJyZW50ID0KICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcl9jb21wbGV4X2dldCh0cmFjZVJvdXRlSG9wc1RhYmxlU3RvcmFnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJzX2hvcHMpKSA9PSBOVUxMKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgc25tcF9mcmVlX3ZhcmJpbmQodmFyc19ob3BzKTsKICAgICAgICAgICAgICAgICAgICB2YXJzX2hvcHMgPSBOVUxMOwoKICAgICAgICAgICAgICAgICAgICBjdXJyZW50LT50cmFjZVJvdXRlSG9wc0lwVGd0QWRkcmVzc1R5cGUgPSAxOwogICAgICAgICAgICAgICAgICAgIGN1cnJlbnQtPnRyYWNlUm91dGVIb3BzSXBUZ3RBZGRyZXNzID0KICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikgbWFsbG9jKHN0cmxlbihpbmV0X250b2EoZnJvbS0+c2luX2FkZHIpKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsKICAgICAgICAgICAgICAgICAgICBjdXJyZW50LT50cmFjZVJvdXRlSG9wc0lwVGd0QWRkcmVzcyA9CiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmR1cChpbmV0X250b2EoZnJvbS0+c2luX2FkZHIpKTsKICAgICAgICAgICAgICAgICAgICBjdXJyZW50LT4KICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VSb3V0ZUhvcHNJcFRndEFkZHJlc3Nbc3RybGVuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbmV0X250b2EKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmcm9tLT5zaW5fYWRkcikpXSA9CiAgICAgICAgICAgICAgICAgICAgICAgICdcMCc7CiAgICAgICAgICAgICAgICAgICAgY3VycmVudC0+dHJhY2VSb3V0ZUhvcHNJcFRndEFkZHJlc3NMZW4gPQogICAgICAgICAgICAgICAgICAgICAgICBzdHJsZW4oaW5ldF9udG9hKGZyb20tPnNpbl9hZGRyKSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGNvdW50ICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmNtcAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9sZF9Ib3BzQWRkcmVzc1tpbmRleCAtIDFdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQtPnRyYWNlUm91dGVIb3BzSXBUZ3RBZGRyZXNzKSAhPSAwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZyA9IDE7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBjdXJyZW50LT50cmFjZVJvdXRlSG9wc0lwVGd0QWRkcmVzc0xlbiA9CiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmxlbihpbmV0X250b2EoZnJvbS0+c2luX2FkZHIpKTsKICAgICAgICAgICAgICAgICAgICBjdXJyZW50LT50cmFjZVJvdXRlSG9wc01pblJ0dCA9IG1pblJ0dDsKICAgICAgICAgICAgICAgICAgICBjdXJyZW50LT50cmFjZVJvdXRlSG9wc01heFJ0dCA9IG1heFJ0dDsKICAgICAgICAgICAgICAgICAgICBjdXJyZW50LT50cmFjZVJvdXRlSG9wc0F2ZXJhZ2VSdHQgPSBhdmVyYWdlUnR0OwogICAgICAgICAgICAgICAgICAgIGN1cnJlbnQtPnRyYWNlUm91dGVIb3BzUnR0U3VtT2ZTcXVhcmVzID0gc3VtT2ZTcXVhcmU7CiAgICAgICAgICAgICAgICAgICAgY3VycmVudC0+dHJhY2VSb3V0ZUhvcHNTZW50UHJvYmVzID0gcHJvYmUgKyAxOwogICAgICAgICAgICAgICAgICAgIGN1cnJlbnQtPnRyYWNlUm91dGVIb3BzUHJvYmVSZXNwb25zZXMgPSByZXNwb25zZVByb2JlOwoJCSAgICBjdXJyZW50LT50cmFjZVJvdXRlSG9wc0xhc3RHb29kUHJvYmVfdGltZSA9IHRpbWVwOwogICAgICAgICAgICAgICAgICAgIGN1cnJlbnQtPnRyYWNlUm91dGVIb3BzTGFzdEdvb2RQcm9iZSA9CiAgICAgICAgICAgICAgICAgICAgICAgIG5ldHNubXBfbWVtZHVwKGRhdGVfbl90aW1lKCZ0aW1lcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3VycmVudC0+dHJhY2VSb3V0ZUhvcHNMYXN0R29vZFByb2JlTGVuKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICh2b2lkKSBmZmx1c2goc3Rkb3V0KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBwdXRjaGFyKCdcbicpOwoKCiAgICAgICAgICAgIGlmIChnb3RfdGhlcmUKICAgICAgICAgICAgICAgIHx8ICh1bnJlYWNoYWJsZSA+IDAgJiYgdW5yZWFjaGFibGUgPj0gbnByb2JlcyAtIDEpKSB7CgogICAgICAgICAgICAgICAgaWYgKGdvdF90aGVyZSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgU3RvcmFnZVJlc3VsdHMtPnRyYWNlUm91dGVSZXN1bHRzVGVzdEF0dGVtcHRzID0KICAgICAgICAgICAgICAgICAgICAgICAgU3RvcmFnZVJlc3VsdHMtPnRyYWNlUm91dGVSZXN1bHRzVGVzdEF0dGVtcHRzICsgMTsKCiAgICAgICAgICAgICAgICAgICAgU3RvcmFnZVJlc3VsdHMtPnRyYWNlUm91dGVSZXN1bHRzVGVzdFN1Y2Nlc3NlcyA9CiAgICAgICAgICAgICAgICAgICAgICAgIFN0b3JhZ2VSZXN1bHRzLT50cmFjZVJvdXRlUmVzdWx0c1Rlc3RTdWNjZXNzZXMgKyAxOwoKCQkgICAgU3RvcmFnZVJlc3VsdHMtPnRyYWNlUm91dGVSZXN1bHRzTGFzdEdvb2RQYXRoX3RpbWUgPSB0aW1lcDsKICAgICAgICAgICAgICAgICAgICBTdG9yYWdlUmVzdWx0cy0+dHJhY2VSb3V0ZVJlc3VsdHNMYXN0R29vZFBhdGggPQogICAgICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX21lbWR1cChkYXRlX25fdGltZSgmdGltZXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVJlc3VsdHMtPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VSb3V0ZVJlc3VsdHNMYXN0R29vZFBhdGhMZW4pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKChpdGVtLT4KICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlUm91dGVDdGxUcmFwR2VuZXJhdGlvblswXSAmCiAgICAgICAgICAgICAgICAgICAgICAgICBUUkFDRVJPVVRFVFJBUEdFTkVSQVRJT05fVEVTVENPTVBMRVRFRCkgIT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZVByb2JlSGlzdG9yeVRhYmxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRFU1QgY29tcGxldGVkIVxuIikpOwogICAgICAgICAgICAgICAgICAgICAgICBzZW5kX3RyYWNlUm91dGVfdHJhcChpdGVtLCB0cmFjZVJvdXRlVGVzdENvbXBsZXRlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0cmFjZVJvdXRlVGVzdENvbXBsZXRlZCkgLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yob2lkKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIFN0b3JhZ2VSZXN1bHRzLT50cmFjZVJvdXRlUmVzdWx0c1Rlc3RBdHRlbXB0cyA9CiAgICAgICAgICAgICAgICAgICAgICAgIFN0b3JhZ2VSZXN1bHRzLT50cmFjZVJvdXRlUmVzdWx0c1Rlc3RBdHRlbXB0cyArIDE7CiAgICAgICAgICAgICAgICAgICAgaWYgKChpdGVtLT4KICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlUm91dGVDdGxUcmFwR2VuZXJhdGlvblswXSAmCiAgICAgICAgICAgICAgICAgICAgICAgICBUUkFDRVJPVVRFVFJBUEdFTkVSQVRJT05fVEVTVEZBSUxFRCkgIT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZVByb2JlSGlzdG9yeVRhYmxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRlc3QgRmFpbGVkIVxuIikpOwogICAgICAgICAgICAgICAgICAgICAgICBzZW5kX3RyYWNlUm91dGVfdHJhcChpdGVtLCB0cmFjZVJvdXRlVGVzdEZhaWxlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHRyYWNlUm91dGVUZXN0RmFpbGVkKSAvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihvaWQpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIH0gZWxzZSBpZiAodHRsID09IGl0ZW0tPnRyYWNlUm91dGVDdGxNYXhUdGwKICAgICAgICAgICAgICAgICAgICAgICAmJiAocHJvYmUgKyAxKSA9PSBucHJvYmVzKSB7CiAgICAgICAgICAgICAgICBTdG9yYWdlUmVzdWx0cy0+dHJhY2VSb3V0ZVJlc3VsdHNUZXN0QXR0ZW1wdHMgPQogICAgICAgICAgICAgICAgICAgIFN0b3JhZ2VSZXN1bHRzLT50cmFjZVJvdXRlUmVzdWx0c1Rlc3RBdHRlbXB0cyArIDE7CgogICAgICAgICAgICAgICAgaWYgKChpdGVtLT4KICAgICAgICAgICAgICAgICAgICAgdHJhY2VSb3V0ZUN0bFRyYXBHZW5lcmF0aW9uWzBdICYKICAgICAgICAgICAgICAgICAgICAgVFJBQ0VST1VURVRSQVBHRU5FUkFUSU9OX1RFU1RGQUlMRUQpICE9IDApIHsKICAgICAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZVByb2JlSGlzdG9yeVRhYmxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGVzdCBGYWlsZWQhXG4iKSk7CiAgICAgICAgICAgICAgICAgICAgc2VuZF90cmFjZVJvdXRlX3RyYXAoaXRlbSwgdHJhY2VSb3V0ZVRlc3RGYWlsZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHRyYWNlUm91dGVUZXN0RmFpbGVkKSAvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9pZCkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgIH0KCiAgICAgICAgY2xvc2Uoc25kc29jayk7CgogICAgICAgIGlmIChmbGFnID09IDEpIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVQcm9iZUhpc3RvcnlUYWJsZSIsICJwYXRoIGNoYW5nZWQhXG4iKSk7CiAgICAgICAgICAgIHNlbmRfdHJhY2VSb3V0ZV90cmFwKGl0ZW0sIHRyYWNlUm91dGVQYXRoQ2hhbmdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodHJhY2VSb3V0ZVBhdGhDaGFuZ2UpIC8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9pZCkpOwogICAgICAgIH0KCiAgICAgICAgaW50ICAgICAgICAgICAgIGsgPSAwOwogICAgICAgIGZvciAoayA9IDA7IGsgPCBjb3VudDsgaysrKSB7CiAgICAgICAgICAgIGZyZWUob2xkX0hvcHNBZGRyZXNzW2tdKTsKICAgICAgICAgICAgb2xkX0hvcHNBZGRyZXNzW2tdID0gTlVMTDsKICAgICAgICB9CiAgICB9CiAgICBpZiAoaXRlbS0+dHJhY2VSb3V0ZUN0bFRhcmdldEFkZHJlc3NUeXBlID09IDIpIHsKICAgICAgICBpbnQgICAgICAgICAgICAgaWNtcF9zb2NrID0gMDsgIC8qIHJlY2VpdmUgKGljbXApIHNvY2tldCBmaWxlIGRlc2NyaXB0b3IgKi8KICAgICAgICBpbnQgICAgICAgICAgICAgc25kc29jayA9IDA7ICAgIC8qIHNlbmQgKHVkcCkgc29ja2V0IGZpbGUgZGVzY3JpcHRvciAqLwoKICAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfaW42IHdoZXJldG87ICAgIC8qIFdobyB0byB0cnkgdG8gcmVhY2ggKi8KCiAgICAgICAgc3RydWN0IHNvY2thZGRyX2luNiBzYWRkcjsKICAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfaW42IGZpcnN0aG9wOwogICAgICAgIGNoYXIgICAgICAgICAgICpzb3VyY2UgPSBOVUxMOwogICAgICAgIGNoYXIgICAgICAgICAgICpkZXZpY2UgPSBOVUxMOwogICAgICAgIGNoYXIgICAgICAgICAgICpob3N0bmFtZSA9IE5VTEw7CgogICAgICAgIHBpZF90ICAgICAgICAgICBpZGVudCA9IDA7CiAgICAgICAgdV9zaG9ydCAgICAgICAgIHBvcnQgPSAzMjc2OCArIDY2NjsgICAgIC8qIHN0YXJ0IHVkcCBkZXN0IHBvcnQgIyBmb3IgcHJvYmUgcGFja2V0cyAqLwogICAgICAgIGludCAgICAgICAgICAgICBvcHRpb25zID0gMDsgICAgLyogc29ja2V0IG9wdGlvbnMgKi8KICAgICAgICBpbnQgICAgICAgICAgICAgd2FpdHRpbWUgPSA1OyAgIC8qIHRpbWUgdG8gd2FpdCBmb3IgcmVzcG9uc2UgKGluIHNlY29uZHMpICovCgogICAgICAgIGNoYXIgICAgICAgICAgICpzZW5kYnVmZiA9IE5VTEw7CiAgICAgICAgaW50ICAgICAgICAgICAgIGRhdGFsZW4gPSBzaXplb2Yoc3RydWN0IHBrdF9mb3JtYXQpOwoKICAgICAgICB1X2NoYXIgICAgICAgICAgcGFja2V0WzUxMl07ICAgIC8qIGxhc3QgaW5ib3VuZCAoaWNtcCkgcGFja2V0ICovCgogICAgICAgIGNoYXIgICAgICAgICAgICBwYVs2NF07CiAgICAgICAgc3RydWN0IGhvc3RlbnQgKmhwID0gTlVMTDsKICAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfaW42IGZyb20sICp0byA9IE5VTEw7CiAgICAgICAgaW50ICAgICAgICAgICAgIGkgPSAwLCBvbiA9IDAsIHByb2JlID0gMCwgc2VxID0gMCwgdG9zID0KICAgICAgICAgICAgMCwgdHRsID0gMDsKICAgICAgICBpbnQgICAgICAgICAgICAgc29ja2V0X2Vycm5vID0gMDsKCiAgICAgICAgaWNtcF9zb2NrID0gc29ja2V0KEFGX0lORVQ2LCBTT0NLX1JBVywgSVBQUk9UT19JQ01QVjYpOwogICAgICAgIHNvY2tldF9lcnJubyA9IGVycm5vOwoKICAgICAgICBzZXR1aWQoZ2V0dWlkKCkpOwoKICAgICAgICBvbiA9IDE7CiAgICAgICAgc2VxID0gdG9zID0gMDsKICAgICAgICB0byA9IChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopICZ3aGVyZXRvOwoKICAgICAgICBob3N0bmFtZSA9CiAgICAgICAgICAgIChjaGFyICopIG1hbGxvYyhpdGVtLT50cmFjZVJvdXRlQ3RsVGFyZ2V0QWRkcmVzc0xlbiArIDEpOwogICAgICAgIG1lbWNweShob3N0bmFtZSwgaXRlbS0+dHJhY2VSb3V0ZUN0bFRhcmdldEFkZHJlc3MsCiAgICAgICAgICAgICAgIGl0ZW0tPnRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzTGVuICsgMSk7CiAgICAgICAgaG9zdG5hbWVbaXRlbS0+dHJhY2VSb3V0ZUN0bFRhcmdldEFkZHJlc3NMZW5dID0gJ1wwJzsKCiAgICAgICAgc2V0bGluZWJ1ZihzdGRvdXQpOwoKICAgICAgICBtZW1zZXQoJndoZXJldG8sICdcMCcsIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW42KSk7CgogICAgICAgIHRvLT5zaW42X2ZhbWlseSA9IEFGX0lORVQ2OwogICAgICAgIHRvLT5zaW42X3BvcnQgPSBodG9ucyhwb3J0KTsKCiAgICAgICAgaWYgKGluZXRfcHRvbihBRl9JTkVUNiwgaG9zdG5hbWUsICZ0by0+c2luNl9hZGRyKSA8PSAwKSB7CiAgICAgICAgICAgIGhwID0gZ2V0aG9zdGJ5bmFtZTIoaG9zdG5hbWUsIEFGX0lORVQ2KTsKICAgICAgICAgICAgaWYgKGhwICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgIG1lbW1vdmUoKGNhZGRyX3QpICYgdG8tPnNpbjZfYWRkciwgaHAtPmhfYWRkciwgMTYpOwogICAgICAgICAgICAgICAgaG9zdG5hbWUgPSAoY2hhciAqKSBocC0+aF9uYW1lOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgKHZvaWQpIGZwcmludGYoc3RkZXJyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRyYWNlcm91dGU6IHVua25vd24gaG9zdCAlc1xuIiwgaG9zdG5hbWUpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZpcnN0aG9wID0gKnRvOwoKICAgICAgICBkYXRhbGVuID0gaXRlbS0+dHJhY2VSb3V0ZUN0bERhdGFTaXplOwogICAgICAgIGlmIChkYXRhbGVuIDwgKGludCkgc2l6ZW9mKHN0cnVjdCBwa3RfZm9ybWF0KQogICAgICAgICAgICB8fCBkYXRhbGVuID49IE1BWFBBQ0tFVCkgewogICAgICAgICAgICBGcHJpbnRmKHN0ZGVyciwKICAgICAgICAgICAgICAgICAgICAidHJhY2Vyb3V0ZTogcGFja2V0IHNpemUgbXVzdCBiZSAlZCA8PSBzIDwgJWQuXG4iLAogICAgICAgICAgICAgICAgICAgIChpbnQpIHNpemVvZihzdHJ1Y3QgcGt0X2Zvcm1hdCksIE1BWFBBQ0tFVCk7CiAgICAgICAgICAgIGRhdGFsZW4gPSAxNjsKICAgICAgICB9CgogICAgICAgIGlkZW50ID0gZ2V0cGlkKCk7CgogICAgICAgIHNlbmRidWZmID0gbWFsbG9jKGRhdGFsZW4pOwogICAgICAgIGlmIChzZW5kYnVmZiA9PSBOVUxMKSB7CiAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAibWFsbG9jIGZhaWxlZFxuIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIGlmIChpY21wX3NvY2sgPCAwKSB7CiAgICAgICAgICAgIGVycm5vID0gc29ja2V0X2Vycm5vOwogICAgICAgICAgICBwZXJyb3IoInRyYWNlcm91dGU2OiBpY21wIHNvY2tldCIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBpZiAob3B0aW9ucyAmIFNPX0RFQlVHKQogICAgICAgICAgICBzZXRzb2Nrb3B0KGljbXBfc29jaywgU09MX1NPQ0tFVCwgU09fREVCVUcsCiAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikgJm9uLCBzaXplb2Yob24pKTsKICAgICAgICBpZiAob3B0aW9ucyAmIFNPX0RPTlRST1VURSkKICAgICAgICAgICAgc2V0c29ja29wdChpY21wX3NvY2ssIFNPTF9TT0NLRVQsIFNPX0RPTlRST1VURSwKICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKSAmb24sIHNpemVvZihvbikpOwoKICAgICAgICBpZiAoKHNuZHNvY2sgPSBzb2NrZXQoQUZfSU5FVDYsIFNPQ0tfREdSQU0sIDApKSA8IDApIHsKICAgICAgICAgICAgcGVycm9yKCJ0cmFjZXJvdXRlOiBVRFAgc29ja2V0Iik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiNpZmRlZiBTT19TTkRCVUYKICAgICAgICBpZiAoc2V0c29ja29wdChzbmRzb2NrLCBTT0xfU09DS0VULCBTT19TTkRCVUYsIChjaGFyICopICZkYXRhbGVuLAogICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihkYXRhbGVuKSkgPCAwKSB7CiAgICAgICAgICAgIHBlcnJvcigidHJhY2Vyb3V0ZTogU09fU05EQlVGIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU09fU05EQlVGICovCgogICAgICAgIGlmIChvcHRpb25zICYgU09fREVCVUcpCiAgICAgICAgICAgICh2b2lkKSBzZXRzb2Nrb3B0KHNuZHNvY2ssIFNPTF9TT0NLRVQsIFNPX0RFQlVHLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKSAmb24sIHNpemVvZihvbikpOwogICAgICAgIGlmIChvcHRpb25zICYgU09fRE9OVFJPVVRFKQogICAgICAgICAgICAodm9pZCkgc2V0c29ja29wdChzbmRzb2NrLCBTT0xfU09DS0VULCBTT19ET05UUk9VVEUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopICZvbiwgc2l6ZW9mKG9uKSk7CgogICAgICAgIGlmIChzb3VyY2UgPT0gTlVMTCkgewogICAgICAgICAgICBzb2NrbGVuX3QgICAgICAgYWxlbjsKICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHByb2JlX2ZkID0gc29ja2V0KEFGX0lORVQ2LCBTT0NLX0RHUkFNLCAwKTsKCiAgICAgICAgICAgIGlmIChwcm9iZV9mZCA8IDApIHsKICAgICAgICAgICAgICAgIHBlcnJvcigic29ja2V0Iik7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGRldmljZSkgewogICAgICAgICAgICAgICAgaWYgKHNldHNvY2tvcHQKICAgICAgICAgICAgICAgICAgICAocHJvYmVfZmQsIFNPTF9TT0NLRVQsIFNPX0JJTkRUT0RFVklDRSwgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICBzdHJsZW4oZGV2aWNlKSArIDEpID09IC0xKQogICAgICAgICAgICAgICAgICAgIHBlcnJvcigiV0FSTklORzogaW50ZXJmYWNlIGlzIGlnbm9yZWQiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmaXJzdGhvcC5zaW42X3BvcnQgPSBodG9ucygxMDI1KTsKICAgICAgICAgICAgaWYgKGNvbm5lY3QKICAgICAgICAgICAgICAgIChwcm9iZV9mZCwgKHN0cnVjdCBzb2NrYWRkciAqKSAmZmlyc3Rob3AsCiAgICAgICAgICAgICAgICAgc2l6ZW9mKGZpcnN0aG9wKSkgPT0gLTEpIHsKICAgICAgICAgICAgICAgIHBlcnJvcigiY29ubmVjdCIpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGFsZW4gPSBzaXplb2Yoc2FkZHIpOwogICAgICAgICAgICBpZiAoZ2V0c29ja25hbWUocHJvYmVfZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJnNhZGRyLCAmYWxlbikgPT0KICAgICAgICAgICAgICAgIC0xKSB7CiAgICAgICAgICAgICAgICBwZXJyb3IoImdldHNvY2tuYW1lIik7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2FkZHIuc2luNl9wb3J0ID0gMDsKICAgICAgICAgICAgY2xvc2UocHJvYmVfZmQpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIG1lbXNldCgmc2FkZHIsICdcMCcsIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW42KSk7CiAgICAgICAgICAgIHNhZGRyLnNpbjZfZmFtaWx5ID0gQUZfSU5FVDY7CiAgICAgICAgICAgIGlmIChpbmV0X3B0b24oQUZfSU5FVDYsIHNvdXJjZSwgJnNhZGRyLnNpbjZfYWRkcikgPCAwKSB7CiAgICAgICAgICAgICAgICBQcmludGYoInRyYWNlcm91dGU6IHVua25vd24gYWRkciAlc1xuIiwgc291cmNlKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKGJpbmQoc25kc29jaywgKHN0cnVjdCBzb2NrYWRkciAqKSAmc2FkZHIsIHNpemVvZihzYWRkcikpIDwgMCkgewogICAgICAgICAgICBwZXJyb3IoInRyYWNlcm91dGU6IGJpbmQgc2VuZGluZyBzb2NrZXQiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAoYmluZChpY21wX3NvY2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikgJnNhZGRyLCBzaXplb2Yoc2FkZHIpKSA8IDApIHsKICAgICAgICAgICAgcGVycm9yKCJ0cmFjZXJvdXRlOiBiaW5kIGljbXA2IHNvY2tldCIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBGcHJpbnRmKHN0ZGVyciwgInRyYWNlcm91dGUgdG8gJXMgKCVzKSIsIGhvc3RuYW1lLAogICAgICAgICAgICAgICAgaW5ldF9udG9wKEFGX0lORVQ2LCAmdG8tPnNpbjZfYWRkciwgcGEsIDY0KSk7CgogICAgICAgIEZwcmludGYoc3RkZXJyLCAiIGZyb20gJXMiLAogICAgICAgICAgICAgICAgaW5ldF9udG9wKEFGX0lORVQ2LCAmc2FkZHIuc2luNl9hZGRyLCBwYSwgNjQpKTsKICAgICAgICBGcHJpbnRmKHN0ZGVyciwgIiwgJWx1IGhvcHMgbWF4LCAlZCBieXRlIHBhY2tldHNcbiIsCiAgICAgICAgICAgICAgICBpdGVtLT50cmFjZVJvdXRlQ3RsTWF4VHRsLCBkYXRhbGVuKTsKICAgICAgICAodm9pZCkgZmZsdXNoKHN0ZGVycik7CgoKICAgICAgICBzdHJ1Y3QgdHJhY2VSb3V0ZVJlc3VsdHNUYWJsZV9kYXRhICpTdG9yYWdlUmVzdWx0cyA9IE5VTEw7CiAgICAgICAgbmV0c25tcF92YXJpYWJsZV9saXN0ICp2YXJzX3Jlc3VsdHMgPSBOVUxMOwoKICAgICAgICBzdHJ1Y3QgdHJhY2VSb3V0ZUhvcHNUYWJsZV9kYXRhICp0ZW1wID0gTlVMTDsKICAgICAgICBzdHJ1Y3QgdHJhY2VSb3V0ZUhvcHNUYWJsZV9kYXRhICpjdXJyZW50X3RlbXAgPSBOVUxMOwogICAgICAgIHN0cnVjdCB0cmFjZVJvdXRlSG9wc1RhYmxlX2RhdGEgKmN1cnJlbnQgPSBOVUxMOwoKICAgICAgICB1bnNpZ25lZCBsb25nICAgaW5kZXggPSAwOwoKICAgICAgICBzdHJ1Y3QgdHJhY2VSb3V0ZVByb2JlSGlzdG9yeVRhYmxlX2RhdGEgKnRlbXBfaGlzID0gTlVMTDsKICAgICAgICBzdHJ1Y3QgdHJhY2VSb3V0ZVByb2JlSGlzdG9yeVRhYmxlX2RhdGEgKmN1cnJlbnRfdGVtcF9oaXMgPSBOVUxMOwoKICAgICAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzX3Jlc3VsdHMsIE5VTEwsIDAsIEFTTl9PQ1RFVF9TVFIsIChjaGFyICopIGl0ZW0tPnRyYWNlUm91dGVDdGxPd25lckluZGV4LCBpdGVtLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleExlbik7ICAgICAvKiAgdHJhY2VSb3V0ZUN0bE93bmVySW5kZXggICovCiAgICAgICAgc25tcF92YXJsaXN0X2FkZF92YXJpYWJsZSgmdmFyc19yZXN1bHRzLCBOVUxMLCAwLCBBU05fT0NURVRfU1RSLCAoY2hhciAqKSBpdGVtLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWUsIGl0ZW0tPnRyYWNlUm91dGVDdGxUZXN0TmFtZUxlbik7IC8qICB0cmFjZVJvdXRlQ3RsVGVzdE5hbWUgICovCiAgICAgICAgaWYgKChTdG9yYWdlUmVzdWx0cyA9CiAgICAgICAgICAgICBoZWFkZXJfY29tcGxleF9nZXQodHJhY2VSb3V0ZVJlc3VsdHNUYWJsZVN0b3JhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyc19yZXN1bHRzKSkgPT0gTlVMTCkKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIHNubXBfZnJlZV92YXJiaW5kKHZhcnNfcmVzdWx0cyk7CiAgICAgICAgdmFyc19yZXN1bHRzID0gTlVMTDsKCiAgICAgICAgZm9yICh0dGwgPSBpdGVtLT50cmFjZVJvdXRlQ3RsSW5pdGlhbFR0bDsKICAgICAgICAgICAgIHR0bCA8PSBpdGVtLT50cmFjZVJvdXRlQ3RsTWF4VHRsOyArK3R0bCkgewogICAgICAgICAgICBzdHJ1Y3QgaW42X2FkZHIgbGFzdGFkZHIgPSB7IHt7MCx9fSB9OwogICAgICAgICAgICBpbnQgICAgICAgICAgICAgZ290X3RoZXJlID0gMDsKICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHVucmVhY2hhYmxlID0gMDsKICAgICAgICAgICAgdGltZV90ICAgICAgICAgIHRpbWVwID0gMDsKICAgICAgICAgICAgUHJpbnRmKCIlMmQgIiwgdHRsKTsKCgogICAgICAgICAgICBTdG9yYWdlUmVzdWx0cy0+dHJhY2VSb3V0ZVJlc3VsdHNDdXJIb3BDb3VudCA9IHR0bDsKICAgICAgICAgICAgaWYgKGl0ZW0tPnRyYWNlUm91dGVDdGxDcmVhdGVIb3BzRW50cmllcyA9PSAxKSB7CiAgICAgICAgICAgICAgICBpZiAodHRsID09IGl0ZW0tPnRyYWNlUm91dGVDdGxJbml0aWFsVHRsKSB7CgogICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBrID0gMDsKICAgICAgICAgICAgICAgICAgICBjb3VudCA9IHRyYWNlUm91dGVIb3BzVGFibGVfY291bnQoaXRlbSk7CiAgICAgICAgICAgICAgICAgICAgc3RydWN0IHRyYWNlUm91dGVIb3BzVGFibGVfZGF0YSAqU3RvcmFnZVRtcCA9IE5VTEw7CiAgICAgICAgICAgICAgICAgICAgc3RydWN0IGhlYWRlcl9jb21wbGV4X2luZGV4ICpoY2lwdHIyID0gTlVMTDsKICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKnZhcnMgPSBOVUxMOwogICAgICAgICAgICAgICAgICAgIG9pZCAgICAgICAgICAgICBuZXdvaWRbTUFYX09JRF9MRU5dOwogICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgICBuZXdvaWRfbGVuOwoKICAgICAgICAgICAgICAgICAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzLCBOVUxMLCAwLCBBU05fT0NURVRfU1RSLCAoY2hhciAqKSBpdGVtLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleCwgaXRlbS0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXhMZW4pOyAvKiB0cmFjZVJvdXRlQ3RsT3duZXJJbmRleCAqLwogICAgICAgICAgICAgICAgICAgIHNubXBfdmFybGlzdF9hZGRfdmFyaWFibGUoJnZhcnMsIE5VTEwsIDAsIEFTTl9PQ1RFVF9TVFIsIChjaGFyICopIGl0ZW0tPnRyYWNlUm91dGVDdGxUZXN0TmFtZSwgaXRlbS0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lTGVuKTsgICAgIC8qIHRyYWNlUm91dGVDdGxUZXN0TmFtZSAqLwoKICAgICAgICAgICAgICAgICAgICBoZWFkZXJfY29tcGxleF9nZW5lcmF0ZV9vaWQobmV3b2lkLCAmbmV3b2lkX2xlbiwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgdmFycyk7CgogICAgICAgICAgICAgICAgICAgIHNubXBfZnJlZV92YXJiaW5kKHZhcnMpOwogICAgICAgICAgICAgICAgICAgIHZhcnMgPSBOVUxMOwoKICAgICAgICAgICAgICAgICAgICBmb3IgKGhjaXB0cjIgPSB0cmFjZVJvdXRlSG9wc1RhYmxlU3RvcmFnZTsKICAgICAgICAgICAgICAgICAgICAgICAgIGhjaXB0cjIgIT0gTlVMTDsgaGNpcHRyMiA9IGhjaXB0cjItPm5leHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNubXBfb2lkX2NvbXBhcmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZXdvaWQsIG5ld29pZF9sZW4sIGhjaXB0cjItPm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3b2lkX2xlbikgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RvcmFnZVRtcCA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyX2NvbXBsZXhfZXh0cmFjdF9lbnRyeQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgmdHJhY2VSb3V0ZUhvcHNUYWJsZVN0b3JhZ2UsIGhjaXB0cjIpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZF9Ib3BzQWRkcmVzc1trXSA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikgbWFsbG9jKFN0b3JhZ2VUbXAtPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZVJvdXRlSG9wc0lwVGd0QWRkcmVzc0xlbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9sZF9Ib3BzQWRkcmVzc1trXSA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpdCgxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZF9Ib3BzQWRkcmVzc1trXSA9IG5ldHNubXBfbWVtZHVwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVIb3BzSXBUZ3RBZGRyZXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0b3JhZ2VUbXAtPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlUm91dGVIb3BzSXBUZ3RBZGRyZXNzTGVuICsgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRfSG9wc0FkZHJlc3Nba11bU3RvcmFnZVRtcC0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VSb3V0ZUhvcHNJcFRndEFkZHJlc3NMZW5dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnXDAnOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGsrKzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB0cmFjZVJvdXRlSG9wc1RhYmxlX2RlbChpdGVtKTsKICAgICAgICAgICAgICAgICAgICBpbmRleCA9IDA7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdGVtcCA9IFNOTVBfTUFMTE9DX1NUUlVDVCh0cmFjZVJvdXRlSG9wc1RhYmxlX2RhdGEpOwogICAgICAgICAgICAgICAgdGVtcC0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXggPQogICAgICAgICAgICAgICAgICAgIChjaGFyICopIG1hbGxvYyhpdGVtLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleExlbiArIDEpOwogICAgICAgICAgICAgICAgbWVtY3B5KHRlbXAtPnRyYWNlUm91dGVDdGxPd25lckluZGV4LAogICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPnRyYWNlUm91dGVDdGxPd25lckluZGV4LAogICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPnRyYWNlUm91dGVDdGxPd25lckluZGV4TGVuICsgMSk7CiAgICAgICAgICAgICAgICB0ZW1wLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleFtpdGVtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlUm91dGVDdGxPd25lckluZGV4TGVuXSA9CiAgICAgICAgICAgICAgICAgICAgJ1wwJzsKICAgICAgICAgICAgICAgIHRlbXAtPnRyYWNlUm91dGVDdGxPd25lckluZGV4TGVuID0KICAgICAgICAgICAgICAgICAgICBpdGVtLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleExlbjsKCiAgICAgICAgICAgICAgICB0ZW1wLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWUgPQogICAgICAgICAgICAgICAgICAgIChjaGFyICopIG1hbGxvYyhpdGVtLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWVMZW4gKyAxKTsKICAgICAgICAgICAgICAgIG1lbWNweSh0ZW1wLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgaXRlbS0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lLAogICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPnRyYWNlUm91dGVDdGxUZXN0TmFtZUxlbiArIDEpOwogICAgICAgICAgICAgICAgdGVtcC0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lW2l0ZW0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlUm91dGVDdGxUZXN0TmFtZUxlbl0gPQogICAgICAgICAgICAgICAgICAgICdcMCc7CiAgICAgICAgICAgICAgICB0ZW1wLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWVMZW4gPQogICAgICAgICAgICAgICAgICAgIGl0ZW0tPnRyYWNlUm91dGVDdGxUZXN0TmFtZUxlbjsKCiAgICAgICAgICAgICAgICAvKiBhZGQgbG9jayB0byBwcm90ZWN0ICovCiAgICAgICAgICAgICAgICBwdGhyZWFkX211dGV4X3QgY291bnRlcl9tdXRleCA9IFBUSFJFQURfTVVURVhfSU5JVElBTElaRVI7CiAgICAgICAgICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJmNvdW50ZXJfbXV0ZXgpOwogICAgICAgICAgICAgICAgdGVtcC0+dHJhY2VSb3V0ZUhvcHNIb3BJbmRleCA9ICsraW5kZXg7CiAgICAgICAgICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmY291bnRlcl9tdXRleCk7CiAgICAgICAgICAgICAgICAvKiBlbmRzYWRzYWRzYWQgKi8KCgogICAgICAgICAgICAgICAgdGVtcC0+dHJhY2VSb3V0ZUhvcHNJcFRndEFkZHJlc3NUeXBlID0gMDsKICAgICAgICAgICAgICAgIHRlbXAtPnRyYWNlUm91dGVIb3BzSXBUZ3RBZGRyZXNzID0gc3RyZHVwKCIiKTsKICAgICAgICAgICAgICAgIHRlbXAtPnRyYWNlUm91dGVIb3BzSXBUZ3RBZGRyZXNzTGVuID0gMDsKICAgICAgICAgICAgICAgIHRlbXAtPnRyYWNlUm91dGVIb3BzTWluUnR0ID0gMDsKICAgICAgICAgICAgICAgIHRlbXAtPnRyYWNlUm91dGVIb3BzTWF4UnR0ID0gMDsKICAgICAgICAgICAgICAgIHRlbXAtPnRyYWNlUm91dGVIb3BzQXZlcmFnZVJ0dCA9IDA7CiAgICAgICAgICAgICAgICB0ZW1wLT50cmFjZVJvdXRlSG9wc1J0dFN1bU9mU3F1YXJlcyA9IDA7CiAgICAgICAgICAgICAgICB0ZW1wLT50cmFjZVJvdXRlSG9wc1NlbnRQcm9iZXMgPSAwOwogICAgICAgICAgICAgICAgdGVtcC0+dHJhY2VSb3V0ZUhvcHNQcm9iZVJlc3BvbnNlcyA9IDA7CgogICAgICAgICAgICAgICAgdGVtcC0+dHJhY2VSb3V0ZUhvcHNMYXN0R29vZFByb2JlTGVuID0gMDsKICAgICAgICAgICAgICAgIGlmIChpbmRleCA9PSAxKQogICAgICAgICAgICAgICAgICAgIGl0ZW0tPnRyYWNlUm91dGVIb3BzID0gdGVtcDsKICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIChjdXJyZW50X3RlbXApLT5uZXh0ID0gdGVtcDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjdXJyZW50X3RlbXAgPSB0ZW1wOwoKICAgICAgICAgICAgICAgIGlmIChpbmRleCA+PSBpdGVtLT50cmFjZVJvdXRlQ3RsTWF4VHRsKSB7CiAgICAgICAgICAgICAgICAgICAgY3VycmVudF90ZW1wLT5uZXh0ID0gTlVMTDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoaXRlbS0+dHJhY2VSb3V0ZUhvcHMgIT0gTlVMTCkKCiAgICAgICAgICAgICAgICAgICAgaWYgKHRyYWNlUm91dGVIb3BzVGFibGVfYWRkKGN1cnJlbnRfdGVtcCkgIT0KICAgICAgICAgICAgICAgICAgICAgICAgU05NUEVSUl9TVUNDRVNTKQogICAgICAgICAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZUhvcHNUYWJsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWdpc3RlcmVkIGFuIGVudHJ5IGVycm9yXG4iKSk7CgogICAgICAgICAgICB9CgogICAgICAgICAgICByZWdpc3RlciB1bnNpZ25lZCBsb25nIG1heFJ0dCA9IDA7CiAgICAgICAgICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgbWluUnR0ID0gMDsKICAgICAgICAgICAgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBhdmVyYWdlUnR0ID0gMDsKICAgICAgICAgICAgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBzdW1SdHQgPSAwOwogICAgICAgICAgICByZWdpc3RlciB1bnNpZ25lZCBsb25nIHJlc3BvbnNlUHJvYmUgPSAwOwogICAgICAgICAgICByZWdpc3RlciB1bnNpZ25lZCBsb25nIHN1bU9mU3F1YXJlID0gMDsKICAgICAgICAgICAgZm9yIChwcm9iZSA9IDA7IHByb2JlIDwgbnByb2JlczsgKytwcm9iZSkgewogICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIGNjID0gMCwgcmVzZXRfdGltZXIgPSAwOwogICAgICAgICAgICAgICAgc3RydWN0IHRpbWV2YWwgIHQxLCB0MjsKICAgICAgICAgICAgICAgIHN0cnVjdCB0aW1lem9uZSB0ejsKICAgICAgICAgICAgICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgUnR0ID0gMDsKCiAgICAgICAgICAgICAgICBnZXR0aW1lb2ZkYXkoJnQxLCAmdHopOwoKICAgICAgICAgICAgICAgIHNlbmRfcHJvYmVfdjYoKytzZXEsIHR0bCwgc2VuZGJ1ZmYsIGlkZW50LCAmdHosIHNuZHNvY2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFsZW4sICZ3aGVyZXRvLCBob3N0bmFtZSk7CiAgICAgICAgICAgICAgICByZXNldF90aW1lciA9IDE7CgogICAgICAgICAgICAgICAgd2hpbGUgKChjYyA9CiAgICAgICAgICAgICAgICAgICAgICAgIHdhaXRfZm9yX3JlcGx5X3Y2KGljbXBfc29jaywgJmZyb20sIHJlc2V0X3RpbWVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YWl0dGltZSwgaWNtcF9zb2NrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrZXQpKSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgZ2V0dGltZW9mZGF5KCZ0MiwgJnR6KTsKICAgICAgICAgICAgICAgICAgICB0aW1lcCA9IDA7CiAgICAgICAgICAgICAgICAgICAgdGltZSgmdGltZXApOwogICAgICAgICAgICAgICAgICAgIGlmICgoaSA9CiAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrZXRfb2tfdjYocGFja2V0LCBjYywgJmZyb20sIHNlcSwgJnQxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50KSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXRfdGltZXIgPSAxOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAobWVtY21wCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJmZyb20uc2luNl9hZGRyLCAmbGFzdGFkZHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcikpKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCZsYXN0YWRkciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZnJvbS5zaW42X2FkZHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcikpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBSdHQgPSBkZWx0YVQoJnQxLCAmdDIpOwogICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZVByb2JlID0gcmVzcG9uc2VQcm9iZSArIDE7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9iZSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5SdHQgPSBSdHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhSdHQgPSBSdHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmVyYWdlUnR0ID0gUnR0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VtUnR0ID0gUnR0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VtT2ZTcXVhcmUgPSBSdHQgKiBSdHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoUnR0IDwgbWluUnR0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pblJ0dCA9IFJ0dDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChSdHQgPiBtYXhSdHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4UnR0ID0gUnR0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VtUnR0ID0gKHN1bVJ0dCkgKyBSdHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmVyYWdlUnR0ID0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3VuZCgoZG91YmxlKSAoc3VtUnR0KSAvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRvdWJsZSkgcmVzcG9uc2VQcm9iZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW1PZlNxdWFyZSA9IHN1bU9mU3F1YXJlICsgUnR0ICogUnR0OwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBTdG9yYWdlUmVzdWx0cy0+dHJhY2VSb3V0ZVJlc3VsdHNDdXJQcm9iZUNvdW50ID0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2JlICsgMTsKCgogICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGkgLSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSUNNUDZfRFNUX1VOUkVBQ0hfTk9QT1JUOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgKytnb3RfdGhlcmU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSUNNUDZfRFNUX1VOUkVBQ0hfTk9ST1VURToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrdW5yZWFjaGFibGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmludGYoIiAhTiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSUNNUDZfRFNUX1VOUkVBQ0hfQUREUjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrdW5yZWFjaGFibGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmludGYoIiAhSCIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIElDTVA2X0RTVF9VTlJFQUNIX0FETUlOOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgKyt1bnJlYWNoYWJsZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50ZigiICFTIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXRfdGltZXIgPSAwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGNjID09IDApIHsKICAgICAgICAgICAgICAgICAgICB0aW1lcCA9IDA7CiAgICAgICAgICAgICAgICAgICAgdGltZSgmdGltZXApOwogICAgICAgICAgICAgICAgICAgIFByaW50ZigiICoiKTsKICAgICAgICAgICAgICAgICAgICBSdHQgPSAoaXRlbS0+dHJhY2VSb3V0ZUN0bFRpbWVPdXQpICogMTAwMDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoaXRlbS0+dHJhY2VSb3V0ZUN0bE1heFJvd3MgIT0gMCkgewoKICAgICAgICAgICAgICAgICAgICB0ZW1wX2hpcyA9CiAgICAgICAgICAgICAgICAgICAgICAgIFNOTVBfTUFMTE9DX1NUUlVDVAogICAgICAgICAgICAgICAgICAgICAgICAodHJhY2VSb3V0ZVByb2JlSGlzdG9yeVRhYmxlX2RhdGEpOwogICAgICAgICAgICAgICAgICAgIHRlbXBfaGlzLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleCA9CiAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopIG1hbGxvYyhpdGVtLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleExlbiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsKICAgICAgICAgICAgICAgICAgICBtZW1jcHkodGVtcF9oaXMtPnRyYWNlUm91dGVDdGxPd25lckluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXhMZW4gKyAxKTsKICAgICAgICAgICAgICAgICAgICB0ZW1wX2hpcy0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXhbaXRlbS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlUm91dGVDdGxPd25lckluZGV4TGVuXQogICAgICAgICAgICAgICAgICAgICAgICA9ICdcMCc7CiAgICAgICAgICAgICAgICAgICAgdGVtcF9oaXMtPnRyYWNlUm91dGVDdGxPd25lckluZGV4TGVuID0KICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXhMZW47CgogICAgICAgICAgICAgICAgICAgIHRlbXBfaGlzLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWUgPQogICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKSBtYWxsb2MoaXRlbS0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lTGVuICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOwogICAgICAgICAgICAgICAgICAgIG1lbWNweSh0ZW1wX2hpcy0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPnRyYWNlUm91dGVDdGxUZXN0TmFtZUxlbiArIDEpOwogICAgICAgICAgICAgICAgICAgIHRlbXBfaGlzLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWVbaXRlbS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZVJvdXRlQ3RsVGVzdE5hbWVMZW5dCiAgICAgICAgICAgICAgICAgICAgICAgID0gJ1wwJzsKICAgICAgICAgICAgICAgICAgICB0ZW1wX2hpcy0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lTGVuID0KICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lTGVuOwoKICAgICAgICAgICAgICAgICAgICAvKiBhZGQgbG9jayB0byBwcm90ZWN0ICovCiAgICAgICAgICAgICAgICAgICAgcHRocmVhZF9tdXRleF90IGNvdW50ZXJfbXV0ZXggPQogICAgICAgICAgICAgICAgICAgICAgICBQVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSOwogICAgICAgICAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmY291bnRlcl9tdXRleCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0tPnRyYWNlUm91dGVQcm9iZUhpc3RvcnlNYXhJbmRleCA+PQogICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykgKDIxNDc0ODM2NDcpKQogICAgICAgICAgICAgICAgICAgICAgICBpdGVtLT50cmFjZVJvdXRlUHJvYmVIaXN0b3J5TWF4SW5kZXggPSAwOwogICAgICAgICAgICAgICAgICAgIHRlbXBfaGlzLT50cmFjZVJvdXRlUHJvYmVIaXN0b3J5SW5kZXggPQogICAgICAgICAgICAgICAgICAgICAgICArKyhpdGVtLT50cmFjZVJvdXRlUHJvYmVIaXN0b3J5TWF4SW5kZXgpOwogICAgICAgICAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZjb3VudGVyX211dGV4KTsKICAgICAgICAgICAgICAgICAgICAvKiBlbmRzYWRzYWRzYWQgKi8KICAgICAgICAgICAgICAgICAgICB0ZW1wX2hpcy0+dHJhY2VSb3V0ZVByb2JlSGlzdG9yeUhvcEluZGV4ID0gdHRsOwogICAgICAgICAgICAgICAgICAgIHRlbXBfaGlzLT50cmFjZVJvdXRlUHJvYmVIaXN0b3J5UHJvYmVJbmRleCA9IHByb2JlICsgMTsKCiAgICAgICAgICAgICAgICAgICAgdGVtcF9oaXMtPnRyYWNlUm91dGVQcm9iZUhpc3RvcnlIQWRkclR5cGUgPSAyOwogICAgICAgICAgICAgICAgICAgIHRlbXBfaGlzLT50cmFjZVJvdXRlUHJvYmVIaXN0b3J5SEFkZHIgPQogICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKQogICAgICAgICAgICAgICAgICAgICAgICBtYWxsb2Moc3RybGVuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5ldF9udG9wCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFGX0lORVQ2LCAmZnJvbS5zaW42X2FkZHIsIHBhLCA2NCkpICsgMSk7CiAgICAgICAgICAgICAgICAgICAgdGVtcF9oaXMtPnRyYWNlUm91dGVQcm9iZUhpc3RvcnlIQWRkciA9CiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmR1cChpbmV0X250b3AKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBRl9JTkVUNiwgJmZyb20uc2luNl9hZGRyLCBwYSwgNjQpKTsKICAgICAgICAgICAgICAgICAgICB0ZW1wX2hpcy0+CiAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlUm91dGVQcm9iZUhpc3RvcnlIQWRkcltzdHJsZW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbmV0X250b3AKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQUZfSU5FVDYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmcm9tLnNpbjZfYWRkciwgcGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY0KSldID0gJ1wwJzsKICAgICAgICAgICAgICAgICAgICB0ZW1wX2hpcy0+dHJhY2VSb3V0ZVByb2JlSGlzdG9yeUhBZGRyTGVuID0KICAgICAgICAgICAgICAgICAgICAgICAgc3RybGVuKGluZXRfbnRvcAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFGX0lORVQ2LCAmZnJvbS5zaW42X2FkZHIsIHBhLCA2NCkpOwoKICAgICAgICAgICAgICAgICAgICB0ZW1wX2hpcy0+dHJhY2VSb3V0ZVByb2JlSGlzdG9yeVJlc3BvbnNlID0gUnR0OwogICAgICAgICAgICAgICAgICAgIHRlbXBfaGlzLT50cmFjZVJvdXRlUHJvYmVIaXN0b3J5U3RhdHVzID0gMTsKICAgICAgICAgICAgICAgICAgICB0ZW1wX2hpcy0+dHJhY2VSb3V0ZVByb2JlSGlzdG9yeUxhc3RSQyA9IDA7CgoJCSAgICB0ZW1wX2hpcy0+dHJhY2VSb3V0ZVByb2JlSGlzdG9yeVRpbWVfdGltZSA9IHRpbWVwOwogICAgICAgICAgICAgICAgICAgIHRlbXBfaGlzLT50cmFjZVJvdXRlUHJvYmVIaXN0b3J5VGltZSA9IG5ldHNubXBfbWVtZHVwKAogICAgICAgICAgICAgICAgICAgICAgICBkYXRlX25fdGltZSgmdGltZXAsCgkJCSAgICAmdGVtcF9oaXMtPnRyYWNlUm91dGVQcm9iZUhpc3RvcnlUaW1lTGVuKSwgMTEpOwoKICAgICAgICAgICAgICAgICAgICBpZiAocHJvYmUgPT0gMCkKICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS0+dHJhY2VSb3V0ZVByb2JlSGlzID0gdGVtcF9oaXM7CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIChjdXJyZW50X3RlbXBfaGlzKS0+bmV4dCA9IHRlbXBfaGlzOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgY3VycmVudF90ZW1wX2hpcyA9IHRlbXBfaGlzOwoKICAgICAgICAgICAgICAgICAgICBpZiAocHJvYmUgKyAxID49IG5wcm9iZXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF90ZW1wX2hpcy0+bmV4dCA9IE5VTEw7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbS0+dHJhY2VSb3V0ZVByb2JlSGlzICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRyYWNlUm91dGVQcm9iZUhpc3RvcnlUYWJsZV9jb3VudChpdGVtKSA8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLT50cmFjZVJvdXRlQ3RsTWF4Um93cykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRyYWNlUm91dGVQcm9iZUhpc3RvcnlUYWJsZV9hZGQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY3VycmVudF90ZW1wX2hpcykgIT0gU05NUEVSUl9TVUNDRVNTKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlUHJvYmVIaXN0b3J5VGFibGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWdpc3RlcmVkIGFuIGVudHJ5IGVycm9yXG4iKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZVJvdXRlUHJvYmVIaXN0b3J5VGFibGVfZGVsTGFzdChpdGVtKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0cmFjZVJvdXRlUHJvYmVIaXN0b3J5VGFibGVfYWRkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGN1cnJlbnRfdGVtcF9oaXMpICE9IFNOTVBFUlJfU1VDQ0VTUykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZVByb2JlSGlzdG9yeVRhYmxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVnaXN0ZXJlZCBhbiBlbnRyeSBlcnJvclxuIikpOwoKICAgICAgICAgICAgICAgICAgICAgICAgfQoJCSAgICB9CgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGl0ZW0tPnRyYWNlUm91dGVDdGxDcmVhdGVIb3BzRW50cmllcyA9PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgbmV0c25tcF92YXJpYWJsZV9saXN0ICp2YXJzX2hvcHMgPSBOVUxMOwogICAgICAgICAgICAgICAgICAgIHNubXBfdmFybGlzdF9hZGRfdmFyaWFibGUoJnZhcnNfaG9wcywgTlVMTCwgMCwgQVNOX09DVEVUX1NUUiwgKGNoYXIgKikgaXRlbS0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXgsIGl0ZW0tPnRyYWNlUm91dGVDdGxPd25lckluZGV4TGVuKTsgICAgLyogIHRyYWNlUm91dGVDdGxPd25lckluZGV4ICAqLwogICAgICAgICAgICAgICAgICAgIHNubXBfdmFybGlzdF9hZGRfdmFyaWFibGUoJnZhcnNfaG9wcywgTlVMTCwgMCwgQVNOX09DVEVUX1NUUiwgKGNoYXIgKikgaXRlbS0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lLCBpdGVtLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWVMZW4pOyAgICAgICAgLyogIHRyYWNlUm91dGVDdGxUZXN0TmFtZSAgKi8KICAgICAgICAgICAgICAgICAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzX2hvcHMsIE5VTEwsIDAsIEFTTl9VTlNJR05FRCwgKGNoYXIgKikgJmluZGV4LCBzaXplb2YoaW5kZXgpKTsgICAgICAgLyogIHRyYWNlUm91dGVIb3BzSW5kZXggICovCiAgICAgICAgICAgICAgICAgICAgaWYgKChjdXJyZW50ID0KICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcl9jb21wbGV4X2dldCh0cmFjZVJvdXRlSG9wc1RhYmxlU3RvcmFnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJzX2hvcHMpKSA9PSBOVUxMKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgY3VycmVudC0+dHJhY2VSb3V0ZUhvcHNJcFRndEFkZHJlc3NUeXBlID0gMjsKICAgICAgICAgICAgICAgICAgICBjdXJyZW50LT50cmFjZVJvdXRlSG9wc0lwVGd0QWRkcmVzcyA9CiAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopCiAgICAgICAgICAgICAgICAgICAgICAgIG1hbGxvYyhzdHJsZW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbmV0X250b3AKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQUZfSU5FVDYsICZmcm9tLnNpbjZfYWRkciwgcGEsIDY0KSkgKyAxKTsKICAgICAgICAgICAgICAgICAgICBjdXJyZW50LT50cmFjZVJvdXRlSG9wc0lwVGd0QWRkcmVzcyA9CiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmR1cChpbmV0X250b3AKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBRl9JTkVUNiwgJmZyb20uc2luNl9hZGRyLCBwYSwgNjQpKTsKICAgICAgICAgICAgICAgICAgICBjdXJyZW50LT4KICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VSb3V0ZUhvcHNJcFRndEFkZHJlc3Nbc3RybGVuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbmV0X250b3AKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBRl9JTkVUNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZnJvbS5zaW42X2FkZHIsIHBhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY0KSldID0gJ1wwJzsKCiAgICAgICAgICAgICAgICAgICAgaWYgKGNvdW50ICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmNtcAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9sZF9Ib3BzQWRkcmVzc1tpbmRleCAtIDFdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQtPnRyYWNlUm91dGVIb3BzSXBUZ3RBZGRyZXNzKSAhPSAwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZyA9IDE7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBjdXJyZW50LT50cmFjZVJvdXRlSG9wc0lwVGd0QWRkcmVzc0xlbiA9CiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmxlbihpbmV0X250b3AKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBRl9JTkVUNiwgJmZyb20uc2luNl9hZGRyLCBwYSwgNjQpKTsKICAgICAgICAgICAgICAgICAgICBjdXJyZW50LT50cmFjZVJvdXRlSG9wc01pblJ0dCA9IG1pblJ0dDsKICAgICAgICAgICAgICAgICAgICBjdXJyZW50LT50cmFjZVJvdXRlSG9wc01heFJ0dCA9IG1heFJ0dDsKICAgICAgICAgICAgICAgICAgICBjdXJyZW50LT50cmFjZVJvdXRlSG9wc0F2ZXJhZ2VSdHQgPSBhdmVyYWdlUnR0OwogICAgICAgICAgICAgICAgICAgIGN1cnJlbnQtPnRyYWNlUm91dGVIb3BzUnR0U3VtT2ZTcXVhcmVzID0gc3VtT2ZTcXVhcmU7CiAgICAgICAgICAgICAgICAgICAgY3VycmVudC0+dHJhY2VSb3V0ZUhvcHNTZW50UHJvYmVzID0gcHJvYmUgKyAxOwogICAgICAgICAgICAgICAgICAgIGN1cnJlbnQtPnRyYWNlUm91dGVIb3BzUHJvYmVSZXNwb25zZXMgPSByZXNwb25zZVByb2JlOwoJCSAgICBjdXJyZW50LT50cmFjZVJvdXRlSG9wc0xhc3RHb29kUHJvYmVfdGltZSA9IHRpbWVwOwogICAgICAgICAgICAgICAgICAgIGN1cnJlbnQtPnRyYWNlUm91dGVIb3BzTGFzdEdvb2RQcm9iZSA9IAogICAgICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX21lbWR1cChkYXRlX25fdGltZSgmdGltZXAsCgkJCSAgICAmY3VycmVudC0+dHJhY2VSb3V0ZUhvcHNMYXN0R29vZFByb2JlTGVuKSwgMTEpOwoKICAgICAgICAgICAgICAgICAgICBzbm1wX2ZyZWVfdmFyYmluZCh2YXJzX2hvcHMpOwogICAgICAgICAgICAgICAgICAgIHZhcnNfaG9wcyA9IE5VTEw7CiAgICAgICAgICAgICAgICB9CgoKICAgICAgICAgICAgICAgICh2b2lkKSBmZmx1c2goc3Rkb3V0KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBwdXRjaGFyKCdcbicpOwoKCiAgICAgICAgICAgIGlmIChnb3RfdGhlcmUgfHwgdW5yZWFjaGFibGUgPj0gbnByb2JlcyAtIDEpIHsKCgogICAgICAgICAgICAgICAgaWYgKGdvdF90aGVyZSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgU3RvcmFnZVJlc3VsdHMtPnRyYWNlUm91dGVSZXN1bHRzVGVzdEF0dGVtcHRzID0KICAgICAgICAgICAgICAgICAgICAgICAgU3RvcmFnZVJlc3VsdHMtPnRyYWNlUm91dGVSZXN1bHRzVGVzdEF0dGVtcHRzICsgMTsKCiAgICAgICAgICAgICAgICAgICAgU3RvcmFnZVJlc3VsdHMtPnRyYWNlUm91dGVSZXN1bHRzVGVzdFN1Y2Nlc3NlcyA9CiAgICAgICAgICAgICAgICAgICAgICAgIFN0b3JhZ2VSZXN1bHRzLT50cmFjZVJvdXRlUmVzdWx0c1Rlc3RTdWNjZXNzZXMgKyAxOwoJCSAgICBTdG9yYWdlUmVzdWx0cy0+dHJhY2VSb3V0ZVJlc3VsdHNMYXN0R29vZFBhdGhfdGltZSA9IHRpbWVwOwogICAgICAgICAgICAgICAgICAgIFN0b3JhZ2VSZXN1bHRzLT50cmFjZVJvdXRlUmVzdWx0c0xhc3RHb29kUGF0aCA9CiAgICAgICAgICAgICAgICAgICAgICAgIG5ldHNubXBfbWVtZHVwKGRhdGVfbl90aW1lKCZ0aW1lcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VSZXN1bHRzLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlUm91dGVSZXN1bHRzTGFzdEdvb2RQYXRoTGVuKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEpOwogICAgICAgICAgICAgICAgICAgIGlmICgoaXRlbS0+CiAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZVJvdXRlQ3RsVHJhcEdlbmVyYXRpb25bMF0gJgogICAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0VST1VURVRSQVBHRU5FUkFUSU9OX1RFU1RDT01QTEVURUQpICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJURVNUIGNvbXBsZXRlZCFcbiIpOwogICAgICAgICAgICAgICAgICAgICAgICBzZW5kX3RyYWNlUm91dGVfdHJhcChpdGVtLCB0cmFjZVJvdXRlVGVzdENvbXBsZXRlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0cmFjZVJvdXRlVGVzdENvbXBsZXRlZCkgLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yob2lkKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIFN0b3JhZ2VSZXN1bHRzLT50cmFjZVJvdXRlUmVzdWx0c1Rlc3RBdHRlbXB0cyA9CiAgICAgICAgICAgICAgICAgICAgICAgIFN0b3JhZ2VSZXN1bHRzLT50cmFjZVJvdXRlUmVzdWx0c1Rlc3RBdHRlbXB0cyArIDE7CiAgICAgICAgICAgICAgICAgICAgaWYgKChpdGVtLT4KICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlUm91dGVDdGxUcmFwR2VuZXJhdGlvblswXSAmCiAgICAgICAgICAgICAgICAgICAgICAgICBUUkFDRVJPVVRFVFJBUEdFTkVSQVRJT05fVEVTVEZBSUxFRCkgIT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoInRlc3QgRmFpbGVkIVxuIik7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRfdHJhY2VSb3V0ZV90cmFwKGl0ZW0sIHRyYWNlUm91dGVUZXN0RmFpbGVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodHJhY2VSb3V0ZVRlc3RGYWlsZWQpIC8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9pZCkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgfSBlbHNlIGlmICh0dGwgPT0gaXRlbS0+dHJhY2VSb3V0ZUN0bE1heFR0bAogICAgICAgICAgICAgICAgICAgICAgICYmIChwcm9iZSArIDEpID09IG5wcm9iZXMpIHsKICAgICAgICAgICAgICAgIFN0b3JhZ2VSZXN1bHRzLT50cmFjZVJvdXRlUmVzdWx0c1Rlc3RBdHRlbXB0cyA9CiAgICAgICAgICAgICAgICAgICAgU3RvcmFnZVJlc3VsdHMtPnRyYWNlUm91dGVSZXN1bHRzVGVzdEF0dGVtcHRzICsgMTsKCiAgICAgICAgICAgICAgICBpZiAoKGl0ZW0tPgogICAgICAgICAgICAgICAgICAgICB0cmFjZVJvdXRlQ3RsVHJhcEdlbmVyYXRpb25bMF0gJgogICAgICAgICAgICAgICAgICAgICBUUkFDRVJPVVRFVFJBUEdFTkVSQVRJT05fVEVTVEZBSUxFRCkgIT0gMCkgewogICAgICAgICAgICAgICAgICAgIHByaW50ZigidGVzdCBGYWlsZWQhXG4iKTsKICAgICAgICAgICAgICAgICAgICBzZW5kX3RyYWNlUm91dGVfdHJhcChpdGVtLCB0cmFjZVJvdXRlVGVzdEZhaWxlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodHJhY2VSb3V0ZVRlc3RGYWlsZWQpIC8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yob2lkKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgfQoKICAgICAgICBjbG9zZShzbmRzb2NrKTsKCiAgICAgICAgaWYgKGZsYWcgPT0gMSkgewogICAgICAgICAgICBwcmludGYoInBhdGggY2hhbmdlZCFcbiIpOwogICAgICAgICAgICBzZW5kX3RyYWNlUm91dGVfdHJhcChpdGVtLCB0cmFjZVJvdXRlUGF0aENoYW5nZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHRyYWNlUm91dGVQYXRoQ2hhbmdlKSAvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihvaWQpKTsKICAgICAgICB9CgogICAgICAgIGludCAgICAgICAgICAgICBrID0gMDsKICAgICAgICBmb3IgKGsgPSAwOyBrIDwgY291bnQ7IGsrKykgewogICAgICAgICAgICBmcmVlKG9sZF9Ib3BzQWRkcmVzc1trXSk7CiAgICAgICAgICAgIG9sZF9Ib3BzQWRkcmVzc1trXSA9IE5VTEw7CiAgICAgICAgfQoKICAgIH0KICAgIHJldHVybjsKfQoKCmludAp3YWl0X2Zvcl9yZXBseShyZWdpc3RlciBpbnQgc29jaywgcmVnaXN0ZXIgc3RydWN0IHNvY2thZGRyX2luICpmcm9tcCwKICAgICAgICAgICAgICAgcmVnaXN0ZXIgY29uc3Qgc3RydWN0IHRpbWV2YWwgKnRwLCB1X2NoYXIgKiBwYWNrZXQsCiAgICAgICAgICAgICAgIGludCB3YWl0dGltZSkKewogICAgZmRfc2V0ICAgICAgICAgIGZkczsKICAgIHN0cnVjdCB0aW1ldmFsICBub3csIHdhaXQ7CiAgICBzdHJ1Y3QgdGltZXpvbmUgdHo7CiAgICByZWdpc3RlciBpbnQgICAgY2MgPSAwOwogICAgc29ja2xlbl90ICAgICAgIGZyb21sZW4gPSBzaXplb2YoKmZyb21wKTsKCiAgICBGRF9aRVJPKCZmZHMpOwogICAgRkRfU0VUKHNvY2ssICZmZHMpOwogICAgd2FpdC50dl9zZWMgPSB0cC0+dHZfc2VjICsgd2FpdHRpbWU7CiAgICB3YWl0LnR2X3VzZWMgPSB0cC0+dHZfdXNlYzsKICAgICh2b2lkKSBnZXR0aW1lb2ZkYXkoJm5vdywgJnR6KTsKICAgIHR2c3ViKCZ3YWl0LCAmbm93KTsKICAgIGlmIChzZWxlY3Qoc29jayArIDEsICZmZHMsIE5VTEwsIE5VTEwsICZ3YWl0KSA+IDApCiAgICAgICAgY2MgPSByZWN2ZnJvbShzb2NrLCAoY2hhciAqKSBwYWNrZXQsIDUxMiwgMCwKICAgICAgICAgICAgICAgICAgICAgIChzdHJ1Y3Qgc29ja2FkZHIgKikgZnJvbXAsICZmcm9tbGVuKTsKICAgIHJldHVybiAoY2MpOwp9CgoKaW50CndhaXRfZm9yX3JlcGx5X3Y2KGludCBzb2NrLCBzdHJ1Y3Qgc29ja2FkZHJfaW42ICpmcm9tLCBpbnQgcmVzZXRfdGltZXIsCiAgICAgICAgICAgICAgICAgIGludCB3YWl0dGltZSwgaW50IGljbXBfc29jaywgdV9jaGFyICogcGFja2V0KQp7CiAgICBmZF9zZXQgICAgICAgICAgZmRzOwogICAgc3RhdGljIHN0cnVjdCB0aW1ldmFsIHdhaXQ7CiAgICBpbnQgICAgICAgICAgICAgY2MgPSAwOwogICAgc29ja2xlbl90ICAgICAgIGZyb21sZW4gPSBzaXplb2YoKmZyb20pOwoKICAgIEZEX1pFUk8oJmZkcyk7CiAgICBGRF9TRVQoc29jaywgJmZkcyk7CiAgICBpZiAocmVzZXRfdGltZXIpIHsKICAgICAgICAvKgogICAgICAgICAqIHRyYWNlcm91dGUgY291bGQgaGFuZyBpZiBzb21lb25lIGVsc2UgaGFzIGEgcGluZwogICAgICAgICAqIHJ1bm5pbmcgYW5kIG91ciBJQ01QIHJlcGx5IGdldHMgZHJvcHBlZCBidXQgd2UgZG9uJ3QKICAgICAgICAgKiByZWFsaXplIGl0IGJlY2F1c2Ugd2Uga2VlcCB3YWtpbmcgdXAgdG8gaGFuZGxlIHRob3NlCiAgICAgICAgICogb3RoZXIgSUNNUCBwYWNrZXRzIHRoYXQga2VlcCBjb21pbmcgaW4uICBUbyBmaXggdGhpcywKICAgICAgICAgKiAicmVzZXRfdGltZXIiIHdpbGwgb25seSBiZSB0cnVlIGlmIHRoZSBsYXN0IHBhY2tldCB0aGF0CiAgICAgICAgICogY2FtZSBpbiB3YXMgZm9yIHVzIG9yIGlmIHRoaXMgaXMgdGhlIGZpcnN0IHRpbWUgd2UncmUKICAgICAgICAgKiB3YWl0aW5nIGZvciBhIHJlcGx5IHNpbmNlIHNlbmRpbmcgb3V0IGEgcHJvYmUuICBOb3RlCiAgICAgICAgICogdGhhdCB0aGlzIHRha2VzIGFkdmFudGFnZSBvZiB0aGUgc2VsZWN0KCkgZmVhdHVyZSBvbgogICAgICAgICAqIExpbnV4IHdoZXJlIHRoZSByZW1haW5pbmcgdGltZW91dCBpcyB3cml0dGVuIHRvIHRoZQogICAgICAgICAqIHN0cnVjdCB0aW1ldmFsIGFyZWEuCiAgICAgICAgICovCiAgICAgICAgd2FpdC50dl9zZWMgPSB3YWl0dGltZTsKICAgICAgICB3YWl0LnR2X3VzZWMgPSAwOwogICAgfQoKICAgIGlmIChzZWxlY3Qoc29jayArIDEsICZmZHMsIChmZF9zZXQgKikgMCwgKGZkX3NldCAqKSAwLCAmd2FpdCkgPiAwKSB7CiAgICAgICAgY2MgPSByZWN2ZnJvbShpY21wX3NvY2ssIChjaGFyICopIHBhY2tldCwgNTEyLCAwLAogICAgICAgICAgICAgICAgICAgICAgKHN0cnVjdCBzb2NrYWRkciAqKSBmcm9tLCAmZnJvbWxlbik7CiAgICB9CgogICAgcmV0dXJuIChjYyk7Cn0KCi8qCiAqIHNlbmRfcHJvYmUoKSB1c2VzIHRoZSBCU0QtaXNoIHVkcGlwaGRyLgogKiBEZWZpbmUgc29tZXRoaW5nIHRoYXQgbG9va3MgZW5vdWdoIGxpa2UgaXQgdG8gd29yay4KICovCnN0cnVjdCB1ZHBpcGhkciB7CiAgIHN0cnVjdCBpcGhkciB1aV9pOwogICBzdHJ1Y3QgdWRwaGRyIHVpX3U7Cn07CiNkZWZpbmUgdWlfc3JjIHVpX2kuc2FkZHIKI2RlZmluZSB1aV9kc3QgdWlfaS5kYWRkcgojZGVmaW5lIHVpX3ByIHVpX2kucHJvdG9jb2wKI2RlZmluZSB1aV9sZW4gdWlfaS50b3RfbGVuCgp2b2lkCnNlbmRfcHJvYmUoc3RydWN0IHNvY2thZGRyX2luICp3aGVyZXRvLCByZWdpc3RlciBpbnQgc2VxLCBpbnQgdHRsLAogICAgICAgICAgIHJlZ2lzdGVyIHN0cnVjdCB0aW1ldmFsICp0cCwgcmVnaXN0ZXIgc3RydWN0IGlwICpvdXRpcCwKICAgICAgICAgICByZWdpc3RlciBzdHJ1Y3QgdWRwaGRyICpvdXR1ZHAsIGludCBwYWNrbGVuLCBpbnQgb3B0bGVuLAogICAgICAgICAgIGNoYXIgKmhvc3RuYW1lLCB1X3Nob3J0IGlkZW50LCBpbnQgc25kc29jaywgdV9zaG9ydCBwb3J0LAogICAgICAgICAgIHN0cnVjdCBvdXRkYXRhICpvdXRkYXRhKQp7CiAgICByZWdpc3RlciBpbnQgICAgY2MgPSAwOwogICAgcmVnaXN0ZXIgc3RydWN0IHVkcGlwaGRyICp1aSA9IE5VTEwsICpvdWkgPSBOVUxMOwogICAgc3RydWN0IGlwICAgICAgIHRpcDsKCiAgICBvdXRpcC0+aXBfdHRsID0gdHRsOwojaWZuZGVmIF9faHB1eAogICAgb3V0aXAtPmlwX2lkID0gaHRvbnMoaWRlbnQgKyBzZXEpOwojZW5kaWYKCiAgICAvKgogICAgICogSW4gbW9zdCBjYXNlcywgdGhlIGtlcm5lbCB3aWxsIHJlY2FsY3VsYXRlIHRoZSBpcCBjaGVja3N1bS4KICAgICAqIEJ1dCB3ZSBtdXN0IGRvIGl0IGFueXdheSBzbyB0aGF0IHRoZSB1ZHAgY2hlY2tzdW0gY29tZXMgb3V0CiAgICAgKiByaWdodC4KICAgICAqLwoKICAgIG91dGlwLT5pcF9zdW0gPQogICAgICAgIGluX2NoZWNrc3VtKCh1X3Nob3J0ICopIG91dGlwLCBzaXplb2YoKm91dGlwKSArIG9wdGxlbik7CiAgICBpZiAob3V0aXAtPmlwX3N1bSA9PSAwKQogICAgICAgIG91dGlwLT5pcF9zdW0gPSAweGZmZmY7CgoKICAgIC8qCiAgICAgKiBQYXlsb2FkIAogICAgICovCiAgICBvdXRkYXRhLT5zZXEgPSBzZXE7CiAgICBvdXRkYXRhLT50dGwgPSB0dGw7CiAgICBvdXRkYXRhLT50diA9ICp0cDsKCgogICAgb3V0dWRwLT5kZXN0ID0gaHRvbnMocG9ydCArIHNlcSk7CgoKICAgIC8qCiAgICAgKiBDaGVja3N1bSAod2UgbXVzdCBzYXZlIGFuZCByZXN0b3JlIGlwIGhlYWRlcikgCiAgICAgKi8KICAgIHRpcCA9ICpvdXRpcDsKICAgIHVpID0gKHN0cnVjdCB1ZHBpcGhkciAqKSBvdXRpcDsKICAgIG91aSA9IChzdHJ1Y3QgdWRwaXBoZHIgKikgJnRpcDsKICAgIC8qCiAgICAgKiBFYXNpZXIgdG8gemVybyBhbmQgcHV0IGJhY2sgdGhpbmdzIHRoYXQgYXJlIG9rIAogICAgICovCiAgICBtZW1zZXQoKGNoYXIgKikgdWksIDAsIHNpemVvZih1aS0+dWlfaSkpOwogICAgdWktPnVpX3NyYyA9IG91aS0+dWlfc3JjOwogICAgdWktPnVpX2RzdCA9IG91aS0+dWlfZHN0OwogICAgdWktPnVpX3ByID0gb3VpLT51aV9wcjsKICAgIHVpLT51aV9sZW4gPSBvdXR1ZHAtPmxlbjsKICAgIG91dHVkcC0+Y2hlY2sgPSAwOwogICAgb3V0dWRwLT5jaGVjayA9IGluX2NoZWNrc3VtKCh1X3Nob3J0ICopIHVpLCBwYWNrbGVuKTsKICAgIGlmIChvdXR1ZHAtPmNoZWNrID09IDApCiAgICAgICAgb3V0dWRwLT5jaGVjayA9IDB4ZmZmZjsKICAgICpvdXRpcCA9IHRpcDsKCgogICAgLyoKICAgICAqIFhYWCB1bmRvY3VtZW50ZWQgZGVidWdnaW5nIGhhY2sgCiAgICAgKi8KCgojaWYgIWRlZmluZWQoSVBfSERSSU5DTCkgJiYgZGVmaW5lZChJUF9UVEwpCiAgICBwcmludGYoInR0bFxuIik7CiAgICBpZiAoc2V0c29ja29wdChzbmRzb2NrLCBJUFBST1RPX0lQLCBJUF9UVEwsCiAgICAgICAgICAgICAgICAgICAoY2hhciAqKSAmdHRsLCBzaXplb2YodHRsKSkgPCAwKSB7CiAgICAgICAgRnByaW50ZihzdGRlcnIsICIlczogc2V0c29ja29wdCB0dGwgJWQ6ICVzXG4iLAogICAgICAgICAgICAgICAgInRyYWNlcm91dGUiLCB0dGwsIHN0cmVycm9yKGVycm5vKSk7CiAgICAgICAgZXhpdCgxKTsKICAgIH0KI2VuZGlmCgojaWZkZWYgX19ocHV4CgogICAgUHJpbnRmKCJ3aGVyZXRvPSVzXG4iLAogICAgICAgICAgIGluZXRfbnRvYSgoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSB3aGVyZXRvKS0+c2luX2FkZHIpKTsKICAgIGNjID0gc2VuZHRvKHNuZHNvY2ssIChjaGFyICopIG91dHVkcCwKICAgICAgICAgICAgICAgIHBhY2tsZW4gLSAoc2l6ZW9mKCpvdXRpcCkgKyBvcHRsZW4pLCAwLCB3aGVyZXRvLAogICAgICAgICAgICAgICAgc2l6ZW9mKCp3aGVyZXRvKSk7CiAgICBpZiAoY2MgPiAwKQogICAgICAgIGNjICs9IHNpemVvZigqb3V0aXApICsgb3B0bGVuOwojZWxzZQoKICAgIGNjID0gc2VuZHRvKHNuZHNvY2ssIChjaGFyICopIG91dGlwLAogICAgICAgICAgICAgICAgcGFja2xlbiwgMCwgd2hlcmV0bywgc2l6ZW9mKCp3aGVyZXRvKSk7CiNlbmRpZgogICAgaWYgKGNjIDwgMCB8fCBjYyAhPSBwYWNrbGVuKSB7CiAgICAgICAgaWYgKGNjIDwgMCkKICAgICAgICAgICAgRnByaW50ZihzdGRlcnIsICIlczogc2VuZHRvOiAlc1xuIiwgInRyYWNlcm91dGUiLCBzdHJlcnJvcihlcnJubykpOwogICAgICAgIFByaW50ZigiJXM6IHdyb3RlICVzICVkIGNoYXJzLCByZXQ9JWRcbiIsCiAgICAgICAgICAgICAgICJ0cmFjZXJvdXRlIiwgaG9zdG5hbWUsIHBhY2tsZW4sIGNjKTsKICAgICAgICAodm9pZCkgZmZsdXNoKHN0ZG91dCk7CiAgICB9Cn0KCgoKdm9pZApzZW5kX3Byb2JlX3Y2KGludCBzZXEsIGludCB0dGwsIGNoYXIgKnNlbmRidWZmLCBwaWRfdCBpZGVudCwKICAgICAgICAgICAgICBzdHJ1Y3QgdGltZXpvbmUgKnR6LCBpbnQgc25kc29jaywgaW50IGRhdGFsZW4sCiAgICAgICAgICAgICAgc3RydWN0IHNvY2thZGRyX2luNiAqd2hlcmV0bywgY2hhciAqaG9zdG5hbWUpCnsKICAgIHN0cnVjdCBwa3RfZm9ybWF0ICpwa3QgPSAoc3RydWN0IHBrdF9mb3JtYXQgKikgc2VuZGJ1ZmY7CiAgICBpbnQgICAgICAgICAgICAgaSA9IDA7CgogICAgcGt0LT5pZGVudCA9IGh0b25sKGlkZW50KTsKICAgIHBrdC0+c2VxID0gaHRvbmwoc2VxKTsKICAgIGdldHRpbWVvZmRheSgmcGt0LT50diwgdHopOwoKICAgIGkgPSBzZXRzb2Nrb3B0KHNuZHNvY2ssIFNPTF9JUFY2LCBJUFY2X1VOSUNBU1RfSE9QUywgJnR0bCwKICAgICAgICAgICAgICAgICAgIHNpemVvZihpbnQpKTsKICAgIGlmIChpIDwgMCkgewogICAgICAgIHBlcnJvcigic2V0c29ja29wdCIpOwogICAgICAgIGV4aXQoMSk7CiAgICB9CgogICAgZG8gewogICAgICAgIGkgPSBzZW5kdG8oc25kc29jaywgc2VuZGJ1ZmYsIGRhdGFsZW4sIDAsCiAgICAgICAgICAgICAgICAgICAoc3RydWN0IHNvY2thZGRyICopIHdoZXJldG8sCiAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luNikpOwogICAgfSB3aGlsZSAoaSA8IDAgJiYgZXJybm8gPT0gRUNPTk5SRUZVU0VEKTsKCiAgICBpZiAoaSA8IDAgfHwgaSAhPSBkYXRhbGVuKSB7CiAgICAgICAgaWYgKGkgPCAwKQogICAgICAgICAgICBwZXJyb3IoInNlbmR0byIpOwogICAgICAgIFByaW50ZigidHJhY2Vyb3V0ZTogd3JvdGUgJXMgJWQgY2hhcnMsIHJldD0lZFxuIiwgaG9zdG5hbWUsCiAgICAgICAgICAgICAgIGRhdGFsZW4sIGkpOwogICAgICAgICh2b2lkKSBmZmx1c2goc3Rkb3V0KTsKICAgIH0KfQoKCnVuc2lnbmVkIGxvbmcKZGVsdGFUKHN0cnVjdCB0aW1ldmFsICp0MXAsIHN0cnVjdCB0aW1ldmFsICp0MnApCnsKICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgZHQ7CgogICAgZHQgPSAodW5zaWduZWQgbG9uZykgKChsb25nKSAodDJwLT50dl9zZWMgLSB0MXAtPnR2X3NlYykgKiAxMDAwICsKICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZykgKHQycC0+dHZfdXNlYyAtIHQxcC0+dHZfdXNlYykgLyAxMDAwKTsKICAgIHJldHVybiAoZHQpOwp9CgoKaW50CnBhY2tldF9vayhyZWdpc3RlciB1X2NoYXIgKiBidWYsIGludCBjYywgcmVnaXN0ZXIgc3RydWN0IHNvY2thZGRyX2luICpmcm9tLAogICAgICAgICAgcmVnaXN0ZXIgaW50IHNlcSwgdV9zaG9ydCBpZGVudCwgaW50IHBtdHUsIHVfc2hvcnQgcG9ydCkKewogICAgcmVnaXN0ZXIgc3RydWN0IGljbXAgKmljcCA9IE5VTEw7CiAgICByZWdpc3RlciB1X2NoYXIgdHlwZSwgY29kZTsKICAgIHJlZ2lzdGVyIGludCAgICBobGVuID0gMDsKI2lmbmRlZiBBUkNIQUlDCiAgICByZWdpc3RlciBzdHJ1Y3QgaXAgKmlwID0gTlVMTDsKCiAgICBpcCA9IChzdHJ1Y3QgaXAgKikgYnVmOwogICAgaGxlbiA9IGlwLT5pcF9obCA8PCAyOwogICAgaWYgKGNjIDwgaGxlbiArIElDTVBfTUlOTEVOKSB7CgogICAgICAgIHJldHVybiAoMCk7CiAgICB9CiAgICBjYyAtPSBobGVuOwogICAgaWNwID0gKHN0cnVjdCBpY21wICopIChidWYgKyBobGVuKTsKI2Vsc2UKICAgIGljcCA9IChzdHJ1Y3QgaWNtcCAqKSBidWY7CiNlbmRpZgogICAgdHlwZSA9IGljcC0+aWNtcF90eXBlOwogICAgY29kZSA9IGljcC0+aWNtcF9jb2RlOwogICAgLyoKICAgICAqIFBhdGggTVRVIERpc2NvdmVyeSAoUkZDMTE5MSkgCiAgICAgKi8KICAgIGlmIChjb2RlICE9IElDTVBfVU5SRUFDSF9ORUVERlJBRykKICAgICAgICBwbXR1ID0gMDsKICAgIGVsc2UgewojaWZkZWYgSEFWRV9JQ01QX05FWFRNVFUKICAgICAgICBwbXR1ID0gbnRvaHMoaWNwLT5pY21wX25leHRtdHUpOwojZWxzZQogICAgICAgIHBtdHUgPSBudG9ocygoKHN0cnVjdCBteV9wbXR1ICopICZpY3AtPmljbXBfdm9pZCktPmlwbV9uZXh0bXR1KTsKI2VuZGlmCiAgICB9CiAgICBpZiAoKHR5cGUgPT0gSUNNUF9USU1YQ0VFRCAmJiBjb2RlID09IElDTVBfVElNWENFRURfSU5UUkFOUykgfHwKICAgICAgICB0eXBlID09IElDTVBfVU5SRUFDSCB8fCB0eXBlID09IElDTVBfRUNIT1JFUExZKSB7CiAgICAgICAgcmVnaXN0ZXIgc3RydWN0IGlwICpoaXA7CiAgICAgICAgcmVnaXN0ZXIgc3RydWN0IHVkcGhkciAqdXA7CgogICAgICAgIGhpcCA9ICZpY3AtPmljbXBfaXA7CiAgICAgICAgaGxlbiA9IGhpcC0+aXBfaGwgPDwgMjsKICAgICAgICB1cCA9IChzdHJ1Y3QgdWRwaGRyICopICgodV9jaGFyICopIGhpcCArIGhsZW4pOwogICAgICAgIC8qCiAgICAgICAgICogWFhYIDggaXMgYSBtYWdpYyBudW1iZXIgCiAgICAgICAgICovCiAgICAgICAgaWYgKGhsZW4gKyAxMiA8PSBjYyAmJgogICAgICAgICAgICBoaXAtPmlwX3AgPT0gSVBQUk9UT19VRFAgJiYKICAgICAgICAgICAgdXAtPnNvdXJjZSA9PSBodG9ucyhpZGVudCkgJiYgdXAtPmRlc3QgPT0gaHRvbnMocG9ydCArIHNlcSkpCiAgICAgICAgICAgIHJldHVybiAodHlwZSA9PSBJQ01QX1RJTVhDRUVEID8gLTEgOiBjb2RlICsgMSk7CiAgICB9CgoKICAgIHJldHVybiAoMCk7Cn0KCgoKCmludApwYWNrZXRfb2tfdjYodV9jaGFyICogYnVmLCBpbnQgY2MsIHN0cnVjdCBzb2NrYWRkcl9pbjYgKmZyb20sIGludCBzZXEsCiAgICAgICAgICAgICBzdHJ1Y3QgdGltZXZhbCAqdHYsIHBpZF90IGlkZW50KQp7CiAgICBzdHJ1Y3QgaWNtcDZfaGRyICppY3AgPSBOVUxMOwogICAgdV9jaGFyICAgICAgICAgIHR5cGUsIGNvZGU7CgogICAgaWNwID0gKHN0cnVjdCBpY21wNl9oZHIgKikgYnVmOwoKICAgIHR5cGUgPSBpY3AtPmljbXA2X3R5cGU7CiAgICBjb2RlID0gaWNwLT5pY21wNl9jb2RlOwoKICAgIGlmICgodHlwZSA9PSBJQ01QNl9USU1FX0VYQ0VFREVEICYmIGNvZGUgPT0gSUNNUDZfVElNRV9FWENFRURfVFJBTlNJVCkgfHwKICAgICAgICB0eXBlID09IElDTVA2X0RTVF9VTlJFQUNIKSB7CiAgICAgICAgc3RydWN0IGlwNl9oZHIgICpoaXAgPSBOVUxMOwogICAgICAgIHN0cnVjdCB1ZHBoZHIgICp1cCA9IE5VTEw7CiAgICAgICAgaW50ICAgICAgICAgICAgIG5leHRoZHIgPSAwOwoKICAgICAgICBoaXAgPSAoc3RydWN0IGlwNl9oZHIgKikgKGljcCArIDEpOwogICAgICAgIHVwID0gKHN0cnVjdCB1ZHBoZHIgKikgKGhpcCArIDEpOwogICAgICAgIG5leHRoZHIgPSBoaXAtPmlwNl9ueHQ7CgogICAgICAgIGlmIChuZXh0aGRyID09IDQ0KSB7CiAgICAgICAgICAgIG5leHRoZHIgPSAqKHVuc2lnbmVkIGNoYXIgKikgdXA7CiAgICAgICAgICAgIHVwKys7CiAgICAgICAgfQogICAgICAgIGlmIChuZXh0aGRyID09IElQUFJPVE9fVURQKSB7CiAgICAgICAgICAgIHN0cnVjdCBwa3RfZm9ybWF0ICpwa3Q7CgogICAgICAgICAgICBwa3QgPSAoc3RydWN0IHBrdF9mb3JtYXQgKikgKHVwICsgMSk7CgogICAgICAgICAgICBpZiAobnRvaGwocGt0LT5pZGVudCkgPT0gaWRlbnQgJiYgbnRvaGwocGt0LT5zZXEpID09IHNlcSkgewogICAgICAgICAgICAgICAgKnR2ID0gcGt0LT50djsKICAgICAgICAgICAgICAgIHJldHVybiAodHlwZSA9PSBJQ01QNl9USU1FX0VYQ0VFREVEID8gLTEgOiBjb2RlICsgMSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgfQoKICAgIHJldHVybiAoMCk7Cn0KCgovKgogKiBDaGVja3N1bSByb3V0aW5lIGZvciBJbnRlcm5ldCBQcm90b2NvbCBmYW1pbHkgaGVhZGVycyAoQyBWZXJzaW9uKQogKi8KCnVfc2hvcnQKaW5fY2hlY2tzdW0ocmVnaXN0ZXIgdV9zaG9ydCAqIGFkZHIsIHJlZ2lzdGVyIGludCBsZW4pCnsKICAgIHJlZ2lzdGVyIGludCAgICBubGVmdCA9IGxlbjsKICAgIHJlZ2lzdGVyIHVfc2hvcnQgKncgPSBhZGRyOwogICAgcmVnaXN0ZXIgdV9zaG9ydCBhbnN3ZXI7CiAgICByZWdpc3RlciBpbnQgICAgc3VtID0gMDsKCiAgICAvKgogICAgICogIE91ciBhbGdvcml0aG0gaXMgc2ltcGxlLCB1c2luZyBhIDMyIGJpdCBhY2N1bXVsYXRvciAoc3VtKSwKICAgICAqICB3ZSBhZGQgc2VxdWVudGlhbCAxNiBiaXQgd29yZHMgdG8gaXQsIGFuZCBhdCB0aGUgZW5kLCBmb2xkCiAgICAgKiAgYmFjayBhbGwgdGhlIGNhcnJ5IGJpdHMgZnJvbSB0aGUgdG9wIDE2IGJpdHMgaW50byB0aGUgbG93ZXIKICAgICAqICAxNiBiaXRzLgogICAgICovCiAgICB3aGlsZSAobmxlZnQgPiAxKSB7CiAgICAgICAgc3VtICs9ICp3Kys7CiAgICAgICAgbmxlZnQgLT0gMjsKICAgIH0KCiAgICAvKgogICAgICogbW9wIHVwIGFuIG9kZCBieXRlLCBpZiBuZWNlc3NhcnkgCiAgICAgKi8KICAgIGlmIChubGVmdCA9PSAxKQogICAgICAgIHN1bSArPSAqKHVfY2hhciAqKSB3OwoKICAgIC8qCiAgICAgKiBhZGQgYmFjayBjYXJyeSBvdXRzIGZyb20gdG9wIDE2IGJpdHMgdG8gbG93IDE2IGJpdHMKICAgICAqLwogICAgc3VtID0gKHN1bSA+PiAxNikgKyAoc3VtICYgMHhmZmZmKTsgLyogYWRkIGhpIDE2IHRvIGxvdyAxNiAqLwogICAgc3VtICs9IChzdW0gPj4gMTYpOyAgICAgICAgIC8qIGFkZCBjYXJyeSAqLwogICAgYW5zd2VyID0gfnN1bTsgICAgICAgICAgICAgIC8qIHRydW5jYXRlIHRvIDE2IGJpdHMgKi8KICAgIHJldHVybiAoYW5zd2VyKTsKfQoKLyoKICogU3VidHJhY3QgMiB0aW1ldmFsIHN0cnVjdHM6ICBvdXQgPSBvdXQgLSBpbi4KICogT3V0IGlzIGFzc3VtZWQgdG8gYmUgPj0gaW4uCiAqLwp2b2lkCnR2c3ViKHJlZ2lzdGVyIHN0cnVjdCB0aW1ldmFsICpvdXQsIHJlZ2lzdGVyIHN0cnVjdCB0aW1ldmFsICppbikKewoKICAgIGlmICgob3V0LT50dl91c2VjIC09IGluLT50dl91c2VjKSA8IDApIHsKICAgICAgICAtLW91dC0+dHZfc2VjOwogICAgICAgIG91dC0+dHZfdXNlYyArPSAxMDAwMDAwOwogICAgfQogICAgb3V0LT50dl9zZWMgLT0gaW4tPnR2X3NlYzsKfQoKCnN0cnVjdCBob3N0aW5mbyAqCmdldGhvc3RpbmZvKHJlZ2lzdGVyIGNoYXIgKmhvc3RuYW1lKQp7CiAgICByZWdpc3RlciBpbnQgICAgbjsKICAgIHJlZ2lzdGVyIHN0cnVjdCBob3N0ZW50ICpocCA9IE5VTEw7CiAgICByZWdpc3RlciBzdHJ1Y3QgaG9zdGluZm8gKmhpID0gTlVMTDsKICAgIHJlZ2lzdGVyIGNoYXIgKipwID0gTlVMTDsKICAgIHJlZ2lzdGVyIHVfaW50MzJfdCBhZGRyLCAqYXAgPSBOVUxMOwoKICAgIGlmIChzdHJsZW4oaG9zdG5hbWUpID4gNjQpIHsKICAgICAgICBGcHJpbnRmKHN0ZGVyciwgIiVzOiBob3N0bmFtZSBcIiUuMzJzLi4uXCIgaXMgdG9vIGxvbmdcbiIsCiAgICAgICAgICAgICAgICAidHJhY2Vyb3V0ZSIsIGhvc3RuYW1lKTsKICAgICAgICBleGl0KDEpOwogICAgfQogICAgaGkgPSBjYWxsb2MoMSwgc2l6ZW9mKCpoaSkpOwogICAgaWYgKGhpID09IE5VTEwpIHsKICAgICAgICBGcHJpbnRmKHN0ZGVyciwgIiVzOiBjYWxsb2MgJXNcbiIsICJ0cmFjZXJvdXRlIiwgc3RyZXJyb3IoZXJybm8pKTsKICAgICAgICBleGl0KDEpOwogICAgfQogICAgYWRkciA9IGluZXRfYWRkcihob3N0bmFtZSk7CiAgICBpZiAoKGludDMyX3QpIGFkZHIgIT0gLTEpIHsKICAgICAgICBoaS0+bmFtZSA9IHN0cmR1cChob3N0bmFtZSk7CiAgICAgICAgaGktPm4gPSAxOwogICAgICAgIGhpLT5hZGRycyA9IGNhbGxvYygxLCBzaXplb2YoaGktPmFkZHJzWzBdKSk7CiAgICAgICAgaWYgKGhpLT5hZGRycyA9PSBOVUxMKSB7CiAgICAgICAgICAgIEZwcmludGYoc3RkZXJyLCAiJXM6IGNhbGxvYyAlc1xuIiwgInRyYWNlcm91dGUiLCBzdHJlcnJvcihlcnJubykpOwogICAgICAgICAgICBleGl0KDEpOwogICAgICAgIH0KICAgICAgICBoaS0+YWRkcnNbMF0gPSBhZGRyOwogICAgICAgIHJldHVybiAoaGkpOwogICAgfQoKICAgIGhwID0gZ2V0aG9zdGJ5bmFtZShob3N0bmFtZSk7CiAgICBpZiAoaHAgPT0gTlVMTCkgewogICAgICAgIEZwcmludGYoc3RkZXJyLCAiJXM6IHVua25vd24gaG9zdCAlc1xuIiwgInRyYWNlcm91dGUiLCBob3N0bmFtZSk7CiAgICAgICAgcHJpbnRmKCJocD1OVUxMXG4iKTsKICAgICAgICBleGl0KDEpOwogICAgfQogICAgaWYgKGhwLT5oX2FkZHJ0eXBlICE9IEFGX0lORVQgfHwgaHAtPmhfbGVuZ3RoICE9IDQpIHsKICAgICAgICBGcHJpbnRmKHN0ZGVyciwgIiVzOiBiYWQgaG9zdCAlc1xuIiwgInRyYWNlcm91dGUiLCBob3N0bmFtZSk7CiAgICAgICAgZXhpdCgxKTsKICAgIH0KICAgIGhpLT5uYW1lID0gc3RyZHVwKGhwLT5oX25hbWUpOwogICAgZm9yIChuID0gMCwgcCA9IGhwLT5oX2FkZHJfbGlzdDsgKnAgIT0gTlVMTDsgKytuLCArK3ApCiAgICAgICAgY29udGludWU7CiAgICBoaS0+biA9IG47CiAgICBoaS0+YWRkcnMgPSBjYWxsb2Mobiwgc2l6ZW9mKGhpLT5hZGRyc1swXSkpOwogICAgaWYgKGhpLT5hZGRycyA9PSBOVUxMKSB7CiAgICAgICAgRnByaW50ZihzdGRlcnIsICIlczogY2FsbG9jICVzXG4iLCAidHJhY2Vyb3V0ZSIsIHN0cmVycm9yKGVycm5vKSk7CiAgICAgICAgZXhpdCgxKTsKICAgIH0KICAgIGZvciAoYXAgPSBoaS0+YWRkcnMsIHAgPSBocC0+aF9hZGRyX2xpc3Q7ICpwICE9IE5VTEw7ICsrYXAsICsrcCkKICAgICAgICBtZW1jcHkoYXAsICpwLCBzaXplb2YoKmFwKSk7CiAgICByZXR1cm4gKGhpKTsKfQoKdm9pZApmcmVlaG9zdGluZm8ocmVnaXN0ZXIgc3RydWN0IGhvc3RpbmZvICpoaSkKewogICAgaWYgKGhpLT5uYW1lICE9IE5VTEwpIHsKICAgICAgICBmcmVlKGhpLT5uYW1lKTsKICAgICAgICBoaS0+bmFtZSA9IE5VTEw7CiAgICB9CiAgICBmcmVlKChjaGFyICopIGhpLT5hZGRycyk7CiAgICBmcmVlKChjaGFyICopIGhpKTsKfQoKdm9pZApzZXRzaW4ocmVnaXN0ZXIgc3RydWN0IHNvY2thZGRyX2luICpzaW4sIHJlZ2lzdGVyIHVfaW50MzJfdCBhZGRyKQp7CgogICAgbWVtc2V0KHNpbiwgMCwgc2l6ZW9mKCpzaW4pKTsKI2lmZGVmIEhBVkVfU09DS0FERFJfU0FfTEVOCiAgICBzaW4tPnNpbl9sZW4gPSBzaXplb2YoKnNpbik7CiNlbmRpZgogICAgc2luLT5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKICAgIHNpbi0+c2luX2FkZHIuc19hZGRyID0gYWRkcjsKfQoKCi8qCiAqIFJldHVybiB0aGUgc291cmNlIGFkZHJlc3MgZm9yIHRoZSBnaXZlbiBkZXN0aW5hdGlvbiBhZGRyZXNzCiAqLwpjb25zdCBjaGFyICAgICAqCmZpbmRzYWRkcihyZWdpc3RlciBjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW4gKnRvLAogICAgICAgICAgcmVnaXN0ZXIgc3RydWN0IHNvY2thZGRyX2luICpmcm9tKQp7CiAgICByZWdpc3RlciBpbnQgICAgaSwgbjsKICAgIHJlZ2lzdGVyIEZJTEUgICpmOwogICAgcmVnaXN0ZXIgdV9pbnQzMl90IG1hc2s7CiAgICB1X2ludDMyX3QgICAgICAgZGVzdCwgdG1hc2s7CiAgICBzdHJ1Y3QgaWZhZGRybGlzdCAqYWw7CiAgICBjaGFyICAgICAgICAgICAgYnVmWzI1Nl0sIHRkZXZpY2VbMjU2XSwgZGV2aWNlWzI1Nl07CiAgICBzdGF0aWMgY2hhciAgICAgZXJyYnVmWzEzMl07CiAgICBzdGF0aWMgY29uc3QgY2hhciByb3V0ZVtdID0gIi9wcm9jL25ldC9yb3V0ZSI7CgogICAgaWYgKChmID0gZm9wZW4ocm91dGUsICJyIikpID09IE5VTEwpIHsKICAgICAgICBzcHJpbnRmKGVycmJ1ZiwgIm9wZW4gJXM6ICUuMTI4cyIsIHJvdXRlLCBzdHJlcnJvcihlcnJubykpOwogICAgICAgIHJldHVybiAoZXJyYnVmKTsKICAgIH0KCiAgICAvKgogICAgICogRmluZCB0aGUgYXBwcm9wcmlhdGUgaW50ZXJmYWNlIAogICAgICovCiAgICBuID0gMDsKICAgIG1hc2sgPSAwOwogICAgZGV2aWNlWzBdID0gJ1wwJzsKICAgIHdoaWxlIChmZ2V0cyhidWYsIHNpemVvZihidWYpLCBmKSAhPSBOVUxMKSB7CiAgICAgICAgKytuOwogICAgICAgIGlmIChuID09IDEgJiYgc3RybmNtcChidWYsICJJZmFjZSIsIDUpID09IDApCiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIGlmICgoaSA9IHNzY2FuZihidWYsICIlcyAleCAlKnMgJSpzICUqcyAlKnMgJSpzICV4IiwKICAgICAgICAgICAgICAgICAgICAgICAgdGRldmljZSwgJmRlc3QsICZ0bWFzaykpICE9IDMpCiAgICAgICAgICAgIHJldHVybiAoImp1bmsgaW4gYnVmZmVyIik7CiAgICAgICAgaWYgKCh0by0+c2luX2FkZHIuc19hZGRyICYgdG1hc2spID09IGRlc3QgJiYKICAgICAgICAgICAgKHRtYXNrID4gbWFzayB8fCBtYXNrID09IDApKSB7CiAgICAgICAgICAgIG1hc2sgPSB0bWFzazsKICAgICAgICAgICAgc3RyY3B5KGRldmljZSwgdGRldmljZSk7CiAgICAgICAgfQogICAgfQogICAgZmNsb3NlKGYpOwoKICAgIGlmIChkZXZpY2VbMF0gPT0gJ1wwJykKICAgICAgICByZXR1cm4gKCJDYW4ndCBmaW5kIGludGVyZmFjZSIpOwoKICAgIC8qCiAgICAgKiBHZXQgdGhlIGludGVyZmFjZSBhZGRyZXNzIGxpc3QgCiAgICAgKi8KICAgIGlmICgobiA9IGlmYWRkcmxpc3QoJmFsLCBlcnJidWYpKSA8IDApCiAgICAgICAgcmV0dXJuIChlcnJidWYpOwoKICAgIGlmIChuID09IDApCiAgICAgICAgcmV0dXJuICgiQ2FuJ3QgZmluZCBhbnkgbmV0d29yayBpbnRlcmZhY2VzIik7CgogICAgLyoKICAgICAqIEZpbmQgb3VyIGFwcHJvcHJpYXRlIHNvdXJjZSBhZGRyZXNzIAogICAgICovCiAgICBmb3IgKGkgPSBuOyBpID4gMDsgLS1pLCArK2FsKQogICAgICAgIGlmIChzdHJjbXAoZGV2aWNlLCBhbC0+ZGV2aWNlKSA9PSAwKQogICAgICAgICAgICBicmVhazsKICAgIGlmIChpIDw9IDApIHsKICAgICAgICBzcHJpbnRmKGVycmJ1ZiwgIkNhbid0IGZpbmQgaW50ZXJmYWNlIFwiJS4zMnNcIiIsIGRldmljZSk7CiAgICAgICAgcmV0dXJuIChlcnJidWYpOwogICAgfQoKICAgIHNldHNpbihmcm9tLCBhbC0+YWRkcik7CiAgICByZXR1cm4gKE5VTEwpOwp9CgppbnQKaWZhZGRybGlzdChyZWdpc3RlciBzdHJ1Y3QgaWZhZGRybGlzdCAqKmlwYWRkcnAsIHJlZ2lzdGVyIGNoYXIgKmVycmJ1ZikKewogICAgcmVnaXN0ZXIgaW50ICAgIGZkLCBuaXBhZGRyOwojaWZkZWYgSEFWRV9TT0NLQUREUl9TQV9MRU4KICAgIHJlZ2lzdGVyIGludCAgICBuOwojZW5kaWYKICAgIHJlZ2lzdGVyIHN0cnVjdCBpZnJlcSAqaWZycCwgKmlmZW5kLCAqaWZuZXh0OwogICAgcmVnaXN0ZXIgc3RydWN0IHNvY2thZGRyX2luICpzaW47CiAgICByZWdpc3RlciBzdHJ1Y3QgaWZhZGRybGlzdCAqYWw7CiAgICBzdHJ1Y3QgaWZjb25mICAgaWZjOwogICAgc3RydWN0IGlmcmVxICAgIGlidWZbKDMyICogMTAyNCkgLyBzaXplb2Yoc3RydWN0IGlmcmVxKV0sIGlmcjsKI2RlZmluZSBNQVhfSVBBRERSIChzaXplb2YoaWJ1ZikgLyBzaXplb2YoaWJ1ZlswXSkpCiAgICBzdGF0aWMgc3RydWN0IGlmYWRkcmxpc3QgaWZhZGRybGlzdFtNQVhfSVBBRERSXTsKICAgIGNoYXIgICAgICAgICAgICBkZXZpY2Vbc2l6ZW9mKGlmci5pZnJfbmFtZSkgKyAxXTsKCiAgICBmZCA9IHNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCAwKTsKICAgIGlmIChmZCA8IDApIHsKICAgICAgICAodm9pZCkgc3ByaW50ZihlcnJidWYsICJzb2NrZXQ6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKICAgICAgICByZXR1cm4gKC0xKTsKICAgIH0KICAgIGlmYy5pZmNfbGVuID0gc2l6ZW9mKGlidWYpOwogICAgaWZjLmlmY19idWYgPSAoY2FkZHJfdCkgaWJ1ZjsKCiAgICBpZiAoaW9jdGwoZmQsIFNJT0NHSUZDT05GLCAoY2hhciAqKSAmaWZjKSA8IDAgfHwKICAgICAgICBpZmMuaWZjX2xlbiA8IHNpemVvZihzdHJ1Y3QgaWZyZXEpKSB7CiAgICAgICAgaWYgKGVycm5vID09IEVJTlZBTCkKICAgICAgICAgICAgKHZvaWQpIHNwcmludGYoZXJyYnVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiU0lPQ0dJRkNPTkY6IGlmcmVxIHN0cnVjdCB0b28gc21hbGwgKCVkIGJ5dGVzKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpc2l6ZW9mKGlidWYpKTsKICAgICAgICBlbHNlCiAgICAgICAgICAgICh2b2lkKSBzcHJpbnRmKGVycmJ1ZiwgIlNJT0NHSUZDT05GOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CiAgICAgICAgKHZvaWQpIGNsb3NlKGZkKTsKICAgICAgICByZXR1cm4gKC0xKTsKICAgIH0KICAgIGlmcnAgPSBpYnVmOwogICAgaWZlbmQgPSAoc3RydWN0IGlmcmVxICopICgoY2hhciAqKSBpYnVmICsgaWZjLmlmY19sZW4pOwoKICAgIGFsID0gaWZhZGRybGlzdDsKICAgIG5pcGFkZHIgPSAwOwogICAgZm9yICg7IGlmcnAgPCBpZmVuZDsgaWZycCA9IGlmbmV4dCkgewojaWZkZWYgSEFWRV9TT0NLQUREUl9TQV9MRU4KICAgICAgICBuID0gaWZycC0+aWZyX2FkZHIuc2FfbGVuICsgc2l6ZW9mKGlmcnAtPmlmcl9uYW1lKTsKICAgICAgICBpZiAobiA8IHNpemVvZigqaWZycCkpCiAgICAgICAgICAgIGlmbmV4dCA9IGlmcnAgKyAxOwogICAgICAgIGVsc2UKICAgICAgICAgICAgaWZuZXh0ID0gKHN0cnVjdCBpZnJlcSAqKSAoKGNoYXIgKikgaWZycCArIG4pOwogICAgICAgIGlmIChpZnJwLT5pZnJfYWRkci5zYV9mYW1pbHkgIT0gQUZfSU5FVCkKICAgICAgICAgICAgY29udGludWU7CiNlbHNlCiAgICAgICAgaWZuZXh0ID0gaWZycCArIDE7CiNlbmRpZgogICAgICAgIC8qCiAgICAgICAgICogTmVlZCBhIHRlbXBsYXRlIHRvIHByZXNlcnZlIGFkZHJlc3MgaW5mbyB0aGF0IGlzCiAgICAgICAgICogdXNlZCBiZWxvdyB0byBsb2NhdGUgdGhlIG5leHQgZW50cnkuICAoT3RoZXJ3aXNlLAogICAgICAgICAqIFNJT0NHSUZGTEFHUyBzdG9tcHMgb3ZlciBpdCBiZWNhdXNlIHRoZSByZXF1ZXN0cwogICAgICAgICAqIGFyZSByZXR1cm5lZCBpbiBhIHVuaW9uLikKICAgICAgICAgKi8KICAgICAgICBzdHJsY3B5KGlmci5pZnJfbmFtZSwgaWZycC0+aWZyX25hbWUsIHNpemVvZihpZnIuaWZyX25hbWUpKTsKICAgICAgICBpZiAoaW9jdGwoZmQsIFNJT0NHSUZGTEFHUywgKGNoYXIgKikgJmlmcikgPCAwKSB7CiAgICAgICAgICAgIGlmIChlcnJubyA9PSBFTlhJTykKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAodm9pZCkgc3ByaW50ZihlcnJidWYsICJTSU9DR0lGRkxBR1M6ICUuKnM6ICVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgc2l6ZW9mKGlmci5pZnJfbmFtZSksIGlmci5pZnJfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoZXJybm8pKTsKICAgICAgICAgICAgKHZvaWQpIGNsb3NlKGZkKTsKICAgICAgICAgICAgcmV0dXJuICgtMSk7CiAgICAgICAgfQoKICAgICAgICAvKgogICAgICAgICAqIE11c3QgYmUgdXAgCiAgICAgICAgICovCiAgICAgICAgaWYgKChpZnIuaWZyX2ZsYWdzICYgSUZGX1VQKSA9PSAwKQogICAgICAgICAgICBjb250aW51ZTsKCiAgICAgICAgc3ByaW50ZihkZXZpY2UsICIlLipzIiwgKGludCkgc2l6ZW9mKGlmci5pZnJfbmFtZSksIGlmci5pZnJfbmFtZSk7CiNpZmRlZiBzdW4KICAgICAgICAvKgogICAgICAgICAqIElnbm9yZSBzdW4gdmlydHVhbCBpbnRlcmZhY2VzIAogICAgICAgICAqLwogICAgICAgIGlmIChzdHJjaHIoZGV2aWNlLCAnOicpICE9IE5VTEwpCiAgICAgICAgICAgIGNvbnRpbnVlOwojZW5kaWYKICAgICAgICBpZiAoaW9jdGwoZmQsIFNJT0NHSUZBRERSLCAoY2hhciAqKSAmaWZyKSA8IDApIHsKICAgICAgICAgICAgKHZvaWQpIHNwcmludGYoZXJyYnVmLCAiU0lPQ0dJRkFERFI6ICVzOiAlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwgc3RyZXJyb3IoZXJybm8pKTsKICAgICAgICAgICAgKHZvaWQpIGNsb3NlKGZkKTsKICAgICAgICAgICAgcmV0dXJuICgtMSk7CiAgICAgICAgfQoKICAgICAgICBpZiAobmlwYWRkciA+PSBNQVhfSVBBRERSKSB7CiAgICAgICAgICAgICh2b2lkKSBzcHJpbnRmKGVycmJ1ZiwgIlRvbyBtYW55IGludGVyZmFjZXMgKCVkKSIsIG5pcGFkZHIpOwogICAgICAgICAgICAodm9pZCkgY2xvc2UoZmQpOwogICAgICAgICAgICByZXR1cm4gKC0xKTsKICAgICAgICB9CiAgICAgICAgc2luID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSAmaWZyLmlmcl9hZGRyOwogICAgICAgIGFsLT5hZGRyID0gc2luLT5zaW5fYWRkci5zX2FkZHI7CiAgICAgICAgYWwtPmRldmljZSA9IHN0cmR1cChkZXZpY2UpOwogICAgICAgICsrYWw7CiAgICAgICAgKytuaXBhZGRyOwogICAgfQogICAgKHZvaWQpIGNsb3NlKGZkKTsKCiAgICAqaXBhZGRycCA9IGlmYWRkcmxpc3Q7CiAgICByZXR1cm4gKG5pcGFkZHIpOwp9Cg==