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+dHJhY2VSb3V0ZUN0bFRhcmdldEFkZHJlc3NUeXBlOwogICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzVHlwZSA9ICooKGxvbmcgKikgdmFyX3ZhbCk7CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgVU5ETzoKICAgICAgICAvKgogICAgICAgICAqIEJhY2sgb3V0IGFueSBjaGFuZ2VzIG1hZGUgaW4gdGhlIEFDVElPTiBjYXNlIAogICAgICAgICAqLwogICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzVHlwZSA9IHRtcHZhcjsKICAgICAgICBicmVhazsKCgogICAgY2FzZSBDT01NSVQ6CiAgICAgICAgLyoKICAgICAgICAgKiBUaGluZ3MgYXJlIHdvcmtpbmcgd2VsbCwgc28gaXQncyBub3cgc2FmZSB0byBtYWtlIHRoZSBjaGFuZ2UKICAgICAgICAgKiBwZXJtYW5lbnRseS4gIE1ha2Ugc3VyZSB0aGF0IGFueXRoaW5nIGRvbmUgaGVyZSBjYW4ndCBmYWlsISAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKICAgIH0KICAgIHJldHVybiBTTk1QX0VSUl9OT0VSUk9SOwp9CgoKCmludAp3cml0ZV90cmFjZVJvdXRlQ3RsVGFyZ2V0QWRkcmVzcyhpbnQgYWN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiB2YXJfdmFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgdmFyX3ZhbF90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgdmFyX3ZhbF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHN0YXRQLCBvaWQgKiBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbmFtZV9sZW4pCnsKICAgIHN0YXRpYyBjaGFyICAgICp0bXB2YXI7CiAgICBzdGF0aWMgc2l6ZV90ICAgdG1wbGVuOwogICAgc3RydWN0IHRyYWNlUm91dGVDdGxUYWJsZV9kYXRhICpTdG9yYWdlVG1wID0gTlVMTDsKICAgIHNpemVfdCAgICAgICAgICBuZXdsZW4gPQogICAgICAgIG5hbWVfbGVuIC0KICAgICAgICAoc2l6ZW9mKHRyYWNlUm91dGVDdGxUYWJsZV92YXJpYWJsZXNfb2lkKSAvIHNpemVvZihvaWQpICsgMyAtIDEpOwoKICAgIGlmICgoU3RvcmFnZVRtcCA9CiAgICAgICAgIGhlYWRlcl9jb21wbGV4KHRyYWNlUm91dGVDdGxUYWJsZVN0b3JhZ2UsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICZuYW1lW3NpemVvZih0cmFjZVJvdXRlQ3RsVGFibGVfdmFyaWFibGVzX29pZCkgLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yob2lkKSArIDMgLSAxXSwgJm5ld2xlbiwgMSwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpID09IE5VTEwpCiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PU1VDSE5BTUU7ICAgICAvKiByZW1vdmUgaWYgeW91IHN1cHBvcnQgY3JlYXRpb24gaGVyZSAqLwoKICAgIGlmIChTdG9yYWdlVG1wICYmIFN0b3JhZ2VUbXAtPnN0b3JhZ2VUeXBlID09IFNUX1JFQURPTkxZKSB7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PVFdSSVRBQkxFOwogICAgfQoKICAgIGlmIChTdG9yYWdlVG1wICYmIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxSb3dTdGF0dXMgPT0gUlNfQUNUSVZFKSB7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PVFdSSVRBQkxFOwogICAgfQoKICAgIHN3aXRjaCAoYWN0aW9uKSB7CiAgICBjYXNlIFJFU0VSVkUxOgogICAgICAgIGlmICh2YXJfdmFsX3R5cGUgIT0gQVNOX09DVEVUX1NUUikgewogICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLAogICAgICAgICAgICAgICAgICAgICAid3JpdGUgdG8gdHJhY2VSb3V0ZUN0bFRhcmdldEFkZHJlc3Mgbm90IEFTTl9PQ1RFVF9TVFJcbiIpOwogICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfV1JPTkdUWVBFOwogICAgICAgIH0KICAgICAgICBicmVhazsKCgogICAgY2FzZSBSRVNFUlZFMjoKICAgICAgICAvKgogICAgICAgICAqIG1lbW9yeSByZXNldmVyYXRpb24sIGZpbmFsIHByZXBhcmF0aW9uLi4uIAogICAgICAgICAqLwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIEZSRUU6CiAgICAgICAgLyoKICAgICAgICAgKiBSZWxlYXNlIGFueSByZXNvdXJjZXMgdGhhdCBoYXZlIGJlZW4gYWxsb2NhdGVkIAogICAgICAgICAqLwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIEFDVElPTjoKICAgICAgICAvKgogICAgICAgICAqIFRoZSB2YXJpYWJsZSBoYXMgYmVlbiBzdG9yZWQgaW4gbG9uZ19yZXQgZm9yCiAgICAgICAgICogeW91IHRvIHVzZSwgYW5kIHlvdSBoYXZlIGp1c3QgYmVlbiBhc2tlZCB0byBkbyBzb21ldGhpbmcgd2l0aAogICAgICAgICAqIGl0LiAgTm90ZSB0aGF0IGFueXRoaW5nIGRvbmUgaGVyZSBtdXN0IGJlIHJldmVyc2FibGUgaW4gdGhlIFVORE8gY2FzZSAKICAgICAgICAgKi8KICAgICAgICB0bXB2YXIgPSBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVGFyZ2V0QWRkcmVzczsKICAgICAgICB0bXBsZW4gPSBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVGFyZ2V0QWRkcmVzc0xlbjsKCiAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFRhcmdldEFkZHJlc3MgPQogICAgICAgICAgICAoY2hhciAqKSBtYWxsb2ModmFyX3ZhbF9sZW4gKyAxKTsKICAgICAgICBpZiAoU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFRhcmdldEFkZHJlc3MgPT0gTlVMTCkgewogICAgICAgICAgICBleGl0KDEpOwogICAgICAgIH0KICAgICAgICBtZW1jcHkoU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFRhcmdldEFkZHJlc3MsIHZhcl92YWwsCiAgICAgICAgICAgICAgIHZhcl92YWxfbGVuKTsKICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVGFyZ2V0QWRkcmVzc1t2YXJfdmFsX2xlbl0gPSAnXDAnOwogICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzTGVuID0gdmFyX3ZhbF9sZW47CgogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIFVORE86CiAgICAgICAgLyoKICAgICAgICAgKiBCYWNrIG91dCBhbnkgY2hhbmdlcyBtYWRlIGluIHRoZSBBQ1RJT04gY2FzZSAKICAgICAgICAgKi8KICAgICAgICBTTk1QX0ZSRUUoU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFRhcmdldEFkZHJlc3MpOwogICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzID0gTlVMTDsKCiAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFRhcmdldEFkZHJlc3MgPSB0bXB2YXI7CiAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFRhcmdldEFkZHJlc3NMZW4gPSB0bXBsZW47CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgQ09NTUlUOgogICAgICAgIC8qCiAgICAgICAgICogVGhpbmdzIGFyZSB3b3JraW5nIHdlbGwsIHNvIGl0J3Mgbm93IHNhZmUgdG8gbWFrZSB0aGUgY2hhbmdlCiAgICAgICAgICogcGVybWFuZW50bHkuICBNYWtlIHN1cmUgdGhhdCBhbnl0aGluZyBkb25lIGhlcmUgY2FuJ3QgZmFpbCEgCiAgICAgICAgICovCiAgICAgICAgU05NUF9GUkVFKHRtcHZhcik7CiAgICAgICAgdG1wdmFyID0gTlVMTDsKICAgICAgICBicmVhazsKICAgIH0KICAgIHJldHVybiBTTk1QX0VSUl9OT0VSUk9SOwp9CgppbnQKd3JpdGVfdHJhY2VSb3V0ZUN0bEJ5UGFzc1JvdXRlVGFibGUoaW50IGFjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogdmFyX3ZhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyIHZhcl92YWxfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHZhcl92YWxfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiBzdGF0UCwgb2lkICogbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG5hbWVfbGVuKQp7CiAgICBzdGF0aWMgc2l6ZV90ICAgdG1wdmFyOwogICAgc3RydWN0IHRyYWNlUm91dGVDdGxUYWJsZV9kYXRhICpTdG9yYWdlVG1wID0gTlVMTDsKICAgIHNpemVfdCAgICAgICAgICBuZXdsZW4gPQogICAgICAgIG5hbWVfbGVuIC0KICAgICAgICAoc2l6ZW9mKHRyYWNlUm91dGVDdGxUYWJsZV92YXJpYWJsZXNfb2lkKSAvIHNpemVvZihvaWQpICsgMyAtIDEpOwoKICAgIGlmICgoU3RvcmFnZVRtcCA9CiAgICAgICAgIGhlYWRlcl9jb21wbGV4KHRyYWNlUm91dGVDdGxUYWJsZVN0b3JhZ2UsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICZuYW1lW3NpemVvZih0cmFjZVJvdXRlQ3RsVGFibGVfdmFyaWFibGVzX29pZCkgLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yob2lkKSArIDMgLSAxXSwgJm5ld2xlbiwgMSwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpID09IE5VTEwpCiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PU1VDSE5BTUU7ICAgICAvKiByZW1vdmUgaWYgeW91IHN1cHBvcnQgY3JlYXRpb24gaGVyZSAqLwoKICAgIGlmIChTdG9yYWdlVG1wICYmIFN0b3JhZ2VUbXAtPnN0b3JhZ2VUeXBlID09IFNUX1JFQURPTkxZKSB7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PVFdSSVRBQkxFOwogICAgfQoKICAgIGlmIChTdG9yYWdlVG1wICYmIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxSb3dTdGF0dXMgPT0gUlNfQUNUSVZFKSB7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PVFdSSVRBQkxFOwogICAgfQogICAgc3dpdGNoIChhY3Rpb24pIHsKICAgIGNhc2UgUkVTRVJWRTE6CiAgICAgICAgaWYgKHZhcl92YWxfdHlwZSAhPSBBU05fSU5URUdFUikgewogICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLAogICAgICAgICAgICAgICAgICAgICAid3JpdGUgdG8gdHJhY2VSb3V0ZUN0bFRhcmdldEFkZHJlc3NUeXBlIG5vdCBBU05fSU5URUdFUlxuIik7CiAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9XUk9OR1RZUEU7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIFJFU0VSVkUyOgogICAgICAgIC8qCiAgICAgICAgICogbWVtb3J5IHJlc2V2ZXJhdGlvbiwgZmluYWwgcHJlcGFyYXRpb24uLi4gCiAgICAgICAgICovCiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgRlJFRToKICAgICAgICAvKgogICAgICAgICAqIFJlbGVhc2UgYW55IHJlc291cmNlcyB0aGF0IGhhdmUgYmVlbiBhbGxvY2F0ZWQgCiAgICAgICAgICovCiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgQUNUSU9OOgogICAgICAgIC8qCiAgICAgICAgICogVGhlIHZhcmlhYmxlIGhhcyBiZWVuIHN0b3JlZCBpbiBvYmppZCBmb3IKICAgICAgICAgKiB5b3UgdG8gdXNlLCBhbmQgeW91IGhhdmUganVzdCBiZWVuIGFza2VkIHRvIGRvIHNvbWV0aGluZyB3aXRoCiAgICAgICAgICogaXQuICBOb3RlIHRoYXQgYW55dGhpbmcgZG9uZSBoZXJlIG11c3QgYmUgcmV2ZXJzYWJsZSBpbiB0aGUgVU5ETyBjYXNlIAogICAgICAgICAqLwogICAgICAgIHRtcHZhciA9IFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxCeVBhc3NSb3V0ZVRhYmxlOwogICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxCeVBhc3NSb3V0ZVRhYmxlID0gKigobG9uZyAqKSB2YXJfdmFsKTsKICAgICAgICBicmVhazsKCgogICAgY2FzZSBVTkRPOgogICAgICAgIC8qCiAgICAgICAgICogQmFjayBvdXQgYW55IGNoYW5nZXMgbWFkZSBpbiB0aGUgQUNUSU9OIGNhc2UgCiAgICAgICAgICovCiAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bEJ5UGFzc1JvdXRlVGFibGUgPSB0bXB2YXI7CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgQ09NTUlUOgogICAgICAgIC8qCiAgICAgICAgICogVGhpbmdzIGFyZSB3b3JraW5nIHdlbGwsIHNvIGl0J3Mgbm93IHNhZmUgdG8gbWFrZSB0aGUgY2hhbmdlCiAgICAgICAgICogcGVybWFuZW50bHkuICBNYWtlIHN1cmUgdGhhdCBhbnl0aGluZyBkb25lIGhlcmUgY2FuJ3QgZmFpbCEgCiAgICAgICAgICovCiAgICAgICAgYnJlYWs7CiAgICB9CiAgICByZXR1cm4gU05NUF9FUlJfTk9FUlJPUjsKCn0KCmludAp3cml0ZV90cmFjZVJvdXRlQ3RsRGF0YVNpemUoaW50IGFjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHZhcl92YWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgdmFyX3ZhbF90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHZhcl92YWxfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogc3RhdFAsIG9pZCAqIG5hbWUsIHNpemVfdCBuYW1lX2xlbikKewogICAgc3RhdGljIHNpemVfdCAgIHRtcHZhcjsKICAgIHN0cnVjdCB0cmFjZVJvdXRlQ3RsVGFibGVfZGF0YSAqU3RvcmFnZVRtcCA9IE5VTEw7CiAgICBzaXplX3QgICAgICAgICAgbmV3bGVuID0KICAgICAgICBuYW1lX2xlbiAtCiAgICAgICAgKHNpemVvZih0cmFjZVJvdXRlQ3RsVGFibGVfdmFyaWFibGVzX29pZCkgLyBzaXplb2Yob2lkKSArIDMgLSAxKTsKCiAgICBpZiAoKFN0b3JhZ2VUbXAgPQogICAgICAgICBoZWFkZXJfY29tcGxleCh0cmFjZVJvdXRlQ3RsVGFibGVTdG9yYWdlLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAmbmFtZVtzaXplb2YodHJhY2VSb3V0ZUN0bFRhYmxlX3ZhcmlhYmxlc19vaWQpIC8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9pZCkgKyAzIC0gMV0sICZuZXdsZW4sIDEsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKSA9PSBOVUxMKQogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1NVQ0hOQU1FOyAgICAgLyogcmVtb3ZlIGlmIHlvdSBzdXBwb3J0IGNyZWF0aW9uIGhlcmUgKi8KCiAgICBpZiAoU3RvcmFnZVRtcCAmJiBTdG9yYWdlVG1wLT5zdG9yYWdlVHlwZSA9PSBTVF9SRUFET05MWSkgewogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1RXUklUQUJMRTsKICAgIH0KCiAgICBpZiAoU3RvcmFnZVRtcCAmJiBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsUm93U3RhdHVzID09IFJTX0FDVElWRSkgewogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1RXUklUQUJMRTsKICAgIH0KICAgIHN3aXRjaCAoYWN0aW9uKSB7CiAgICBjYXNlIFJFU0VSVkUxOgogICAgICAgIGlmICh2YXJfdmFsX3R5cGUgIT0gQVNOX1VOU0lHTkVEKSB7CiAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsCiAgICAgICAgICAgICAgICAgICAgICJ3cml0ZSB0byB0cmFjZVJvdXRlQ3RsRGF0YVNpemUgbm90IEFTTl9VTlNJR05FRFxuIik7CiAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9XUk9OR1RZUEU7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIFJFU0VSVkUyOgogICAgICAgIC8qCiAgICAgICAgICogbWVtb3J5IHJlc2V2ZXJhdGlvbiwgZmluYWwgcHJlcGFyYXRpb24uLi4gCiAgICAgICAgICovCiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgRlJFRToKICAgICAgICAvKgogICAgICAgICAqIFJlbGVhc2UgYW55IHJlc291cmNlcyB0aGF0IGhhdmUgYmVlbiBhbGxvY2F0ZWQgCiAgICAgICAgICovCiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgQUNUSU9OOgogICAgICAgIC8qCiAgICAgICAgICogVGhlIHZhcmlhYmxlIGhhcyBiZWVuIHN0b3JlZCBpbiBvYmppZCBmb3IKICAgICAgICAgKiB5b3UgdG8gdXNlLCBhbmQgeW91IGhhdmUganVzdCBiZWVuIGFza2VkIHRvIGRvIHNvbWV0aGluZyB3aXRoCiAgICAgICAgICogaXQuICBOb3RlIHRoYXQgYW55dGhpbmcgZG9uZSBoZXJlIG11c3QgYmUgcmV2ZXJzYWJsZSBpbiB0aGUgVU5ETyBjYXNlIAogICAgICAgICAqLwogICAgICAgIHRtcHZhciA9IFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxEYXRhU2l6ZTsKICAgICAgICBpZiAoKCooKGxvbmcgKikgdmFyX3ZhbCkpID49IDAgJiYgKCooKGxvbmcgKikgdmFyX3ZhbCkpIDw9IDY1NTA3KQogICAgICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsRGF0YVNpemUgPSAqKChsb25nICopIHZhcl92YWwpOwogICAgICAgIGVsc2UKICAgICAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bERhdGFTaXplID0gNTY7CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgVU5ETzoKICAgICAgICAvKgogICAgICAgICAqIEJhY2sgb3V0IGFueSBjaGFuZ2VzIG1hZGUgaW4gdGhlIEFDVElPTiBjYXNlIAogICAgICAgICAqLwogICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxEYXRhU2l6ZSA9IHRtcHZhcjsKICAgICAgICBicmVhazsKCgogICAgY2FzZSBDT01NSVQ6CiAgICAgICAgLyoKICAgICAgICAgKiBUaGluZ3MgYXJlIHdvcmtpbmcgd2VsbCwgc28gaXQncyBub3cgc2FmZSB0byBtYWtlIHRoZSBjaGFuZ2UKICAgICAgICAgKiBwZXJtYW5lbnRseS4gIE1ha2Ugc3VyZSB0aGF0IGFueXRoaW5nIGRvbmUgaGVyZSBjYW4ndCBmYWlsISAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKICAgIH0KICAgIHJldHVybiBTTk1QX0VSUl9OT0VSUk9SOwp9CgoKCgppbnQKd3JpdGVfdHJhY2VSb3V0ZUN0bFRpbWVPdXQoaW50IGFjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogdmFyX3ZhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyIHZhcl92YWxfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHZhcl92YWxfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiBzdGF0UCwgb2lkICogbmFtZSwgc2l6ZV90IG5hbWVfbGVuKQp7CiAgICBzdGF0aWMgc2l6ZV90ICAgdG1wdmFyOwogICAgc3RydWN0IHRyYWNlUm91dGVDdGxUYWJsZV9kYXRhICpTdG9yYWdlVG1wID0gTlVMTDsKICAgIHNpemVfdCAgICAgICAgICBuZXdsZW4gPQogICAgICAgIG5hbWVfbGVuIC0KICAgICAgICAoc2l6ZW9mKHRyYWNlUm91dGVDdGxUYWJsZV92YXJpYWJsZXNfb2lkKSAvIHNpemVvZihvaWQpICsgMyAtIDEpOwoKICAgIGlmICgoU3RvcmFnZVRtcCA9CiAgICAgICAgIGhlYWRlcl9jb21wbGV4KHRyYWNlUm91dGVDdGxUYWJsZVN0b3JhZ2UsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICZuYW1lW3NpemVvZih0cmFjZVJvdXRlQ3RsVGFibGVfdmFyaWFibGVzX29pZCkgLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yob2lkKSArIDMgLSAxXSwgJm5ld2xlbiwgMSwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpID09IE5VTEwpCiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PU1VDSE5BTUU7ICAgICAvKiByZW1vdmUgaWYgeW91IHN1cHBvcnQgY3JlYXRpb24gaGVyZSAqLwoKICAgIGlmIChTdG9yYWdlVG1wICYmIFN0b3JhZ2VUbXAtPnN0b3JhZ2VUeXBlID09IFNUX1JFQURPTkxZKSB7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PVFdSSVRBQkxFOwogICAgfQoKICAgIGlmIChTdG9yYWdlVG1wICYmIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxSb3dTdGF0dXMgPT0gUlNfQUNUSVZFKSB7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PVFdSSVRBQkxFOwogICAgfQogICAgc3dpdGNoIChhY3Rpb24pIHsKICAgIGNhc2UgUkVTRVJWRTE6CiAgICAgICAgaWYgKHZhcl92YWxfdHlwZSAhPSBBU05fVU5TSUdORUQpIHsKICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwKICAgICAgICAgICAgICAgICAgICAgIndyaXRlIHRvIHRyYWNlUm91dGVDdGxEYXRhU2l6ZSBub3QgQVNOX1VOU0lHTkVEXG4iKTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX1dST05HVFlQRTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgUkVTRVJWRTI6CiAgICAgICAgLyoKICAgICAgICAgKiBtZW1vcnkgcmVzZXZlcmF0aW9uLCBmaW5hbCBwcmVwYXJhdGlvbi4uLiAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBGUkVFOgogICAgICAgIC8qCiAgICAgICAgICogUmVsZWFzZSBhbnkgcmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIGFsbG9jYXRlZCAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBBQ1RJT046CiAgICAgICAgLyoKICAgICAgICAgKiBUaGUgdmFyaWFibGUgaGFzIGJlZW4gc3RvcmVkIGluIG9iamlkIGZvcgogICAgICAgICAqIHlvdSB0byB1c2UsIGFuZCB5b3UgaGF2ZSBqdXN0IGJlZW4gYXNrZWQgdG8gZG8gc29tZXRoaW5nIHdpdGgKICAgICAgICAgKiBpdC4gIE5vdGUgdGhhdCBhbnl0aGluZyBkb25lIGhlcmUgbXVzdCBiZSByZXZlcnNhYmxlIGluIHRoZSBVTkRPIGNhc2UgCiAgICAgICAgICovCiAgICAgICAgdG1wdmFyID0gU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFRpbWVPdXQ7CgogICAgICAgIGlmICgoKigobG9uZyAqKSB2YXJfdmFsKSkgPj0gMSAmJiAoKigobG9uZyAqKSB2YXJfdmFsKSkgPD0gNjApCiAgICAgICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUaW1lT3V0ID0gKigobG9uZyAqKSB2YXJfdmFsKTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUaW1lT3V0ID0gMzsKICAgICAgICBicmVhazsKCgogICAgY2FzZSBVTkRPOgogICAgICAgIC8qCiAgICAgICAgICogQmFjayBvdXQgYW55IGNoYW5nZXMgbWFkZSBpbiB0aGUgQUNUSU9OIGNhc2UgCiAgICAgICAgICovCiAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFRpbWVPdXQgPSB0bXB2YXI7CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgQ09NTUlUOgogICAgICAgIC8qCiAgICAgICAgICogVGhpbmdzIGFyZSB3b3JraW5nIHdlbGwsIHNvIGl0J3Mgbm93IHNhZmUgdG8gbWFrZSB0aGUgY2hhbmdlCiAgICAgICAgICogcGVybWFuZW50bHkuICBNYWtlIHN1cmUgdGhhdCBhbnl0aGluZyBkb25lIGhlcmUgY2FuJ3QgZmFpbCEgCiAgICAgICAgICovCiAgICAgICAgYnJlYWs7CiAgICB9CiAgICByZXR1cm4gU05NUF9FUlJfTk9FUlJPUjsKfQoKCgoKCmludAp3cml0ZV90cmFjZVJvdXRlQ3RsUHJvYmVzUGVySG9wKGludCBhY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogdmFyX3ZhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgdmFyX3ZhbF90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB2YXJfdmFsX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiBzdGF0UCwgb2lkICogbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbmFtZV9sZW4pCnsKICAgIHN0YXRpYyBzaXplX3QgICB0bXB2YXI7CiAgICBzdHJ1Y3QgdHJhY2VSb3V0ZUN0bFRhYmxlX2RhdGEgKlN0b3JhZ2VUbXAgPSBOVUxMOwogICAgc2l6ZV90ICAgICAgICAgIG5ld2xlbiA9CiAgICAgICAgbmFtZV9sZW4gLQogICAgICAgIChzaXplb2YodHJhY2VSb3V0ZUN0bFRhYmxlX3ZhcmlhYmxlc19vaWQpIC8gc2l6ZW9mKG9pZCkgKyAzIC0gMSk7CgogICAgaWYgKChTdG9yYWdlVG1wID0KICAgICAgICAgaGVhZGVyX2NvbXBsZXgodHJhY2VSb3V0ZUN0bFRhYmxlU3RvcmFnZSwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgJm5hbWVbc2l6ZW9mKHRyYWNlUm91dGVDdGxUYWJsZV92YXJpYWJsZXNfb2lkKSAvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihvaWQpICsgMyAtIDFdLCAmbmV3bGVuLCAxLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkgPT0gTlVMTCkKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9TVUNITkFNRTsgICAgIC8qIHJlbW92ZSBpZiB5b3Ugc3VwcG9ydCBjcmVhdGlvbiBoZXJlICovCgogICAgaWYgKFN0b3JhZ2VUbXAgJiYgU3RvcmFnZVRtcC0+c3RvcmFnZVR5cGUgPT0gU1RfUkVBRE9OTFkpIHsKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9UV1JJVEFCTEU7CiAgICB9CgogICAgaWYgKFN0b3JhZ2VUbXAgJiYgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFJvd1N0YXR1cyA9PSBSU19BQ1RJVkUpIHsKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9UV1JJVEFCTEU7CiAgICB9CiAgICBzd2l0Y2ggKGFjdGlvbikgewogICAgY2FzZSBSRVNFUlZFMToKICAgICAgICBpZiAodmFyX3ZhbF90eXBlICE9IEFTTl9VTlNJR05FRCkgewogICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLAogICAgICAgICAgICAgICAgICAgICAid3JpdGUgdG8gdHJhY2VSb3V0ZUN0bERhdGFTaXplIG5vdCBBU05fVU5TSUdORURcbiIpOwogICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfV1JPTkdUWVBFOwogICAgICAgIH0KICAgICAgICBicmVhazsKCgogICAgY2FzZSBSRVNFUlZFMjoKICAgICAgICAvKgogICAgICAgICAqIG1lbW9yeSByZXNldmVyYXRpb24sIGZpbmFsIHByZXBhcmF0aW9uLi4uIAogICAgICAgICAqLwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIEZSRUU6CiAgICAgICAgLyoKICAgICAgICAgKiBSZWxlYXNlIGFueSByZXNvdXJjZXMgdGhhdCBoYXZlIGJlZW4gYWxsb2NhdGVkIAogICAgICAgICAqLwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIEFDVElPTjoKICAgICAgICAvKgogICAgICAgICAqIFRoZSB2YXJpYWJsZSBoYXMgYmVlbiBzdG9yZWQgaW4gb2JqaWQgZm9yCiAgICAgICAgICogeW91IHRvIHVzZSwgYW5kIHlvdSBoYXZlIGp1c3QgYmVlbiBhc2tlZCB0byBkbyBzb21ldGhpbmcgd2l0aAogICAgICAgICAqIGl0LiAgTm90ZSB0aGF0IGFueXRoaW5nIGRvbmUgaGVyZSBtdXN0IGJlIHJldmVyc2FibGUgaW4gdGhlIFVORE8gY2FzZSAKICAgICAgICAgKi8KICAgICAgICB0bXB2YXIgPSBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsUHJvYmVzUGVySG9wOwoKICAgICAgICBpZiAoKCooKGxvbmcgKikgdmFyX3ZhbCkpID49IDEgJiYgKCooKGxvbmcgKikgdmFyX3ZhbCkpIDw9IDEwKQogICAgICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsUHJvYmVzUGVySG9wID0gKigobG9uZyAqKSB2YXJfdmFsKTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxQcm9iZXNQZXJIb3AgPSAzOwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIFVORE86CiAgICAgICAgLyoKICAgICAgICAgKiBCYWNrIG91dCBhbnkgY2hhbmdlcyBtYWRlIGluIHRoZSBBQ1RJT04gY2FzZSAKICAgICAgICAgKi8KICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsUHJvYmVzUGVySG9wID0gdG1wdmFyOwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIENPTU1JVDoKICAgICAgICAvKgogICAgICAgICAqIFRoaW5ncyBhcmUgd29ya2luZyB3ZWxsLCBzbyBpdCdzIG5vdyBzYWZlIHRvIG1ha2UgdGhlIGNoYW5nZQogICAgICAgICAqIHBlcm1hbmVudGx5LiAgTWFrZSBzdXJlIHRoYXQgYW55dGhpbmcgZG9uZSBoZXJlIGNhbid0IGZhaWwhIAogICAgICAgICAqLwogICAgICAgIGJyZWFrOwogICAgfQogICAgcmV0dXJuIFNOTVBfRVJSX05PRVJST1I7Cn0KCgoKaW50CndyaXRlX3RyYWNlUm91dGVDdGxQb3J0KGludCBhY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHZhcl92YWwsCiAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciB2YXJfdmFsX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB2YXJfdmFsX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogc3RhdFAsIG9pZCAqIG5hbWUsIHNpemVfdCBuYW1lX2xlbikKewogICAgc3RhdGljIHNpemVfdCAgIHRtcHZhcjsKICAgIHN0cnVjdCB0cmFjZVJvdXRlQ3RsVGFibGVfZGF0YSAqU3RvcmFnZVRtcCA9IE5VTEw7CiAgICBzaXplX3QgICAgICAgICAgbmV3bGVuID0KICAgICAgICBuYW1lX2xlbiAtCiAgICAgICAgKHNpemVvZih0cmFjZVJvdXRlQ3RsVGFibGVfdmFyaWFibGVzX29pZCkgLyBzaXplb2Yob2lkKSArIDMgLSAxKTsKCiAgICBpZiAoKFN0b3JhZ2VUbXAgPQogICAgICAgICBoZWFkZXJfY29tcGxleCh0cmFjZVJvdXRlQ3RsVGFibGVTdG9yYWdlLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAmbmFtZVtzaXplb2YodHJhY2VSb3V0ZUN0bFRhYmxlX3ZhcmlhYmxlc19vaWQpIC8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9pZCkgKyAzIC0gMV0sICZuZXdsZW4sIDEsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKSA9PSBOVUxMKQogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1NVQ0hOQU1FOyAgICAgLyogcmVtb3ZlIGlmIHlvdSBzdXBwb3J0IGNyZWF0aW9uIGhlcmUgKi8KCiAgICBpZiAoU3RvcmFnZVRtcCAmJiBTdG9yYWdlVG1wLT5zdG9yYWdlVHlwZSA9PSBTVF9SRUFET05MWSkgewogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1RXUklUQUJMRTsKICAgIH0KCiAgICBzd2l0Y2ggKGFjdGlvbikgewogICAgY2FzZSBSRVNFUlZFMToKICAgICAgICBpZiAodmFyX3ZhbF90eXBlICE9IEFTTl9VTlNJR05FRCkgewogICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLAogICAgICAgICAgICAgICAgICAgICAid3JpdGUgdG8gdHJhY2VSb3V0ZUN0bFRhcmdldEFkZHJlc3NUeXBlIG5vdCBBU05fVU5TSUdORURcbiIpOwogICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfV1JPTkdUWVBFOwogICAgICAgIH0KICAgICAgICBicmVhazsKCgogICAgY2FzZSBSRVNFUlZFMjoKICAgICAgICAvKgogICAgICAgICAqIG1lbW9yeSByZXNldmVyYXRpb24sIGZpbmFsIHByZXBhcmF0aW9uLi4uIAogICAgICAgICAqLwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIEZSRUU6CiAgICAgICAgLyoKICAgICAgICAgKiBSZWxlYXNlIGFueSByZXNvdXJjZXMgdGhhdCBoYXZlIGJlZW4gYWxsb2NhdGVkIAogICAgICAgICAqLwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIEFDVElPTjoKICAgICAgICAvKgogICAgICAgICAqIFRoZSB2YXJpYWJsZSBoYXMgYmVlbiBzdG9yZWQgaW4gb2JqaWQgZm9yCiAgICAgICAgICogeW91IHRvIHVzZSwgYW5kIHlvdSBoYXZlIGp1c3QgYmVlbiBhc2tlZCB0byBkbyBzb21ldGhpbmcgd2l0aAogICAgICAgICAqIGl0LiAgTm90ZSB0aGF0IGFueXRoaW5nIGRvbmUgaGVyZSBtdXN0IGJlIHJldmVyc2FibGUgaW4gdGhlIFVORE8gY2FzZSAKICAgICAgICAgKi8KICAgICAgICB0bXB2YXIgPSBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsUG9ydDsKICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsUG9ydCA9ICooKGxvbmcgKikgdmFyX3ZhbCk7CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgVU5ETzoKICAgICAgICAvKgogICAgICAgICAqIEJhY2sgb3V0IGFueSBjaGFuZ2VzIG1hZGUgaW4gdGhlIEFDVElPTiBjYXNlIAogICAgICAgICAqLwogICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxQb3J0ID0gdG1wdmFyOwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIENPTU1JVDoKICAgICAgICAvKgogICAgICAgICAqIFRoaW5ncyBhcmUgd29ya2luZyB3ZWxsLCBzbyBpdCdzIG5vdyBzYWZlIHRvIG1ha2UgdGhlIGNoYW5nZQogICAgICAgICAqIHBlcm1hbmVudGx5LiAgTWFrZSBzdXJlIHRoYXQgYW55dGhpbmcgZG9uZSBoZXJlIGNhbid0IGZhaWwhIAogICAgICAgICAqLwoKICAgICAgICBicmVhazsKICAgIH0KICAgIHJldHVybiBTTk1QX0VSUl9OT0VSUk9SOwp9CgoKCgppbnQKd3JpdGVfdHJhY2VSb3V0ZUN0bE1heFR0bChpbnQgYWN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHZhcl92YWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyIHZhcl92YWxfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgdmFyX3ZhbF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogc3RhdFAsIG9pZCAqIG5hbWUsIHNpemVfdCBuYW1lX2xlbikKewogICAgc3RhdGljIHNpemVfdCAgIHRtcHZhcjsKICAgIHN0cnVjdCB0cmFjZVJvdXRlQ3RsVGFibGVfZGF0YSAqU3RvcmFnZVRtcCA9IE5VTEw7CiAgICBzaXplX3QgICAgICAgICAgbmV3bGVuID0KICAgICAgICBuYW1lX2xlbiAtCiAgICAgICAgKHNpemVvZih0cmFjZVJvdXRlQ3RsVGFibGVfdmFyaWFibGVzX29pZCkgLyBzaXplb2Yob2lkKSArIDMgLSAxKTsKCiAgICBpZiAoKFN0b3JhZ2VUbXAgPQogICAgICAgICBoZWFkZXJfY29tcGxleCh0cmFjZVJvdXRlQ3RsVGFibGVTdG9yYWdlLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAmbmFtZVtzaXplb2YodHJhY2VSb3V0ZUN0bFRhYmxlX3ZhcmlhYmxlc19vaWQpIC8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9pZCkgKyAzIC0gMV0sICZuZXdsZW4sIDEsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKSA9PSBOVUxMKQogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1NVQ0hOQU1FOyAgICAgLyogcmVtb3ZlIGlmIHlvdSBzdXBwb3J0IGNyZWF0aW9uIGhlcmUgKi8KCiAgICBpZiAoU3RvcmFnZVRtcCAmJiBTdG9yYWdlVG1wLT5zdG9yYWdlVHlwZSA9PSBTVF9SRUFET05MWSkgewogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1RXUklUQUJMRTsKICAgIH0KCiAgICBpZiAoU3RvcmFnZVRtcCAmJiBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsUm93U3RhdHVzID09IFJTX0FDVElWRSkgewogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1RXUklUQUJMRTsKICAgIH0KICAgIHN3aXRjaCAoYWN0aW9uKSB7CiAgICBjYXNlIFJFU0VSVkUxOgogICAgICAgIGlmICh2YXJfdmFsX3R5cGUgIT0gQVNOX1VOU0lHTkVEKSB7CiAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsCiAgICAgICAgICAgICAgICAgICAgICJ3cml0ZSB0byB0cmFjZVJvdXRlQ3RsRGF0YVNpemUgbm90IEFTTl9VTlNJR05FRFxuIik7CiAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9XUk9OR1RZUEU7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIFJFU0VSVkUyOgogICAgICAgIC8qCiAgICAgICAgICogbWVtb3J5IHJlc2V2ZXJhdGlvbiwgZmluYWwgcHJlcGFyYXRpb24uLi4gCiAgICAgICAgICovCiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgRlJFRToKICAgICAgICAvKgogICAgICAgICAqIFJlbGVhc2UgYW55IHJlc291cmNlcyB0aGF0IGhhdmUgYmVlbiBhbGxvY2F0ZWQgCiAgICAgICAgICovCiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgQUNUSU9OOgogICAgICAgIC8qCiAgICAgICAgICogVGhlIHZhcmlhYmxlIGhhcyBiZWVuIHN0b3JlZCBpbiBvYmppZCBmb3IKICAgICAgICAgKiB5b3UgdG8gdXNlLCBhbmQgeW91IGhhdmUganVzdCBiZWVuIGFza2VkIHRvIGRvIHNvbWV0aGluZyB3aXRoCiAgICAgICAgICogaXQuICBOb3RlIHRoYXQgYW55dGhpbmcgZG9uZSBoZXJlIG11c3QgYmUgcmV2ZXJzYWJsZSBpbiB0aGUgVU5ETyBjYXNlIAogICAgICAgICAqLwogICAgICAgIHRtcHZhciA9IFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxNYXhUdGw7CiAgICAgICAgaWYgKCgqKChsb25nICopIHZhcl92YWwpKSA+PSAxICYmICgqKChsb25nICopIHZhcl92YWwpKSA8PSAyNTUpCiAgICAgICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxNYXhUdGwgPSAqKChsb25nICopIHZhcl92YWwpOwogICAgICAgIGVsc2UKICAgICAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bE1heFR0bCA9IDMwOwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIFVORE86CiAgICAgICAgLyoKICAgICAgICAgKiBCYWNrIG91dCBhbnkgY2hhbmdlcyBtYWRlIGluIHRoZSBBQ1RJT04gY2FzZSAKICAgICAgICAgKi8KICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsTWF4VHRsID0gdG1wdmFyOwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIENPTU1JVDoKICAgICAgICAvKgogICAgICAgICAqIFRoaW5ncyBhcmUgd29ya2luZyB3ZWxsLCBzbyBpdCdzIG5vdyBzYWZlIHRvIG1ha2UgdGhlIGNoYW5nZQogICAgICAgICAqIHBlcm1hbmVudGx5LiAgTWFrZSBzdXJlIHRoYXQgYW55dGhpbmcgZG9uZSBoZXJlIGNhbid0IGZhaWwhIAogICAgICAgICAqLwogICAgICAgIGJyZWFrOwogICAgfQogICAgcmV0dXJuIFNOTVBfRVJSX05PRVJST1I7Cn0KCgppbnQKd3JpdGVfdHJhY2VSb3V0ZUN0bERTRmllbGQoaW50IGFjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogdmFyX3ZhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyIHZhcl92YWxfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHZhcl92YWxfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiBzdGF0UCwgb2lkICogbmFtZSwgc2l6ZV90IG5hbWVfbGVuKQp7CiAgICBzdGF0aWMgc2l6ZV90ICAgdG1wdmFyOwogICAgc3RydWN0IHRyYWNlUm91dGVDdGxUYWJsZV9kYXRhICpTdG9yYWdlVG1wID0gTlVMTDsKICAgIHNpemVfdCAgICAgICAgICBuZXdsZW4gPQogICAgICAgIG5hbWVfbGVuIC0KICAgICAgICAoc2l6ZW9mKHRyYWNlUm91dGVDdGxUYWJsZV92YXJpYWJsZXNfb2lkKSAvIHNpemVvZihvaWQpICsgMyAtIDEpOwoKICAgIGlmICgoU3RvcmFnZVRtcCA9CiAgICAgICAgIGhlYWRlcl9jb21wbGV4KHRyYWNlUm91dGVDdGxUYWJsZVN0b3JhZ2UsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICZuYW1lW3NpemVvZih0cmFjZVJvdXRlQ3RsVGFibGVfdmFyaWFibGVzX29pZCkgLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yob2lkKSArIDMgLSAxXSwgJm5ld2xlbiwgMSwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpID09IE5VTEwpCiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PU1VDSE5BTUU7ICAgICAvKiByZW1vdmUgaWYgeW91IHN1cHBvcnQgY3JlYXRpb24gaGVyZSAqLwoKICAgIGlmIChTdG9yYWdlVG1wICYmIFN0b3JhZ2VUbXAtPnN0b3JhZ2VUeXBlID09IFNUX1JFQURPTkxZKSB7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PVFdSSVRBQkxFOwogICAgfQoKICAgIGlmIChTdG9yYWdlVG1wICYmIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxSb3dTdGF0dXMgPT0gUlNfQUNUSVZFKSB7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PVFdSSVRBQkxFOwogICAgfQogICAgc3dpdGNoIChhY3Rpb24pIHsKICAgIGNhc2UgUkVTRVJWRTE6CiAgICAgICAgaWYgKHZhcl92YWxfdHlwZSAhPSBBU05fVU5TSUdORUQpIHsKICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwKICAgICAgICAgICAgICAgICAgICAgIndyaXRlIHRvIHRyYWNlUm91dGVDdGxEYXRhU2l6ZSBub3QgQVNOX1VOU0lHTkVEXG4iKTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX1dST05HVFlQRTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgUkVTRVJWRTI6CiAgICAgICAgLyoKICAgICAgICAgKiBtZW1vcnkgcmVzZXZlcmF0aW9uLCBmaW5hbCBwcmVwYXJhdGlvbi4uLiAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBGUkVFOgogICAgICAgIC8qCiAgICAgICAgICogUmVsZWFzZSBhbnkgcmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIGFsbG9jYXRlZCAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBBQ1RJT046CiAgICAgICAgLyoKICAgICAgICAgKiBUaGUgdmFyaWFibGUgaGFzIGJlZW4gc3RvcmVkIGluIG9iamlkIGZvcgogICAgICAgICAqIHlvdSB0byB1c2UsIGFuZCB5b3UgaGF2ZSBqdXN0IGJlZW4gYXNrZWQgdG8gZG8gc29tZXRoaW5nIHdpdGgKICAgICAgICAgKiBpdC4gIE5vdGUgdGhhdCBhbnl0aGluZyBkb25lIGhlcmUgbXVzdCBiZSByZXZlcnNhYmxlIGluIHRoZSBVTkRPIGNhc2UgCiAgICAgICAgICovCiAgICAgICAgdG1wdmFyID0gU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bERTRmllbGQ7CiAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bERTRmllbGQgPSAqKChsb25nICopIHZhcl92YWwpOwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIFVORE86CiAgICAgICAgLyoKICAgICAgICAgKiBCYWNrIG91dCBhbnkgY2hhbmdlcyBtYWRlIGluIHRoZSBBQ1RJT04gY2FzZSAKICAgICAgICAgKi8KICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsRFNGaWVsZCA9IHRtcHZhcjsKICAgICAgICBicmVhazsKCgogICAgY2FzZSBDT01NSVQ6CiAgICAgICAgLyoKICAgICAgICAgKiBUaGluZ3MgYXJlIHdvcmtpbmcgd2VsbCwgc28gaXQncyBub3cgc2FmZSB0byBtYWtlIHRoZSBjaGFuZ2UKICAgICAgICAgKiBwZXJtYW5lbnRseS4gIE1ha2Ugc3VyZSB0aGF0IGFueXRoaW5nIGRvbmUgaGVyZSBjYW4ndCBmYWlsISAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKICAgIH0KICAgIHJldHVybiBTTk1QX0VSUl9OT0VSUk9SOwp9CgppbnQKd3JpdGVfdHJhY2VSb3V0ZUN0bFNvdXJjZUFkZHJlc3NUeXBlKGludCBhY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiB2YXJfdmFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyIHZhcl92YWxfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB2YXJfdmFsX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHN0YXRQLCBvaWQgKiBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG5hbWVfbGVuKQp7CiAgICBzdGF0aWMgc2l6ZV90ICAgdG1wdmFyOwogICAgc3RydWN0IHRyYWNlUm91dGVDdGxUYWJsZV9kYXRhICpTdG9yYWdlVG1wID0gTlVMTDsKICAgIHNpemVfdCAgICAgICAgICBuZXdsZW4gPQogICAgICAgIG5hbWVfbGVuIC0KICAgICAgICAoc2l6ZW9mKHRyYWNlUm91dGVDdGxUYWJsZV92YXJpYWJsZXNfb2lkKSAvIHNpemVvZihvaWQpICsgMyAtIDEpOwoKICAgIGlmICgoU3RvcmFnZVRtcCA9CiAgICAgICAgIGhlYWRlcl9jb21wbGV4KHRyYWNlUm91dGVDdGxUYWJsZVN0b3JhZ2UsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICZuYW1lW3NpemVvZih0cmFjZVJvdXRlQ3RsVGFibGVfdmFyaWFibGVzX29pZCkgLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yob2lkKSArIDMgLSAxXSwgJm5ld2xlbiwgMSwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpID09IE5VTEwpCiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PU1VDSE5BTUU7ICAgICAvKiByZW1vdmUgaWYgeW91IHN1cHBvcnQgY3JlYXRpb24gaGVyZSAqLwoKICAgIGlmIChTdG9yYWdlVG1wICYmIFN0b3JhZ2VUbXAtPnN0b3JhZ2VUeXBlID09IFNUX1JFQURPTkxZKSB7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PVFdSSVRBQkxFOwogICAgfQoKICAgIGlmIChTdG9yYWdlVG1wICYmIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxSb3dTdGF0dXMgPT0gUlNfQUNUSVZFKSB7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PVFdSSVRBQkxFOwogICAgfQogICAgc3dpdGNoIChhY3Rpb24pIHsKICAgIGNhc2UgUkVTRVJWRTE6CiAgICAgICAgaWYgKHZhcl92YWxfdHlwZSAhPSBBU05fSU5URUdFUikgewogICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLAogICAgICAgICAgICAgICAgICAgICAid3JpdGUgdG8gdHJhY2VSb3V0ZUN0bE1heFJvd3Mgbm90IEFTTl9JTlRFR0VSXG4iKTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX1dST05HVFlQRTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgUkVTRVJWRTI6CiAgICAgICAgLyoKICAgICAgICAgKiBtZW1vcnkgcmVzZXZlcmF0aW9uLCBmaW5hbCBwcmVwYXJhdGlvbi4uLiAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBGUkVFOgogICAgICAgIC8qCiAgICAgICAgICogUmVsZWFzZSBhbnkgcmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIGFsbG9jYXRlZCAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBBQ1RJT046CiAgICAgICAgLyoKICAgICAgICAgKiBUaGUgdmFyaWFibGUgaGFzIGJlZW4gc3RvcmVkIGluIG9iamlkIGZvcgogICAgICAgICAqIHlvdSB0byB1c2UsIGFuZCB5b3UgaGF2ZSBqdXN0IGJlZW4gYXNrZWQgdG8gZG8gc29tZXRoaW5nIHdpdGgKICAgICAgICAgKiBpdC4gIE5vdGUgdGhhdCBhbnl0aGluZyBkb25lIGhlcmUgbXVzdCBiZSByZXZlcnNhYmxlIGluIHRoZSBVTkRPIGNhc2UgCiAgICAgICAgICovCiAgICAgICAgdG1wdmFyID0gU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFNvdXJjZUFkZHJlc3NUeXBlOwogICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxTb3VyY2VBZGRyZXNzVHlwZSA9ICooKGxvbmcgKikgdmFyX3ZhbCk7CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgVU5ETzoKICAgICAgICAvKgogICAgICAgICAqIEJhY2sgb3V0IGFueSBjaGFuZ2VzIG1hZGUgaW4gdGhlIEFDVElPTiBjYXNlIAogICAgICAgICAqLwogICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxTb3VyY2VBZGRyZXNzVHlwZSA9IHRtcHZhcjsKICAgICAgICBicmVhazsKCgogICAgY2FzZSBDT01NSVQ6CiAgICAgICAgLyoKICAgICAgICAgKiBUaGluZ3MgYXJlIHdvcmtpbmcgd2VsbCwgc28gaXQncyBub3cgc2FmZSB0byBtYWtlIHRoZSBjaGFuZ2UKICAgICAgICAgKiBwZXJtYW5lbnRseS4gIE1ha2Ugc3VyZSB0aGF0IGFueXRoaW5nIGRvbmUgaGVyZSBjYW4ndCBmYWlsISAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKICAgIH0KICAgIHJldHVybiBTTk1QX0VSUl9OT0VSUk9SOwp9CgppbnQKd3JpdGVfdHJhY2VSb3V0ZUN0bFNvdXJjZUFkZHJlc3MoaW50IGFjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogdmFyX3ZhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyIHZhcl92YWxfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHZhcl92YWxfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiBzdGF0UCwgb2lkICogbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG5hbWVfbGVuKQp7CiAgICBzdGF0aWMgY2hhciAgICAqdG1wdmFyOwogICAgc3RhdGljIHNpemVfdCAgIHRtcGxlbjsKICAgIHN0cnVjdCB0cmFjZVJvdXRlQ3RsVGFibGVfZGF0YSAqU3RvcmFnZVRtcCA9IE5VTEw7CiAgICBzaXplX3QgICAgICAgICAgbmV3bGVuID0KICAgICAgICBuYW1lX2xlbiAtCiAgICAgICAgKHNpemVvZih0cmFjZVJvdXRlQ3RsVGFibGVfdmFyaWFibGVzX29pZCkgLyBzaXplb2Yob2lkKSArIDMgLSAxKTsKCiAgICBpZiAoKFN0b3JhZ2VUbXAgPQogICAgICAgICBoZWFkZXJfY29tcGxleCh0cmFjZVJvdXRlQ3RsVGFibGVTdG9yYWdlLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAmbmFtZVtzaXplb2YodHJhY2VSb3V0ZUN0bFRhYmxlX3ZhcmlhYmxlc19vaWQpIC8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9pZCkgKyAzIC0gMV0sICZuZXdsZW4sIDEsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKSA9PSBOVUxMKQogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1NVQ0hOQU1FOyAgICAgLyogcmVtb3ZlIGlmIHlvdSBzdXBwb3J0IGNyZWF0aW9uIGhlcmUgKi8KCiAgICBpZiAoU3RvcmFnZVRtcCAmJiBTdG9yYWdlVG1wLT5zdG9yYWdlVHlwZSA9PSBTVF9SRUFET05MWSkgewogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1RXUklUQUJMRTsKICAgIH0KCiAgICBpZiAoU3RvcmFnZVRtcCAmJiBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsUm93U3RhdHVzID09IFJTX0FDVElWRSkgewogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1RXUklUQUJMRTsKICAgIH0KCiAgICBzd2l0Y2ggKGFjdGlvbikgewogICAgY2FzZSBSRVNFUlZFMToKICAgICAgICBpZiAodmFyX3ZhbF90eXBlICE9IEFTTl9PQ1RFVF9TVFIpIHsKICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwKICAgICAgICAgICAgICAgICAgICAgIndyaXRlIHRvIHRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzIG5vdCBBU05fT0NURVRfU1RSXG4iKTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX1dST05HVFlQRTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgUkVTRVJWRTI6CiAgICAgICAgLyoKICAgICAgICAgKiBtZW1vcnkgcmVzZXZlcmF0aW9uLCBmaW5hbCBwcmVwYXJhdGlvbi4uLiAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBGUkVFOgogICAgICAgIC8qCiAgICAgICAgICogUmVsZWFzZSBhbnkgcmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIGFsbG9jYXRlZCAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBBQ1RJT046CiAgICAgICAgLyoKICAgICAgICAgKiBUaGUgdmFyaWFibGUgaGFzIGJlZW4gc3RvcmVkIGluIGxvbmdfcmV0IGZvcgogICAgICAgICAqIHlvdSB0byB1c2UsIGFuZCB5b3UgaGF2ZSBqdXN0IGJlZW4gYXNrZWQgdG8gZG8gc29tZXRoaW5nIHdpdGgKICAgICAgICAgKiBpdC4gIE5vdGUgdGhhdCBhbnl0aGluZyBkb25lIGhlcmUgbXVzdCBiZSByZXZlcnNhYmxlIGluIHRoZSBVTkRPIGNhc2UgCiAgICAgICAgICovCiAgICAgICAgdG1wdmFyID0gU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFNvdXJjZUFkZHJlc3M7CiAgICAgICAgdG1wbGVuID0gU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFNvdXJjZUFkZHJlc3NMZW47CiAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFNvdXJjZUFkZHJlc3MgPQogICAgICAgICAgICAoY2hhciAqKSBtYWxsb2ModmFyX3ZhbF9sZW4gKyAxKTsKICAgICAgICBpZiAoU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFNvdXJjZUFkZHJlc3MgPT0gTlVMTCkgewogICAgICAgICAgICBleGl0KDEpOwogICAgICAgIH0KICAgICAgICBtZW1jcHkoU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFNvdXJjZUFkZHJlc3MsIHZhcl92YWwsCiAgICAgICAgICAgICAgIHZhcl92YWxfbGVuICsgMSk7CiAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFNvdXJjZUFkZHJlc3NbdmFyX3ZhbF9sZW5dID0gJ1wwJzsKICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsU291cmNlQWRkcmVzc0xlbiA9IHZhcl92YWxfbGVuOwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIFVORE86CiAgICAgICAgLyoKICAgICAgICAgKiBCYWNrIG91dCBhbnkgY2hhbmdlcyBtYWRlIGluIHRoZSBBQ1RJT04gY2FzZSAKICAgICAgICAgKi8KICAgICAgICBTTk1QX0ZSRUUoU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFNvdXJjZUFkZHJlc3MpOwogICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxTb3VyY2VBZGRyZXNzID0gTlVMTDsKICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsU291cmNlQWRkcmVzcyA9IHRtcHZhcjsKICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsU291cmNlQWRkcmVzc0xlbiA9IHRtcGxlbjsKICAgICAgICBicmVhazsKCgogICAgY2FzZSBDT01NSVQ6CiAgICAgICAgLyoKICAgICAgICAgKiBUaGluZ3MgYXJlIHdvcmtpbmcgd2VsbCwgc28gaXQncyBub3cgc2FmZSB0byBtYWtlIHRoZSBjaGFuZ2UKICAgICAgICAgKiBwZXJtYW5lbnRseS4gIE1ha2Ugc3VyZSB0aGF0IGFueXRoaW5nIGRvbmUgaGVyZSBjYW4ndCBmYWlsISAKICAgICAgICAgKi8KICAgICAgICBTTk1QX0ZSRUUodG1wdmFyKTsKICAgICAgICB0bXB2YXIgPSBOVUxMOwogICAgICAgIGJyZWFrOwogICAgfQogICAgcmV0dXJuIFNOTVBfRVJSX05PRVJST1I7Cn0KCgoKCmludAp3cml0ZV90cmFjZVJvdXRlQ3RsSWZJbmRleChpbnQgYWN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiB2YXJfdmFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgdmFyX3ZhbF90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgdmFyX3ZhbF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHN0YXRQLCBvaWQgKiBuYW1lLCBzaXplX3QgbmFtZV9sZW4pCnsKICAgIHN0YXRpYyBzaXplX3QgICB0bXB2YXI7CiAgICBzdHJ1Y3QgdHJhY2VSb3V0ZUN0bFRhYmxlX2RhdGEgKlN0b3JhZ2VUbXAgPSBOVUxMOwogICAgc2l6ZV90ICAgICAgICAgIG5ld2xlbiA9CiAgICAgICAgbmFtZV9sZW4gLQogICAgICAgIChzaXplb2YodHJhY2VSb3V0ZUN0bFRhYmxlX3ZhcmlhYmxlc19vaWQpIC8gc2l6ZW9mKG9pZCkgKyAzIC0gMSk7CgogICAgaWYgKChTdG9yYWdlVG1wID0KICAgICAgICAgaGVhZGVyX2NvbXBsZXgodHJhY2VSb3V0ZUN0bFRhYmxlU3RvcmFnZSwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgJm5hbWVbc2l6ZW9mKHRyYWNlUm91dGVDdGxUYWJsZV92YXJpYWJsZXNfb2lkKSAvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihvaWQpICsgMyAtIDFdLCAmbmV3bGVuLCAxLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkgPT0gTlVMTCkKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9TVUNITkFNRTsgICAgIC8qIHJlbW92ZSBpZiB5b3Ugc3VwcG9ydCBjcmVhdGlvbiBoZXJlICovCgogICAgaWYgKFN0b3JhZ2VUbXAgJiYgU3RvcmFnZVRtcC0+c3RvcmFnZVR5cGUgPT0gU1RfUkVBRE9OTFkpIHsKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9UV1JJVEFCTEU7CiAgICB9CgogICAgaWYgKFN0b3JhZ2VUbXAgJiYgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFJvd1N0YXR1cyA9PSBSU19BQ1RJVkUpIHsKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9UV1JJVEFCTEU7CiAgICB9CiAgICBzd2l0Y2ggKGFjdGlvbikgewogICAgY2FzZSBSRVNFUlZFMToKICAgICAgICBpZiAodmFyX3ZhbF90eXBlICE9IEFTTl9JTlRFR0VSKSB7CiAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsCiAgICAgICAgICAgICAgICAgICAgICJ3cml0ZSB0byB0cmFjZVJvdXRlQ3RsTWF4Um93cyBub3QgQVNOX0lOVEVHRVJcbiIpOwogICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfV1JPTkdUWVBFOwogICAgICAgIH0KICAgICAgICBicmVhazsKCgogICAgY2FzZSBSRVNFUlZFMjoKICAgICAgICAvKgogICAgICAgICAqIG1lbW9yeSByZXNldmVyYXRpb24sIGZpbmFsIHByZXBhcmF0aW9uLi4uIAogICAgICAgICAqLwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIEZSRUU6CiAgICAgICAgLyoKICAgICAgICAgKiBSZWxlYXNlIGFueSByZXNvdXJjZXMgdGhhdCBoYXZlIGJlZW4gYWxsb2NhdGVkIAogICAgICAgICAqLwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIEFDVElPTjoKICAgICAgICAvKgogICAgICAgICAqIFRoZSB2YXJpYWJsZSBoYXMgYmVlbiBzdG9yZWQgaW4gb2JqaWQgZm9yCiAgICAgICAgICogeW91IHRvIHVzZSwgYW5kIHlvdSBoYXZlIGp1c3QgYmVlbiBhc2tlZCB0byBkbyBzb21ldGhpbmcgd2l0aAogICAgICAgICAqIGl0LiAgTm90ZSB0aGF0IGFueXRoaW5nIGRvbmUgaGVyZSBtdXN0IGJlIHJldmVyc2FibGUgaW4gdGhlIFVORE8gY2FzZSAKICAgICAgICAgKi8KICAgICAgICB0bXB2YXIgPSBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsSWZJbmRleDsKICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsSWZJbmRleCA9ICooKGxvbmcgKikgdmFyX3ZhbCk7CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgVU5ETzoKICAgICAgICAvKgogICAgICAgICAqIEJhY2sgb3V0IGFueSBjaGFuZ2VzIG1hZGUgaW4gdGhlIEFDVElPTiBjYXNlIAogICAgICAgICAqLwogICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxJZkluZGV4ID0gdG1wdmFyOwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIENPTU1JVDoKICAgICAgICAvKgogICAgICAgICAqIFRoaW5ncyBhcmUgd29ya2luZyB3ZWxsLCBzbyBpdCdzIG5vdyBzYWZlIHRvIG1ha2UgdGhlIGNoYW5nZQogICAgICAgICAqIHBlcm1hbmVudGx5LiAgTWFrZSBzdXJlIHRoYXQgYW55dGhpbmcgZG9uZSBoZXJlIGNhbid0IGZhaWwhIAogICAgICAgICAqLwogICAgICAgIGJyZWFrOwogICAgfQogICAgcmV0dXJuIFNOTVBfRVJSX05PRVJST1I7Cn0KCgoKaW50CndyaXRlX3RyYWNlUm91dGVDdGxNaXNjT3B0aW9ucyhpbnQgYWN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogdmFyX3ZhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciB2YXJfdmFsX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgdmFyX3ZhbF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiBzdGF0UCwgb2lkICogbmFtZSwgc2l6ZV90IG5hbWVfbGVuKQp7CiAgICBzdGF0aWMgY2hhciAgICAqdG1wdmFyOwogICAgc3RhdGljIHNpemVfdCAgIHRtcGxlbjsKICAgIHN0cnVjdCB0cmFjZVJvdXRlQ3RsVGFibGVfZGF0YSAqU3RvcmFnZVRtcCA9IE5VTEw7CiAgICBzaXplX3QgICAgICAgICAgbmV3bGVuID0KICAgICAgICBuYW1lX2xlbiAtCiAgICAgICAgKHNpemVvZih0cmFjZVJvdXRlQ3RsVGFibGVfdmFyaWFibGVzX29pZCkgLyBzaXplb2Yob2lkKSArIDMgLSAxKTsKCiAgICBpZiAoKFN0b3JhZ2VUbXAgPQogICAgICAgICBoZWFkZXJfY29tcGxleCh0cmFjZVJvdXRlQ3RsVGFibGVTdG9yYWdlLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAmbmFtZVtzaXplb2YodHJhY2VSb3V0ZUN0bFRhYmxlX3ZhcmlhYmxlc19vaWQpIC8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9pZCkgKyAzIC0gMV0sICZuZXdsZW4sIDEsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKSA9PSBOVUxMKQogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1NVQ0hOQU1FOyAgICAgLyogcmVtb3ZlIGlmIHlvdSBzdXBwb3J0IGNyZWF0aW9uIGhlcmUgKi8KCiAgICBpZiAoU3RvcmFnZVRtcCAmJiBTdG9yYWdlVG1wLT5zdG9yYWdlVHlwZSA9PSBTVF9SRUFET05MWSkgewogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1RXUklUQUJMRTsKICAgIH0KCiAgICBpZiAoU3RvcmFnZVRtcCAmJiBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsUm93U3RhdHVzID09IFJTX0FDVElWRSkgewogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1RXUklUQUJMRTsKICAgIH0KCiAgICBzd2l0Y2ggKGFjdGlvbikgewogICAgY2FzZSBSRVNFUlZFMToKICAgICAgICBpZiAodmFyX3ZhbF90eXBlICE9IEFTTl9PQ1RFVF9TVFIpIHsKICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwKICAgICAgICAgICAgICAgICAgICAgIndyaXRlIHRvIHRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzIG5vdCBBU05fT0NURVRfU1RSXG4iKTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX1dST05HVFlQRTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgUkVTRVJWRTI6CiAgICAgICAgLyoKICAgICAgICAgKiBtZW1vcnkgcmVzZXZlcmF0aW9uLCBmaW5hbCBwcmVwYXJhdGlvbi4uLiAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBGUkVFOgogICAgICAgIC8qCiAgICAgICAgICogUmVsZWFzZSBhbnkgcmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIGFsbG9jYXRlZCAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBBQ1RJT046CiAgICAgICAgLyoKICAgICAgICAgKiBUaGUgdmFyaWFibGUgaGFzIGJlZW4gc3RvcmVkIGluIGxvbmdfcmV0IGZvcgogICAgICAgICAqIHlvdSB0byB1c2UsIGFuZCB5b3UgaGF2ZSBqdXN0IGJlZW4gYXNrZWQgdG8gZG8gc29tZXRoaW5nIHdpdGgKICAgICAgICAgKiBpdC4gIE5vdGUgdGhhdCBhbnl0aGluZyBkb25lIGhlcmUgbXVzdCBiZSByZXZlcnNhYmxlIGluIHRoZSBVTkRPIGNhc2UgCiAgICAgICAgICovCiAgICAgICAgdG1wdmFyID0gU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bE1pc2NPcHRpb25zOwogICAgICAgIHRtcGxlbiA9IFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxNaXNjT3B0aW9uc0xlbjsKICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsTWlzY09wdGlvbnMgPQogICAgICAgICAgICAoY2hhciAqKSBtYWxsb2ModmFyX3ZhbF9sZW4gKyAxKTsKICAgICAgICBpZiAoU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bE1pc2NPcHRpb25zID09IE5VTEwpIHsKICAgICAgICAgICAgZXhpdCgxKTsKICAgICAgICB9CiAgICAgICAgbWVtY3B5KFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxNaXNjT3B0aW9ucywgdmFyX3ZhbCwKICAgICAgICAgICAgICAgdmFyX3ZhbF9sZW4gKyAxKTsKICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsTWlzY09wdGlvbnNbdmFyX3ZhbF9sZW5dID0gJ1wwJzsKICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsTWlzY09wdGlvbnNMZW4gPSB2YXJfdmFsX2xlbjsKICAgICAgICBicmVhazsKCgogICAgY2FzZSBVTkRPOgogICAgICAgIC8qCiAgICAgICAgICogQmFjayBvdXQgYW55IGNoYW5nZXMgbWFkZSBpbiB0aGUgQUNUSU9OIGNhc2UgCiAgICAgICAgICovCiAgICAgICAgU05NUF9GUkVFKFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxNaXNjT3B0aW9ucyk7CiAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bE1pc2NPcHRpb25zID0gTlVMTDsKICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsTWlzY09wdGlvbnMgPSB0bXB2YXI7CiAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bE1pc2NPcHRpb25zTGVuID0gdG1wbGVuOwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIENPTU1JVDoKICAgICAgICAvKgogICAgICAgICAqIFRoaW5ncyBhcmUgd29ya2luZyB3ZWxsLCBzbyBpdCdzIG5vdyBzYWZlIHRvIG1ha2UgdGhlIGNoYW5nZQogICAgICAgICAqIHBlcm1hbmVudGx5LiAgTWFrZSBzdXJlIHRoYXQgYW55dGhpbmcgZG9uZSBoZXJlIGNhbid0IGZhaWwhIAogICAgICAgICAqLwogICAgICAgIFNOTVBfRlJFRSh0bXB2YXIpOwogICAgICAgIHRtcHZhciA9IE5VTEw7CiAgICAgICAgYnJlYWs7CiAgICB9CiAgICByZXR1cm4gU05NUF9FUlJfTk9FUlJPUjsKfQoKaW50CndyaXRlX3RyYWNlUm91dGVDdGxNYXhGYWlsdXJlcyhpbnQgYWN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogdmFyX3ZhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciB2YXJfdmFsX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgdmFyX3ZhbF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiBzdGF0UCwgb2lkICogbmFtZSwgc2l6ZV90IG5hbWVfbGVuKQp7CiAgICBzdGF0aWMgc2l6ZV90ICAgdG1wdmFyOwogICAgc3RydWN0IHRyYWNlUm91dGVDdGxUYWJsZV9kYXRhICpTdG9yYWdlVG1wID0gTlVMTDsKICAgIHNpemVfdCAgICAgICAgICBuZXdsZW4gPQogICAgICAgIG5hbWVfbGVuIC0KICAgICAgICAoc2l6ZW9mKHRyYWNlUm91dGVDdGxUYWJsZV92YXJpYWJsZXNfb2lkKSAvIHNpemVvZihvaWQpICsgMyAtIDEpOwoKICAgIGlmICgoU3RvcmFnZVRtcCA9CiAgICAgICAgIGhlYWRlcl9jb21wbGV4KHRyYWNlUm91dGVDdGxUYWJsZVN0b3JhZ2UsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICZuYW1lW3NpemVvZih0cmFjZVJvdXRlQ3RsVGFibGVfdmFyaWFibGVzX29pZCkgLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yob2lkKSArIDMgLSAxXSwgJm5ld2xlbiwgMSwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpID09IE5VTEwpCiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PU1VDSE5BTUU7ICAgICAvKiByZW1vdmUgaWYgeW91IHN1cHBvcnQgY3JlYXRpb24gaGVyZSAqLwoKICAgIGlmIChTdG9yYWdlVG1wICYmIFN0b3JhZ2VUbXAtPnN0b3JhZ2VUeXBlID09IFNUX1JFQURPTkxZKSB7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PVFdSSVRBQkxFOwogICAgfQoKICAgIGlmIChTdG9yYWdlVG1wICYmIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxSb3dTdGF0dXMgPT0gUlNfQUNUSVZFKSB7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PVFdSSVRBQkxFOwogICAgfQogICAgc3dpdGNoIChhY3Rpb24pIHsKICAgIGNhc2UgUkVTRVJWRTE6CiAgICAgICAgaWYgKHZhcl92YWxfdHlwZSAhPSBBU05fVU5TSUdORUQpIHsKICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwKICAgICAgICAgICAgICAgICAgICAgIndyaXRlIHRvIHRyYWNlUm91dGVDdGxUcmFwVGVzdEZhaWx1cmVGaWx0ZXIgbm90IEFTTl9VTlNJR05FRFxuIik7CiAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9XUk9OR1RZUEU7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIFJFU0VSVkUyOgogICAgICAgIC8qCiAgICAgICAgICogbWVtb3J5IHJlc2V2ZXJhdGlvbiwgZmluYWwgcHJlcGFyYXRpb24uLi4gCiAgICAgICAgICovCiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgRlJFRToKICAgICAgICAvKgogICAgICAgICAqIFJlbGVhc2UgYW55IHJlc291cmNlcyB0aGF0IGhhdmUgYmVlbiBhbGxvY2F0ZWQgCiAgICAgICAgICovCiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgQUNUSU9OOgogICAgICAgIC8qCiAgICAgICAgICogVGhlIHZhcmlhYmxlIGhhcyBiZWVuIHN0b3JlZCBpbiBvYmppZCBmb3IKICAgICAgICAgKiB5b3UgdG8gdXNlLCBhbmQgeW91IGhhdmUganVzdCBiZWVuIGFza2VkIHRvIGRvIHNvbWV0aGluZyB3aXRoCiAgICAgICAgICogaXQuICBOb3RlIHRoYXQgYW55dGhpbmcgZG9uZSBoZXJlIG11c3QgYmUgcmV2ZXJzYWJsZSBpbiB0aGUgVU5ETyBjYXNlIAogICAgICAgICAqLwogICAgICAgIHRtcHZhciA9IFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxNYXhGYWlsdXJlczsKICAgICAgICBpZiAoKCooKGxvbmcgKikgdmFyX3ZhbCkpID49IDAgJiYgKCooKGxvbmcgKikgdmFyX3ZhbCkpIDw9IDE1KQogICAgICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsTWF4RmFpbHVyZXMgPSAqKChsb25nICopIHZhcl92YWwpOwogICAgICAgIGVsc2UKICAgICAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bE1heEZhaWx1cmVzID0gMTsKICAgICAgICBicmVhazsKCgogICAgY2FzZSBVTkRPOgogICAgICAgIC8qCiAgICAgICAgICogQmFjayBvdXQgYW55IGNoYW5nZXMgbWFkZSBpbiB0aGUgQUNUSU9OIGNhc2UgCiAgICAgICAgICovCiAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bE1heEZhaWx1cmVzID0gdG1wdmFyOwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIENPTU1JVDoKICAgICAgICAvKgogICAgICAgICAqIFRoaW5ncyBhcmUgd29ya2luZyB3ZWxsLCBzbyBpdCdzIG5vdyBzYWZlIHRvIG1ha2UgdGhlIGNoYW5nZQogICAgICAgICAqIHBlcm1hbmVudGx5LiAgTWFrZSBzdXJlIHRoYXQgYW55dGhpbmcgZG9uZSBoZXJlIGNhbid0IGZhaWwhIAogICAgICAgICAqLwogICAgICAgIGJyZWFrOwogICAgfQogICAgcmV0dXJuIFNOTVBfRVJSX05PRVJST1I7Cn0KCgoKCgppbnQKd3JpdGVfdHJhY2VSb3V0ZUN0bERvbnRGcmFnbWVudChpbnQgYWN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHZhcl92YWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyIHZhcl92YWxfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgdmFyX3ZhbF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogc3RhdFAsIG9pZCAqIG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG5hbWVfbGVuKQp7CiAgICBzdGF0aWMgc2l6ZV90ICAgdG1wdmFyOwogICAgc3RydWN0IHRyYWNlUm91dGVDdGxUYWJsZV9kYXRhICpTdG9yYWdlVG1wID0gTlVMTDsKICAgIHNpemVfdCAgICAgICAgICBuZXdsZW4gPQogICAgICAgIG5hbWVfbGVuIC0KICAgICAgICAoc2l6ZW9mKHRyYWNlUm91dGVDdGxUYWJsZV92YXJpYWJsZXNfb2lkKSAvIHNpemVvZihvaWQpICsgMyAtIDEpOwoKICAgIGlmICgoU3RvcmFnZVRtcCA9CiAgICAgICAgIGhlYWRlcl9jb21wbGV4KHRyYWNlUm91dGVDdGxUYWJsZVN0b3JhZ2UsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICZuYW1lW3NpemVvZih0cmFjZVJvdXRlQ3RsVGFibGVfdmFyaWFibGVzX29pZCkgLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yob2lkKSArIDMgLSAxXSwgJm5ld2xlbiwgMSwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpID09IE5VTEwpCiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PU1VDSE5BTUU7ICAgICAvKiByZW1vdmUgaWYgeW91IHN1cHBvcnQgY3JlYXRpb24gaGVyZSAqLwoKICAgIGlmIChTdG9yYWdlVG1wICYmIFN0b3JhZ2VUbXAtPnN0b3JhZ2VUeXBlID09IFNUX1JFQURPTkxZKSB7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PVFdSSVRBQkxFOwogICAgfQoKICAgIGlmIChTdG9yYWdlVG1wICYmIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxSb3dTdGF0dXMgPT0gUlNfQUNUSVZFKSB7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PVFdSSVRBQkxFOwogICAgfQogICAgc3dpdGNoIChhY3Rpb24pIHsKICAgIGNhc2UgUkVTRVJWRTE6CiAgICAgICAgaWYgKHZhcl92YWxfdHlwZSAhPSBBU05fSU5URUdFUikgewogICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLAogICAgICAgICAgICAgICAgICAgICAid3JpdGUgdG8gdHJhY2VSb3V0ZUN0bE1heFJvd3Mgbm90IEFTTl9JTlRFR0VSXG4iKTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX1dST05HVFlQRTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgUkVTRVJWRTI6CiAgICAgICAgLyoKICAgICAgICAgKiBtZW1vcnkgcmVzZXZlcmF0aW9uLCBmaW5hbCBwcmVwYXJhdGlvbi4uLiAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBGUkVFOgogICAgICAgIC8qCiAgICAgICAgICogUmVsZWFzZSBhbnkgcmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIGFsbG9jYXRlZCAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBBQ1RJT046CiAgICAgICAgLyoKICAgICAgICAgKiBUaGUgdmFyaWFibGUgaGFzIGJlZW4gc3RvcmVkIGluIG9iamlkIGZvcgogICAgICAgICAqIHlvdSB0byB1c2UsIGFuZCB5b3UgaGF2ZSBqdXN0IGJlZW4gYXNrZWQgdG8gZG8gc29tZXRoaW5nIHdpdGgKICAgICAgICAgKiBpdC4gIE5vdGUgdGhhdCBhbnl0aGluZyBkb25lIGhlcmUgbXVzdCBiZSByZXZlcnNhYmxlIGluIHRoZSBVTkRPIGNhc2UgCiAgICAgICAgICovCiAgICAgICAgdG1wdmFyID0gU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bERvbnRGcmFnbWVudDsKICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsRG9udEZyYWdtZW50ID0gKigobG9uZyAqKSB2YXJfdmFsKTsKICAgICAgICBicmVhazsKCgogICAgY2FzZSBVTkRPOgogICAgICAgIC8qCiAgICAgICAgICogQmFjayBvdXQgYW55IGNoYW5nZXMgbWFkZSBpbiB0aGUgQUNUSU9OIGNhc2UgCiAgICAgICAgICovCiAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bERvbnRGcmFnbWVudCA9IHRtcHZhcjsKICAgICAgICBicmVhazsKCgogICAgY2FzZSBDT01NSVQ6CiAgICAgICAgLyoKICAgICAgICAgKiBUaGluZ3MgYXJlIHdvcmtpbmcgd2VsbCwgc28gaXQncyBub3cgc2FmZSB0byBtYWtlIHRoZSBjaGFuZ2UKICAgICAgICAgKiBwZXJtYW5lbnRseS4gIE1ha2Ugc3VyZSB0aGF0IGFueXRoaW5nIGRvbmUgaGVyZSBjYW4ndCBmYWlsISAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKICAgIH0KICAgIHJldHVybiBTTk1QX0VSUl9OT0VSUk9SOwp9CgoKCgppbnQKd3JpdGVfdHJhY2VSb3V0ZUN0bEluaXRpYWxUdGwoaW50IGFjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogdmFyX3ZhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyIHZhcl92YWxfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHZhcl92YWxfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiBzdGF0UCwgb2lkICogbmFtZSwgc2l6ZV90IG5hbWVfbGVuKQp7CiAgICBzdGF0aWMgc2l6ZV90ICAgdG1wdmFyOwogICAgc3RydWN0IHRyYWNlUm91dGVDdGxUYWJsZV9kYXRhICpTdG9yYWdlVG1wID0gTlVMTDsKICAgIHNpemVfdCAgICAgICAgICBuZXdsZW4gPQogICAgICAgIG5hbWVfbGVuIC0KICAgICAgICAoc2l6ZW9mKHRyYWNlUm91dGVDdGxUYWJsZV92YXJpYWJsZXNfb2lkKSAvIHNpemVvZihvaWQpICsgMyAtIDEpOwoKICAgIGlmICgoU3RvcmFnZVRtcCA9CiAgICAgICAgIGhlYWRlcl9jb21wbGV4KHRyYWNlUm91dGVDdGxUYWJsZVN0b3JhZ2UsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICZuYW1lW3NpemVvZih0cmFjZVJvdXRlQ3RsVGFibGVfdmFyaWFibGVzX29pZCkgLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yob2lkKSArIDMgLSAxXSwgJm5ld2xlbiwgMSwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpID09IE5VTEwpCiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PU1VDSE5BTUU7ICAgICAvKiByZW1vdmUgaWYgeW91IHN1cHBvcnQgY3JlYXRpb24gaGVyZSAqLwoKICAgIGlmIChTdG9yYWdlVG1wICYmIFN0b3JhZ2VUbXAtPnN0b3JhZ2VUeXBlID09IFNUX1JFQURPTkxZKSB7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PVFdSSVRBQkxFOwogICAgfQoKICAgIGlmIChTdG9yYWdlVG1wICYmIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxSb3dTdGF0dXMgPT0gUlNfQUNUSVZFKSB7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PVFdSSVRBQkxFOwogICAgfQogICAgc3dpdGNoIChhY3Rpb24pIHsKICAgIGNhc2UgUkVTRVJWRTE6CiAgICAgICAgaWYgKHZhcl92YWxfdHlwZSAhPSBBU05fVU5TSUdORUQpIHsKICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwKICAgICAgICAgICAgICAgICAgICAgIndyaXRlIHRvIHRyYWNlUm91dGVDdGxUcmFwVGVzdEZhaWx1cmVGaWx0ZXIgbm90IEFTTl9VTlNJR05FRFxuIik7CiAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9XUk9OR1RZUEU7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIFJFU0VSVkUyOgogICAgICAgIC8qCiAgICAgICAgICogbWVtb3J5IHJlc2V2ZXJhdGlvbiwgZmluYWwgcHJlcGFyYXRpb24uLi4gCiAgICAgICAgICovCiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgRlJFRToKICAgICAgICAvKgogICAgICAgICAqIFJlbGVhc2UgYW55IHJlc291cmNlcyB0aGF0IGhhdmUgYmVlbiBhbGxvY2F0ZWQgCiAgICAgICAgICovCiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgQUNUSU9OOgogICAgICAgIC8qCiAgICAgICAgICogVGhlIHZhcmlhYmxlIGhhcyBiZWVuIHN0b3JlZCBpbiBvYmppZCBmb3IKICAgICAgICAgKiB5b3UgdG8gdXNlLCBhbmQgeW91IGhhdmUganVzdCBiZWVuIGFza2VkIHRvIGRvIHNvbWV0aGluZyB3aXRoCiAgICAgICAgICogaXQuICBOb3RlIHRoYXQgYW55dGhpbmcgZG9uZSBoZXJlIG11c3QgYmUgcmV2ZXJzYWJsZSBpbiB0aGUgVU5ETyBjYXNlIAogICAgICAgICAqLwogICAgICAgIHRtcHZhciA9IFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxJbml0aWFsVHRsOwogICAgICAgIGlmICgoKigobG9uZyAqKSB2YXJfdmFsKSkgPj0gMCAmJiAoKigobG9uZyAqKSB2YXJfdmFsKSkgPD0gMjU1KQogICAgICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsSW5pdGlhbFR0bCA9ICooKGxvbmcgKikgdmFyX3ZhbCk7CiAgICAgICAgZWxzZQogICAgICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsSW5pdGlhbFR0bCA9IDE7CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgVU5ETzoKICAgICAgICAvKgogICAgICAgICAqIEJhY2sgb3V0IGFueSBjaGFuZ2VzIG1hZGUgaW4gdGhlIEFDVElPTiBjYXNlIAogICAgICAgICAqLwogICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxJbml0aWFsVHRsID0gdG1wdmFyOwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIENPTU1JVDoKICAgICAgICAvKgogICAgICAgICAqIFRoaW5ncyBhcmUgd29ya2luZyB3ZWxsLCBzbyBpdCdzIG5vdyBzYWZlIHRvIG1ha2UgdGhlIGNoYW5nZQogICAgICAgICAqIHBlcm1hbmVudGx5LiAgTWFrZSBzdXJlIHRoYXQgYW55dGhpbmcgZG9uZSBoZXJlIGNhbid0IGZhaWwhIAogICAgICAgICAqLwogICAgICAgIGJyZWFrOwogICAgfQogICAgcmV0dXJuIFNOTVBfRVJSX05PRVJST1I7Cn0KCgppbnQKd3JpdGVfdHJhY2VSb3V0ZUN0bEZyZXF1ZW5jeShpbnQgYWN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHZhcl92YWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyIHZhcl92YWxfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgdmFyX3ZhbF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogc3RhdFAsIG9pZCAqIG5hbWUsIHNpemVfdCBuYW1lX2xlbikKewogICAgc3RhdGljIHNpemVfdCAgIHRtcHZhcjsKICAgIHN0cnVjdCB0cmFjZVJvdXRlQ3RsVGFibGVfZGF0YSAqU3RvcmFnZVRtcCA9IE5VTEw7CiAgICBzaXplX3QgICAgICAgICAgbmV3bGVuID0KICAgICAgICBuYW1lX2xlbiAtCiAgICAgICAgKHNpemVvZih0cmFjZVJvdXRlQ3RsVGFibGVfdmFyaWFibGVzX29pZCkgLyBzaXplb2Yob2lkKSArIDMgLSAxKTsKCiAgICBpZiAoKFN0b3JhZ2VUbXAgPQogICAgICAgICBoZWFkZXJfY29tcGxleCh0cmFjZVJvdXRlQ3RsVGFibGVTdG9yYWdlLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAmbmFtZVtzaXplb2YodHJhY2VSb3V0ZUN0bFRhYmxlX3ZhcmlhYmxlc19vaWQpIC8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9pZCkgKyAzIC0gMV0sICZuZXdsZW4sIDEsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKSA9PSBOVUxMKQogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1NVQ0hOQU1FOyAgICAgLyogcmVtb3ZlIGlmIHlvdSBzdXBwb3J0IGNyZWF0aW9uIGhlcmUgKi8KCiAgICBpZiAoU3RvcmFnZVRtcCAmJiBTdG9yYWdlVG1wLT5zdG9yYWdlVHlwZSA9PSBTVF9SRUFET05MWSkgewogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1RXUklUQUJMRTsKICAgIH0KCiAgICBpZiAoU3RvcmFnZVRtcCAmJiBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsUm93U3RhdHVzID09IFJTX0FDVElWRSkgewogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1RXUklUQUJMRTsKICAgIH0KICAgIHN3aXRjaCAoYWN0aW9uKSB7CiAgICBjYXNlIFJFU0VSVkUxOgogICAgICAgIGlmICh2YXJfdmFsX3R5cGUgIT0gQVNOX1VOU0lHTkVEKSB7CiAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsCiAgICAgICAgICAgICAgICAgICAgICJ3cml0ZSB0byB0cmFjZVJvdXRlQ3RsU291cmNlQWRkcmVzc1R5cGUgbm90IEFTTl9VTlNJR05FRFxuIik7CiAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9XUk9OR1RZUEU7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIFJFU0VSVkUyOgogICAgICAgIC8qCiAgICAgICAgICogbWVtb3J5IHJlc2V2ZXJhdGlvbiwgZmluYWwgcHJlcGFyYXRpb24uLi4gCiAgICAgICAgICovCiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgRlJFRToKICAgICAgICAvKgogICAgICAgICAqIFJlbGVhc2UgYW55IHJlc291cmNlcyB0aGF0IGhhdmUgYmVlbiBhbGxvY2F0ZWQgCiAgICAgICAgICovCiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgQUNUSU9OOgogICAgICAgIC8qCiAgICAgICAgICogVGhlIHZhcmlhYmxlIGhhcyBiZWVuIHN0b3JlZCBpbiBvYmppZCBmb3IKICAgICAgICAgKiB5b3UgdG8gdXNlLCBhbmQgeW91IGhhdmUganVzdCBiZWVuIGFza2VkIHRvIGRvIHNvbWV0aGluZyB3aXRoCiAgICAgICAgICogaXQuICBOb3RlIHRoYXQgYW55dGhpbmcgZG9uZSBoZXJlIG11c3QgYmUgcmV2ZXJzYWJsZSBpbiB0aGUgVU5ETyBjYXNlIAogICAgICAgICAqLwogICAgICAgIHRtcHZhciA9IFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxGcmVxdWVuY3k7CiAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bEZyZXF1ZW5jeSA9ICooKGxvbmcgKikgdmFyX3ZhbCk7CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgVU5ETzoKICAgICAgICAvKgogICAgICAgICAqIEJhY2sgb3V0IGFueSBjaGFuZ2VzIG1hZGUgaW4gdGhlIEFDVElPTiBjYXNlIAogICAgICAgICAqLwogICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxGcmVxdWVuY3kgPSB0bXB2YXI7CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgQ09NTUlUOgogICAgICAgIC8qCiAgICAgICAgICogVGhpbmdzIGFyZSB3b3JraW5nIHdlbGwsIHNvIGl0J3Mgbm93IHNhZmUgdG8gbWFrZSB0aGUgY2hhbmdlCiAgICAgICAgICogcGVybWFuZW50bHkuICBNYWtlIHN1cmUgdGhhdCBhbnl0aGluZyBkb25lIGhlcmUgY2FuJ3QgZmFpbCEgCiAgICAgICAgICovCiAgICAgICAgYnJlYWs7CiAgICB9CiAgICByZXR1cm4gU05NUF9FUlJfTk9FUlJPUjsKfQoKCgoKaW50CndyaXRlX3RyYWNlUm91dGVDdGxTdG9yYWdlVHlwZShpbnQgYWN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogdmFyX3ZhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciB2YXJfdmFsX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgdmFyX3ZhbF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiBzdGF0UCwgb2lkICogbmFtZSwgc2l6ZV90IG5hbWVfbGVuKQp7CiAgICBzdGF0aWMgc2l6ZV90ICAgdG1wdmFyOwogICAgaW50ICAgICAgICAgICAgIHNldF92YWx1ZTsKICAgIHN0cnVjdCB0cmFjZVJvdXRlQ3RsVGFibGVfZGF0YSAqU3RvcmFnZVRtcCA9IE5VTEw7CiAgICBzaXplX3QgICAgICAgICAgbmV3bGVuID0KICAgICAgICBuYW1lX2xlbiAtCiAgICAgICAgKHNpemVvZih0cmFjZVJvdXRlQ3RsVGFibGVfdmFyaWFibGVzX29pZCkgLyBzaXplb2Yob2lkKSArIDMgLSAxKTsKCiAgICBpZiAoKFN0b3JhZ2VUbXAgPQogICAgICAgICBoZWFkZXJfY29tcGxleCh0cmFjZVJvdXRlQ3RsVGFibGVTdG9yYWdlLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAmbmFtZVtzaXplb2YodHJhY2VSb3V0ZUN0bFRhYmxlX3ZhcmlhYmxlc19vaWQpIC8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9pZCkgKyAzIC0gMV0sICZuZXdsZW4sIDEsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKSA9PSBOVUxMKQogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1NVQ0hOQU1FOyAgICAgLyogcmVtb3ZlIGlmIHlvdSBzdXBwb3J0IGNyZWF0aW9uIGhlcmUgKi8KCiAgICBpZiAoU3RvcmFnZVRtcCAmJiBTdG9yYWdlVG1wLT5zdG9yYWdlVHlwZSA9PSBTVF9SRUFET05MWSkgewogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1RXUklUQUJMRTsKICAgIH0KCiAgICBpZiAoU3RvcmFnZVRtcCAmJiBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsUm93U3RhdHVzID09IFJTX0FDVElWRSkgewogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1RXUklUQUJMRTsKICAgIH0KCgogICAgc2V0X3ZhbHVlID0gKigobG9uZyAqKSB2YXJfdmFsKTsKCiAgICBzd2l0Y2ggKGFjdGlvbikgewogICAgY2FzZSBSRVNFUlZFMToKICAgICAgICBpZiAodmFyX3ZhbF90eXBlICE9IEFTTl9JTlRFR0VSKSB7CiAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsCiAgICAgICAgICAgICAgICAgICAgICJ3cml0ZSB0byB0cmFjZVJvdXRlQ3RsTWF4Um93cyBub3QgQVNOX0lOVEVHRVJcbiIpOwogICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfV1JPTkdUWVBFOwogICAgICAgIH0KCiAgICAgICAgaWYgKChTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsU3RvcmFnZVR5cGUgPT0gMgogICAgICAgICAgICAgfHwgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFN0b3JhZ2VUeXBlID09IDMpCiAgICAgICAgICAgICYmIChzZXRfdmFsdWUgPT0gNCB8fCBzZXRfdmFsdWUgPT0gNSkpIHsKICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX1dST05HVkFMVUU7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgUkVTRVJWRTI6CiAgICAgICAgLyoKICAgICAgICAgKiBtZW1vcnkgcmVzZXZlcmF0aW9uLCBmaW5hbCBwcmVwYXJhdGlvbi4uLiAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBGUkVFOgogICAgICAgIC8qCiAgICAgICAgICogUmVsZWFzZSBhbnkgcmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIGFsbG9jYXRlZCAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBBQ1RJT046CiAgICAgICAgLyoKICAgICAgICAgKiBUaGUgdmFyaWFibGUgaGFzIGJlZW4gc3RvcmVkIGluIG9iamlkIGZvcgogICAgICAgICAqIHlvdSB0byB1c2UsIGFuZCB5b3UgaGF2ZSBqdXN0IGJlZW4gYXNrZWQgdG8gZG8gc29tZXRoaW5nIHdpdGgKICAgICAgICAgKiBpdC4gIE5vdGUgdGhhdCBhbnl0aGluZyBkb25lIGhlcmUgbXVzdCBiZSByZXZlcnNhYmxlIGluIHRoZSBVTkRPIGNhc2UgCiAgICAgICAgICovCiAgICAgICAgdG1wdmFyID0gU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFN0b3JhZ2VUeXBlOwogICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxTdG9yYWdlVHlwZSA9ICooKGxvbmcgKikgdmFyX3ZhbCk7CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgVU5ETzoKICAgICAgICAvKgogICAgICAgICAqIEJhY2sgb3V0IGFueSBjaGFuZ2VzIG1hZGUgaW4gdGhlIEFDVElPTiBjYXNlIAogICAgICAgICAqLwogICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxTdG9yYWdlVHlwZSA9IHRtcHZhcjsKICAgICAgICBicmVhazsKCgogICAgY2FzZSBDT01NSVQ6CiAgICAgICAgLyoKICAgICAgICAgKiBUaGluZ3MgYXJlIHdvcmtpbmcgd2VsbCwgc28gaXQncyBub3cgc2FmZSB0byBtYWtlIHRoZSBjaGFuZ2UKICAgICAgICAgKiBwZXJtYW5lbnRseS4gIE1ha2Ugc3VyZSB0aGF0IGFueXRoaW5nIGRvbmUgaGVyZSBjYW4ndCBmYWlsISAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKICAgIH0KICAgIHJldHVybiBTTk1QX0VSUl9OT0VSUk9SOwp9CgoKCmludAp3cml0ZV90cmFjZVJvdXRlQ3RsQWRtaW5TdGF0dXMoaW50IGFjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHZhcl92YWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgdmFyX3ZhbF90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHZhcl92YWxfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogc3RhdFAsIG9pZCAqIG5hbWUsIHNpemVfdCBuYW1lX2xlbikKewogICAgc3RhdGljIHNpemVfdCAgIHRtcHZhcjsKICAgIHN0cnVjdCB0cmFjZVJvdXRlQ3RsVGFibGVfZGF0YSAqU3RvcmFnZVRtcCA9IE5VTEw7CiAgICBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKnZhcnMgPSBOVUxMOwogICAgc3RydWN0IHRyYWNlUm91dGVSZXN1bHRzVGFibGVfZGF0YSAqU3RvcmFnZU5ldyA9IE5VTEw7CiAgICBzaXplX3QgICAgICAgICAgbmV3bGVuID0KICAgICAgICBuYW1lX2xlbiAtCiAgICAgICAgKHNpemVvZih0cmFjZVJvdXRlQ3RsVGFibGVfdmFyaWFibGVzX29pZCkgLyBzaXplb2Yob2lkKSArIDMgLSAxKTsKCiAgICBpZiAoKFN0b3JhZ2VUbXAgPQogICAgICAgICBoZWFkZXJfY29tcGxleCh0cmFjZVJvdXRlQ3RsVGFibGVTdG9yYWdlLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAmbmFtZVtzaXplb2YodHJhY2VSb3V0ZUN0bFRhYmxlX3ZhcmlhYmxlc19vaWQpIC8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9pZCkgKyAzIC0gMV0sICZuZXdsZW4sIDEsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKSA9PSBOVUxMKQogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1NVQ0hOQU1FOyAgICAgLyogcmVtb3ZlIGlmIHlvdSBzdXBwb3J0IGNyZWF0aW9uIGhlcmUgKi8KCiAgICBpZiAoU3RvcmFnZVRtcCAmJiBTdG9yYWdlVG1wLT5zdG9yYWdlVHlwZSA9PSBTVF9SRUFET05MWSkgewogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1RXUklUQUJMRTsKICAgIH0KCiAgICBzd2l0Y2ggKGFjdGlvbikgewogICAgY2FzZSBSRVNFUlZFMToKICAgICAgICBpZiAodmFyX3ZhbF90eXBlICE9IEFTTl9JTlRFR0VSKSB7CiAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsCiAgICAgICAgICAgICAgICAgICAgICJ3cml0ZSB0byB0cmFjZVJvdXRlQ3RsSWZJbmRleCBub3QgQVNOX0lOVEVHRVJcbiIpOwogICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfV1JPTkdUWVBFOwogICAgICAgIH0KICAgICAgICBicmVhazsKCgogICAgY2FzZSBSRVNFUlZFMjoKICAgICAgICAvKgogICAgICAgICAqIG1lbW9yeSByZXNldmVyYXRpb24sIGZpbmFsIHByZXBhcmF0aW9uLi4uIAogICAgICAgICAqLwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIEZSRUU6CiAgICAgICAgLyoKICAgICAgICAgKiBSZWxlYXNlIGFueSByZXNvdXJjZXMgdGhhdCBoYXZlIGJlZW4gYWxsb2NhdGVkIAogICAgICAgICAqLwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIEFDVElPTjoKICAgICAgICAvKgogICAgICAgICAqIFRoZSB2YXJpYWJsZSBoYXMgYmVlbiBzdG9yZWQgaW4gb2JqaWQgZm9yCiAgICAgICAgICogeW91IHRvIHVzZSwgYW5kIHlvdSBoYXZlIGp1c3QgYmVlbiBhc2tlZCB0byBkbyBzb21ldGhpbmcgd2l0aAogICAgICAgICAqIGl0LiAgTm90ZSB0aGF0IGFueXRoaW5nIGRvbmUgaGVyZSBtdXN0IGJlIHJldmVyc2FibGUgaW4gdGhlIFVORE8gY2FzZSAKICAgICAgICAgKi8KICAgICAgICB0bXB2YXIgPSBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsQWRtaW5TdGF0dXM7CiAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bEFkbWluU3RhdHVzID0gKigobG9uZyAqKSB2YXJfdmFsKTsKICAgICAgICBicmVhazsKCgogICAgY2FzZSBVTkRPOgogICAgICAgIC8qCiAgICAgICAgICogQmFjayBvdXQgYW55IGNoYW5nZXMgbWFkZSBpbiB0aGUgQUNUSU9OIGNhc2UgCiAgICAgICAgICovCiAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bEFkbWluU3RhdHVzID0gdG1wdmFyOwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIENPTU1JVDoKICAgICAgICAvKgogICAgICAgICAqIFRoaW5ncyBhcmUgd29ya2luZyB3ZWxsLCBzbyBpdCdzIG5vdyBzYWZlIHRvIG1ha2UgdGhlIGNoYW5nZQogICAgICAgICAqIHBlcm1hbmVudGx5LiAgTWFrZSBzdXJlIHRoYXQgYW55dGhpbmcgZG9uZSBoZXJlIGNhbid0IGZhaWwhIAogICAgICAgICAqLwoKICAgICAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzLCBOVUxMLCAwLCBBU05fT0NURVRfU1RSLCAoY2hhciAqKSBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleCwgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXhMZW4pOyAvKiAgdHJhY2VSb3V0ZUN0bE93bmVySW5kZXggICovCiAgICAgICAgc25tcF92YXJsaXN0X2FkZF92YXJpYWJsZSgmdmFycywgTlVMTCwgMCwgQVNOX09DVEVUX1NUUiwgKGNoYXIgKikgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lLCBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWVMZW4pOyAgICAgLyogIHRyYWNlUm91dGVDdGxUZXN0TmFtZSAgKi8KICAgICAgICBTdG9yYWdlTmV3ID0KICAgICAgICAgICAgaGVhZGVyX2NvbXBsZXhfZ2V0KHRyYWNlUm91dGVSZXN1bHRzVGFibGVTdG9yYWdlLCB2YXJzKTsKCiAgICAgICAgaWYgKFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxBZG1pblN0YXR1cyA9PSAxCiAgICAgICAgICAgICYmIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxSb3dTdGF0dXMgPT0gUlNfQUNUSVZFKSB7CiAgICAgICAgICAgIGlmIChTdG9yYWdlTmV3ID09IE5VTEwpCiAgICAgICAgICAgICAgICBpbml0X3RyUmVzdWx0c1RhYmxlKFN0b3JhZ2VUbXApOwogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVSZXN1bHRzLT4KICAgICAgICAgICAgICAgICAgICB0cmFjZVJvdXRlUmVzdWx0c09wZXJTdGF0dXMgPSAxOwogICAgICAgICAgICAgICAgbW9kaWZ5X3RyUmVzdWx0c09wZXIoU3RvcmFnZVRtcCwgMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxGcmVxdWVuY3kgIT0gMCkKICAgICAgICAgICAgICAgIFN0b3JhZ2VUbXAtPnRpbWVyX2lkID0KICAgICAgICAgICAgICAgICAgICBzbm1wX2FsYXJtX3JlZ2lzdGVyKFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxGcmVxdWVuY3ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQV9SRVBFQVQsIHJ1bl90cmFjZVJvdXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RvcmFnZVRtcCk7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIFN0b3JhZ2VUbXAtPnRpbWVyX2lkID0gc25tcF9hbGFybV9yZWdpc3RlcigxLCAwLCBydW5fdHJhY2VSb3V0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdG9yYWdlVG1wKTsKCiAgICAgICAgfSBlbHNlIGlmIChTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsQWRtaW5TdGF0dXMgPT0gMgogICAgICAgICAgICAgICAgICAgJiYgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFJvd1N0YXR1cyA9PSBSU19BQ1RJVkUpIHsKICAgICAgICAgICAgc25tcF9hbGFybV91bnJlZ2lzdGVyKFN0b3JhZ2VUbXAtPnRpbWVyX2lkKTsKICAgICAgICAgICAgaWYgKFN0b3JhZ2VOZXcgPT0gTlVMTCkKICAgICAgICAgICAgICAgIGluaXRfdHJSZXN1bHRzVGFibGUoU3RvcmFnZVRtcCk7CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZVJlc3VsdHMtPgogICAgICAgICAgICAgICAgICAgIHRyYWNlUm91dGVSZXN1bHRzT3BlclN0YXR1cyA9IDI7CiAgICAgICAgICAgICAgICBtb2RpZnlfdHJSZXN1bHRzT3BlcihTdG9yYWdlVG1wLCAyKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBicmVhazsKICAgIH0KICAgIHJldHVybiBTTk1QX0VSUl9OT0VSUk9SOwp9CgoKCgppbnQKd3JpdGVfdHJhY2VSb3V0ZUN0bERlc2NyKGludCBhY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiB2YXJfdmFsLAogICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyIHZhcl92YWxfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB2YXJfdmFsX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHN0YXRQLCBvaWQgKiBuYW1lLCBzaXplX3QgbmFtZV9sZW4pCnsKICAgIHN0YXRpYyBjaGFyICAgICp0bXB2YXI7CiAgICBzdGF0aWMgc2l6ZV90ICAgdG1wbGVuOwogICAgc3RydWN0IHRyYWNlUm91dGVDdGxUYWJsZV9kYXRhICpTdG9yYWdlVG1wID0gTlVMTDsKICAgIHNpemVfdCAgICAgICAgICBuZXdsZW4gPQogICAgICAgIG5hbWVfbGVuIC0KICAgICAgICAoc2l6ZW9mKHRyYWNlUm91dGVDdGxUYWJsZV92YXJpYWJsZXNfb2lkKSAvIHNpemVvZihvaWQpICsgMyAtIDEpOwoKCiAgICBpZiAoKFN0b3JhZ2VUbXAgPQogICAgICAgICBoZWFkZXJfY29tcGxleCh0cmFjZVJvdXRlQ3RsVGFibGVTdG9yYWdlLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAmbmFtZVtzaXplb2YodHJhY2VSb3V0ZUN0bFRhYmxlX3ZhcmlhYmxlc19vaWQpIC8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9pZCkgKyAzIC0gMV0sICZuZXdsZW4sIDEsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKSA9PSBOVUxMKQogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1NVQ0hOQU1FOyAgICAgLyogcmVtb3ZlIGlmIHlvdSBzdXBwb3J0IGNyZWF0aW9uIGhlcmUgKi8KCiAgICBpZiAoU3RvcmFnZVRtcCAmJiBTdG9yYWdlVG1wLT5zdG9yYWdlVHlwZSA9PSBTVF9SRUFET05MWSkgewogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1RXUklUQUJMRTsKICAgIH0KCiAgICBpZiAoU3RvcmFnZVRtcCAmJiBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsUm93U3RhdHVzID09IFJTX0FDVElWRSkgewogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1RXUklUQUJMRTsKICAgIH0KCiAgICBzd2l0Y2ggKGFjdGlvbikgewogICAgY2FzZSBSRVNFUlZFMToKICAgICAgICBpZiAodmFyX3ZhbF90eXBlICE9IEFTTl9PQ1RFVF9TVFIpIHsKICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwKICAgICAgICAgICAgICAgICAgICAgIndyaXRlIHRvIHRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzIG5vdCBBU05fT0NURVRfU1RSXG4iKTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX1dST05HVFlQRTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgUkVTRVJWRTI6CiAgICAgICAgLyoKICAgICAgICAgKiBtZW1vcnkgcmVzZXZlcmF0aW9uLCBmaW5hbCBwcmVwYXJhdGlvbi4uLiAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBGUkVFOgogICAgICAgIC8qCiAgICAgICAgICogUmVsZWFzZSBhbnkgcmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIGFsbG9jYXRlZCAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBBQ1RJT046CiAgICAgICAgLyoKICAgICAgICAgKiBUaGUgdmFyaWFibGUgaGFzIGJlZW4gc3RvcmVkIGluIGxvbmdfcmV0IGZvcgogICAgICAgICAqIHlvdSB0byB1c2UsIGFuZCB5b3UgaGF2ZSBqdXN0IGJlZW4gYXNrZWQgdG8gZG8gc29tZXRoaW5nIHdpdGgKICAgICAgICAgKiBpdC4gIE5vdGUgdGhhdCBhbnl0aGluZyBkb25lIGhlcmUgbXVzdCBiZSByZXZlcnNhYmxlIGluIHRoZSBVTkRPIGNhc2UgCiAgICAgICAgICovCiAgICAgICAgdG1wdmFyID0gU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bERlc2NyOwogICAgICAgIHRtcGxlbiA9IFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxEZXNjckxlbjsKCiAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bERlc2NyID0gKGNoYXIgKikgbWFsbG9jKHZhcl92YWxfbGVuICsgMSk7CiAgICAgICAgaWYgKFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxEZXNjciA9PSBOVUxMKSB7CiAgICAgICAgICAgIGV4aXQoMSk7CiAgICAgICAgfQogICAgICAgIG1lbWNweShTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsRGVzY3IsIHZhcl92YWwsIHZhcl92YWxfbGVuICsgMSk7CiAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bERlc2NyW3Zhcl92YWxfbGVuXSA9ICdcMCc7CiAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bERlc2NyTGVuID0gdmFyX3ZhbF9sZW47CgogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIFVORE86CiAgICAgICAgLyoKICAgICAgICAgKiBCYWNrIG91dCBhbnkgY2hhbmdlcyBtYWRlIGluIHRoZSBBQ1RJT04gY2FzZSAKICAgICAgICAgKi8KICAgICAgICBTTk1QX0ZSRUUoU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bERlc2NyKTsKICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsRGVzY3IgPSBOVUxMOwogICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxEZXNjciA9IHRtcHZhcjsKICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsRGVzY3JMZW4gPSB0bXBsZW47CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgQ09NTUlUOgogICAgICAgIC8qCiAgICAgICAgICogVGhpbmdzIGFyZSB3b3JraW5nIHdlbGwsIHNvIGl0J3Mgbm93IHNhZmUgdG8gbWFrZSB0aGUgY2hhbmdlCiAgICAgICAgICogcGVybWFuZW50bHkuICBNYWtlIHN1cmUgdGhhdCBhbnl0aGluZyBkb25lIGhlcmUgY2FuJ3QgZmFpbCEgCiAgICAgICAgICovCiAgICAgICAgU05NUF9GUkVFKHRtcHZhcik7CiAgICAgICAgdG1wdmFyID0gTlVMTDsKICAgICAgICBicmVhazsKICAgIH0KICAgIHJldHVybiBTTk1QX0VSUl9OT0VSUk9SOwp9CgoKCgoKaW50CndyaXRlX3RyYWNlUm91dGVDdGxNYXhSb3dzKGludCBhY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHZhcl92YWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciB2YXJfdmFsX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB2YXJfdmFsX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogc3RhdFAsIG9pZCAqIG5hbWUsIHNpemVfdCBuYW1lX2xlbikKewogICAgc3RhdGljIHNpemVfdCAgIHRtcHZhcjsKICAgIHN0cnVjdCB0cmFjZVJvdXRlQ3RsVGFibGVfZGF0YSAqU3RvcmFnZVRtcCA9IE5VTEw7CiAgICBzaXplX3QgICAgICAgICAgbmV3bGVuID0KICAgICAgICBuYW1lX2xlbiAtCiAgICAgICAgKHNpemVvZih0cmFjZVJvdXRlQ3RsVGFibGVfdmFyaWFibGVzX29pZCkgLyBzaXplb2Yob2lkKSArIDMgLSAxKTsKCiAgICBpZiAoKFN0b3JhZ2VUbXAgPQogICAgICAgICBoZWFkZXJfY29tcGxleCh0cmFjZVJvdXRlQ3RsVGFibGVTdG9yYWdlLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAmbmFtZVtzaXplb2YodHJhY2VSb3V0ZUN0bFRhYmxlX3ZhcmlhYmxlc19vaWQpIC8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9pZCkgKyAzIC0gMV0sICZuZXdsZW4sIDEsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKSA9PSBOVUxMKQogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1NVQ0hOQU1FOyAgICAgLyogcmVtb3ZlIGlmIHlvdSBzdXBwb3J0IGNyZWF0aW9uIGhlcmUgKi8KCiAgICBpZiAoU3RvcmFnZVRtcCAmJiBTdG9yYWdlVG1wLT5zdG9yYWdlVHlwZSA9PSBTVF9SRUFET05MWSkgewogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1RXUklUQUJMRTsKICAgIH0KCiAgICBpZiAoU3RvcmFnZVRtcCAmJiBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsUm93U3RhdHVzID09IFJTX0FDVElWRSkgewogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1RXUklUQUJMRTsKICAgIH0KICAgIHN3aXRjaCAoYWN0aW9uKSB7CiAgICBjYXNlIFJFU0VSVkUxOgogICAgICAgIGlmICh2YXJfdmFsX3R5cGUgIT0gQVNOX1VOU0lHTkVEKSB7CiAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsCiAgICAgICAgICAgICAgICAgICAgICJ3cml0ZSB0byB0cmFjZVJvdXRlQ3RsRFNGaWVsZCBub3QgQVNOX1VOU0lHTkVEXG4iKTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX1dST05HVFlQRTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgUkVTRVJWRTI6CiAgICAgICAgLyoKICAgICAgICAgKiBtZW1vcnkgcmVzZXZlcmF0aW9uLCBmaW5hbCBwcmVwYXJhdGlvbi4uLiAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBGUkVFOgogICAgICAgIC8qCiAgICAgICAgICogUmVsZWFzZSBhbnkgcmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIGFsbG9jYXRlZCAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBBQ1RJT046CiAgICAgICAgLyoKICAgICAgICAgKiBUaGUgdmFyaWFibGUgaGFzIGJlZW4gc3RvcmVkIGluIG9iamlkIGZvcgogICAgICAgICAqIHlvdSB0byB1c2UsIGFuZCB5b3UgaGF2ZSBqdXN0IGJlZW4gYXNrZWQgdG8gZG8gc29tZXRoaW5nIHdpdGgKICAgICAgICAgKiBpdC4gIE5vdGUgdGhhdCBhbnl0aGluZyBkb25lIGhlcmUgbXVzdCBiZSByZXZlcnNhYmxlIGluIHRoZSBVTkRPIGNhc2UgCiAgICAgICAgICovCiAgICAgICAgdG1wdmFyID0gU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bE1heFJvd3M7CiAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bE1heFJvd3MgPSAqKChsb25nICopIHZhcl92YWwpOwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIFVORE86CiAgICAgICAgLyoKICAgICAgICAgKiBCYWNrIG91dCBhbnkgY2hhbmdlcyBtYWRlIGluIHRoZSBBQ1RJT04gY2FzZSAKICAgICAgICAgKi8KICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsTWF4Um93cyA9IHRtcHZhcjsKICAgICAgICBicmVhazsKCgogICAgY2FzZSBDT01NSVQ6CiAgICAgICAgLyoKICAgICAgICAgKiBUaGluZ3MgYXJlIHdvcmtpbmcgd2VsbCwgc28gaXQncyBub3cgc2FmZSB0byBtYWtlIHRoZSBjaGFuZ2UKICAgICAgICAgKiBwZXJtYW5lbnRseS4gIE1ha2Ugc3VyZSB0aGF0IGFueXRoaW5nIGRvbmUgaGVyZSBjYW4ndCBmYWlsISAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKICAgIH0KICAgIHJldHVybiBTTk1QX0VSUl9OT0VSUk9SOwp9CgppbnQKd3JpdGVfdHJhY2VSb3V0ZUN0bFRyYXBHZW5lcmF0aW9uKGludCBhY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiB2YXJfdmFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyIHZhcl92YWxfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB2YXJfdmFsX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHN0YXRQLCBvaWQgKiBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG5hbWVfbGVuKQp7CiAgICBzdGF0aWMgY2hhciAgICAqdG1wdmFyOwogICAgc3RhdGljIHNpemVfdCAgIHRtcGxlbjsKICAgIHN0cnVjdCB0cmFjZVJvdXRlQ3RsVGFibGVfZGF0YSAqU3RvcmFnZVRtcCA9IE5VTEw7CiAgICBzaXplX3QgICAgICAgICAgbmV3bGVuID0KICAgICAgICBuYW1lX2xlbiAtCiAgICAgICAgKHNpemVvZih0cmFjZVJvdXRlQ3RsVGFibGVfdmFyaWFibGVzX29pZCkgLyBzaXplb2Yob2lkKSArIDMgLSAxKTsKICAgIGlmICgoU3RvcmFnZVRtcCA9CiAgICAgICAgIGhlYWRlcl9jb21wbGV4KHRyYWNlUm91dGVDdGxUYWJsZVN0b3JhZ2UsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICZuYW1lW3NpemVvZih0cmFjZVJvdXRlQ3RsVGFibGVfdmFyaWFibGVzX29pZCkgLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yob2lkKSArIDMgLSAxXSwgJm5ld2xlbiwgMSwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpID09IE5VTEwpCiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PU1VDSE5BTUU7ICAgICAvKiByZW1vdmUgaWYgeW91IHN1cHBvcnQgY3JlYXRpb24gaGVyZSAqLwoKICAgIGlmIChTdG9yYWdlVG1wICYmIFN0b3JhZ2VUbXAtPnN0b3JhZ2VUeXBlID09IFNUX1JFQURPTkxZKSB7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PVFdSSVRBQkxFOwogICAgfQoKICAgIGlmIChTdG9yYWdlVG1wICYmIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxSb3dTdGF0dXMgPT0gUlNfQUNUSVZFKSB7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PVFdSSVRBQkxFOwogICAgfQoKICAgIHN3aXRjaCAoYWN0aW9uKSB7CiAgICBjYXNlIFJFU0VSVkUxOgogICAgICAgIGlmICh2YXJfdmFsX3R5cGUgIT0gQVNOX09DVEVUX1NUUikgewogICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLAogICAgICAgICAgICAgICAgICAgICAid3JpdGUgdG8gdHJhY2VSb3V0ZUN0bFRhcmdldEFkZHJlc3Mgbm90IEFTTl9PQ1RFVF9TVFJcbiIpOwogICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfV1JPTkdUWVBFOwogICAgICAgIH0KICAgICAgICBicmVhazsKCgogICAgY2FzZSBSRVNFUlZFMjoKICAgICAgICAvKgogICAgICAgICAqIG1lbW9yeSByZXNldmVyYXRpb24sIGZpbmFsIHByZXBhcmF0aW9uLi4uIAogICAgICAgICAqLwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIEZSRUU6CiAgICAgICAgLyoKICAgICAgICAgKiBSZWxlYXNlIGFueSByZXNvdXJjZXMgdGhhdCBoYXZlIGJlZW4gYWxsb2NhdGVkIAogICAgICAgICAqLwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIEFDVElPTjoKICAgICAgICAvKgogICAgICAgICAqIFRoZSB2YXJpYWJsZSBoYXMgYmVlbiBzdG9yZWQgaW4gbG9uZ19yZXQgZm9yCiAgICAgICAgICogeW91IHRvIHVzZSwgYW5kIHlvdSBoYXZlIGp1c3QgYmVlbiBhc2tlZCB0byBkbyBzb21ldGhpbmcgd2l0aAogICAgICAgICAqIGl0LiAgTm90ZSB0aGF0IGFueXRoaW5nIGRvbmUgaGVyZSBtdXN0IGJlIHJldmVyc2FibGUgaW4gdGhlIFVORE8gY2FzZSAKICAgICAgICAgKi8KICAgICAgICB0bXB2YXIgPSBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVHJhcEdlbmVyYXRpb247CiAgICAgICAgdG1wbGVuID0gU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFRyYXBHZW5lcmF0aW9uTGVuOwogICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUcmFwR2VuZXJhdGlvbiA9CiAgICAgICAgICAgIChjaGFyICopIG1hbGxvYyh2YXJfdmFsX2xlbiArIDEpOwogICAgICAgIGlmIChTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVHJhcEdlbmVyYXRpb24gPT0gTlVMTCkgewogICAgICAgICAgICBleGl0KDEpOwogICAgICAgIH0KCiAgICAgICAgbWVtY3B5KFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUcmFwR2VuZXJhdGlvbiwgdmFyX3ZhbCwKICAgICAgICAgICAgICAgdmFyX3ZhbF9sZW4gKyAxKTsKICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVHJhcEdlbmVyYXRpb25bdmFyX3ZhbF9sZW5dID0gJ1wwJzsKICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVHJhcEdlbmVyYXRpb25MZW4gPSB2YXJfdmFsX2xlbjsKCiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgVU5ETzoKICAgICAgICAvKgogICAgICAgICAqIEJhY2sgb3V0IGFueSBjaGFuZ2VzIG1hZGUgaW4gdGhlIEFDVElPTiBjYXNlIAogICAgICAgICAqLwogICAgICAgIFNOTVBfRlJFRShTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVHJhcEdlbmVyYXRpb24pOwogICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUcmFwR2VuZXJhdGlvbiA9IE5VTEw7CiAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFRyYXBHZW5lcmF0aW9uID0gdG1wdmFyOwogICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUcmFwR2VuZXJhdGlvbkxlbiA9IHRtcGxlbjsKICAgICAgICBicmVhazsKCgogICAgY2FzZSBDT01NSVQ6CiAgICAgICAgLyoKICAgICAgICAgKiBUaGluZ3MgYXJlIHdvcmtpbmcgd2VsbCwgc28gaXQncyBub3cgc2FmZSB0byBtYWtlIHRoZSBjaGFuZ2UKICAgICAgICAgKiBwZXJtYW5lbnRseS4gIE1ha2Ugc3VyZSB0aGF0IGFueXRoaW5nIGRvbmUgaGVyZSBjYW4ndCBmYWlsISAKICAgICAgICAgKi8KICAgICAgICBTTk1QX0ZSRUUodG1wdmFyKTsKICAgICAgICB0bXB2YXIgPSBOVUxMOwogICAgICAgIGJyZWFrOwogICAgfQogICAgcmV0dXJuIFNOTVBfRVJSX05PRVJST1I7Cn0KCmludAp3cml0ZV90cmFjZVJvdXRlQ3RsQ3JlYXRlSG9wc0VudHJpZXMoaW50IGFjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHZhcl92YWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgdmFyX3ZhbF90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHZhcl92YWxfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogc3RhdFAsIG9pZCAqIG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbmFtZV9sZW4pCnsKICAgIHN0YXRpYyBzaXplX3QgICB0bXB2YXI7CiAgICBzdHJ1Y3QgdHJhY2VSb3V0ZUN0bFRhYmxlX2RhdGEgKlN0b3JhZ2VUbXAgPSBOVUxMOwogICAgc2l6ZV90ICAgICAgICAgIG5ld2xlbiA9CiAgICAgICAgbmFtZV9sZW4gLQogICAgICAgIChzaXplb2YodHJhY2VSb3V0ZUN0bFRhYmxlX3ZhcmlhYmxlc19vaWQpIC8gc2l6ZW9mKG9pZCkgKyAzIC0gMSk7CgogICAgaWYgKChTdG9yYWdlVG1wID0KICAgICAgICAgaGVhZGVyX2NvbXBsZXgodHJhY2VSb3V0ZUN0bFRhYmxlU3RvcmFnZSwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgJm5hbWVbc2l6ZW9mKHRyYWNlUm91dGVDdGxUYWJsZV92YXJpYWJsZXNfb2lkKSAvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihvaWQpICsgMyAtIDFdLCAmbmV3bGVuLCAxLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkgPT0gTlVMTCkKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9TVUNITkFNRTsgICAgIC8qIHJlbW92ZSBpZiB5b3Ugc3VwcG9ydCBjcmVhdGlvbiBoZXJlICovCgogICAgaWYgKFN0b3JhZ2VUbXAgJiYgU3RvcmFnZVRtcC0+c3RvcmFnZVR5cGUgPT0gU1RfUkVBRE9OTFkpIHsKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9UV1JJVEFCTEU7CiAgICB9CgogICAgaWYgKFN0b3JhZ2VUbXAgJiYgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFJvd1N0YXR1cyA9PSBSU19BQ1RJVkUpIHsKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9UV1JJVEFCTEU7CiAgICB9CiAgICBzd2l0Y2ggKGFjdGlvbikgewogICAgY2FzZSBSRVNFUlZFMToKICAgICAgICBpZiAodmFyX3ZhbF90eXBlICE9IEFTTl9JTlRFR0VSKSB7CiAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsCiAgICAgICAgICAgICAgICAgICAgICJ3cml0ZSB0byB0cmFjZVJvdXRlQ3RsRFNGaWVsZCBub3QgQVNOX0lOVEVHRVJcbiIpOwogICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfV1JPTkdUWVBFOwogICAgICAgIH0KICAgICAgICBicmVhazsKCgogICAgY2FzZSBSRVNFUlZFMjoKICAgICAgICAvKgogICAgICAgICAqIG1lbW9yeSByZXNldmVyYXRpb24sIGZpbmFsIHByZXBhcmF0aW9uLi4uIAogICAgICAgICAqLwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIEZSRUU6CiAgICAgICAgLyoKICAgICAgICAgKiBSZWxlYXNlIGFueSByZXNvdXJjZXMgdGhhdCBoYXZlIGJlZW4gYWxsb2NhdGVkIAogICAgICAgICAqLwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIEFDVElPTjoKICAgICAgICAvKgogICAgICAgICAqIFRoZSB2YXJpYWJsZSBoYXMgYmVlbiBzdG9yZWQgaW4gb2JqaWQgZm9yCiAgICAgICAgICogeW91IHRvIHVzZSwgYW5kIHlvdSBoYXZlIGp1c3QgYmVlbiBhc2tlZCB0byBkbyBzb21ldGhpbmcgd2l0aAogICAgICAgICAqIGl0LiAgTm90ZSB0aGF0IGFueXRoaW5nIGRvbmUgaGVyZSBtdXN0IGJlIHJldmVyc2FibGUgaW4gdGhlIFVORE8gY2FzZSAKICAgICAgICAgKi8KICAgICAgICB0bXB2YXIgPSBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsQ3JlYXRlSG9wc0VudHJpZXM7CiAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bENyZWF0ZUhvcHNFbnRyaWVzID0gKigobG9uZyAqKSB2YXJfdmFsKTsKICAgICAgICBicmVhazsKCgogICAgY2FzZSBVTkRPOgogICAgICAgIC8qCiAgICAgICAgICogQmFjayBvdXQgYW55IGNoYW5nZXMgbWFkZSBpbiB0aGUgQUNUSU9OIGNhc2UgCiAgICAgICAgICovCiAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bENyZWF0ZUhvcHNFbnRyaWVzID0gdG1wdmFyOwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIENPTU1JVDoKICAgICAgICAvKgogICAgICAgICAqIFRoaW5ncyBhcmUgd29ya2luZyB3ZWxsLCBzbyBpdCdzIG5vdyBzYWZlIHRvIG1ha2UgdGhlIGNoYW5nZQogICAgICAgICAqIHBlcm1hbmVudGx5LiAgTWFrZSBzdXJlIHRoYXQgYW55dGhpbmcgZG9uZSBoZXJlIGNhbid0IGZhaWwhIAogICAgICAgICAqLwogICAgICAgIGJyZWFrOwogICAgfQogICAgcmV0dXJuIFNOTVBfRVJSX05PRVJST1I7Cn0KCmludAp3cml0ZV90cmFjZVJvdXRlQ3RsVHlwZShpbnQgYWN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiB2YXJfdmFsLAogICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgdmFyX3ZhbF90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgdmFyX3ZhbF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHN0YXRQLCBvaWQgKiBuYW1lLCBzaXplX3QgbmFtZV9sZW4pCnsKICAgIHN0YXRpYyBvaWQgICAgICp0bXB2YXI7CiAgICBzdGF0aWMgc2l6ZV90ICAgdG1wbGVuOwogICAgc3RydWN0IHRyYWNlUm91dGVDdGxUYWJsZV9kYXRhICpTdG9yYWdlVG1wID0gTlVMTDsKICAgIHNpemVfdCAgICAgICAgICBuZXdsZW4gPQogICAgICAgIG5hbWVfbGVuIC0KICAgICAgICAoc2l6ZW9mKHRyYWNlUm91dGVDdGxUYWJsZV92YXJpYWJsZXNfb2lkKSAvIHNpemVvZihvaWQpICsgMyAtIDEpOwoKICAgIGlmICgoU3RvcmFnZVRtcCA9CiAgICAgICAgIGhlYWRlcl9jb21wbGV4KHRyYWNlUm91dGVDdGxUYWJsZVN0b3JhZ2UsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICZuYW1lW3NpemVvZih0cmFjZVJvdXRlQ3RsVGFibGVfdmFyaWFibGVzX29pZCkgLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yob2lkKSArIDMgLSAxXSwgJm5ld2xlbiwgMSwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpID09IE5VTEwpCiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PU1VDSE5BTUU7ICAgICAvKiByZW1vdmUgaWYgeW91IHN1cHBvcnQgY3JlYXRpb24gaGVyZSAqLwoKICAgIGlmIChTdG9yYWdlVG1wICYmIFN0b3JhZ2VUbXAtPnN0b3JhZ2VUeXBlID09IFNUX1JFQURPTkxZKSB7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PVFdSSVRBQkxFOwogICAgfQoKICAgIGlmIChTdG9yYWdlVG1wICYmIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxSb3dTdGF0dXMgPT0gUlNfQUNUSVZFKSB7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PVFdSSVRBQkxFOwogICAgfQoKICAgIHN3aXRjaCAoYWN0aW9uKSB7CiAgICBjYXNlIFJFU0VSVkUxOgogICAgICAgIGlmICh2YXJfdmFsX3R5cGUgIT0gQVNOX09CSkVDVF9JRCkgewogICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLAogICAgICAgICAgICAgICAgICAgICAid3JpdGUgdG8gdHJhY2VSb3V0ZUN0bFR5cGUgbm90IEFTTl9PQkpFQ1RfSURcbiIpOwogICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfV1JPTkdUWVBFOwogICAgICAgIH0KICAgICAgICBicmVhazsKCgogICAgY2FzZSBSRVNFUlZFMjoKICAgICAgICAvKgogICAgICAgICAqIG1lbW9yeSByZXNldmVyYXRpb24sIGZpbmFsIHByZXBhcmF0aW9uLi4uIAogICAgICAgICAqLwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIEZSRUU6CiAgICAgICAgLyoKICAgICAgICAgKiBSZWxlYXNlIGFueSByZXNvdXJjZXMgdGhhdCBoYXZlIGJlZW4gYWxsb2NhdGVkIAogICAgICAgICAqLwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIEFDVElPTjoKICAgICAgICAvKgogICAgICAgICAqIFRoZSB2YXJpYWJsZSBoYXMgYmVlbiBzdG9yZWQgaW4gbG9uZ19yZXQgZm9yCiAgICAgICAgICogeW91IHRvIHVzZSwgYW5kIHlvdSBoYXZlIGp1c3QgYmVlbiBhc2tlZCB0byBkbyBzb21ldGhpbmcgd2l0aAogICAgICAgICAqIGl0LiAgTm90ZSB0aGF0IGFueXRoaW5nIGRvbmUgaGVyZSBtdXN0IGJlIHJldmVyc2FibGUgaW4gdGhlIFVORE8gY2FzZSAKICAgICAgICAgKi8KICAgICAgICB0bXB2YXIgPSBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVHlwZTsKICAgICAgICB0bXBsZW4gPSBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVHlwZUxlbjsKCiAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFR5cGUgPSAob2lkICopIG1hbGxvYyh2YXJfdmFsX2xlbik7CiAgICAgICAgaWYgKFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUeXBlID09IE5VTEwpIHsKICAgICAgICAgICAgZXhpdCgxKTsKICAgICAgICB9CiAgICAgICAgbWVtY3B5KFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUeXBlLCB2YXJfdmFsLCB2YXJfdmFsX2xlbik7CiAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFR5cGVMZW4gPSB2YXJfdmFsX2xlbiAvIHNpemVvZihvaWQpOwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIFVORE86CiAgICAgICAgLyoKICAgICAgICAgKiBCYWNrIG91dCBhbnkgY2hhbmdlcyBtYWRlIGluIHRoZSBBQ1RJT04gY2FzZSAKICAgICAgICAgKi8KICAgICAgICBTTk1QX0ZSRUUoU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFR5cGUpOwogICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUeXBlID0gTlVMTDsKICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVHlwZSA9IHRtcHZhcjsKICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVHlwZUxlbiA9IHRtcGxlbjsKICAgICAgICBicmVhazsKCgogICAgY2FzZSBDT01NSVQ6CiAgICAgICAgLyoKICAgICAgICAgKiBUaGluZ3MgYXJlIHdvcmtpbmcgd2VsbCwgc28gaXQncyBub3cgc2FmZSB0byBtYWtlIHRoZSBjaGFuZ2UKICAgICAgICAgKiBwZXJtYW5lbnRseS4gIE1ha2Ugc3VyZSB0aGF0IGFueXRoaW5nIGRvbmUgaGVyZSBjYW4ndCBmYWlsISAKICAgICAgICAgKi8KICAgICAgICBTTk1QX0ZSRUUodG1wdmFyKTsKICAgICAgICB0bXB2YXIgPSBOVUxMOwogICAgICAgIGJyZWFrOwogICAgfQogICAgcmV0dXJuIFNOTVBfRVJSX05PRVJST1I7Cn0KCmludAp3cml0ZV90cmFjZVJvdXRlQ3RsUm93U3RhdHVzKGludCBhY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogdmFyX3ZhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgdmFyX3ZhbF90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB2YXJfdmFsX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiBzdGF0UCwgb2lkICogbmFtZSwgc2l6ZV90IG5hbWVfbGVuKQp7CiAgICBzdHJ1Y3QgdHJhY2VSb3V0ZUN0bFRhYmxlX2RhdGEgKlN0b3JhZ2VUbXAgPSBOVUxMOwogICAgc3RhdGljIHN0cnVjdCB0cmFjZVJvdXRlQ3RsVGFibGVfZGF0YSAqU3RvcmFnZU5ldyA9IE5VTEw7CiAgICBzdGF0aWMgc3RydWN0IHRyYWNlUm91dGVDdGxUYWJsZV9kYXRhICpTdG9yYWdlRGVsID0gTlVMTDsKICAgIHNpemVfdCAgICAgICAgICBuZXdsZW4gPQogICAgICAgIG5hbWVfbGVuIC0KICAgICAgICAoc2l6ZW9mKHRyYWNlUm91dGVDdGxUYWJsZV92YXJpYWJsZXNfb2lkKSAvIHNpemVvZihvaWQpICsgMyAtIDEpOwogICAgc3RhdGljIGludCAgICAgIG9sZF92YWx1ZTsKICAgIGludCAgICAgICAgICAgICBzZXRfdmFsdWU7CiAgICBzdGF0aWMgbmV0c25tcF92YXJpYWJsZV9saXN0ICp2YXJzID0gTlVMTDsKICAgIHN0cnVjdCBoZWFkZXJfY29tcGxleF9pbmRleCAqaGNpcHRyID0gTlVMTDsKCiAgICBTdG9yYWdlVG1wID0KICAgICAgICBoZWFkZXJfY29tcGxleCh0cmFjZVJvdXRlQ3RsVGFibGVTdG9yYWdlLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICZuYW1lW3NpemVvZih0cmFjZVJvdXRlQ3RsVGFibGVfdmFyaWFibGVzX29pZCkgLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihvaWQpICsgMyAtIDFdLCAmbmV3bGVuLCAxLCBOVUxMLCBOVUxMKTsKCiAgICBpZiAodmFyX3ZhbF90eXBlICE9IEFTTl9JTlRFR0VSIHx8IHZhcl92YWwgPT0gTlVMTCkgewogICAgICAgIHNubXBfbG9nKExPR19FUlIsCiAgICAgICAgICAgICAgICAgIndyaXRlIHRvIHRyYWNlUm91dGVDdGxSb3dTdGF0dXMgbm90IEFTTl9JTlRFR0VSXG4iKTsKICAgICAgICByZXR1cm4gU05NUF9FUlJfV1JPTkdUWVBFOwogICAgfQogICAgaWYgKFN0b3JhZ2VUbXAgJiYgU3RvcmFnZVRtcC0+c3RvcmFnZVR5cGUgPT0gU1RfUkVBRE9OTFkpIHsKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9UV1JJVEFCTEU7CiAgICB9CgogICAgc2V0X3ZhbHVlID0gKigobG9uZyAqKSB2YXJfdmFsKTsKCgogICAgLyoKICAgICAqIGNoZWNrIGxlZ2FsIHJhbmdlLCBhbmQgbm90UmVhZHkgaXMgcmVzZXJ2ZWQgZm9yIHVzLCBub3QgYSB1c2VyIAogICAgICovCiAgICBpZiAoc2V0X3ZhbHVlIDwgMSB8fCBzZXRfdmFsdWUgPiA2IHx8IHNldF92YWx1ZSA9PSBSU19OT1RSRUFEWSkKICAgICAgICByZXR1cm4gU05NUF9FUlJfSU5DT05TSVNURU5UVkFMVUU7CgoKICAgIHN3aXRjaCAoYWN0aW9uKSB7CiAgICBjYXNlIFJFU0VSVkUxOgogICAgICAgIC8qCiAgICAgICAgICogc3RhZ2Ugb25lOiB0ZXN0IHZhbGlkaXR5IAogICAgICAgICAqLwogICAgICAgIGlmIChTdG9yYWdlVG1wID09IE5VTEwpIHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogY3JlYXRlIHRoZSByb3cgbm93PyAKICAgICAgICAgICAgICovCgogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBkaXRjaCBpbGxlZ2FsIHZhbHVlcyBub3cgCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBpZiAoc2V0X3ZhbHVlID09IFJTX0FDVElWRSB8fCBzZXRfdmFsdWUgPT0gUlNfTk9USU5TRVJWSUNFKSB7CgogICAgICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX0lOQ09OU0lTVEVOVFZBTFVFOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBkZXN0cm95aW5nIGEgbm9uLWV4aXN0ZW50IHJvdyBpcyBhY3R1YWxseSBsZWdhbCAKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGlmIChzZXRfdmFsdWUgPT0gUlNfREVTVFJPWSkgewoKICAgICAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9OT0VSUk9SOwogICAgICAgICAgICB9CgoKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogaWxsZWdhbCBjcmVhdGlvbiB2YWx1ZXMgCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBpZiAoc2V0X3ZhbHVlID09IFJTX0FDVElWRSB8fCBzZXRfdmFsdWUgPT0gUlNfTk9USU5TRVJWSUNFKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfSU5DT05TSVNURU5UVkFMVUU7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiByb3cgZXhpc3RzLiAgQ2hlY2sgZm9yIGEgdmFsaWQgc3RhdGUgY2hhbmdlIAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgaWYgKHNldF92YWx1ZSA9PSBSU19DUkVBVEVBTkRHTwogICAgICAgICAgICAgICAgfHwgc2V0X3ZhbHVlID09IFJTX0NSRUFURUFORFdBSVQpIHsKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiBjYW4ndCBjcmVhdGUgYSByb3cgdGhhdCBleGlzdHMgCiAgICAgICAgICAgICAgICAgKi8KCiAgICAgICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfSU5DT05TSVNURU5UVkFMVUU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIFhYWDogaW50ZXJhY3Rpb24gd2l0aCByb3cgc3RvcmFnZSB0eXBlIG5lZWRlZCAKICAgICAgICAgICAgICovCgogICAgICAgICAgICBpZiAoU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFJvd1N0YXR1cyA9PSBSU19BQ1RJVkUgJiYKICAgICAgICAgICAgICAgIHNldF92YWx1ZSAhPSBSU19ERVNUUk9ZKSB7CiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogIk9uY2UgbWFkZSBhY3RpdmUgYW4gZW50cnkgbWF5IG5vdCBiZSBtb2RpZmllZCBleGNlcHQgdG8gCiAgICAgICAgICAgICAgICAgKiBkZWxldGUgaXQuIiAgWFhYOiBkb2Vzbid0IHRoaXMgaW4gZmFjdCBhcHBseSB0byBBTEwKICAgICAgICAgICAgICAgICAqIGNvbHVtbnMgb2YgdGhlIHRhYmxlIGFuZCBub3QganVzdCB0aGlzIG9uZT8gIAogICAgICAgICAgICAgICAgICovCgogICAgICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX0lOQ09OU0lTVEVOVFZBTFVFOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChTdG9yYWdlVG1wLT5zdG9yYWdlVHlwZSAhPSBTVF9OT05WT0xBVElMRSkgewoKICAgICAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1RXUklUQUJMRTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgYnJlYWs7CgoKCgogICAgY2FzZSBSRVNFUlZFMjoKICAgICAgICAvKgogICAgICAgICAqIG1lbW9yeSByZXNldmVyYXRpb24sIGZpbmFsIHByZXBhcmF0aW9uLi4uIAogICAgICAgICAqLwogICAgICAgIGlmIChTdG9yYWdlVG1wID09IE5VTEwpIHsKCiAgICAgICAgICAgIGlmIChzZXRfdmFsdWUgPT0gUlNfREVTVFJPWSkgewogICAgICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PRVJST1I7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogY3JlYXRpb24gCiAgICAgICAgICAgICAqLwoKCiAgICAgICAgICAgIHNubXBfdmFybGlzdF9hZGRfdmFyaWFibGUoJnZhcnMsIE5VTEwsIDAsIEFTTl9PQ1RFVF9TVFIsIE5VTEwsIDApOyAgLyogdHJhY2VSb3V0ZUN0bE93bmVySW5kZXggKi8KICAgICAgICAgICAgc25tcF92YXJsaXN0X2FkZF92YXJpYWJsZSgmdmFycywgTlVMTCwgMCwgQVNOX09DVEVUX1NUUiwgTlVMTCwgMCk7ICAvKiB0cmFjZVJvdXRlQ3RsVGVzdE5hbWUgKi8KCiAgICAgICAgICAgIGlmIChoZWFkZXJfY29tcGxleF9wYXJzZV9vaWQKICAgICAgICAgICAgICAgICgmCiAgICAgICAgICAgICAgICAgKG5hbWUKICAgICAgICAgICAgICAgICAgW3NpemVvZih0cmFjZVJvdXRlQ3RsVGFibGVfdmFyaWFibGVzX29pZCkgLyBzaXplb2Yob2lkKSArCiAgICAgICAgICAgICAgICAgICAyXSksIG5ld2xlbiwgdmFycykgIT0gU05NUEVSUl9TVUNDRVNTKSB7CiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogWFhYOiBmcmVlLCB6ZXJvIHZhcnMgCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9JTkNPTlNJU1RFTlROQU1FOwogICAgICAgICAgICB9CgoKICAgICAgICAgICAgU3RvcmFnZU5ldyA9IGNyZWF0ZV90cmFjZVJvdXRlQ3RsVGFibGVfZGF0YSgpOwogICAgICAgICAgICBpZiAodmFycy0+dmFsX2xlbiA8PSAzMikgewogICAgICAgICAgICAgICAgU3RvcmFnZU5ldy0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXggPQogICAgICAgICAgICAgICAgICAgIG1hbGxvYyh2YXJzLT52YWxfbGVuICsgMSk7CiAgICAgICAgICAgICAgICBtZW1jcHkoU3RvcmFnZU5ldy0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgdmFycy0+dmFsLnN0cmluZywgdmFycy0+dmFsX2xlbik7CiAgICAgICAgICAgICAgICBTdG9yYWdlTmV3LT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleFt2YXJzLT52YWxfbGVuXSA9ICdcMCc7CiAgICAgICAgICAgICAgICBTdG9yYWdlTmV3LT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleExlbiA9IHZhcnMtPnZhbF9sZW47CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBTdG9yYWdlTmV3LT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleCA9IG1hbGxvYygzMyk7CiAgICAgICAgICAgICAgICBtZW1jcHkoU3RvcmFnZU5ldy0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgdmFycy0+dmFsLnN0cmluZywgMzIpOwogICAgICAgICAgICAgICAgU3RvcmFnZU5ldy0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXhbMzJdID0gJ1wwJzsKICAgICAgICAgICAgICAgIFN0b3JhZ2VOZXctPnRyYWNlUm91dGVDdGxPd25lckluZGV4TGVuID0gMzI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhcnMgPSB2YXJzLT5uZXh0X3ZhcmlhYmxlOwoKICAgICAgICAgICAgaWYgKHZhcnMtPnZhbF9sZW4gPD0gMzIpIHsKICAgICAgICAgICAgICAgIFN0b3JhZ2VOZXctPnRyYWNlUm91dGVDdGxUZXN0TmFtZSA9CiAgICAgICAgICAgICAgICAgICAgbWFsbG9jKHZhcnMtPnZhbF9sZW4gKyAxKTsKICAgICAgICAgICAgICAgIG1lbWNweShTdG9yYWdlTmV3LT50cmFjZVJvdXRlQ3RsVGVzdE5hbWUsIHZhcnMtPnZhbC5zdHJpbmcsCiAgICAgICAgICAgICAgICAgICAgICAgdmFycy0+dmFsX2xlbik7CiAgICAgICAgICAgICAgICBTdG9yYWdlTmV3LT50cmFjZVJvdXRlQ3RsVGVzdE5hbWVbdmFycy0+dmFsX2xlbl0gPSAnXDAnOwogICAgICAgICAgICAgICAgU3RvcmFnZU5ldy0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lTGVuID0gdmFycy0+dmFsX2xlbjsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIFN0b3JhZ2VOZXctPnRyYWNlUm91dGVDdGxUZXN0TmFtZSA9IG1hbGxvYygzMyk7CiAgICAgICAgICAgICAgICBtZW1jcHkoU3RvcmFnZU5ldy0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lLCB2YXJzLT52YWwuc3RyaW5nLAogICAgICAgICAgICAgICAgICAgICAgIDMyKTsKICAgICAgICAgICAgICAgIFN0b3JhZ2VOZXctPnRyYWNlUm91dGVDdGxUZXN0TmFtZVszMl0gPSAnXDAnOwogICAgICAgICAgICAgICAgU3RvcmFnZU5ldy0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lTGVuID0gMzI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFycyA9IHZhcnMtPm5leHRfdmFyaWFibGU7CgogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBYWFg6IGZpbGwgaW4gZGVmYXVsdCByb3cgdmFsdWVzIGhlcmUgaW50byBTdG9yYWdlTmV3IAogICAgICAgICAgICAgKi8KCiAgICAgICAgICAgIFN0b3JhZ2VOZXctPnRyYWNlUm91dGVDdGxSb3dTdGF0dXMgPSBzZXRfdmFsdWU7CgoKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogWFhYOiBmcmVlLCB6ZXJvIHZhcnMsIG5vIGxvbmdlciBuZWVkZWQ/IAogICAgICAgICAgICAgKi8KICAgICAgICB9CiAgICAgICAgc25tcF9mcmVlX3ZhcmJpbmQodmFycyk7CiAgICAgICAgdmFycyA9IE5VTEw7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBGUkVFOgogICAgICAgIC8qCiAgICAgICAgICogWFhYOiBmcmVlLCB6ZXJvIHZhcnMgCiAgICAgICAgICovCiAgICAgICAgc25tcF9mcmVlX3ZhcmJpbmQodmFycyk7CiAgICAgICAgdmFycyA9IE5VTEw7CiAgICAgICAgLyoKICAgICAgICAgKiBSZWxlYXNlIGFueSByZXNvdXJjZXMgdGhhdCBoYXZlIGJlZW4gYWxsb2NhdGVkIAogICAgICAgICAqLwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgQUNUSU9OOgogICAgICAgIC8qCiAgICAgICAgICogVGhlIHZhcmlhYmxlIGhhcyBiZWVuIHN0b3JlZCBpbiBzZXRfdmFsdWUgZm9yIHlvdSB0bwogICAgICAgICAqIHVzZSwgYW5kIHlvdSBoYXZlIGp1c3QgYmVlbiBhc2tlZCB0byBkbyBzb21ldGhpbmcgd2l0aAogICAgICAgICAqIGl0LiAgTm90ZSB0aGF0IGFueXRoaW5nIGRvbmUgaGVyZSBtdXN0IGJlIHJldmVyc2FibGUgaW4KICAgICAgICAgKiB0aGUgVU5ETyBjYXNlIAogICAgICAgICAqLwoKICAgICAgICBpZiAoU3RvcmFnZVRtcCA9PSBOVUxMKSB7CiAgICAgICAgICAgIGlmIChzZXRfdmFsdWUgPT0gUlNfREVTVFJPWSkgewogICAgICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PRVJST1I7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogcm93IGNyZWF0aW9uLCBzbyBhZGQgaXQgCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBpZiAoU3RvcmFnZU5ldyAhPSBOVUxMKSB7CiNpZiAxCiAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZUN0bFRhYmxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3cml0ZV90cmFjZVJvdXRlQ3RsUm93U3RhdHVzIGVudGVyaW5nIG5ldz0lZC4uLiAgXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uKSk7CiNlbmRpZgogICAgICAgICAgICAgICAgdHJhY2VSb3V0ZUN0bFRhYmxlX2FkZChTdG9yYWdlTmV3KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogWFhYOiBhY2ssIGFuZCBpZiBpdCBpcyBOVUxMPyAKICAgICAgICAgICAgICovCiAgICAgICAgfSBlbHNlIGlmIChzZXRfdmFsdWUgIT0gUlNfREVTVFJPWSkgewogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBzZXQgdGhlIGZsYWc/IAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgb2xkX3ZhbHVlID0gU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFJvd1N0YXR1czsKICAgICAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFJvd1N0YXR1cyA9ICooKGxvbmcgKikgdmFyX3ZhbCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogZGVzdHJveS4uLiAgZXh0cmFjdCBpdCBmb3Igbm93IAogICAgICAgICAgICAgKi8KCiAgICAgICAgICAgIGhjaXB0ciA9CiAgICAgICAgICAgICAgICBoZWFkZXJfY29tcGxleF9maW5kX2VudHJ5KHRyYWNlUm91dGVDdGxUYWJsZVN0b3JhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0b3JhZ2VUbXApOwogICAgICAgICAgICBTdG9yYWdlRGVsID0KICAgICAgICAgICAgICAgIGhlYWRlcl9jb21wbGV4X2V4dHJhY3RfZW50cnkoJnRyYWNlUm91dGVDdGxUYWJsZVN0b3JhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhjaXB0cik7CiAgICAgICAgICAgIHNubXBfYWxhcm1fdW5yZWdpc3RlcihTdG9yYWdlRGVsLT50aW1lcl9pZCk7CgogICAgICAgICAgICB0cmFjZVJvdXRlUmVzdWx0c1RhYmxlX2RlbChTdG9yYWdlVG1wKTsKICAgICAgICAgICAgdHJhY2VSb3V0ZVByb2JlSGlzdG9yeVRhYmxlX2RlbChTdG9yYWdlVG1wKTsKICAgICAgICAgICAgdHJhY2VSb3V0ZUhvcHNUYWJsZV9kZWwoU3RvcmFnZVRtcCk7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwoKCgoKICAgIGNhc2UgVU5ETzoKICAgICAgICAvKgogICAgICAgICAqIEJhY2sgb3V0IGFueSBjaGFuZ2VzIG1hZGUgaW4gdGhlIEFDVElPTiBjYXNlIAogICAgICAgICAqLwogICAgICAgIGlmIChTdG9yYWdlVG1wID09IE5VTEwpIHsKICAgICAgICAgICAgaWYgKHNldF92YWx1ZSA9PSBSU19ERVNUUk9ZKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9FUlJPUjsKICAgICAgICAgICAgfQogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiByb3cgY3JlYXRpb24sIHNvIHJlbW92ZSBpdCBhZ2FpbiAKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGhjaXB0ciA9CiAgICAgICAgICAgICAgICBoZWFkZXJfY29tcGxleF9maW5kX2VudHJ5KHRyYWNlUm91dGVDdGxUYWJsZVN0b3JhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0b3JhZ2VUbXApOwogICAgICAgICAgICBTdG9yYWdlRGVsID0KICAgICAgICAgICAgICAgIGhlYWRlcl9jb21wbGV4X2V4dHJhY3RfZW50cnkoJnRyYWNlUm91dGVDdGxUYWJsZVN0b3JhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhjaXB0cik7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIFhYWDogZnJlZSBpdCAKICAgICAgICAgICAgICovCiAgICAgICAgfSBlbHNlIGlmIChTdG9yYWdlRGVsICE9IE5VTEwpIHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogcm93IGRlbGV0aW9uLCBzbyBhZGQgaXQgYWdhaW4gCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0cmFjZVJvdXRlQ3RsVGFibGVfYWRkKFN0b3JhZ2VEZWwpOwogICAgICAgICAgICB0cmFjZVJvdXRlUmVzdWx0c1RhYmxlX2FkZChTdG9yYWdlRGVsKTsKICAgICAgICAgICAgdHJhY2VSb3V0ZVByb2JlSGlzdG9yeVRhYmxlX2FkZGFsbChTdG9yYWdlRGVsKTsKICAgICAgICAgICAgdHJhY2VSb3V0ZUhvcHNUYWJsZV9hZGRhbGwoU3RvcmFnZURlbCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFJvd1N0YXR1cyA9IG9sZF92YWx1ZTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CgoKCgogICAgY2FzZSBDT01NSVQ6CiAgICAgICAgLyoKICAgICAgICAgKiBUaGluZ3MgYXJlIHdvcmtpbmcgd2VsbCwgc28gaXQncyBub3cgc2FmZSB0byBtYWtlIHRoZSBjaGFuZ2UKICAgICAgICAgKiBwZXJtYW5lbnRseS4gIE1ha2Ugc3VyZSB0aGF0IGFueXRoaW5nIGRvbmUgaGVyZSBjYW4ndCBmYWlsISAKICAgICAgICAgKi8KICAgICAgICBpZiAoU3RvcmFnZVRtcCA9PSBOVUxMKSB7CiAgICAgICAgICAgIGlmIChzZXRfdmFsdWUgPT0gUlNfREVTVFJPWSkgewogICAgICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PRVJST1I7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKFN0b3JhZ2VEZWwgIT0gTlVMTCkgewogICAgICAgICAgICBmcmVlKFN0b3JhZ2VEZWwtPnRyYWNlUm91dGVDdGxPd25lckluZGV4KTsKICAgICAgICAgICAgU3RvcmFnZURlbC0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXggPSBOVUxMOwogICAgICAgICAgICBmcmVlKFN0b3JhZ2VEZWwtPnRyYWNlUm91dGVDdGxUZXN0TmFtZSk7CiAgICAgICAgICAgIFN0b3JhZ2VEZWwtPnRyYWNlUm91dGVDdGxUZXN0TmFtZSA9IE5VTEw7CiAgICAgICAgICAgIGZyZWUoU3RvcmFnZURlbC0+dHJhY2VSb3V0ZUN0bFRhcmdldEFkZHJlc3MpOwogICAgICAgICAgICBTdG9yYWdlRGVsLT50cmFjZVJvdXRlQ3RsVGFyZ2V0QWRkcmVzcyA9IE5VTEw7CiAgICAgICAgICAgIGZyZWUoU3RvcmFnZURlbC0+dHJhY2VSb3V0ZUN0bFNvdXJjZUFkZHJlc3MpOwogICAgICAgICAgICBTdG9yYWdlRGVsLT50cmFjZVJvdXRlQ3RsU291cmNlQWRkcmVzcyA9IE5VTEw7CiAgICAgICAgICAgIGZyZWUoU3RvcmFnZURlbC0+dHJhY2VSb3V0ZUN0bE1pc2NPcHRpb25zKTsKICAgICAgICAgICAgU3RvcmFnZURlbC0+dHJhY2VSb3V0ZUN0bE1pc2NPcHRpb25zID0gTlVMTDsKICAgICAgICAgICAgZnJlZShTdG9yYWdlRGVsLT50cmFjZVJvdXRlQ3RsRGVzY3IpOwogICAgICAgICAgICBTdG9yYWdlRGVsLT50cmFjZVJvdXRlQ3RsRGVzY3IgPSBOVUxMOwogICAgICAgICAgICBmcmVlKFN0b3JhZ2VEZWwtPnRyYWNlUm91dGVDdGxUcmFwR2VuZXJhdGlvbik7CiAgICAgICAgICAgIFN0b3JhZ2VEZWwtPnRyYWNlUm91dGVDdGxUcmFwR2VuZXJhdGlvbiA9IE5VTEw7CiAgICAgICAgICAgIGZyZWUoU3RvcmFnZURlbC0+dHJhY2VSb3V0ZUN0bFR5cGUpOwogICAgICAgICAgICBTdG9yYWdlRGVsLT50cmFjZVJvdXRlQ3RsVHlwZSA9IE5VTEw7CiAgICAgICAgICAgIGZyZWUoU3RvcmFnZURlbCk7CiAgICAgICAgICAgIFN0b3JhZ2VEZWwgPSBOVUxMOwoKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogWFhYOiBmcmVlIGl0LCBpdHMgZGVhZCAKICAgICAgICAgICAgICovCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKFN0b3JhZ2VUbXAKICAgICAgICAgICAgICAgICYmIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxSb3dTdGF0dXMgPT0gUlNfQ1JFQVRFQU5ER08pIHsKICAgICAgICAgICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxSb3dTdGF0dXMgPSBSU19BQ1RJVkU7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoU3RvcmFnZVRtcCAmJgogICAgICAgICAgICAgICAgICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxSb3dTdGF0dXMgPT0KICAgICAgICAgICAgICAgICAgICAgICBSU19DUkVBVEVBTkRXQUlUKSB7CgogICAgICAgICAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFJvd1N0YXR1cyA9IFJTX05PVElOU0VSVklDRTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoU3RvcmFnZVRtcCAmJiBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsUm93U3RhdHVzID09IFJTX0FDVElWRSkgewojaWYgMQogICAgICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZUN0bFRhYmxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgIndyaXRlX3RyYWNlUm91dGVDdGxSb3dTdGF0dXMgZW50ZXJpbmcgcnVuYmVmb3JlPSVsZC4uLiAgXG4iLAogICAgICAgICAgICAgICAgICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVGFyZ2V0QWRkcmVzc1R5cGUpKTsKCiNlbmRpZgogICAgICAgICAgICBpZiAoU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bEFkbWluU3RhdHVzID09IDEpIHsKICAgICAgICAgICAgICAgIGluaXRfdHJSZXN1bHRzVGFibGUoU3RvcmFnZVRtcCk7CiAgICAgICAgICAgICAgICBpZiAoU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bEZyZXF1ZW5jeSAhPSAwKQogICAgICAgICAgICAgICAgICAgIFN0b3JhZ2VUbXAtPnRpbWVyX2lkID0KICAgICAgICAgICAgICAgICAgICAgICAgc25tcF9hbGFybV9yZWdpc3RlcihTdG9yYWdlVG1wLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZVJvdXRlQ3RsRnJlcXVlbmN5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNBX1JFUEVBVCwgcnVuX3RyYWNlUm91dGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RvcmFnZVRtcCk7CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgU3RvcmFnZVRtcC0+dGltZXJfaWQgPQogICAgICAgICAgICAgICAgICAgICAgICBzbm1wX2FsYXJtX3JlZ2lzdGVyKDEsIDAsIHJ1bl90cmFjZVJvdXRlLCBTdG9yYWdlVG1wKTsKCiAgICAgICAgICAgIH0KCiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgfQogICAgcmV0dXJuIFNOTVBfRVJSX05PRVJST1I7Cn0KCgp2b2lkCnJ1bl90cmFjZVJvdXRlKHVuc2lnbmVkIGludCBjbGllbnRyZWcsIHZvaWQgKmNsaWVudGFyZykKewogICAgc3RydWN0IHRyYWNlUm91dGVDdGxUYWJsZV9kYXRhICppdGVtID0gY2xpZW50YXJnOwogICAgdV9zaG9ydCAgICAgICAgIHBvcnQgPSBpdGVtLT50cmFjZVJvdXRlQ3RsUG9ydDsgICAgIC8qIHN0YXJ0IHVkcCBkZXN0IHBvcnQgIyBmb3IgcHJvYmUgcGFja2V0cyDP4LWx09pjdGxwb3J0ICovCiAgICBpbnQgICAgICAgICAgICAgd2FpdHRpbWUgPSBpdGVtLT50cmFjZVJvdXRlQ3RsVGltZU91dDsgICAgICAvKiB0aW1lIHRvIHdhaXQgZm9yIHJlc3BvbnNlIChpbiBzZWNvbmRzKSDP4LXI09pjdGx0aW1lb3V0ICovCiAgICBpbnQgICAgICAgICAgICAgbnByb2JlcyA9IGl0ZW0tPnRyYWNlUm91dGVDdGxQcm9iZXNQZXJIb3A7CgogICAgaWYgKGl0ZW0tPnRyYWNlUm91dGVDdGxJbml0aWFsVHRsID4gaXRlbS0+dHJhY2VSb3V0ZUN0bE1heFR0bCkgewogICAgICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlQ3RsVGFibGUiLAogICAgICAgICAgICAgICAgICAgICJmaXJzdCB0dGwgKCVsdSkgbWF5IG5vdCBiZSBncmVhdGVyIHRoYW4gbWF4IHR0bCAoJWx1KVxuIiwKICAgICAgICAgICAgICAgICAgICBpdGVtLT50cmFjZVJvdXRlQ3RsSW5pdGlhbFR0bCwKICAgICAgICAgICAgICAgICAgICBpdGVtLT50cmFjZVJvdXRlQ3RsTWF4VHRsKSk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGNoYXIgICAgICAgICAgICpvbGRfSG9wc0FkZHJlc3NbMjU1XTsKICAgIGludCAgICAgICAgICAgICBjb3VudCA9IDA7CiAgICBpbnQgICAgICAgICAgICAgZmxhZyA9IDA7CgogICAgaWYgKGl0ZW0tPnRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzVHlwZSA9PSAxCiAgICAgICAgfHwgaXRlbS0+dHJhY2VSb3V0ZUN0bFRhcmdldEFkZHJlc3NUeXBlID09IDE2KSB7CiAgICAgICAgcmVnaXN0ZXIgaW50ICAgIGNvZGUsIG47CiAgICAgICAgY29uc3QgICAgY2hhciAgKmNwOwogICAgICAgIHJlZ2lzdGVyIGNvbnN0IGNoYXIgKmVycjsKICAgICAgICByZWdpc3RlciB1X2NoYXIgKm91dHA7CiAgICAgICAgcmVnaXN0ZXIgdV9pbnQzMl90ICphcDsKICAgICAgICBzdHJ1Y3Qgc29ja2FkZHIgd2hlcmV0bzsgICAgICAgIC8qIFdobyB0byB0cnkgdG8gcmVhY2ggKi8KICAgICAgICBzdHJ1Y3Qgc29ja2FkZHIgd2hlcmVmcm9tOyAgICAgIC8qIFdobyB3ZSBhcmUgKi8KCiAgICAgICAgcmVnaXN0ZXIgc3RydWN0IHNvY2thZGRyX2luICpmcm9tID0KICAgICAgICAgICAgKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSAmd2hlcmVmcm9tOwogICAgICAgIHJlZ2lzdGVyIHN0cnVjdCBzb2NrYWRkcl9pbiAqdG8gPSAoc3RydWN0IHNvY2thZGRyX2luICopICZ3aGVyZXRvOwogICAgICAgIHJlZ2lzdGVyIHN0cnVjdCBob3N0aW5mbyAqaGk7CiAgICAgICAgaW50ICAgICAgICAgICAgIG9uID0gMTsKICAgICAgICByZWdpc3RlciBzdHJ1Y3QgcHJvdG9lbnQgKnBlOwogICAgICAgIHJlZ2lzdGVyIGludCAgICB0dGwsIHByb2JlLCBpOwogICAgICAgIHJlZ2lzdGVyIGludCAgICBzZXEgPSAwOwogICAgICAgIGludCAgICAgICAgICAgICB0b3MgPSAwLCBzZXR0b3MgPSAwOwogICAgICAgIHJlZ2lzdGVyIGludCAgICBsc3JyID0gMDsKICAgICAgICByZWdpc3RlciB1X3Nob3J0IG9mZiA9IDA7CiAgICAgICAgc3RydWN0IGlmYWRkcmxpc3QgKmFsOwogICAgICAgIGNoYXIgICAgICAgICAgICBlcnJidWZbMTMyXTsKICAgICAgICBpbnQgICAgICAgICAgICAgbWlucGFja2V0ID0gMDsgIC8qIG1pbiBpcCBwYWNrZXQgc2l6ZSAqLwoKCiAgICAgICAgc3RydWN0IGlwICAgICAgKm91dGlwOyAgLyogbGFzdCBvdXRwdXQgKHVkcCkgcGFja2V0ICovCiAgICAgICAgc3RydWN0IHVkcGhkciAgKm91dHVkcDsgLyogbGFzdCBvdXRwdXQgKHVkcCkgcGFja2V0ICovCiAgICAgICAgaW50ICAgICAgICAgICAgIHBhY2tsZW4gPSAwOyAgICAvKiB0b3RhbCBsZW5ndGggb2YgcGFja2V0ICovCiAgICAgICAgaW50ICAgICAgICAgICAgIG9wdGxlbiA9IDA7ICAgICAvKiBsZW5ndGggb2YgaXAgb3B0aW9ucyAqLwogICAgICAgIGludCAgICAgICAgICAgICBvcHRpb25zID0gMDsgICAgLyogc29ja2V0IG9wdGlvbnMgKi8KICAgICAgICBpbnQgICAgICAgICAgICAgczsgICAgICAvKiByZWNlaXZlIChpY21wKSBzb2NrZXQgZmlsZSBkZXNjcmlwdG9yICovCiAgICAgICAgaW50ICAgICAgICAgICAgIHNuZHNvY2s7ICAgICAgICAvKiBzZW5kICh1ZHAvaWNtcCkgc29ja2V0IGZpbGUgZGVzY3JpcHRvciAqLwoKICAgICAgICB1X3Nob3J0ICAgICAgICAgaWRlbnQ7CiAgICAgICAgLyoKICAgICAgICAgKiBsb29zZSBzb3VyY2Ugcm91dGUgZ2F0ZXdheSBsaXN0IChpbmNsdWRpbmcgcm9vbSBmb3IgZmluYWwgZGVzdGluYXRpb24pIAogICAgICAgICAqLwogICAgICAgIHVfaW50MzJfdCAgICAgICBnd2xpc3RbTkdBVEVXQVlTICsgMV07CiAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgZGV2bnVsbFtdID0gIi9kZXYvbnVsbCI7CiAgICAgICAgY2hhciAgICAgICAgICAgKmRldmljZSA9IE5VTEw7CiAgICAgICAgY2hhciAgICAgICAgICAgKnNvdXJjZSA9IE5VTEw7CiAgICAgICAgY2hhciAgICAgICAgICAgKmhvc3RuYW1lOwogICAgICAgIHVfaW50ICAgICAgICAgICBwYXVzZW1zZWNzID0gMDsKICAgICAgICB1X2NoYXIgICAgICAgICAgcGFja2V0WzUxMl07ICAgIC8qIGxhc3QgaW5ib3VuZCAoaWNtcCkgcGFja2V0ICovCgogICAgICAgIGludCAgICAgICAgICAgICBwbXR1ID0gMDsgICAgICAgLyogUGF0aCBNVFUgRGlzY292ZXJ5IChSRkMxMTkxKSAqLwoKICAgICAgICBzdHJ1Y3Qgb3V0ZGF0YSAqb3V0ZGF0YTsgICAgICAgIC8qIGxhc3Qgb3V0cHV0ICh1ZHApIHBhY2tldCAqLwoKICAgICAgICBtaW5wYWNrZXQgPSBzaXplb2YoKm91dGlwKSArIHNpemVvZigqb3V0ZGF0YSkgKyBvcHRsZW47CiAgICAgICAgbWlucGFja2V0ICs9IHNpemVvZigqb3V0dWRwKTsKICAgICAgICBwYWNrbGVuID0gbWlucGFja2V0OyAgICAvKiBtaW5pbXVtIHNpemVkIHBhY2tldCAqLwoKICAgICAgICBob3N0bmFtZSA9CiAgICAgICAgICAgIChjaGFyICopIG1hbGxvYyhpdGVtLT50cmFjZVJvdXRlQ3RsVGFyZ2V0QWRkcmVzc0xlbiArIDEpOwogICAgICAgIGlmIChob3N0bmFtZSA9PSBOVUxMKQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgbWVtY3B5KGhvc3RuYW1lLCBpdGVtLT50cmFjZVJvdXRlQ3RsVGFyZ2V0QWRkcmVzcywKICAgICAgICAgICAgICAgaXRlbS0+dHJhY2VSb3V0ZUN0bFRhcmdldEFkZHJlc3NMZW4gKyAxKTsKICAgICAgICBob3N0bmFtZVtpdGVtLT50cmFjZVJvdXRlQ3RsVGFyZ2V0QWRkcmVzc0xlbl0gPSAnXDAnOwoKICAgICAgICBoaSA9IGdldGhvc3RpbmZvKGhvc3RuYW1lKTsKICAgICAgICBzZXRzaW4odG8sIGhpLT5hZGRyc1swXSk7CiAgICAgICAgaWYgKGhpLT5uID4gMSkKICAgICAgICAgICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVDdGxUYWJsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJXYXJuaW5nOiAlcyBoYXMgbXVsdGlwbGUgYWRkcmVzc2VzOyB1c2luZyAlc1xuIiwKICAgICAgICAgICAgICAgICAgICAgICAgaG9zdG5hbWUsIGluZXRfbnRvYSh0by0+c2luX2FkZHIpKSk7CiAgICAgICAgaG9zdG5hbWUgPSBoaS0+bmFtZTsKICAgICAgICBoaS0+bmFtZSA9IE5VTEw7CiAgICAgICAgZnJlZWhvc3RpbmZvKGhpKTsKCgogICAgICAgIG5ldHNubXBfc2V0X2xpbmVfYnVmZmVyaW5nKHN0ZG91dCk7CgogICAgICAgIG91dGlwID0gKHN0cnVjdCBpcCAqKSBtYWxsb2MocGFja2xlbik7CiAgICAgICAgaWYgKG91dGlwID09IE5VTEwpIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVDdGxUYWJsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJtYWxsb2M6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpKTsKICAgICAgICAgICAgZXhpdCgxKTsKICAgICAgICB9CiAgICAgICAgbWVtc2V0KChjaGFyICopIG91dGlwLCAwLCBwYWNrbGVuKTsKCiAgICAgICAgb3V0aXAtPmlwX3YgPSBJUFZFUlNJT047CiAgICAgICAgaWYgKHNldHRvcykKICAgICAgICAgICAgb3V0aXAtPmlwX3RvcyA9IHRvczsKI2lmZGVmIEJZVEVTV0FQX0lQX0hEUgogICAgICAgIG91dGlwLT5pcF9sZW4gPSBodG9ucyhwYWNrbGVuKTsKICAgICAgICBvdXRpcC0+aXBfb2ZmID0gaHRvbnMob2ZmKTsKI2Vsc2UKICAgICAgICBvdXRpcC0+aXBfbGVuID0gcGFja2xlbjsKICAgICAgICBvdXRpcC0+aXBfb2ZmID0gb2ZmOwojZW5kaWYKICAgICAgICBvdXRwID0gKHVfY2hhciAqKSAob3V0aXAgKyAxKTsKI2lmZGVmIEhBVkVfUkFXX09QVElPTlMKICAgICAgICBpZiAobHNyciA+IDApIHsKICAgICAgICAgICAgcmVnaXN0ZXIgdV9jaGFyICpvcHRsaXN0OwoKICAgICAgICAgICAgb3B0bGlzdCA9IG91dHA7CiAgICAgICAgICAgIG91dHAgKz0gb3B0bGVuOwoKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogZmluYWwgaG9wIAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZ3dsaXN0W2xzcnJdID0gdG8tPnNpbl9hZGRyLnNfYWRkcjsKCiAgICAgICAgICAgIG91dGlwLT5pcF9kc3Quc19hZGRyID0gZ3dsaXN0WzBdOwoKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogZm9yY2UgNCBieXRlIGFsaWdubWVudCAKICAgICAgICAgICAgICovCiAgICAgICAgICAgIG9wdGxpc3RbMF0gPSBJUE9QVF9OT1A7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIGxvb3NlIHNvdXJjZSByb3V0ZSBvcHRpb24gCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBvcHRsaXN0WzFdID0gSVBPUFRfTFNSUjsKICAgICAgICAgICAgaSA9IGxzcnIgKiBzaXplb2YoZ3dsaXN0WzBdKTsKICAgICAgICAgICAgb3B0bGlzdFsyXSA9IGkgKyAzOwogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBQb2ludGVyIHRvIExTUlIgYWRkcmVzc2VzIAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgb3B0bGlzdFszXSA9IElQT1BUX01JTk9GRjsKICAgICAgICAgICAgbWVtY3B5KG9wdGxpc3QgKyA0LCBnd2xpc3QgKyAxLCBpKTsKICAgICAgICB9IGVsc2UKI2VuZGlmCiAgICAgICAgICAgIG91dGlwLT5pcF9kc3QgPSB0by0+c2luX2FkZHI7CiAgICAgICAgb3V0aXAtPmlwX2hsID0gKG91dHAgLSAodV9jaGFyICopIG91dGlwKSA+PiAyOwogICAgICAgIGlkZW50ID0gKGdldHBpZCgpICYgMHhmZmZmKSB8IDB4ODAwMDsKCiAgICAgICAgb3V0aXAtPmlwX3AgPSBJUFBST1RPX1VEUDsKCiAgICAgICAgb3V0dWRwID0gKHN0cnVjdCB1ZHBoZHIgKikgb3V0cDsKICAgICAgICBvdXR1ZHAtPnNvdXJjZSA9IGh0b25zKGlkZW50KTsKICAgICAgICBvdXR1ZHAtPmxlbiA9CiAgICAgICAgICAgIGh0b25zKCh1X3Nob3J0KSAocGFja2xlbiAtIChzaXplb2YoKm91dGlwKSArIG9wdGxlbikpKTsKICAgICAgICBvdXRkYXRhID0gKHN0cnVjdCBvdXRkYXRhICopIChvdXR1ZHAgKyAxKTsKCiAgICAgICAgY3AgPSAiaWNtcCI7CiAgICAgICAgaWYgKChwZSA9IGdldHByb3RvYnluYW1lKGNwKSkgPT0gTlVMTCkgewogICAgICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZUN0bFRhYmxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgInVua25vd24gcHJvdG9jb2wgJXNcbiIsIGNwKSk7CiAgICAgICAgICAgIGV4aXQoMSk7CiAgICAgICAgfQoKICAgICAgICAvKgogICAgICAgICAqIEluc3VyZSB0aGUgc29ja2V0IGZkcyB3b24ndCBiZSAwLCAxIG9yIDIgCiAgICAgICAgICovCiAgICAgICAgaWYgKG9wZW4oZGV2bnVsbCwgT19SRE9OTFkpIDwgMCB8fAogICAgICAgICAgICBvcGVuKGRldm51bGwsIE9fUkRPTkxZKSA8IDAgfHwgb3BlbihkZXZudWxsLCBPX1JET05MWSkgPCAwKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlQ3RsVGFibGUiLAogICAgICAgICAgICAgICAgICAgICAgICAib3BlbiBcIiVzXCI6ICVzXG4iLCBkZXZudWxsLCBzdHJlcnJvcihlcnJubykpKTsKICAgICAgICAgICAgZXhpdCgxKTsKICAgICAgICB9CiAgICAgICAgaWYgKChzID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfUkFXLCBwZS0+cF9wcm90bykpIDwgMCkgewogICAgICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZUN0bFRhYmxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImljbXAgc29ja2V0OiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKSk7CiAgICAgICAgICAgIGV4aXQoMSk7CiAgICAgICAgfQogICAgICAgIGlmIChvcHRpb25zICYgU09fREVCVUcpCiAgICAgICAgICAgICh2b2lkKSBzZXRzb2Nrb3B0KHMsIFNPTF9TT0NLRVQsIFNPX0RFQlVHLCAoY2hhciAqKSAmb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihvbikpOwogICAgICAgIGlmIChvcHRpb25zICYgU09fRE9OVFJPVVRFKQogICAgICAgICAgICAodm9pZCkgc2V0c29ja29wdChzLCBTT0xfU09DS0VULCBTT19ET05UUk9VVEUsIChjaGFyICopICZvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9uKSk7CiNpZm5kZWYgX19ocHV4CiAgICAgICAgcHJpbnRmKCJyYXdcbiIpOwogICAgICAgIHNuZHNvY2sgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19SQVcsIElQUFJPVE9fUkFXKTsKI2Vsc2UKICAgICAgICBwcmludGYoInVkcFxuIik7CiAgICAgICAgc25kc29jayA9IHNvY2tldChBRl9JTkVULCBTT0NLX1JBVywgSVBQUk9UT19VRFApOwojZW5kaWYKICAgICAgICBpZiAoc25kc29jayA8IDApIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVDdGxUYWJsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJyYXcgc29ja2V0OiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKSk7CiAgICAgICAgICAgIGV4aXQoMSk7CiAgICAgICAgfQojaWYgZGVmaW5lZChJUF9PUFRJT05TKSAmJiAhZGVmaW5lZChIQVZFX1JBV19PUFRJT05TKQogICAgICAgIGlmIChsc3JyID4gMCkgewogICAgICAgICAgICB1X2NoYXIgICAgICAgICAgb3B0bGlzdFtNQVhfSVBPUFRMRU5dOwoKICAgICAgICAgICAgY3AgPSAiaXAiOwogICAgICAgICAgICBpZiAoKHBlID0gZ2V0cHJvdG9ieW5hbWUoY3ApKSA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZUN0bFRhYmxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bmtub3duIHByb3RvY29sICVzXG4iLCBjcCkpOwogICAgICAgICAgICAgICAgZXhpdCgxKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBmaW5hbCBob3AgCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnd2xpc3RbbHNycl0gPSB0by0+c2luX2FkZHIuc19hZGRyOwogICAgICAgICAgICArK2xzcnI7CgogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBmb3JjZSA0IGJ5dGUgYWxpZ25tZW50IAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgb3B0bGlzdFswXSA9IElQT1BUX05PUDsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogbG9vc2Ugc291cmNlIHJvdXRlIG9wdGlvbiAKICAgICAgICAgICAgICovCiAgICAgICAgICAgIG9wdGxpc3RbMV0gPSBJUE9QVF9MU1JSOwogICAgICAgICAgICBpID0gbHNyciAqIHNpemVvZihnd2xpc3RbMF0pOwogICAgICAgICAgICBvcHRsaXN0WzJdID0gaSArIDM7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIFBvaW50ZXIgdG8gTFNSUiBhZGRyZXNzZXMgCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBvcHRsaXN0WzNdID0gSVBPUFRfTUlOT0ZGOwogICAgICAgICAgICBtZW1jcHkob3B0bGlzdCArIDQsIGd3bGlzdCwgaSk7CgogICAgICAgICAgICBpZiAoKHNldHNvY2tvcHQoc25kc29jaywgcGUtPnBfcHJvdG8sIElQX09QVElPTlMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKSBvcHRsaXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaSArIHNpemVvZihnd2xpc3RbMF0pKSkgPCAwKSB7CiAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZUN0bFRhYmxlIiwgIklQX09QVElPTlM6ICVzXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoZXJybm8pKSk7CiAgICAgICAgICAgICAgICBleGl0KDEpOwogICAgICAgICAgICB9CiAgICAgICAgfQojZW5kaWYKI2lmZGVmIFNPX1NOREJVRgogICAgICAgIGlmIChzZXRzb2Nrb3B0KHNuZHNvY2ssIFNPTF9TT0NLRVQsIFNPX1NOREJVRiwgKGNoYXIgKikgJnBhY2tsZW4sCiAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHBhY2tsZW4pKSA8IDApIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVDdGxUYWJsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJTT19TTkRCVUY6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpKTsKICAgICAgICAgICAgZXhpdCgxKTsKICAgICAgICB9CiNlbmRpZgojaWZkZWYgSVBfSERSSU5DTAogICAgICAgIGlmIChzZXRzb2Nrb3B0KHNuZHNvY2ssIElQUFJPVE9fSVAsIElQX0hEUklOQ0wsIChjaGFyICopICZvbiwKICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yob24pKSA8IDApIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVDdGxUYWJsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJJUF9IRFJJTkNMOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKSk7CiAgICAgICAgICAgIGV4aXQoMSk7CiAgICAgICAgfQojZWxzZQojaWZkZWYgSVBfVE9TCiAgICAgICAgaWYgKHNldHRvcyAmJiBzZXRzb2Nrb3B0KHNuZHNvY2ssIElQUFJPVE9fSVAsIElQX1RPUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikgJnRvcywgc2l6ZW9mKHRvcykpIDwgMCkgewogICAgICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZUN0bFRhYmxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgInNldHNvY2tvcHQgdG9zICVkOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKSk7CiAgICAgICAgICAgIGV4aXQoMSk7CiAgICAgICAgfQojZW5kaWYKI2VuZGlmCiAgICAgICAgaWYgKG9wdGlvbnMgJiBTT19ERUJVRykKICAgICAgICAgICAgKHZvaWQpIHNldHNvY2tvcHQoc25kc29jaywgU09MX1NPQ0tFVCwgU09fREVCVUcsIChjaGFyICopICZvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9uKSk7CiAgICAgICAgaWYgKG9wdGlvbnMgJiBTT19ET05UUk9VVEUpCiAgICAgICAgICAgICh2b2lkKSBzZXRzb2Nrb3B0KHNuZHNvY2ssIFNPTF9TT0NLRVQsIFNPX0RPTlRST1VURSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikgJm9uLCBzaXplb2Yob24pKTsKICAgICAgICAvKgogICAgICAgICAqIEdldCB0aGUgaW50ZXJmYWNlIGFkZHJlc3MgbGlzdCAKICAgICAgICAgKi8KICAgICAgICBuID0gaWZhZGRybGlzdCgmYWwsIGVycmJ1Zik7CiAgICAgICAgaWYgKG4gPCAwKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlQ3RsVGFibGUiLAogICAgICAgICAgICAgICAgICAgICAgICAiIGlmYWRkcmxpc3Q6ICVzXG4iLCBlcnJidWYpKTsKICAgICAgICAgICAgZXhpdCgxKTsKICAgICAgICB9CiAgICAgICAgaWYgKG4gPT0gMCkgewogICAgICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZUN0bFRhYmxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgIiBDYW4ndCBmaW5kIGFueSBuZXR3b3JrIGludGVyZmFjZXNcbiIpKTsKCiAgICAgICAgICAgIGV4aXQoMSk7CiAgICAgICAgfQoKICAgICAgICAvKgogICAgICAgICAqIExvb2sgZm9yIGEgc3BlY2lmaWMgZGV2aWNlIAogICAgICAgICAqLwogICAgICAgIGlmIChkZXZpY2UgIT0gTlVMTCkgewogICAgICAgICAgICBmb3IgKGkgPSBuOyBpID4gMDsgLS1pLCArK2FsKQogICAgICAgICAgICAgICAgaWYgKHN0cmNtcChkZXZpY2UsIGFsLT5kZXZpY2UpID09IDApCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGlmIChpIDw9IDApIHsKICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlQ3RsVGFibGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBDYW4ndCBmaW5kIGludGVyZmFjZSAlLjMyc1xuIiwgZGV2aWNlKSk7CgogICAgICAgICAgICAgICAgZXhpdCgxKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKgogICAgICAgICAqIERldGVybWluZSBvdXIgc291cmNlIGFkZHJlc3MgCiAgICAgICAgICovCiAgICAgICAgaWYgKHNvdXJjZSA9PSBOVUxMKSB7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIElmIGEgZGV2aWNlIHdhcyBzcGVjaWZpZWQsIHVzZSB0aGUgaW50ZXJmYWNlIGFkZHJlc3MuCiAgICAgICAgICAgICAqIE90aGVyd2lzZSwgdHJ5IHRvIGRldGVybWluZSBvdXIgc291cmNlIGFkZHJlc3MuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBpZiAoZGV2aWNlICE9IE5VTEwpCiAgICAgICAgICAgICAgICBzZXRzaW4oZnJvbSwgYWwtPmFkZHIpOwogICAgICAgICAgICBlbHNlIGlmICgoZXJyID0gZmluZHNhZGRyKHRvLCBmcm9tKSkgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVDdGxUYWJsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGZpbmRzYWRkcjogJXNcbiIsIGVycikpOwogICAgICAgICAgICAgICAgZXhpdCgxKTsKICAgICAgICAgICAgfQoKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBoaSA9IGdldGhvc3RpbmZvKHNvdXJjZSk7CiAgICAgICAgICAgIHNvdXJjZSA9IGhpLT5uYW1lOwogICAgICAgICAgICBoaS0+bmFtZSA9IE5VTEw7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIElmIHRoZSBkZXZpY2Ugd2FzIHNwZWNpZmllZCBtYWtlIHN1cmUgaXQKICAgICAgICAgICAgICogY29ycmVzcG9uZHMgdG8gdGhlIHNvdXJjZSBhZGRyZXNzIHNwZWNpZmllZC4KICAgICAgICAgICAgICogT3RoZXJ3aXNlLCB1c2UgdGhlIGZpcnN0IGFkZHJlc3MgKGFuZCB3YXJuIGlmCiAgICAgICAgICAgICAqIHRoZXJlIGFyZSBtb3JlIHRoYW4gb25lKS4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGlmIChkZXZpY2UgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgZm9yIChpID0gaGktPm4sIGFwID0gaGktPmFkZHJzOyBpID4gMDsgLS1pLCArK2FwKQogICAgICAgICAgICAgICAgICAgIGlmICgqYXAgPT0gYWwtPmFkZHIpCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgaWYgKGkgPD0gMCkgewogICAgICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlQ3RsVGFibGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgJXMgaXMgbm90IG9uIGludGVyZmFjZSAlLjMyc1xuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UsIGRldmljZSkpOwoKICAgICAgICAgICAgICAgICAgICBleGl0KDEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgc2V0c2luKGZyb20sICphcCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBzZXRzaW4oZnJvbSwgaGktPmFkZHJzWzBdKTsKICAgICAgICAgICAgICAgIGlmIChoaS0+biA+IDEpCiAgICAgICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVDdGxUYWJsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBXYXJuaW5nOiAlcyBoYXMgbXVsdGlwbGUgYWRkcmVzc2VzOyB1c2luZyAlc1xuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UsIGluZXRfbnRvYShmcm9tLT5zaW5fYWRkcikpKTsKCiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnJlZWhvc3RpbmZvKGhpKTsKICAgICAgICB9CiAgICAgICAgLyoKICAgICAgICAgKiBSZXZlcnQgdG8gbm9uLXByaXZpbGVnZWQgdXNlciBhZnRlciBvcGVuaW5nIHNvY2tldHMgCiAgICAgICAgICovCiAgICAgICAgc2V0Z2lkKGdldGdpZCgpKTsKICAgICAgICBzZXR1aWQoZ2V0dWlkKCkpOwoKICAgICAgICBvdXRpcC0+aXBfc3JjID0gZnJvbS0+c2luX2FkZHI7CiNpZm5kZWYgSVBfSERSSU5DTAogICAgICAgIGlmIChiaW5kKHNuZHNvY2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikgZnJvbSwgc2l6ZW9mKCpmcm9tKSkgPCAwKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlQ3RsVGFibGUiLAogICAgICAgICAgICAgICAgICAgICAgICAiIGJpbmQ6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpKTsKICAgICAgICAgICAgZXhpdCgxKTsKICAgICAgICB9CiNlbmRpZgogICAgICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlQ3RsVGFibGUiLAogICAgICAgICAgICAgICAgICAgICIgdG8gJXMgKCVzKSIsIGhvc3RuYW1lLCBpbmV0X250b2EodG8tPnNpbl9hZGRyKSkpOwoKICAgICAgICBpZiAoc291cmNlKQogICAgICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZUN0bFRhYmxlIiwgIiBmcm9tICVzIiwgc291cmNlKSk7CgogICAgICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlQ3RsVGFibGUiLAogICAgICAgICAgICAgICAgICAgICIsICVsdSBob3BzIG1heCwgJWQgYnl0ZSBwYWNrZXRzXG4iLAogICAgICAgICAgICAgICAgICAgIGl0ZW0tPnRyYWNlUm91dGVDdGxNYXhUdGwsIHBhY2tsZW4pKTsKICAgICAgICAodm9pZCkgZmZsdXNoKHN0ZGVycik7CgogICAgICAgIHN0cnVjdCB0cmFjZVJvdXRlUmVzdWx0c1RhYmxlX2RhdGEgKlN0b3JhZ2VSZXN1bHRzID0gTlVMTDsKICAgICAgICBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKnZhcnNfcmVzdWx0cyA9IE5VTEw7CgogICAgICAgIHN0cnVjdCB0cmFjZVJvdXRlSG9wc1RhYmxlX2RhdGEgKnRlbXAgPSBOVUxMOwogICAgICAgIHN0cnVjdCB0cmFjZVJvdXRlSG9wc1RhYmxlX2RhdGEgKmN1cnJlbnRfdGVtcCA9IE5VTEw7CiAgICAgICAgc3RydWN0IHRyYWNlUm91dGVIb3BzVGFibGVfZGF0YSAqY3VycmVudCA9IE5VTEw7CgogICAgICAgIHVuc2lnbmVkIGxvbmcgICBpbmRleCA9IDA7CgogICAgICAgIHN0cnVjdCB0cmFjZVJvdXRlUHJvYmVIaXN0b3J5VGFibGVfZGF0YSAqdGVtcF9oaXMgPSBOVUxMOwogICAgICAgIHN0cnVjdCB0cmFjZVJvdXRlUHJvYmVIaXN0b3J5VGFibGVfZGF0YSAqY3VycmVudF90ZW1wX2hpcyA9IE5VTEw7CgogICAgICAgIHNubXBfdmFybGlzdF9hZGRfdmFyaWFibGUoJnZhcnNfcmVzdWx0cywgTlVMTCwgMCwgQVNOX09DVEVUX1NUUiwgKGNoYXIgKikgaXRlbS0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXgsIGl0ZW0tPnRyYWNlUm91dGVDdGxPd25lckluZGV4TGVuKTsgICAgIC8qICB0cmFjZVJvdXRlQ3RsT3duZXJJbmRleCAgKi8KICAgICAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzX3Jlc3VsdHMsIE5VTEwsIDAsIEFTTl9PQ1RFVF9TVFIsIChjaGFyICopIGl0ZW0tPnRyYWNlUm91dGVDdGxUZXN0TmFtZSwgaXRlbS0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lTGVuKTsgLyogIHRyYWNlUm91dGVDdGxUZXN0TmFtZSAgKi8KICAgICAgICBpZiAoKFN0b3JhZ2VSZXN1bHRzID0KICAgICAgICAgICAgIGhlYWRlcl9jb21wbGV4X2dldCh0cmFjZVJvdXRlUmVzdWx0c1RhYmxlU3RvcmFnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJzX3Jlc3VsdHMpKSA9PSBOVUxMKQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgc25tcF9mcmVlX3ZhcmJpbmQodmFyc19yZXN1bHRzKTsKICAgICAgICB2YXJzX3Jlc3VsdHMgPSBOVUxMOwoKCiAgICAgICAgZm9yICh0dGwgPSBpdGVtLT50cmFjZVJvdXRlQ3RsSW5pdGlhbFR0bDsKICAgICAgICAgICAgIHR0bCA8PSBpdGVtLT50cmFjZVJvdXRlQ3RsTWF4VHRsOyArK3R0bCkgewoKICAgICAgICAgICAgdV9pbnQzMl90ICAgICAgIGxhc3RhZGRyID0gMDsKICAgICAgICAgICAgaW50ICAgICAgICAgICAgIGdvdGxhc3RhZGRyID0gMDsKICAgICAgICAgICAgaW50ICAgICAgICAgICAgIGdvdF90aGVyZSA9IDA7CiAgICAgICAgICAgIGludCAgICAgICAgICAgICB1bnJlYWNoYWJsZSA9IDA7CiAgICAgICAgICAgIGludCAgICAgICAgICAgICBzZW50Zmlyc3QgPSAwOwogICAgICAgICAgICB0aW1lX3QgICAgICAgICAgdGltZXAgPSAwOwoKICAgICAgICAgICAgU3RvcmFnZVJlc3VsdHMtPnRyYWNlUm91dGVSZXN1bHRzQ3VySG9wQ291bnQgPSB0dGw7CiAgICAgICAgICAgIGlmIChpdGVtLT50cmFjZVJvdXRlQ3RsQ3JlYXRlSG9wc0VudHJpZXMgPT0gMSkgewogICAgICAgICAgICAgICAgaWYgKHR0bCA9PSBpdGVtLT50cmFjZVJvdXRlQ3RsSW5pdGlhbFR0bCkgewogICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBrID0gMDsKICAgICAgICAgICAgICAgICAgICBjb3VudCA9IHRyYWNlUm91dGVIb3BzVGFibGVfY291bnQoaXRlbSk7CgoKICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdHJhY2VSb3V0ZUhvcHNUYWJsZV9kYXRhICpTdG9yYWdlVG1wID0gTlVMTDsKICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaGVhZGVyX2NvbXBsZXhfaW5kZXggKmhjaXB0cjIgPSBOVUxMOwogICAgICAgICAgICAgICAgICAgIG5ldHNubXBfdmFyaWFibGVfbGlzdCAqdmFycyA9IE5VTEw7CiAgICAgICAgICAgICAgICAgICAgb2lkICAgICAgICAgICAgIG5ld29pZFtNQVhfT0lEX0xFTl07CiAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgIG5ld29pZF9sZW47CgogICAgICAgICAgICAgICAgICAgIHNubXBfdmFybGlzdF9hZGRfdmFyaWFibGUoJnZhcnMsIE5VTEwsIDAsIEFTTl9PQ1RFVF9TVFIsIChjaGFyICopIGl0ZW0tPnRyYWNlUm91dGVDdGxPd25lckluZGV4LCBpdGVtLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleExlbik7IC8qIHRyYWNlUm91dGVDdGxPd25lckluZGV4ICovCiAgICAgICAgICAgICAgICAgICAgc25tcF92YXJsaXN0X2FkZF92YXJpYWJsZSgmdmFycywgTlVMTCwgMCwgQVNOX09DVEVUX1NUUiwgKGNoYXIgKikgaXRlbS0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lLCBpdGVtLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWVMZW4pOyAgICAgLyogdHJhY2VSb3V0ZUN0bFRlc3ROYW1lICovCgogICAgICAgICAgICAgICAgICAgIGhlYWRlcl9jb21wbGV4X2dlbmVyYXRlX29pZChuZXdvaWQsICZuZXdvaWRfbGVuLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCB2YXJzKTsKCiAgICAgICAgICAgICAgICAgICAgZm9yIChoY2lwdHIyID0gdHJhY2VSb3V0ZUhvcHNUYWJsZVN0b3JhZ2U7CiAgICAgICAgICAgICAgICAgICAgICAgICBoY2lwdHIyICE9IE5VTEw7IGhjaXB0cjIgPSBoY2lwdHIyLT5uZXh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzbm1wX29pZF9jb21wYXJlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmV3b2lkLCBuZXdvaWRfbGVuLCBoY2lwdHIyLT5uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld29pZF9sZW4pID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0b3JhZ2VUbXAgPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcl9jb21wbGV4X2V4dHJhY3RfZW50cnkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJnRyYWNlUm91dGVIb3BzVGFibGVTdG9yYWdlLCBoY2lwdHIyKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRfSG9wc0FkZHJlc3Nba10gPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopIG1hbGxvYyhTdG9yYWdlVG1wLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VSb3V0ZUhvcHNJcFRndEFkZHJlc3NMZW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvbGRfSG9wc0FkZHJlc3Nba10gPT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXQoMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRfSG9wc0FkZHJlc3Nba10gPSBuZXRzbm1wX21lbWR1cCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlSG9wc0lwVGd0QWRkcmVzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdG9yYWdlVG1wLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZVJvdXRlSG9wc0lwVGd0QWRkcmVzc0xlbiArIDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkX0hvcHNBZGRyZXNzW2tdW1N0b3JhZ2VUbXAtPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlUm91dGVIb3BzSXBUZ3RBZGRyZXNzTGVuXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1wwJzsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrKys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdG9yYWdlVG1wID0gTlVMTDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB0cmFjZVJvdXRlSG9wc1RhYmxlX2RlbChpdGVtKTsKICAgICAgICAgICAgICAgICAgICBpbmRleCA9IDA7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdGVtcCA9IFNOTVBfTUFMTE9DX1NUUlVDVCh0cmFjZVJvdXRlSG9wc1RhYmxlX2RhdGEpOwogICAgICAgICAgICAgICAgdGVtcC0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXggPQogICAgICAgICAgICAgICAgICAgIChjaGFyICopIG1hbGxvYyhpdGVtLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleExlbiArIDEpOwogICAgICAgICAgICAgICAgbWVtY3B5KHRlbXAtPnRyYWNlUm91dGVDdGxPd25lckluZGV4LAogICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPnRyYWNlUm91dGVDdGxPd25lckluZGV4LAogICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPnRyYWNlUm91dGVDdGxPd25lckluZGV4TGVuICsgMSk7CiAgICAgICAgICAgICAgICB0ZW1wLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleFtpdGVtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlUm91dGVDdGxPd25lckluZGV4TGVuXSA9CiAgICAgICAgICAgICAgICAgICAgJ1wwJzsKICAgICAgICAgICAgICAgIHRlbXAtPnRyYWNlUm91dGVDdGxPd25lckluZGV4TGVuID0KICAgICAgICAgICAgICAgICAgICBpdGVtLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleExlbjsKCiAgICAgICAgICAgICAgICB0ZW1wLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWUgPQogICAgICAgICAgICAgICAgICAgIChjaGFyICopIG1hbGxvYyhpdGVtLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWVMZW4gKyAxKTsKICAgICAgICAgICAgICAgIG1lbWNweSh0ZW1wLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgaXRlbS0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lLAogICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPnRyYWNlUm91dGVDdGxUZXN0TmFtZUxlbiArIDEpOwogICAgICAgICAgICAgICAgdGVtcC0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lW2l0ZW0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlUm91dGVDdGxUZXN0TmFtZUxlbl0gPQogICAgICAgICAgICAgICAgICAgICdcMCc7CiAgICAgICAgICAgICAgICB0ZW1wLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWVMZW4gPQogICAgICAgICAgICAgICAgICAgIGl0ZW0tPnRyYWNlUm91dGVDdGxUZXN0TmFtZUxlbjsKCiAgICAgICAgICAgICAgICAvKiBhZGQgbG9jayB0byBwcm90ZWN0ICovCiAgICAgICAgICAgICAgICBwdGhyZWFkX211dGV4X3QgY291bnRlcl9tdXRleCA9IFBUSFJFQURfTVVURVhfSU5JVElBTElaRVI7CiAgICAgICAgICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJmNvdW50ZXJfbXV0ZXgpOwogICAgICAgICAgICAgICAgdGVtcC0+dHJhY2VSb3V0ZUhvcHNIb3BJbmRleCA9ICsraW5kZXg7CiAgICAgICAgICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmY291bnRlcl9tdXRleCk7CiAgICAgICAgICAgICAgICAvKiBlbmRzYWRzYWRzYWQgKi8KCgogICAgICAgICAgICAgICAgdGVtcC0+dHJhY2VSb3V0ZUhvcHNJcFRndEFkZHJlc3NUeXBlID0gMDsKICAgICAgICAgICAgICAgIHRlbXAtPnRyYWNlUm91dGVIb3BzSXBUZ3RBZGRyZXNzID0gc3RyZHVwKCIiKTsKICAgICAgICAgICAgICAgIHRlbXAtPnRyYWNlUm91dGVIb3BzSXBUZ3RBZGRyZXNzTGVuID0gMDsKICAgICAgICAgICAgICAgIHRlbXAtPnRyYWNlUm91dGVIb3BzTWluUnR0ID0gMDsKICAgICAgICAgICAgICAgIHRlbXAtPnRyYWNlUm91dGVIb3BzTWF4UnR0ID0gMDsKICAgICAgICAgICAgICAgIHRlbXAtPnRyYWNlUm91dGVIb3BzQXZlcmFnZVJ0dCA9IDA7CiAgICAgICAgICAgICAgICB0ZW1wLT50cmFjZVJvdXRlSG9wc1J0dFN1bU9mU3F1YXJlcyA9IDA7CiAgICAgICAgICAgICAgICB0ZW1wLT50cmFjZVJvdXRlSG9wc1NlbnRQcm9iZXMgPSAwOwogICAgICAgICAgICAgICAgdGVtcC0+dHJhY2VSb3V0ZUhvcHNQcm9iZVJlc3BvbnNlcyA9IDA7CgogICAgICAgICAgICAgICAgdGVtcC0+dHJhY2VSb3V0ZUhvcHNMYXN0R29vZFByb2JlTGVuID0gMDsKICAgICAgICAgICAgICAgIGlmIChpbmRleCA9PSAxKQogICAgICAgICAgICAgICAgICAgIGl0ZW0tPnRyYWNlUm91dGVIb3BzID0gdGVtcDsKICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIChjdXJyZW50X3RlbXApLT5uZXh0ID0gdGVtcDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjdXJyZW50X3RlbXAgPSB0ZW1wOwoKICAgICAgICAgICAgICAgIGlmIChpbmRleCArIDEgPj0gaXRlbS0+dHJhY2VSb3V0ZUN0bE1heFR0bCkgewogICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfdGVtcC0+bmV4dCA9IE5VTEw7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKGl0ZW0tPnRyYWNlUm91dGVIb3BzICE9IE5VTEwpCgogICAgICAgICAgICAgICAgICAgIGlmICh0cmFjZVJvdXRlSG9wc1RhYmxlX2FkZChjdXJyZW50X3RlbXApICE9CiAgICAgICAgICAgICAgICAgICAgICAgIFNOTVBFUlJfU1VDQ0VTUykKICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVIb3BzVGFibGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVnaXN0ZXJlZCBhbiBlbnRyeSBlcnJvclxuIikpOwoKICAgICAgICAgICAgfQogICAgICAgICAgICByZWdpc3RlciB1bnNpZ25lZCBsb25nIG1heFJ0dCA9IDA7CiAgICAgICAgICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgbWluUnR0ID0gMDsKICAgICAgICAgICAgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBhdmVyYWdlUnR0ID0gMDsKICAgICAgICAgICAgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBzdW1SdHQgPSAwOwogICAgICAgICAgICByZWdpc3RlciB1bnNpZ25lZCBsb25nIHJlc3BvbnNlUHJvYmUgPSAwOwogICAgICAgICAgICByZWdpc3RlciB1bnNpZ25lZCBsb25nIHN1bU9mU3F1YXJlID0gMDsKICAgICAgICAgICAgZm9yIChwcm9iZSA9IDA7IHByb2JlIDwgbnByb2JlczsgKytwcm9iZSkgewogICAgICAgICAgICAgICAgcmVnaXN0ZXIgaW50ICAgIGNjOwogICAgICAgICAgICAgICAgc3RydWN0IHRpbWV2YWwgIHQxLCB0MjsKICAgICAgICAgICAgICAgIHN0cnVjdCB0aW1lem9uZSB0ejsKICAgICAgICAgICAgICAgIHJlZ2lzdGVyIHN0cnVjdCBpcCAqaXAgPSBOVUxMOwogICAgICAgICAgICAgICAgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBSdHQgPSAwOwoKICAgICAgICAgICAgICAgIGlmIChzZW50Zmlyc3QgJiYgcGF1c2Vtc2VjcyA+IDApCiAgICAgICAgICAgICAgICAgICAgdXNsZWVwKHBhdXNlbXNlY3MgKiAxMDAwKTsKICAgICAgICAgICAgICAgICh2b2lkKSBnZXR0aW1lb2ZkYXkoJnQxLCAmdHopOwogICAgICAgICAgICAgICAgc2VuZF9wcm9iZSh0bywgKytzZXEsIHR0bCwgJnQxLCBvdXRpcCwgb3V0dWRwLCBwYWNrbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRsZW4sIGhvc3RuYW1lLCBpZGVudCwgc25kc29jaywgcG9ydCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0ZGF0YSk7CiAgICAgICAgICAgICAgICArK3NlbnRmaXJzdDsKICAgICAgICAgICAgICAgIHdoaWxlICgoY2MgPQogICAgICAgICAgICAgICAgICAgICAgICB3YWl0X2Zvcl9yZXBseShzLCBmcm9tLCAmdDEsIHBhY2tldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FpdHRpbWUpKSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgKHZvaWQpIGdldHRpbWVvZmRheSgmdDIsICZ0eik7CiAgICAgICAgICAgICAgICAgICAgdGltZXAgPSAwOwogICAgICAgICAgICAgICAgICAgIHRpbWUoJnRpbWVwKTsKICAgICAgICAgICAgICAgICAgICBpID0gcGFja2V0X29rKHBhY2tldCwgY2MsIGZyb20sIHNlcSwgaWRlbnQsIHBtdHUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0KTsKICAgICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAgICAqIFNraXAgc2hvcnQgcGFja2V0IAogICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgIGlmIChpID09IDApCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgIGlmICghZ290bGFzdGFkZHIgfHwgZnJvbS0+c2luX2FkZHIuc19hZGRyICE9IGxhc3RhZGRyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIHN0cnVjdCBpcCAqaXA7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGludCAgICBobGVuOwogICAgICAgICAgICAgICAgICAgICAgICBpcCA9IChzdHJ1Y3QgaXAgKikgcGFja2V0OwogICAgICAgICAgICAgICAgICAgICAgICBobGVuID0gaXAtPmlwX2hsIDw8IDI7CiAgICAgICAgICAgICAgICAgICAgICAgIGNjIC09IGhsZW47CiAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlQ3RsVGFibGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICVzIiwgaW5ldF9udG9hKGZyb20tPnNpbl9hZGRyKSkpOwoKCiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RhZGRyID0gZnJvbS0+c2luX2FkZHIuc19hZGRyOwogICAgICAgICAgICAgICAgICAgICAgICArK2dvdGxhc3RhZGRyOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBSdHQgPSBkZWx0YVQoJnQxLCAmdDIpOwogICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlUHJvYmUgPSByZXNwb25zZVByb2JlICsgMTsKICAgICAgICAgICAgICAgICAgICBpZiAocHJvYmUgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICBtaW5SdHQgPSBSdHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIG1heFJ0dCA9IFJ0dDsKICAgICAgICAgICAgICAgICAgICAgICAgYXZlcmFnZVJ0dCA9IFJ0dDsKICAgICAgICAgICAgICAgICAgICAgICAgc3VtUnR0ID0gUnR0OwogICAgICAgICAgICAgICAgICAgICAgICBzdW1PZlNxdWFyZSA9IFJ0dCAqIFJ0dDsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoUnR0IDwgbWluUnR0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluUnR0ID0gUnR0OwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoUnR0ID4gbWF4UnR0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4UnR0ID0gUnR0OwogICAgICAgICAgICAgICAgICAgICAgICBzdW1SdHQgPSAoc3VtUnR0KSArIFJ0dDsKICAgICAgICAgICAgICAgICAgICAgICAgYXZlcmFnZVJ0dCA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3VuZCgoZG91YmxlKSAoc3VtUnR0KSAvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZG91YmxlKSByZXNwb25zZVByb2JlKTsKICAgICAgICAgICAgICAgICAgICAgICAgc3VtT2ZTcXVhcmUgPSBzdW1PZlNxdWFyZSArIFJ0dCAqIFJ0dDsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIFN0b3JhZ2VSZXN1bHRzLT50cmFjZVJvdXRlUmVzdWx0c0N1clByb2JlQ291bnQgPQogICAgICAgICAgICAgICAgICAgICAgICBwcm9iZSArIDE7CiAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT0gLTIpIHsKI2lmbmRlZiBBUkNIQUlDCiAgICAgICAgICAgICAgICAgICAgICAgIGlwID0gKHN0cnVjdCBpcCAqKSBwYWNrZXQ7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpcC0+aXBfdHRsIDw9IDEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmludGYoIiAhIik7CiNlbmRpZgogICAgICAgICAgICAgICAgICAgICAgICArK2dvdF90aGVyZTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICAgICogdGltZSBleGNlZWRlZCBpbiB0cmFuc2l0IAogICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgIGlmIChpID09IC0xKQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjb2RlID0gaSAtIDE7CiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChjb2RlKSB7CgogICAgICAgICAgICAgICAgICAgIGNhc2UgSUNNUF9VTlJFQUNIX1BPUlQ6CiNpZm5kZWYgQVJDSEFJQwogICAgICAgICAgICAgICAgICAgICAgICBpcCA9IChzdHJ1Y3QgaXAgKikgcGFja2V0OwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXAtPmlwX3R0bCA8PSAxKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRmKCIgISIpOwojZW5kaWYKICAgICAgICAgICAgICAgICAgICAgICAgKytnb3RfdGhlcmU7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgICAgICBjYXNlIElDTVBfVU5SRUFDSF9ORVQ6CiAgICAgICAgICAgICAgICAgICAgICAgICsrdW5yZWFjaGFibGU7CiAgICAgICAgICAgICAgICAgICAgICAgIFByaW50ZigiICFOIik7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgICAgICBjYXNlIElDTVBfVU5SRUFDSF9IT1NUOgogICAgICAgICAgICAgICAgICAgICAgICArK3VucmVhY2hhYmxlOwogICAgICAgICAgICAgICAgICAgICAgICBQcmludGYoIiAhSCIpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICAgICAgY2FzZSBJQ01QX1VOUkVBQ0hfUFJPVE9DT0w6CiAgICAgICAgICAgICAgICAgICAgICAgICsrZ290X3RoZXJlOwogICAgICAgICAgICAgICAgICAgICAgICBQcmludGYoIiAhUCIpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICAgICAgY2FzZSBJQ01QX1VOUkVBQ0hfTkVFREZSQUc6CiAgICAgICAgICAgICAgICAgICAgICAgICsrdW5yZWFjaGFibGU7CiAgICAgICAgICAgICAgICAgICAgICAgIFByaW50ZigiICFGLSVkIiwgcG10dSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgICAgICBjYXNlIElDTVBfVU5SRUFDSF9TUkNGQUlMOgogICAgICAgICAgICAgICAgICAgICAgICArK3VucmVhY2hhYmxlOwogICAgICAgICAgICAgICAgICAgICAgICBQcmludGYoIiAhUyIpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICAgICAgY2FzZSBJQ01QX1VOUkVBQ0hfRklMVEVSX1BST0hJQjoKICAgICAgICAgICAgICAgICAgICAgICAgKyt1bnJlYWNoYWJsZTsKICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRmKCIgIVgiKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgICAgIGNhc2UgSUNNUF9VTlJFQUNIX0hPU1RfUFJFQ0VERU5DRToKICAgICAgICAgICAgICAgICAgICAgICAgKyt1bnJlYWNoYWJsZTsKICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRmKCIgIVYiKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgICAgIGNhc2UgSUNNUF9VTlJFQUNIX1BSRUNFREVOQ0VfQ1VUT0ZGOgogICAgICAgICAgICAgICAgICAgICAgICArK3VucmVhY2hhYmxlOwogICAgICAgICAgICAgICAgICAgICAgICBQcmludGYoIiAhQyIpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgKyt1bnJlYWNoYWJsZTsKICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRmKCIgITwlZD4iLCBjb2RlKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGNjID09IDApIHsKICAgICAgICAgICAgICAgICAgICB0aW1lcCA9IDA7CiAgICAgICAgICAgICAgICAgICAgdGltZSgmdGltZXApOwogICAgICAgICAgICAgICAgICAgIFByaW50ZigiICoiKTsKICAgICAgICAgICAgICAgICAgICBSdHQgPSAoaXRlbS0+dHJhY2VSb3V0ZUN0bFRpbWVPdXQpICogMTAwMDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChpdGVtLT50cmFjZVJvdXRlQ3RsTWF4Um93cyAhPSAwKSB7CgogICAgICAgICAgICAgICAgICAgIHRlbXBfaGlzID0KICAgICAgICAgICAgICAgICAgICAgICAgU05NUF9NQUxMT0NfU1RSVUNUCiAgICAgICAgICAgICAgICAgICAgICAgICh0cmFjZVJvdXRlUHJvYmVIaXN0b3J5VGFibGVfZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgdGVtcF9oaXMtPnRyYWNlUm91dGVDdGxPd25lckluZGV4ID0KICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikgbWFsbG9jKGl0ZW0tPnRyYWNlUm91dGVDdGxPd25lckluZGV4TGVuICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOwogICAgICAgICAgICAgICAgICAgIG1lbWNweSh0ZW1wX2hpcy0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPnRyYWNlUm91dGVDdGxPd25lckluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleExlbiArIDEpOwogICAgICAgICAgICAgICAgICAgIHRlbXBfaGlzLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleFtpdGVtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VSb3V0ZUN0bE93bmVySW5kZXhMZW5dCiAgICAgICAgICAgICAgICAgICAgICAgID0gJ1wwJzsKICAgICAgICAgICAgICAgICAgICB0ZW1wX2hpcy0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXhMZW4gPQogICAgICAgICAgICAgICAgICAgICAgICBpdGVtLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleExlbjsKCiAgICAgICAgICAgICAgICAgICAgdGVtcF9oaXMtPnRyYWNlUm91dGVDdGxUZXN0TmFtZSA9CiAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopIG1hbGxvYyhpdGVtLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWVMZW4gKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7CiAgICAgICAgICAgICAgICAgICAgbWVtY3B5KHRlbXBfaGlzLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPnRyYWNlUm91dGVDdGxUZXN0TmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lTGVuICsgMSk7CiAgICAgICAgICAgICAgICAgICAgdGVtcF9oaXMtPnRyYWNlUm91dGVDdGxUZXN0TmFtZVtpdGVtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlUm91dGVDdGxUZXN0TmFtZUxlbl0KICAgICAgICAgICAgICAgICAgICAgICAgPSAnXDAnOwogICAgICAgICAgICAgICAgICAgIHRlbXBfaGlzLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWVMZW4gPQogICAgICAgICAgICAgICAgICAgICAgICBpdGVtLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWVMZW47CgogICAgICAgICAgICAgICAgICAgIC8qIGFkZCBsb2NrIHRvIHByb3RlY3QgKi8KICAgICAgICAgICAgICAgICAgICBwdGhyZWFkX211dGV4X3QgY291bnRlcl9tdXRleCA9CiAgICAgICAgICAgICAgICAgICAgICAgIFBUSFJFQURfTVVURVhfSU5JVElBTElaRVI7CiAgICAgICAgICAgICAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZjb3VudGVyX211dGV4KTsKICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbS0+dHJhY2VSb3V0ZVByb2JlSGlzdG9yeU1heEluZGV4ID49CiAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSAoMjE0NzQ4MzY0NykpCiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPnRyYWNlUm91dGVQcm9iZUhpc3RvcnlNYXhJbmRleCA9IDA7CiAgICAgICAgICAgICAgICAgICAgdGVtcF9oaXMtPnRyYWNlUm91dGVQcm9iZUhpc3RvcnlJbmRleCA9CiAgICAgICAgICAgICAgICAgICAgICAgICsrKGl0ZW0tPnRyYWNlUm91dGVQcm9iZUhpc3RvcnlNYXhJbmRleCk7CiAgICAgICAgICAgICAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmNvdW50ZXJfbXV0ZXgpOwogICAgICAgICAgICAgICAgICAgIC8qIGVuZHNhZHNhZHNhZCAqLwogICAgICAgICAgICAgICAgICAgIHRlbXBfaGlzLT50cmFjZVJvdXRlUHJvYmVIaXN0b3J5SG9wSW5kZXggPSB0dGw7CiAgICAgICAgICAgICAgICAgICAgdGVtcF9oaXMtPnRyYWNlUm91dGVQcm9iZUhpc3RvcnlQcm9iZUluZGV4ID0gcHJvYmUgKyAxOwoKICAgICAgICAgICAgICAgICAgICB0ZW1wX2hpcy0+dHJhY2VSb3V0ZVByb2JlSGlzdG9yeUhBZGRyVHlwZSA9IDE7CiAgICAgICAgICAgICAgICAgICAgdGVtcF9oaXMtPnRyYWNlUm91dGVQcm9iZUhpc3RvcnlIQWRkciA9CiAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopIG1hbGxvYyhzdHJsZW4oaW5ldF9udG9hKGZyb20tPnNpbl9hZGRyKSkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7CiAgICAgICAgICAgICAgICAgICAgc3RyY3B5KHRlbXBfaGlzLT50cmFjZVJvdXRlUHJvYmVIaXN0b3J5SEFkZHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbmV0X250b2EoZnJvbS0+c2luX2FkZHIpKSk7CiAgICAgICAgICAgICAgICAgICAgdGVtcF9oaXMtPgogICAgICAgICAgICAgICAgICAgICAgICB0cmFjZVJvdXRlUHJvYmVIaXN0b3J5SEFkZHJbc3RybGVuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5ldF9udG9hCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZyb20tPnNpbl9hZGRyKSldID0KICAgICAgICAgICAgICAgICAgICAgICAgJ1wwJzsKICAgICAgICAgICAgICAgICAgICB0ZW1wX2hpcy0+dHJhY2VSb3V0ZVByb2JlSGlzdG9yeUhBZGRyTGVuID0KICAgICAgICAgICAgICAgICAgICAgICAgc3RybGVuKGluZXRfbnRvYShmcm9tLT5zaW5fYWRkcikpOwoKICAgICAgICAgICAgICAgICAgICB0ZW1wX2hpcy0+dHJhY2VSb3V0ZVByb2JlSGlzdG9yeVJlc3BvbnNlID0gUnR0OwogICAgICAgICAgICAgICAgICAgIHRlbXBfaGlzLT50cmFjZVJvdXRlUHJvYmVIaXN0b3J5U3RhdHVzID0gMTsKICAgICAgICAgICAgICAgICAgICB0ZW1wX2hpcy0+dHJhY2VSb3V0ZVByb2JlSGlzdG9yeUxhc3RSQyA9IDA7CgoJCSAgICB0ZW1wX2hpcy0+dHJhY2VSb3V0ZVByb2JlSGlzdG9yeVRpbWVfdGltZSA9IHRpbWVwOwogICAgICAgICAgICAgICAgICAgIHRlbXBfaGlzLT50cmFjZVJvdXRlUHJvYmVIaXN0b3J5VGltZSA9CiAgICAgICAgICAgICAgICAgICAgICAgIG5ldHNubXBfbWVtZHVwKGRhdGVfbl90aW1lKCZ0aW1lcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGVtcF9oaXMtPnRyYWNlUm91dGVQcm9iZUhpc3RvcnlUaW1lTGVuKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEpOwogICAgICAgICAgICAgICAgICAgIGlmIChwcm9iZSA9PSAwKQogICAgICAgICAgICAgICAgICAgICAgICBpdGVtLT50cmFjZVJvdXRlUHJvYmVIaXMgPSB0ZW1wX2hpczsKICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgKGN1cnJlbnRfdGVtcF9oaXMpLT5uZXh0ID0gdGVtcF9oaXM7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBjdXJyZW50X3RlbXBfaGlzID0gdGVtcF9oaXM7CgogICAgICAgICAgICAgICAgICAgIGlmIChwcm9iZSArIDEgPj0gbnByb2JlcykgewogICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X3RlbXBfaGlzLT5uZXh0ID0gTlVMTDsKCiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbS0+dHJhY2VSb3V0ZVByb2JlSGlzICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRyYWNlUm91dGVQcm9iZUhpc3RvcnlUYWJsZV9jb3VudChpdGVtKSA8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLT50cmFjZVJvdXRlQ3RsTWF4Um93cykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRyYWNlUm91dGVQcm9iZUhpc3RvcnlUYWJsZV9hZGQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY3VycmVudF90ZW1wX2hpcykgIT0gU05NUEVSUl9TVUNDRVNTKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlUHJvYmVIaXN0b3J5VGFibGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWdpc3RlcmVkIGFuIGVudHJ5IGVycm9yXG4iKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZVJvdXRlUHJvYmVIaXN0b3J5VGFibGVfZGVsTGFzdChpdGVtKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0cmFjZVJvdXRlUHJvYmVIaXN0b3J5VGFibGVfYWRkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGN1cnJlbnRfdGVtcF9oaXMpICE9IFNOTVBFUlJfU1VDQ0VTUykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZVByb2JlSGlzdG9yeVRhYmxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVnaXN0ZXJlZCBhbiBlbnRyeSBlcnJvclxuIikpOwoKICAgICAgICAgICAgICAgICAgICAgICAgfQoJCSAgICB9CgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChpdGVtLT50cmFjZVJvdXRlQ3RsQ3JlYXRlSG9wc0VudHJpZXMgPT0gMSkgewogICAgICAgICAgICAgICAgICAgIG5ldHNubXBfdmFyaWFibGVfbGlzdCAqdmFyc19ob3BzID0gTlVMTDsKICAgICAgICAgICAgICAgICAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzX2hvcHMsIE5VTEwsIDAsIEFTTl9PQ1RFVF9TVFIsIChjaGFyICopIGl0ZW0tPnRyYWNlUm91dGVDdGxPd25lckluZGV4LCBpdGVtLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleExlbik7ICAgIC8qICB0cmFjZVJvdXRlQ3RsT3duZXJJbmRleCAgKi8KICAgICAgICAgICAgICAgICAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzX2hvcHMsIE5VTEwsIDAsIEFTTl9PQ1RFVF9TVFIsIChjaGFyICopIGl0ZW0tPnRyYWNlUm91dGVDdGxUZXN0TmFtZSwgaXRlbS0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lTGVuKTsgICAgICAgIC8qICB0cmFjZVJvdXRlQ3RsVGVzdE5hbWUgICovCiAgICAgICAgICAgICAgICAgICAgc25tcF92YXJsaXN0X2FkZF92YXJpYWJsZSgmdmFyc19ob3BzLCBOVUxMLCAwLCBBU05fVU5TSUdORUQsIChjaGFyICopICZpbmRleCwgc2l6ZW9mKGluZGV4KSk7ICAgICAgIC8qICB0cmFjZVJvdXRlSG9wc0luZGV4ICAqLwogICAgICAgICAgICAgICAgICAgIGlmICgoY3VycmVudCA9CiAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJfY29tcGxleF9nZXQodHJhY2VSb3V0ZUhvcHNUYWJsZVN0b3JhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyc19ob3BzKSkgPT0gTlVMTCkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIHNubXBfZnJlZV92YXJiaW5kKHZhcnNfaG9wcyk7CiAgICAgICAgICAgICAgICAgICAgdmFyc19ob3BzID0gTlVMTDsKCiAgICAgICAgICAgICAgICAgICAgY3VycmVudC0+dHJhY2VSb3V0ZUhvcHNJcFRndEFkZHJlc3NUeXBlID0gMTsKICAgICAgICAgICAgICAgICAgICBjdXJyZW50LT50cmFjZVJvdXRlSG9wc0lwVGd0QWRkcmVzcyA9CiAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopIG1hbGxvYyhzdHJsZW4oaW5ldF9udG9hKGZyb20tPnNpbl9hZGRyKSkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7CiAgICAgICAgICAgICAgICAgICAgY3VycmVudC0+dHJhY2VSb3V0ZUhvcHNJcFRndEFkZHJlc3MgPQogICAgICAgICAgICAgICAgICAgICAgICBzdHJkdXAoaW5ldF9udG9hKGZyb20tPnNpbl9hZGRyKSk7CiAgICAgICAgICAgICAgICAgICAgY3VycmVudC0+CiAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlUm91dGVIb3BzSXBUZ3RBZGRyZXNzW3N0cmxlbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5ldF9udG9hCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZnJvbS0+c2luX2FkZHIpKV0gPQogICAgICAgICAgICAgICAgICAgICAgICAnXDAnOwogICAgICAgICAgICAgICAgICAgIGN1cnJlbnQtPnRyYWNlUm91dGVIb3BzSXBUZ3RBZGRyZXNzTGVuID0KICAgICAgICAgICAgICAgICAgICAgICAgc3RybGVuKGluZXRfbnRvYShmcm9tLT5zaW5fYWRkcikpOwogICAgICAgICAgICAgICAgICAgIGlmIChjb3VudCAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJjbXAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbGRfSG9wc0FkZHJlc3NbaW5kZXggLSAxXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50LT50cmFjZVJvdXRlSG9wc0lwVGd0QWRkcmVzcykgIT0gMCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWcgPSAxOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgY3VycmVudC0+dHJhY2VSb3V0ZUhvcHNJcFRndEFkZHJlc3NMZW4gPQogICAgICAgICAgICAgICAgICAgICAgICBzdHJsZW4oaW5ldF9udG9hKGZyb20tPnNpbl9hZGRyKSk7CiAgICAgICAgICAgICAgICAgICAgY3VycmVudC0+dHJhY2VSb3V0ZUhvcHNNaW5SdHQgPSBtaW5SdHQ7CiAgICAgICAgICAgICAgICAgICAgY3VycmVudC0+dHJhY2VSb3V0ZUhvcHNNYXhSdHQgPSBtYXhSdHQ7CiAgICAgICAgICAgICAgICAgICAgY3VycmVudC0+dHJhY2VSb3V0ZUhvcHNBdmVyYWdlUnR0ID0gYXZlcmFnZVJ0dDsKICAgICAgICAgICAgICAgICAgICBjdXJyZW50LT50cmFjZVJvdXRlSG9wc1J0dFN1bU9mU3F1YXJlcyA9IHN1bU9mU3F1YXJlOwogICAgICAgICAgICAgICAgICAgIGN1cnJlbnQtPnRyYWNlUm91dGVIb3BzU2VudFByb2JlcyA9IHByb2JlICsgMTsKICAgICAgICAgICAgICAgICAgICBjdXJyZW50LT50cmFjZVJvdXRlSG9wc1Byb2JlUmVzcG9uc2VzID0gcmVzcG9uc2VQcm9iZTsKCQkgICAgY3VycmVudC0+dHJhY2VSb3V0ZUhvcHNMYXN0R29vZFByb2JlX3RpbWUgPSB0aW1lcDsKICAgICAgICAgICAgICAgICAgICBjdXJyZW50LT50cmFjZVJvdXRlSG9wc0xhc3RHb29kUHJvYmUgPQogICAgICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX21lbWR1cChkYXRlX25fdGltZSgmdGltZXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmN1cnJlbnQtPnRyYWNlUm91dGVIb3BzTGFzdEdvb2RQcm9iZUxlbiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAodm9pZCkgZmZsdXNoKHN0ZG91dCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcHV0Y2hhcignXG4nKTsKCgogICAgICAgICAgICBpZiAoZ290X3RoZXJlCiAgICAgICAgICAgICAgICB8fCAodW5yZWFjaGFibGUgPiAwICYmIHVucmVhY2hhYmxlID49IG5wcm9iZXMgLSAxKSkgewoKICAgICAgICAgICAgICAgIGlmIChnb3RfdGhlcmUgIT0gMCkgewogICAgICAgICAgICAgICAgICAgIFN0b3JhZ2VSZXN1bHRzLT50cmFjZVJvdXRlUmVzdWx0c1Rlc3RBdHRlbXB0cyA9CiAgICAgICAgICAgICAgICAgICAgICAgIFN0b3JhZ2VSZXN1bHRzLT50cmFjZVJvdXRlUmVzdWx0c1Rlc3RBdHRlbXB0cyArIDE7CgogICAgICAgICAgICAgICAgICAgIFN0b3JhZ2VSZXN1bHRzLT50cmFjZVJvdXRlUmVzdWx0c1Rlc3RTdWNjZXNzZXMgPQogICAgICAgICAgICAgICAgICAgICAgICBTdG9yYWdlUmVzdWx0cy0+dHJhY2VSb3V0ZVJlc3VsdHNUZXN0U3VjY2Vzc2VzICsgMTsKCgkJICAgIFN0b3JhZ2VSZXN1bHRzLT50cmFjZVJvdXRlUmVzdWx0c0xhc3RHb29kUGF0aF90aW1lID0gdGltZXA7CiAgICAgICAgICAgICAgICAgICAgU3RvcmFnZVJlc3VsdHMtPnRyYWNlUm91dGVSZXN1bHRzTGFzdEdvb2RQYXRoID0KICAgICAgICAgICAgICAgICAgICAgICAgbmV0c25tcF9tZW1kdXAoZGF0ZV9uX3RpbWUoJnRpbWVwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VSZXN1bHRzLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlUm91dGVSZXN1bHRzTGFzdEdvb2RQYXRoTGVuKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEpOwogICAgICAgICAgICAgICAgICAgIGlmICgoaXRlbS0+CiAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZVJvdXRlQ3RsVHJhcEdlbmVyYXRpb25bMF0gJgogICAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0VST1VURVRSQVBHRU5FUkFUSU9OX1RFU1RDT01QTEVURUQpICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVQcm9iZUhpc3RvcnlUYWJsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJURVNUIGNvbXBsZXRlZCFcbiIpKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VuZF90cmFjZVJvdXRlX3RyYXAoaXRlbSwgdHJhY2VSb3V0ZVRlc3RDb21wbGV0ZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodHJhY2VSb3V0ZVRlc3RDb21wbGV0ZWQpIC8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9pZCkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBTdG9yYWdlUmVzdWx0cy0+dHJhY2VSb3V0ZVJlc3VsdHNUZXN0QXR0ZW1wdHMgPQogICAgICAgICAgICAgICAgICAgICAgICBTdG9yYWdlUmVzdWx0cy0+dHJhY2VSb3V0ZVJlc3VsdHNUZXN0QXR0ZW1wdHMgKyAxOwogICAgICAgICAgICAgICAgICAgIGlmICgoaXRlbS0+CiAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZVJvdXRlQ3RsVHJhcEdlbmVyYXRpb25bMF0gJgogICAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0VST1VURVRSQVBHRU5FUkFUSU9OX1RFU1RGQUlMRUQpICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVQcm9iZUhpc3RvcnlUYWJsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXN0IEZhaWxlZCFcbiIpKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VuZF90cmFjZVJvdXRlX3RyYXAoaXRlbSwgdHJhY2VSb3V0ZVRlc3RGYWlsZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih0cmFjZVJvdXRlVGVzdEZhaWxlZCkgLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yob2lkKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICB9IGVsc2UgaWYgKHR0bCA9PSBpdGVtLT50cmFjZVJvdXRlQ3RsTWF4VHRsCiAgICAgICAgICAgICAgICAgICAgICAgJiYgKHByb2JlICsgMSkgPT0gbnByb2JlcykgewogICAgICAgICAgICAgICAgU3RvcmFnZVJlc3VsdHMtPnRyYWNlUm91dGVSZXN1bHRzVGVzdEF0dGVtcHRzID0KICAgICAgICAgICAgICAgICAgICBTdG9yYWdlUmVzdWx0cy0+dHJhY2VSb3V0ZVJlc3VsdHNUZXN0QXR0ZW1wdHMgKyAxOwoKICAgICAgICAgICAgICAgIGlmICgoaXRlbS0+CiAgICAgICAgICAgICAgICAgICAgIHRyYWNlUm91dGVDdGxUcmFwR2VuZXJhdGlvblswXSAmCiAgICAgICAgICAgICAgICAgICAgIFRSQUNFUk9VVEVUUkFQR0VORVJBVElPTl9URVNURkFJTEVEKSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVQcm9iZUhpc3RvcnlUYWJsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRlc3QgRmFpbGVkIVxuIikpOwogICAgICAgICAgICAgICAgICAgIHNlbmRfdHJhY2VSb3V0ZV90cmFwKGl0ZW0sIHRyYWNlUm91dGVUZXN0RmFpbGVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih0cmFjZVJvdXRlVGVzdEZhaWxlZCkgLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihvaWQpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICB9CgogICAgICAgIGNsb3NlKHNuZHNvY2spOwoKICAgICAgICBpZiAoZmxhZyA9PSAxKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlUHJvYmVIaXN0b3J5VGFibGUiLCAicGF0aCBjaGFuZ2VkIVxuIikpOwogICAgICAgICAgICBzZW5kX3RyYWNlUm91dGVfdHJhcChpdGVtLCB0cmFjZVJvdXRlUGF0aENoYW5nZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHRyYWNlUm91dGVQYXRoQ2hhbmdlKSAvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihvaWQpKTsKICAgICAgICB9CgogICAgICAgIGludCAgICAgICAgICAgICBrID0gMDsKICAgICAgICBmb3IgKGsgPSAwOyBrIDwgY291bnQ7IGsrKykgewogICAgICAgICAgICBmcmVlKG9sZF9Ib3BzQWRkcmVzc1trXSk7CiAgICAgICAgICAgIG9sZF9Ib3BzQWRkcmVzc1trXSA9IE5VTEw7CiAgICAgICAgfQogICAgfQogICAgaWYgKGl0ZW0tPnRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzVHlwZSA9PSAyKSB7CiAgICAgICAgaW50ICAgICAgICAgICAgIGljbXBfc29jayA9IDA7ICAvKiByZWNlaXZlIChpY21wKSBzb2NrZXQgZmlsZSBkZXNjcmlwdG9yICovCiAgICAgICAgaW50ICAgICAgICAgICAgIHNuZHNvY2sgPSAwOyAgICAvKiBzZW5kICh1ZHApIHNvY2tldCBmaWxlIGRlc2NyaXB0b3IgKi8KCiAgICAgICAgc3RydWN0IHNvY2thZGRyX2luNiB3aGVyZXRvOyAgICAvKiBXaG8gdG8gdHJ5IHRvIHJlYWNoICovCgogICAgICAgIHN0cnVjdCBzb2NrYWRkcl9pbjYgc2FkZHI7CiAgICAgICAgc3RydWN0IHNvY2thZGRyX2luNiBmaXJzdGhvcDsKICAgICAgICBjaGFyICAgICAgICAgICAqc291cmNlID0gTlVMTDsKICAgICAgICBjaGFyICAgICAgICAgICAqZGV2aWNlID0gTlVMTDsKICAgICAgICBjaGFyICAgICAgICAgICAqaG9zdG5hbWUgPSBOVUxMOwoKICAgICAgICBwaWRfdCAgICAgICAgICAgaWRlbnQgPSAwOwogICAgICAgIHVfc2hvcnQgICAgICAgICBwb3J0ID0gMzI3NjggKyA2NjY7ICAgICAvKiBzdGFydCB1ZHAgZGVzdCBwb3J0ICMgZm9yIHByb2JlIHBhY2tldHMgKi8KICAgICAgICBpbnQgICAgICAgICAgICAgb3B0aW9ucyA9IDA7ICAgIC8qIHNvY2tldCBvcHRpb25zICovCiAgICAgICAgaW50ICAgICAgICAgICAgIHdhaXR0aW1lID0gNTsgICAvKiB0aW1lIHRvIHdhaXQgZm9yIHJlc3BvbnNlIChpbiBzZWNvbmRzKSAqLwoKICAgICAgICBjaGFyICAgICAgICAgICAqc2VuZGJ1ZmYgPSBOVUxMOwogICAgICAgIGludCAgICAgICAgICAgICBkYXRhbGVuID0gc2l6ZW9mKHN0cnVjdCBwa3RfZm9ybWF0KTsKCiAgICAgICAgdV9jaGFyICAgICAgICAgIHBhY2tldFs1MTJdOyAgICAvKiBsYXN0IGluYm91bmQgKGljbXApIHBhY2tldCAqLwoKICAgICAgICBjaGFyICAgICAgICAgICAgcGFbNjRdOwogICAgICAgIHN0cnVjdCBob3N0ZW50ICpocCA9IE5VTEw7CiAgICAgICAgc3RydWN0IHNvY2thZGRyX2luNiBmcm9tLCAqdG8gPSBOVUxMOwogICAgICAgIGludCAgICAgICAgICAgICBpID0gMCwgb24gPSAwLCBwcm9iZSA9IDAsIHNlcSA9IDAsIHRvcyA9CiAgICAgICAgICAgIDAsIHR0bCA9IDA7CiAgICAgICAgaW50ICAgICAgICAgICAgIHNvY2tldF9lcnJubyA9IDA7CgogICAgICAgIGljbXBfc29jayA9IHNvY2tldChBRl9JTkVUNiwgU09DS19SQVcsIElQUFJPVE9fSUNNUFY2KTsKICAgICAgICBzb2NrZXRfZXJybm8gPSBlcnJubzsKCiAgICAgICAgc2V0dWlkKGdldHVpZCgpKTsKCiAgICAgICAgb24gPSAxOwogICAgICAgIHNlcSA9IHRvcyA9IDA7CiAgICAgICAgdG8gPSAoc3RydWN0IHNvY2thZGRyX2luNiAqKSAmd2hlcmV0bzsKCiAgICAgICAgaG9zdG5hbWUgPQogICAgICAgICAgICAoY2hhciAqKSBtYWxsb2MoaXRlbS0+dHJhY2VSb3V0ZUN0bFRhcmdldEFkZHJlc3NMZW4gKyAxKTsKICAgICAgICBtZW1jcHkoaG9zdG5hbWUsIGl0ZW0tPnRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzLAogICAgICAgICAgICAgICBpdGVtLT50cmFjZVJvdXRlQ3RsVGFyZ2V0QWRkcmVzc0xlbiArIDEpOwogICAgICAgIGhvc3RuYW1lW2l0ZW0tPnRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzTGVuXSA9ICdcMCc7CgogICAgICAgIHNldGxpbmVidWYoc3Rkb3V0KTsKCiAgICAgICAgbWVtc2V0KCZ3aGVyZXRvLCAnXDAnLCBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luNikpOwoKICAgICAgICB0by0+c2luNl9mYW1pbHkgPSBBRl9JTkVUNjsKICAgICAgICB0by0+c2luNl9wb3J0ID0gaHRvbnMocG9ydCk7CgogICAgICAgIGlmIChpbmV0X3B0b24oQUZfSU5FVDYsIGhvc3RuYW1lLCAmdG8tPnNpbjZfYWRkcikgPD0gMCkgewogICAgICAgICAgICBocCA9IGdldGhvc3RieW5hbWUyKGhvc3RuYW1lLCBBRl9JTkVUNik7CiAgICAgICAgICAgIGlmIChocCAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICBtZW1tb3ZlKChjYWRkcl90KSAmIHRvLT5zaW42X2FkZHIsIGhwLT5oX2FkZHIsIDE2KTsKICAgICAgICAgICAgICAgIGhvc3RuYW1lID0gKGNoYXIgKikgaHAtPmhfbmFtZTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICh2b2lkKSBmcHJpbnRmKHN0ZGVyciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0cmFjZXJvdXRlOiB1bmtub3duIGhvc3QgJXNcbiIsIGhvc3RuYW1lKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmaXJzdGhvcCA9ICp0bzsKCiAgICAgICAgZGF0YWxlbiA9IGl0ZW0tPnRyYWNlUm91dGVDdGxEYXRhU2l6ZTsKICAgICAgICBpZiAoZGF0YWxlbiA8IChpbnQpIHNpemVvZihzdHJ1Y3QgcGt0X2Zvcm1hdCkKICAgICAgICAgICAgfHwgZGF0YWxlbiA+PSBNQVhQQUNLRVQpIHsKICAgICAgICAgICAgRnByaW50ZihzdGRlcnIsCiAgICAgICAgICAgICAgICAgICAgInRyYWNlcm91dGU6IHBhY2tldCBzaXplIG11c3QgYmUgJWQgPD0gcyA8ICVkLlxuIiwKICAgICAgICAgICAgICAgICAgICAoaW50KSBzaXplb2Yoc3RydWN0IHBrdF9mb3JtYXQpLCBNQVhQQUNLRVQpOwogICAgICAgICAgICBkYXRhbGVuID0gMTY7CiAgICAgICAgfQoKICAgICAgICBpZGVudCA9IGdldHBpZCgpOwoKICAgICAgICBzZW5kYnVmZiA9IG1hbGxvYyhkYXRhbGVuKTsKICAgICAgICBpZiAoc2VuZGJ1ZmYgPT0gTlVMTCkgewogICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIm1hbGxvYyBmYWlsZWRcbiIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBpZiAoaWNtcF9zb2NrIDwgMCkgewogICAgICAgICAgICBlcnJubyA9IHNvY2tldF9lcnJubzsKICAgICAgICAgICAgcGVycm9yKCJ0cmFjZXJvdXRlNjogaWNtcCBzb2NrZXQiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgaWYgKG9wdGlvbnMgJiBTT19ERUJVRykKICAgICAgICAgICAgc2V0c29ja29wdChpY21wX3NvY2ssIFNPTF9TT0NLRVQsIFNPX0RFQlVHLAogICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopICZvbiwgc2l6ZW9mKG9uKSk7CiAgICAgICAgaWYgKG9wdGlvbnMgJiBTT19ET05UUk9VVEUpCiAgICAgICAgICAgIHNldHNvY2tvcHQoaWNtcF9zb2NrLCBTT0xfU09DS0VULCBTT19ET05UUk9VVEUsCiAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikgJm9uLCBzaXplb2Yob24pKTsKCiAgICAgICAgaWYgKChzbmRzb2NrID0gc29ja2V0KEFGX0lORVQ2LCBTT0NLX0RHUkFNLCAwKSkgPCAwKSB7CiAgICAgICAgICAgIHBlcnJvcigidHJhY2Vyb3V0ZTogVURQIHNvY2tldCIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQojaWZkZWYgU09fU05EQlVGCiAgICAgICAgaWYgKHNldHNvY2tvcHQoc25kc29jaywgU09MX1NPQ0tFVCwgU09fU05EQlVGLCAoY2hhciAqKSAmZGF0YWxlbiwKICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoZGF0YWxlbikpIDwgMCkgewogICAgICAgICAgICBwZXJyb3IoInRyYWNlcm91dGU6IFNPX1NOREJVRiIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNPX1NOREJVRiAqLwoKICAgICAgICBpZiAob3B0aW9ucyAmIFNPX0RFQlVHKQogICAgICAgICAgICAodm9pZCkgc2V0c29ja29wdChzbmRzb2NrLCBTT0xfU09DS0VULCBTT19ERUJVRywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikgJm9uLCBzaXplb2Yob24pKTsKICAgICAgICBpZiAob3B0aW9ucyAmIFNPX0RPTlRST1VURSkKICAgICAgICAgICAgKHZvaWQpIHNldHNvY2tvcHQoc25kc29jaywgU09MX1NPQ0tFVCwgU09fRE9OVFJPVVRFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKSAmb24sIHNpemVvZihvbikpOwoKICAgICAgICBpZiAoc291cmNlID09IE5VTEwpIHsKICAgICAgICAgICAgc29ja2xlbl90ICAgICAgIGFsZW47CiAgICAgICAgICAgIGludCAgICAgICAgICAgICBwcm9iZV9mZCA9IHNvY2tldChBRl9JTkVUNiwgU09DS19ER1JBTSwgMCk7CgogICAgICAgICAgICBpZiAocHJvYmVfZmQgPCAwKSB7CiAgICAgICAgICAgICAgICBwZXJyb3IoInNvY2tldCIpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChkZXZpY2UpIHsKICAgICAgICAgICAgICAgIGlmIChzZXRzb2Nrb3B0CiAgICAgICAgICAgICAgICAgICAgKHByb2JlX2ZkLCBTT0xfU09DS0VULCBTT19CSU5EVE9ERVZJQ0UsIGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgc3RybGVuKGRldmljZSkgKyAxKSA9PSAtMSkKICAgICAgICAgICAgICAgICAgICBwZXJyb3IoIldBUk5JTkc6IGludGVyZmFjZSBpcyBpZ25vcmVkIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZmlyc3Rob3Auc2luNl9wb3J0ID0gaHRvbnMoMTAyNSk7CiAgICAgICAgICAgIGlmIChjb25uZWN0CiAgICAgICAgICAgICAgICAocHJvYmVfZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJmZpcnN0aG9wLAogICAgICAgICAgICAgICAgIHNpemVvZihmaXJzdGhvcCkpID09IC0xKSB7CiAgICAgICAgICAgICAgICBwZXJyb3IoImNvbm5lY3QiKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBhbGVuID0gc2l6ZW9mKHNhZGRyKTsKICAgICAgICAgICAgaWYgKGdldHNvY2tuYW1lKHByb2JlX2ZkLCAoc3RydWN0IHNvY2thZGRyICopICZzYWRkciwgJmFsZW4pID09CiAgICAgICAgICAgICAgICAtMSkgewogICAgICAgICAgICAgICAgcGVycm9yKCJnZXRzb2NrbmFtZSIpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHNhZGRyLnNpbjZfcG9ydCA9IDA7CiAgICAgICAgICAgIGNsb3NlKHByb2JlX2ZkKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBtZW1zZXQoJnNhZGRyLCAnXDAnLCBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luNikpOwogICAgICAgICAgICBzYWRkci5zaW42X2ZhbWlseSA9IEFGX0lORVQ2OwogICAgICAgICAgICBpZiAoaW5ldF9wdG9uKEFGX0lORVQ2LCBzb3VyY2UsICZzYWRkci5zaW42X2FkZHIpIDwgMCkgewogICAgICAgICAgICAgICAgUHJpbnRmKCJ0cmFjZXJvdXRlOiB1bmtub3duIGFkZHIgJXNcbiIsIHNvdXJjZSk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmIChiaW5kKHNuZHNvY2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikgJnNhZGRyLCBzaXplb2Yoc2FkZHIpKSA8IDApIHsKICAgICAgICAgICAgcGVycm9yKCJ0cmFjZXJvdXRlOiBiaW5kIHNlbmRpbmcgc29ja2V0Iik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgaWYgKGJpbmQoaWNtcF9zb2NrLCAoc3RydWN0IHNvY2thZGRyICopICZzYWRkciwgc2l6ZW9mKHNhZGRyKSkgPCAwKSB7CiAgICAgICAgICAgIHBlcnJvcigidHJhY2Vyb3V0ZTogYmluZCBpY21wNiBzb2NrZXQiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgRnByaW50ZihzdGRlcnIsICJ0cmFjZXJvdXRlIHRvICVzICglcykiLCBob3N0bmFtZSwKICAgICAgICAgICAgICAgIGluZXRfbnRvcChBRl9JTkVUNiwgJnRvLT5zaW42X2FkZHIsIHBhLCA2NCkpOwoKICAgICAgICBGcHJpbnRmKHN0ZGVyciwgIiBmcm9tICVzIiwKICAgICAgICAgICAgICAgIGluZXRfbnRvcChBRl9JTkVUNiwgJnNhZGRyLnNpbjZfYWRkciwgcGEsIDY0KSk7CiAgICAgICAgRnByaW50ZihzdGRlcnIsICIsICVsdSBob3BzIG1heCwgJWQgYnl0ZSBwYWNrZXRzXG4iLAogICAgICAgICAgICAgICAgaXRlbS0+dHJhY2VSb3V0ZUN0bE1heFR0bCwgZGF0YWxlbik7CiAgICAgICAgKHZvaWQpIGZmbHVzaChzdGRlcnIpOwoKCiAgICAgICAgc3RydWN0IHRyYWNlUm91dGVSZXN1bHRzVGFibGVfZGF0YSAqU3RvcmFnZVJlc3VsdHMgPSBOVUxMOwogICAgICAgIG5ldHNubXBfdmFyaWFibGVfbGlzdCAqdmFyc19yZXN1bHRzID0gTlVMTDsKCiAgICAgICAgc3RydWN0IHRyYWNlUm91dGVIb3BzVGFibGVfZGF0YSAqdGVtcCA9IE5VTEw7CiAgICAgICAgc3RydWN0IHRyYWNlUm91dGVIb3BzVGFibGVfZGF0YSAqY3VycmVudF90ZW1wID0gTlVMTDsKICAgICAgICBzdHJ1Y3QgdHJhY2VSb3V0ZUhvcHNUYWJsZV9kYXRhICpjdXJyZW50ID0gTlVMTDsKCiAgICAgICAgdW5zaWduZWQgbG9uZyAgIGluZGV4ID0gMDsKCiAgICAgICAgc3RydWN0IHRyYWNlUm91dGVQcm9iZUhpc3RvcnlUYWJsZV9kYXRhICp0ZW1wX2hpcyA9IE5VTEw7CiAgICAgICAgc3RydWN0IHRyYWNlUm91dGVQcm9iZUhpc3RvcnlUYWJsZV9kYXRhICpjdXJyZW50X3RlbXBfaGlzID0gTlVMTDsKCiAgICAgICAgc25tcF92YXJsaXN0X2FkZF92YXJpYWJsZSgmdmFyc19yZXN1bHRzLCBOVUxMLCAwLCBBU05fT0NURVRfU1RSLCAoY2hhciAqKSBpdGVtLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleCwgaXRlbS0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXhMZW4pOyAgICAgLyogIHRyYWNlUm91dGVDdGxPd25lckluZGV4ICAqLwogICAgICAgIHNubXBfdmFybGlzdF9hZGRfdmFyaWFibGUoJnZhcnNfcmVzdWx0cywgTlVMTCwgMCwgQVNOX09DVEVUX1NUUiwgKGNoYXIgKikgaXRlbS0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lLCBpdGVtLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWVMZW4pOyAvKiAgdHJhY2VSb3V0ZUN0bFRlc3ROYW1lICAqLwogICAgICAgIGlmICgoU3RvcmFnZVJlc3VsdHMgPQogICAgICAgICAgICAgaGVhZGVyX2NvbXBsZXhfZ2V0KHRyYWNlUm91dGVSZXN1bHRzVGFibGVTdG9yYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcnNfcmVzdWx0cykpID09IE5VTEwpCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICBzbm1wX2ZyZWVfdmFyYmluZCh2YXJzX3Jlc3VsdHMpOwogICAgICAgIHZhcnNfcmVzdWx0cyA9IE5VTEw7CgogICAgICAgIGZvciAodHRsID0gaXRlbS0+dHJhY2VSb3V0ZUN0bEluaXRpYWxUdGw7CiAgICAgICAgICAgICB0dGwgPD0gaXRlbS0+dHJhY2VSb3V0ZUN0bE1heFR0bDsgKyt0dGwpIHsKICAgICAgICAgICAgc3RydWN0IGluNl9hZGRyIGxhc3RhZGRyID0geyB7ezAsfX0gfTsKICAgICAgICAgICAgaW50ICAgICAgICAgICAgIGdvdF90aGVyZSA9IDA7CiAgICAgICAgICAgIGludCAgICAgICAgICAgICB1bnJlYWNoYWJsZSA9IDA7CiAgICAgICAgICAgIHRpbWVfdCAgICAgICAgICB0aW1lcCA9IDA7CiAgICAgICAgICAgIFByaW50ZigiJTJkICIsIHR0bCk7CgoKICAgICAgICAgICAgU3RvcmFnZVJlc3VsdHMtPnRyYWNlUm91dGVSZXN1bHRzQ3VySG9wQ291bnQgPSB0dGw7CiAgICAgICAgICAgIGlmIChpdGVtLT50cmFjZVJvdXRlQ3RsQ3JlYXRlSG9wc0VudHJpZXMgPT0gMSkgewogICAgICAgICAgICAgICAgaWYgKHR0bCA9PSBpdGVtLT50cmFjZVJvdXRlQ3RsSW5pdGlhbFR0bCkgewoKICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgayA9IDA7CiAgICAgICAgICAgICAgICAgICAgY291bnQgPSB0cmFjZVJvdXRlSG9wc1RhYmxlX2NvdW50KGl0ZW0pOwogICAgICAgICAgICAgICAgICAgIHN0cnVjdCB0cmFjZVJvdXRlSG9wc1RhYmxlX2RhdGEgKlN0b3JhZ2VUbXAgPSBOVUxMOwogICAgICAgICAgICAgICAgICAgIHN0cnVjdCBoZWFkZXJfY29tcGxleF9pbmRleCAqaGNpcHRyMiA9IE5VTEw7CiAgICAgICAgICAgICAgICAgICAgbmV0c25tcF92YXJpYWJsZV9saXN0ICp2YXJzID0gTlVMTDsKICAgICAgICAgICAgICAgICAgICBvaWQgICAgICAgICAgICAgbmV3b2lkW01BWF9PSURfTEVOXTsKICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICAgbmV3b2lkX2xlbjsKCiAgICAgICAgICAgICAgICAgICAgc25tcF92YXJsaXN0X2FkZF92YXJpYWJsZSgmdmFycywgTlVMTCwgMCwgQVNOX09DVEVUX1NUUiwgKGNoYXIgKikgaXRlbS0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXgsIGl0ZW0tPnRyYWNlUm91dGVDdGxPd25lckluZGV4TGVuKTsgLyogdHJhY2VSb3V0ZUN0bE93bmVySW5kZXggKi8KICAgICAgICAgICAgICAgICAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzLCBOVUxMLCAwLCBBU05fT0NURVRfU1RSLCAoY2hhciAqKSBpdGVtLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWUsIGl0ZW0tPnRyYWNlUm91dGVDdGxUZXN0TmFtZUxlbik7ICAgICAvKiB0cmFjZVJvdXRlQ3RsVGVzdE5hbWUgKi8KCiAgICAgICAgICAgICAgICAgICAgaGVhZGVyX2NvbXBsZXhfZ2VuZXJhdGVfb2lkKG5ld29pZCwgJm5ld29pZF9sZW4sIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIHZhcnMpOwoKICAgICAgICAgICAgICAgICAgICBzbm1wX2ZyZWVfdmFyYmluZCh2YXJzKTsKICAgICAgICAgICAgICAgICAgICB2YXJzID0gTlVMTDsKCiAgICAgICAgICAgICAgICAgICAgZm9yIChoY2lwdHIyID0gdHJhY2VSb3V0ZUhvcHNUYWJsZVN0b3JhZ2U7CiAgICAgICAgICAgICAgICAgICAgICAgICBoY2lwdHIyICE9IE5VTEw7IGhjaXB0cjIgPSBoY2lwdHIyLT5uZXh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzbm1wX29pZF9jb21wYXJlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmV3b2lkLCBuZXdvaWRfbGVuLCBoY2lwdHIyLT5uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld29pZF9sZW4pID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0b3JhZ2VUbXAgPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcl9jb21wbGV4X2V4dHJhY3RfZW50cnkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJnRyYWNlUm91dGVIb3BzVGFibGVTdG9yYWdlLCBoY2lwdHIyKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRfSG9wc0FkZHJlc3Nba10gPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopIG1hbGxvYyhTdG9yYWdlVG1wLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VSb3V0ZUhvcHNJcFRndEFkZHJlc3NMZW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvbGRfSG9wc0FkZHJlc3Nba10gPT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXQoMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRfSG9wc0FkZHJlc3Nba10gPSBuZXRzbm1wX21lbWR1cCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlSG9wc0lwVGd0QWRkcmVzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdG9yYWdlVG1wLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZVJvdXRlSG9wc0lwVGd0QWRkcmVzc0xlbiArIDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkX0hvcHNBZGRyZXNzW2tdW1N0b3JhZ2VUbXAtPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlUm91dGVIb3BzSXBUZ3RBZGRyZXNzTGVuXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJ1wwJzsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrKys7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdHJhY2VSb3V0ZUhvcHNUYWJsZV9kZWwoaXRlbSk7CiAgICAgICAgICAgICAgICAgICAgaW5kZXggPSAwOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHRlbXAgPSBTTk1QX01BTExPQ19TVFJVQ1QodHJhY2VSb3V0ZUhvcHNUYWJsZV9kYXRhKTsKICAgICAgICAgICAgICAgIHRlbXAtPnRyYWNlUm91dGVDdGxPd25lckluZGV4ID0KICAgICAgICAgICAgICAgICAgICAoY2hhciAqKSBtYWxsb2MoaXRlbS0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXhMZW4gKyAxKTsKICAgICAgICAgICAgICAgIG1lbWNweSh0ZW1wLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleCwKICAgICAgICAgICAgICAgICAgICAgICBpdGVtLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleCwKICAgICAgICAgICAgICAgICAgICAgICBpdGVtLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleExlbiArIDEpOwogICAgICAgICAgICAgICAgdGVtcC0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXhbaXRlbS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZVJvdXRlQ3RsT3duZXJJbmRleExlbl0gPQogICAgICAgICAgICAgICAgICAgICdcMCc7CiAgICAgICAgICAgICAgICB0ZW1wLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleExlbiA9CiAgICAgICAgICAgICAgICAgICAgaXRlbS0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXhMZW47CgogICAgICAgICAgICAgICAgdGVtcC0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lID0KICAgICAgICAgICAgICAgICAgICAoY2hhciAqKSBtYWxsb2MoaXRlbS0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lTGVuICsgMSk7CiAgICAgICAgICAgICAgICBtZW1jcHkodGVtcC0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lLAogICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPnRyYWNlUm91dGVDdGxUZXN0TmFtZSwKICAgICAgICAgICAgICAgICAgICAgICBpdGVtLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWVMZW4gKyAxKTsKICAgICAgICAgICAgICAgIHRlbXAtPnRyYWNlUm91dGVDdGxUZXN0TmFtZVtpdGVtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZVJvdXRlQ3RsVGVzdE5hbWVMZW5dID0KICAgICAgICAgICAgICAgICAgICAnXDAnOwogICAgICAgICAgICAgICAgdGVtcC0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lTGVuID0KICAgICAgICAgICAgICAgICAgICBpdGVtLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWVMZW47CgogICAgICAgICAgICAgICAgLyogYWRkIGxvY2sgdG8gcHJvdGVjdCAqLwogICAgICAgICAgICAgICAgcHRocmVhZF9tdXRleF90IGNvdW50ZXJfbXV0ZXggPSBQVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSOwogICAgICAgICAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZjb3VudGVyX211dGV4KTsKICAgICAgICAgICAgICAgIHRlbXAtPnRyYWNlUm91dGVIb3BzSG9wSW5kZXggPSArK2luZGV4OwogICAgICAgICAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmNvdW50ZXJfbXV0ZXgpOwogICAgICAgICAgICAgICAgLyogZW5kc2Fkc2Fkc2FkICovCgoKICAgICAgICAgICAgICAgIHRlbXAtPnRyYWNlUm91dGVIb3BzSXBUZ3RBZGRyZXNzVHlwZSA9IDA7CiAgICAgICAgICAgICAgICB0ZW1wLT50cmFjZVJvdXRlSG9wc0lwVGd0QWRkcmVzcyA9IHN0cmR1cCgiIik7CiAgICAgICAgICAgICAgICB0ZW1wLT50cmFjZVJvdXRlSG9wc0lwVGd0QWRkcmVzc0xlbiA9IDA7CiAgICAgICAgICAgICAgICB0ZW1wLT50cmFjZVJvdXRlSG9wc01pblJ0dCA9IDA7CiAgICAgICAgICAgICAgICB0ZW1wLT50cmFjZVJvdXRlSG9wc01heFJ0dCA9IDA7CiAgICAgICAgICAgICAgICB0ZW1wLT50cmFjZVJvdXRlSG9wc0F2ZXJhZ2VSdHQgPSAwOwogICAgICAgICAgICAgICAgdGVtcC0+dHJhY2VSb3V0ZUhvcHNSdHRTdW1PZlNxdWFyZXMgPSAwOwogICAgICAgICAgICAgICAgdGVtcC0+dHJhY2VSb3V0ZUhvcHNTZW50UHJvYmVzID0gMDsKICAgICAgICAgICAgICAgIHRlbXAtPnRyYWNlUm91dGVIb3BzUHJvYmVSZXNwb25zZXMgPSAwOwoKICAgICAgICAgICAgICAgIHRlbXAtPnRyYWNlUm91dGVIb3BzTGFzdEdvb2RQcm9iZUxlbiA9IDA7CiAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT0gMSkKICAgICAgICAgICAgICAgICAgICBpdGVtLT50cmFjZVJvdXRlSG9wcyA9IHRlbXA7CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAoY3VycmVudF90ZW1wKS0+bmV4dCA9IHRlbXA7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY3VycmVudF90ZW1wID0gdGVtcDsKCiAgICAgICAgICAgICAgICBpZiAoaW5kZXggPj0gaXRlbS0+dHJhY2VSb3V0ZUN0bE1heFR0bCkgewogICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfdGVtcC0+bmV4dCA9IE5VTEw7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKGl0ZW0tPnRyYWNlUm91dGVIb3BzICE9IE5VTEwpCgogICAgICAgICAgICAgICAgICAgIGlmICh0cmFjZVJvdXRlSG9wc1RhYmxlX2FkZChjdXJyZW50X3RlbXApICE9CiAgICAgICAgICAgICAgICAgICAgICAgIFNOTVBFUlJfU1VDQ0VTUykKICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVIb3BzVGFibGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVnaXN0ZXJlZCBhbiBlbnRyeSBlcnJvclxuIikpOwoKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBtYXhSdHQgPSAwOwogICAgICAgICAgICByZWdpc3RlciB1bnNpZ25lZCBsb25nIG1pblJ0dCA9IDA7CiAgICAgICAgICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgYXZlcmFnZVJ0dCA9IDA7CiAgICAgICAgICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgc3VtUnR0ID0gMDsKICAgICAgICAgICAgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyByZXNwb25zZVByb2JlID0gMDsKICAgICAgICAgICAgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBzdW1PZlNxdWFyZSA9IDA7CiAgICAgICAgICAgIGZvciAocHJvYmUgPSAwOyBwcm9iZSA8IG5wcm9iZXM7ICsrcHJvYmUpIHsKICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBjYyA9IDAsIHJlc2V0X3RpbWVyID0gMDsKICAgICAgICAgICAgICAgIHN0cnVjdCB0aW1ldmFsICB0MSwgdDI7CiAgICAgICAgICAgICAgICBzdHJ1Y3QgdGltZXpvbmUgdHo7CiAgICAgICAgICAgICAgICByZWdpc3RlciB1bnNpZ25lZCBsb25nIFJ0dCA9IDA7CgogICAgICAgICAgICAgICAgZ2V0dGltZW9mZGF5KCZ0MSwgJnR6KTsKCiAgICAgICAgICAgICAgICBzZW5kX3Byb2JlX3Y2KCsrc2VxLCB0dGwsIHNlbmRidWZmLCBpZGVudCwgJnR6LCBzbmRzb2NrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhbGVuLCAmd2hlcmV0bywgaG9zdG5hbWUpOwogICAgICAgICAgICAgICAgcmVzZXRfdGltZXIgPSAxOwoKICAgICAgICAgICAgICAgIHdoaWxlICgoY2MgPQogICAgICAgICAgICAgICAgICAgICAgICB3YWl0X2Zvcl9yZXBseV92NihpY21wX3NvY2ssICZmcm9tLCByZXNldF90aW1lciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FpdHRpbWUsIGljbXBfc29jaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2V0KSkgIT0gMCkgewogICAgICAgICAgICAgICAgICAgIGdldHRpbWVvZmRheSgmdDIsICZ0eik7CiAgICAgICAgICAgICAgICAgICAgdGltZXAgPSAwOwogICAgICAgICAgICAgICAgICAgIHRpbWUoJnRpbWVwKTsKICAgICAgICAgICAgICAgICAgICBpZiAoKGkgPQogICAgICAgICAgICAgICAgICAgICAgICAgcGFja2V0X29rX3Y2KHBhY2tldCwgY2MsICZmcm9tLCBzZXEsICZ0MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudCkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlc2V0X3RpbWVyID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1lbWNtcAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKCZmcm9tLnNpbjZfYWRkciwgJmxhc3RhZGRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpKSkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSgmbGFzdGFkZHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZyb20uc2luNl9hZGRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgUnR0ID0gZGVsdGFUKCZ0MSwgJnQyKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VQcm9iZSA9IHJlc3BvbnNlUHJvYmUgKyAxOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvYmUgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluUnR0ID0gUnR0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4UnR0ID0gUnR0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZlcmFnZVJ0dCA9IFJ0dDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bVJ0dCA9IFJ0dDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bU9mU3F1YXJlID0gUnR0ICogUnR0OwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFJ0dCA8IG1pblJ0dCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5SdHQgPSBSdHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoUnR0ID4gbWF4UnR0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFJ0dCA9IFJ0dDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bVJ0dCA9IChzdW1SdHQpICsgUnR0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZlcmFnZVJ0dCA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91bmQoKGRvdWJsZSkgKHN1bVJ0dCkgLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkb3VibGUpIHJlc3BvbnNlUHJvYmUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VtT2ZTcXVhcmUgPSBzdW1PZlNxdWFyZSArIFJ0dCAqIFJ0dDsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgU3RvcmFnZVJlc3VsdHMtPnRyYWNlUm91dGVSZXN1bHRzQ3VyUHJvYmVDb3VudCA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9iZSArIDE7CgoKICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChpIC0gMSkgewogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIElDTVA2X0RTVF9VTlJFQUNIX05PUE9SVDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrZ290X3RoZXJlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIElDTVA2X0RTVF9VTlJFQUNIX05PUk9VVEU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICArK3VucmVhY2hhYmxlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRmKCIgIU4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIElDTVA2X0RTVF9VTlJFQUNIX0FERFI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICArK3VucmVhY2hhYmxlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRmKCIgIUgiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBJQ01QNl9EU1RfVU5SRUFDSF9BRE1JTjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrdW5yZWFjaGFibGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmludGYoIiAhUyIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHJlc2V0X3RpbWVyID0gMDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChjYyA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgdGltZXAgPSAwOwogICAgICAgICAgICAgICAgICAgIHRpbWUoJnRpbWVwKTsKICAgICAgICAgICAgICAgICAgICBQcmludGYoIiAqIik7CiAgICAgICAgICAgICAgICAgICAgUnR0ID0gKGl0ZW0tPnRyYWNlUm91dGVDdGxUaW1lT3V0KSAqIDEwMDA7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKGl0ZW0tPnRyYWNlUm91dGVDdGxNYXhSb3dzICE9IDApIHsKCiAgICAgICAgICAgICAgICAgICAgdGVtcF9oaXMgPQogICAgICAgICAgICAgICAgICAgICAgICBTTk1QX01BTExPQ19TVFJVQ1QKICAgICAgICAgICAgICAgICAgICAgICAgKHRyYWNlUm91dGVQcm9iZUhpc3RvcnlUYWJsZV9kYXRhKTsKICAgICAgICAgICAgICAgICAgICB0ZW1wX2hpcy0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXggPQogICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKSBtYWxsb2MoaXRlbS0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXhMZW4gKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7CiAgICAgICAgICAgICAgICAgICAgbWVtY3B5KHRlbXBfaGlzLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPnRyYWNlUm91dGVDdGxPd25lckluZGV4TGVuICsgMSk7CiAgICAgICAgICAgICAgICAgICAgdGVtcF9oaXMtPnRyYWNlUm91dGVDdGxPd25lckluZGV4W2l0ZW0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZVJvdXRlQ3RsT3duZXJJbmRleExlbl0KICAgICAgICAgICAgICAgICAgICAgICAgPSAnXDAnOwogICAgICAgICAgICAgICAgICAgIHRlbXBfaGlzLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleExlbiA9CiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPnRyYWNlUm91dGVDdGxPd25lckluZGV4TGVuOwoKICAgICAgICAgICAgICAgICAgICB0ZW1wX2hpcy0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lID0KICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikgbWFsbG9jKGl0ZW0tPnRyYWNlUm91dGVDdGxUZXN0TmFtZUxlbiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsKICAgICAgICAgICAgICAgICAgICBtZW1jcHkodGVtcF9oaXMtPnRyYWNlUm91dGVDdGxUZXN0TmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWVMZW4gKyAxKTsKICAgICAgICAgICAgICAgICAgICB0ZW1wX2hpcy0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lW2l0ZW0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VSb3V0ZUN0bFRlc3ROYW1lTGVuXQogICAgICAgICAgICAgICAgICAgICAgICA9ICdcMCc7CiAgICAgICAgICAgICAgICAgICAgdGVtcF9oaXMtPnRyYWNlUm91dGVDdGxUZXN0TmFtZUxlbiA9CiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPnRyYWNlUm91dGVDdGxUZXN0TmFtZUxlbjsKCiAgICAgICAgICAgICAgICAgICAgLyogYWRkIGxvY2sgdG8gcHJvdGVjdCAqLwogICAgICAgICAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdCBjb3VudGVyX211dGV4ID0KICAgICAgICAgICAgICAgICAgICAgICAgUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUjsKICAgICAgICAgICAgICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJmNvdW50ZXJfbXV0ZXgpOwogICAgICAgICAgICAgICAgICAgIGlmIChpdGVtLT50cmFjZVJvdXRlUHJvYmVIaXN0b3J5TWF4SW5kZXggPj0KICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpICgyMTQ3NDgzNjQ3KSkKICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS0+dHJhY2VSb3V0ZVByb2JlSGlzdG9yeU1heEluZGV4ID0gMDsKICAgICAgICAgICAgICAgICAgICB0ZW1wX2hpcy0+dHJhY2VSb3V0ZVByb2JlSGlzdG9yeUluZGV4ID0KICAgICAgICAgICAgICAgICAgICAgICAgKysoaXRlbS0+dHJhY2VSb3V0ZVByb2JlSGlzdG9yeU1heEluZGV4KTsKICAgICAgICAgICAgICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmY291bnRlcl9tdXRleCk7CiAgICAgICAgICAgICAgICAgICAgLyogZW5kc2Fkc2Fkc2FkICovCiAgICAgICAgICAgICAgICAgICAgdGVtcF9oaXMtPnRyYWNlUm91dGVQcm9iZUhpc3RvcnlIb3BJbmRleCA9IHR0bDsKICAgICAgICAgICAgICAgICAgICB0ZW1wX2hpcy0+dHJhY2VSb3V0ZVByb2JlSGlzdG9yeVByb2JlSW5kZXggPSBwcm9iZSArIDE7CgogICAgICAgICAgICAgICAgICAgIHRlbXBfaGlzLT50cmFjZVJvdXRlUHJvYmVIaXN0b3J5SEFkZHJUeXBlID0gMjsKICAgICAgICAgICAgICAgICAgICB0ZW1wX2hpcy0+dHJhY2VSb3V0ZVByb2JlSGlzdG9yeUhBZGRyID0KICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikKICAgICAgICAgICAgICAgICAgICAgICAgbWFsbG9jKHN0cmxlbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGluZXRfbnRvcAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBRl9JTkVUNiwgJmZyb20uc2luNl9hZGRyLCBwYSwgNjQpKSArIDEpOwogICAgICAgICAgICAgICAgICAgIHRlbXBfaGlzLT50cmFjZVJvdXRlUHJvYmVIaXN0b3J5SEFkZHIgPQogICAgICAgICAgICAgICAgICAgICAgICBzdHJkdXAoaW5ldF9udG9wCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQUZfSU5FVDYsICZmcm9tLnNpbjZfYWRkciwgcGEsIDY0KSk7CiAgICAgICAgICAgICAgICAgICAgdGVtcF9oaXMtPgogICAgICAgICAgICAgICAgICAgICAgICB0cmFjZVJvdXRlUHJvYmVIaXN0b3J5SEFkZHJbc3RybGVuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5ldF9udG9wCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFGX0lORVQ2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZnJvbS5zaW42X2FkZHIsIHBhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2NCkpXSA9ICdcMCc7CiAgICAgICAgICAgICAgICAgICAgdGVtcF9oaXMtPnRyYWNlUm91dGVQcm9iZUhpc3RvcnlIQWRkckxlbiA9CiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmxlbihpbmV0X250b3AKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBRl9JTkVUNiwgJmZyb20uc2luNl9hZGRyLCBwYSwgNjQpKTsKCiAgICAgICAgICAgICAgICAgICAgdGVtcF9oaXMtPnRyYWNlUm91dGVQcm9iZUhpc3RvcnlSZXNwb25zZSA9IFJ0dDsKICAgICAgICAgICAgICAgICAgICB0ZW1wX2hpcy0+dHJhY2VSb3V0ZVByb2JlSGlzdG9yeVN0YXR1cyA9IDE7CiAgICAgICAgICAgICAgICAgICAgdGVtcF9oaXMtPnRyYWNlUm91dGVQcm9iZUhpc3RvcnlMYXN0UkMgPSAwOwoKCQkgICAgdGVtcF9oaXMtPnRyYWNlUm91dGVQcm9iZUhpc3RvcnlUaW1lX3RpbWUgPSB0aW1lcDsKICAgICAgICAgICAgICAgICAgICB0ZW1wX2hpcy0+dHJhY2VSb3V0ZVByb2JlSGlzdG9yeVRpbWUgPSBuZXRzbm1wX21lbWR1cCgKICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZV9uX3RpbWUoJnRpbWVwLAoJCQkgICAgJnRlbXBfaGlzLT50cmFjZVJvdXRlUHJvYmVIaXN0b3J5VGltZUxlbiksIDExKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKHByb2JlID09IDApCiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPnRyYWNlUm91dGVQcm9iZUhpcyA9IHRlbXBfaGlzOwogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAoY3VycmVudF90ZW1wX2hpcyktPm5leHQgPSB0ZW1wX2hpczsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfdGVtcF9oaXMgPSB0ZW1wX2hpczsKCiAgICAgICAgICAgICAgICAgICAgaWYgKHByb2JlICsgMSA+PSBucHJvYmVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfdGVtcF9oaXMtPm5leHQgPSBOVUxMOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0tPnRyYWNlUm91dGVQcm9iZUhpcyAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0cmFjZVJvdXRlUHJvYmVIaXN0b3J5VGFibGVfY291bnQoaXRlbSkgPAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS0+dHJhY2VSb3V0ZUN0bE1heFJvd3MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0cmFjZVJvdXRlUHJvYmVIaXN0b3J5VGFibGVfYWRkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGN1cnJlbnRfdGVtcF9oaXMpICE9IFNOTVBFUlJfU1VDQ0VTUykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZVByb2JlSGlzdG9yeVRhYmxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVnaXN0ZXJlZCBhbiBlbnRyeSBlcnJvclxuIikpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VSb3V0ZVByb2JlSGlzdG9yeVRhYmxlX2RlbExhc3QoaXRlbSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHJhY2VSb3V0ZVByb2JlSGlzdG9yeVRhYmxlX2FkZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjdXJyZW50X3RlbXBfaGlzKSAhPSBTTk1QRVJSX1NVQ0NFU1MpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVQcm9iZUhpc3RvcnlUYWJsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlZ2lzdGVyZWQgYW4gZW50cnkgZXJyb3JcbiIpKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIH0KCQkgICAgfQoKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChpdGVtLT50cmFjZVJvdXRlQ3RsQ3JlYXRlSG9wc0VudHJpZXMgPT0gMSkgewogICAgICAgICAgICAgICAgICAgIG5ldHNubXBfdmFyaWFibGVfbGlzdCAqdmFyc19ob3BzID0gTlVMTDsKICAgICAgICAgICAgICAgICAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzX2hvcHMsIE5VTEwsIDAsIEFTTl9PQ1RFVF9TVFIsIChjaGFyICopIGl0ZW0tPnRyYWNlUm91dGVDdGxPd25lckluZGV4LCBpdGVtLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleExlbik7ICAgIC8qICB0cmFjZVJvdXRlQ3RsT3duZXJJbmRleCAgKi8KICAgICAgICAgICAgICAgICAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzX2hvcHMsIE5VTEwsIDAsIEFTTl9PQ1RFVF9TVFIsIChjaGFyICopIGl0ZW0tPnRyYWNlUm91dGVDdGxUZXN0TmFtZSwgaXRlbS0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lTGVuKTsgICAgICAgIC8qICB0cmFjZVJvdXRlQ3RsVGVzdE5hbWUgICovCiAgICAgICAgICAgICAgICAgICAgc25tcF92YXJsaXN0X2FkZF92YXJpYWJsZSgmdmFyc19ob3BzLCBOVUxMLCAwLCBBU05fVU5TSUdORUQsIChjaGFyICopICZpbmRleCwgc2l6ZW9mKGluZGV4KSk7ICAgICAgIC8qICB0cmFjZVJvdXRlSG9wc0luZGV4ICAqLwogICAgICAgICAgICAgICAgICAgIGlmICgoY3VycmVudCA9CiAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJfY29tcGxleF9nZXQodHJhY2VSb3V0ZUhvcHNUYWJsZVN0b3JhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyc19ob3BzKSkgPT0gTlVMTCkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIGN1cnJlbnQtPnRyYWNlUm91dGVIb3BzSXBUZ3RBZGRyZXNzVHlwZSA9IDI7CiAgICAgICAgICAgICAgICAgICAgY3VycmVudC0+dHJhY2VSb3V0ZUhvcHNJcFRndEFkZHJlc3MgPQogICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKQogICAgICAgICAgICAgICAgICAgICAgICBtYWxsb2Moc3RybGVuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5ldF9udG9wCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFGX0lORVQ2LCAmZnJvbS5zaW42X2FkZHIsIHBhLCA2NCkpICsgMSk7CiAgICAgICAgICAgICAgICAgICAgY3VycmVudC0+dHJhY2VSb3V0ZUhvcHNJcFRndEFkZHJlc3MgPQogICAgICAgICAgICAgICAgICAgICAgICBzdHJkdXAoaW5ldF9udG9wCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQUZfSU5FVDYsICZmcm9tLnNpbjZfYWRkciwgcGEsIDY0KSk7CiAgICAgICAgICAgICAgICAgICAgY3VycmVudC0+CiAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlUm91dGVIb3BzSXBUZ3RBZGRyZXNzW3N0cmxlbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5ldF9udG9wCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQUZfSU5FVDYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZyb20uc2luNl9hZGRyLCBwYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2NCkpXSA9ICdcMCc7CgogICAgICAgICAgICAgICAgICAgIGlmIChjb3VudCAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJjbXAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbGRfSG9wc0FkZHJlc3NbaW5kZXggLSAxXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50LT50cmFjZVJvdXRlSG9wc0lwVGd0QWRkcmVzcykgIT0gMCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWcgPSAxOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgY3VycmVudC0+dHJhY2VSb3V0ZUhvcHNJcFRndEFkZHJlc3NMZW4gPQogICAgICAgICAgICAgICAgICAgICAgICBzdHJsZW4oaW5ldF9udG9wCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQUZfSU5FVDYsICZmcm9tLnNpbjZfYWRkciwgcGEsIDY0KSk7CiAgICAgICAgICAgICAgICAgICAgY3VycmVudC0+dHJhY2VSb3V0ZUhvcHNNaW5SdHQgPSBtaW5SdHQ7CiAgICAgICAgICAgICAgICAgICAgY3VycmVudC0+dHJhY2VSb3V0ZUhvcHNNYXhSdHQgPSBtYXhSdHQ7CiAgICAgICAgICAgICAgICAgICAgY3VycmVudC0+dHJhY2VSb3V0ZUhvcHNBdmVyYWdlUnR0ID0gYXZlcmFnZVJ0dDsKICAgICAgICAgICAgICAgICAgICBjdXJyZW50LT50cmFjZVJvdXRlSG9wc1J0dFN1bU9mU3F1YXJlcyA9IHN1bU9mU3F1YXJlOwogICAgICAgICAgICAgICAgICAgIGN1cnJlbnQtPnRyYWNlUm91dGVIb3BzU2VudFByb2JlcyA9IHByb2JlICsgMTsKICAgICAgICAgICAgICAgICAgICBjdXJyZW50LT50cmFjZVJvdXRlSG9wc1Byb2JlUmVzcG9uc2VzID0gcmVzcG9uc2VQcm9iZTsKCQkgICAgY3VycmVudC0+dHJhY2VSb3V0ZUhvcHNMYXN0R29vZFByb2JlX3RpbWUgPSB0aW1lcDsKICAgICAgICAgICAgICAgICAgICBjdXJyZW50LT50cmFjZVJvdXRlSG9wc0xhc3RHb29kUHJvYmUgPSAKICAgICAgICAgICAgICAgICAgICAgICAgbmV0c25tcF9tZW1kdXAoZGF0ZV9uX3RpbWUoJnRpbWVwLAoJCQkgICAgJmN1cnJlbnQtPnRyYWNlUm91dGVIb3BzTGFzdEdvb2RQcm9iZUxlbiksIDExKTsKCiAgICAgICAgICAgICAgICAgICAgc25tcF9mcmVlX3ZhcmJpbmQodmFyc19ob3BzKTsKICAgICAgICAgICAgICAgICAgICB2YXJzX2hvcHMgPSBOVUxMOwogICAgICAgICAgICAgICAgfQoKCiAgICAgICAgICAgICAgICAodm9pZCkgZmZsdXNoKHN0ZG91dCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcHV0Y2hhcignXG4nKTsKCgogICAgICAgICAgICBpZiAoZ290X3RoZXJlIHx8IHVucmVhY2hhYmxlID49IG5wcm9iZXMgLSAxKSB7CgoKICAgICAgICAgICAgICAgIGlmIChnb3RfdGhlcmUgIT0gMCkgewogICAgICAgICAgICAgICAgICAgIFN0b3JhZ2VSZXN1bHRzLT50cmFjZVJvdXRlUmVzdWx0c1Rlc3RBdHRlbXB0cyA9CiAgICAgICAgICAgICAgICAgICAgICAgIFN0b3JhZ2VSZXN1bHRzLT50cmFjZVJvdXRlUmVzdWx0c1Rlc3RBdHRlbXB0cyArIDE7CgogICAgICAgICAgICAgICAgICAgIFN0b3JhZ2VSZXN1bHRzLT50cmFjZVJvdXRlUmVzdWx0c1Rlc3RTdWNjZXNzZXMgPQogICAgICAgICAgICAgICAgICAgICAgICBTdG9yYWdlUmVzdWx0cy0+dHJhY2VSb3V0ZVJlc3VsdHNUZXN0U3VjY2Vzc2VzICsgMTsKCQkgICAgU3RvcmFnZVJlc3VsdHMtPnRyYWNlUm91dGVSZXN1bHRzTGFzdEdvb2RQYXRoX3RpbWUgPSB0aW1lcDsKICAgICAgICAgICAgICAgICAgICBTdG9yYWdlUmVzdWx0cy0+dHJhY2VSb3V0ZVJlc3VsdHNMYXN0R29vZFBhdGggPQogICAgICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX21lbWR1cChkYXRlX25fdGltZSgmdGltZXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlUmVzdWx0cy0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZVJvdXRlUmVzdWx0c0xhc3RHb29kUGF0aExlbiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExKTsKICAgICAgICAgICAgICAgICAgICBpZiAoKGl0ZW0tPgogICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VSb3V0ZUN0bFRyYXBHZW5lcmF0aW9uWzBdICYKICAgICAgICAgICAgICAgICAgICAgICAgIFRSQUNFUk9VVEVUUkFQR0VORVJBVElPTl9URVNUQ09NUExFVEVEKSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiVEVTVCBjb21wbGV0ZWQhXG4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VuZF90cmFjZVJvdXRlX3RyYXAoaXRlbSwgdHJhY2VSb3V0ZVRlc3RDb21wbGV0ZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodHJhY2VSb3V0ZVRlc3RDb21wbGV0ZWQpIC8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9pZCkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBTdG9yYWdlUmVzdWx0cy0+dHJhY2VSb3V0ZVJlc3VsdHNUZXN0QXR0ZW1wdHMgPQogICAgICAgICAgICAgICAgICAgICAgICBTdG9yYWdlUmVzdWx0cy0+dHJhY2VSb3V0ZVJlc3VsdHNUZXN0QXR0ZW1wdHMgKyAxOwogICAgICAgICAgICAgICAgICAgIGlmICgoaXRlbS0+CiAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZVJvdXRlQ3RsVHJhcEdlbmVyYXRpb25bMF0gJgogICAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0VST1VURVRSQVBHRU5FUkFUSU9OX1RFU1RGQUlMRUQpICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJ0ZXN0IEZhaWxlZCFcbiIpOwogICAgICAgICAgICAgICAgICAgICAgICBzZW5kX3RyYWNlUm91dGVfdHJhcChpdGVtLCB0cmFjZVJvdXRlVGVzdEZhaWxlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHRyYWNlUm91dGVUZXN0RmFpbGVkKSAvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihvaWQpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIH0gZWxzZSBpZiAodHRsID09IGl0ZW0tPnRyYWNlUm91dGVDdGxNYXhUdGwKICAgICAgICAgICAgICAgICAgICAgICAmJiAocHJvYmUgKyAxKSA9PSBucHJvYmVzKSB7CiAgICAgICAgICAgICAgICBTdG9yYWdlUmVzdWx0cy0+dHJhY2VSb3V0ZVJlc3VsdHNUZXN0QXR0ZW1wdHMgPQogICAgICAgICAgICAgICAgICAgIFN0b3JhZ2VSZXN1bHRzLT50cmFjZVJvdXRlUmVzdWx0c1Rlc3RBdHRlbXB0cyArIDE7CgogICAgICAgICAgICAgICAgaWYgKChpdGVtLT4KICAgICAgICAgICAgICAgICAgICAgdHJhY2VSb3V0ZUN0bFRyYXBHZW5lcmF0aW9uWzBdICYKICAgICAgICAgICAgICAgICAgICAgVFJBQ0VST1VURVRSQVBHRU5FUkFUSU9OX1RFU1RGQUlMRUQpICE9IDApIHsKICAgICAgICAgICAgICAgICAgICBwcmludGYoInRlc3QgRmFpbGVkIVxuIik7CiAgICAgICAgICAgICAgICAgICAgc2VuZF90cmFjZVJvdXRlX3RyYXAoaXRlbSwgdHJhY2VSb3V0ZVRlc3RGYWlsZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHRyYWNlUm91dGVUZXN0RmFpbGVkKSAvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9pZCkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgIH0KCiAgICAgICAgY2xvc2Uoc25kc29jayk7CgogICAgICAgIGlmIChmbGFnID09IDEpIHsKICAgICAgICAgICAgcHJpbnRmKCJwYXRoIGNoYW5nZWQhXG4iKTsKICAgICAgICAgICAgc2VuZF90cmFjZVJvdXRlX3RyYXAoaXRlbSwgdHJhY2VSb3V0ZVBhdGhDaGFuZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih0cmFjZVJvdXRlUGF0aENoYW5nZSkgLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yob2lkKSk7CiAgICAgICAgfQoKICAgICAgICBpbnQgICAgICAgICAgICAgayA9IDA7CiAgICAgICAgZm9yIChrID0gMDsgayA8IGNvdW50OyBrKyspIHsKICAgICAgICAgICAgZnJlZShvbGRfSG9wc0FkZHJlc3Nba10pOwogICAgICAgICAgICBvbGRfSG9wc0FkZHJlc3Nba10gPSBOVUxMOwogICAgICAgIH0KCiAgICB9CiAgICByZXR1cm47Cn0KCgppbnQKd2FpdF9mb3JfcmVwbHkocmVnaXN0ZXIgaW50IHNvY2ssIHJlZ2lzdGVyIHN0cnVjdCBzb2NrYWRkcl9pbiAqZnJvbXAsCiAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNvbnN0IHN0cnVjdCB0aW1ldmFsICp0cCwgdV9jaGFyICogcGFja2V0LAogICAgICAgICAgICAgICBpbnQgd2FpdHRpbWUpCnsKICAgIGZkX3NldCAgICAgICAgICBmZHM7CiAgICBzdHJ1Y3QgdGltZXZhbCAgbm93LCB3YWl0OwogICAgc3RydWN0IHRpbWV6b25lIHR6OwogICAgcmVnaXN0ZXIgaW50ICAgIGNjID0gMDsKICAgIHNvY2tsZW5fdCAgICAgICBmcm9tbGVuID0gc2l6ZW9mKCpmcm9tcCk7CgogICAgRkRfWkVSTygmZmRzKTsKICAgIEZEX1NFVChzb2NrLCAmZmRzKTsKICAgIHdhaXQudHZfc2VjID0gdHAtPnR2X3NlYyArIHdhaXR0aW1lOwogICAgd2FpdC50dl91c2VjID0gdHAtPnR2X3VzZWM7CiAgICAodm9pZCkgZ2V0dGltZW9mZGF5KCZub3csICZ0eik7CiAgICB0dnN1Yigmd2FpdCwgJm5vdyk7CiAgICBpZiAoc2VsZWN0KHNvY2sgKyAxLCAmZmRzLCBOVUxMLCBOVUxMLCAmd2FpdCkgPiAwKQogICAgICAgIGNjID0gcmVjdmZyb20oc29jaywgKGNoYXIgKikgcGFja2V0LCA1MTIsIDAsCiAgICAgICAgICAgICAgICAgICAgICAoc3RydWN0IHNvY2thZGRyICopIGZyb21wLCAmZnJvbWxlbik7CiAgICByZXR1cm4gKGNjKTsKfQoKCmludAp3YWl0X2Zvcl9yZXBseV92NihpbnQgc29jaywgc3RydWN0IHNvY2thZGRyX2luNiAqZnJvbSwgaW50IHJlc2V0X3RpbWVyLAogICAgICAgICAgICAgICAgICBpbnQgd2FpdHRpbWUsIGludCBpY21wX3NvY2ssIHVfY2hhciAqIHBhY2tldCkKewogICAgZmRfc2V0ICAgICAgICAgIGZkczsKICAgIHN0YXRpYyBzdHJ1Y3QgdGltZXZhbCB3YWl0OwogICAgaW50ICAgICAgICAgICAgIGNjID0gMDsKICAgIHNvY2tsZW5fdCAgICAgICBmcm9tbGVuID0gc2l6ZW9mKCpmcm9tKTsKCiAgICBGRF9aRVJPKCZmZHMpOwogICAgRkRfU0VUKHNvY2ssICZmZHMpOwogICAgaWYgKHJlc2V0X3RpbWVyKSB7CiAgICAgICAgLyoKICAgICAgICAgKiB0cmFjZXJvdXRlIGNvdWxkIGhhbmcgaWYgc29tZW9uZSBlbHNlIGhhcyBhIHBpbmcKICAgICAgICAgKiBydW5uaW5nIGFuZCBvdXIgSUNNUCByZXBseSBnZXRzIGRyb3BwZWQgYnV0IHdlIGRvbid0CiAgICAgICAgICogcmVhbGl6ZSBpdCBiZWNhdXNlIHdlIGtlZXAgd2FraW5nIHVwIHRvIGhhbmRsZSB0aG9zZQogICAgICAgICAqIG90aGVyIElDTVAgcGFja2V0cyB0aGF0IGtlZXAgY29taW5nIGluLiAgVG8gZml4IHRoaXMsCiAgICAgICAgICogInJlc2V0X3RpbWVyIiB3aWxsIG9ubHkgYmUgdHJ1ZSBpZiB0aGUgbGFzdCBwYWNrZXQgdGhhdAogICAgICAgICAqIGNhbWUgaW4gd2FzIGZvciB1cyBvciBpZiB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHdlJ3JlCiAgICAgICAgICogd2FpdGluZyBmb3IgYSByZXBseSBzaW5jZSBzZW5kaW5nIG91dCBhIHByb2JlLiAgTm90ZQogICAgICAgICAqIHRoYXQgdGhpcyB0YWtlcyBhZHZhbnRhZ2Ugb2YgdGhlIHNlbGVjdCgpIGZlYXR1cmUgb24KICAgICAgICAgKiBMaW51eCB3aGVyZSB0aGUgcmVtYWluaW5nIHRpbWVvdXQgaXMgd3JpdHRlbiB0byB0aGUKICAgICAgICAgKiBzdHJ1Y3QgdGltZXZhbCBhcmVhLgogICAgICAgICAqLwogICAgICAgIHdhaXQudHZfc2VjID0gd2FpdHRpbWU7CiAgICAgICAgd2FpdC50dl91c2VjID0gMDsKICAgIH0KCiAgICBpZiAoc2VsZWN0KHNvY2sgKyAxLCAmZmRzLCAoZmRfc2V0ICopIDAsIChmZF9zZXQgKikgMCwgJndhaXQpID4gMCkgewogICAgICAgIGNjID0gcmVjdmZyb20oaWNtcF9zb2NrLCAoY2hhciAqKSBwYWNrZXQsIDUxMiwgMCwKICAgICAgICAgICAgICAgICAgICAgIChzdHJ1Y3Qgc29ja2FkZHIgKikgZnJvbSwgJmZyb21sZW4pOwogICAgfQoKICAgIHJldHVybiAoY2MpOwp9CgovKgogKiBzZW5kX3Byb2JlKCkgdXNlcyB0aGUgQlNELWlzaCB1ZHBpcGhkci4KICogRGVmaW5lIHNvbWV0aGluZyB0aGF0IGxvb2tzIGVub3VnaCBsaWtlIGl0IHRvIHdvcmsuCiAqLwpzdHJ1Y3QgdWRwaXBoZHIgewogICBzdHJ1Y3QgaXBoZHIgdWlfaTsKICAgc3RydWN0IHVkcGhkciB1aV91Owp9OwojZGVmaW5lIHVpX3NyYyB1aV9pLnNhZGRyCiNkZWZpbmUgdWlfZHN0IHVpX2kuZGFkZHIKI2RlZmluZSB1aV9wciB1aV9pLnByb3RvY29sCiNkZWZpbmUgdWlfbGVuIHVpX2kudG90X2xlbgoKdm9pZApzZW5kX3Byb2JlKHN0cnVjdCBzb2NrYWRkcl9pbiAqd2hlcmV0bywgcmVnaXN0ZXIgaW50IHNlcSwgaW50IHR0bCwKICAgICAgICAgICByZWdpc3RlciBzdHJ1Y3QgdGltZXZhbCAqdHAsIHJlZ2lzdGVyIHN0cnVjdCBpcCAqb3V0aXAsCiAgICAgICAgICAgcmVnaXN0ZXIgc3RydWN0IHVkcGhkciAqb3V0dWRwLCBpbnQgcGFja2xlbiwgaW50IG9wdGxlbiwKICAgICAgICAgICBjaGFyICpob3N0bmFtZSwgdV9zaG9ydCBpZGVudCwgaW50IHNuZHNvY2ssIHVfc2hvcnQgcG9ydCwKICAgICAgICAgICBzdHJ1Y3Qgb3V0ZGF0YSAqb3V0ZGF0YSkKewogICAgcmVnaXN0ZXIgaW50ICAgIGNjID0gMDsKICAgIHJlZ2lzdGVyIHN0cnVjdCB1ZHBpcGhkciAqdWkgPSBOVUxMLCAqb3VpID0gTlVMTDsKICAgIHN0cnVjdCBpcCAgICAgICB0aXA7CgogICAgb3V0aXAtPmlwX3R0bCA9IHR0bDsKI2lmbmRlZiBfX2hwdXgKICAgIG91dGlwLT5pcF9pZCA9IGh0b25zKGlkZW50ICsgc2VxKTsKI2VuZGlmCgogICAgLyoKICAgICAqIEluIG1vc3QgY2FzZXMsIHRoZSBrZXJuZWwgd2lsbCByZWNhbGN1bGF0ZSB0aGUgaXAgY2hlY2tzdW0uCiAgICAgKiBCdXQgd2UgbXVzdCBkbyBpdCBhbnl3YXkgc28gdGhhdCB0aGUgdWRwIGNoZWNrc3VtIGNvbWVzIG91dAogICAgICogcmlnaHQuCiAgICAgKi8KCiAgICBvdXRpcC0+aXBfc3VtID0KICAgICAgICBpbl9jaGVja3N1bSgodV9zaG9ydCAqKSBvdXRpcCwgc2l6ZW9mKCpvdXRpcCkgKyBvcHRsZW4pOwogICAgaWYgKG91dGlwLT5pcF9zdW0gPT0gMCkKICAgICAgICBvdXRpcC0+aXBfc3VtID0gMHhmZmZmOwoKCiAgICAvKgogICAgICogUGF5bG9hZCAKICAgICAqLwogICAgb3V0ZGF0YS0+c2VxID0gc2VxOwogICAgb3V0ZGF0YS0+dHRsID0gdHRsOwogICAgb3V0ZGF0YS0+dHYgPSAqdHA7CgoKICAgIG91dHVkcC0+ZGVzdCA9IGh0b25zKHBvcnQgKyBzZXEpOwoKCiAgICAvKgogICAgICogQ2hlY2tzdW0gKHdlIG11c3Qgc2F2ZSBhbmQgcmVzdG9yZSBpcCBoZWFkZXIpIAogICAgICovCiAgICB0aXAgPSAqb3V0aXA7CiAgICB1aSA9IChzdHJ1Y3QgdWRwaXBoZHIgKikgb3V0aXA7CiAgICBvdWkgPSAoc3RydWN0IHVkcGlwaGRyICopICZ0aXA7CiAgICAvKgogICAgICogRWFzaWVyIHRvIHplcm8gYW5kIHB1dCBiYWNrIHRoaW5ncyB0aGF0IGFyZSBvayAKICAgICAqLwogICAgbWVtc2V0KChjaGFyICopIHVpLCAwLCBzaXplb2YodWktPnVpX2kpKTsKICAgIHVpLT51aV9zcmMgPSBvdWktPnVpX3NyYzsKICAgIHVpLT51aV9kc3QgPSBvdWktPnVpX2RzdDsKICAgIHVpLT51aV9wciA9IG91aS0+dWlfcHI7CiAgICB1aS0+dWlfbGVuID0gb3V0dWRwLT5sZW47CiAgICBvdXR1ZHAtPmNoZWNrID0gMDsKICAgIG91dHVkcC0+Y2hlY2sgPSBpbl9jaGVja3N1bSgodV9zaG9ydCAqKSB1aSwgcGFja2xlbik7CiAgICBpZiAob3V0dWRwLT5jaGVjayA9PSAwKQogICAgICAgIG91dHVkcC0+Y2hlY2sgPSAweGZmZmY7CiAgICAqb3V0aXAgPSB0aXA7CgoKICAgIC8qCiAgICAgKiBYWFggdW5kb2N1bWVudGVkIGRlYnVnZ2luZyBoYWNrIAogICAgICovCgoKI2lmICFkZWZpbmVkKElQX0hEUklOQ0wpICYmIGRlZmluZWQoSVBfVFRMKQogICAgcHJpbnRmKCJ0dGxcbiIpOwogICAgaWYgKHNldHNvY2tvcHQoc25kc29jaywgSVBQUk9UT19JUCwgSVBfVFRMLAogICAgICAgICAgICAgICAgICAgKGNoYXIgKikgJnR0bCwgc2l6ZW9mKHR0bCkpIDwgMCkgewogICAgICAgIEZwcmludGYoc3RkZXJyLCAiJXM6IHNldHNvY2tvcHQgdHRsICVkOiAlc1xuIiwKICAgICAgICAgICAgICAgICJ0cmFjZXJvdXRlIiwgdHRsLCBzdHJlcnJvcihlcnJubykpOwogICAgICAgIGV4aXQoMSk7CiAgICB9CiNlbmRpZgoKI2lmZGVmIF9faHB1eAoKICAgIFByaW50Zigid2hlcmV0bz0lc1xuIiwKICAgICAgICAgICBpbmV0X250b2EoKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikgd2hlcmV0byktPnNpbl9hZGRyKSk7CiAgICBjYyA9IHNlbmR0byhzbmRzb2NrLCAoY2hhciAqKSBvdXR1ZHAsCiAgICAgICAgICAgICAgICBwYWNrbGVuIC0gKHNpemVvZigqb3V0aXApICsgb3B0bGVuKSwgMCwgd2hlcmV0bywKICAgICAgICAgICAgICAgIHNpemVvZigqd2hlcmV0bykpOwogICAgaWYgKGNjID4gMCkKICAgICAgICBjYyArPSBzaXplb2YoKm91dGlwKSArIG9wdGxlbjsKI2Vsc2UKCiAgICBjYyA9IHNlbmR0byhzbmRzb2NrLCAoY2hhciAqKSBvdXRpcCwKICAgICAgICAgICAgICAgIHBhY2tsZW4sIDAsIHdoZXJldG8sIHNpemVvZigqd2hlcmV0bykpOwojZW5kaWYKICAgIGlmIChjYyA8IDAgfHwgY2MgIT0gcGFja2xlbikgewogICAgICAgIGlmIChjYyA8IDApCiAgICAgICAgICAgIEZwcmludGYoc3RkZXJyLCAiJXM6IHNlbmR0bzogJXNcbiIsICJ0cmFjZXJvdXRlIiwgc3RyZXJyb3IoZXJybm8pKTsKICAgICAgICBQcmludGYoIiVzOiB3cm90ZSAlcyAlZCBjaGFycywgcmV0PSVkXG4iLAogICAgICAgICAgICAgICAidHJhY2Vyb3V0ZSIsIGhvc3RuYW1lLCBwYWNrbGVuLCBjYyk7CiAgICAgICAgKHZvaWQpIGZmbHVzaChzdGRvdXQpOwogICAgfQp9CgoKCnZvaWQKc2VuZF9wcm9iZV92NihpbnQgc2VxLCBpbnQgdHRsLCBjaGFyICpzZW5kYnVmZiwgcGlkX3QgaWRlbnQsCiAgICAgICAgICAgICAgc3RydWN0IHRpbWV6b25lICp0eiwgaW50IHNuZHNvY2ssIGludCBkYXRhbGVuLAogICAgICAgICAgICAgIHN0cnVjdCBzb2NrYWRkcl9pbjYgKndoZXJldG8sIGNoYXIgKmhvc3RuYW1lKQp7CiAgICBzdHJ1Y3QgcGt0X2Zvcm1hdCAqcGt0ID0gKHN0cnVjdCBwa3RfZm9ybWF0ICopIHNlbmRidWZmOwogICAgaW50ICAgICAgICAgICAgIGkgPSAwOwoKICAgIHBrdC0+aWRlbnQgPSBodG9ubChpZGVudCk7CiAgICBwa3QtPnNlcSA9IGh0b25sKHNlcSk7CiAgICBnZXR0aW1lb2ZkYXkoJnBrdC0+dHYsIHR6KTsKCiAgICBpID0gc2V0c29ja29wdChzbmRzb2NrLCBTT0xfSVBWNiwgSVBWNl9VTklDQVNUX0hPUFMsICZ0dGwsCiAgICAgICAgICAgICAgICAgICBzaXplb2YoaW50KSk7CiAgICBpZiAoaSA8IDApIHsKICAgICAgICBwZXJyb3IoInNldHNvY2tvcHQiKTsKICAgICAgICBleGl0KDEpOwogICAgfQoKICAgIGRvIHsKICAgICAgICBpID0gc2VuZHRvKHNuZHNvY2ssIHNlbmRidWZmLCBkYXRhbGVuLCAwLAogICAgICAgICAgICAgICAgICAgKHN0cnVjdCBzb2NrYWRkciAqKSB3aGVyZXRvLAogICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbjYpKTsKICAgIH0gd2hpbGUgKGkgPCAwICYmIGVycm5vID09IEVDT05OUkVGVVNFRCk7CgogICAgaWYgKGkgPCAwIHx8IGkgIT0gZGF0YWxlbikgewogICAgICAgIGlmIChpIDwgMCkKICAgICAgICAgICAgcGVycm9yKCJzZW5kdG8iKTsKICAgICAgICBQcmludGYoInRyYWNlcm91dGU6IHdyb3RlICVzICVkIGNoYXJzLCByZXQ9JWRcbiIsIGhvc3RuYW1lLAogICAgICAgICAgICAgICBkYXRhbGVuLCBpKTsKICAgICAgICAodm9pZCkgZmZsdXNoKHN0ZG91dCk7CiAgICB9Cn0KCgp1bnNpZ25lZCBsb25nCmRlbHRhVChzdHJ1Y3QgdGltZXZhbCAqdDFwLCBzdHJ1Y3QgdGltZXZhbCAqdDJwKQp7CiAgICByZWdpc3RlciB1bnNpZ25lZCBsb25nIGR0OwoKICAgIGR0ID0gKHVuc2lnbmVkIGxvbmcpICgobG9uZykgKHQycC0+dHZfc2VjIC0gdDFwLT50dl9zZWMpICogMTAwMCArCiAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcpICh0MnAtPnR2X3VzZWMgLSB0MXAtPnR2X3VzZWMpIC8gMTAwMCk7CiAgICByZXR1cm4gKGR0KTsKfQoKCmludApwYWNrZXRfb2socmVnaXN0ZXIgdV9jaGFyICogYnVmLCBpbnQgY2MsIHJlZ2lzdGVyIHN0cnVjdCBzb2NrYWRkcl9pbiAqZnJvbSwKICAgICAgICAgIHJlZ2lzdGVyIGludCBzZXEsIHVfc2hvcnQgaWRlbnQsIGludCBwbXR1LCB1X3Nob3J0IHBvcnQpCnsKICAgIHJlZ2lzdGVyIHN0cnVjdCBpY21wICppY3AgPSBOVUxMOwogICAgcmVnaXN0ZXIgdV9jaGFyIHR5cGUsIGNvZGU7CiAgICByZWdpc3RlciBpbnQgICAgaGxlbiA9IDA7CiNpZm5kZWYgQVJDSEFJQwogICAgcmVnaXN0ZXIgc3RydWN0IGlwICppcCA9IE5VTEw7CgogICAgaXAgPSAoc3RydWN0IGlwICopIGJ1ZjsKICAgIGhsZW4gPSBpcC0+aXBfaGwgPDwgMjsKICAgIGlmIChjYyA8IGhsZW4gKyBJQ01QX01JTkxFTikgewoKICAgICAgICByZXR1cm4gKDApOwogICAgfQogICAgY2MgLT0gaGxlbjsKICAgIGljcCA9IChzdHJ1Y3QgaWNtcCAqKSAoYnVmICsgaGxlbik7CiNlbHNlCiAgICBpY3AgPSAoc3RydWN0IGljbXAgKikgYnVmOwojZW5kaWYKICAgIHR5cGUgPSBpY3AtPmljbXBfdHlwZTsKICAgIGNvZGUgPSBpY3AtPmljbXBfY29kZTsKICAgIC8qCiAgICAgKiBQYXRoIE1UVSBEaXNjb3ZlcnkgKFJGQzExOTEpIAogICAgICovCiAgICBpZiAoY29kZSAhPSBJQ01QX1VOUkVBQ0hfTkVFREZSQUcpCiAgICAgICAgcG10dSA9IDA7CiAgICBlbHNlIHsKI2lmZGVmIEhBVkVfSUNNUF9ORVhUTVRVCiAgICAgICAgcG10dSA9IG50b2hzKGljcC0+aWNtcF9uZXh0bXR1KTsKI2Vsc2UKICAgICAgICBwbXR1ID0gbnRvaHMoKChzdHJ1Y3QgbXlfcG10dSAqKSAmaWNwLT5pY21wX3ZvaWQpLT5pcG1fbmV4dG10dSk7CiNlbmRpZgogICAgfQogICAgaWYgKCh0eXBlID09IElDTVBfVElNWENFRUQgJiYgY29kZSA9PSBJQ01QX1RJTVhDRUVEX0lOVFJBTlMpIHx8CiAgICAgICAgdHlwZSA9PSBJQ01QX1VOUkVBQ0ggfHwgdHlwZSA9PSBJQ01QX0VDSE9SRVBMWSkgewogICAgICAgIHJlZ2lzdGVyIHN0cnVjdCBpcCAqaGlwOwogICAgICAgIHJlZ2lzdGVyIHN0cnVjdCB1ZHBoZHIgKnVwOwoKICAgICAgICBoaXAgPSAmaWNwLT5pY21wX2lwOwogICAgICAgIGhsZW4gPSBoaXAtPmlwX2hsIDw8IDI7CiAgICAgICAgdXAgPSAoc3RydWN0IHVkcGhkciAqKSAoKHVfY2hhciAqKSBoaXAgKyBobGVuKTsKICAgICAgICAvKgogICAgICAgICAqIFhYWCA4IGlzIGEgbWFnaWMgbnVtYmVyIAogICAgICAgICAqLwogICAgICAgIGlmIChobGVuICsgMTIgPD0gY2MgJiYKICAgICAgICAgICAgaGlwLT5pcF9wID09IElQUFJPVE9fVURQICYmCiAgICAgICAgICAgIHVwLT5zb3VyY2UgPT0gaHRvbnMoaWRlbnQpICYmIHVwLT5kZXN0ID09IGh0b25zKHBvcnQgKyBzZXEpKQogICAgICAgICAgICByZXR1cm4gKHR5cGUgPT0gSUNNUF9USU1YQ0VFRCA/IC0xIDogY29kZSArIDEpOwogICAgfQoKCiAgICByZXR1cm4gKDApOwp9CgoKCgppbnQKcGFja2V0X29rX3Y2KHVfY2hhciAqIGJ1ZiwgaW50IGNjLCBzdHJ1Y3Qgc29ja2FkZHJfaW42ICpmcm9tLCBpbnQgc2VxLAogICAgICAgICAgICAgc3RydWN0IHRpbWV2YWwgKnR2LCBwaWRfdCBpZGVudCkKewogICAgc3RydWN0IGljbXA2X2hkciAqaWNwID0gTlVMTDsKICAgIHVfY2hhciAgICAgICAgICB0eXBlLCBjb2RlOwoKICAgIGljcCA9IChzdHJ1Y3QgaWNtcDZfaGRyICopIGJ1ZjsKCiAgICB0eXBlID0gaWNwLT5pY21wNl90eXBlOwogICAgY29kZSA9IGljcC0+aWNtcDZfY29kZTsKCiAgICBpZiAoKHR5cGUgPT0gSUNNUDZfVElNRV9FWENFRURFRCAmJiBjb2RlID09IElDTVA2X1RJTUVfRVhDRUVEX1RSQU5TSVQpIHx8CiAgICAgICAgdHlwZSA9PSBJQ01QNl9EU1RfVU5SRUFDSCkgewogICAgICAgIHN0cnVjdCBpcDZfaGRyICAqaGlwID0gTlVMTDsKICAgICAgICBzdHJ1Y3QgdWRwaGRyICAqdXAgPSBOVUxMOwogICAgICAgIGludCAgICAgICAgICAgICBuZXh0aGRyID0gMDsKCiAgICAgICAgaGlwID0gKHN0cnVjdCBpcDZfaGRyICopIChpY3AgKyAxKTsKICAgICAgICB1cCA9IChzdHJ1Y3QgdWRwaGRyICopIChoaXAgKyAxKTsKICAgICAgICBuZXh0aGRyID0gaGlwLT5pcDZfbnh0OwoKICAgICAgICBpZiAobmV4dGhkciA9PSA0NCkgewogICAgICAgICAgICBuZXh0aGRyID0gKih1bnNpZ25lZCBjaGFyICopIHVwOwogICAgICAgICAgICB1cCsrOwogICAgICAgIH0KICAgICAgICBpZiAobmV4dGhkciA9PSBJUFBST1RPX1VEUCkgewogICAgICAgICAgICBzdHJ1Y3QgcGt0X2Zvcm1hdCAqcGt0OwoKICAgICAgICAgICAgcGt0ID0gKHN0cnVjdCBwa3RfZm9ybWF0ICopICh1cCArIDEpOwoKICAgICAgICAgICAgaWYgKG50b2hsKHBrdC0+aWRlbnQpID09IGlkZW50ICYmIG50b2hsKHBrdC0+c2VxKSA9PSBzZXEpIHsKICAgICAgICAgICAgICAgICp0diA9IHBrdC0+dHY7CiAgICAgICAgICAgICAgICByZXR1cm4gKHR5cGUgPT0gSUNNUDZfVElNRV9FWENFRURFRCA/IC0xIDogY29kZSArIDEpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgIH0KCiAgICByZXR1cm4gKDApOwp9CgoKLyoKICogQ2hlY2tzdW0gcm91dGluZSBmb3IgSW50ZXJuZXQgUHJvdG9jb2wgZmFtaWx5IGhlYWRlcnMgKEMgVmVyc2lvbikKICovCgp1X3Nob3J0CmluX2NoZWNrc3VtKHJlZ2lzdGVyIHVfc2hvcnQgKiBhZGRyLCByZWdpc3RlciBpbnQgbGVuKQp7CiAgICByZWdpc3RlciBpbnQgICAgbmxlZnQgPSBsZW47CiAgICByZWdpc3RlciB1X3Nob3J0ICp3ID0gYWRkcjsKICAgIHJlZ2lzdGVyIHVfc2hvcnQgYW5zd2VyOwogICAgcmVnaXN0ZXIgaW50ICAgIHN1bSA9IDA7CgogICAgLyoKICAgICAqICBPdXIgYWxnb3JpdGhtIGlzIHNpbXBsZSwgdXNpbmcgYSAzMiBiaXQgYWNjdW11bGF0b3IgKHN1bSksCiAgICAgKiAgd2UgYWRkIHNlcXVlbnRpYWwgMTYgYml0IHdvcmRzIHRvIGl0LCBhbmQgYXQgdGhlIGVuZCwgZm9sZAogICAgICogIGJhY2sgYWxsIHRoZSBjYXJyeSBiaXRzIGZyb20gdGhlIHRvcCAxNiBiaXRzIGludG8gdGhlIGxvd2VyCiAgICAgKiAgMTYgYml0cy4KICAgICAqLwogICAgd2hpbGUgKG5sZWZ0ID4gMSkgewogICAgICAgIHN1bSArPSAqdysrOwogICAgICAgIG5sZWZ0IC09IDI7CiAgICB9CgogICAgLyoKICAgICAqIG1vcCB1cCBhbiBvZGQgYnl0ZSwgaWYgbmVjZXNzYXJ5IAogICAgICovCiAgICBpZiAobmxlZnQgPT0gMSkKICAgICAgICBzdW0gKz0gKih1X2NoYXIgKikgdzsKCiAgICAvKgogICAgICogYWRkIGJhY2sgY2Fycnkgb3V0cyBmcm9tIHRvcCAxNiBiaXRzIHRvIGxvdyAxNiBiaXRzCiAgICAgKi8KICAgIHN1bSA9IChzdW0gPj4gMTYpICsgKHN1bSAmIDB4ZmZmZik7IC8qIGFkZCBoaSAxNiB0byBsb3cgMTYgKi8KICAgIHN1bSArPSAoc3VtID4+IDE2KTsgICAgICAgICAvKiBhZGQgY2FycnkgKi8KICAgIGFuc3dlciA9IH5zdW07ICAgICAgICAgICAgICAvKiB0cnVuY2F0ZSB0byAxNiBiaXRzICovCiAgICByZXR1cm4gKGFuc3dlcik7Cn0KCi8qCiAqIFN1YnRyYWN0IDIgdGltZXZhbCBzdHJ1Y3RzOiAgb3V0ID0gb3V0IC0gaW4uCiAqIE91dCBpcyBhc3N1bWVkIHRvIGJlID49IGluLgogKi8Kdm9pZAp0dnN1YihyZWdpc3RlciBzdHJ1Y3QgdGltZXZhbCAqb3V0LCByZWdpc3RlciBzdHJ1Y3QgdGltZXZhbCAqaW4pCnsKCiAgICBpZiAoKG91dC0+dHZfdXNlYyAtPSBpbi0+dHZfdXNlYykgPCAwKSB7CiAgICAgICAgLS1vdXQtPnR2X3NlYzsKICAgICAgICBvdXQtPnR2X3VzZWMgKz0gMTAwMDAwMDsKICAgIH0KICAgIG91dC0+dHZfc2VjIC09IGluLT50dl9zZWM7Cn0KCgpzdHJ1Y3QgaG9zdGluZm8gKgpnZXRob3N0aW5mbyhyZWdpc3RlciBjaGFyICpob3N0bmFtZSkKewogICAgcmVnaXN0ZXIgaW50ICAgIG47CiAgICByZWdpc3RlciBzdHJ1Y3QgaG9zdGVudCAqaHAgPSBOVUxMOwogICAgcmVnaXN0ZXIgc3RydWN0IGhvc3RpbmZvICpoaSA9IE5VTEw7CiAgICByZWdpc3RlciBjaGFyICoqcCA9IE5VTEw7CiAgICByZWdpc3RlciB1X2ludDMyX3QgYWRkciwgKmFwID0gTlVMTDsKCiAgICBpZiAoc3RybGVuKGhvc3RuYW1lKSA+IDY0KSB7CiAgICAgICAgRnByaW50ZihzdGRlcnIsICIlczogaG9zdG5hbWUgXCIlLjMycy4uLlwiIGlzIHRvbyBsb25nXG4iLAogICAgICAgICAgICAgICAgInRyYWNlcm91dGUiLCBob3N0bmFtZSk7CiAgICAgICAgZXhpdCgxKTsKICAgIH0KICAgIGhpID0gY2FsbG9jKDEsIHNpemVvZigqaGkpKTsKICAgIGlmIChoaSA9PSBOVUxMKSB7CiAgICAgICAgRnByaW50ZihzdGRlcnIsICIlczogY2FsbG9jICVzXG4iLCAidHJhY2Vyb3V0ZSIsIHN0cmVycm9yKGVycm5vKSk7CiAgICAgICAgZXhpdCgxKTsKICAgIH0KICAgIGFkZHIgPSBpbmV0X2FkZHIoaG9zdG5hbWUpOwogICAgaWYgKChpbnQzMl90KSBhZGRyICE9IC0xKSB7CiAgICAgICAgaGktPm5hbWUgPSBzdHJkdXAoaG9zdG5hbWUpOwogICAgICAgIGhpLT5uID0gMTsKICAgICAgICBoaS0+YWRkcnMgPSBjYWxsb2MoMSwgc2l6ZW9mKGhpLT5hZGRyc1swXSkpOwogICAgICAgIGlmIChoaS0+YWRkcnMgPT0gTlVMTCkgewogICAgICAgICAgICBGcHJpbnRmKHN0ZGVyciwgIiVzOiBjYWxsb2MgJXNcbiIsICJ0cmFjZXJvdXRlIiwgc3RyZXJyb3IoZXJybm8pKTsKICAgICAgICAgICAgZXhpdCgxKTsKICAgICAgICB9CiAgICAgICAgaGktPmFkZHJzWzBdID0gYWRkcjsKICAgICAgICByZXR1cm4gKGhpKTsKICAgIH0KCiAgICBocCA9IGdldGhvc3RieW5hbWUoaG9zdG5hbWUpOwogICAgaWYgKGhwID09IE5VTEwpIHsKICAgICAgICBGcHJpbnRmKHN0ZGVyciwgIiVzOiB1bmtub3duIGhvc3QgJXNcbiIsICJ0cmFjZXJvdXRlIiwgaG9zdG5hbWUpOwogICAgICAgIHByaW50ZigiaHA9TlVMTFxuIik7CiAgICAgICAgZXhpdCgxKTsKICAgIH0KICAgIGlmIChocC0+aF9hZGRydHlwZSAhPSBBRl9JTkVUIHx8IGhwLT5oX2xlbmd0aCAhPSA0KSB7CiAgICAgICAgRnByaW50ZihzdGRlcnIsICIlczogYmFkIGhvc3QgJXNcbiIsICJ0cmFjZXJvdXRlIiwgaG9zdG5hbWUpOwogICAgICAgIGV4aXQoMSk7CiAgICB9CiAgICBoaS0+bmFtZSA9IHN0cmR1cChocC0+aF9uYW1lKTsKICAgIGZvciAobiA9IDAsIHAgPSBocC0+aF9hZGRyX2xpc3Q7ICpwICE9IE5VTEw7ICsrbiwgKytwKQogICAgICAgIGNvbnRpbnVlOwogICAgaGktPm4gPSBuOwogICAgaGktPmFkZHJzID0gY2FsbG9jKG4sIHNpemVvZihoaS0+YWRkcnNbMF0pKTsKICAgIGlmIChoaS0+YWRkcnMgPT0gTlVMTCkgewogICAgICAgIEZwcmludGYoc3RkZXJyLCAiJXM6IGNhbGxvYyAlc1xuIiwgInRyYWNlcm91dGUiLCBzdHJlcnJvcihlcnJubykpOwogICAgICAgIGV4aXQoMSk7CiAgICB9CiAgICBmb3IgKGFwID0gaGktPmFkZHJzLCBwID0gaHAtPmhfYWRkcl9saXN0OyAqcCAhPSBOVUxMOyArK2FwLCArK3ApCiAgICAgICAgbWVtY3B5KGFwLCAqcCwgc2l6ZW9mKCphcCkpOwogICAgcmV0dXJuIChoaSk7Cn0KCnZvaWQKZnJlZWhvc3RpbmZvKHJlZ2lzdGVyIHN0cnVjdCBob3N0aW5mbyAqaGkpCnsKICAgIGlmIChoaS0+bmFtZSAhPSBOVUxMKSB7CiAgICAgICAgZnJlZShoaS0+bmFtZSk7CiAgICAgICAgaGktPm5hbWUgPSBOVUxMOwogICAgfQogICAgZnJlZSgoY2hhciAqKSBoaS0+YWRkcnMpOwogICAgZnJlZSgoY2hhciAqKSBoaSk7Cn0KCnZvaWQKc2V0c2luKHJlZ2lzdGVyIHN0cnVjdCBzb2NrYWRkcl9pbiAqc2luLCByZWdpc3RlciB1X2ludDMyX3QgYWRkcikKewoKICAgIG1lbXNldChzaW4sIDAsIHNpemVvZigqc2luKSk7CiNpZmRlZiBIQVZFX1NPQ0tBRERSX1NBX0xFTgogICAgc2luLT5zaW5fbGVuID0gc2l6ZW9mKCpzaW4pOwojZW5kaWYKICAgIHNpbi0+c2luX2ZhbWlseSA9IEFGX0lORVQ7CiAgICBzaW4tPnNpbl9hZGRyLnNfYWRkciA9IGFkZHI7Cn0KCgovKgogKiBSZXR1cm4gdGhlIHNvdXJjZSBhZGRyZXNzIGZvciB0aGUgZ2l2ZW4gZGVzdGluYXRpb24gYWRkcmVzcwogKi8KY29uc3QgY2hhciAgICAgKgpmaW5kc2FkZHIocmVnaXN0ZXIgY29uc3Qgc3RydWN0IHNvY2thZGRyX2luICp0bywKICAgICAgICAgIHJlZ2lzdGVyIHN0cnVjdCBzb2NrYWRkcl9pbiAqZnJvbSkKewogICAgcmVnaXN0ZXIgaW50ICAgIGksIG47CiAgICByZWdpc3RlciBGSUxFICAqZjsKICAgIHJlZ2lzdGVyIHVfaW50MzJfdCBtYXNrOwogICAgdV9pbnQzMl90ICAgICAgIGRlc3QsIHRtYXNrOwogICAgc3RydWN0IGlmYWRkcmxpc3QgKmFsOwogICAgY2hhciAgICAgICAgICAgIGJ1ZlsyNTZdLCB0ZGV2aWNlWzI1Nl0sIGRldmljZVsyNTZdOwogICAgc3RhdGljIGNoYXIgICAgIGVycmJ1ZlsxMzJdOwogICAgc3RhdGljIGNvbnN0IGNoYXIgcm91dGVbXSA9ICIvcHJvYy9uZXQvcm91dGUiOwoKICAgIGlmICgoZiA9IGZvcGVuKHJvdXRlLCAiciIpKSA9PSBOVUxMKSB7CiAgICAgICAgc3ByaW50ZihlcnJidWYsICJvcGVuICVzOiAlLjEyOHMiLCByb3V0ZSwgc3RyZXJyb3IoZXJybm8pKTsKICAgICAgICByZXR1cm4gKGVycmJ1Zik7CiAgICB9CgogICAgLyoKICAgICAqIEZpbmQgdGhlIGFwcHJvcHJpYXRlIGludGVyZmFjZSAKICAgICAqLwogICAgbiA9IDA7CiAgICBtYXNrID0gMDsKICAgIGRldmljZVswXSA9ICdcMCc7CiAgICB3aGlsZSAoZmdldHMoYnVmLCBzaXplb2YoYnVmKSwgZikgIT0gTlVMTCkgewogICAgICAgICsrbjsKICAgICAgICBpZiAobiA9PSAxICYmIHN0cm5jbXAoYnVmLCAiSWZhY2UiLCA1KSA9PSAwKQogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICBpZiAoKGkgPSBzc2NhbmYoYnVmLCAiJXMgJXggJSpzICUqcyAlKnMgJSpzICUqcyAleCIsCiAgICAgICAgICAgICAgICAgICAgICAgIHRkZXZpY2UsICZkZXN0LCAmdG1hc2spKSAhPSAzKQogICAgICAgICAgICByZXR1cm4gKCJqdW5rIGluIGJ1ZmZlciIpOwogICAgICAgIGlmICgodG8tPnNpbl9hZGRyLnNfYWRkciAmIHRtYXNrKSA9PSBkZXN0ICYmCiAgICAgICAgICAgICh0bWFzayA+IG1hc2sgfHwgbWFzayA9PSAwKSkgewogICAgICAgICAgICBtYXNrID0gdG1hc2s7CiAgICAgICAgICAgIHN0cmNweShkZXZpY2UsIHRkZXZpY2UpOwogICAgICAgIH0KICAgIH0KICAgIGZjbG9zZShmKTsKCiAgICBpZiAoZGV2aWNlWzBdID09ICdcMCcpCiAgICAgICAgcmV0dXJuICgiQ2FuJ3QgZmluZCBpbnRlcmZhY2UiKTsKCiAgICAvKgogICAgICogR2V0IHRoZSBpbnRlcmZhY2UgYWRkcmVzcyBsaXN0IAogICAgICovCiAgICBpZiAoKG4gPSBpZmFkZHJsaXN0KCZhbCwgZXJyYnVmKSkgPCAwKQogICAgICAgIHJldHVybiAoZXJyYnVmKTsKCiAgICBpZiAobiA9PSAwKQogICAgICAgIHJldHVybiAoIkNhbid0IGZpbmQgYW55IG5ldHdvcmsgaW50ZXJmYWNlcyIpOwoKICAgIC8qCiAgICAgKiBGaW5kIG91ciBhcHByb3ByaWF0ZSBzb3VyY2UgYWRkcmVzcyAKICAgICAqLwogICAgZm9yIChpID0gbjsgaSA+IDA7IC0taSwgKythbCkKICAgICAgICBpZiAoc3RyY21wKGRldmljZSwgYWwtPmRldmljZSkgPT0gMCkKICAgICAgICAgICAgYnJlYWs7CiAgICBpZiAoaSA8PSAwKSB7CiAgICAgICAgc3ByaW50ZihlcnJidWYsICJDYW4ndCBmaW5kIGludGVyZmFjZSBcIiUuMzJzXCIiLCBkZXZpY2UpOwogICAgICAgIHJldHVybiAoZXJyYnVmKTsKICAgIH0KCiAgICBzZXRzaW4oZnJvbSwgYWwtPmFkZHIpOwogICAgcmV0dXJuIChOVUxMKTsKfQoKaW50CmlmYWRkcmxpc3QocmVnaXN0ZXIgc3RydWN0IGlmYWRkcmxpc3QgKippcGFkZHJwLCByZWdpc3RlciBjaGFyICplcnJidWYpCnsKICAgIHJlZ2lzdGVyIGludCAgICBmZCwgbmlwYWRkcjsKI2lmZGVmIEhBVkVfU09DS0FERFJfU0FfTEVOCiAgICByZWdpc3RlciBpbnQgICAgbjsKI2VuZGlmCiAgICByZWdpc3RlciBzdHJ1Y3QgaWZyZXEgKmlmcnAsICppZmVuZCwgKmlmbmV4dDsKICAgIHJlZ2lzdGVyIHN0cnVjdCBzb2NrYWRkcl9pbiAqc2luOwogICAgcmVnaXN0ZXIgc3RydWN0IGlmYWRkcmxpc3QgKmFsOwogICAgc3RydWN0IGlmY29uZiAgIGlmYzsKICAgIHN0cnVjdCBpZnJlcSAgICBpYnVmWygzMiAqIDEwMjQpIC8gc2l6ZW9mKHN0cnVjdCBpZnJlcSldLCBpZnI7CiNkZWZpbmUgTUFYX0lQQUREUiAoc2l6ZW9mKGlidWYpIC8gc2l6ZW9mKGlidWZbMF0pKQogICAgc3RhdGljIHN0cnVjdCBpZmFkZHJsaXN0IGlmYWRkcmxpc3RbTUFYX0lQQUREUl07CiAgICBjaGFyICAgICAgICAgICAgZGV2aWNlW3NpemVvZihpZnIuaWZyX25hbWUpICsgMV07CgogICAgZmQgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19ER1JBTSwgMCk7CiAgICBpZiAoZmQgPCAwKSB7CiAgICAgICAgKHZvaWQpIHNwcmludGYoZXJyYnVmLCAic29ja2V0OiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CiAgICAgICAgcmV0dXJuICgtMSk7CiAgICB9CiAgICBpZmMuaWZjX2xlbiA9IHNpemVvZihpYnVmKTsKICAgIGlmYy5pZmNfYnVmID0gKGNhZGRyX3QpIGlidWY7CgogICAgaWYgKGlvY3RsKGZkLCBTSU9DR0lGQ09ORiwgKGNoYXIgKikgJmlmYykgPCAwIHx8CiAgICAgICAgaWZjLmlmY19sZW4gPCBzaXplb2Yoc3RydWN0IGlmcmVxKSkgewogICAgICAgIGlmIChlcnJubyA9PSBFSU5WQUwpCiAgICAgICAgICAgICh2b2lkKSBzcHJpbnRmKGVycmJ1ZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNJT0NHSUZDT05GOiBpZnJlcSBzdHJ1Y3QgdG9vIHNtYWxsICglZCBieXRlcykiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KXNpemVvZihpYnVmKSk7CiAgICAgICAgZWxzZQogICAgICAgICAgICAodm9pZCkgc3ByaW50ZihlcnJidWYsICJTSU9DR0lGQ09ORjogJXMiLCBzdHJlcnJvcihlcnJubykpOwogICAgICAgICh2b2lkKSBjbG9zZShmZCk7CiAgICAgICAgcmV0dXJuICgtMSk7CiAgICB9CiAgICBpZnJwID0gaWJ1ZjsKICAgIGlmZW5kID0gKHN0cnVjdCBpZnJlcSAqKSAoKGNoYXIgKikgaWJ1ZiArIGlmYy5pZmNfbGVuKTsKCiAgICBhbCA9IGlmYWRkcmxpc3Q7CiAgICBuaXBhZGRyID0gMDsKICAgIGZvciAoOyBpZnJwIDwgaWZlbmQ7IGlmcnAgPSBpZm5leHQpIHsKI2lmZGVmIEhBVkVfU09DS0FERFJfU0FfTEVOCiAgICAgICAgbiA9IGlmcnAtPmlmcl9hZGRyLnNhX2xlbiArIHNpemVvZihpZnJwLT5pZnJfbmFtZSk7CiAgICAgICAgaWYgKG4gPCBzaXplb2YoKmlmcnApKQogICAgICAgICAgICBpZm5leHQgPSBpZnJwICsgMTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIGlmbmV4dCA9IChzdHJ1Y3QgaWZyZXEgKikgKChjaGFyICopIGlmcnAgKyBuKTsKICAgICAgICBpZiAoaWZycC0+aWZyX2FkZHIuc2FfZmFtaWx5ICE9IEFGX0lORVQpCiAgICAgICAgICAgIGNvbnRpbnVlOwojZWxzZQogICAgICAgIGlmbmV4dCA9IGlmcnAgKyAxOwojZW5kaWYKICAgICAgICAvKgogICAgICAgICAqIE5lZWQgYSB0ZW1wbGF0ZSB0byBwcmVzZXJ2ZSBhZGRyZXNzIGluZm8gdGhhdCBpcwogICAgICAgICAqIHVzZWQgYmVsb3cgdG8gbG9jYXRlIHRoZSBuZXh0IGVudHJ5LiAgKE90aGVyd2lzZSwKICAgICAgICAgKiBTSU9DR0lGRkxBR1Mgc3RvbXBzIG92ZXIgaXQgYmVjYXVzZSB0aGUgcmVxdWVzdHMKICAgICAgICAgKiBhcmUgcmV0dXJuZWQgaW4gYSB1bmlvbi4pCiAgICAgICAgICovCiAgICAgICAgc3RybGNweShpZnIuaWZyX25hbWUsIGlmcnAtPmlmcl9uYW1lLCBzaXplb2YoaWZyLmlmcl9uYW1lKSk7CiAgICAgICAgaWYgKGlvY3RsKGZkLCBTSU9DR0lGRkxBR1MsIChjaGFyICopICZpZnIpIDwgMCkgewogICAgICAgICAgICBpZiAoZXJybm8gPT0gRU5YSU8pCiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgKHZvaWQpIHNwcmludGYoZXJyYnVmLCAiU0lPQ0dJRkZMQUdTOiAlLipzOiAlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpIHNpemVvZihpZnIuaWZyX25hbWUpLCBpZnIuaWZyX25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKGVycm5vKSk7CiAgICAgICAgICAgICh2b2lkKSBjbG9zZShmZCk7CiAgICAgICAgICAgIHJldHVybiAoLTEpOwogICAgICAgIH0KCiAgICAgICAgLyoKICAgICAgICAgKiBNdXN0IGJlIHVwIAogICAgICAgICAqLwogICAgICAgIGlmICgoaWZyLmlmcl9mbGFncyAmIElGRl9VUCkgPT0gMCkKICAgICAgICAgICAgY29udGludWU7CgogICAgICAgIHNwcmludGYoZGV2aWNlLCAiJS4qcyIsIChpbnQpIHNpemVvZihpZnIuaWZyX25hbWUpLCBpZnIuaWZyX25hbWUpOwojaWZkZWYgc3VuCiAgICAgICAgLyoKICAgICAgICAgKiBJZ25vcmUgc3VuIHZpcnR1YWwgaW50ZXJmYWNlcyAKICAgICAgICAgKi8KICAgICAgICBpZiAoc3RyY2hyKGRldmljZSwgJzonKSAhPSBOVUxMKQogICAgICAgICAgICBjb250aW51ZTsKI2VuZGlmCiAgICAgICAgaWYgKGlvY3RsKGZkLCBTSU9DR0lGQUREUiwgKGNoYXIgKikgJmlmcikgPCAwKSB7CiAgICAgICAgICAgICh2b2lkKSBzcHJpbnRmKGVycmJ1ZiwgIlNJT0NHSUZBRERSOiAlczogJXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsIHN0cmVycm9yKGVycm5vKSk7CiAgICAgICAgICAgICh2b2lkKSBjbG9zZShmZCk7CiAgICAgICAgICAgIHJldHVybiAoLTEpOwogICAgICAgIH0KCiAgICAgICAgaWYgKG5pcGFkZHIgPj0gTUFYX0lQQUREUikgewogICAgICAgICAgICAodm9pZCkgc3ByaW50ZihlcnJidWYsICJUb28gbWFueSBpbnRlcmZhY2VzICglZCkiLCBuaXBhZGRyKTsKICAgICAgICAgICAgKHZvaWQpIGNsb3NlKGZkKTsKICAgICAgICAgICAgcmV0dXJuICgtMSk7CiAgICAgICAgfQogICAgICAgIHNpbiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikgJmlmci5pZnJfYWRkcjsKICAgICAgICBhbC0+YWRkciA9IHNpbi0+c2luX2FkZHIuc19hZGRyOwogICAgICAgIGFsLT5kZXZpY2UgPSBzdHJkdXAoZGV2aWNlKTsKICAgICAgICArK2FsOwogICAgICAgICsrbmlwYWRkcjsKICAgIH0KICAgICh2b2lkKSBjbG9zZShmZCk7CgogICAgKmlwYWRkcnAgPSBpZmFkZHJsaXN0OwogICAgcmV0dXJuIChuaXBhZGRyKTsKfQo=