LyoKICpDb3B5cmlnaHQoYykyMDA0LENpc2NvIFVSUCBpbWJ1cnNlcyBhbmQgTmV0d29yayBJbmZvcm1hdGlvbiBDZW50ZXIgaW4gQmVpamluZyBVbml2ZXJzaXR5IG9mIFBvc3RzIGFuZCBUZWxlY29tbXVuaWNhdGlvbnMgcmVzZWFyY2hlcy4KICoKICpBbGwgcmlnaHQgcmVzZXJ2ZWQKICoKICpGaWxlIE5hbWU6dHJhY2VSb3V0ZUN0bFRhYmxlLmMKICpGaWxlIERlc2NyaXB0aW9uOlJvd3Mgb2YgdHJhY2VSb3V0ZUN0bFRhYmxlIE1JQiBhZGQgZGVsZXRlIGFucyByZWFkLgogKiAgICAgICAgICAgICAgUm93cyBvZiB0cmFjZVJvdXRlUmVzdWx0c1RhYmxlIE1JQiBhZGQgYW5kIGRlbGV0ZS4KICogICAgICAgICAgICAgIFJvd3Mgb2YgdHJhY2VSb3V0ZVByb2JlSGlzdG9yeVRhYmxlIE1JQiBhZGQgYW5kIGRlbGV0ZS4KICogICAgICAgICAgICAgIFJvd3Mgb2YgdHJhY2VSb3V0ZUhvcHNUYWJsZSBNSUIgYWRkIGFuZCBkZWxldGUuCiAqICAgICAgICAgICAgICBUaGUgbWFpbiBmdW5jdGlvbiBpcyBhbHNvIGhlcmUuCiAqCiAqQ3VycmVudCBWZXJzaW9uOjEuMAogKkF1dGhvcjpDaGVuSmluZwogKkRhdGU6MjAwNC44LjIwCiAqLwoKCiNpbmNsdWRlIDxuZXQtc25tcC9uZXQtc25tcC1jb25maWcuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL25ldC1zbm1wLWluY2x1ZGVzLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9uZXQtc25tcC1mZWF0dXJlcy5oPgojaW5jbHVkZSA8bmV0LXNubXAvYWdlbnQvbmV0LXNubXAtYWdlbnQtaW5jbHVkZXMuaD4KI2luY2x1ZGUgPHB0aHJlYWQuaD4KI2luY2x1ZGUgPG1hdGguaD4KCiNpZm5kZWYgTkVUU05NUF9OT19XUklURV9TVVBQT1JUCm5ldHNubXBfZmVhdHVyZV9yZXF1aXJlKGhlYWRlcl9jb21wbGV4X2ZpbmRfZW50cnkpCiNlbmRpZiAvKiBORVRTTk1QX05PX1dSSVRFX1NVUFBPUlQgKi8KCiNpbmNsdWRlICJ0cmFjZVJvdXRlQ3RsVGFibGUuaCIKI2luY2x1ZGUgInRyYWNlUm91dGVSZXN1bHRzVGFibGUuaCIKI2luY2x1ZGUgInRyYWNlUm91dGVQcm9iZUhpc3RvcnlUYWJsZS5oIgojaW5jbHVkZSAidHJhY2VSb3V0ZUhvcHNUYWJsZS5oIgojaW5jbHVkZSAiaGVhZGVyX2NvbXBsZXguaCIKCm9pZCAgICAgICAgICAgICB0cmFjZVJvdXRlQ3RsVGFibGVfdmFyaWFibGVzX29pZFtdID0KICAgIHsgMSwgMywgNiwgMSwgMiwgMSwgODEsIDEsIDIgfTsKCi8qIHRyYXAgKi8Kb2lkICAgICAgICAgICAgIHRyYWNlUm91dGVQYXRoQ2hhbmdlW10gPSB7IDEsIDMsIDYsIDEsIDIsIDEsIDgxLCAwLCAxIH07Cm9pZCAgICAgICAgICAgICB0cmFjZVJvdXRlVGVzdEZhaWxlZFtdID0geyAxLCAzLCA2LCAxLCAyLCAxLCA4MSwgMCwgMiB9OwpvaWQgICAgICAgICAgICAgdHJhY2VSb3V0ZVRlc3RDb21wbGV0ZWRbXSA9IHsgMSwgMywgNiwgMSwgMiwgMSwgODEsIDAsIDMgfTsKCnN0cnVjdCB2YXJpYWJsZTIgdHJhY2VSb3V0ZUN0bFRhYmxlX3ZhcmlhYmxlc1tdID0gewogICAgLyoKICAgICAqIG1hZ2ljIG51bWJlciAgICAgICAgLCB2YXJpYWJsZSB0eXBlICwgcm8vcncgLCBjYWxsYmFjayBmbiAgLCBMLCBvaWRzdWZmaXggCiAgICAgKi8KCiAgICB7Q09MVU1OX1RSQUNFUk9VVEVDVExUQVJHRVRBRERSRVNTVFlQRSwgQVNOX0lOVEVHRVIsIE5FVFNOTVBfT0xEQVBJX1JXUklURSwKICAgICB2YXJfdHJhY2VSb3V0ZUN0bFRhYmxlLCAyLCB7MSwgM319LAogICAge0NPTFVNTl9UUkFDRVJPVVRFQ1RMVEFSR0VUQUREUkVTUywgICBBU05fT0NURVRfU1RSLCBORVRTTk1QX09MREFQSV9SV1JJVEUsCiAgICAgdmFyX3RyYWNlUm91dGVDdGxUYWJsZSwgMiwgezEsIDR9fSwKICAgIHtDT0xVTU5fVFJBQ0VST1VURUNUTEJZUEFTU1JPVVRFVEFCTEUsICBBU05fSU5URUdFUiwgTkVUU05NUF9PTERBUElfUldSSVRFLAogICAgIHZhcl90cmFjZVJvdXRlQ3RsVGFibGUsIDIsIHsxLCA1fX0sCiAgICB7Q09MVU1OX1RSQUNFUk9VVEVDVExEQVRBU0laRSwgICAgIEFTTl9VTlNJR05FRCwgTkVUU05NUF9PTERBUElfUldSSVRFLAogICAgIHZhcl90cmFjZVJvdXRlQ3RsVGFibGUsIDIsIHsxLCA2fX0sCiAgICB7Q09MVU1OX1RSQUNFUk9VVEVDVExUSU1FT1VULCAgICAgIEFTTl9VTlNJR05FRCwgTkVUU05NUF9PTERBUElfUldSSVRFLAogICAgIHZhcl90cmFjZVJvdXRlQ3RsVGFibGUsIDIsIHsxLCA3fX0sCiAgICB7Q09MVU1OX1RSQUNFUk9VVEVDVExQUk9CRVNQRVJIT1AsIEFTTl9VTlNJR05FRCwgTkVUU05NUF9PTERBUElfUldSSVRFLAogICAgIHZhcl90cmFjZVJvdXRlQ3RsVGFibGUsIDIsIHsxLCA4fX0sCiAgICB7Q09MVU1OX1RSQUNFUk9VVEVDVExQT1JULCAgICAgICAgIEFTTl9VTlNJR05FRCwgTkVUU05NUF9PTERBUElfUldSSVRFLAogICAgIHZhcl90cmFjZVJvdXRlQ3RsVGFibGUsIDIsIHsxLCA5fX0sCiAgICB7Q09MVU1OX1RSQUNFUk9VVEVDVExNQVhUVEwsICAgICAgIEFTTl9VTlNJR05FRCwgTkVUU05NUF9PTERBUElfUldSSVRFLAogICAgIHZhcl90cmFjZVJvdXRlQ3RsVGFibGUsIDIsIHsxLCAxMH19LAogICAge0NPTFVNTl9UUkFDRVJPVVRFQ1RMRFNGSUVMRCwgICAgICBBU05fVU5TSUdORUQsIE5FVFNOTVBfT0xEQVBJX1JXUklURSwKICAgICB2YXJfdHJhY2VSb3V0ZUN0bFRhYmxlLCAyLCB7MSwgMTF9fSwKICAgIHtDT0xVTU5fVFJBQ0VST1VURUNUTFNPVVJDRUFERFJFU1NUWVBFLCBBU05fSU5URUdFUiwgTkVUU05NUF9PTERBUElfUldSSVRFLAogICAgIHZhcl90cmFjZVJvdXRlQ3RsVGFibGUsIDIsIHsxLCAxMn19LAogICAge0NPTFVNTl9UUkFDRVJPVVRFQ1RMU09VUkNFQUREUkVTUywgICBBU05fT0NURVRfU1RSLCBORVRTTk1QX09MREFQSV9SV1JJVEUsCiAgICAgdmFyX3RyYWNlUm91dGVDdGxUYWJsZSwgMiwgezEsIDEzfX0sCiAgICB7Q09MVU1OX1RSQUNFUk9VVEVDVExJRklOREVYLCAgICAgICBBU05fSU5URUdFUiwgTkVUU05NUF9PTERBUElfUldSSVRFLAogICAgIHZhcl90cmFjZVJvdXRlQ3RsVGFibGUsIDIsIHsxLCAxNH19LAogICAge0NPTFVNTl9UUkFDRVJPVVRFQ1RMTUlTQ09QVElPTlMsIEFTTl9PQ1RFVF9TVFIsIE5FVFNOTVBfT0xEQVBJX1JXUklURSwKICAgICB2YXJfdHJhY2VSb3V0ZUN0bFRhYmxlLCAyLCB7MSwgMTV9fSwKICAgIHtDT0xVTU5fVFJBQ0VST1VURUNUTE1BWEZBSUxVUkVTLCAgQVNOX1VOU0lHTkVELCBORVRTTk1QX09MREFQSV9SV1JJVEUsCiAgICAgdmFyX3RyYWNlUm91dGVDdGxUYWJsZSwgMiwgezEsIDE2fX0sCiAgICB7Q09MVU1OX1RSQUNFUk9VVEVDVExET05URlJBR01FTlQsICBBU05fSU5URUdFUiwgTkVUU05NUF9PTERBUElfUldSSVRFLAogICAgIHZhcl90cmFjZVJvdXRlQ3RsVGFibGUsIDIsIHsxLCAxN319LAogICAge0NPTFVNTl9UUkFDRVJPVVRFQ1RMSU5JVElBTFRUTCwgICBBU05fVU5TSUdORUQsIE5FVFNOTVBfT0xEQVBJX1JXUklURSwKICAgICB2YXJfdHJhY2VSb3V0ZUN0bFRhYmxlLCAyLCB7MSwgMTh9fSwKICAgIHtDT0xVTU5fVFJBQ0VST1VURUNUTEZSRVFVRU5DWSwgICAgQVNOX1VOU0lHTkVELCBORVRTTk1QX09MREFQSV9SV1JJVEUsCiAgICAgdmFyX3RyYWNlUm91dGVDdGxUYWJsZSwgMiwgezEsIDE5fX0sCiAgICB7Q09MVU1OX1RSQUNFUk9VVEVDVExTVE9SQUdFVFlQRSwgICBBU05fSU5URUdFUiwgTkVUU05NUF9PTERBUElfUldSSVRFLAogICAgIHZhcl90cmFjZVJvdXRlQ3RsVGFibGUsIDIsIHsxLCAyMH19LAogICAge0NPTFVNTl9UUkFDRVJPVVRFQ1RMQURNSU5TVEFUVVMsICAgQVNOX0lOVEVHRVIsIE5FVFNOTVBfT0xEQVBJX1JXUklURSwKICAgICB2YXJfdHJhY2VSb3V0ZUN0bFRhYmxlLCAyLCB7MSwgMjF9fSwKICAgIHtDT0xVTU5fVFJBQ0VST1VURUNUTERFU0NSLCAgICAgICBBU05fT0NURVRfU1RSLCBORVRTTk1QX09MREFQSV9SV1JJVEUsCiAgICAgdmFyX3RyYWNlUm91dGVDdGxUYWJsZSwgMiwgezEsIDIyfX0sCiAgICB7Q09MVU1OX1RSQUNFUk9VVEVDVExNQVhST1dTLCAgICAgIEFTTl9VTlNJR05FRCwgTkVUU05NUF9PTERBUElfUldSSVRFLAogICAgIHZhcl90cmFjZVJvdXRlQ3RsVGFibGUsIDIsIHsxLCAyM319LAogICAge0NPTFVNTl9UUkFDRVJPVVRFQ1RMVFJBUEdFTkVSQVRJT04sICBBU05fT0NURVRfU1RSLCBORVRTTk1QX09MREFQSV9SV1JJVEUsCiAgICAgdmFyX3RyYWNlUm91dGVDdGxUYWJsZSwgMiwgezEsIDI0fX0sCiAgICB7Q09MVU1OX1RSQUNFUk9VVEVDVExDUkVBVEVIT1BTRU5UUklFUywgQVNOX0lOVEVHRVIsIE5FVFNOTVBfT0xEQVBJX1JXUklURSwKICAgICB2YXJfdHJhY2VSb3V0ZUN0bFRhYmxlLCAyLCB7MSwgMjV9fSwKICAgIHtDT0xVTU5fVFJBQ0VST1VURUNUTFRZUEUsICAgICAgICBBU05fT0JKRUNUX0lELCBORVRTTk1QX09MREFQSV9SV1JJVEUsCiAgICAgdmFyX3RyYWNlUm91dGVDdGxUYWJsZSwgMiwgezEsIDI2fX0sCiAgICB7Q09MVU1OX1RSQUNFUk9VVEVDVExST1dTVEFUVVMsICAgICBBU05fSU5URUdFUiwgTkVUU05NUF9PTERBUElfUldSSVRFLAogICAgIHZhcl90cmFjZVJvdXRlQ3RsVGFibGUsIDIsIHsxLCAyN319Cgp9OwoKLyoKICogZ2xvYmFsIHN0b3JhZ2Ugb2Ygb3VyIGRhdGEsIHNhdmVkIGluIGFuZCBjb25maWd1cmVkIGJ5IGhlYWRlcl9jb21wbGV4KCkgCiAqLwoKc3RydWN0IGhlYWRlcl9jb21wbGV4X2luZGV4ICp0cmFjZVJvdXRlQ3RsVGFibGVTdG9yYWdlID0gTlVMTDsKc3RydWN0IGhlYWRlcl9jb21wbGV4X2luZGV4ICp0cmFjZVJvdXRlUmVzdWx0c1RhYmxlU3RvcmFnZSA9IE5VTEw7CnN0cnVjdCBoZWFkZXJfY29tcGxleF9pbmRleCAqdHJhY2VSb3V0ZVByb2JlSGlzdG9yeVRhYmxlU3RvcmFnZSA9IE5VTEw7CnN0cnVjdCBoZWFkZXJfY29tcGxleF9pbmRleCAqdHJhY2VSb3V0ZUhvcHNUYWJsZVN0b3JhZ2UgPSBOVUxMOwoKaW50CnRyYWNlUm91dGVSZXN1bHRzVGFibGVfYWRkKHN0cnVjdCB0cmFjZVJvdXRlQ3RsVGFibGVfZGF0YSAqdGhlZGF0YSk7CmludAp0cmFjZVJvdXRlUmVzdWx0c1RhYmxlX2RlbChzdHJ1Y3QgdHJhY2VSb3V0ZUN0bFRhYmxlX2RhdGEgKnRoZWRhdGEpOwoKdm9pZAppbml0X3RyYWNlUm91dGVDdGxUYWJsZSh2b2lkKQp7CiAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZUN0bFRhYmxlIiwgImluaXRpYWxpemluZy4uLiAgIikpOwogICAgLyoKICAgICAqIHJlZ2lzdGVyIG91cnNlbHZlcyB3aXRoIHRoZSBhZ2VudCB0byBoYW5kbGUgb3VyIG1pYiB0cmVlIAogICAgICovCiAgICBSRUdJU1RFUl9NSUIoInRyYWNlUm91dGVDdGxUYWJsZSIsIHRyYWNlUm91dGVDdGxUYWJsZV92YXJpYWJsZXMsCiAgICAgICAgICAgICAgICAgdmFyaWFibGUyLCB0cmFjZVJvdXRlQ3RsVGFibGVfdmFyaWFibGVzX29pZCk7CgogICAgLyoKICAgICAqIHJlZ2lzdGVyIG91ciBjb25maWcgaGFuZGxlcihzKSB0byBkZWFsIHdpdGggcmVnaXN0cmF0aW9ucyAKICAgICAqLwogICAgc25tcGRfcmVnaXN0ZXJfY29uZmlnX2hhbmRsZXIoInRyYWNlUm91dGVDdGxUYWJsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZV90cmFjZVJvdXRlQ3RsVGFibGUsIE5VTEwsIE5VTEwpOwoKICAgIC8qCiAgICAgKiB3ZSBuZWVkIHRvIGJlIGNhbGxlZCBiYWNrIGxhdGVyIHRvIHN0b3JlIG91ciBkYXRhIAogICAgICovCiAgICBzbm1wX3JlZ2lzdGVyX2NhbGxiYWNrKFNOTVBfQ0FMTEJBQ0tfTElCUkFSWSwgU05NUF9DQUxMQkFDS19TVE9SRV9EQVRBLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZV90cmFjZVJvdXRlQ3RsVGFibGUsIE5VTEwpOwoKICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlQ3RsVGFibGUiLCAiZG9uZS5cbiIpKTsKfQoKCnZvaWQKaW5pdF90clJlc3VsdHNUYWJsZShzdHJ1Y3QgdHJhY2VSb3V0ZUN0bFRhYmxlX2RhdGEgKml0ZW0pCnsKICAgIHN0cnVjdCB0cmFjZVJvdXRlUmVzdWx0c1RhYmxlX2RhdGEgKlN0b3JhZ2VUbXAgPSBOVUxMOwogICAgbmV0c25tcF92YXJpYWJsZV9saXN0ICp2YXJzID0gTlVMTDsKICAgIGNoYXIgICAgICAgICAgICpob3N0ID0gTlVMTDsKCiAgICBob3N0ID0KICAgICAgICAoY2hhciAqKSBtYWxsb2Moc2l6ZW9mKGNoYXIpICoKICAgICAgICAgICAgICAgICAgICAgICAgKGl0ZW0tPnRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzTGVuICsgMSkpOwoKICAgIGlmIChob3N0ID09IE5VTEwpIHsKICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZUN0bFRhYmxlIiwgImhvc3QgY2FsbG9jICVzXG4iLAogICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKGVycm5vKSkpOwogICAgICAgIGV4aXQoMSk7CiAgICB9CgogICAgbWVtc2V0KGhvc3QsICdcMCcsCgkgICBzaXplb2YoY2hhcikgKiAoaXRlbS0+dHJhY2VSb3V0ZUN0bFRhcmdldEFkZHJlc3NMZW4gKyAxKSk7CiAgICBzdHJjcHkoaG9zdCwgaXRlbS0+dHJhY2VSb3V0ZUN0bFRhcmdldEFkZHJlc3MpOwogICAgaG9zdFtpdGVtLT50cmFjZVJvdXRlQ3RsVGFyZ2V0QWRkcmVzc0xlbl0gPSAnXDAnOwoKICAgIFN0b3JhZ2VUbXAgPSBTTk1QX01BTExPQ19TVFJVQ1QodHJhY2VSb3V0ZVJlc3VsdHNUYWJsZV9kYXRhKTsKICAgIGlmIChTdG9yYWdlVG1wID09IE5VTEwpIHsKICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZUN0bFRhYmxlIiwgIlN0b3JhZ2VUbXAgbWFsbG9jICVzXG4iLAogICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKGVycm5vKSkpOwogICAgICAgIGV4aXQoMSk7CiAgICB9CgogICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXggPQogICAgICAgIChjaGFyICopIG1hbGxvYyhzaXplb2YoY2hhcikgKgogICAgICAgICAgICAgICAgICAgICAgICAoaXRlbS0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXhMZW4gKyAxKSk7CiAgICBpZiAoU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXggPT0gTlVMTCkgewogICAgICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlQ3RsVGFibGUiLAogICAgICAgICAgICAgICAgICAgICJ0cmFjZVJvdXRlQ3RsT3duZXJJbmRleCBtYWxsb2MgJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoZXJybm8pKSk7CiAgICAgICAgZXhpdCgxKTsKICAgIH0KCiAgICBtZW1jcHkoU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXgsCiAgICAgICAgICAgaXRlbS0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXgsCiAgICAgICAgICAgaXRlbS0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXhMZW4gKyAxKTsKICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxPd25lckluZGV4W2l0ZW0tPnRyYWNlUm91dGVDdGxPd25lckluZGV4TGVuXSA9CiAgICAgICAgJ1wwJzsKICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxPd25lckluZGV4TGVuID0KICAgICAgICBpdGVtLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleExlbjsKCiAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWUgPQogICAgICAgIChjaGFyICopIG1hbGxvYyhzaXplb2YoY2hhcikgKgogICAgICAgICAgICAgICAgICAgICAgICAoaXRlbS0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lTGVuICsgMSkpOwogICAgaWYgKFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUZXN0TmFtZSA9PSBOVUxMKSB7CiAgICAgICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVDdGxUYWJsZSIsCiAgICAgICAgICAgICAgICAgICAgInRyYWNlUm91dGVDdGxUZXN0TmFtZSBtYWxsb2MgJXNcbiIsIHN0cmVycm9yKGVycm5vKSkpOwogICAgICAgIGV4aXQoMSk7CiAgICB9CgogICAgbWVtY3B5KFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUZXN0TmFtZSwgaXRlbS0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lLAogICAgICAgICAgIGl0ZW0tPnRyYWNlUm91dGVDdGxUZXN0TmFtZUxlbiArIDEpOwogICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lW2l0ZW0tPnRyYWNlUm91dGVDdGxUZXN0TmFtZUxlbl0gPQogICAgICAgICdcMCc7CiAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWVMZW4gPSBpdGVtLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWVMZW47CgogICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZVJlc3VsdHNPcGVyU3RhdHVzID0gMTsKCiAgICBpZiAoaXRlbS0+dHJhY2VSb3V0ZUN0bFRhcmdldEFkZHJlc3NUeXBlID09IDEKICAgICAgICB8fCBpdGVtLT50cmFjZVJvdXRlQ3RsVGFyZ2V0QWRkcmVzc1R5cGUgPT0gMTYpIHsKICAgICAgICBzdHJ1Y3Qgc29ja2FkZHIgd2hlcmV0bzsgICAgICAgIC8qIFdobyB0byB0cnkgdG8gcmVhY2ggKi8KICAgICAgICByZWdpc3RlciBzdHJ1Y3Qgc29ja2FkZHJfaW4gKnRvID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSAmd2hlcmV0bzsKICAgICAgICByZWdpc3RlciBzdHJ1Y3QgaG9zdGluZm8gKmhpID0gTlVMTDsKICAgICAgICBoaSA9IGdldGhvc3RpbmZvKGhvc3QpOwogICAgICAgIGlmIChoaSA9PSBOVUxMKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlQ3RsVGFibGUiLCAiaGkgY2FsbG9jICVzXG4iLAogICAgICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcihlcnJubykpKTsKICAgICAgICAgICAgZXhpdCgxKTsKICAgICAgICB9CgogICAgICAgIHNldHNpbih0bywgaGktPmFkZHJzWzBdKTsKICAgICAgICBpZiAoaW5ldF9udG9hKHRvLT5zaW5fYWRkcikgPT0gTlVMTCkgewogICAgICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlUmVzdWx0c0lwVGd0QWRkclR5cGUgPSAwOwogICAgICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlUmVzdWx0c0lwVGd0QWRkciA9IHN0cmR1cCgiIik7CiAgICAgICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVSZXN1bHRzSXBUZ3RBZGRyTGVuID0gMDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlUmVzdWx0c0lwVGd0QWRkclR5cGUgPSAxOwogICAgICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlUmVzdWx0c0lwVGd0QWRkciA9CiAgICAgICAgICAgICAgICAoY2hhciAqKSBtYWxsb2Moc2l6ZW9mKGNoYXIpICoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RybGVuKGluZXRfbnRvYSh0by0+c2luX2FkZHIpKSArIDEpKTsKICAgICAgICAgICAgaWYgKFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVSZXN1bHRzSXBUZ3RBZGRyID09IE5VTEwpIHsKICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlQ3RsVGFibGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInRyYWNlUm91dGVSZXN1bHRzSXBUZ3RBZGRyIG1hbGxvYyAlc1xuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKGVycm5vKSkpOwogICAgICAgICAgICAgICAgZXhpdCgxKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbWVtY3B5KFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVSZXN1bHRzSXBUZ3RBZGRyLAogICAgICAgICAgICAgICAgICAgaW5ldF9udG9hKHRvLT5zaW5fYWRkciksCiAgICAgICAgICAgICAgICAgICBzdHJsZW4oaW5ldF9udG9hKHRvLT5zaW5fYWRkcikpICsgMSk7CiAgICAgICAgICAgIFN0b3JhZ2VUbXAtPgogICAgICAgICAgICAgICAgdHJhY2VSb3V0ZVJlc3VsdHNJcFRndEFkZHJbc3RybGVuKGluZXRfbnRvYSh0by0+c2luX2FkZHIpKV0KICAgICAgICAgICAgICAgID0gJ1wwJzsKICAgICAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZVJlc3VsdHNJcFRndEFkZHJMZW4gPQogICAgICAgICAgICAgICAgc3RybGVuKGluZXRfbnRvYSh0by0+c2luX2FkZHIpKTsKICAgICAgICB9CiAgICB9CiAgICBpZiAoaXRlbS0+dHJhY2VSb3V0ZUN0bFRhcmdldEFkZHJlc3NUeXBlID09IDIpIHsKCiAgICAgICAgc3RydWN0IHNvY2thZGRyX2luNiB3aGVyZXRvOyAgICAvKiBXaG8gdG8gdHJ5IHRvIHJlYWNoICovCiAgICAgICAgcmVnaXN0ZXIgc3RydWN0IHNvY2thZGRyX2luNiAqdG8gPQogICAgICAgICAgICAoc3RydWN0IHNvY2thZGRyX2luNiAqKSAmd2hlcmV0bzsKICAgICAgICBzdHJ1Y3QgaG9zdGVudCAqaHAgPSBOVUxMOwogICAgICAgIC8qIHN0cnVjdCBob3N0ZW52IGhwOyAqLwogICAgICAgIGNoYXIgICAgICAgICAgICBwYVs2NF07CiAgICAgICAgbWVtc2V0KHBhLCAnXDAnLCA2NCk7CgogICAgICAgIHRvLT5zaW42X2ZhbWlseSA9IEFGX0lORVQ2OwogICAgICAgIHRvLT5zaW42X3BvcnQgPSBodG9ucygzMzQzNCk7CgogICAgICAgIGlmIChpbmV0X3B0b24oQUZfSU5FVDYsIGhvc3QsICZ0by0+c2luNl9hZGRyKSA+IDApIHsKICAgICAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZVJlc3VsdHNJcFRndEFkZHJUeXBlID0gMjsKICAgICAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZVJlc3VsdHNJcFRndEFkZHIgPQogICAgICAgICAgICAgICAgKGNoYXIgKikgbWFsbG9jKHNpemVvZihjaGFyKSAqIChzdHJsZW4oaG9zdCkgKyAxKSk7CiAgICAgICAgICAgIGlmIChTdG9yYWdlVG1wLT50cmFjZVJvdXRlUmVzdWx0c0lwVGd0QWRkciA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZUN0bFRhYmxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0cmFjZVJvdXRlUmVzdWx0c0lwVGd0QWRkciBtYWxsb2MgJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcihlcnJubykpKTsKICAgICAgICAgICAgICAgIGV4aXQoMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbWVtc2V0KFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVSZXN1bHRzSXBUZ3RBZGRyLCAnXDAnLAogICAgICAgICAgICAgICAgICBzaXplb2YoY2hhcikgKiAoc3RybGVuKGhvc3QpICsgMSkpOwogICAgICAgICAgICBtZW1jcHkoU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZVJlc3VsdHNJcFRndEFkZHIsIGhvc3QsCiAgICAgICAgICAgICAgICAgICBzdHJsZW4oaG9zdCkgKyAxKTsKICAgICAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZVJlc3VsdHNJcFRndEFkZHJbc3RybGVuKGhvc3QpXSA9ICdcMCc7CiAgICAgICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVSZXN1bHRzSXBUZ3RBZGRyTGVuID0gc3RybGVuKGhvc3QpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGhwID0gZ2V0aG9zdGJ5bmFtZTIoaG9zdCwgQUZfSU5FVDYpOwogICAgICAgICAgICBpZiAoaHAgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgY29uc3QgY2hhciAgICAgKmhvc3RuYW1lOwogICAgICAgICAgICAgICAgbWVtbW92ZSgoY2FkZHJfdCkgJiB0by0+c2luNl9hZGRyLCBocC0+aF9hZGRyLCAxNik7CiAgICAgICAgICAgICAgICBob3N0bmFtZSA9IGluZXRfbnRvcChBRl9JTkVUNiwgJnRvLT5zaW42X2FkZHIsIHBhLCA2NCk7CiAgICAgICAgICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlUmVzdWx0c0lwVGd0QWRkclR5cGUgPSAyOwogICAgICAgICAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZVJlc3VsdHNJcFRndEFkZHIgPQogICAgICAgICAgICAgICAgICAgIChjaGFyICopIG1hbGxvYyhzaXplb2YoY2hhcikgKiAoc3RybGVuKGhvc3RuYW1lKSArIDEpKTsKICAgICAgICAgICAgICAgIGlmIChTdG9yYWdlVG1wLT50cmFjZVJvdXRlUmVzdWx0c0lwVGd0QWRkciA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVDdGxUYWJsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRyYWNlUm91dGVSZXN1bHRzSXBUZ3RBZGRyIG1hbGxvYyAlc1xuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcihlcnJubykpKTsKICAgICAgICAgICAgICAgICAgICBleGl0KDEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbWVtc2V0KFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVSZXN1bHRzSXBUZ3RBZGRyLCAnXDAnLAogICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGNoYXIpICogKHN0cmxlbihob3N0KSArIDEpKTsKICAgICAgICAgICAgICAgIG1lbWNweShTdG9yYWdlVG1wLT50cmFjZVJvdXRlUmVzdWx0c0lwVGd0QWRkciwgaG9zdG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgc3RybGVuKGhvc3RuYW1lKSArIDEpOwogICAgICAgICAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZVJlc3VsdHNJcFRndEFkZHJbc3RybGVuKGhvc3RuYW1lKV0gPQogICAgICAgICAgICAgICAgICAgICdcMCc7CiAgICAgICAgICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlUmVzdWx0c0lwVGd0QWRkckxlbiA9CiAgICAgICAgICAgICAgICAgICAgc3RybGVuKGhvc3RuYW1lKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlQ3RsVGFibGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInRyYWNlcm91dGU6IHVua25vd24gaG9zdCAlc1xuIiwgaG9zdCkpOwoKICAgICAgICAgICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVSZXN1bHRzSXBUZ3RBZGRyVHlwZSA9IDA7CiAgICAgICAgICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlUmVzdWx0c0lwVGd0QWRkciA9IHN0cmR1cCgiIik7CiAgICAgICAgICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlUmVzdWx0c0lwVGd0QWRkckxlbiA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZVJlc3VsdHNDdXJIb3BDb3VudCA9IDA7CiAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlUmVzdWx0c0N1clByb2JlQ291bnQgPSAwOwogICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZVJlc3VsdHNUZXN0QXR0ZW1wdHMgPSAwOwogICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZVJlc3VsdHNUZXN0U3VjY2Vzc2VzID0gMDsKCiAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlUmVzdWx0c0xhc3RHb29kUGF0aExlbiA9IDA7CgogICAgaXRlbS0+dHJhY2VSb3V0ZVJlc3VsdHMgPSBTdG9yYWdlVG1wOwoKICAgIHNubXBfdmFybGlzdF9hZGRfdmFyaWFibGUoJnZhcnMsIE5VTEwsIDAsIEFTTl9PQ1RFVF9TVFIsIChjaGFyICopIGl0ZW0tPnRyYWNlUm91dGVDdGxPd25lckluZGV4LCBpdGVtLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleExlbik7IC8qICB0cmFjZVJvdXRlQ3RsT3duZXJJbmRleCAgKi8KICAgIHNubXBfdmFybGlzdF9hZGRfdmFyaWFibGUoJnZhcnMsIE5VTEwsIDAsIEFTTl9PQ1RFVF9TVFIsIChjaGFyICopIGl0ZW0tPnRyYWNlUm91dGVDdGxUZXN0TmFtZSwgaXRlbS0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lTGVuKTsgICAgIC8qICB0cmFjZVJvdXRlQ3RsVGVzdE5hbWUgICovCiAgICBpZiAoKGhlYWRlcl9jb21wbGV4X2dldCh0cmFjZVJvdXRlUmVzdWx0c1RhYmxlU3RvcmFnZSwgdmFycykpICE9IE5VTEwpIHsKICAgICAgICB0cmFjZVJvdXRlUmVzdWx0c1RhYmxlX2RlbChpdGVtKTsKICAgIH0KICAgIHNubXBfZnJlZV92YXJiaW5kKHZhcnMpOwogICAgdmFycyA9IE5VTEw7CiAgICBpZiAoaXRlbS0+dHJhY2VSb3V0ZVJlc3VsdHMgIT0gTlVMTCkgewogICAgICAgIGlmICh0cmFjZVJvdXRlUmVzdWx0c1RhYmxlX2FkZChpdGVtKSAhPSBTTk1QRVJSX1NVQ0NFU1MpIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVSZXN1bHRzVGFibGUiLAogICAgICAgICAgICAgICAgICAgICAgICAiaW5pdCBhbiBlbnRyeSBlcnJvclxuIikpOwogICAgICAgIH0KICAgIH0KCn0KCgoKaW50Cm1vZGlmeV90clJlc3VsdHNPcGVyKHN0cnVjdCB0cmFjZVJvdXRlQ3RsVGFibGVfZGF0YSAqdGhlZGF0YSwgbG9uZyB2YWwpCnsKICAgIG5ldHNubXBfdmFyaWFibGVfbGlzdCAqdmFycyA9IE5VTEw7CiAgICBzdHJ1Y3QgdHJhY2VSb3V0ZVJlc3VsdHNUYWJsZV9kYXRhICpTdG9yYWdlVG1wID0gTlVMTDsKCiAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzLCBOVUxMLCAwLCBBU05fT0NURVRfU1RSLCAoY2hhciAqKSB0aGVkYXRhLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleCwgdGhlZGF0YS0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXhMZW4pOyAgIC8qIHRyYWNlUm91dGVDdGxPd25lckluZGV4ICovCiAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzLCBOVUxMLCAwLCBBU05fT0NURVRfU1RSLCAoY2hhciAqKSB0aGVkYXRhLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWUsIHRoZWRhdGEtPnRyYWNlUm91dGVDdGxUZXN0TmFtZUxlbik7ICAgICAgIC8qIHRyYWNlUm91dGVDdGxUZXN0TmFtZSAqLwoKICAgIGlmICgoU3RvcmFnZVRtcCA9CiAgICAgICAgIGhlYWRlcl9jb21wbGV4X2dldCh0cmFjZVJvdXRlUmVzdWx0c1RhYmxlU3RvcmFnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcnMpKSA9PSBOVUxMKSB7CiAgICAgICAgc25tcF9mcmVlX3ZhcmJpbmQodmFycyk7CiAgICAgICAgdmFycyA9IE5VTEw7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PU1VDSE5BTUU7CiAgICB9IGVsc2UgewogICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVSZXN1bHRzT3BlclN0YXR1cyA9IHZhbDsKICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZVJlc3VsdHNPcGVyU3RhdHVzIiwgImRvbmUuXG4iKSk7CiAgICAgICAgc25tcF9mcmVlX3ZhcmJpbmQodmFycyk7CiAgICAgICAgdmFycyA9IE5VTEw7CiAgICAgICAgcmV0dXJuIFNOTVBFUlJfU1VDQ0VTUzsKICAgIH0KfQoKCnN0cnVjdCB0cmFjZVJvdXRlQ3RsVGFibGVfZGF0YSAqCmNyZWF0ZV90cmFjZVJvdXRlQ3RsVGFibGVfZGF0YSh2b2lkKQp7CiAgICBzdHJ1Y3QgdHJhY2VSb3V0ZUN0bFRhYmxlX2RhdGEgKlN0b3JhZ2VOZXcgPSBOVUxMOwogICAgU3RvcmFnZU5ldyA9IFNOTVBfTUFMTE9DX1NUUlVDVCh0cmFjZVJvdXRlQ3RsVGFibGVfZGF0YSk7CiAgICBpZiAoU3RvcmFnZU5ldyA9PSBOVUxMKSB7CiAgICAgICAgZXhpdCgxKTsKICAgIH0KICAgIFN0b3JhZ2VOZXctPnRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzVHlwZSA9IDE7CiAgICBTdG9yYWdlTmV3LT50cmFjZVJvdXRlQ3RsVGFyZ2V0QWRkcmVzcyA9IHN0cmR1cCgiIik7CiAgICBTdG9yYWdlTmV3LT50cmFjZVJvdXRlQ3RsVGFyZ2V0QWRkcmVzc0xlbiA9IDA7CiAgICBTdG9yYWdlTmV3LT50cmFjZVJvdXRlQ3RsQnlQYXNzUm91dGVUYWJsZSA9IDI7CiAgICBTdG9yYWdlTmV3LT50cmFjZVJvdXRlQ3RsRGF0YVNpemUgPSAwOwogICAgU3RvcmFnZU5ldy0+dHJhY2VSb3V0ZUN0bFRpbWVPdXQgPSAzOwogICAgU3RvcmFnZU5ldy0+dHJhY2VSb3V0ZUN0bFByb2Jlc1BlckhvcCA9IDM7CiAgICBTdG9yYWdlTmV3LT50cmFjZVJvdXRlQ3RsUG9ydCA9IDMzNDM0OwogICAgU3RvcmFnZU5ldy0+dHJhY2VSb3V0ZUN0bE1heFR0bCA9IDMwOwogICAgU3RvcmFnZU5ldy0+dHJhY2VSb3V0ZUN0bERTRmllbGQgPSAwOwogICAgU3RvcmFnZU5ldy0+dHJhY2VSb3V0ZUN0bFNvdXJjZUFkZHJlc3NUeXBlID0gMDsKICAgIFN0b3JhZ2VOZXctPnRyYWNlUm91dGVDdGxTb3VyY2VBZGRyZXNzID0gc3RyZHVwKCIiKTsKICAgIFN0b3JhZ2VOZXctPnRyYWNlUm91dGVDdGxTb3VyY2VBZGRyZXNzTGVuID0gMDsKICAgIFN0b3JhZ2VOZXctPnRyYWNlUm91dGVDdGxJZkluZGV4ID0gMDsKICAgIFN0b3JhZ2VOZXctPnRyYWNlUm91dGVDdGxNaXNjT3B0aW9ucyA9IHN0cmR1cCgiIik7CiAgICBTdG9yYWdlTmV3LT50cmFjZVJvdXRlQ3RsTWlzY09wdGlvbnNMZW4gPSAwOwogICAgU3RvcmFnZU5ldy0+dHJhY2VSb3V0ZUN0bE1heEZhaWx1cmVzID0gNTsKICAgIFN0b3JhZ2VOZXctPnRyYWNlUm91dGVDdGxEb250RnJhZ21lbnQgPSAyOwogICAgU3RvcmFnZU5ldy0+dHJhY2VSb3V0ZUN0bEluaXRpYWxUdGwgPSAxOwogICAgU3RvcmFnZU5ldy0+dHJhY2VSb3V0ZUN0bEZyZXF1ZW5jeSA9IDA7CiAgICBTdG9yYWdlTmV3LT50cmFjZVJvdXRlQ3RsU3RvcmFnZVR5cGUgPSBTVF9OT05WT0xBVElMRTsKICAgIFN0b3JhZ2VOZXctPnRyYWNlUm91dGVDdGxBZG1pblN0YXR1cyA9IDI7CiAgICBTdG9yYWdlTmV3LT50cmFjZVJvdXRlQ3RsRGVzY3IgPSAoY2hhciAqKSBtYWxsb2Moc3RybGVuKCIwMCIpICsgMSk7CiAgICBpZiAoU3RvcmFnZU5ldy0+dHJhY2VSb3V0ZUN0bERlc2NyID09IE5VTEwpIHsKICAgICAgICBleGl0KDEpOwogICAgfQogICAgbWVtY3B5KFN0b3JhZ2VOZXctPnRyYWNlUm91dGVDdGxEZXNjciwgIjAwIiwgc3RybGVuKCIwMCIpICsgMSk7CiAgICBTdG9yYWdlTmV3LT50cmFjZVJvdXRlQ3RsRGVzY3Jbc3RybGVuKCIwMCIpXSA9ICdcMCc7CiAgICBTdG9yYWdlTmV3LT50cmFjZVJvdXRlQ3RsRGVzY3JMZW4gPQogICAgICAgIHN0cmxlbihTdG9yYWdlTmV3LT50cmFjZVJvdXRlQ3RsRGVzY3IpOwoKICAgIFN0b3JhZ2VOZXctPnRyYWNlUm91dGVDdGxNYXhSb3dzID0gNTA7CiAgICBTdG9yYWdlTmV3LT50cmFjZVJvdXRlQ3RsVHJhcEdlbmVyYXRpb24gPSBzdHJkdXAoIiIpOwogICAgU3RvcmFnZU5ldy0+dHJhY2VSb3V0ZUN0bFRyYXBHZW5lcmF0aW9uTGVuID0gMDsKICAgIFN0b3JhZ2VOZXctPnRyYWNlUm91dGVDdGxDcmVhdGVIb3BzRW50cmllcyA9IDI7CgogICAgU3RvcmFnZU5ldy0+dHJhY2VSb3V0ZUN0bFR5cGUgPSBjYWxsb2MoMSwgc2l6ZW9mKG9pZCkgKiBzaXplb2YoMikpOyAvKiAwLjAgKi8KICAgIFN0b3JhZ2VOZXctPnRyYWNlUm91dGVDdGxUeXBlTGVuID0gMjsKCiAgICBTdG9yYWdlTmV3LT50cmFjZVJvdXRlUmVzdWx0cyA9IE5VTEw7CiAgICBTdG9yYWdlTmV3LT50cmFjZVJvdXRlUHJvYmVIaXMgPSBOVUxMOwogICAgU3RvcmFnZU5ldy0+dHJhY2VSb3V0ZUhvcHMgPSBOVUxMOwoKICAgIFN0b3JhZ2VOZXctPnN0b3JhZ2VUeXBlID0gU1RfTk9OVk9MQVRJTEU7CiAgICAvKiBTdG9yYWdlTmV3LT50cmFjZVJvdXRlUHJvYmVIaXN0b3J5TWF4SW5kZXg9MDsgKi8KICAgIHJldHVybiBTdG9yYWdlTmV3Owp9CgoKLyoKICogdHJhY2VSb3V0ZUN0bFRhYmxlX2FkZCgpOiBhZGRzIGEgc3RydWN0dXJlIG5vZGUgdG8gb3VyIGRhdGEgc2V0IAogKi8KaW50CnRyYWNlUm91dGVDdGxUYWJsZV9hZGQoc3RydWN0IHRyYWNlUm91dGVDdGxUYWJsZV9kYXRhICp0aGVkYXRhKQp7CiAgICBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKnZhcnMgPSBOVUxMOwoKCiAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZUN0bFRhYmxlIiwgImFkZGluZyBkYXRhLi4uICAiKSk7CiAgICAvKgogICAgICogYWRkIHRoZSBpbmRleCB2YXJpYWJsZXMgdG8gdGhlIHZhcmJpbmQgbGlzdCwgd2hpY2ggaXMgCiAgICAgKiB1c2VkIGJ5IGhlYWRlcl9jb21wbGV4IHRvIGluZGV4IHRoZSBkYXRhIAogICAgICovCgoKICAgIHNubXBfdmFybGlzdF9hZGRfdmFyaWFibGUoJnZhcnMsIE5VTEwsIDAsIEFTTl9PQ1RFVF9TVFIsIChjaGFyICopIHRoZWRhdGEtPnRyYWNlUm91dGVDdGxPd25lckluZGV4LCB0aGVkYXRhLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleExlbik7ICAgLyogdHJhY2VSb3V0ZUN0bE93bmVySW5kZXggKi8KICAgIHNubXBfdmFybGlzdF9hZGRfdmFyaWFibGUoJnZhcnMsIE5VTEwsIDAsIEFTTl9PQ1RFVF9TVFIsIChjaGFyICopIHRoZWRhdGEtPnRyYWNlUm91dGVDdGxUZXN0TmFtZSwgdGhlZGF0YS0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lTGVuKTsgICAgICAgLyogdHJhY2VSb3V0ZUN0bE9wZXJhdGlvbk5hbWUgKi8KCiAgICBpZiAoaGVhZGVyX2NvbXBsZXhfYWRkX2RhdGEoJnRyYWNlUm91dGVDdGxUYWJsZVN0b3JhZ2UsIHZhcnMsIHRoZWRhdGEpCiAgICAgICAgPT0gTlVMTCkgewogICAgICAgIHZhcnMgPSBOVUxMOwogICAgICAgIHJldHVybiBTTk1QRVJSX0dFTkVSUjsKICAgIH0gZWxzZSB7CgogICAgICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlQ3RsVGFibGUiLCAicmVnaXN0ZXJlZCBhbiBlbnRyeVxuIikpOwoKCiAgICAgICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVDdGxUYWJsZSIsICJkb25lLlxuIikpOwogICAgICAgIHZhcnMgPSBOVUxMOwogICAgICAgIHJldHVybiBTTk1QRVJSX1NVQ0NFU1M7CiAgICB9Cn0KCmludAp0cmFjZVJvdXRlUmVzdWx0c1RhYmxlX2FkZChzdHJ1Y3QgdHJhY2VSb3V0ZUN0bFRhYmxlX2RhdGEgKnRoZWRhdGEpCnsKICAgIG5ldHNubXBfdmFyaWFibGVfbGlzdCAqdmFyc19saXN0ID0gTlVMTDsKICAgIHN0cnVjdCB0cmFjZVJvdXRlUmVzdWx0c1RhYmxlX2RhdGEgKnAgPSBOVUxMOwogICAgcCA9IHRoZWRhdGEtPnRyYWNlUm91dGVSZXN1bHRzOwogICAgaWYgKHRoZWRhdGEtPnRyYWNlUm91dGVSZXN1bHRzICE9IE5VTEwpIHsKICAgICAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzX2xpc3QsIE5VTEwsIDAsIEFTTl9PQ1RFVF9TVFIsIChjaGFyICopIHAtPnRyYWNlUm91dGVDdGxPd25lckluZGV4LCBwLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleExlbik7ICAgICAgLyogdHJhY2VSb3V0ZUN0bE93bmVySW5kZXggKi8KICAgICAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzX2xpc3QsIE5VTEwsIDAsIEFTTl9PQ1RFVF9TVFIsIChjaGFyICopIHAtPnRyYWNlUm91dGVDdGxUZXN0TmFtZSwgcC0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lTGVuKTsgIC8qIHRyYWNlUm91dGVDdGxUZXN0TmFtZSAqLwogICAgICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlUmVzdWx0c1RhYmxlIiwgImFkZGluZyBkYXRhLi4uICAiKSk7CiAgICAgICAgLyoKICAgICAgICAgKiBhZGQgdGhlIGluZGV4IHZhcmlhYmxlcyB0byB0aGUgdmFyYmluZCBsaXN0LCB3aGljaCBpcyAKICAgICAgICAgKiB1c2VkIGJ5IGhlYWRlcl9jb21wbGV4IHRvIGluZGV4IHRoZSBkYXRhIAogICAgICAgICAqLwoKICAgICAgICBoZWFkZXJfY29tcGxleF9hZGRfZGF0YSgmdHJhY2VSb3V0ZVJlc3VsdHNUYWJsZVN0b3JhZ2UsIHZhcnNfbGlzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwKTsKICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZVJlc3VsdHNUYWJsZSIsICJvdXQgZmluaXNoZWRcbiIpKTsKICAgICAgICB2YXJzX2xpc3QgPSBOVUxMOwogICAgICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlUmVzdWx0c1RhYmxlIiwgImRvbmUuXG4iKSk7CiAgICAgICAgcmV0dXJuIFNOTVBFUlJfU1VDQ0VTUzsKICAgIH0gZWxzZSB7CiAgICAgICAgdmFyc19saXN0ID0gTlVMTDsKICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZVJlc3VsdHNUYWJsZSIsICJlcnJvci5cbiIpKTsKICAgICAgICByZXR1cm4gU05NUF9FUlJfSU5DT05TSVNURU5UTkFNRTsKICAgIH0KfQoKCmludAp0cmFjZVJvdXRlUHJvYmVIaXN0b3J5VGFibGVfYWRkKHN0cnVjdCB0cmFjZVJvdXRlUHJvYmVIaXN0b3J5VGFibGVfZGF0YQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp0aGVkYXRhKQp7CiAgICBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKnZhcnNfbGlzdCA9IE5VTEw7CiAgICBpZiAodGhlZGF0YSAhPSBOVUxMKSB7CiAgICAgICAgc25tcF92YXJsaXN0X2FkZF92YXJpYWJsZSgmdmFyc19saXN0LCBOVUxMLCAwLCBBU05fT0NURVRfU1RSLCAoY2hhciAqKSB0aGVkYXRhLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleCwgdGhlZGF0YS0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXhMZW4pOyAgLyogdHJhY2VSb3V0ZUN0bE93bmVySW5kZXggKi8KICAgICAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzX2xpc3QsIE5VTEwsIDAsIEFTTl9PQ1RFVF9TVFIsIChjaGFyICopIHRoZWRhdGEtPnRyYWNlUm91dGVDdGxUZXN0TmFtZSwgdGhlZGF0YS0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lTGVuKTsgICAgICAvKiB0cmFjZVJvdXRlQ3RsVGVzdE5hbWUgKi8KICAgICAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzX2xpc3QsIE5VTEwsIDAsIEFTTl9VTlNJR05FRCwgKGNoYXIgKikgJnRoZWRhdGEtPnRyYWNlUm91dGVQcm9iZUhpc3RvcnlJbmRleCwgc2l6ZW9mKHRoZWRhdGEtPnRyYWNlUm91dGVQcm9iZUhpc3RvcnlJbmRleCkpOyAgICAgLyogdHJhY2VSb3V0ZVByb2JlSGlzdG9yeUluZGV4ICovCiAgICAgICAgc25tcF92YXJsaXN0X2FkZF92YXJpYWJsZSgmdmFyc19saXN0LCBOVUxMLCAwLCBBU05fVU5TSUdORUQsIChjaGFyICopICZ0aGVkYXRhLT50cmFjZVJvdXRlUHJvYmVIaXN0b3J5SG9wSW5kZXgsIHNpemVvZih0aGVkYXRhLT50cmFjZVJvdXRlUHJvYmVIaXN0b3J5SG9wSW5kZXgpKTsgICAgICAgLyogdHJhY2VSb3V0ZVByb2JlSGlzdG9yeUhvcEluZGV4ICovCiAgICAgICAgc25tcF92YXJsaXN0X2FkZF92YXJpYWJsZSgmdmFyc19saXN0LCBOVUxMLCAwLCBBU05fVU5TSUdORUQsIChjaGFyICopICZ0aGVkYXRhLT50cmFjZVJvdXRlUHJvYmVIaXN0b3J5UHJvYmVJbmRleCwgc2l6ZW9mKHRoZWRhdGEtPnRyYWNlUm91dGVQcm9iZUhpc3RvcnlQcm9iZUluZGV4KSk7ICAgLyogdHJhY2VSb3V0ZVByb2JlSGlzdG9yeVByb2JlSW5kZXggKi8KCiAgICAgICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVQcm9iZUhpc3RvcnlUYWJsZSIsICJhZGRpbmcgZGF0YS4uLiAgIikpOwogICAgICAgIC8qCiAgICAgICAgICogYWRkIHRoZSBpbmRleCB2YXJpYWJsZXMgdG8gdGhlIHZhcmJpbmQgbGlzdCwgd2hpY2ggaXMgCiAgICAgICAgICogdXNlZCBieSBoZWFkZXJfY29tcGxleCB0byBpbmRleCB0aGUgZGF0YSAKICAgICAgICAgKi8KCiAgICAgICAgaWYgKGhlYWRlcl9jb21wbGV4X2FkZF9kYXRhCiAgICAgICAgICAgICgmdHJhY2VSb3V0ZVByb2JlSGlzdG9yeVRhYmxlU3RvcmFnZSwgdmFyc19saXN0LAogICAgICAgICAgICAgdGhlZGF0YSkgPT0gTlVMTCkgewogICAgICAgICAgICB2YXJzX2xpc3QgPSBOVUxMOwogICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfSU5DT05TSVNURU5UTkFNRTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZVByb2JlSGlzdG9yeVRhYmxlIiwgIm91dCBmaW5pc2hlZFxuIikpOwoKICAgICAgICAgICAgdmFyc19saXN0ID0gTlVMTDsKCiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlUHJvYmVIaXN0b3J5VGFibGUiLCAiZG9uZS5cbiIpKTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBFUlJfU1VDQ0VTUzsKICAgICAgICB9CiAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBTTk1QX0VSUl9JTkNPTlNJU1RFTlROQU1FOwogICAgfQp9CgppbnQKdHJhY2VSb3V0ZVByb2JlSGlzdG9yeVRhYmxlX2FkZGFsbChzdHJ1Y3QgdHJhY2VSb3V0ZUN0bFRhYmxlX2RhdGEgKnRoZWRhdGEpCnsKICAgIG5ldHNubXBfdmFyaWFibGVfbGlzdCAqdmFyc19saXN0ID0gTlVMTDsKICAgIHN0cnVjdCB0cmFjZVJvdXRlUHJvYmVIaXN0b3J5VGFibGVfZGF0YSAqcCA9IE5VTEw7CiAgICBwID0gdGhlZGF0YS0+dHJhY2VSb3V0ZVByb2JlSGlzOwogICAgaWYgKHRoZWRhdGEtPnRyYWNlUm91dGVQcm9iZUhpcyAhPSBOVUxMKQogICAgICAgIGRvIHsKICAgICAgICAgICAgc25tcF92YXJsaXN0X2FkZF92YXJpYWJsZSgmdmFyc19saXN0LCBOVUxMLCAwLCBBU05fT0NURVRfU1RSLCAoY2hhciAqKSBwLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleCwgcC0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXhMZW4pOyAgLyogdHJhY2VSb3V0ZUN0bE93bmVySW5kZXggKi8KICAgICAgICAgICAgc25tcF92YXJsaXN0X2FkZF92YXJpYWJsZSgmdmFyc19saXN0LCBOVUxMLCAwLCBBU05fT0NURVRfU1RSLCAoY2hhciAqKSBwLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWUsIHAtPnRyYWNlUm91dGVDdGxUZXN0TmFtZUxlbik7ICAgICAgLyogdHJhY2VSb3V0ZUN0bFRlc3ROYW1lICovCiAgICAgICAgICAgIHNubXBfdmFybGlzdF9hZGRfdmFyaWFibGUoJnZhcnNfbGlzdCwgTlVMTCwgMCwgQVNOX1VOU0lHTkVELCAoY2hhciAqKSAmcC0+dHJhY2VSb3V0ZVByb2JlSGlzdG9yeUluZGV4LCBzaXplb2YocC0+dHJhY2VSb3V0ZVByb2JlSGlzdG9yeUluZGV4KSk7ICAgICAvKiB0cmFjZVJvdXRlUHJvYmVIaXN0b3J5SW5kZXggKi8KICAgICAgICAgICAgc25tcF92YXJsaXN0X2FkZF92YXJpYWJsZSgmdmFyc19saXN0LCBOVUxMLCAwLCBBU05fVU5TSUdORUQsIChjaGFyICopICZwLT50cmFjZVJvdXRlUHJvYmVIaXN0b3J5SG9wSW5kZXgsIHNpemVvZihwLT50cmFjZVJvdXRlUHJvYmVIaXN0b3J5SG9wSW5kZXgpKTsgICAgICAgLyogdHJhY2VSb3V0ZVByb2JlSGlzdG9yeUhvcEluZGV4ICovCiAgICAgICAgICAgIHNubXBfdmFybGlzdF9hZGRfdmFyaWFibGUoJnZhcnNfbGlzdCwgTlVMTCwgMCwgQVNOX1VOU0lHTkVELCAoY2hhciAqKSAmcC0+dHJhY2VSb3V0ZVByb2JlSGlzdG9yeVByb2JlSW5kZXgsIHNpemVvZihwLT50cmFjZVJvdXRlUHJvYmVIaXN0b3J5UHJvYmVJbmRleCkpOyAgIC8qIHRyYWNlUm91dGVQcm9iZUhpc3RvcnlQcm9iZUluZGV4ICovCgogICAgICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZVByb2JlSGlzdG9yeVRhYmxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImFkZGluZyBkYXRhLi4uICAiKSk7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIGFkZCB0aGUgaW5kZXggdmFyaWFibGVzIHRvIHRoZSB2YXJiaW5kIGxpc3QsIHdoaWNoIGlzIAogICAgICAgICAgICAgKiB1c2VkIGJ5IGhlYWRlcl9jb21wbGV4IHRvIGluZGV4IHRoZSBkYXRhIAogICAgICAgICAgICAgKi8KCiAgICAgICAgICAgIGlmIChoZWFkZXJfY29tcGxleF9hZGRfZGF0YQogICAgICAgICAgICAgICAgKCZ0cmFjZVJvdXRlUHJvYmVIaXN0b3J5VGFibGVTdG9yYWdlLCB2YXJzX2xpc3QsCiAgICAgICAgICAgICAgICAgcCkgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgdmFyc19saXN0ID0gTlVMTDsKICAgICAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9JTkNPTlNJU1RFTlROQU1FOwogICAgICAgICAgICB9IGVsc2UgewoKICAgICAgICAgICAgICAgIHN0cnVjdCBoZWFkZXJfY29tcGxleF9pbmRleCAqdGVtcCA9IE5VTEw7CiAgICAgICAgICAgICAgICB0ZW1wID0gdHJhY2VSb3V0ZVByb2JlSGlzdG9yeVRhYmxlU3RvcmFnZTsKICAgICAgICAgICAgICAgIGlmICh0cmFjZVJvdXRlUHJvYmVIaXN0b3J5VGFibGVTdG9yYWdlICE9IE5VTEwpCiAgICAgICAgICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZVByb2JlSGlzdG9yeVRhYmxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFkZGluZyBkYXRhLHZhcnNfb2lkPSIpKTsKICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdNU0dPSUQoKCJ0cmFjZVJvdXRlUHJvYmVIaXN0b3J5VGFibGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wLT5uYW1lLCB0ZW1wLT5uYW1lbGVuKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlUHJvYmVIaXN0b3J5VGFibGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXG4gIikpOwogICAgICAgICAgICAgICAgICAgICAgICB0ZW1wID0gdGVtcC0+bmV4dDsKICAgICAgICAgICAgICAgICAgICB9IHdoaWxlICh0ZW1wICE9IE5VTEwpOwoKICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlUHJvYmVIaXN0b3J5VGFibGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIm91dCBmaW5pc2hlZFxuIikpOwogICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVQcm9iZUhpc3RvcnlUYWJsZSIsICJkb25lLlxuIikpOwogICAgICAgICAgICAgICAgdmFyc19saXN0ID0gTlVMTDsKICAgICAgICAgICAgICAgIHJldHVybiBTTk1QRVJSX1NVQ0NFU1M7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHAgPSBwLT5uZXh0OwogICAgICAgIH0gd2hpbGUgKHAgIT0gTlVMTCk7CiAgICBlbHNlIHsKICAgICAgICByZXR1cm4gU05NUF9FUlJfSU5DT05TSVNURU5UTkFNRTsKICAgIH0KCn0KCgoKaW50CnRyYWNlUm91dGVIb3BzVGFibGVfYWRkKHN0cnVjdCB0cmFjZVJvdXRlSG9wc1RhYmxlX2RhdGEgKnRoZWRhdGEpCnsKICAgIG5ldHNubXBfdmFyaWFibGVfbGlzdCAqdmFyc19saXN0ID0gTlVMTDsKCiAgICBpZiAodGhlZGF0YSAhPSBOVUxMKSB7CiAgICAgICAgc25tcF92YXJsaXN0X2FkZF92YXJpYWJsZSgmdmFyc19saXN0LCBOVUxMLCAwLCBBU05fT0NURVRfU1RSLCAoY2hhciAqKSB0aGVkYXRhLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleCwgdGhlZGF0YS0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXhMZW4pOyAgLyogdHJhY2VSb3V0ZUN0bE93bmVySW5kZXggKi8KICAgICAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzX2xpc3QsIE5VTEwsIDAsIEFTTl9PQ1RFVF9TVFIsIChjaGFyICopIHRoZWRhdGEtPnRyYWNlUm91dGVDdGxUZXN0TmFtZSwgdGhlZGF0YS0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lTGVuKTsgICAgICAvKiB0cmFjZVJvdXRlQ3RsVGVzdE5hbWUgKi8KICAgICAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzX2xpc3QsIE5VTEwsIDAsIEFTTl9VTlNJR05FRCwgKGNoYXIgKikgJnRoZWRhdGEtPnRyYWNlUm91dGVIb3BzSG9wSW5kZXgsIHNpemVvZih0aGVkYXRhLT50cmFjZVJvdXRlSG9wc0hvcEluZGV4KSk7ICAgICAgIC8qIHRyYWNlUm91dGVIb3BzSG9wSW5kZXggKi8KCiAgICAgICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVIb3BzVGFibGUiLCAiYWRkaW5nIGRhdGEuLi4gICIpKTsKICAgICAgICAvKgogICAgICAgICAqIGFkZCB0aGUgaW5kZXggdmFyaWFibGVzIHRvIHRoZSB2YXJiaW5kIGxpc3QsIHdoaWNoIGlzIAogICAgICAgICAqIHVzZWQgYnkgaGVhZGVyX2NvbXBsZXggdG8gaW5kZXggdGhlIGRhdGEgCiAgICAgICAgICovCgogICAgICAgIGlmIChoZWFkZXJfY29tcGxleF9hZGRfZGF0YQogICAgICAgICAgICAoJnRyYWNlUm91dGVIb3BzVGFibGVTdG9yYWdlLCB2YXJzX2xpc3QsIHRoZWRhdGEpID09IE5VTEwpIHsKICAgICAgICAgICAgdmFyc19saXN0ID0gTlVMTDsKICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX0lOQ09OU0lTVEVOVE5BTUU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVIb3BzVGFibGUiLCAib3V0IGZpbmlzaGVkXG4iKSk7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlSG9wc1RhYmxlIiwgImRvbmUuXG4iKSk7CiAgICAgICAgICAgIHZhcnNfbGlzdCA9IE5VTEw7CiAgICAgICAgICAgIHJldHVybiBTTk1QRVJSX1NVQ0NFU1M7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIFNOTVBFUlJfR0VORVJSOwp9CgppbnQKdHJhY2VSb3V0ZUhvcHNUYWJsZV9hZGRhbGwoc3RydWN0IHRyYWNlUm91dGVDdGxUYWJsZV9kYXRhICp0aGVkYXRhKQp7CiAgICBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKnZhcnNfbGlzdCA9IE5VTEw7CiAgICBzdHJ1Y3QgdHJhY2VSb3V0ZUhvcHNUYWJsZV9kYXRhICpwID0gTlVMTDsKICAgIHZhcnNfbGlzdCA9IE5VTEw7CiAgICBwID0gdGhlZGF0YS0+dHJhY2VSb3V0ZUhvcHM7CiAgICBpZiAodGhlZGF0YS0+dHJhY2VSb3V0ZUhvcHMgIT0gTlVMTCkgewogICAgICAgIGRvIHsKICAgICAgICAgICAgc25tcF92YXJsaXN0X2FkZF92YXJpYWJsZSgmdmFyc19saXN0LCBOVUxMLCAwLCBBU05fT0NURVRfU1RSLCAoY2hhciAqKSBwLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleCwgcC0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXhMZW4pOyAgLyogdHJhY2VSb3V0ZUN0bE93bmVySW5kZXggKi8KICAgICAgICAgICAgc25tcF92YXJsaXN0X2FkZF92YXJpYWJsZSgmdmFyc19saXN0LCBOVUxMLCAwLCBBU05fT0NURVRfU1RSLCAoY2hhciAqKSBwLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWUsIHAtPnRyYWNlUm91dGVDdGxUZXN0TmFtZUxlbik7ICAgICAgLyogdHJhY2VSb3V0ZUN0bFRlc3ROYW1lICovCiAgICAgICAgICAgIHNubXBfdmFybGlzdF9hZGRfdmFyaWFibGUoJnZhcnNfbGlzdCwgTlVMTCwgMCwgQVNOX1VOU0lHTkVELCAoY2hhciAqKSAmcC0+dHJhY2VSb3V0ZUhvcHNIb3BJbmRleCwgc2l6ZW9mKHAtPnRyYWNlUm91dGVIb3BzSG9wSW5kZXgpKTsgICAgICAgLyogdHJhY2VSb3V0ZUhvcHNIb3BJbmRleCAqLwoKICAgICAgICAgICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVIb3BzVGFibGUiLCAiYWRkaW5nIGRhdGEuLi4gICIpKTsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogYWRkIHRoZSBpbmRleCB2YXJpYWJsZXMgdG8gdGhlIHZhcmJpbmQgbGlzdCwgd2hpY2ggaXMgCiAgICAgICAgICAgICAqIHVzZWQgYnkgaGVhZGVyX2NvbXBsZXggdG8gaW5kZXggdGhlIGRhdGEgCiAgICAgICAgICAgICAqLwoKICAgICAgICAgICAgaWYgKGhlYWRlcl9jb21wbGV4X2FkZF9kYXRhCiAgICAgICAgICAgICAgICAoJnRyYWNlUm91dGVIb3BzVGFibGVTdG9yYWdlLCB2YXJzX2xpc3QsIHApID09IE5VTEwpIHsKICAgICAgICAgICAgICAgIHZhcnNfbGlzdCA9IE5VTEw7CiAgICAgICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfSU5DT05TSVNURU5UTkFNRTsKICAgICAgICAgICAgfSBlbHNlIHsKCiAgICAgICAgICAgICAgICBzdHJ1Y3QgaGVhZGVyX2NvbXBsZXhfaW5kZXggKnRlbXAgPSBOVUxMOwogICAgICAgICAgICAgICAgdGVtcCA9IHRyYWNlUm91dGVIb3BzVGFibGVTdG9yYWdlOwogICAgICAgICAgICAgICAgaWYgKHRyYWNlUm91dGVIb3BzVGFibGVTdG9yYWdlICE9IE5VTEwpCiAgICAgICAgICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZVByb2JlSGlzdG9yeVRhYmxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFkZGluZyBkYXRhLHZhcnNfb2lkPSIpKTsKICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdNU0dPSUQoKCJ0cmFjZVJvdXRlUHJvYmVIaXN0b3J5VGFibGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wLT5uYW1lLCB0ZW1wLT5uYW1lbGVuKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlUHJvYmVIaXN0b3J5VGFibGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXG4gIikpOwogICAgICAgICAgICAgICAgICAgICAgICB0ZW1wID0gdGVtcC0+bmV4dDsKICAgICAgICAgICAgICAgICAgICB9IHdoaWxlICh0ZW1wICE9IE5VTEwpOwogICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVIb3BzVGFibGUiLCAib3V0IGZpbmlzaGVkXG4iKSk7CgogICAgICAgICAgICAgICAgdmFyc19saXN0ID0gTlVMTDsKICAgICAgICAgICAgfQogICAgICAgICAgICBwID0gcC0+bmV4dDsKICAgICAgICB9IHdoaWxlIChwICE9IE5VTEwpOwogICAgICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlSG9wc1RhYmxlIiwgImRvbmUuXG4iKSk7CiAgICAgICAgcmV0dXJuIFNOTVBFUlJfU1VDQ0VTUzsKICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX0lOQ09OU0lTVEVOVE5BTUU7CiAgICB9Cgp9CgoKdW5zaWduZWQgbG9uZwp0cmFjZVJvdXRlUHJvYmVIaXN0b3J5VGFibGVfY291bnQoc3RydWN0IHRyYWNlUm91dGVDdGxUYWJsZV9kYXRhICp0aGVkYXRhKQp7CiAgICBzdHJ1Y3QgaGVhZGVyX2NvbXBsZXhfaW5kZXggKmhjaXB0cjIgPSBOVUxMOwogICAgbmV0c25tcF92YXJpYWJsZV9saXN0ICp2YXJzID0gTlVMTDsKICAgIG9pZCAgICAgICAgICAgICBuZXdvaWRbTUFYX09JRF9MRU5dOwogICAgc2l6ZV90ICAgICAgICAgIG5ld29pZF9sZW47CiAgICB1bnNpZ25lZCBsb25nICAgY291bnQgPSAwOwoKICAgIHNubXBfdmFybGlzdF9hZGRfdmFyaWFibGUoJnZhcnMsIE5VTEwsIDAsIEFTTl9PQ1RFVF9TVFIsIChjaGFyICopIHRoZWRhdGEtPnRyYWNlUm91dGVDdGxPd25lckluZGV4LCB0aGVkYXRhLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleExlbik7ICAgLyogdHJhY2VSb3V0ZUN0bE93bmVySW5kZXggKi8KICAgIHNubXBfdmFybGlzdF9hZGRfdmFyaWFibGUoJnZhcnMsIE5VTEwsIDAsIEFTTl9PQ1RFVF9TVFIsIChjaGFyICopIHRoZWRhdGEtPnRyYWNlUm91dGVDdGxUZXN0TmFtZSwgdGhlZGF0YS0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lTGVuKTsgICAgICAgLyogdHJhY2VSb3V0ZUN0bFRlc3ROYW1lICovCgogICAgaGVhZGVyX2NvbXBsZXhfZ2VuZXJhdGVfb2lkKG5ld29pZCwgJm5ld29pZF9sZW4sIE5VTEwsIDAsIHZhcnMpOwoKICAgIHZhcnMgPSBOVUxMOwogICAgZm9yIChoY2lwdHIyID0gdHJhY2VSb3V0ZVByb2JlSGlzdG9yeVRhYmxlU3RvcmFnZTsgaGNpcHRyMiAhPSBOVUxMOwogICAgICAgICBoY2lwdHIyID0gaGNpcHRyMi0+bmV4dCkgewogICAgICAgIGlmIChzbm1wX29pZF9jb21wYXJlKG5ld29pZCwgbmV3b2lkX2xlbiwgaGNpcHRyMi0+bmFtZSwgbmV3b2lkX2xlbikKICAgICAgICAgICAgPT0gMCkgewogICAgICAgICAgICBjb3VudCA9IGNvdW50ICsgMTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gY291bnQ7Cn0KCgoKdW5zaWduZWQgbG9uZwp0cmFjZVJvdXRlSG9wc1RhYmxlX2NvdW50KHN0cnVjdCB0cmFjZVJvdXRlQ3RsVGFibGVfZGF0YSAqdGhlZGF0YSkKewogICAgc3RydWN0IGhlYWRlcl9jb21wbGV4X2luZGV4ICpoY2lwdHIyID0gTlVMTDsKICAgIG5ldHNubXBfdmFyaWFibGVfbGlzdCAqdmFycyA9IE5VTEw7CiAgICBvaWQgICAgICAgICAgICAgbmV3b2lkW01BWF9PSURfTEVOXTsKICAgIHNpemVfdCAgICAgICAgICBuZXdvaWRfbGVuOwogICAgdW5zaWduZWQgbG9uZyAgIGNvdW50ID0gMDsKCiAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzLCBOVUxMLCAwLCBBU05fT0NURVRfU1RSLCAoY2hhciAqKSB0aGVkYXRhLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleCwgdGhlZGF0YS0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXhMZW4pOyAgIC8qIHRyYWNlUm91dGVDdGxPd25lckluZGV4ICovCiAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzLCBOVUxMLCAwLCBBU05fT0NURVRfU1RSLCAoY2hhciAqKSB0aGVkYXRhLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWUsIHRoZWRhdGEtPnRyYWNlUm91dGVDdGxUZXN0TmFtZUxlbik7ICAgICAgIC8qIHRyYWNlUm91dGVDdGxPcGVyYXRpb25OYW1lICovCgogICAgaGVhZGVyX2NvbXBsZXhfZ2VuZXJhdGVfb2lkKG5ld29pZCwgJm5ld29pZF9sZW4sIE5VTEwsIDAsIHZhcnMpOwoKICAgIHZhcnMgPSBOVUxMOwogICAgZm9yIChoY2lwdHIyID0gdHJhY2VSb3V0ZUhvcHNUYWJsZVN0b3JhZ2U7IGhjaXB0cjIgIT0gTlVMTDsKICAgICAgICAgaGNpcHRyMiA9IGhjaXB0cjItPm5leHQpIHsKICAgICAgICBpZiAoc25tcF9vaWRfY29tcGFyZShuZXdvaWQsIG5ld29pZF9sZW4sIGhjaXB0cjItPm5hbWUsIG5ld29pZF9sZW4pCiAgICAgICAgICAgID09IDApIHsKICAgICAgICAgICAgY291bnQgPSBjb3VudCArIDE7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIGNvdW50Owp9CgoKCnZvaWQKdHJhY2VSb3V0ZVByb2JlSGlzdG9yeVRhYmxlX2RlbExhc3Qoc3RydWN0IHRyYWNlUm91dGVDdGxUYWJsZV9kYXRhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp0aGVkYXRhKQp7CiAgICBzdHJ1Y3QgaGVhZGVyX2NvbXBsZXhfaW5kZXggKmhjaXB0cjIgPSBOVUxMOwogICAgc3RydWN0IGhlYWRlcl9jb21wbGV4X2luZGV4ICpoY2lsYXN0ID0gTlVMTDsKICAgIHN0cnVjdCB0cmFjZVJvdXRlUHJvYmVIaXN0b3J5VGFibGVfZGF0YSAqU3RvcmFnZVRtcCA9IE5VTEw7CiAgICBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKnZhcnMgPSBOVUxMOwogICAgb2lkICAgICAgICAgICAgIG5ld29pZFtNQVhfT0lEX0xFTl07CiAgICBzaXplX3QgICAgICAgICAgbmV3b2lkX2xlbiA9IDA7CiAgICB0aW1lX3QgICAgICAgICAgbGFzdF90aW1lID0gMjE0NzQ4MzY0NzsKICAgIHRpbWVfdCAgICAgICAgICB0cDsKCiAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzLCBOVUxMLCAwLCBBU05fT0NURVRfU1RSLCAoY2hhciAqKSB0aGVkYXRhLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleCwgdGhlZGF0YS0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXhMZW4pOyAgIC8qIHRyYWNlUm91dGVDdGxPd25lckluZGV4ICovCiAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzLCBOVUxMLCAwLCBBU05fT0NURVRfU1RSLCAoY2hhciAqKSB0aGVkYXRhLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWUsIHRoZWRhdGEtPnRyYWNlUm91dGVDdGxUZXN0TmFtZUxlbik7ICAgICAgIC8qIHRyYWNlUm91dGVDdGxPcGVyYXRpb25OYW1lICovCgogICAgbWVtc2V0KG5ld29pZCwgJ1wwJywgc2l6ZW9mKG9pZCkgKiBNQVhfT0lEX0xFTik7CiAgICBoZWFkZXJfY29tcGxleF9nZW5lcmF0ZV9vaWQobmV3b2lkLCAmbmV3b2lkX2xlbiwgTlVMTCwgMCwgdmFycyk7CgogICAgZm9yIChoY2lsYXN0ID0gaGNpcHRyMiA9IHRyYWNlUm91dGVQcm9iZUhpc3RvcnlUYWJsZVN0b3JhZ2U7CiAgICAgICAgIGhjaXB0cjIgIT0gTlVMTDsgaGNpcHRyMiA9IGhjaXB0cjItPm5leHQpIHsKICAgICAgICBpZiAoc25tcF9vaWRfY29tcGFyZShuZXdvaWQsIG5ld29pZF9sZW4sIGhjaXB0cjItPm5hbWUsIG5ld29pZF9sZW4pCiAgICAgICAgICAgID09IDApIHsKCiAgICAgICAgICAgIFN0b3JhZ2VUbXAgPQogICAgICAgICAgICAgICAgaGVhZGVyX2NvbXBsZXhfZ2V0X2Zyb21fb2lkCiAgICAgICAgICAgICAgICAodHJhY2VSb3V0ZVByb2JlSGlzdG9yeVRhYmxlU3RvcmFnZSwgaGNpcHRyMi0+bmFtZSwKICAgICAgICAgICAgICAgICBoY2lwdHIyLT5uYW1lbGVuKTsKICAgICAgICAgICAgdHAgPSBTdG9yYWdlVG1wLT50cmFjZVJvdXRlUHJvYmVIaXN0b3J5VGltZV90aW1lOwoKICAgICAgICAgICAgaWYgKGxhc3RfdGltZSA+IHRwKSB7CiAgICAgICAgICAgICAgICBsYXN0X3RpbWUgPSB0cDsKICAgICAgICAgICAgICAgIGhjaWxhc3QgPSBoY2lwdHIyOwogICAgICAgICAgICB9CgogICAgICAgIH0KICAgIH0KICAgIGhlYWRlcl9jb21wbGV4X2V4dHJhY3RfZW50cnkoJnRyYWNlUm91dGVQcm9iZUhpc3RvcnlUYWJsZVN0b3JhZ2UsIGhjaWxhc3QpOwogICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVQcm9iZUhpc3RvcnlUYWJsZSIsCiAgICAgICAgICAgICAgICAiZGVsZXRlIHRoZSBsYXN0IG9uZSBzdWNjZXNzIVxuIikpOwogICAgdmFycyA9IE5VTEw7Cn0KCgoKdm9pZAp0cmFjZVJvdXRlQ3RsVGFibGVfY2xlYW5lcihzdHJ1Y3QgaGVhZGVyX2NvbXBsZXhfaW5kZXggKnRoZXN0dWZmKQp7CiAgICBzdHJ1Y3QgaGVhZGVyX2NvbXBsZXhfaW5kZXggKmhjaXB0ciA9IE5VTEw7CiAgICBzdHJ1Y3QgdHJhY2VSb3V0ZUN0bFRhYmxlX2RhdGEgKlN0b3JhZ2VEZWwgPSBOVUxMOwogICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVDdGxUYWJsZSIsICJjbGVhbmVyb3V0ICAiKSk7CiAgICBmb3IgKGhjaXB0ciA9IHRoZXN0dWZmOyBoY2lwdHIgIT0gTlVMTDsgaGNpcHRyID0gaGNpcHRyLT5uZXh0KSB7CiAgICAgICAgU3RvcmFnZURlbCA9CiAgICAgICAgICAgIGhlYWRlcl9jb21wbGV4X2V4dHJhY3RfZW50cnkoJnRyYWNlUm91dGVDdGxUYWJsZVN0b3JhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGNpcHRyKTsKICAgICAgICBpZiAoU3RvcmFnZURlbCAhPSBOVUxMKSB7CiAgICAgICAgICAgIGZyZWUoU3RvcmFnZURlbC0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXgpOwogICAgICAgICAgICBTdG9yYWdlRGVsLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleCA9IE5VTEw7CiAgICAgICAgICAgIGZyZWUoU3RvcmFnZURlbC0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lKTsKICAgICAgICAgICAgU3RvcmFnZURlbC0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lID0gTlVMTDsKICAgICAgICAgICAgZnJlZShTdG9yYWdlRGVsLT50cmFjZVJvdXRlQ3RsVGFyZ2V0QWRkcmVzcyk7CiAgICAgICAgICAgIFN0b3JhZ2VEZWwtPnRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzID0gTlVMTDsKICAgICAgICAgICAgZnJlZShTdG9yYWdlRGVsLT50cmFjZVJvdXRlQ3RsU291cmNlQWRkcmVzcyk7CiAgICAgICAgICAgIFN0b3JhZ2VEZWwtPnRyYWNlUm91dGVDdGxTb3VyY2VBZGRyZXNzID0gTlVMTDsKICAgICAgICAgICAgZnJlZShTdG9yYWdlRGVsLT50cmFjZVJvdXRlQ3RsTWlzY09wdGlvbnMpOwogICAgICAgICAgICBTdG9yYWdlRGVsLT50cmFjZVJvdXRlQ3RsTWlzY09wdGlvbnMgPSBOVUxMOwogICAgICAgICAgICBmcmVlKFN0b3JhZ2VEZWwtPnRyYWNlUm91dGVDdGxEZXNjcik7CiAgICAgICAgICAgIFN0b3JhZ2VEZWwtPnRyYWNlUm91dGVDdGxEZXNjciA9IE5VTEw7CiAgICAgICAgICAgIGZyZWUoU3RvcmFnZURlbC0+dHJhY2VSb3V0ZUN0bFRyYXBHZW5lcmF0aW9uKTsKICAgICAgICAgICAgU3RvcmFnZURlbC0+dHJhY2VSb3V0ZUN0bFRyYXBHZW5lcmF0aW9uID0gTlVMTDsKICAgICAgICAgICAgZnJlZShTdG9yYWdlRGVsLT50cmFjZVJvdXRlQ3RsVHlwZSk7CiAgICAgICAgICAgIFN0b3JhZ2VEZWwtPnRyYWNlUm91dGVDdGxUeXBlID0gTlVMTDsKICAgICAgICAgICAgZnJlZShTdG9yYWdlRGVsKTsKICAgICAgICAgICAgU3RvcmFnZURlbCA9IE5VTEw7CgogICAgICAgIH0KICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZUN0bFRhYmxlIiwgImNsZWFuZXIgICIpKTsKICAgIH0KfQoKCi8qCiAqIHBhcnNlX210ZU9iamVjdHNUYWJsZSgpOgogKiAgIHBhcnNlcyAuY29uZiBmaWxlIGVudHJpZXMgbmVlZGVkIHRvIGNvbmZpZ3VyZSB0aGUgbWliLgogKi8Kdm9pZApwYXJzZV90cmFjZVJvdXRlQ3RsVGFibGUoY29uc3QgY2hhciAqdG9rZW4sIGNoYXIgKmxpbmUpCnsKICAgIHNpemVfdCAgICAgICAgICB0bXBpbnQ7CiAgICBzdHJ1Y3QgdHJhY2VSb3V0ZUN0bFRhYmxlX2RhdGEgKlN0b3JhZ2VUbXAgPQogICAgICAgIFNOTVBfTUFMTE9DX1NUUlVDVCh0cmFjZVJvdXRlQ3RsVGFibGVfZGF0YSk7CgogICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVDdGxUYWJsZSIsICJwYXJzaW5nIGNvbmZpZy4uLiAgIikpOwoKCiAgICBpZiAoU3RvcmFnZVRtcCA9PSBOVUxMKSB7CiAgICAgICAgY29uZmlnX3BlcnJvcigibWFsbG9jIGZhaWx1cmUiKTsKICAgICAgICByZXR1cm47CiAgICB9CgoKICAgIGxpbmUgPQogICAgICAgIHJlYWRfY29uZmlnX3JlYWRfZGF0YShBU05fT0NURVRfU1RSLCBsaW5lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleExlbik7CiAgICBpZiAoU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXggPT0gTlVMTCkgewogICAgICAgIGNvbmZpZ19wZXJyb3IoImludmFsaWQgc3BlY2lmaWNhdGlvbiBmb3IgdHJhY2VSb3V0ZUN0bE93bmVySW5kZXgiKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbGluZSA9CiAgICAgICAgcmVhZF9jb25maWdfcmVhZF9kYXRhKEFTTl9PQ1RFVF9TVFIsIGxpbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWVMZW4pOwogICAgaWYgKFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUZXN0TmFtZSA9PSBOVUxMKSB7CiAgICAgICAgY29uZmlnX3BlcnJvcigiaW52YWxpZCBzcGVjaWZpY2F0aW9uIGZvciB0cmFjZVJvdXRlQ3RsVGVzdE5hbWUiKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbGluZSA9CiAgICAgICAgcmVhZF9jb25maWdfcmVhZF9kYXRhKEFTTl9JTlRFR0VSLCBsaW5lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFRhcmdldEFkZHJlc3NUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG1waW50KTsKCiAgICBsaW5lID0KICAgICAgICByZWFkX2NvbmZpZ19yZWFkX2RhdGEoQVNOX09DVEVUX1NUUiwgbGluZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFRhcmdldEFkZHJlc3NMZW4pOwogICAgaWYgKFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzID09IE5VTEwpIHsKICAgICAgICBjb25maWdfcGVycm9yCiAgICAgICAgICAgICgiaW52YWxpZCBzcGVjaWZpY2F0aW9uIGZvciB0cmFjZVJvdXRlQ3RsVGFyZ2V0QWRkcmVzcyIpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBsaW5lID0KICAgICAgICByZWFkX2NvbmZpZ19yZWFkX2RhdGEoQVNOX0lOVEVHRVIsIGxpbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsQnlQYXNzUm91dGVUYWJsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRtcGludCk7CiAgICBsaW5lID0KICAgICAgICByZWFkX2NvbmZpZ19yZWFkX2RhdGEoQVNOX1VOU0lHTkVELCBsaW5lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bERhdGFTaXplLCAmdG1waW50KTsKCiAgICBsaW5lID0KICAgICAgICByZWFkX2NvbmZpZ19yZWFkX2RhdGEoQVNOX1VOU0lHTkVELCBsaW5lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFRpbWVPdXQsICZ0bXBpbnQpOwoKICAgIGxpbmUgPQogICAgICAgIHJlYWRfY29uZmlnX3JlYWRfZGF0YShBU05fVU5TSUdORUQsIGxpbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsUHJvYmVzUGVySG9wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG1waW50KTsKCiAgICBsaW5lID0KICAgICAgICByZWFkX2NvbmZpZ19yZWFkX2RhdGEoQVNOX1VOU0lHTkVELCBsaW5lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFBvcnQsICZ0bXBpbnQpOwoKICAgIGxpbmUgPQogICAgICAgIHJlYWRfY29uZmlnX3JlYWRfZGF0YShBU05fVU5TSUdORUQsIGxpbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsTWF4VHRsLCAmdG1waW50KTsKCiAgICBsaW5lID0KICAgICAgICByZWFkX2NvbmZpZ19yZWFkX2RhdGEoQVNOX1VOU0lHTkVELCBsaW5lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bERTRmllbGQsICZ0bXBpbnQpOwoKICAgIGxpbmUgPQogICAgICAgIHJlYWRfY29uZmlnX3JlYWRfZGF0YShBU05fSU5URUdFUiwgbGluZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxTb3VyY2VBZGRyZXNzVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRtcGludCk7CgogICAgbGluZSA9CiAgICAgICAgcmVhZF9jb25maWdfcmVhZF9kYXRhKEFTTl9PQ1RFVF9TVFIsIGxpbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsU291cmNlQWRkcmVzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxTb3VyY2VBZGRyZXNzTGVuKTsKICAgIGlmIChTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsU291cmNlQWRkcmVzcyA9PSBOVUxMKSB7CiAgICAgICAgY29uZmlnX3BlcnJvcgogICAgICAgICAgICAoImludmFsaWQgc3BlY2lmaWNhdGlvbiBmb3IgdHJhY2VSb3V0ZUN0bFNvdXJjZUFkZHJlc3MiKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbGluZSA9CiAgICAgICAgcmVhZF9jb25maWdfcmVhZF9kYXRhKEFTTl9JTlRFR0VSLCBsaW5lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bElmSW5kZXgsICZ0bXBpbnQpOwoKICAgIGxpbmUgPQogICAgICAgIHJlYWRfY29uZmlnX3JlYWRfZGF0YShBU05fT0NURVRfU1RSLCBsaW5lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bE1pc2NPcHRpb25zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bE1pc2NPcHRpb25zTGVuKTsKICAgIGlmIChTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsTWlzY09wdGlvbnMgPT0gTlVMTCkgewogICAgICAgIGNvbmZpZ19wZXJyb3IKICAgICAgICAgICAgKCJpbnZhbGlkIHNwZWNpZmljYXRpb24gZm9yIHRyYWNlUm91dGVDdGxNaXNjT3B0aW9ucyIpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBsaW5lID0KICAgICAgICByZWFkX2NvbmZpZ19yZWFkX2RhdGEoQVNOX1VOU0lHTkVELCBsaW5lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bE1heEZhaWx1cmVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG1waW50KTsKCiAgICBsaW5lID0KICAgICAgICByZWFkX2NvbmZpZ19yZWFkX2RhdGEoQVNOX0lOVEVHRVIsIGxpbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsRG9udEZyYWdtZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG1waW50KTsKCiAgICBsaW5lID0KICAgICAgICByZWFkX2NvbmZpZ19yZWFkX2RhdGEoQVNOX1VOU0lHTkVELCBsaW5lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bEluaXRpYWxUdGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0bXBpbnQpOwoKICAgIGxpbmUgPQogICAgICAgIHJlYWRfY29uZmlnX3JlYWRfZGF0YShBU05fVU5TSUdORUQsIGxpbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsRnJlcXVlbmN5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG1waW50KTsKCiAgICBsaW5lID0KICAgICAgICByZWFkX2NvbmZpZ19yZWFkX2RhdGEoQVNOX0lOVEVHRVIsIGxpbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsU3RvcmFnZVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0bXBpbnQpOwoKICAgIGxpbmUgPQogICAgICAgIHJlYWRfY29uZmlnX3JlYWRfZGF0YShBU05fSU5URUdFUiwgbGluZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxBZG1pblN0YXR1cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRtcGludCk7CgogICAgbGluZSA9CiAgICAgICAgcmVhZF9jb25maWdfcmVhZF9kYXRhKEFTTl9PQ1RFVF9TVFIsIGxpbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsRGVzY3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsRGVzY3JMZW4pOwogICAgaWYgKFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxEZXNjciA9PSBOVUxMKSB7CiAgICAgICAgY29uZmlnX3BlcnJvcigiaW52YWxpZCBzcGVjaWZpY2F0aW9uIGZvciB0cmFjZVJvdXRlQ3RsVHJhcERlc2NyIik7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGxpbmUgPQogICAgICAgIHJlYWRfY29uZmlnX3JlYWRfZGF0YShBU05fVU5TSUdORUQsIGxpbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsTWF4Um93cywgJnRtcGludCk7CgogICAgbGluZSA9CiAgICAgICAgcmVhZF9jb25maWdfcmVhZF9kYXRhKEFTTl9PQ1RFVF9TVFIsIGxpbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVHJhcEdlbmVyYXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVHJhcEdlbmVyYXRpb25MZW4pOwogICAgaWYgKFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUcmFwR2VuZXJhdGlvbiA9PSBOVUxMKSB7CiAgICAgICAgY29uZmlnX3BlcnJvcgogICAgICAgICAgICAoImludmFsaWQgc3BlY2lmaWNhdGlvbiBmb3IgdHJhY2VSb3V0ZUN0bFRyYXBHZW5lcmF0aW9uIik7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGxpbmUgPQogICAgICAgIHJlYWRfY29uZmlnX3JlYWRfZGF0YShBU05fSU5URUdFUiwgbGluZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxDcmVhdGVIb3BzRW50cmllcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRtcGludCk7CgogICAgbGluZSA9CiAgICAgICAgcmVhZF9jb25maWdfcmVhZF9kYXRhKEFTTl9PQkpFQ1RfSUQsIGxpbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUeXBlTGVuKTsKICAgIGlmIChTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVHlwZSA9PSBOVUxMKSB7CiAgICAgICAgY29uZmlnX3BlcnJvcigiaW52YWxpZCBzcGVjaWZpY2F0aW9uIGZvciB0cmFjZVJvdXRlQ3RsVHlwZSIpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBsaW5lID0KICAgICAgICByZWFkX2NvbmZpZ19yZWFkX2RhdGEoQVNOX0lOVEVHRVIsIGxpbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsUm93U3RhdHVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG1waW50KTsKCiAgICBsaW5lID0KICAgICAgICByZWFkX2NvbmZpZ19yZWFkX2RhdGEoQVNOX1VOU0lHTkVELCBsaW5lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZVByb2JlSGlzdG9yeU1heEluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG1waW50KTsKCiAgICBTdG9yYWdlVG1wLT5zdG9yYWdlVHlwZSA9IFNUX05PTlZPTEFUSUxFOwogICAgdHJhY2VSb3V0ZUN0bFRhYmxlX2FkZChTdG9yYWdlVG1wKTsKICAgIC8qICAgICB0cmFjZVJvdXRlQ3RsVGFibGVfY2xlYW5lcih0cmFjZVJvdXRlQ3RsVGFibGVTdG9yYWdlKTsgKi8KCiAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZUN0bFRhYmxlIiwgImRvbmUuXG4iKSk7Cn0KCgoKLyoKICogc3RvcmVfdHJhY2VSb3V0ZUN0bFRhYmxlKCk6CiAqICAgc3RvcmVzIC5jb25mIGZpbGUgZW50cmllcyBuZWVkZWQgdG8gY29uZmlndXJlIHRoZSBtaWIuCiAqLwppbnQKc3RvcmVfdHJhY2VSb3V0ZUN0bFRhYmxlKGludCBtYWpvcklELCBpbnQgbWlub3JJRCwgdm9pZCAqc2VydmVyYXJnLAogICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY2xpZW50YXJnKQp7CiAgICBjaGFyICAgICAgICAgICAgbGluZVtTTk1QX01BWEJVRl07CiAgICBjaGFyICAgICAgICAgICAqY3B0ciA9IE5VTEw7CiAgICBzaXplX3QgICAgICAgICAgdG1waW50OwogICAgc3RydWN0IHRyYWNlUm91dGVDdGxUYWJsZV9kYXRhICpTdG9yYWdlVG1wID0gTlVMTDsKICAgIHN0cnVjdCBoZWFkZXJfY29tcGxleF9pbmRleCAqaGNpbmRleCA9IE5VTEw7CgoKICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlQ3RsVGFibGUiLCAic3RvcmluZyBkYXRhLi4uICAiKSk7CgoKICAgIGZvciAoaGNpbmRleCA9IHRyYWNlUm91dGVDdGxUYWJsZVN0b3JhZ2U7IGhjaW5kZXggIT0gTlVMTDsKICAgICAgICAgaGNpbmRleCA9IGhjaW5kZXgtPm5leHQpIHsKICAgICAgICBTdG9yYWdlVG1wID0gKHN0cnVjdCB0cmFjZVJvdXRlQ3RsVGFibGVfZGF0YSAqKSBoY2luZGV4LT5kYXRhOwoKICAgICAgICBpZiAoU3RvcmFnZVRtcC0+c3RvcmFnZVR5cGUgIT0gU1RfUkVBRE9OTFkpIHsKICAgICAgICAgICAgbWVtc2V0KGxpbmUsIDAsIHNpemVvZihsaW5lKSk7CiAgICAgICAgICAgIHN0cmNhdChsaW5lLCAidHJhY2VSb3V0ZUN0bFRhYmxlICIpOwogICAgICAgICAgICBjcHRyID0gbGluZSArIHN0cmxlbihsaW5lKTsKCiAgICAgICAgICAgIGNwdHIgPQogICAgICAgICAgICAgICAgcmVhZF9jb25maWdfc3RvcmVfZGF0YShBU05fT0NURVRfU1RSLCBjcHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlUm91dGVDdGxPd25lckluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlUm91dGVDdGxPd25lckluZGV4TGVuKTsKICAgICAgICAgICAgY3B0ciA9CiAgICAgICAgICAgICAgICByZWFkX2NvbmZpZ19zdG9yZV9kYXRhKEFTTl9PQ1RFVF9TVFIsIGNwdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VSb3V0ZUN0bFRlc3ROYW1lTGVuKTsKICAgICAgICAgICAgY3B0ciA9CiAgICAgICAgICAgICAgICByZWFkX2NvbmZpZ19zdG9yZV9kYXRhKEFTTl9JTlRFR0VSLCBjcHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRtcGludCk7CiAgICAgICAgICAgIGNwdHIgPQogICAgICAgICAgICAgICAgcmVhZF9jb25maWdfc3RvcmVfZGF0YShBU05fT0NURVRfU1RSLCBjcHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzTGVuKTsKICAgICAgICAgICAgY3B0ciA9CiAgICAgICAgICAgICAgICByZWFkX2NvbmZpZ19zdG9yZV9kYXRhKEFTTl9JTlRFR0VSLCBjcHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlUm91dGVDdGxCeVBhc3NSb3V0ZVRhYmxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG1waW50KTsKICAgICAgICAgICAgY3B0ciA9CiAgICAgICAgICAgICAgICByZWFkX2NvbmZpZ19zdG9yZV9kYXRhKEFTTl9VTlNJR05FRCwgY3B0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxEYXRhU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRtcGludCk7CiAgICAgICAgICAgIGNwdHIgPQogICAgICAgICAgICAgICAgcmVhZF9jb25maWdfc3RvcmVfZGF0YShBU05fVU5TSUdORUQsIGNwdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVGltZU91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRtcGludCk7CiAgICAgICAgICAgIGNwdHIgPQogICAgICAgICAgICAgICAgcmVhZF9jb25maWdfc3RvcmVfZGF0YShBU05fVU5TSUdORUQsIGNwdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VSb3V0ZUN0bFByb2Jlc1BlckhvcCwgJnRtcGludCk7CiAgICAgICAgICAgIGNwdHIgPQogICAgICAgICAgICAgICAgcmVhZF9jb25maWdfc3RvcmVfZGF0YShBU05fVU5TSUdORUQsIGNwdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsUG9ydCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRtcGludCk7CiAgICAgICAgICAgIGNwdHIgPQogICAgICAgICAgICAgICAgcmVhZF9jb25maWdfc3RvcmVfZGF0YShBU05fVU5TSUdORUQsIGNwdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsTWF4VHRsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG1waW50KTsKICAgICAgICAgICAgY3B0ciA9CiAgICAgICAgICAgICAgICByZWFkX2NvbmZpZ19zdG9yZV9kYXRhKEFTTl9VTlNJR05FRCwgY3B0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxEU0ZpZWxkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG1waW50KTsKCiAgICAgICAgICAgIGNwdHIgPQogICAgICAgICAgICAgICAgcmVhZF9jb25maWdfc3RvcmVfZGF0YShBU05fSU5URUdFUiwgY3B0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZVJvdXRlQ3RsU291cmNlQWRkcmVzc1R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0bXBpbnQpOwogICAgICAgICAgICBjcHRyID0KICAgICAgICAgICAgICAgIHJlYWRfY29uZmlnX3N0b3JlX2RhdGEoQVNOX09DVEVUX1NUUiwgY3B0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZVJvdXRlQ3RsU291cmNlQWRkcmVzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZVJvdXRlQ3RsU291cmNlQWRkcmVzc0xlbik7CiAgICAgICAgICAgIGNwdHIgPQogICAgICAgICAgICAgICAgcmVhZF9jb25maWdfc3RvcmVfZGF0YShBU05fSU5URUdFUiwgY3B0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxJZkluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG1waW50KTsKICAgICAgICAgICAgY3B0ciA9CiAgICAgICAgICAgICAgICByZWFkX2NvbmZpZ19zdG9yZV9kYXRhKEFTTl9PQ1RFVF9TVFIsIGNwdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VSb3V0ZUN0bE1pc2NPcHRpb25zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlUm91dGVDdGxNaXNjT3B0aW9uc0xlbik7CiAgICAgICAgICAgIGNwdHIgPQogICAgICAgICAgICAgICAgcmVhZF9jb25maWdfc3RvcmVfZGF0YShBU05fVU5TSUdORUQsIGNwdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VSb3V0ZUN0bE1heEZhaWx1cmVzLCAmdG1waW50KTsKICAgICAgICAgICAgY3B0ciA9CiAgICAgICAgICAgICAgICByZWFkX2NvbmZpZ19zdG9yZV9kYXRhKEFTTl9JTlRFR0VSLCBjcHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlUm91dGVDdGxEb250RnJhZ21lbnQsICZ0bXBpbnQpOwogICAgICAgICAgICBjcHRyID0KICAgICAgICAgICAgICAgIHJlYWRfY29uZmlnX3N0b3JlX2RhdGEoQVNOX1VOU0lHTkVELCBjcHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlUm91dGVDdGxJbml0aWFsVHRsLCAmdG1waW50KTsKICAgICAgICAgICAgY3B0ciA9CiAgICAgICAgICAgICAgICByZWFkX2NvbmZpZ19zdG9yZV9kYXRhKEFTTl9VTlNJR05FRCwgY3B0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxGcmVxdWVuY3ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0bXBpbnQpOwoKICAgICAgICAgICAgY3B0ciA9CiAgICAgICAgICAgICAgICByZWFkX2NvbmZpZ19zdG9yZV9kYXRhKEFTTl9JTlRFR0VSLCBjcHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlUm91dGVDdGxTdG9yYWdlVHlwZSwgJnRtcGludCk7CiAgICAgICAgICAgIGNwdHIgPQogICAgICAgICAgICAgICAgcmVhZF9jb25maWdfc3RvcmVfZGF0YShBU05fSU5URUdFUiwgY3B0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZVJvdXRlQ3RsQWRtaW5TdGF0dXMsICZ0bXBpbnQpOwogICAgICAgICAgICBjcHRyID0KICAgICAgICAgICAgICAgIHJlYWRfY29uZmlnX3N0b3JlX2RhdGEoQVNOX09DVEVUX1NUUiwgY3B0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxEZXNjciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxEZXNjckxlbik7CiAgICAgICAgICAgIGNwdHIgPQogICAgICAgICAgICAgICAgcmVhZF9jb25maWdfc3RvcmVfZGF0YShBU05fVU5TSUdORUQsIGNwdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsTWF4Um93cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRtcGludCk7CiAgICAgICAgICAgIGNwdHIgPQogICAgICAgICAgICAgICAgcmVhZF9jb25maWdfc3RvcmVfZGF0YShBU05fT0NURVRfU1RSLCBjcHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlUm91dGVDdGxUcmFwR2VuZXJhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZVJvdXRlQ3RsVHJhcEdlbmVyYXRpb25MZW4pOwogICAgICAgICAgICBjcHRyID0KICAgICAgICAgICAgICAgIHJlYWRfY29uZmlnX3N0b3JlX2RhdGEoQVNOX0lOVEVHRVIsIGNwdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VSb3V0ZUN0bENyZWF0ZUhvcHNFbnRyaWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG1waW50KTsKICAgICAgICAgICAgY3B0ciA9CiAgICAgICAgICAgICAgICByZWFkX2NvbmZpZ19zdG9yZV9kYXRhKEFTTl9PQkpFQ1RfSUQsIGNwdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUeXBlTGVuKTsKICAgICAgICAgICAgY3B0ciA9CiAgICAgICAgICAgICAgICByZWFkX2NvbmZpZ19zdG9yZV9kYXRhKEFTTl9JTlRFR0VSLCBjcHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFJvd1N0YXR1cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRtcGludCk7CiAgICAgICAgICAgIGNwdHIgPQogICAgICAgICAgICAgICAgcmVhZF9jb25maWdfc3RvcmVfZGF0YShBU05fVU5TSUdORUQsIGNwdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTdG9yYWdlVG1wLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VSb3V0ZVByb2JlSGlzdG9yeU1heEluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG1waW50KTsKCgoKICAgICAgICAgICAgc25tcGRfc3RvcmVfY29uZmlnKGxpbmUpOwogICAgICAgIH0KICAgIH0KICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlQ3RsVGFibGUiLCAiZG9uZS5cbiIpKTsKICAgIHJldHVybiBTTk1QRVJSX1NVQ0NFU1M7Cn0KCgoKCi8qCiAqIHZhcl90cmFjZVJvdXRlQ3RsVGFibGUoKToKICogICBIYW5kbGUgdGhpcyB0YWJsZSBzZXBhcmF0ZWx5IGZyb20gdGhlIHNjYWxhciB2YWx1ZSBjYXNlLgogKiAgIFRoZSB3b3JraW5ncyBvZiB0aGlzIGFyZSBiYXNpY2FsbHkgdGhlIHNhbWUgYXMgZm9yIHZhcl9tdGVPYmplY3RzVGFibGUgYWJvdmUuCiAqLwp1bnNpZ25lZCBjaGFyICAqCnZhcl90cmFjZVJvdXRlQ3RsVGFibGUoc3RydWN0IHZhcmlhYmxlICp2cCwKICAgICAgICAgICAgICAgICAgICAgICBvaWQgKiBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqbGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAgIGludCBleGFjdCwKICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKnZhcl9sZW4sIFdyaXRlTWV0aG9kICoqIHdyaXRlX21ldGhvZCkKewoKICAgIHN0cnVjdCB0cmFjZVJvdXRlQ3RsVGFibGVfZGF0YSAqU3RvcmFnZVRtcCA9IE5VTEw7CgogICAgLyoKICAgICAqIHRoaXMgYXNzdW1lcyB5b3UgaGF2ZSByZWdpc3RlcmVkIGFsbCB5b3VyIGRhdGEgcHJvcGVybHkKICAgICAqLwogICAgaWYgKChTdG9yYWdlVG1wID0KICAgICAgICAgaGVhZGVyX2NvbXBsZXgodHJhY2VSb3V0ZUN0bFRhYmxlU3RvcmFnZSwgdnAsIG5hbWUsIGxlbmd0aCwgZXhhY3QsCiAgICAgICAgICAgICAgICAgICAgICAgIHZhcl9sZW4sIHdyaXRlX21ldGhvZCkpID09IE5VTEwpIHsKICAgICAgICBpZiAodnAtPm1hZ2ljID09IENPTFVNTl9UUkFDRVJPVVRFQ1RMUk9XU1RBVFVTKQogICAgICAgICAgICAqd3JpdGVfbWV0aG9kID0gd3JpdGVfdHJhY2VSb3V0ZUN0bFJvd1N0YXR1czsKCiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CgogICAgLyoKICAgICAqIHRoaXMgaXMgd2hlcmUgd2UgZG8gdGhlIHZhbHVlIGFzc2lnbm1lbnRzIGZvciB0aGUgbWliIHJlc3VsdHMuCiAgICAgKi8KICAgIHN3aXRjaCAodnAtPm1hZ2ljKSB7CgoKICAgIGNhc2UgQ09MVU1OX1RSQUNFUk9VVEVDVExUQVJHRVRBRERSRVNTVFlQRToKICAgICAgICAqd3JpdGVfbWV0aG9kID0gd3JpdGVfdHJhY2VSb3V0ZUN0bFRhcmdldEFkZHJlc3NUeXBlOwogICAgICAgICp2YXJfbGVuID0gc2l6ZW9mKFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzVHlwZSk7CgogICAgICAgIHJldHVybiAodV9jaGFyICopICYgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFRhcmdldEFkZHJlc3NUeXBlOwoKICAgIGNhc2UgQ09MVU1OX1RSQUNFUk9VVEVDVExUQVJHRVRBRERSRVNTOgogICAgICAgICp3cml0ZV9tZXRob2QgPSB3cml0ZV90cmFjZVJvdXRlQ3RsVGFyZ2V0QWRkcmVzczsKICAgICAgICAqdmFyX2xlbiA9IChTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVGFyZ2V0QWRkcmVzc0xlbik7CgogICAgICAgIHJldHVybiAodV9jaGFyICopIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzOwoKICAgIGNhc2UgQ09MVU1OX1RSQUNFUk9VVEVDVExCWVBBU1NST1VURVRBQkxFOgogICAgICAgICp3cml0ZV9tZXRob2QgPSB3cml0ZV90cmFjZVJvdXRlQ3RsQnlQYXNzUm91dGVUYWJsZTsKICAgICAgICAqdmFyX2xlbiA9IHNpemVvZihTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsQnlQYXNzUm91dGVUYWJsZSk7CgogICAgICAgIHJldHVybiAodV9jaGFyICopICYgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bEJ5UGFzc1JvdXRlVGFibGU7CgogICAgY2FzZSBDT0xVTU5fVFJBQ0VST1VURUNUTERBVEFTSVpFOgogICAgICAgICp3cml0ZV9tZXRob2QgPSB3cml0ZV90cmFjZVJvdXRlQ3RsRGF0YVNpemU7CiAgICAgICAgKnZhcl9sZW4gPSBzaXplb2YoU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bERhdGFTaXplKTsKCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsRGF0YVNpemU7CgogICAgY2FzZSBDT0xVTU5fVFJBQ0VST1VURUNUTFRJTUVPVVQ6CiAgICAgICAgKndyaXRlX21ldGhvZCA9IHdyaXRlX3RyYWNlUm91dGVDdGxUaW1lT3V0OwogICAgICAgICp2YXJfbGVuID0gc2l6ZW9mKFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUaW1lT3V0KTsKCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVGltZU91dDsKCiAgICBjYXNlIENPTFVNTl9UUkFDRVJPVVRFQ1RMUFJPQkVTUEVSSE9QOgogICAgICAgICp3cml0ZV9tZXRob2QgPSB3cml0ZV90cmFjZVJvdXRlQ3RsUHJvYmVzUGVySG9wOwogICAgICAgICp2YXJfbGVuID0gc2l6ZW9mKFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxQcm9iZXNQZXJIb3ApOwoKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxQcm9iZXNQZXJIb3A7CgogICAgY2FzZSBDT0xVTU5fVFJBQ0VST1VURUNUTFBPUlQ6CiAgICAgICAgKndyaXRlX21ldGhvZCA9IHdyaXRlX3RyYWNlUm91dGVDdGxQb3J0OwogICAgICAgICp2YXJfbGVuID0gc2l6ZW9mKFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxQb3J0KTsKCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsUG9ydDsKCiAgICBjYXNlIENPTFVNTl9UUkFDRVJPVVRFQ1RMTUFYVFRMOgogICAgICAgICp3cml0ZV9tZXRob2QgPSB3cml0ZV90cmFjZVJvdXRlQ3RsTWF4VHRsOwogICAgICAgICp2YXJfbGVuID0gc2l6ZW9mKFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxNYXhUdGwpOwoKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxNYXhUdGw7CgogICAgY2FzZSBDT0xVTU5fVFJBQ0VST1VURUNUTERTRklFTEQ6CiAgICAgICAgKndyaXRlX21ldGhvZCA9IHdyaXRlX3RyYWNlUm91dGVDdGxEU0ZpZWxkOwogICAgICAgICp2YXJfbGVuID0gc2l6ZW9mKFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxEU0ZpZWxkKTsKCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsRFNGaWVsZDsKCiAgICBjYXNlIENPTFVNTl9UUkFDRVJPVVRFQ1RMU09VUkNFQUREUkVTU1RZUEU6CiAgICAgICAgKndyaXRlX21ldGhvZCA9IHdyaXRlX3RyYWNlUm91dGVDdGxTb3VyY2VBZGRyZXNzVHlwZTsKICAgICAgICAqdmFyX2xlbiA9IHNpemVvZihTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsU291cmNlQWRkcmVzc1R5cGUpOwoKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxTb3VyY2VBZGRyZXNzVHlwZTsKCiAgICBjYXNlIENPTFVNTl9UUkFDRVJPVVRFQ1RMU09VUkNFQUREUkVTUzoKICAgICAgICAqd3JpdGVfbWV0aG9kID0gd3JpdGVfdHJhY2VSb3V0ZUN0bFNvdXJjZUFkZHJlc3M7CiAgICAgICAgKnZhcl9sZW4gPSAoU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFNvdXJjZUFkZHJlc3NMZW4pOwoKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsU291cmNlQWRkcmVzczsKCiAgICBjYXNlIENPTFVNTl9UUkFDRVJPVVRFQ1RMSUZJTkRFWDoKICAgICAgICAqd3JpdGVfbWV0aG9kID0gd3JpdGVfdHJhY2VSb3V0ZUN0bElmSW5kZXg7CiAgICAgICAgKnZhcl9sZW4gPSBzaXplb2YoU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bElmSW5kZXgpOwoKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxJZkluZGV4OwoKICAgIGNhc2UgQ09MVU1OX1RSQUNFUk9VVEVDVExNSVNDT1BUSU9OUzoKICAgICAgICAqd3JpdGVfbWV0aG9kID0gd3JpdGVfdHJhY2VSb3V0ZUN0bE1pc2NPcHRpb25zOwogICAgICAgICp2YXJfbGVuID0gKFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxNaXNjT3B0aW9uc0xlbik7CgogICAgICAgIHJldHVybiAodV9jaGFyICopIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxNaXNjT3B0aW9uczsKCiAgICBjYXNlIENPTFVNTl9UUkFDRVJPVVRFQ1RMTUFYRkFJTFVSRVM6CiAgICAgICAgKndyaXRlX21ldGhvZCA9IHdyaXRlX3RyYWNlUm91dGVDdGxNYXhGYWlsdXJlczsKICAgICAgICAqdmFyX2xlbiA9IHNpemVvZihTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsTWF4RmFpbHVyZXMpOwoKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxNYXhGYWlsdXJlczsKCiAgICBjYXNlIENPTFVNTl9UUkFDRVJPVVRFQ1RMRE9OVEZSQUdNRU5UOgogICAgICAgICp3cml0ZV9tZXRob2QgPSB3cml0ZV90cmFjZVJvdXRlQ3RsRG9udEZyYWdtZW50OwogICAgICAgICp2YXJfbGVuID0gc2l6ZW9mKFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxEb250RnJhZ21lbnQpOwoKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxEb250RnJhZ21lbnQ7CgogICAgY2FzZSBDT0xVTU5fVFJBQ0VST1VURUNUTElOSVRJQUxUVEw6CiAgICAgICAgKndyaXRlX21ldGhvZCA9IHdyaXRlX3RyYWNlUm91dGVDdGxJbml0aWFsVHRsOwogICAgICAgICp2YXJfbGVuID0gc2l6ZW9mKFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxJbml0aWFsVHRsKTsKCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsSW5pdGlhbFR0bDsKCiAgICBjYXNlIENPTFVNTl9UUkFDRVJPVVRFQ1RMRlJFUVVFTkNZOgogICAgICAgICp3cml0ZV9tZXRob2QgPSB3cml0ZV90cmFjZVJvdXRlQ3RsRnJlcXVlbmN5OwogICAgICAgICp2YXJfbGVuID0gc2l6ZW9mKFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxGcmVxdWVuY3kpOwoKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxGcmVxdWVuY3k7CgogICAgY2FzZSBDT0xVTU5fVFJBQ0VST1VURUNUTFNUT1JBR0VUWVBFOgogICAgICAgICp3cml0ZV9tZXRob2QgPSB3cml0ZV90cmFjZVJvdXRlQ3RsU3RvcmFnZVR5cGU7CiAgICAgICAgKnZhcl9sZW4gPSBzaXplb2YoU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFN0b3JhZ2VUeXBlKTsKCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsU3RvcmFnZVR5cGU7CgogICAgY2FzZSBDT0xVTU5fVFJBQ0VST1VURUNUTEFETUlOU1RBVFVTOgogICAgICAgICp3cml0ZV9tZXRob2QgPSB3cml0ZV90cmFjZVJvdXRlQ3RsQWRtaW5TdGF0dXM7CiAgICAgICAgKnZhcl9sZW4gPSBzaXplb2YoU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bEFkbWluU3RhdHVzKTsKCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsQWRtaW5TdGF0dXM7CgogICAgY2FzZSBDT0xVTU5fVFJBQ0VST1VURUNUTERFU0NSOgogICAgICAgICp3cml0ZV9tZXRob2QgPSB3cml0ZV90cmFjZVJvdXRlQ3RsRGVzY3I7CiAgICAgICAgKnZhcl9sZW4gPSAoU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bERlc2NyTGVuKTsKCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bERlc2NyOwoKICAgIGNhc2UgQ09MVU1OX1RSQUNFUk9VVEVDVExNQVhST1dTOgogICAgICAgICp3cml0ZV9tZXRob2QgPSB3cml0ZV90cmFjZVJvdXRlQ3RsTWF4Um93czsKICAgICAgICAqdmFyX2xlbiA9IHNpemVvZihTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsTWF4Um93cyk7CgogICAgICAgIHJldHVybiAodV9jaGFyICopICYgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bE1heFJvd3M7CgogICAgY2FzZSBDT0xVTU5fVFJBQ0VST1VURUNUTFRSQVBHRU5FUkFUSU9OOgogICAgICAgICp3cml0ZV9tZXRob2QgPSB3cml0ZV90cmFjZVJvdXRlQ3RsVHJhcEdlbmVyYXRpb247CiAgICAgICAgKnZhcl9sZW4gPSAoU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFRyYXBHZW5lcmF0aW9uTGVuKTsKCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFRyYXBHZW5lcmF0aW9uOwoKICAgIGNhc2UgQ09MVU1OX1RSQUNFUk9VVEVDVExDUkVBVEVIT1BTRU5UUklFUzoKICAgICAgICAqd3JpdGVfbWV0aG9kID0gd3JpdGVfdHJhY2VSb3V0ZUN0bENyZWF0ZUhvcHNFbnRyaWVzOwogICAgICAgICp2YXJfbGVuID0gc2l6ZW9mKFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxDcmVhdGVIb3BzRW50cmllcyk7CgogICAgICAgIHJldHVybiAodV9jaGFyICopICYgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bENyZWF0ZUhvcHNFbnRyaWVzOwoKICAgIGNhc2UgQ09MVU1OX1RSQUNFUk9VVEVDVExUWVBFOgogICAgICAgICp3cml0ZV9tZXRob2QgPSB3cml0ZV90cmFjZVJvdXRlQ3RsVHlwZTsKICAgICAgICAqdmFyX2xlbiA9IChTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVHlwZUxlbikgKiBzaXplb2Yob2lkKTsKCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFR5cGU7CgogICAgY2FzZSBDT0xVTU5fVFJBQ0VST1VURUNUTFJPV1NUQVRVUzoKICAgICAgICAqd3JpdGVfbWV0aG9kID0gd3JpdGVfdHJhY2VSb3V0ZUN0bFJvd1N0YXR1czsKICAgICAgICAqdmFyX2xlbiA9IHNpemVvZihTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsUm93U3RhdHVzKTsKCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsUm93U3RhdHVzOwoKICAgIGRlZmF1bHQ6CiAgICAgICAgRVJST1JfTVNHKCIiKTsKICAgIH0KICAgIHJldHVybiBOVUxMOwp9CgoKCmludAp0cmFjZVJvdXRlUmVzdWx0c1RhYmxlX2RlbChzdHJ1Y3QgdHJhY2VSb3V0ZUN0bFRhYmxlX2RhdGEgKnRoZWRhdGEpCnsKICAgIHN0cnVjdCBoZWFkZXJfY29tcGxleF9pbmRleCAqaGNpcHRyMiA9IE5VTEw7CiAgICBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKnZhcnMgPSBOVUxMOwogICAgb2lkICAgICAgICAgICAgIG5ld29pZFtNQVhfT0lEX0xFTl07CiAgICBzaXplX3QgICAgICAgICAgbmV3b2lkX2xlbiA9IDA7CgogICAgc25tcF92YXJsaXN0X2FkZF92YXJpYWJsZSgmdmFycywgTlVMTCwgMCwgQVNOX09DVEVUX1NUUiwgKGNoYXIgKikgdGhlZGF0YS0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXgsIHRoZWRhdGEtPnRyYWNlUm91dGVDdGxPd25lckluZGV4TGVuKTsgICAvKiB0cmFjZVJvdXRlQ3RsT3duZXJJbmRleCAqLwogICAgc25tcF92YXJsaXN0X2FkZF92YXJpYWJsZSgmdmFycywgTlVMTCwgMCwgQVNOX09DVEVUX1NUUiwgKGNoYXIgKikgdGhlZGF0YS0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lLCB0aGVkYXRhLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWVMZW4pOyAgICAgICAvKiB0cmFjZVJvdXRlQ3RsVGVzdE5hbWUgKi8KCiAgICBtZW1zZXQobmV3b2lkLCAnXDAnLCBzaXplb2Yob2lkKSAqIE1BWF9PSURfTEVOKTsKICAgIGhlYWRlcl9jb21wbGV4X2dlbmVyYXRlX29pZChuZXdvaWQsICZuZXdvaWRfbGVuLCBOVUxMLCAwLCB2YXJzKTsKCiAgICBmb3IgKGhjaXB0cjIgPSB0cmFjZVJvdXRlUmVzdWx0c1RhYmxlU3RvcmFnZTsgaGNpcHRyMiAhPSBOVUxMOwogICAgICAgICBoY2lwdHIyID0gaGNpcHRyMi0+bmV4dCkgewogICAgICAgIGlmIChzbm1wX29pZF9jb21wYXJlKG5ld29pZCwgbmV3b2lkX2xlbiwgaGNpcHRyMi0+bmFtZSwgbmV3b2lkX2xlbikKICAgICAgICAgICAgPT0gMCkgewogICAgICAgICAgICBoZWFkZXJfY29tcGxleF9leHRyYWN0X2VudHJ5KCZ0cmFjZVJvdXRlUmVzdWx0c1RhYmxlU3RvcmFnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoY2lwdHIyKTsKICAgICAgICAgICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVSZXN1bHRzVGFibGUiLCAiZGVsZXRlICBzdWNjZXNzIVxuIikpOwoKICAgICAgICB9CiAgICB9CiAgICB2YXJzID0gTlVMTDsKICAgIHJldHVybiBTTk1QRVJSX1NVQ0NFU1M7Cn0KCgoKCmludAp0cmFjZVJvdXRlUHJvYmVIaXN0b3J5VGFibGVfZGVsKHN0cnVjdCB0cmFjZVJvdXRlQ3RsVGFibGVfZGF0YSAqdGhlZGF0YSkKewogICAgc3RydWN0IGhlYWRlcl9jb21wbGV4X2luZGV4ICpoY2lwdHIyID0gTlVMTDsKICAgIG5ldHNubXBfdmFyaWFibGVfbGlzdCAqdmFycyA9IE5VTEw7CiAgICBvaWQgICAgICAgICAgICAgbmV3b2lkW01BWF9PSURfTEVOXTsKICAgIHNpemVfdCAgICAgICAgICBuZXdvaWRfbGVuID0gMDsKCiAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzLCBOVUxMLCAwLCBBU05fT0NURVRfU1RSLCAoY2hhciAqKSB0aGVkYXRhLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleCwgdGhlZGF0YS0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXhMZW4pOyAgIC8qIHRyYWNlUm91dGVDdGxPd25lckluZGV4ICovCiAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzLCBOVUxMLCAwLCBBU05fT0NURVRfU1RSLCAoY2hhciAqKSB0aGVkYXRhLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWUsIHRoZWRhdGEtPnRyYWNlUm91dGVDdGxUZXN0TmFtZUxlbik7ICAgICAgIC8qIHRyYWNlUm91dGVDdGxPcGVyYXRpb25OYW1lICovCgogICAgbWVtc2V0KG5ld29pZCwgJ1wwJywgc2l6ZW9mKG9pZCkgKiBNQVhfT0lEX0xFTik7CgogICAgaGVhZGVyX2NvbXBsZXhfZ2VuZXJhdGVfb2lkKG5ld29pZCwgJm5ld29pZF9sZW4sIE5VTEwsIDAsIHZhcnMpOwoKICAgIGZvciAoaGNpcHRyMiA9IHRyYWNlUm91dGVQcm9iZUhpc3RvcnlUYWJsZVN0b3JhZ2U7IGhjaXB0cjIgIT0gTlVMTDsKICAgICAgICAgaGNpcHRyMiA9IGhjaXB0cjItPm5leHQpIHsKICAgICAgICBpZiAoc25tcF9vaWRfY29tcGFyZShuZXdvaWQsIG5ld29pZF9sZW4sIGhjaXB0cjItPm5hbWUsIG5ld29pZF9sZW4pCiAgICAgICAgICAgID09IDApIHsKICAgICAgICAgICAgaGVhZGVyX2NvbXBsZXhfZXh0cmFjdF9lbnRyeSgmdHJhY2VSb3V0ZVByb2JlSGlzdG9yeVRhYmxlU3RvcmFnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoY2lwdHIyKTsKICAgICAgICAgICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVQcm9iZUhpc3RvcnlUYWJsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZWxldGUgIHN1Y2Nlc3MhXG4iKSk7CgogICAgICAgIH0KICAgIH0KICAgIHZhcnMgPSBOVUxMOwogICAgcmV0dXJuIFNOTVBFUlJfU1VDQ0VTUzsKfQoKCmludAp0cmFjZVJvdXRlSG9wc1RhYmxlX2RlbChzdHJ1Y3QgdHJhY2VSb3V0ZUN0bFRhYmxlX2RhdGEgKnRoZWRhdGEpCnsKICAgIHN0cnVjdCBoZWFkZXJfY29tcGxleF9pbmRleCAqaGNpcHRyMiA9IE5VTEw7CiAgICBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKnZhcnMgPSBOVUxMOwogICAgb2lkICAgICAgICAgICAgIG5ld29pZFtNQVhfT0lEX0xFTl07CiAgICBzaXplX3QgICAgICAgICAgbmV3b2lkX2xlbiA9IDA7CgogICAgc25tcF92YXJsaXN0X2FkZF92YXJpYWJsZSgmdmFycywgTlVMTCwgMCwgQVNOX09DVEVUX1NUUiwgKGNoYXIgKikgdGhlZGF0YS0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXgsIHRoZWRhdGEtPnRyYWNlUm91dGVDdGxPd25lckluZGV4TGVuKTsgICAvKiB0cmFjZVJvdXRlQ3RsT3duZXJJbmRleCAqLwogICAgc25tcF92YXJsaXN0X2FkZF92YXJpYWJsZSgmdmFycywgTlVMTCwgMCwgQVNOX09DVEVUX1NUUiwgKGNoYXIgKikgdGhlZGF0YS0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lLCB0aGVkYXRhLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWVMZW4pOyAgICAgICAvKiB0cmFjZVJvdXRlQ3RsVGVzdE5hbWUgKi8KCiAgICBtZW1zZXQobmV3b2lkLCAnXDAnLCBzaXplb2Yob2lkKSAqIE1BWF9PSURfTEVOKTsKCiAgICBoZWFkZXJfY29tcGxleF9nZW5lcmF0ZV9vaWQobmV3b2lkLCAmbmV3b2lkX2xlbiwgTlVMTCwgMCwgdmFycyk7CgogICAgZm9yIChoY2lwdHIyID0gdHJhY2VSb3V0ZUhvcHNUYWJsZVN0b3JhZ2U7IGhjaXB0cjIgIT0gTlVMTDsKICAgICAgICAgaGNpcHRyMiA9IGhjaXB0cjItPm5leHQpIHsKICAgICAgICBpZiAoc25tcF9vaWRfY29tcGFyZShuZXdvaWQsIG5ld29pZF9sZW4sIGhjaXB0cjItPm5hbWUsIG5ld29pZF9sZW4pCiAgICAgICAgICAgID09IDApIHsKICAgICAgICAgICAgaGVhZGVyX2NvbXBsZXhfZXh0cmFjdF9lbnRyeSgmdHJhY2VSb3V0ZUhvcHNUYWJsZVN0b3JhZ2UsIGhjaXB0cjIpOwogICAgICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZUhvcHNUYWJsZSIsICJkZWxldGUgIHN1Y2Nlc3MhXG4iKSk7CgogICAgICAgIH0KICAgIH0KICAgIHZhcnMgPSBOVUxMOwogICAgcmV0dXJuIFNOTVBFUlJfU1VDQ0VTUzsKfQoKLyoKICogc2VuZCB0cmFwIAogKi8KCnZvaWQKc2VuZF90cmFjZVJvdXRlX3RyYXAoc3RydWN0IHRyYWNlUm91dGVDdGxUYWJsZV9kYXRhICppdGVtLAogICAgICAgICAgICAgICAgICAgICBvaWQgKiB0cmFwX29pZCwgc2l6ZV90IHRyYXBfb2lkX2xlbikKewogICAgc3RhdGljIG9pZCAgICAgIG9iamlkX3NubXB0cmFwW10gPSB7IDEsIDMsIDYsIDEsIDYsIDMsIDEsIDEsIDQsIDEsIDAgfTsgICAgIC8qIHNubXBUcmFwSU9ELjAgKi8KICAgIHN0cnVjdCB0cmFjZVJvdXRlSG9wc1RhYmxlX2RhdGEgKlN0b3JhZ2VIb3BzID0gTlVMTDsKICAgIG5ldHNubXBfdmFyaWFibGVfbGlzdCAqdmFyX2xpc3QgPSBOVUxMOwogICAgbmV0c25tcF92YXJpYWJsZV9saXN0ICp2YXJzID0gTlVMTDsKICAgIG5ldHNubXBfdmFyaWFibGVfbGlzdCAqdmFyX2hvcHMgPSBOVUxMOwogICAgb2lkICAgICAgICAgICAgIG5ld29pZFtNQVhfT0lEX0xFTl07CiAgICBzaXplX3QgICAgICAgICAgbmV3b2lkX2xlbiA9IDA7CgogICAgb2lkICAgICAgICAgICAgIGluZGV4b2lkW01BWF9PSURfTEVOXTsKICAgIHNpemVfdCAgICAgICAgICBpbmRleG9pZF9sZW4gPSAwOwoKICAgIHN0cnVjdCBoZWFkZXJfY29tcGxleF9pbmRleCAqaGNpcHRyOwogICAgb2lkICAgICAgICAgICAgIHRlbXBvaWRbTUFYX09JRF9MRU5dOwogICAgc2l6ZV90ICAgICAgICAgIHRlbXBvaWRfbGVuID0gMDsKCiAgICBvaWQgICAgICAgICAgICAgdHJhY2VSb3V0ZUN0bFRhcmdldEFkZHJlc3NbXSA9CiAgICAgICAgeyAxLCAzLCA2LCAxLCAyLCAxLCA4MSwgMSwgMiwgMSwgNCB9OwogICAgb2lkICAgICAgICAgICAgIHRyYWNlUm91dGVIb3BzSXBUZ0FkZHJlc3NbXSA9CiAgICAgICAgeyAxLCAzLCA2LCAxLCAyLCAxLCA4MSwgMSwgNSwgMSwgMyB9OwoKICAgIHNubXBfdmFybGlzdF9hZGRfdmFyaWFibGUoJnZhcnMsIE5VTEwsIDAsIEFTTl9PQ1RFVF9TVFIsIChjaGFyICopIGl0ZW0tPnRyYWNlUm91dGVDdGxPd25lckluZGV4LCBpdGVtLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleExlbik7IC8qIHRyYWNlUm91dGVDdGxPd25lckluZGV4ICovCiAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzLCBOVUxMLCAwLCBBU05fT0NURVRfU1RSLCAoY2hhciAqKSBpdGVtLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWUsIGl0ZW0tPnRyYWNlUm91dGVDdGxUZXN0TmFtZUxlbik7ICAgICAvKiB0cmFjZVJvdXRlQ3RsVGVzdE5hbWUgKi8KCiAgICAvKgogICAgICogc25tcFRyYXAgb2lkIAogICAgICovCiAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJfbGlzdCwgb2JqaWRfc25tcHRyYXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihvYmppZF9zbm1wdHJhcCkgLyBzaXplb2Yob2lkKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNOX09CSkVDVF9JRCwgKHVfY2hhciAqKSB0cmFwX29pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhcF9vaWRfbGVuICogc2l6ZW9mKG9pZCkpOwoKICAgIC8qCiAgICAgKiB0cmFjZVJvdXRlQ3RsVGFyZ2V0QWRkcmVzcyAKICAgICAqLwogICAgbWVtc2V0KG5ld29pZCwgJ1wwJywgTUFYX09JRF9MRU4gKiBzaXplb2Yob2lkKSk7CiAgICBoZWFkZXJfY29tcGxleF9nZW5lcmF0ZV9vaWQobmV3b2lkLCAmbmV3b2lkX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZVJvdXRlQ3RsVGFyZ2V0QWRkcmVzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodHJhY2VSb3V0ZUN0bFRhcmdldEFkZHJlc3MpIC8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yob2lkKSwgdmFycyk7CgogICAgc25tcF92YXJsaXN0X2FkZF92YXJpYWJsZSgmdmFyX2xpc3QsIG5ld29pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3b2lkX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNOX09DVEVUX1NUUiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVfY2hhciAqKSBpdGVtLT50cmFjZVJvdXRlQ3RsVGFyZ2V0QWRkcmVzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS0+dHJhY2VSb3V0ZUN0bFRhcmdldEFkZHJlc3NMZW4pOwoKICAgIGZvciAoaGNpcHRyID0gdHJhY2VSb3V0ZUhvcHNUYWJsZVN0b3JhZ2U7IGhjaXB0ciAhPSBOVUxMOwogICAgICAgICBoY2lwdHIgPSBoY2lwdHItPm5leHQpIHsKCW1lbXNldChpbmRleG9pZCwgJ1wwJywgTUFYX09JRF9MRU4gKiBzaXplb2Yob2lkKSk7CiAgICAgICAgaGVhZGVyX2NvbXBsZXhfZ2VuZXJhdGVfb2lkKGluZGV4b2lkLCAmaW5kZXhvaWRfbGVuLCBOVUxMLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJzKTsKICAgICAgICBpZiAoc25tcF9vaWRfY29tcGFyZQogICAgICAgICAgICAoaW5kZXhvaWQsIGluZGV4b2lkX2xlbiwgaGNpcHRyLT5uYW1lLCBpbmRleG9pZF9sZW4pID09IDApIHsKICAgICAgICAgICAgU3RvcmFnZUhvcHMgPQogICAgICAgICAgICAgICAgKHN0cnVjdCB0cmFjZVJvdXRlSG9wc1RhYmxlX2RhdGEgKikKICAgICAgICAgICAgICAgIGhlYWRlcl9jb21wbGV4X2dldF9mcm9tX29pZCh0cmFjZVJvdXRlSG9wc1RhYmxlU3RvcmFnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoY2lwdHItPm5hbWUsIGhjaXB0ci0+bmFtZWxlbik7CiAgICAgICAgICAgIG1lbXNldCh0ZW1wb2lkLCAnXDAnLCBNQVhfT0lEX0xFTiAqIHNpemVvZihvaWQpKTsKICAgICAgICAgICAgaGVhZGVyX2NvbXBsZXhfZ2VuZXJhdGVfb2lkKHRlbXBvaWQsICZ0ZW1wb2lkX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlUm91dGVIb3BzSXBUZ0FkZHJlc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodHJhY2VSb3V0ZUhvcHNJcFRnQWRkcmVzcykgLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9pZCksIHZhcnMpOwogICAgICAgICAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJfaG9wcywgTlVMTCwgMCwgQVNOX1VOU0lHTkVELCAoY2hhciAqKSAmU3RvcmFnZUhvcHMtPnRyYWNlUm91dGVIb3BzSG9wSW5kZXgsIHNpemVvZihTdG9yYWdlSG9wcy0+dHJhY2VSb3V0ZUhvcHNIb3BJbmRleCkpOyAgICAvKiB0cmFjZVJvdXRlQ3RsVGVzdE5hbWUgKi8KICAgICAgICAgICAgbWVtc2V0KG5ld29pZCwgJ1wwJywgTUFYX09JRF9MRU4gKiBzaXplb2Yob2lkKSk7CiAgICAgICAgICAgIGhlYWRlcl9jb21wbGV4X2dlbmVyYXRlX29pZChuZXdvaWQsICZuZXdvaWRfbGVuLCB0ZW1wb2lkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcG9pZF9sZW4sIHZhcl9ob3BzKTsKICAgICAgICAgICAgc25tcF92YXJsaXN0X2FkZF92YXJpYWJsZSgmdmFyX2xpc3QsIG5ld29pZCwgbmV3b2lkX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU05fT0NURVRfU1RSLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1X2NoYXIgKikgU3RvcmFnZUhvcHMtPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlUm91dGVIb3BzSXBUZ3RBZGRyZXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0b3JhZ2VIb3BzLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZVJvdXRlSG9wc0lwVGd0QWRkcmVzc0xlbik7CgogICAgICAgICAgICB2YXJfaG9wcyA9IE5VTEw7CiAgICAgICAgfQogICAgfQoKICAgIC8qCiAgICAgKiBYWFg6IHN0dWZmIGJhc2VkIG9uIGV2ZW50IHRhYmxlIAogICAgICovCgogICAgREVCVUdNU0coKCJwaW5nVGVzdDpzZW5kX3RyYWNlUm91dGVfdHJhcCIsICJzdWNjZXNzIVxuIikpOwoKICAgIHNlbmRfdjJ0cmFwKHZhcl9saXN0KTsKICAgIHNubXBfZnJlZV92YXJiaW5kKHZhcnMpOwogICAgdmFycyA9IE5VTEw7CiAgICBzbm1wX2ZyZWVfdmFyYmluZCh2YXJfbGlzdCk7CiAgICB2YXJfbGlzdCA9IE5VTEw7Cn0KCgppbnQKd3JpdGVfdHJhY2VSb3V0ZUN0bFRhcmdldEFkZHJlc3NUeXBlKGludCBhY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiB2YXJfdmFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyIHZhcl92YWxfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB2YXJfdmFsX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHN0YXRQLCBvaWQgKiBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG5hbWVfbGVuKQp7CiAgICBzdGF0aWMgc2l6ZV90ICAgdG1wdmFyOwogICAgc3RydWN0IHRyYWNlUm91dGVDdGxUYWJsZV9kYXRhICpTdG9yYWdlVG1wID0gTlVMTDsKICAgIHNpemVfdCAgICAgICAgICBuZXdsZW4gPQogICAgICAgIG5hbWVfbGVuIC0KICAgICAgICAoc2l6ZW9mKHRyYWNlUm91dGVDdGxUYWJsZV92YXJpYWJsZXNfb2lkKSAvIHNpemVvZihvaWQpICsgMyAtIDEpOwoKICAgIGlmICgoU3RvcmFnZVRtcCA9CiAgICAgICAgIGhlYWRlcl9jb21wbGV4KHRyYWNlUm91dGVDdGxUYWJsZVN0b3JhZ2UsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICZuYW1lW3NpemVvZih0cmFjZVJvdXRlQ3RsVGFibGVfdmFyaWFibGVzX29pZCkgLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yob2lkKSArIDMgLSAxXSwgJm5ld2xlbiwgMSwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpID09IE5VTEwpCiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PU1VDSE5BTUU7ICAgICAvKiByZW1vdmUgaWYgeW91IHN1cHBvcnQgY3JlYXRpb24gaGVyZSAqLwoKICAgIGlmIChTdG9yYWdlVG1wICYmIFN0b3JhZ2VUbXAtPnN0b3JhZ2VUeXBlID09IFNUX1JFQURPTkxZKSB7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PVFdSSVRBQkxFOwogICAgfQoKICAgIGlmIChTdG9yYWdlVG1wICYmIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxSb3dTdGF0dXMgPT0gUlNfQUNUSVZFKSB7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PVFdSSVRBQkxFOwogICAgfQogICAgc3dpdGNoIChhY3Rpb24pIHsKICAgIGNhc2UgUkVTRVJWRTE6CiAgICAgICAgaWYgKHZhcl92YWxfdHlwZSAhPSBBU05fSU5URUdFUikgewogICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLAogICAgICAgICAgICAgICAgICAgICAid3JpdGUgdG8gdHJhY2VSb3V0ZUN0bFRhcmdldEFkZHJlc3NUeXBlIG5vdCBBU05fSU5URUdFUlxuIik7CiAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9XUk9OR1RZUEU7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIFJFU0VSVkUyOgogICAgICAgIC8qCiAgICAgICAgICogbWVtb3J5IHJlc2V2ZXJhdGlvbiwgZmluYWwgcHJlcGFyYXRpb24uLi4gCiAgICAgICAgICovCiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgRlJFRToKICAgICAgICAvKgogICAgICAgICAqIFJlbGVhc2UgYW55IHJlc291cmNlcyB0aGF0IGhhdmUgYmVlbiBhbGxvY2F0ZWQgCiAgICAgICAgICovCiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgQUNUSU9OOgogICAgICAgIC8qCiAgICAgICAgICogVGhlIHZhcmlhYmxlIGhhcyBiZWVuIHN0b3JlZCBpbiBvYmppZCBmb3IKICAgICAgICAgKiB5b3UgdG8gdXNlLCBhbmQgeW91IGhhdmUganVzdCBiZWVuIGFza2VkIHRvIGRvIHNvbWV0aGluZyB3aXRoCiAgICAgICAgICogaXQuICBOb3RlIHRoYXQgYW55dGhpbmcgZG9uZSBoZXJlIG11c3QgYmUgcmV2ZXJzYWJsZSBpbiB0aGUgVU5ETyBjYXNlIAogICAgICAgICAqLwogICAgICAgIHRtcHZhciA9IFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzVHlwZTsKICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVGFyZ2V0QWRkcmVzc1R5cGUgPSAqKChsb25nICopIHZhcl92YWwpOwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIFVORE86CiAgICAgICAgLyoKICAgICAgICAgKiBCYWNrIG91dCBhbnkgY2hhbmdlcyBtYWRlIGluIHRoZSBBQ1RJT04gY2FzZSAKICAgICAgICAgKi8KICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVGFyZ2V0QWRkcmVzc1R5cGUgPSB0bXB2YXI7CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgQ09NTUlUOgogICAgICAgIC8qCiAgICAgICAgICogVGhpbmdzIGFyZSB3b3JraW5nIHdlbGwsIHNvIGl0J3Mgbm93IHNhZmUgdG8gbWFrZSB0aGUgY2hhbmdlCiAgICAgICAgICogcGVybWFuZW50bHkuICBNYWtlIHN1cmUgdGhhdCBhbnl0aGluZyBkb25lIGhlcmUgY2FuJ3QgZmFpbCEgCiAgICAgICAgICovCiAgICAgICAgc25tcF9zdG9yZV9uZWVkZWQoTlVMTCk7CiAgICAgICAgYnJlYWs7CiAgICB9CiAgICByZXR1cm4gU05NUF9FUlJfTk9FUlJPUjsKfQoKCgppbnQKd3JpdGVfdHJhY2VSb3V0ZUN0bFRhcmdldEFkZHJlc3MoaW50IGFjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogdmFyX3ZhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyIHZhcl92YWxfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHZhcl92YWxfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiBzdGF0UCwgb2lkICogbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG5hbWVfbGVuKQp7CiAgICBzdGF0aWMgY2hhciAgICAqdG1wdmFyOwogICAgc3RhdGljIHNpemVfdCAgIHRtcGxlbjsKICAgIHN0cnVjdCB0cmFjZVJvdXRlQ3RsVGFibGVfZGF0YSAqU3RvcmFnZVRtcCA9IE5VTEw7CiAgICBzaXplX3QgICAgICAgICAgbmV3bGVuID0KICAgICAgICBuYW1lX2xlbiAtCiAgICAgICAgKHNpemVvZih0cmFjZVJvdXRlQ3RsVGFibGVfdmFyaWFibGVzX29pZCkgLyBzaXplb2Yob2lkKSArIDMgLSAxKTsKCiAgICBpZiAoKFN0b3JhZ2VUbXAgPQogICAgICAgICBoZWFkZXJfY29tcGxleCh0cmFjZVJvdXRlQ3RsVGFibGVTdG9yYWdlLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAmbmFtZVtzaXplb2YodHJhY2VSb3V0ZUN0bFRhYmxlX3ZhcmlhYmxlc19vaWQpIC8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9pZCkgKyAzIC0gMV0sICZuZXdsZW4sIDEsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKSA9PSBOVUxMKQogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1NVQ0hOQU1FOyAgICAgLyogcmVtb3ZlIGlmIHlvdSBzdXBwb3J0IGNyZWF0aW9uIGhlcmUgKi8KCiAgICBpZiAoU3RvcmFnZVRtcCAmJiBTdG9yYWdlVG1wLT5zdG9yYWdlVHlwZSA9PSBTVF9SRUFET05MWSkgewogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1RXUklUQUJMRTsKICAgIH0KCiAgICBpZiAoU3RvcmFnZVRtcCAmJiBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsUm93U3RhdHVzID09IFJTX0FDVElWRSkgewogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1RXUklUQUJMRTsKICAgIH0KCiAgICBzd2l0Y2ggKGFjdGlvbikgewogICAgY2FzZSBSRVNFUlZFMToKICAgICAgICBpZiAodmFyX3ZhbF90eXBlICE9IEFTTl9PQ1RFVF9TVFIpIHsKICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwKICAgICAgICAgICAgICAgICAgICAgIndyaXRlIHRvIHRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzIG5vdCBBU05fT0NURVRfU1RSXG4iKTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX1dST05HVFlQRTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgUkVTRVJWRTI6CiAgICAgICAgLyoKICAgICAgICAgKiBtZW1vcnkgcmVzZXZlcmF0aW9uLCBmaW5hbCBwcmVwYXJhdGlvbi4uLiAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBGUkVFOgogICAgICAgIC8qCiAgICAgICAgICogUmVsZWFzZSBhbnkgcmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIGFsbG9jYXRlZCAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBBQ1RJT046CiAgICAgICAgLyoKICAgICAgICAgKiBUaGUgdmFyaWFibGUgaGFzIGJlZW4gc3RvcmVkIGluIGxvbmdfcmV0IGZvcgogICAgICAgICAqIHlvdSB0byB1c2UsIGFuZCB5b3UgaGF2ZSBqdXN0IGJlZW4gYXNrZWQgdG8gZG8gc29tZXRoaW5nIHdpdGgKICAgICAgICAgKiBpdC4gIE5vdGUgdGhhdCBhbnl0aGluZyBkb25lIGhlcmUgbXVzdCBiZSByZXZlcnNhYmxlIGluIHRoZSBVTkRPIGNhc2UgCiAgICAgICAgICovCiAgICAgICAgdG1wdmFyID0gU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFRhcmdldEFkZHJlc3M7CiAgICAgICAgdG1wbGVuID0gU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFRhcmdldEFkZHJlc3NMZW47CgogICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzID0KICAgICAgICAgICAgKGNoYXIgKikgbWFsbG9jKHZhcl92YWxfbGVuICsgMSk7CiAgICAgICAgaWYgKFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzID09IE5VTEwpIHsKICAgICAgICAgICAgZXhpdCgxKTsKICAgICAgICB9CiAgICAgICAgbWVtY3B5KFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzLCB2YXJfdmFsLAogICAgICAgICAgICAgICB2YXJfdmFsX2xlbik7CiAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFRhcmdldEFkZHJlc3NbdmFyX3ZhbF9sZW5dID0gJ1wwJzsKICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVGFyZ2V0QWRkcmVzc0xlbiA9IHZhcl92YWxfbGVuOwoKICAgICAgICBicmVhazsKCgogICAgY2FzZSBVTkRPOgogICAgICAgIC8qCiAgICAgICAgICogQmFjayBvdXQgYW55IGNoYW5nZXMgbWFkZSBpbiB0aGUgQUNUSU9OIGNhc2UgCiAgICAgICAgICovCiAgICAgICAgU05NUF9GUkVFKFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzKTsKICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVGFyZ2V0QWRkcmVzcyA9IHRtcHZhcjsKICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVGFyZ2V0QWRkcmVzc0xlbiA9IHRtcGxlbjsKICAgICAgICBicmVhazsKCgogICAgY2FzZSBDT01NSVQ6CiAgICAgICAgLyoKICAgICAgICAgKiBUaGluZ3MgYXJlIHdvcmtpbmcgd2VsbCwgc28gaXQncyBub3cgc2FmZSB0byBtYWtlIHRoZSBjaGFuZ2UKICAgICAgICAgKiBwZXJtYW5lbnRseS4gIE1ha2Ugc3VyZSB0aGF0IGFueXRoaW5nIGRvbmUgaGVyZSBjYW4ndCBmYWlsISAKICAgICAgICAgKi8KICAgICAgICBTTk1QX0ZSRUUodG1wdmFyKTsKICAgICAgICBzbm1wX3N0b3JlX25lZWRlZChOVUxMKTsKICAgICAgICBicmVhazsKICAgIH0KICAgIHJldHVybiBTTk1QX0VSUl9OT0VSUk9SOwp9CgppbnQKd3JpdGVfdHJhY2VSb3V0ZUN0bEJ5UGFzc1JvdXRlVGFibGUoaW50IGFjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogdmFyX3ZhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyIHZhcl92YWxfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHZhcl92YWxfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiBzdGF0UCwgb2lkICogbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG5hbWVfbGVuKQp7CiAgICBzdGF0aWMgc2l6ZV90ICAgdG1wdmFyOwogICAgc3RydWN0IHRyYWNlUm91dGVDdGxUYWJsZV9kYXRhICpTdG9yYWdlVG1wID0gTlVMTDsKICAgIHNpemVfdCAgICAgICAgICBuZXdsZW4gPQogICAgICAgIG5hbWVfbGVuIC0KICAgICAgICAoc2l6ZW9mKHRyYWNlUm91dGVDdGxUYWJsZV92YXJpYWJsZXNfb2lkKSAvIHNpemVvZihvaWQpICsgMyAtIDEpOwoKICAgIGlmICgoU3RvcmFnZVRtcCA9CiAgICAgICAgIGhlYWRlcl9jb21wbGV4KHRyYWNlUm91dGVDdGxUYWJsZVN0b3JhZ2UsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICZuYW1lW3NpemVvZih0cmFjZVJvdXRlQ3RsVGFibGVfdmFyaWFibGVzX29pZCkgLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yob2lkKSArIDMgLSAxXSwgJm5ld2xlbiwgMSwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpID09IE5VTEwpCiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PU1VDSE5BTUU7ICAgICAvKiByZW1vdmUgaWYgeW91IHN1cHBvcnQgY3JlYXRpb24gaGVyZSAqLwoKICAgIGlmIChTdG9yYWdlVG1wICYmIFN0b3JhZ2VUbXAtPnN0b3JhZ2VUeXBlID09IFNUX1JFQURPTkxZKSB7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PVFdSSVRBQkxFOwogICAgfQoKICAgIGlmIChTdG9yYWdlVG1wICYmIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxSb3dTdGF0dXMgPT0gUlNfQUNUSVZFKSB7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PVFdSSVRBQkxFOwogICAgfQogICAgc3dpdGNoIChhY3Rpb24pIHsKICAgIGNhc2UgUkVTRVJWRTE6CiAgICAgICAgaWYgKHZhcl92YWxfdHlwZSAhPSBBU05fSU5URUdFUikgewogICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLAogICAgICAgICAgICAgICAgICAgICAid3JpdGUgdG8gdHJhY2VSb3V0ZUN0bFRhcmdldEFkZHJlc3NUeXBlIG5vdCBBU05fSU5URUdFUlxuIik7CiAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9XUk9OR1RZUEU7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIFJFU0VSVkUyOgogICAgICAgIC8qCiAgICAgICAgICogbWVtb3J5IHJlc2V2ZXJhdGlvbiwgZmluYWwgcHJlcGFyYXRpb24uLi4gCiAgICAgICAgICovCiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgRlJFRToKICAgICAgICAvKgogICAgICAgICAqIFJlbGVhc2UgYW55IHJlc291cmNlcyB0aGF0IGhhdmUgYmVlbiBhbGxvY2F0ZWQgCiAgICAgICAgICovCiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgQUNUSU9OOgogICAgICAgIC8qCiAgICAgICAgICogVGhlIHZhcmlhYmxlIGhhcyBiZWVuIHN0b3JlZCBpbiBvYmppZCBmb3IKICAgICAgICAgKiB5b3UgdG8gdXNlLCBhbmQgeW91IGhhdmUganVzdCBiZWVuIGFza2VkIHRvIGRvIHNvbWV0aGluZyB3aXRoCiAgICAgICAgICogaXQuICBOb3RlIHRoYXQgYW55dGhpbmcgZG9uZSBoZXJlIG11c3QgYmUgcmV2ZXJzYWJsZSBpbiB0aGUgVU5ETyBjYXNlIAogICAgICAgICAqLwogICAgICAgIHRtcHZhciA9IFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxCeVBhc3NSb3V0ZVRhYmxlOwogICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxCeVBhc3NSb3V0ZVRhYmxlID0gKigobG9uZyAqKSB2YXJfdmFsKTsKICAgICAgICBicmVhazsKCgogICAgY2FzZSBVTkRPOgogICAgICAgIC8qCiAgICAgICAgICogQmFjayBvdXQgYW55IGNoYW5nZXMgbWFkZSBpbiB0aGUgQUNUSU9OIGNhc2UgCiAgICAgICAgICovCiAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bEJ5UGFzc1JvdXRlVGFibGUgPSB0bXB2YXI7CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgQ09NTUlUOgogICAgICAgIC8qCiAgICAgICAgICogVGhpbmdzIGFyZSB3b3JraW5nIHdlbGwsIHNvIGl0J3Mgbm93IHNhZmUgdG8gbWFrZSB0aGUgY2hhbmdlCiAgICAgICAgICogcGVybWFuZW50bHkuICBNYWtlIHN1cmUgdGhhdCBhbnl0aGluZyBkb25lIGhlcmUgY2FuJ3QgZmFpbCEgCiAgICAgICAgICovCiAgICAgICAgc25tcF9zdG9yZV9uZWVkZWQoTlVMTCk7CiAgICAgICAgYnJlYWs7CiAgICB9CiAgICByZXR1cm4gU05NUF9FUlJfTk9FUlJPUjsKCn0KCmludAp3cml0ZV90cmFjZVJvdXRlQ3RsRGF0YVNpemUoaW50IGFjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHZhcl92YWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgdmFyX3ZhbF90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHZhcl92YWxfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogc3RhdFAsIG9pZCAqIG5hbWUsIHNpemVfdCBuYW1lX2xlbikKewogICAgc3RhdGljIHNpemVfdCAgIHRtcHZhcjsKICAgIHN0cnVjdCB0cmFjZVJvdXRlQ3RsVGFibGVfZGF0YSAqU3RvcmFnZVRtcCA9IE5VTEw7CiAgICBzaXplX3QgICAgICAgICAgbmV3bGVuID0KICAgICAgICBuYW1lX2xlbiAtCiAgICAgICAgKHNpemVvZih0cmFjZVJvdXRlQ3RsVGFibGVfdmFyaWFibGVzX29pZCkgLyBzaXplb2Yob2lkKSArIDMgLSAxKTsKCiAgICBpZiAoKFN0b3JhZ2VUbXAgPQogICAgICAgICBoZWFkZXJfY29tcGxleCh0cmFjZVJvdXRlQ3RsVGFibGVTdG9yYWdlLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAmbmFtZVtzaXplb2YodHJhY2VSb3V0ZUN0bFRhYmxlX3ZhcmlhYmxlc19vaWQpIC8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9pZCkgKyAzIC0gMV0sICZuZXdsZW4sIDEsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKSA9PSBOVUxMKQogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1NVQ0hOQU1FOyAgICAgLyogcmVtb3ZlIGlmIHlvdSBzdXBwb3J0IGNyZWF0aW9uIGhlcmUgKi8KCiAgICBpZiAoU3RvcmFnZVRtcCAmJiBTdG9yYWdlVG1wLT5zdG9yYWdlVHlwZSA9PSBTVF9SRUFET05MWSkgewogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1RXUklUQUJMRTsKICAgIH0KCiAgICBpZiAoU3RvcmFnZVRtcCAmJiBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsUm93U3RhdHVzID09IFJTX0FDVElWRSkgewogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1RXUklUQUJMRTsKICAgIH0KICAgIHN3aXRjaCAoYWN0aW9uKSB7CiAgICBjYXNlIFJFU0VSVkUxOgogICAgICAgIGlmICh2YXJfdmFsX3R5cGUgIT0gQVNOX1VOU0lHTkVEKSB7CiAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsCiAgICAgICAgICAgICAgICAgICAgICJ3cml0ZSB0byB0cmFjZVJvdXRlQ3RsRGF0YVNpemUgbm90IEFTTl9VTlNJR05FRFxuIik7CiAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9XUk9OR1RZUEU7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIFJFU0VSVkUyOgogICAgICAgIC8qCiAgICAgICAgICogbWVtb3J5IHJlc2V2ZXJhdGlvbiwgZmluYWwgcHJlcGFyYXRpb24uLi4gCiAgICAgICAgICovCiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgRlJFRToKICAgICAgICAvKgogICAgICAgICAqIFJlbGVhc2UgYW55IHJlc291cmNlcyB0aGF0IGhhdmUgYmVlbiBhbGxvY2F0ZWQgCiAgICAgICAgICovCiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgQUNUSU9OOgogICAgICAgIC8qCiAgICAgICAgICogVGhlIHZhcmlhYmxlIGhhcyBiZWVuIHN0b3JlZCBpbiBvYmppZCBmb3IKICAgICAgICAgKiB5b3UgdG8gdXNlLCBhbmQgeW91IGhhdmUganVzdCBiZWVuIGFza2VkIHRvIGRvIHNvbWV0aGluZyB3aXRoCiAgICAgICAgICogaXQuICBOb3RlIHRoYXQgYW55dGhpbmcgZG9uZSBoZXJlIG11c3QgYmUgcmV2ZXJzYWJsZSBpbiB0aGUgVU5ETyBjYXNlIAogICAgICAgICAqLwogICAgICAgIHRtcHZhciA9IFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxEYXRhU2l6ZTsKICAgICAgICBpZiAoKCooKGxvbmcgKikgdmFyX3ZhbCkpID49IDAgJiYgKCooKGxvbmcgKikgdmFyX3ZhbCkpIDw9IDY1NTA3KQogICAgICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsRGF0YVNpemUgPSAqKChsb25nICopIHZhcl92YWwpOwogICAgICAgIGVsc2UKICAgICAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bERhdGFTaXplID0gNTY7CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgVU5ETzoKICAgICAgICAvKgogICAgICAgICAqIEJhY2sgb3V0IGFueSBjaGFuZ2VzIG1hZGUgaW4gdGhlIEFDVElPTiBjYXNlIAogICAgICAgICAqLwogICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxEYXRhU2l6ZSA9IHRtcHZhcjsKICAgICAgICBicmVhazsKCgogICAgY2FzZSBDT01NSVQ6CiAgICAgICAgLyoKICAgICAgICAgKiBUaGluZ3MgYXJlIHdvcmtpbmcgd2VsbCwgc28gaXQncyBub3cgc2FmZSB0byBtYWtlIHRoZSBjaGFuZ2UKICAgICAgICAgKiBwZXJtYW5lbnRseS4gIE1ha2Ugc3VyZSB0aGF0IGFueXRoaW5nIGRvbmUgaGVyZSBjYW4ndCBmYWlsISAKICAgICAgICAgKi8KICAgICAgICBzbm1wX3N0b3JlX25lZWRlZChOVUxMKTsKICAgICAgICBicmVhazsKICAgIH0KICAgIHJldHVybiBTTk1QX0VSUl9OT0VSUk9SOwp9CgoKCgppbnQKd3JpdGVfdHJhY2VSb3V0ZUN0bFRpbWVPdXQoaW50IGFjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogdmFyX3ZhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyIHZhcl92YWxfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHZhcl92YWxfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiBzdGF0UCwgb2lkICogbmFtZSwgc2l6ZV90IG5hbWVfbGVuKQp7CiAgICBzdGF0aWMgc2l6ZV90ICAgdG1wdmFyOwogICAgc3RydWN0IHRyYWNlUm91dGVDdGxUYWJsZV9kYXRhICpTdG9yYWdlVG1wID0gTlVMTDsKICAgIHNpemVfdCAgICAgICAgICBuZXdsZW4gPQogICAgICAgIG5hbWVfbGVuIC0KICAgICAgICAoc2l6ZW9mKHRyYWNlUm91dGVDdGxUYWJsZV92YXJpYWJsZXNfb2lkKSAvIHNpemVvZihvaWQpICsgMyAtIDEpOwoKICAgIGlmICgoU3RvcmFnZVRtcCA9CiAgICAgICAgIGhlYWRlcl9jb21wbGV4KHRyYWNlUm91dGVDdGxUYWJsZVN0b3JhZ2UsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICZuYW1lW3NpemVvZih0cmFjZVJvdXRlQ3RsVGFibGVfdmFyaWFibGVzX29pZCkgLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yob2lkKSArIDMgLSAxXSwgJm5ld2xlbiwgMSwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpID09IE5VTEwpCiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PU1VDSE5BTUU7ICAgICAvKiByZW1vdmUgaWYgeW91IHN1cHBvcnQgY3JlYXRpb24gaGVyZSAqLwoKICAgIGlmIChTdG9yYWdlVG1wICYmIFN0b3JhZ2VUbXAtPnN0b3JhZ2VUeXBlID09IFNUX1JFQURPTkxZKSB7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PVFdSSVRBQkxFOwogICAgfQoKICAgIGlmIChTdG9yYWdlVG1wICYmIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxSb3dTdGF0dXMgPT0gUlNfQUNUSVZFKSB7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PVFdSSVRBQkxFOwogICAgfQogICAgc3dpdGNoIChhY3Rpb24pIHsKICAgIGNhc2UgUkVTRVJWRTE6CiAgICAgICAgaWYgKHZhcl92YWxfdHlwZSAhPSBBU05fVU5TSUdORUQpIHsKICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwKICAgICAgICAgICAgICAgICAgICAgIndyaXRlIHRvIHRyYWNlUm91dGVDdGxEYXRhU2l6ZSBub3QgQVNOX1VOU0lHTkVEXG4iKTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX1dST05HVFlQRTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgUkVTRVJWRTI6CiAgICAgICAgLyoKICAgICAgICAgKiBtZW1vcnkgcmVzZXZlcmF0aW9uLCBmaW5hbCBwcmVwYXJhdGlvbi4uLiAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBGUkVFOgogICAgICAgIC8qCiAgICAgICAgICogUmVsZWFzZSBhbnkgcmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIGFsbG9jYXRlZCAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBBQ1RJT046CiAgICAgICAgLyoKICAgICAgICAgKiBUaGUgdmFyaWFibGUgaGFzIGJlZW4gc3RvcmVkIGluIG9iamlkIGZvcgogICAgICAgICAqIHlvdSB0byB1c2UsIGFuZCB5b3UgaGF2ZSBqdXN0IGJlZW4gYXNrZWQgdG8gZG8gc29tZXRoaW5nIHdpdGgKICAgICAgICAgKiBpdC4gIE5vdGUgdGhhdCBhbnl0aGluZyBkb25lIGhlcmUgbXVzdCBiZSByZXZlcnNhYmxlIGluIHRoZSBVTkRPIGNhc2UgCiAgICAgICAgICovCiAgICAgICAgdG1wdmFyID0gU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFRpbWVPdXQ7CgogICAgICAgIGlmICgoKigobG9uZyAqKSB2YXJfdmFsKSkgPj0gMSAmJiAoKigobG9uZyAqKSB2YXJfdmFsKSkgPD0gNjApCiAgICAgICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUaW1lT3V0ID0gKigobG9uZyAqKSB2YXJfdmFsKTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUaW1lT3V0ID0gMzsKICAgICAgICBicmVhazsKCgogICAgY2FzZSBVTkRPOgogICAgICAgIC8qCiAgICAgICAgICogQmFjayBvdXQgYW55IGNoYW5nZXMgbWFkZSBpbiB0aGUgQUNUSU9OIGNhc2UgCiAgICAgICAgICovCiAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFRpbWVPdXQgPSB0bXB2YXI7CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgQ09NTUlUOgogICAgICAgIC8qCiAgICAgICAgICogVGhpbmdzIGFyZSB3b3JraW5nIHdlbGwsIHNvIGl0J3Mgbm93IHNhZmUgdG8gbWFrZSB0aGUgY2hhbmdlCiAgICAgICAgICogcGVybWFuZW50bHkuICBNYWtlIHN1cmUgdGhhdCBhbnl0aGluZyBkb25lIGhlcmUgY2FuJ3QgZmFpbCEgCiAgICAgICAgICovCiAgICAgICAgc25tcF9zdG9yZV9uZWVkZWQoTlVMTCk7CiAgICAgICAgYnJlYWs7CiAgICB9CiAgICByZXR1cm4gU05NUF9FUlJfTk9FUlJPUjsKfQoKCgoKCmludAp3cml0ZV90cmFjZVJvdXRlQ3RsUHJvYmVzUGVySG9wKGludCBhY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogdmFyX3ZhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgdmFyX3ZhbF90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB2YXJfdmFsX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiBzdGF0UCwgb2lkICogbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbmFtZV9sZW4pCnsKICAgIHN0YXRpYyBzaXplX3QgICB0bXB2YXI7CiAgICBzdHJ1Y3QgdHJhY2VSb3V0ZUN0bFRhYmxlX2RhdGEgKlN0b3JhZ2VUbXAgPSBOVUxMOwogICAgc2l6ZV90ICAgICAgICAgIG5ld2xlbiA9CiAgICAgICAgbmFtZV9sZW4gLQogICAgICAgIChzaXplb2YodHJhY2VSb3V0ZUN0bFRhYmxlX3ZhcmlhYmxlc19vaWQpIC8gc2l6ZW9mKG9pZCkgKyAzIC0gMSk7CgogICAgaWYgKChTdG9yYWdlVG1wID0KICAgICAgICAgaGVhZGVyX2NvbXBsZXgodHJhY2VSb3V0ZUN0bFRhYmxlU3RvcmFnZSwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgJm5hbWVbc2l6ZW9mKHRyYWNlUm91dGVDdGxUYWJsZV92YXJpYWJsZXNfb2lkKSAvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihvaWQpICsgMyAtIDFdLCAmbmV3bGVuLCAxLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkgPT0gTlVMTCkKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9TVUNITkFNRTsgICAgIC8qIHJlbW92ZSBpZiB5b3Ugc3VwcG9ydCBjcmVhdGlvbiBoZXJlICovCgogICAgaWYgKFN0b3JhZ2VUbXAgJiYgU3RvcmFnZVRtcC0+c3RvcmFnZVR5cGUgPT0gU1RfUkVBRE9OTFkpIHsKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9UV1JJVEFCTEU7CiAgICB9CgogICAgaWYgKFN0b3JhZ2VUbXAgJiYgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFJvd1N0YXR1cyA9PSBSU19BQ1RJVkUpIHsKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9UV1JJVEFCTEU7CiAgICB9CiAgICBzd2l0Y2ggKGFjdGlvbikgewogICAgY2FzZSBSRVNFUlZFMToKICAgICAgICBpZiAodmFyX3ZhbF90eXBlICE9IEFTTl9VTlNJR05FRCkgewogICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLAogICAgICAgICAgICAgICAgICAgICAid3JpdGUgdG8gdHJhY2VSb3V0ZUN0bERhdGFTaXplIG5vdCBBU05fVU5TSUdORURcbiIpOwogICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfV1JPTkdUWVBFOwogICAgICAgIH0KICAgICAgICBicmVhazsKCgogICAgY2FzZSBSRVNFUlZFMjoKICAgICAgICAvKgogICAgICAgICAqIG1lbW9yeSByZXNldmVyYXRpb24sIGZpbmFsIHByZXBhcmF0aW9uLi4uIAogICAgICAgICAqLwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIEZSRUU6CiAgICAgICAgLyoKICAgICAgICAgKiBSZWxlYXNlIGFueSByZXNvdXJjZXMgdGhhdCBoYXZlIGJlZW4gYWxsb2NhdGVkIAogICAgICAgICAqLwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIEFDVElPTjoKICAgICAgICAvKgogICAgICAgICAqIFRoZSB2YXJpYWJsZSBoYXMgYmVlbiBzdG9yZWQgaW4gb2JqaWQgZm9yCiAgICAgICAgICogeW91IHRvIHVzZSwgYW5kIHlvdSBoYXZlIGp1c3QgYmVlbiBhc2tlZCB0byBkbyBzb21ldGhpbmcgd2l0aAogICAgICAgICAqIGl0LiAgTm90ZSB0aGF0IGFueXRoaW5nIGRvbmUgaGVyZSBtdXN0IGJlIHJldmVyc2FibGUgaW4gdGhlIFVORE8gY2FzZSAKICAgICAgICAgKi8KICAgICAgICB0bXB2YXIgPSBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsUHJvYmVzUGVySG9wOwoKICAgICAgICBpZiAoKCooKGxvbmcgKikgdmFyX3ZhbCkpID49IDEgJiYgKCooKGxvbmcgKikgdmFyX3ZhbCkpIDw9IDEwKQogICAgICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsUHJvYmVzUGVySG9wID0gKigobG9uZyAqKSB2YXJfdmFsKTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxQcm9iZXNQZXJIb3AgPSAzOwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIFVORE86CiAgICAgICAgLyoKICAgICAgICAgKiBCYWNrIG91dCBhbnkgY2hhbmdlcyBtYWRlIGluIHRoZSBBQ1RJT04gY2FzZSAKICAgICAgICAgKi8KICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsUHJvYmVzUGVySG9wID0gdG1wdmFyOwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIENPTU1JVDoKICAgICAgICAvKgogICAgICAgICAqIFRoaW5ncyBhcmUgd29ya2luZyB3ZWxsLCBzbyBpdCdzIG5vdyBzYWZlIHRvIG1ha2UgdGhlIGNoYW5nZQogICAgICAgICAqIHBlcm1hbmVudGx5LiAgTWFrZSBzdXJlIHRoYXQgYW55dGhpbmcgZG9uZSBoZXJlIGNhbid0IGZhaWwhIAogICAgICAgICAqLwogICAgICAgIHNubXBfc3RvcmVfbmVlZGVkKE5VTEwpOwogICAgICAgIGJyZWFrOwogICAgfQogICAgcmV0dXJuIFNOTVBfRVJSX05PRVJST1I7Cn0KCgoKaW50CndyaXRlX3RyYWNlUm91dGVDdGxQb3J0KGludCBhY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHZhcl92YWwsCiAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciB2YXJfdmFsX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB2YXJfdmFsX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogc3RhdFAsIG9pZCAqIG5hbWUsIHNpemVfdCBuYW1lX2xlbikKewogICAgc3RhdGljIHNpemVfdCAgIHRtcHZhcjsKICAgIHN0cnVjdCB0cmFjZVJvdXRlQ3RsVGFibGVfZGF0YSAqU3RvcmFnZVRtcCA9IE5VTEw7CiAgICBzaXplX3QgICAgICAgICAgbmV3bGVuID0KICAgICAgICBuYW1lX2xlbiAtCiAgICAgICAgKHNpemVvZih0cmFjZVJvdXRlQ3RsVGFibGVfdmFyaWFibGVzX29pZCkgLyBzaXplb2Yob2lkKSArIDMgLSAxKTsKCiAgICBpZiAoKFN0b3JhZ2VUbXAgPQogICAgICAgICBoZWFkZXJfY29tcGxleCh0cmFjZVJvdXRlQ3RsVGFibGVTdG9yYWdlLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAmbmFtZVtzaXplb2YodHJhY2VSb3V0ZUN0bFRhYmxlX3ZhcmlhYmxlc19vaWQpIC8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9pZCkgKyAzIC0gMV0sICZuZXdsZW4sIDEsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKSA9PSBOVUxMKQogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1NVQ0hOQU1FOyAgICAgLyogcmVtb3ZlIGlmIHlvdSBzdXBwb3J0IGNyZWF0aW9uIGhlcmUgKi8KCiAgICBpZiAoU3RvcmFnZVRtcCAmJiBTdG9yYWdlVG1wLT5zdG9yYWdlVHlwZSA9PSBTVF9SRUFET05MWSkgewogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1RXUklUQUJMRTsKICAgIH0KCiAgICBzd2l0Y2ggKGFjdGlvbikgewogICAgY2FzZSBSRVNFUlZFMToKICAgICAgICBpZiAodmFyX3ZhbF90eXBlICE9IEFTTl9VTlNJR05FRCkgewogICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLAogICAgICAgICAgICAgICAgICAgICAid3JpdGUgdG8gdHJhY2VSb3V0ZUN0bFRhcmdldEFkZHJlc3NUeXBlIG5vdCBBU05fVU5TSUdORURcbiIpOwogICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfV1JPTkdUWVBFOwogICAgICAgIH0KICAgICAgICBicmVhazsKCgogICAgY2FzZSBSRVNFUlZFMjoKICAgICAgICAvKgogICAgICAgICAqIG1lbW9yeSByZXNldmVyYXRpb24sIGZpbmFsIHByZXBhcmF0aW9uLi4uIAogICAgICAgICAqLwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIEZSRUU6CiAgICAgICAgLyoKICAgICAgICAgKiBSZWxlYXNlIGFueSByZXNvdXJjZXMgdGhhdCBoYXZlIGJlZW4gYWxsb2NhdGVkIAogICAgICAgICAqLwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIEFDVElPTjoKICAgICAgICAvKgogICAgICAgICAqIFRoZSB2YXJpYWJsZSBoYXMgYmVlbiBzdG9yZWQgaW4gb2JqaWQgZm9yCiAgICAgICAgICogeW91IHRvIHVzZSwgYW5kIHlvdSBoYXZlIGp1c3QgYmVlbiBhc2tlZCB0byBkbyBzb21ldGhpbmcgd2l0aAogICAgICAgICAqIGl0LiAgTm90ZSB0aGF0IGFueXRoaW5nIGRvbmUgaGVyZSBtdXN0IGJlIHJldmVyc2FibGUgaW4gdGhlIFVORE8gY2FzZSAKICAgICAgICAgKi8KICAgICAgICB0bXB2YXIgPSBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsUG9ydDsKICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsUG9ydCA9ICooKGxvbmcgKikgdmFyX3ZhbCk7CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgVU5ETzoKICAgICAgICAvKgogICAgICAgICAqIEJhY2sgb3V0IGFueSBjaGFuZ2VzIG1hZGUgaW4gdGhlIEFDVElPTiBjYXNlIAogICAgICAgICAqLwogICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxQb3J0ID0gdG1wdmFyOwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIENPTU1JVDoKICAgICAgICAvKgogICAgICAgICAqIFRoaW5ncyBhcmUgd29ya2luZyB3ZWxsLCBzbyBpdCdzIG5vdyBzYWZlIHRvIG1ha2UgdGhlIGNoYW5nZQogICAgICAgICAqIHBlcm1hbmVudGx5LiAgTWFrZSBzdXJlIHRoYXQgYW55dGhpbmcgZG9uZSBoZXJlIGNhbid0IGZhaWwhIAogICAgICAgICAqLwogICAgICAgIHNubXBfc3RvcmVfbmVlZGVkKE5VTEwpOwogICAgICAgIGJyZWFrOwogICAgfQogICAgcmV0dXJuIFNOTVBfRVJSX05PRVJST1I7Cn0KCgoKCmludAp3cml0ZV90cmFjZVJvdXRlQ3RsTWF4VHRsKGludCBhY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogdmFyX3ZhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgdmFyX3ZhbF90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB2YXJfdmFsX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiBzdGF0UCwgb2lkICogbmFtZSwgc2l6ZV90IG5hbWVfbGVuKQp7CiAgICBzdGF0aWMgc2l6ZV90ICAgdG1wdmFyOwogICAgc3RydWN0IHRyYWNlUm91dGVDdGxUYWJsZV9kYXRhICpTdG9yYWdlVG1wID0gTlVMTDsKICAgIHNpemVfdCAgICAgICAgICBuZXdsZW4gPQogICAgICAgIG5hbWVfbGVuIC0KICAgICAgICAoc2l6ZW9mKHRyYWNlUm91dGVDdGxUYWJsZV92YXJpYWJsZXNfb2lkKSAvIHNpemVvZihvaWQpICsgMyAtIDEpOwoKICAgIGlmICgoU3RvcmFnZVRtcCA9CiAgICAgICAgIGhlYWRlcl9jb21wbGV4KHRyYWNlUm91dGVDdGxUYWJsZVN0b3JhZ2UsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICZuYW1lW3NpemVvZih0cmFjZVJvdXRlQ3RsVGFibGVfdmFyaWFibGVzX29pZCkgLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yob2lkKSArIDMgLSAxXSwgJm5ld2xlbiwgMSwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpID09IE5VTEwpCiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PU1VDSE5BTUU7ICAgICAvKiByZW1vdmUgaWYgeW91IHN1cHBvcnQgY3JlYXRpb24gaGVyZSAqLwoKICAgIGlmIChTdG9yYWdlVG1wICYmIFN0b3JhZ2VUbXAtPnN0b3JhZ2VUeXBlID09IFNUX1JFQURPTkxZKSB7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PVFdSSVRBQkxFOwogICAgfQoKICAgIGlmIChTdG9yYWdlVG1wICYmIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxSb3dTdGF0dXMgPT0gUlNfQUNUSVZFKSB7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PVFdSSVRBQkxFOwogICAgfQogICAgc3dpdGNoIChhY3Rpb24pIHsKICAgIGNhc2UgUkVTRVJWRTE6CiAgICAgICAgaWYgKHZhcl92YWxfdHlwZSAhPSBBU05fVU5TSUdORUQpIHsKICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwKICAgICAgICAgICAgICAgICAgICAgIndyaXRlIHRvIHRyYWNlUm91dGVDdGxEYXRhU2l6ZSBub3QgQVNOX1VOU0lHTkVEXG4iKTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX1dST05HVFlQRTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgUkVTRVJWRTI6CiAgICAgICAgLyoKICAgICAgICAgKiBtZW1vcnkgcmVzZXZlcmF0aW9uLCBmaW5hbCBwcmVwYXJhdGlvbi4uLiAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBGUkVFOgogICAgICAgIC8qCiAgICAgICAgICogUmVsZWFzZSBhbnkgcmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIGFsbG9jYXRlZCAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBBQ1RJT046CiAgICAgICAgLyoKICAgICAgICAgKiBUaGUgdmFyaWFibGUgaGFzIGJlZW4gc3RvcmVkIGluIG9iamlkIGZvcgogICAgICAgICAqIHlvdSB0byB1c2UsIGFuZCB5b3UgaGF2ZSBqdXN0IGJlZW4gYXNrZWQgdG8gZG8gc29tZXRoaW5nIHdpdGgKICAgICAgICAgKiBpdC4gIE5vdGUgdGhhdCBhbnl0aGluZyBkb25lIGhlcmUgbXVzdCBiZSByZXZlcnNhYmxlIGluIHRoZSBVTkRPIGNhc2UgCiAgICAgICAgICovCiAgICAgICAgdG1wdmFyID0gU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bE1heFR0bDsKICAgICAgICBpZiAoKCooKGxvbmcgKikgdmFyX3ZhbCkpID49IDEgJiYgKCooKGxvbmcgKikgdmFyX3ZhbCkpIDw9IDI1NSkKICAgICAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bE1heFR0bCA9ICooKGxvbmcgKikgdmFyX3ZhbCk7CiAgICAgICAgZWxzZQogICAgICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsTWF4VHRsID0gMzA7CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgVU5ETzoKICAgICAgICAvKgogICAgICAgICAqIEJhY2sgb3V0IGFueSBjaGFuZ2VzIG1hZGUgaW4gdGhlIEFDVElPTiBjYXNlIAogICAgICAgICAqLwogICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxNYXhUdGwgPSB0bXB2YXI7CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgQ09NTUlUOgogICAgICAgIC8qCiAgICAgICAgICogVGhpbmdzIGFyZSB3b3JraW5nIHdlbGwsIHNvIGl0J3Mgbm93IHNhZmUgdG8gbWFrZSB0aGUgY2hhbmdlCiAgICAgICAgICogcGVybWFuZW50bHkuICBNYWtlIHN1cmUgdGhhdCBhbnl0aGluZyBkb25lIGhlcmUgY2FuJ3QgZmFpbCEgCiAgICAgICAgICovCiAgICAgICAgc25tcF9zdG9yZV9uZWVkZWQoTlVMTCk7CiAgICAgICAgYnJlYWs7CiAgICB9CiAgICByZXR1cm4gU05NUF9FUlJfTk9FUlJPUjsKfQoKCmludAp3cml0ZV90cmFjZVJvdXRlQ3RsRFNGaWVsZChpbnQgYWN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiB2YXJfdmFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgdmFyX3ZhbF90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgdmFyX3ZhbF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHN0YXRQLCBvaWQgKiBuYW1lLCBzaXplX3QgbmFtZV9sZW4pCnsKICAgIHN0YXRpYyBzaXplX3QgICB0bXB2YXI7CiAgICBzdHJ1Y3QgdHJhY2VSb3V0ZUN0bFRhYmxlX2RhdGEgKlN0b3JhZ2VUbXAgPSBOVUxMOwogICAgc2l6ZV90ICAgICAgICAgIG5ld2xlbiA9CiAgICAgICAgbmFtZV9sZW4gLQogICAgICAgIChzaXplb2YodHJhY2VSb3V0ZUN0bFRhYmxlX3ZhcmlhYmxlc19vaWQpIC8gc2l6ZW9mKG9pZCkgKyAzIC0gMSk7CgogICAgaWYgKChTdG9yYWdlVG1wID0KICAgICAgICAgaGVhZGVyX2NvbXBsZXgodHJhY2VSb3V0ZUN0bFRhYmxlU3RvcmFnZSwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgJm5hbWVbc2l6ZW9mKHRyYWNlUm91dGVDdGxUYWJsZV92YXJpYWJsZXNfb2lkKSAvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihvaWQpICsgMyAtIDFdLCAmbmV3bGVuLCAxLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkgPT0gTlVMTCkKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9TVUNITkFNRTsgICAgIC8qIHJlbW92ZSBpZiB5b3Ugc3VwcG9ydCBjcmVhdGlvbiBoZXJlICovCgogICAgaWYgKFN0b3JhZ2VUbXAgJiYgU3RvcmFnZVRtcC0+c3RvcmFnZVR5cGUgPT0gU1RfUkVBRE9OTFkpIHsKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9UV1JJVEFCTEU7CiAgICB9CgogICAgaWYgKFN0b3JhZ2VUbXAgJiYgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFJvd1N0YXR1cyA9PSBSU19BQ1RJVkUpIHsKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9UV1JJVEFCTEU7CiAgICB9CiAgICBzd2l0Y2ggKGFjdGlvbikgewogICAgY2FzZSBSRVNFUlZFMToKICAgICAgICBpZiAodmFyX3ZhbF90eXBlICE9IEFTTl9VTlNJR05FRCkgewogICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLAogICAgICAgICAgICAgICAgICAgICAid3JpdGUgdG8gdHJhY2VSb3V0ZUN0bERhdGFTaXplIG5vdCBBU05fVU5TSUdORURcbiIpOwogICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfV1JPTkdUWVBFOwogICAgICAgIH0KICAgICAgICBicmVhazsKCgogICAgY2FzZSBSRVNFUlZFMjoKICAgICAgICAvKgogICAgICAgICAqIG1lbW9yeSByZXNldmVyYXRpb24sIGZpbmFsIHByZXBhcmF0aW9uLi4uIAogICAgICAgICAqLwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIEZSRUU6CiAgICAgICAgLyoKICAgICAgICAgKiBSZWxlYXNlIGFueSByZXNvdXJjZXMgdGhhdCBoYXZlIGJlZW4gYWxsb2NhdGVkIAogICAgICAgICAqLwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIEFDVElPTjoKICAgICAgICAvKgogICAgICAgICAqIFRoZSB2YXJpYWJsZSBoYXMgYmVlbiBzdG9yZWQgaW4gb2JqaWQgZm9yCiAgICAgICAgICogeW91IHRvIHVzZSwgYW5kIHlvdSBoYXZlIGp1c3QgYmVlbiBhc2tlZCB0byBkbyBzb21ldGhpbmcgd2l0aAogICAgICAgICAqIGl0LiAgTm90ZSB0aGF0IGFueXRoaW5nIGRvbmUgaGVyZSBtdXN0IGJlIHJldmVyc2FibGUgaW4gdGhlIFVORE8gY2FzZSAKICAgICAgICAgKi8KICAgICAgICB0bXB2YXIgPSBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsRFNGaWVsZDsKICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsRFNGaWVsZCA9ICooKGxvbmcgKikgdmFyX3ZhbCk7CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgVU5ETzoKICAgICAgICAvKgogICAgICAgICAqIEJhY2sgb3V0IGFueSBjaGFuZ2VzIG1hZGUgaW4gdGhlIEFDVElPTiBjYXNlIAogICAgICAgICAqLwogICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxEU0ZpZWxkID0gdG1wdmFyOwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIENPTU1JVDoKICAgICAgICAvKgogICAgICAgICAqIFRoaW5ncyBhcmUgd29ya2luZyB3ZWxsLCBzbyBpdCdzIG5vdyBzYWZlIHRvIG1ha2UgdGhlIGNoYW5nZQogICAgICAgICAqIHBlcm1hbmVudGx5LiAgTWFrZSBzdXJlIHRoYXQgYW55dGhpbmcgZG9uZSBoZXJlIGNhbid0IGZhaWwhIAogICAgICAgICAqLwogICAgICAgIHNubXBfc3RvcmVfbmVlZGVkKE5VTEwpOwogICAgICAgIGJyZWFrOwogICAgfQogICAgcmV0dXJuIFNOTVBfRVJSX05PRVJST1I7Cn0KCmludAp3cml0ZV90cmFjZVJvdXRlQ3RsU291cmNlQWRkcmVzc1R5cGUoaW50IGFjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHZhcl92YWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgdmFyX3ZhbF90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHZhcl92YWxfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogc3RhdFAsIG9pZCAqIG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbmFtZV9sZW4pCnsKICAgIHN0YXRpYyBzaXplX3QgICB0bXB2YXI7CiAgICBzdHJ1Y3QgdHJhY2VSb3V0ZUN0bFRhYmxlX2RhdGEgKlN0b3JhZ2VUbXAgPSBOVUxMOwogICAgc2l6ZV90ICAgICAgICAgIG5ld2xlbiA9CiAgICAgICAgbmFtZV9sZW4gLQogICAgICAgIChzaXplb2YodHJhY2VSb3V0ZUN0bFRhYmxlX3ZhcmlhYmxlc19vaWQpIC8gc2l6ZW9mKG9pZCkgKyAzIC0gMSk7CgogICAgaWYgKChTdG9yYWdlVG1wID0KICAgICAgICAgaGVhZGVyX2NvbXBsZXgodHJhY2VSb3V0ZUN0bFRhYmxlU3RvcmFnZSwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgJm5hbWVbc2l6ZW9mKHRyYWNlUm91dGVDdGxUYWJsZV92YXJpYWJsZXNfb2lkKSAvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihvaWQpICsgMyAtIDFdLCAmbmV3bGVuLCAxLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkgPT0gTlVMTCkKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9TVUNITkFNRTsgICAgIC8qIHJlbW92ZSBpZiB5b3Ugc3VwcG9ydCBjcmVhdGlvbiBoZXJlICovCgogICAgaWYgKFN0b3JhZ2VUbXAgJiYgU3RvcmFnZVRtcC0+c3RvcmFnZVR5cGUgPT0gU1RfUkVBRE9OTFkpIHsKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9UV1JJVEFCTEU7CiAgICB9CgogICAgaWYgKFN0b3JhZ2VUbXAgJiYgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFJvd1N0YXR1cyA9PSBSU19BQ1RJVkUpIHsKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9UV1JJVEFCTEU7CiAgICB9CiAgICBzd2l0Y2ggKGFjdGlvbikgewogICAgY2FzZSBSRVNFUlZFMToKICAgICAgICBpZiAodmFyX3ZhbF90eXBlICE9IEFTTl9JTlRFR0VSKSB7CiAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsCiAgICAgICAgICAgICAgICAgICAgICJ3cml0ZSB0byB0cmFjZVJvdXRlQ3RsTWF4Um93cyBub3QgQVNOX0lOVEVHRVJcbiIpOwogICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfV1JPTkdUWVBFOwogICAgICAgIH0KICAgICAgICBicmVhazsKCgogICAgY2FzZSBSRVNFUlZFMjoKICAgICAgICAvKgogICAgICAgICAqIG1lbW9yeSByZXNldmVyYXRpb24sIGZpbmFsIHByZXBhcmF0aW9uLi4uIAogICAgICAgICAqLwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIEZSRUU6CiAgICAgICAgLyoKICAgICAgICAgKiBSZWxlYXNlIGFueSByZXNvdXJjZXMgdGhhdCBoYXZlIGJlZW4gYWxsb2NhdGVkIAogICAgICAgICAqLwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIEFDVElPTjoKICAgICAgICAvKgogICAgICAgICAqIFRoZSB2YXJpYWJsZSBoYXMgYmVlbiBzdG9yZWQgaW4gb2JqaWQgZm9yCiAgICAgICAgICogeW91IHRvIHVzZSwgYW5kIHlvdSBoYXZlIGp1c3QgYmVlbiBhc2tlZCB0byBkbyBzb21ldGhpbmcgd2l0aAogICAgICAgICAqIGl0LiAgTm90ZSB0aGF0IGFueXRoaW5nIGRvbmUgaGVyZSBtdXN0IGJlIHJldmVyc2FibGUgaW4gdGhlIFVORE8gY2FzZSAKICAgICAgICAgKi8KICAgICAgICB0bXB2YXIgPSBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsU291cmNlQWRkcmVzc1R5cGU7CiAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFNvdXJjZUFkZHJlc3NUeXBlID0gKigobG9uZyAqKSB2YXJfdmFsKTsKICAgICAgICBicmVhazsKCgogICAgY2FzZSBVTkRPOgogICAgICAgIC8qCiAgICAgICAgICogQmFjayBvdXQgYW55IGNoYW5nZXMgbWFkZSBpbiB0aGUgQUNUSU9OIGNhc2UgCiAgICAgICAgICovCiAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFNvdXJjZUFkZHJlc3NUeXBlID0gdG1wdmFyOwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIENPTU1JVDoKICAgICAgICAvKgogICAgICAgICAqIFRoaW5ncyBhcmUgd29ya2luZyB3ZWxsLCBzbyBpdCdzIG5vdyBzYWZlIHRvIG1ha2UgdGhlIGNoYW5nZQogICAgICAgICAqIHBlcm1hbmVudGx5LiAgTWFrZSBzdXJlIHRoYXQgYW55dGhpbmcgZG9uZSBoZXJlIGNhbid0IGZhaWwhIAogICAgICAgICAqLwogICAgICAgIHNubXBfc3RvcmVfbmVlZGVkKE5VTEwpOwogICAgICAgIGJyZWFrOwogICAgfQogICAgcmV0dXJuIFNOTVBfRVJSX05PRVJST1I7Cn0KCmludAp3cml0ZV90cmFjZVJvdXRlQ3RsU291cmNlQWRkcmVzcyhpbnQgYWN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiB2YXJfdmFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgdmFyX3ZhbF90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgdmFyX3ZhbF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHN0YXRQLCBvaWQgKiBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbmFtZV9sZW4pCnsKICAgIHN0YXRpYyBjaGFyICAgICp0bXB2YXI7CiAgICBzdGF0aWMgc2l6ZV90ICAgdG1wbGVuOwogICAgc3RydWN0IHRyYWNlUm91dGVDdGxUYWJsZV9kYXRhICpTdG9yYWdlVG1wID0gTlVMTDsKICAgIHNpemVfdCAgICAgICAgICBuZXdsZW4gPQogICAgICAgIG5hbWVfbGVuIC0KICAgICAgICAoc2l6ZW9mKHRyYWNlUm91dGVDdGxUYWJsZV92YXJpYWJsZXNfb2lkKSAvIHNpemVvZihvaWQpICsgMyAtIDEpOwoKICAgIGlmICgoU3RvcmFnZVRtcCA9CiAgICAgICAgIGhlYWRlcl9jb21wbGV4KHRyYWNlUm91dGVDdGxUYWJsZVN0b3JhZ2UsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICZuYW1lW3NpemVvZih0cmFjZVJvdXRlQ3RsVGFibGVfdmFyaWFibGVzX29pZCkgLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yob2lkKSArIDMgLSAxXSwgJm5ld2xlbiwgMSwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpID09IE5VTEwpCiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PU1VDSE5BTUU7ICAgICAvKiByZW1vdmUgaWYgeW91IHN1cHBvcnQgY3JlYXRpb24gaGVyZSAqLwoKICAgIGlmIChTdG9yYWdlVG1wICYmIFN0b3JhZ2VUbXAtPnN0b3JhZ2VUeXBlID09IFNUX1JFQURPTkxZKSB7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PVFdSSVRBQkxFOwogICAgfQoKICAgIGlmIChTdG9yYWdlVG1wICYmIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxSb3dTdGF0dXMgPT0gUlNfQUNUSVZFKSB7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PVFdSSVRBQkxFOwogICAgfQoKICAgIHN3aXRjaCAoYWN0aW9uKSB7CiAgICBjYXNlIFJFU0VSVkUxOgogICAgICAgIGlmICh2YXJfdmFsX3R5cGUgIT0gQVNOX09DVEVUX1NUUikgewogICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLAogICAgICAgICAgICAgICAgICAgICAid3JpdGUgdG8gdHJhY2VSb3V0ZUN0bFRhcmdldEFkZHJlc3Mgbm90IEFTTl9PQ1RFVF9TVFJcbiIpOwogICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfV1JPTkdUWVBFOwogICAgICAgIH0KICAgICAgICBicmVhazsKCgogICAgY2FzZSBSRVNFUlZFMjoKICAgICAgICAvKgogICAgICAgICAqIG1lbW9yeSByZXNldmVyYXRpb24sIGZpbmFsIHByZXBhcmF0aW9uLi4uIAogICAgICAgICAqLwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIEZSRUU6CiAgICAgICAgLyoKICAgICAgICAgKiBSZWxlYXNlIGFueSByZXNvdXJjZXMgdGhhdCBoYXZlIGJlZW4gYWxsb2NhdGVkIAogICAgICAgICAqLwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIEFDVElPTjoKICAgICAgICAvKgogICAgICAgICAqIFRoZSB2YXJpYWJsZSBoYXMgYmVlbiBzdG9yZWQgaW4gbG9uZ19yZXQgZm9yCiAgICAgICAgICogeW91IHRvIHVzZSwgYW5kIHlvdSBoYXZlIGp1c3QgYmVlbiBhc2tlZCB0byBkbyBzb21ldGhpbmcgd2l0aAogICAgICAgICAqIGl0LiAgTm90ZSB0aGF0IGFueXRoaW5nIGRvbmUgaGVyZSBtdXN0IGJlIHJldmVyc2FibGUgaW4gdGhlIFVORE8gY2FzZSAKICAgICAgICAgKi8KICAgICAgICB0bXB2YXIgPSBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsU291cmNlQWRkcmVzczsKICAgICAgICB0bXBsZW4gPSBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsU291cmNlQWRkcmVzc0xlbjsKICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsU291cmNlQWRkcmVzcyA9CiAgICAgICAgICAgIChjaGFyICopIG1hbGxvYyh2YXJfdmFsX2xlbiArIDEpOwogICAgICAgIGlmIChTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsU291cmNlQWRkcmVzcyA9PSBOVUxMKSB7CiAgICAgICAgICAgIGV4aXQoMSk7CiAgICAgICAgfQogICAgICAgIG1lbWNweShTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsU291cmNlQWRkcmVzcywgdmFyX3ZhbCwKICAgICAgICAgICAgICAgdmFyX3ZhbF9sZW4gKyAxKTsKICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsU291cmNlQWRkcmVzc1t2YXJfdmFsX2xlbl0gPSAnXDAnOwogICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxTb3VyY2VBZGRyZXNzTGVuID0gdmFyX3ZhbF9sZW47CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgVU5ETzoKICAgICAgICAvKgogICAgICAgICAqIEJhY2sgb3V0IGFueSBjaGFuZ2VzIG1hZGUgaW4gdGhlIEFDVElPTiBjYXNlIAogICAgICAgICAqLwogICAgICAgIFNOTVBfRlJFRShTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsU291cmNlQWRkcmVzcyk7CiAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFNvdXJjZUFkZHJlc3MgPSB0bXB2YXI7CiAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFNvdXJjZUFkZHJlc3NMZW4gPSB0bXBsZW47CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgQ09NTUlUOgogICAgICAgIC8qCiAgICAgICAgICogVGhpbmdzIGFyZSB3b3JraW5nIHdlbGwsIHNvIGl0J3Mgbm93IHNhZmUgdG8gbWFrZSB0aGUgY2hhbmdlCiAgICAgICAgICogcGVybWFuZW50bHkuICBNYWtlIHN1cmUgdGhhdCBhbnl0aGluZyBkb25lIGhlcmUgY2FuJ3QgZmFpbCEgCiAgICAgICAgICovCiAgICAgICAgU05NUF9GUkVFKHRtcHZhcik7CiAgICAgICAgc25tcF9zdG9yZV9uZWVkZWQoTlVMTCk7CiAgICAgICAgYnJlYWs7CiAgICB9CiAgICByZXR1cm4gU05NUF9FUlJfTk9FUlJPUjsKfQoKCgoKaW50CndyaXRlX3RyYWNlUm91dGVDdGxJZkluZGV4KGludCBhY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHZhcl92YWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciB2YXJfdmFsX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB2YXJfdmFsX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogc3RhdFAsIG9pZCAqIG5hbWUsIHNpemVfdCBuYW1lX2xlbikKewogICAgc3RhdGljIHNpemVfdCAgIHRtcHZhcjsKICAgIHN0cnVjdCB0cmFjZVJvdXRlQ3RsVGFibGVfZGF0YSAqU3RvcmFnZVRtcCA9IE5VTEw7CiAgICBzaXplX3QgICAgICAgICAgbmV3bGVuID0KICAgICAgICBuYW1lX2xlbiAtCiAgICAgICAgKHNpemVvZih0cmFjZVJvdXRlQ3RsVGFibGVfdmFyaWFibGVzX29pZCkgLyBzaXplb2Yob2lkKSArIDMgLSAxKTsKCiAgICBpZiAoKFN0b3JhZ2VUbXAgPQogICAgICAgICBoZWFkZXJfY29tcGxleCh0cmFjZVJvdXRlQ3RsVGFibGVTdG9yYWdlLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAmbmFtZVtzaXplb2YodHJhY2VSb3V0ZUN0bFRhYmxlX3ZhcmlhYmxlc19vaWQpIC8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9pZCkgKyAzIC0gMV0sICZuZXdsZW4sIDEsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKSA9PSBOVUxMKQogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1NVQ0hOQU1FOyAgICAgLyogcmVtb3ZlIGlmIHlvdSBzdXBwb3J0IGNyZWF0aW9uIGhlcmUgKi8KCiAgICBpZiAoU3RvcmFnZVRtcCAmJiBTdG9yYWdlVG1wLT5zdG9yYWdlVHlwZSA9PSBTVF9SRUFET05MWSkgewogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1RXUklUQUJMRTsKICAgIH0KCiAgICBpZiAoU3RvcmFnZVRtcCAmJiBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsUm93U3RhdHVzID09IFJTX0FDVElWRSkgewogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1RXUklUQUJMRTsKICAgIH0KICAgIHN3aXRjaCAoYWN0aW9uKSB7CiAgICBjYXNlIFJFU0VSVkUxOgogICAgICAgIGlmICh2YXJfdmFsX3R5cGUgIT0gQVNOX0lOVEVHRVIpIHsKICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwKICAgICAgICAgICAgICAgICAgICAgIndyaXRlIHRvIHRyYWNlUm91dGVDdGxNYXhSb3dzIG5vdCBBU05fSU5URUdFUlxuIik7CiAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9XUk9OR1RZUEU7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIFJFU0VSVkUyOgogICAgICAgIC8qCiAgICAgICAgICogbWVtb3J5IHJlc2V2ZXJhdGlvbiwgZmluYWwgcHJlcGFyYXRpb24uLi4gCiAgICAgICAgICovCiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgRlJFRToKICAgICAgICAvKgogICAgICAgICAqIFJlbGVhc2UgYW55IHJlc291cmNlcyB0aGF0IGhhdmUgYmVlbiBhbGxvY2F0ZWQgCiAgICAgICAgICovCiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgQUNUSU9OOgogICAgICAgIC8qCiAgICAgICAgICogVGhlIHZhcmlhYmxlIGhhcyBiZWVuIHN0b3JlZCBpbiBvYmppZCBmb3IKICAgICAgICAgKiB5b3UgdG8gdXNlLCBhbmQgeW91IGhhdmUganVzdCBiZWVuIGFza2VkIHRvIGRvIHNvbWV0aGluZyB3aXRoCiAgICAgICAgICogaXQuICBOb3RlIHRoYXQgYW55dGhpbmcgZG9uZSBoZXJlIG11c3QgYmUgcmV2ZXJzYWJsZSBpbiB0aGUgVU5ETyBjYXNlIAogICAgICAgICAqLwogICAgICAgIHRtcHZhciA9IFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxJZkluZGV4OwogICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxJZkluZGV4ID0gKigobG9uZyAqKSB2YXJfdmFsKTsKICAgICAgICBicmVhazsKCgogICAgY2FzZSBVTkRPOgogICAgICAgIC8qCiAgICAgICAgICogQmFjayBvdXQgYW55IGNoYW5nZXMgbWFkZSBpbiB0aGUgQUNUSU9OIGNhc2UgCiAgICAgICAgICovCiAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bElmSW5kZXggPSB0bXB2YXI7CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgQ09NTUlUOgogICAgICAgIC8qCiAgICAgICAgICogVGhpbmdzIGFyZSB3b3JraW5nIHdlbGwsIHNvIGl0J3Mgbm93IHNhZmUgdG8gbWFrZSB0aGUgY2hhbmdlCiAgICAgICAgICogcGVybWFuZW50bHkuICBNYWtlIHN1cmUgdGhhdCBhbnl0aGluZyBkb25lIGhlcmUgY2FuJ3QgZmFpbCEgCiAgICAgICAgICovCiAgICAgICAgc25tcF9zdG9yZV9uZWVkZWQoTlVMTCk7CiAgICAgICAgYnJlYWs7CiAgICB9CiAgICByZXR1cm4gU05NUF9FUlJfTk9FUlJPUjsKfQoKCgppbnQKd3JpdGVfdHJhY2VSb3V0ZUN0bE1pc2NPcHRpb25zKGludCBhY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiB2YXJfdmFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyIHZhcl92YWxfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB2YXJfdmFsX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHN0YXRQLCBvaWQgKiBuYW1lLCBzaXplX3QgbmFtZV9sZW4pCnsKICAgIHN0YXRpYyBjaGFyICAgICp0bXB2YXI7CiAgICBzdGF0aWMgc2l6ZV90ICAgdG1wbGVuOwogICAgc3RydWN0IHRyYWNlUm91dGVDdGxUYWJsZV9kYXRhICpTdG9yYWdlVG1wID0gTlVMTDsKICAgIHNpemVfdCAgICAgICAgICBuZXdsZW4gPQogICAgICAgIG5hbWVfbGVuIC0KICAgICAgICAoc2l6ZW9mKHRyYWNlUm91dGVDdGxUYWJsZV92YXJpYWJsZXNfb2lkKSAvIHNpemVvZihvaWQpICsgMyAtIDEpOwoKICAgIGlmICgoU3RvcmFnZVRtcCA9CiAgICAgICAgIGhlYWRlcl9jb21wbGV4KHRyYWNlUm91dGVDdGxUYWJsZVN0b3JhZ2UsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICZuYW1lW3NpemVvZih0cmFjZVJvdXRlQ3RsVGFibGVfdmFyaWFibGVzX29pZCkgLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yob2lkKSArIDMgLSAxXSwgJm5ld2xlbiwgMSwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpID09IE5VTEwpCiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PU1VDSE5BTUU7ICAgICAvKiByZW1vdmUgaWYgeW91IHN1cHBvcnQgY3JlYXRpb24gaGVyZSAqLwoKICAgIGlmIChTdG9yYWdlVG1wICYmIFN0b3JhZ2VUbXAtPnN0b3JhZ2VUeXBlID09IFNUX1JFQURPTkxZKSB7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PVFdSSVRBQkxFOwogICAgfQoKICAgIGlmIChTdG9yYWdlVG1wICYmIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxSb3dTdGF0dXMgPT0gUlNfQUNUSVZFKSB7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PVFdSSVRBQkxFOwogICAgfQoKICAgIHN3aXRjaCAoYWN0aW9uKSB7CiAgICBjYXNlIFJFU0VSVkUxOgogICAgICAgIGlmICh2YXJfdmFsX3R5cGUgIT0gQVNOX09DVEVUX1NUUikgewogICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLAogICAgICAgICAgICAgICAgICAgICAid3JpdGUgdG8gdHJhY2VSb3V0ZUN0bFRhcmdldEFkZHJlc3Mgbm90IEFTTl9PQ1RFVF9TVFJcbiIpOwogICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfV1JPTkdUWVBFOwogICAgICAgIH0KICAgICAgICBicmVhazsKCgogICAgY2FzZSBSRVNFUlZFMjoKICAgICAgICAvKgogICAgICAgICAqIG1lbW9yeSByZXNldmVyYXRpb24sIGZpbmFsIHByZXBhcmF0aW9uLi4uIAogICAgICAgICAqLwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIEZSRUU6CiAgICAgICAgLyoKICAgICAgICAgKiBSZWxlYXNlIGFueSByZXNvdXJjZXMgdGhhdCBoYXZlIGJlZW4gYWxsb2NhdGVkIAogICAgICAgICAqLwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIEFDVElPTjoKICAgICAgICAvKgogICAgICAgICAqIFRoZSB2YXJpYWJsZSBoYXMgYmVlbiBzdG9yZWQgaW4gbG9uZ19yZXQgZm9yCiAgICAgICAgICogeW91IHRvIHVzZSwgYW5kIHlvdSBoYXZlIGp1c3QgYmVlbiBhc2tlZCB0byBkbyBzb21ldGhpbmcgd2l0aAogICAgICAgICAqIGl0LiAgTm90ZSB0aGF0IGFueXRoaW5nIGRvbmUgaGVyZSBtdXN0IGJlIHJldmVyc2FibGUgaW4gdGhlIFVORE8gY2FzZSAKICAgICAgICAgKi8KICAgICAgICB0bXB2YXIgPSBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsTWlzY09wdGlvbnM7CiAgICAgICAgdG1wbGVuID0gU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bE1pc2NPcHRpb25zTGVuOwogICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxNaXNjT3B0aW9ucyA9CiAgICAgICAgICAgIChjaGFyICopIG1hbGxvYyh2YXJfdmFsX2xlbiArIDEpOwogICAgICAgIGlmIChTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsTWlzY09wdGlvbnMgPT0gTlVMTCkgewogICAgICAgICAgICBleGl0KDEpOwogICAgICAgIH0KICAgICAgICBtZW1jcHkoU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bE1pc2NPcHRpb25zLCB2YXJfdmFsLAogICAgICAgICAgICAgICB2YXJfdmFsX2xlbiArIDEpOwogICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxNaXNjT3B0aW9uc1t2YXJfdmFsX2xlbl0gPSAnXDAnOwogICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxNaXNjT3B0aW9uc0xlbiA9IHZhcl92YWxfbGVuOwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIFVORE86CiAgICAgICAgLyoKICAgICAgICAgKiBCYWNrIG91dCBhbnkgY2hhbmdlcyBtYWRlIGluIHRoZSBBQ1RJT04gY2FzZSAKICAgICAgICAgKi8KICAgICAgICBTTk1QX0ZSRUUoU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bE1pc2NPcHRpb25zKTsKICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsTWlzY09wdGlvbnMgPSB0bXB2YXI7CiAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bE1pc2NPcHRpb25zTGVuID0gdG1wbGVuOwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIENPTU1JVDoKICAgICAgICAvKgogICAgICAgICAqIFRoaW5ncyBhcmUgd29ya2luZyB3ZWxsLCBzbyBpdCdzIG5vdyBzYWZlIHRvIG1ha2UgdGhlIGNoYW5nZQogICAgICAgICAqIHBlcm1hbmVudGx5LiAgTWFrZSBzdXJlIHRoYXQgYW55dGhpbmcgZG9uZSBoZXJlIGNhbid0IGZhaWwhIAogICAgICAgICAqLwogICAgICAgIFNOTVBfRlJFRSh0bXB2YXIpOwogICAgICAgIHNubXBfc3RvcmVfbmVlZGVkKE5VTEwpOwogICAgICAgIGJyZWFrOwogICAgfQogICAgcmV0dXJuIFNOTVBfRVJSX05PRVJST1I7Cn0KCmludAp3cml0ZV90cmFjZVJvdXRlQ3RsTWF4RmFpbHVyZXMoaW50IGFjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHZhcl92YWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgdmFyX3ZhbF90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHZhcl92YWxfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogc3RhdFAsIG9pZCAqIG5hbWUsIHNpemVfdCBuYW1lX2xlbikKewogICAgc3RhdGljIHNpemVfdCAgIHRtcHZhcjsKICAgIHN0cnVjdCB0cmFjZVJvdXRlQ3RsVGFibGVfZGF0YSAqU3RvcmFnZVRtcCA9IE5VTEw7CiAgICBzaXplX3QgICAgICAgICAgbmV3bGVuID0KICAgICAgICBuYW1lX2xlbiAtCiAgICAgICAgKHNpemVvZih0cmFjZVJvdXRlQ3RsVGFibGVfdmFyaWFibGVzX29pZCkgLyBzaXplb2Yob2lkKSArIDMgLSAxKTsKCiAgICBpZiAoKFN0b3JhZ2VUbXAgPQogICAgICAgICBoZWFkZXJfY29tcGxleCh0cmFjZVJvdXRlQ3RsVGFibGVTdG9yYWdlLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAmbmFtZVtzaXplb2YodHJhY2VSb3V0ZUN0bFRhYmxlX3ZhcmlhYmxlc19vaWQpIC8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9pZCkgKyAzIC0gMV0sICZuZXdsZW4sIDEsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKSA9PSBOVUxMKQogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1NVQ0hOQU1FOyAgICAgLyogcmVtb3ZlIGlmIHlvdSBzdXBwb3J0IGNyZWF0aW9uIGhlcmUgKi8KCiAgICBpZiAoU3RvcmFnZVRtcCAmJiBTdG9yYWdlVG1wLT5zdG9yYWdlVHlwZSA9PSBTVF9SRUFET05MWSkgewogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1RXUklUQUJMRTsKICAgIH0KCiAgICBpZiAoU3RvcmFnZVRtcCAmJiBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsUm93U3RhdHVzID09IFJTX0FDVElWRSkgewogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1RXUklUQUJMRTsKICAgIH0KICAgIHN3aXRjaCAoYWN0aW9uKSB7CiAgICBjYXNlIFJFU0VSVkUxOgogICAgICAgIGlmICh2YXJfdmFsX3R5cGUgIT0gQVNOX1VOU0lHTkVEKSB7CiAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsCiAgICAgICAgICAgICAgICAgICAgICJ3cml0ZSB0byB0cmFjZVJvdXRlQ3RsVHJhcFRlc3RGYWlsdXJlRmlsdGVyIG5vdCBBU05fVU5TSUdORURcbiIpOwogICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfV1JPTkdUWVBFOwogICAgICAgIH0KICAgICAgICBicmVhazsKCgogICAgY2FzZSBSRVNFUlZFMjoKICAgICAgICAvKgogICAgICAgICAqIG1lbW9yeSByZXNldmVyYXRpb24sIGZpbmFsIHByZXBhcmF0aW9uLi4uIAogICAgICAgICAqLwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIEZSRUU6CiAgICAgICAgLyoKICAgICAgICAgKiBSZWxlYXNlIGFueSByZXNvdXJjZXMgdGhhdCBoYXZlIGJlZW4gYWxsb2NhdGVkIAogICAgICAgICAqLwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIEFDVElPTjoKICAgICAgICAvKgogICAgICAgICAqIFRoZSB2YXJpYWJsZSBoYXMgYmVlbiBzdG9yZWQgaW4gb2JqaWQgZm9yCiAgICAgICAgICogeW91IHRvIHVzZSwgYW5kIHlvdSBoYXZlIGp1c3QgYmVlbiBhc2tlZCB0byBkbyBzb21ldGhpbmcgd2l0aAogICAgICAgICAqIGl0LiAgTm90ZSB0aGF0IGFueXRoaW5nIGRvbmUgaGVyZSBtdXN0IGJlIHJldmVyc2FibGUgaW4gdGhlIFVORE8gY2FzZSAKICAgICAgICAgKi8KICAgICAgICB0bXB2YXIgPSBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsTWF4RmFpbHVyZXM7CiAgICAgICAgaWYgKCgqKChsb25nICopIHZhcl92YWwpKSA+PSAwICYmICgqKChsb25nICopIHZhcl92YWwpKSA8PSAxNSkKICAgICAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bE1heEZhaWx1cmVzID0gKigobG9uZyAqKSB2YXJfdmFsKTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxNYXhGYWlsdXJlcyA9IDE7CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgVU5ETzoKICAgICAgICAvKgogICAgICAgICAqIEJhY2sgb3V0IGFueSBjaGFuZ2VzIG1hZGUgaW4gdGhlIEFDVElPTiBjYXNlIAogICAgICAgICAqLwogICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxNYXhGYWlsdXJlcyA9IHRtcHZhcjsKICAgICAgICBicmVhazsKCgogICAgY2FzZSBDT01NSVQ6CiAgICAgICAgLyoKICAgICAgICAgKiBUaGluZ3MgYXJlIHdvcmtpbmcgd2VsbCwgc28gaXQncyBub3cgc2FmZSB0byBtYWtlIHRoZSBjaGFuZ2UKICAgICAgICAgKiBwZXJtYW5lbnRseS4gIE1ha2Ugc3VyZSB0aGF0IGFueXRoaW5nIGRvbmUgaGVyZSBjYW4ndCBmYWlsISAKICAgICAgICAgKi8KICAgICAgICBzbm1wX3N0b3JlX25lZWRlZChOVUxMKTsKICAgICAgICBicmVhazsKICAgIH0KICAgIHJldHVybiBTTk1QX0VSUl9OT0VSUk9SOwp9CgoKCgoKaW50CndyaXRlX3RyYWNlUm91dGVDdGxEb250RnJhZ21lbnQoaW50IGFjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiB2YXJfdmFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciB2YXJfdmFsX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHZhcl92YWxfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHN0YXRQLCBvaWQgKiBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBuYW1lX2xlbikKewogICAgc3RhdGljIHNpemVfdCAgIHRtcHZhcjsKICAgIHN0cnVjdCB0cmFjZVJvdXRlQ3RsVGFibGVfZGF0YSAqU3RvcmFnZVRtcCA9IE5VTEw7CiAgICBzaXplX3QgICAgICAgICAgbmV3bGVuID0KICAgICAgICBuYW1lX2xlbiAtCiAgICAgICAgKHNpemVvZih0cmFjZVJvdXRlQ3RsVGFibGVfdmFyaWFibGVzX29pZCkgLyBzaXplb2Yob2lkKSArIDMgLSAxKTsKCiAgICBpZiAoKFN0b3JhZ2VUbXAgPQogICAgICAgICBoZWFkZXJfY29tcGxleCh0cmFjZVJvdXRlQ3RsVGFibGVTdG9yYWdlLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAmbmFtZVtzaXplb2YodHJhY2VSb3V0ZUN0bFRhYmxlX3ZhcmlhYmxlc19vaWQpIC8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9pZCkgKyAzIC0gMV0sICZuZXdsZW4sIDEsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKSA9PSBOVUxMKQogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1NVQ0hOQU1FOyAgICAgLyogcmVtb3ZlIGlmIHlvdSBzdXBwb3J0IGNyZWF0aW9uIGhlcmUgKi8KCiAgICBpZiAoU3RvcmFnZVRtcCAmJiBTdG9yYWdlVG1wLT5zdG9yYWdlVHlwZSA9PSBTVF9SRUFET05MWSkgewogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1RXUklUQUJMRTsKICAgIH0KCiAgICBpZiAoU3RvcmFnZVRtcCAmJiBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsUm93U3RhdHVzID09IFJTX0FDVElWRSkgewogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1RXUklUQUJMRTsKICAgIH0KICAgIHN3aXRjaCAoYWN0aW9uKSB7CiAgICBjYXNlIFJFU0VSVkUxOgogICAgICAgIGlmICh2YXJfdmFsX3R5cGUgIT0gQVNOX0lOVEVHRVIpIHsKICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwKICAgICAgICAgICAgICAgICAgICAgIndyaXRlIHRvIHRyYWNlUm91dGVDdGxNYXhSb3dzIG5vdCBBU05fSU5URUdFUlxuIik7CiAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9XUk9OR1RZUEU7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIFJFU0VSVkUyOgogICAgICAgIC8qCiAgICAgICAgICogbWVtb3J5IHJlc2V2ZXJhdGlvbiwgZmluYWwgcHJlcGFyYXRpb24uLi4gCiAgICAgICAgICovCiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgRlJFRToKICAgICAgICAvKgogICAgICAgICAqIFJlbGVhc2UgYW55IHJlc291cmNlcyB0aGF0IGhhdmUgYmVlbiBhbGxvY2F0ZWQgCiAgICAgICAgICovCiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgQUNUSU9OOgogICAgICAgIC8qCiAgICAgICAgICogVGhlIHZhcmlhYmxlIGhhcyBiZWVuIHN0b3JlZCBpbiBvYmppZCBmb3IKICAgICAgICAgKiB5b3UgdG8gdXNlLCBhbmQgeW91IGhhdmUganVzdCBiZWVuIGFza2VkIHRvIGRvIHNvbWV0aGluZyB3aXRoCiAgICAgICAgICogaXQuICBOb3RlIHRoYXQgYW55dGhpbmcgZG9uZSBoZXJlIG11c3QgYmUgcmV2ZXJzYWJsZSBpbiB0aGUgVU5ETyBjYXNlIAogICAgICAgICAqLwogICAgICAgIHRtcHZhciA9IFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxEb250RnJhZ21lbnQ7CiAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bERvbnRGcmFnbWVudCA9ICooKGxvbmcgKikgdmFyX3ZhbCk7CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgVU5ETzoKICAgICAgICAvKgogICAgICAgICAqIEJhY2sgb3V0IGFueSBjaGFuZ2VzIG1hZGUgaW4gdGhlIEFDVElPTiBjYXNlIAogICAgICAgICAqLwogICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxEb250RnJhZ21lbnQgPSB0bXB2YXI7CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgQ09NTUlUOgogICAgICAgIC8qCiAgICAgICAgICogVGhpbmdzIGFyZSB3b3JraW5nIHdlbGwsIHNvIGl0J3Mgbm93IHNhZmUgdG8gbWFrZSB0aGUgY2hhbmdlCiAgICAgICAgICogcGVybWFuZW50bHkuICBNYWtlIHN1cmUgdGhhdCBhbnl0aGluZyBkb25lIGhlcmUgY2FuJ3QgZmFpbCEgCiAgICAgICAgICovCiAgICAgICAgc25tcF9zdG9yZV9uZWVkZWQoTlVMTCk7CiAgICAgICAgYnJlYWs7CiAgICB9CiAgICByZXR1cm4gU05NUF9FUlJfTk9FUlJPUjsKfQoKCgoKaW50CndyaXRlX3RyYWNlUm91dGVDdGxJbml0aWFsVHRsKGludCBhY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHZhcl92YWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciB2YXJfdmFsX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB2YXJfdmFsX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogc3RhdFAsIG9pZCAqIG5hbWUsIHNpemVfdCBuYW1lX2xlbikKewogICAgc3RhdGljIHNpemVfdCAgIHRtcHZhcjsKICAgIHN0cnVjdCB0cmFjZVJvdXRlQ3RsVGFibGVfZGF0YSAqU3RvcmFnZVRtcCA9IE5VTEw7CiAgICBzaXplX3QgICAgICAgICAgbmV3bGVuID0KICAgICAgICBuYW1lX2xlbiAtCiAgICAgICAgKHNpemVvZih0cmFjZVJvdXRlQ3RsVGFibGVfdmFyaWFibGVzX29pZCkgLyBzaXplb2Yob2lkKSArIDMgLSAxKTsKCiAgICBpZiAoKFN0b3JhZ2VUbXAgPQogICAgICAgICBoZWFkZXJfY29tcGxleCh0cmFjZVJvdXRlQ3RsVGFibGVTdG9yYWdlLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAmbmFtZVtzaXplb2YodHJhY2VSb3V0ZUN0bFRhYmxlX3ZhcmlhYmxlc19vaWQpIC8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9pZCkgKyAzIC0gMV0sICZuZXdsZW4sIDEsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKSA9PSBOVUxMKQogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1NVQ0hOQU1FOyAgICAgLyogcmVtb3ZlIGlmIHlvdSBzdXBwb3J0IGNyZWF0aW9uIGhlcmUgKi8KCiAgICBpZiAoU3RvcmFnZVRtcCAmJiBTdG9yYWdlVG1wLT5zdG9yYWdlVHlwZSA9PSBTVF9SRUFET05MWSkgewogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1RXUklUQUJMRTsKICAgIH0KCiAgICBpZiAoU3RvcmFnZVRtcCAmJiBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsUm93U3RhdHVzID09IFJTX0FDVElWRSkgewogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1RXUklUQUJMRTsKICAgIH0KICAgIHN3aXRjaCAoYWN0aW9uKSB7CiAgICBjYXNlIFJFU0VSVkUxOgogICAgICAgIGlmICh2YXJfdmFsX3R5cGUgIT0gQVNOX1VOU0lHTkVEKSB7CiAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsCiAgICAgICAgICAgICAgICAgICAgICJ3cml0ZSB0byB0cmFjZVJvdXRlQ3RsVHJhcFRlc3RGYWlsdXJlRmlsdGVyIG5vdCBBU05fVU5TSUdORURcbiIpOwogICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfV1JPTkdUWVBFOwogICAgICAgIH0KICAgICAgICBicmVhazsKCgogICAgY2FzZSBSRVNFUlZFMjoKICAgICAgICAvKgogICAgICAgICAqIG1lbW9yeSByZXNldmVyYXRpb24sIGZpbmFsIHByZXBhcmF0aW9uLi4uIAogICAgICAgICAqLwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIEZSRUU6CiAgICAgICAgLyoKICAgICAgICAgKiBSZWxlYXNlIGFueSByZXNvdXJjZXMgdGhhdCBoYXZlIGJlZW4gYWxsb2NhdGVkIAogICAgICAgICAqLwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIEFDVElPTjoKICAgICAgICAvKgogICAgICAgICAqIFRoZSB2YXJpYWJsZSBoYXMgYmVlbiBzdG9yZWQgaW4gb2JqaWQgZm9yCiAgICAgICAgICogeW91IHRvIHVzZSwgYW5kIHlvdSBoYXZlIGp1c3QgYmVlbiBhc2tlZCB0byBkbyBzb21ldGhpbmcgd2l0aAogICAgICAgICAqIGl0LiAgTm90ZSB0aGF0IGFueXRoaW5nIGRvbmUgaGVyZSBtdXN0IGJlIHJldmVyc2FibGUgaW4gdGhlIFVORE8gY2FzZSAKICAgICAgICAgKi8KICAgICAgICB0bXB2YXIgPSBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsSW5pdGlhbFR0bDsKICAgICAgICBpZiAoKCooKGxvbmcgKikgdmFyX3ZhbCkpID49IDAgJiYgKCooKGxvbmcgKikgdmFyX3ZhbCkpIDw9IDI1NSkKICAgICAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bEluaXRpYWxUdGwgPSAqKChsb25nICopIHZhcl92YWwpOwogICAgICAgIGVsc2UKICAgICAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bEluaXRpYWxUdGwgPSAxOwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIFVORE86CiAgICAgICAgLyoKICAgICAgICAgKiBCYWNrIG91dCBhbnkgY2hhbmdlcyBtYWRlIGluIHRoZSBBQ1RJT04gY2FzZSAKICAgICAgICAgKi8KICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsSW5pdGlhbFR0bCA9IHRtcHZhcjsKICAgICAgICBicmVhazsKCgogICAgY2FzZSBDT01NSVQ6CiAgICAgICAgLyoKICAgICAgICAgKiBUaGluZ3MgYXJlIHdvcmtpbmcgd2VsbCwgc28gaXQncyBub3cgc2FmZSB0byBtYWtlIHRoZSBjaGFuZ2UKICAgICAgICAgKiBwZXJtYW5lbnRseS4gIE1ha2Ugc3VyZSB0aGF0IGFueXRoaW5nIGRvbmUgaGVyZSBjYW4ndCBmYWlsISAKICAgICAgICAgKi8KICAgICAgICBzbm1wX3N0b3JlX25lZWRlZChOVUxMKTsKICAgICAgICBicmVhazsKICAgIH0KICAgIHJldHVybiBTTk1QX0VSUl9OT0VSUk9SOwp9CgoKaW50CndyaXRlX3RyYWNlUm91dGVDdGxGcmVxdWVuY3koaW50IGFjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiB2YXJfdmFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciB2YXJfdmFsX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHZhcl92YWxfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHN0YXRQLCBvaWQgKiBuYW1lLCBzaXplX3QgbmFtZV9sZW4pCnsKICAgIHN0YXRpYyBzaXplX3QgICB0bXB2YXI7CiAgICBzdHJ1Y3QgdHJhY2VSb3V0ZUN0bFRhYmxlX2RhdGEgKlN0b3JhZ2VUbXAgPSBOVUxMOwogICAgc2l6ZV90ICAgICAgICAgIG5ld2xlbiA9CiAgICAgICAgbmFtZV9sZW4gLQogICAgICAgIChzaXplb2YodHJhY2VSb3V0ZUN0bFRhYmxlX3ZhcmlhYmxlc19vaWQpIC8gc2l6ZW9mKG9pZCkgKyAzIC0gMSk7CgogICAgaWYgKChTdG9yYWdlVG1wID0KICAgICAgICAgaGVhZGVyX2NvbXBsZXgodHJhY2VSb3V0ZUN0bFRhYmxlU3RvcmFnZSwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgJm5hbWVbc2l6ZW9mKHRyYWNlUm91dGVDdGxUYWJsZV92YXJpYWJsZXNfb2lkKSAvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihvaWQpICsgMyAtIDFdLCAmbmV3bGVuLCAxLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkgPT0gTlVMTCkKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9TVUNITkFNRTsgICAgIC8qIHJlbW92ZSBpZiB5b3Ugc3VwcG9ydCBjcmVhdGlvbiBoZXJlICovCgogICAgaWYgKFN0b3JhZ2VUbXAgJiYgU3RvcmFnZVRtcC0+c3RvcmFnZVR5cGUgPT0gU1RfUkVBRE9OTFkpIHsKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9UV1JJVEFCTEU7CiAgICB9CgogICAgaWYgKFN0b3JhZ2VUbXAgJiYgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFJvd1N0YXR1cyA9PSBSU19BQ1RJVkUpIHsKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9UV1JJVEFCTEU7CiAgICB9CiAgICBzd2l0Y2ggKGFjdGlvbikgewogICAgY2FzZSBSRVNFUlZFMToKICAgICAgICBpZiAodmFyX3ZhbF90eXBlICE9IEFTTl9VTlNJR05FRCkgewogICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLAogICAgICAgICAgICAgICAgICAgICAid3JpdGUgdG8gdHJhY2VSb3V0ZUN0bFNvdXJjZUFkZHJlc3NUeXBlIG5vdCBBU05fVU5TSUdORURcbiIpOwogICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfV1JPTkdUWVBFOwogICAgICAgIH0KICAgICAgICBicmVhazsKCgogICAgY2FzZSBSRVNFUlZFMjoKICAgICAgICAvKgogICAgICAgICAqIG1lbW9yeSByZXNldmVyYXRpb24sIGZpbmFsIHByZXBhcmF0aW9uLi4uIAogICAgICAgICAqLwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIEZSRUU6CiAgICAgICAgLyoKICAgICAgICAgKiBSZWxlYXNlIGFueSByZXNvdXJjZXMgdGhhdCBoYXZlIGJlZW4gYWxsb2NhdGVkIAogICAgICAgICAqLwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIEFDVElPTjoKICAgICAgICAvKgogICAgICAgICAqIFRoZSB2YXJpYWJsZSBoYXMgYmVlbiBzdG9yZWQgaW4gb2JqaWQgZm9yCiAgICAgICAgICogeW91IHRvIHVzZSwgYW5kIHlvdSBoYXZlIGp1c3QgYmVlbiBhc2tlZCB0byBkbyBzb21ldGhpbmcgd2l0aAogICAgICAgICAqIGl0LiAgTm90ZSB0aGF0IGFueXRoaW5nIGRvbmUgaGVyZSBtdXN0IGJlIHJldmVyc2FibGUgaW4gdGhlIFVORE8gY2FzZSAKICAgICAgICAgKi8KICAgICAgICB0bXB2YXIgPSBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsRnJlcXVlbmN5OwogICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxGcmVxdWVuY3kgPSAqKChsb25nICopIHZhcl92YWwpOwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIFVORE86CiAgICAgICAgLyoKICAgICAgICAgKiBCYWNrIG91dCBhbnkgY2hhbmdlcyBtYWRlIGluIHRoZSBBQ1RJT04gY2FzZSAKICAgICAgICAgKi8KICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsRnJlcXVlbmN5ID0gdG1wdmFyOwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIENPTU1JVDoKICAgICAgICAvKgogICAgICAgICAqIFRoaW5ncyBhcmUgd29ya2luZyB3ZWxsLCBzbyBpdCdzIG5vdyBzYWZlIHRvIG1ha2UgdGhlIGNoYW5nZQogICAgICAgICAqIHBlcm1hbmVudGx5LiAgTWFrZSBzdXJlIHRoYXQgYW55dGhpbmcgZG9uZSBoZXJlIGNhbid0IGZhaWwhIAogICAgICAgICAqLwogICAgICAgIHNubXBfc3RvcmVfbmVlZGVkKE5VTEwpOwogICAgICAgIGJyZWFrOwogICAgfQogICAgcmV0dXJuIFNOTVBfRVJSX05PRVJST1I7Cn0KCgoKCmludAp3cml0ZV90cmFjZVJvdXRlQ3RsU3RvcmFnZVR5cGUoaW50IGFjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHZhcl92YWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgdmFyX3ZhbF90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHZhcl92YWxfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogc3RhdFAsIG9pZCAqIG5hbWUsIHNpemVfdCBuYW1lX2xlbikKewogICAgc3RhdGljIHNpemVfdCAgIHRtcHZhcjsKICAgIGludCAgICAgICAgICAgICBzZXRfdmFsdWU7CiAgICBzdHJ1Y3QgdHJhY2VSb3V0ZUN0bFRhYmxlX2RhdGEgKlN0b3JhZ2VUbXAgPSBOVUxMOwogICAgc2l6ZV90ICAgICAgICAgIG5ld2xlbiA9CiAgICAgICAgbmFtZV9sZW4gLQogICAgICAgIChzaXplb2YodHJhY2VSb3V0ZUN0bFRhYmxlX3ZhcmlhYmxlc19vaWQpIC8gc2l6ZW9mKG9pZCkgKyAzIC0gMSk7CgogICAgaWYgKChTdG9yYWdlVG1wID0KICAgICAgICAgaGVhZGVyX2NvbXBsZXgodHJhY2VSb3V0ZUN0bFRhYmxlU3RvcmFnZSwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgJm5hbWVbc2l6ZW9mKHRyYWNlUm91dGVDdGxUYWJsZV92YXJpYWJsZXNfb2lkKSAvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihvaWQpICsgMyAtIDFdLCAmbmV3bGVuLCAxLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkgPT0gTlVMTCkKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9TVUNITkFNRTsgICAgIC8qIHJlbW92ZSBpZiB5b3Ugc3VwcG9ydCBjcmVhdGlvbiBoZXJlICovCgogICAgaWYgKFN0b3JhZ2VUbXAgJiYgU3RvcmFnZVRtcC0+c3RvcmFnZVR5cGUgPT0gU1RfUkVBRE9OTFkpIHsKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9UV1JJVEFCTEU7CiAgICB9CgogICAgaWYgKFN0b3JhZ2VUbXAgJiYgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFJvd1N0YXR1cyA9PSBSU19BQ1RJVkUpIHsKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9UV1JJVEFCTEU7CiAgICB9CgoKICAgIHNldF92YWx1ZSA9ICooKGxvbmcgKikgdmFyX3ZhbCk7CgogICAgc3dpdGNoIChhY3Rpb24pIHsKICAgIGNhc2UgUkVTRVJWRTE6CiAgICAgICAgaWYgKHZhcl92YWxfdHlwZSAhPSBBU05fSU5URUdFUikgewogICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLAogICAgICAgICAgICAgICAgICAgICAid3JpdGUgdG8gdHJhY2VSb3V0ZUN0bE1heFJvd3Mgbm90IEFTTl9JTlRFR0VSXG4iKTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX1dST05HVFlQRTsKICAgICAgICB9CgogICAgICAgIGlmICgoU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFN0b3JhZ2VUeXBlID09IDIKICAgICAgICAgICAgIHx8IFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxTdG9yYWdlVHlwZSA9PSAzKQogICAgICAgICAgICAmJiAoc2V0X3ZhbHVlID09IDQgfHwgc2V0X3ZhbHVlID09IDUpKSB7CiAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9XUk9OR1ZBTFVFOwogICAgICAgIH0KICAgICAgICBicmVhazsKCiAgICBjYXNlIFJFU0VSVkUyOgogICAgICAgIC8qCiAgICAgICAgICogbWVtb3J5IHJlc2V2ZXJhdGlvbiwgZmluYWwgcHJlcGFyYXRpb24uLi4gCiAgICAgICAgICovCiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgRlJFRToKICAgICAgICAvKgogICAgICAgICAqIFJlbGVhc2UgYW55IHJlc291cmNlcyB0aGF0IGhhdmUgYmVlbiBhbGxvY2F0ZWQgCiAgICAgICAgICovCiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgQUNUSU9OOgogICAgICAgIC8qCiAgICAgICAgICogVGhlIHZhcmlhYmxlIGhhcyBiZWVuIHN0b3JlZCBpbiBvYmppZCBmb3IKICAgICAgICAgKiB5b3UgdG8gdXNlLCBhbmQgeW91IGhhdmUganVzdCBiZWVuIGFza2VkIHRvIGRvIHNvbWV0aGluZyB3aXRoCiAgICAgICAgICogaXQuICBOb3RlIHRoYXQgYW55dGhpbmcgZG9uZSBoZXJlIG11c3QgYmUgcmV2ZXJzYWJsZSBpbiB0aGUgVU5ETyBjYXNlIAogICAgICAgICAqLwogICAgICAgIHRtcHZhciA9IFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxTdG9yYWdlVHlwZTsKICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsU3RvcmFnZVR5cGUgPSAqKChsb25nICopIHZhcl92YWwpOwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIFVORE86CiAgICAgICAgLyoKICAgICAgICAgKiBCYWNrIG91dCBhbnkgY2hhbmdlcyBtYWRlIGluIHRoZSBBQ1RJT04gY2FzZSAKICAgICAgICAgKi8KICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsU3RvcmFnZVR5cGUgPSB0bXB2YXI7CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgQ09NTUlUOgogICAgICAgIC8qCiAgICAgICAgICogVGhpbmdzIGFyZSB3b3JraW5nIHdlbGwsIHNvIGl0J3Mgbm93IHNhZmUgdG8gbWFrZSB0aGUgY2hhbmdlCiAgICAgICAgICogcGVybWFuZW50bHkuICBNYWtlIHN1cmUgdGhhdCBhbnl0aGluZyBkb25lIGhlcmUgY2FuJ3QgZmFpbCEgCiAgICAgICAgICovCiAgICAgICAgc25tcF9zdG9yZV9uZWVkZWQoTlVMTCk7CiAgICAgICAgYnJlYWs7CiAgICB9CiAgICByZXR1cm4gU05NUF9FUlJfTk9FUlJPUjsKfQoKCgppbnQKd3JpdGVfdHJhY2VSb3V0ZUN0bEFkbWluU3RhdHVzKGludCBhY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiB2YXJfdmFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyIHZhcl92YWxfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB2YXJfdmFsX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHN0YXRQLCBvaWQgKiBuYW1lLCBzaXplX3QgbmFtZV9sZW4pCnsKICAgIHN0YXRpYyBzaXplX3QgICB0bXB2YXI7CiAgICBzdHJ1Y3QgdHJhY2VSb3V0ZUN0bFRhYmxlX2RhdGEgKlN0b3JhZ2VUbXAgPSBOVUxMOwogICAgbmV0c25tcF92YXJpYWJsZV9saXN0ICp2YXJzID0gTlVMTDsKICAgIHN0cnVjdCB0cmFjZVJvdXRlUmVzdWx0c1RhYmxlX2RhdGEgKlN0b3JhZ2VOZXcgPSBOVUxMOwogICAgc2l6ZV90ICAgICAgICAgIG5ld2xlbiA9CiAgICAgICAgbmFtZV9sZW4gLQogICAgICAgIChzaXplb2YodHJhY2VSb3V0ZUN0bFRhYmxlX3ZhcmlhYmxlc19vaWQpIC8gc2l6ZW9mKG9pZCkgKyAzIC0gMSk7CgogICAgaWYgKChTdG9yYWdlVG1wID0KICAgICAgICAgaGVhZGVyX2NvbXBsZXgodHJhY2VSb3V0ZUN0bFRhYmxlU3RvcmFnZSwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgJm5hbWVbc2l6ZW9mKHRyYWNlUm91dGVDdGxUYWJsZV92YXJpYWJsZXNfb2lkKSAvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihvaWQpICsgMyAtIDFdLCAmbmV3bGVuLCAxLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkgPT0gTlVMTCkKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9TVUNITkFNRTsgICAgIC8qIHJlbW92ZSBpZiB5b3Ugc3VwcG9ydCBjcmVhdGlvbiBoZXJlICovCgogICAgaWYgKFN0b3JhZ2VUbXAgJiYgU3RvcmFnZVRtcC0+c3RvcmFnZVR5cGUgPT0gU1RfUkVBRE9OTFkpIHsKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9UV1JJVEFCTEU7CiAgICB9CgogICAgc3dpdGNoIChhY3Rpb24pIHsKICAgIGNhc2UgUkVTRVJWRTE6CiAgICAgICAgaWYgKHZhcl92YWxfdHlwZSAhPSBBU05fSU5URUdFUikgewogICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLAogICAgICAgICAgICAgICAgICAgICAid3JpdGUgdG8gdHJhY2VSb3V0ZUN0bElmSW5kZXggbm90IEFTTl9JTlRFR0VSXG4iKTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX1dST05HVFlQRTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgUkVTRVJWRTI6CiAgICAgICAgLyoKICAgICAgICAgKiBtZW1vcnkgcmVzZXZlcmF0aW9uLCBmaW5hbCBwcmVwYXJhdGlvbi4uLiAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBGUkVFOgogICAgICAgIC8qCiAgICAgICAgICogUmVsZWFzZSBhbnkgcmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIGFsbG9jYXRlZCAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBBQ1RJT046CiAgICAgICAgLyoKICAgICAgICAgKiBUaGUgdmFyaWFibGUgaGFzIGJlZW4gc3RvcmVkIGluIG9iamlkIGZvcgogICAgICAgICAqIHlvdSB0byB1c2UsIGFuZCB5b3UgaGF2ZSBqdXN0IGJlZW4gYXNrZWQgdG8gZG8gc29tZXRoaW5nIHdpdGgKICAgICAgICAgKiBpdC4gIE5vdGUgdGhhdCBhbnl0aGluZyBkb25lIGhlcmUgbXVzdCBiZSByZXZlcnNhYmxlIGluIHRoZSBVTkRPIGNhc2UgCiAgICAgICAgICovCiAgICAgICAgdG1wdmFyID0gU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bEFkbWluU3RhdHVzOwogICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxBZG1pblN0YXR1cyA9ICooKGxvbmcgKikgdmFyX3ZhbCk7CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgVU5ETzoKICAgICAgICAvKgogICAgICAgICAqIEJhY2sgb3V0IGFueSBjaGFuZ2VzIG1hZGUgaW4gdGhlIEFDVElPTiBjYXNlIAogICAgICAgICAqLwogICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxBZG1pblN0YXR1cyA9IHRtcHZhcjsKICAgICAgICBicmVhazsKCgogICAgY2FzZSBDT01NSVQ6CiAgICAgICAgLyoKICAgICAgICAgKiBUaGluZ3MgYXJlIHdvcmtpbmcgd2VsbCwgc28gaXQncyBub3cgc2FmZSB0byBtYWtlIHRoZSBjaGFuZ2UKICAgICAgICAgKiBwZXJtYW5lbnRseS4gIE1ha2Ugc3VyZSB0aGF0IGFueXRoaW5nIGRvbmUgaGVyZSBjYW4ndCBmYWlsISAKICAgICAgICAgKi8KCiAgICAgICAgc25tcF92YXJsaXN0X2FkZF92YXJpYWJsZSgmdmFycywgTlVMTCwgMCwgQVNOX09DVEVUX1NUUiwgKGNoYXIgKikgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXgsIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxPd25lckluZGV4TGVuKTsgLyogIHRyYWNlUm91dGVDdGxPd25lckluZGV4ICAqLwogICAgICAgIHNubXBfdmFybGlzdF9hZGRfdmFyaWFibGUoJnZhcnMsIE5VTEwsIDAsIEFTTl9PQ1RFVF9TVFIsIChjaGFyICopIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUZXN0TmFtZSwgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lTGVuKTsgICAgIC8qICB0cmFjZVJvdXRlQ3RsVGVzdE5hbWUgICovCiAgICAgICAgU3RvcmFnZU5ldyA9CiAgICAgICAgICAgIGhlYWRlcl9jb21wbGV4X2dldCh0cmFjZVJvdXRlUmVzdWx0c1RhYmxlU3RvcmFnZSwgdmFycyk7CgogICAgICAgIGlmIChTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsQWRtaW5TdGF0dXMgPT0gMQogICAgICAgICAgICAmJiBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsUm93U3RhdHVzID09IFJTX0FDVElWRSkgewogICAgICAgICAgICBpZiAoU3RvcmFnZU5ldyA9PSBOVUxMKQogICAgICAgICAgICAgICAgaW5pdF90clJlc3VsdHNUYWJsZShTdG9yYWdlVG1wKTsKICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlUmVzdWx0cy0+CiAgICAgICAgICAgICAgICAgICAgdHJhY2VSb3V0ZVJlc3VsdHNPcGVyU3RhdHVzID0gMTsKICAgICAgICAgICAgICAgIG1vZGlmeV90clJlc3VsdHNPcGVyKFN0b3JhZ2VUbXAsIDEpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsRnJlcXVlbmN5ICE9IDApCiAgICAgICAgICAgICAgICBTdG9yYWdlVG1wLT50aW1lcl9pZCA9CiAgICAgICAgICAgICAgICAgICAgc25tcF9hbGFybV9yZWdpc3RlcihTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsRnJlcXVlbmN5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0FfUkVQRUFULCBydW5fdHJhY2VSb3V0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0b3JhZ2VUbXApOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBTdG9yYWdlVG1wLT50aW1lcl9pZCA9IHNubXBfYWxhcm1fcmVnaXN0ZXIoMSwgMCwgcnVuX3RyYWNlUm91dGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RvcmFnZVRtcCk7CgogICAgICAgIH0gZWxzZSBpZiAoU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bEFkbWluU3RhdHVzID09IDIKICAgICAgICAgICAgICAgICAgICYmIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxSb3dTdGF0dXMgPT0gUlNfQUNUSVZFKSB7CiAgICAgICAgICAgIHNubXBfYWxhcm1fdW5yZWdpc3RlcihTdG9yYWdlVG1wLT50aW1lcl9pZCk7CiAgICAgICAgICAgIGlmIChTdG9yYWdlTmV3ID09IE5VTEwpCiAgICAgICAgICAgICAgICBpbml0X3RyUmVzdWx0c1RhYmxlKFN0b3JhZ2VUbXApOwogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVSZXN1bHRzLT4KICAgICAgICAgICAgICAgICAgICB0cmFjZVJvdXRlUmVzdWx0c09wZXJTdGF0dXMgPSAyOwogICAgICAgICAgICAgICAgbW9kaWZ5X3RyUmVzdWx0c09wZXIoU3RvcmFnZVRtcCwgMik7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgc25tcF9zdG9yZV9uZWVkZWQoTlVMTCk7CiAgICAgICAgYnJlYWs7CiAgICB9CiAgICByZXR1cm4gU05NUF9FUlJfTk9FUlJPUjsKfQoKCgoKaW50CndyaXRlX3RyYWNlUm91dGVDdGxEZXNjcihpbnQgYWN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogdmFyX3ZhbCwKICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciB2YXJfdmFsX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgdmFyX3ZhbF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiBzdGF0UCwgb2lkICogbmFtZSwgc2l6ZV90IG5hbWVfbGVuKQp7CiAgICBzdGF0aWMgY2hhciAgICAqdG1wdmFyOwogICAgc3RhdGljIHNpemVfdCAgIHRtcGxlbjsKICAgIHN0cnVjdCB0cmFjZVJvdXRlQ3RsVGFibGVfZGF0YSAqU3RvcmFnZVRtcCA9IE5VTEw7CiAgICBzaXplX3QgICAgICAgICAgbmV3bGVuID0KICAgICAgICBuYW1lX2xlbiAtCiAgICAgICAgKHNpemVvZih0cmFjZVJvdXRlQ3RsVGFibGVfdmFyaWFibGVzX29pZCkgLyBzaXplb2Yob2lkKSArIDMgLSAxKTsKCgogICAgaWYgKChTdG9yYWdlVG1wID0KICAgICAgICAgaGVhZGVyX2NvbXBsZXgodHJhY2VSb3V0ZUN0bFRhYmxlU3RvcmFnZSwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgJm5hbWVbc2l6ZW9mKHRyYWNlUm91dGVDdGxUYWJsZV92YXJpYWJsZXNfb2lkKSAvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihvaWQpICsgMyAtIDFdLCAmbmV3bGVuLCAxLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkgPT0gTlVMTCkKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9TVUNITkFNRTsgICAgIC8qIHJlbW92ZSBpZiB5b3Ugc3VwcG9ydCBjcmVhdGlvbiBoZXJlICovCgogICAgaWYgKFN0b3JhZ2VUbXAgJiYgU3RvcmFnZVRtcC0+c3RvcmFnZVR5cGUgPT0gU1RfUkVBRE9OTFkpIHsKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9UV1JJVEFCTEU7CiAgICB9CgogICAgaWYgKFN0b3JhZ2VUbXAgJiYgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFJvd1N0YXR1cyA9PSBSU19BQ1RJVkUpIHsKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9UV1JJVEFCTEU7CiAgICB9CgogICAgc3dpdGNoIChhY3Rpb24pIHsKICAgIGNhc2UgUkVTRVJWRTE6CiAgICAgICAgaWYgKHZhcl92YWxfdHlwZSAhPSBBU05fT0NURVRfU1RSKSB7CiAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsCiAgICAgICAgICAgICAgICAgICAgICJ3cml0ZSB0byB0cmFjZVJvdXRlQ3RsVGFyZ2V0QWRkcmVzcyBub3QgQVNOX09DVEVUX1NUUlxuIik7CiAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9XUk9OR1RZUEU7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIFJFU0VSVkUyOgogICAgICAgIC8qCiAgICAgICAgICogbWVtb3J5IHJlc2V2ZXJhdGlvbiwgZmluYWwgcHJlcGFyYXRpb24uLi4gCiAgICAgICAgICovCiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgRlJFRToKICAgICAgICAvKgogICAgICAgICAqIFJlbGVhc2UgYW55IHJlc291cmNlcyB0aGF0IGhhdmUgYmVlbiBhbGxvY2F0ZWQgCiAgICAgICAgICovCiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgQUNUSU9OOgogICAgICAgIC8qCiAgICAgICAgICogVGhlIHZhcmlhYmxlIGhhcyBiZWVuIHN0b3JlZCBpbiBsb25nX3JldCBmb3IKICAgICAgICAgKiB5b3UgdG8gdXNlLCBhbmQgeW91IGhhdmUganVzdCBiZWVuIGFza2VkIHRvIGRvIHNvbWV0aGluZyB3aXRoCiAgICAgICAgICogaXQuICBOb3RlIHRoYXQgYW55dGhpbmcgZG9uZSBoZXJlIG11c3QgYmUgcmV2ZXJzYWJsZSBpbiB0aGUgVU5ETyBjYXNlIAogICAgICAgICAqLwogICAgICAgIHRtcHZhciA9IFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxEZXNjcjsKICAgICAgICB0bXBsZW4gPSBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsRGVzY3JMZW47CgogICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxEZXNjciA9IChjaGFyICopIG1hbGxvYyh2YXJfdmFsX2xlbiArIDEpOwogICAgICAgIGlmIChTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsRGVzY3IgPT0gTlVMTCkgewogICAgICAgICAgICBleGl0KDEpOwogICAgICAgIH0KICAgICAgICBtZW1jcHkoU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bERlc2NyLCB2YXJfdmFsLCB2YXJfdmFsX2xlbiArIDEpOwogICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxEZXNjclt2YXJfdmFsX2xlbl0gPSAnXDAnOwogICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxEZXNjckxlbiA9IHZhcl92YWxfbGVuOwoKICAgICAgICBicmVhazsKCgogICAgY2FzZSBVTkRPOgogICAgICAgIC8qCiAgICAgICAgICogQmFjayBvdXQgYW55IGNoYW5nZXMgbWFkZSBpbiB0aGUgQUNUSU9OIGNhc2UgCiAgICAgICAgICovCiAgICAgICAgU05NUF9GUkVFKFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxEZXNjcik7CiAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bERlc2NyID0gdG1wdmFyOwogICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxEZXNjckxlbiA9IHRtcGxlbjsKICAgICAgICBicmVhazsKCgogICAgY2FzZSBDT01NSVQ6CiAgICAgICAgLyoKICAgICAgICAgKiBUaGluZ3MgYXJlIHdvcmtpbmcgd2VsbCwgc28gaXQncyBub3cgc2FmZSB0byBtYWtlIHRoZSBjaGFuZ2UKICAgICAgICAgKiBwZXJtYW5lbnRseS4gIE1ha2Ugc3VyZSB0aGF0IGFueXRoaW5nIGRvbmUgaGVyZSBjYW4ndCBmYWlsISAKICAgICAgICAgKi8KICAgICAgICBTTk1QX0ZSRUUodG1wdmFyKTsKICAgICAgICBzbm1wX3N0b3JlX25lZWRlZChOVUxMKTsKICAgICAgICBicmVhazsKICAgIH0KICAgIHJldHVybiBTTk1QX0VSUl9OT0VSUk9SOwp9CgoKCgoKaW50CndyaXRlX3RyYWNlUm91dGVDdGxNYXhSb3dzKGludCBhY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHZhcl92YWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciB2YXJfdmFsX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB2YXJfdmFsX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogc3RhdFAsIG9pZCAqIG5hbWUsIHNpemVfdCBuYW1lX2xlbikKewogICAgc3RhdGljIHNpemVfdCAgIHRtcHZhcjsKICAgIHN0cnVjdCB0cmFjZVJvdXRlQ3RsVGFibGVfZGF0YSAqU3RvcmFnZVRtcCA9IE5VTEw7CiAgICBzaXplX3QgICAgICAgICAgbmV3bGVuID0KICAgICAgICBuYW1lX2xlbiAtCiAgICAgICAgKHNpemVvZih0cmFjZVJvdXRlQ3RsVGFibGVfdmFyaWFibGVzX29pZCkgLyBzaXplb2Yob2lkKSArIDMgLSAxKTsKCiAgICBpZiAoKFN0b3JhZ2VUbXAgPQogICAgICAgICBoZWFkZXJfY29tcGxleCh0cmFjZVJvdXRlQ3RsVGFibGVTdG9yYWdlLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAmbmFtZVtzaXplb2YodHJhY2VSb3V0ZUN0bFRhYmxlX3ZhcmlhYmxlc19vaWQpIC8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9pZCkgKyAzIC0gMV0sICZuZXdsZW4sIDEsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKSA9PSBOVUxMKQogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1NVQ0hOQU1FOyAgICAgLyogcmVtb3ZlIGlmIHlvdSBzdXBwb3J0IGNyZWF0aW9uIGhlcmUgKi8KCiAgICBpZiAoU3RvcmFnZVRtcCAmJiBTdG9yYWdlVG1wLT5zdG9yYWdlVHlwZSA9PSBTVF9SRUFET05MWSkgewogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1RXUklUQUJMRTsKICAgIH0KCiAgICBpZiAoU3RvcmFnZVRtcCAmJiBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsUm93U3RhdHVzID09IFJTX0FDVElWRSkgewogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1RXUklUQUJMRTsKICAgIH0KICAgIHN3aXRjaCAoYWN0aW9uKSB7CiAgICBjYXNlIFJFU0VSVkUxOgogICAgICAgIGlmICh2YXJfdmFsX3R5cGUgIT0gQVNOX1VOU0lHTkVEKSB7CiAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsCiAgICAgICAgICAgICAgICAgICAgICJ3cml0ZSB0byB0cmFjZVJvdXRlQ3RsRFNGaWVsZCBub3QgQVNOX1VOU0lHTkVEXG4iKTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX1dST05HVFlQRTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgUkVTRVJWRTI6CiAgICAgICAgLyoKICAgICAgICAgKiBtZW1vcnkgcmVzZXZlcmF0aW9uLCBmaW5hbCBwcmVwYXJhdGlvbi4uLiAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBGUkVFOgogICAgICAgIC8qCiAgICAgICAgICogUmVsZWFzZSBhbnkgcmVzb3VyY2VzIHRoYXQgaGF2ZSBiZWVuIGFsbG9jYXRlZCAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKCgogICAgY2FzZSBBQ1RJT046CiAgICAgICAgLyoKICAgICAgICAgKiBUaGUgdmFyaWFibGUgaGFzIGJlZW4gc3RvcmVkIGluIG9iamlkIGZvcgogICAgICAgICAqIHlvdSB0byB1c2UsIGFuZCB5b3UgaGF2ZSBqdXN0IGJlZW4gYXNrZWQgdG8gZG8gc29tZXRoaW5nIHdpdGgKICAgICAgICAgKiBpdC4gIE5vdGUgdGhhdCBhbnl0aGluZyBkb25lIGhlcmUgbXVzdCBiZSByZXZlcnNhYmxlIGluIHRoZSBVTkRPIGNhc2UgCiAgICAgICAgICovCiAgICAgICAgdG1wdmFyID0gU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bE1heFJvd3M7CiAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bE1heFJvd3MgPSAqKChsb25nICopIHZhcl92YWwpOwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIFVORE86CiAgICAgICAgLyoKICAgICAgICAgKiBCYWNrIG91dCBhbnkgY2hhbmdlcyBtYWRlIGluIHRoZSBBQ1RJT04gY2FzZSAKICAgICAgICAgKi8KICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsTWF4Um93cyA9IHRtcHZhcjsKICAgICAgICBicmVhazsKCgogICAgY2FzZSBDT01NSVQ6CiAgICAgICAgLyoKICAgICAgICAgKiBUaGluZ3MgYXJlIHdvcmtpbmcgd2VsbCwgc28gaXQncyBub3cgc2FmZSB0byBtYWtlIHRoZSBjaGFuZ2UKICAgICAgICAgKiBwZXJtYW5lbnRseS4gIE1ha2Ugc3VyZSB0aGF0IGFueXRoaW5nIGRvbmUgaGVyZSBjYW4ndCBmYWlsISAKICAgICAgICAgKi8KICAgICAgICBzbm1wX3N0b3JlX25lZWRlZChOVUxMKTsKICAgICAgICBicmVhazsKICAgIH0KICAgIHJldHVybiBTTk1QX0VSUl9OT0VSUk9SOwp9CgppbnQKd3JpdGVfdHJhY2VSb3V0ZUN0bFRyYXBHZW5lcmF0aW9uKGludCBhY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiB2YXJfdmFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyIHZhcl92YWxfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB2YXJfdmFsX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHN0YXRQLCBvaWQgKiBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG5hbWVfbGVuKQp7CiAgICBzdGF0aWMgY2hhciAgICAqdG1wdmFyOwogICAgc3RhdGljIHNpemVfdCAgIHRtcGxlbjsKICAgIHN0cnVjdCB0cmFjZVJvdXRlQ3RsVGFibGVfZGF0YSAqU3RvcmFnZVRtcCA9IE5VTEw7CiAgICBzaXplX3QgICAgICAgICAgbmV3bGVuID0KICAgICAgICBuYW1lX2xlbiAtCiAgICAgICAgKHNpemVvZih0cmFjZVJvdXRlQ3RsVGFibGVfdmFyaWFibGVzX29pZCkgLyBzaXplb2Yob2lkKSArIDMgLSAxKTsKICAgIGlmICgoU3RvcmFnZVRtcCA9CiAgICAgICAgIGhlYWRlcl9jb21wbGV4KHRyYWNlUm91dGVDdGxUYWJsZVN0b3JhZ2UsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICZuYW1lW3NpemVvZih0cmFjZVJvdXRlQ3RsVGFibGVfdmFyaWFibGVzX29pZCkgLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yob2lkKSArIDMgLSAxXSwgJm5ld2xlbiwgMSwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpID09IE5VTEwpCiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PU1VDSE5BTUU7ICAgICAvKiByZW1vdmUgaWYgeW91IHN1cHBvcnQgY3JlYXRpb24gaGVyZSAqLwoKICAgIGlmIChTdG9yYWdlVG1wICYmIFN0b3JhZ2VUbXAtPnN0b3JhZ2VUeXBlID09IFNUX1JFQURPTkxZKSB7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PVFdSSVRBQkxFOwogICAgfQoKICAgIGlmIChTdG9yYWdlVG1wICYmIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxSb3dTdGF0dXMgPT0gUlNfQUNUSVZFKSB7CiAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PVFdSSVRBQkxFOwogICAgfQoKICAgIHN3aXRjaCAoYWN0aW9uKSB7CiAgICBjYXNlIFJFU0VSVkUxOgogICAgICAgIGlmICh2YXJfdmFsX3R5cGUgIT0gQVNOX09DVEVUX1NUUikgewogICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLAogICAgICAgICAgICAgICAgICAgICAid3JpdGUgdG8gdHJhY2VSb3V0ZUN0bFRhcmdldEFkZHJlc3Mgbm90IEFTTl9PQ1RFVF9TVFJcbiIpOwogICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfV1JPTkdUWVBFOwogICAgICAgIH0KICAgICAgICBicmVhazsKCgogICAgY2FzZSBSRVNFUlZFMjoKICAgICAgICAvKgogICAgICAgICAqIG1lbW9yeSByZXNldmVyYXRpb24sIGZpbmFsIHByZXBhcmF0aW9uLi4uIAogICAgICAgICAqLwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIEZSRUU6CiAgICAgICAgLyoKICAgICAgICAgKiBSZWxlYXNlIGFueSByZXNvdXJjZXMgdGhhdCBoYXZlIGJlZW4gYWxsb2NhdGVkIAogICAgICAgICAqLwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIEFDVElPTjoKICAgICAgICAvKgogICAgICAgICAqIFRoZSB2YXJpYWJsZSBoYXMgYmVlbiBzdG9yZWQgaW4gbG9uZ19yZXQgZm9yCiAgICAgICAgICogeW91IHRvIHVzZSwgYW5kIHlvdSBoYXZlIGp1c3QgYmVlbiBhc2tlZCB0byBkbyBzb21ldGhpbmcgd2l0aAogICAgICAgICAqIGl0LiAgTm90ZSB0aGF0IGFueXRoaW5nIGRvbmUgaGVyZSBtdXN0IGJlIHJldmVyc2FibGUgaW4gdGhlIFVORE8gY2FzZSAKICAgICAgICAgKi8KICAgICAgICB0bXB2YXIgPSBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVHJhcEdlbmVyYXRpb247CiAgICAgICAgdG1wbGVuID0gU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFRyYXBHZW5lcmF0aW9uTGVuOwogICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUcmFwR2VuZXJhdGlvbiA9CiAgICAgICAgICAgIChjaGFyICopIG1hbGxvYyh2YXJfdmFsX2xlbiArIDEpOwogICAgICAgIGlmIChTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVHJhcEdlbmVyYXRpb24gPT0gTlVMTCkgewogICAgICAgICAgICBleGl0KDEpOwogICAgICAgIH0KCiAgICAgICAgbWVtY3B5KFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUcmFwR2VuZXJhdGlvbiwgdmFyX3ZhbCwKICAgICAgICAgICAgICAgdmFyX3ZhbF9sZW4gKyAxKTsKICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVHJhcEdlbmVyYXRpb25bdmFyX3ZhbF9sZW5dID0gJ1wwJzsKICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVHJhcEdlbmVyYXRpb25MZW4gPSB2YXJfdmFsX2xlbjsKCiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgVU5ETzoKICAgICAgICAvKgogICAgICAgICAqIEJhY2sgb3V0IGFueSBjaGFuZ2VzIG1hZGUgaW4gdGhlIEFDVElPTiBjYXNlIAogICAgICAgICAqLwogICAgICAgIFNOTVBfRlJFRShTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVHJhcEdlbmVyYXRpb24pOwogICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUcmFwR2VuZXJhdGlvbiA9IHRtcHZhcjsKICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVHJhcEdlbmVyYXRpb25MZW4gPSB0bXBsZW47CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgQ09NTUlUOgogICAgICAgIC8qCiAgICAgICAgICogVGhpbmdzIGFyZSB3b3JraW5nIHdlbGwsIHNvIGl0J3Mgbm93IHNhZmUgdG8gbWFrZSB0aGUgY2hhbmdlCiAgICAgICAgICogcGVybWFuZW50bHkuICBNYWtlIHN1cmUgdGhhdCBhbnl0aGluZyBkb25lIGhlcmUgY2FuJ3QgZmFpbCEgCiAgICAgICAgICovCiAgICAgICAgU05NUF9GUkVFKHRtcHZhcik7CiAgICAgICAgc25tcF9zdG9yZV9uZWVkZWQoTlVMTCk7CiAgICAgICAgYnJlYWs7CiAgICB9CiAgICByZXR1cm4gU05NUF9FUlJfTk9FUlJPUjsKfQoKaW50CndyaXRlX3RyYWNlUm91dGVDdGxDcmVhdGVIb3BzRW50cmllcyhpbnQgYWN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogdmFyX3ZhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciB2YXJfdmFsX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgdmFyX3ZhbF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiBzdGF0UCwgb2lkICogbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBuYW1lX2xlbikKewogICAgc3RhdGljIHNpemVfdCAgIHRtcHZhcjsKICAgIHN0cnVjdCB0cmFjZVJvdXRlQ3RsVGFibGVfZGF0YSAqU3RvcmFnZVRtcCA9IE5VTEw7CiAgICBzaXplX3QgICAgICAgICAgbmV3bGVuID0KICAgICAgICBuYW1lX2xlbiAtCiAgICAgICAgKHNpemVvZih0cmFjZVJvdXRlQ3RsVGFibGVfdmFyaWFibGVzX29pZCkgLyBzaXplb2Yob2lkKSArIDMgLSAxKTsKCiAgICBpZiAoKFN0b3JhZ2VUbXAgPQogICAgICAgICBoZWFkZXJfY29tcGxleCh0cmFjZVJvdXRlQ3RsVGFibGVTdG9yYWdlLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAmbmFtZVtzaXplb2YodHJhY2VSb3V0ZUN0bFRhYmxlX3ZhcmlhYmxlc19vaWQpIC8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9pZCkgKyAzIC0gMV0sICZuZXdsZW4sIDEsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKSA9PSBOVUxMKQogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1NVQ0hOQU1FOyAgICAgLyogcmVtb3ZlIGlmIHlvdSBzdXBwb3J0IGNyZWF0aW9uIGhlcmUgKi8KCiAgICBpZiAoU3RvcmFnZVRtcCAmJiBTdG9yYWdlVG1wLT5zdG9yYWdlVHlwZSA9PSBTVF9SRUFET05MWSkgewogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1RXUklUQUJMRTsKICAgIH0KCiAgICBpZiAoU3RvcmFnZVRtcCAmJiBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsUm93U3RhdHVzID09IFJTX0FDVElWRSkgewogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1RXUklUQUJMRTsKICAgIH0KICAgIHN3aXRjaCAoYWN0aW9uKSB7CiAgICBjYXNlIFJFU0VSVkUxOgogICAgICAgIGlmICh2YXJfdmFsX3R5cGUgIT0gQVNOX0lOVEVHRVIpIHsKICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwKICAgICAgICAgICAgICAgICAgICAgIndyaXRlIHRvIHRyYWNlUm91dGVDdGxEU0ZpZWxkIG5vdCBBU05fSU5URUdFUlxuIik7CiAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9XUk9OR1RZUEU7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIFJFU0VSVkUyOgogICAgICAgIC8qCiAgICAgICAgICogbWVtb3J5IHJlc2V2ZXJhdGlvbiwgZmluYWwgcHJlcGFyYXRpb24uLi4gCiAgICAgICAgICovCiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgRlJFRToKICAgICAgICAvKgogICAgICAgICAqIFJlbGVhc2UgYW55IHJlc291cmNlcyB0aGF0IGhhdmUgYmVlbiBhbGxvY2F0ZWQgCiAgICAgICAgICovCiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgQUNUSU9OOgogICAgICAgIC8qCiAgICAgICAgICogVGhlIHZhcmlhYmxlIGhhcyBiZWVuIHN0b3JlZCBpbiBvYmppZCBmb3IKICAgICAgICAgKiB5b3UgdG8gdXNlLCBhbmQgeW91IGhhdmUganVzdCBiZWVuIGFza2VkIHRvIGRvIHNvbWV0aGluZyB3aXRoCiAgICAgICAgICogaXQuICBOb3RlIHRoYXQgYW55dGhpbmcgZG9uZSBoZXJlIG11c3QgYmUgcmV2ZXJzYWJsZSBpbiB0aGUgVU5ETyBjYXNlIAogICAgICAgICAqLwogICAgICAgIHRtcHZhciA9IFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxDcmVhdGVIb3BzRW50cmllczsKICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsQ3JlYXRlSG9wc0VudHJpZXMgPSAqKChsb25nICopIHZhcl92YWwpOwogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIFVORE86CiAgICAgICAgLyoKICAgICAgICAgKiBCYWNrIG91dCBhbnkgY2hhbmdlcyBtYWRlIGluIHRoZSBBQ1RJT04gY2FzZSAKICAgICAgICAgKi8KICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsQ3JlYXRlSG9wc0VudHJpZXMgPSB0bXB2YXI7CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgQ09NTUlUOgogICAgICAgIC8qCiAgICAgICAgICogVGhpbmdzIGFyZSB3b3JraW5nIHdlbGwsIHNvIGl0J3Mgbm93IHNhZmUgdG8gbWFrZSB0aGUgY2hhbmdlCiAgICAgICAgICogcGVybWFuZW50bHkuICBNYWtlIHN1cmUgdGhhdCBhbnl0aGluZyBkb25lIGhlcmUgY2FuJ3QgZmFpbCEgCiAgICAgICAgICovCiAgICAgICAgc25tcF9zdG9yZV9uZWVkZWQoTlVMTCk7CiAgICAgICAgYnJlYWs7CiAgICB9CiAgICByZXR1cm4gU05NUF9FUlJfTk9FUlJPUjsKfQoKaW50CndyaXRlX3RyYWNlUm91dGVDdGxUeXBlKGludCBhY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHZhcl92YWwsCiAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciB2YXJfdmFsX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB2YXJfdmFsX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICogc3RhdFAsIG9pZCAqIG5hbWUsIHNpemVfdCBuYW1lX2xlbikKewogICAgc3RhdGljIG9pZCAgICAgKnRtcHZhcjsKICAgIHN0YXRpYyBzaXplX3QgICB0bXBsZW47CiAgICBzdHJ1Y3QgdHJhY2VSb3V0ZUN0bFRhYmxlX2RhdGEgKlN0b3JhZ2VUbXAgPSBOVUxMOwogICAgc2l6ZV90ICAgICAgICAgIG5ld2xlbiA9CiAgICAgICAgbmFtZV9sZW4gLQogICAgICAgIChzaXplb2YodHJhY2VSb3V0ZUN0bFRhYmxlX3ZhcmlhYmxlc19vaWQpIC8gc2l6ZW9mKG9pZCkgKyAzIC0gMSk7CgogICAgaWYgKChTdG9yYWdlVG1wID0KICAgICAgICAgaGVhZGVyX2NvbXBsZXgodHJhY2VSb3V0ZUN0bFRhYmxlU3RvcmFnZSwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgJm5hbWVbc2l6ZW9mKHRyYWNlUm91dGVDdGxUYWJsZV92YXJpYWJsZXNfb2lkKSAvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihvaWQpICsgMyAtIDFdLCAmbmV3bGVuLCAxLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkgPT0gTlVMTCkKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9TVUNITkFNRTsgICAgIC8qIHJlbW92ZSBpZiB5b3Ugc3VwcG9ydCBjcmVhdGlvbiBoZXJlICovCgogICAgaWYgKFN0b3JhZ2VUbXAgJiYgU3RvcmFnZVRtcC0+c3RvcmFnZVR5cGUgPT0gU1RfUkVBRE9OTFkpIHsKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9UV1JJVEFCTEU7CiAgICB9CgogICAgaWYgKFN0b3JhZ2VUbXAgJiYgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFJvd1N0YXR1cyA9PSBSU19BQ1RJVkUpIHsKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9UV1JJVEFCTEU7CiAgICB9CgogICAgc3dpdGNoIChhY3Rpb24pIHsKICAgIGNhc2UgUkVTRVJWRTE6CiAgICAgICAgaWYgKHZhcl92YWxfdHlwZSAhPSBBU05fT0JKRUNUX0lEKSB7CiAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsCiAgICAgICAgICAgICAgICAgICAgICJ3cml0ZSB0byB0cmFjZVJvdXRlQ3RsVHlwZSBub3QgQVNOX09CSkVDVF9JRFxuIik7CiAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9XUk9OR1RZUEU7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwoKCiAgICBjYXNlIFJFU0VSVkUyOgogICAgICAgIC8qCiAgICAgICAgICogbWVtb3J5IHJlc2V2ZXJhdGlvbiwgZmluYWwgcHJlcGFyYXRpb24uLi4gCiAgICAgICAgICovCiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgRlJFRToKICAgICAgICAvKgogICAgICAgICAqIFJlbGVhc2UgYW55IHJlc291cmNlcyB0aGF0IGhhdmUgYmVlbiBhbGxvY2F0ZWQgCiAgICAgICAgICovCiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgQUNUSU9OOgogICAgICAgIC8qCiAgICAgICAgICogVGhlIHZhcmlhYmxlIGhhcyBiZWVuIHN0b3JlZCBpbiBsb25nX3JldCBmb3IKICAgICAgICAgKiB5b3UgdG8gdXNlLCBhbmQgeW91IGhhdmUganVzdCBiZWVuIGFza2VkIHRvIGRvIHNvbWV0aGluZyB3aXRoCiAgICAgICAgICogaXQuICBOb3RlIHRoYXQgYW55dGhpbmcgZG9uZSBoZXJlIG11c3QgYmUgcmV2ZXJzYWJsZSBpbiB0aGUgVU5ETyBjYXNlIAogICAgICAgICAqLwogICAgICAgIHRtcHZhciA9IFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUeXBlOwogICAgICAgIHRtcGxlbiA9IFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUeXBlTGVuOwoKICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVHlwZSA9IChvaWQgKikgbWFsbG9jKHZhcl92YWxfbGVuKTsKICAgICAgICBpZiAoU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFR5cGUgPT0gTlVMTCkgewogICAgICAgICAgICBleGl0KDEpOwogICAgICAgIH0KICAgICAgICBtZW1jcHkoU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFR5cGUsIHZhcl92YWwsIHZhcl92YWxfbGVuKTsKICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVHlwZUxlbiA9IHZhcl92YWxfbGVuIC8gc2l6ZW9mKG9pZCk7CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgVU5ETzoKICAgICAgICAvKgogICAgICAgICAqIEJhY2sgb3V0IGFueSBjaGFuZ2VzIG1hZGUgaW4gdGhlIEFDVElPTiBjYXNlIAogICAgICAgICAqLwogICAgICAgIFNOTVBfRlJFRShTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsVHlwZSk7CiAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFR5cGUgPSB0bXB2YXI7CiAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFR5cGVMZW4gPSB0bXBsZW47CiAgICAgICAgYnJlYWs7CgoKICAgIGNhc2UgQ09NTUlUOgogICAgICAgIC8qCiAgICAgICAgICogVGhpbmdzIGFyZSB3b3JraW5nIHdlbGwsIHNvIGl0J3Mgbm93IHNhZmUgdG8gbWFrZSB0aGUgY2hhbmdlCiAgICAgICAgICogcGVybWFuZW50bHkuICBNYWtlIHN1cmUgdGhhdCBhbnl0aGluZyBkb25lIGhlcmUgY2FuJ3QgZmFpbCEgCiAgICAgICAgICovCiAgICAgICAgU05NUF9GUkVFKHRtcHZhcik7CiAgICAgICAgc25tcF9zdG9yZV9uZWVkZWQoTlVMTCk7CiAgICAgICAgYnJlYWs7CiAgICB9CiAgICByZXR1cm4gU05NUF9FUlJfTk9FUlJPUjsKfQoKaW50CndyaXRlX3RyYWNlUm91dGVDdGxSb3dTdGF0dXMoaW50IGFjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKiB2YXJfdmFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciB2YXJfdmFsX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHZhcl92YWxfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIHN0YXRQLCBvaWQgKiBuYW1lLCBzaXplX3QgbmFtZV9sZW4pCnsKICAgIHN0cnVjdCB0cmFjZVJvdXRlQ3RsVGFibGVfZGF0YSAqU3RvcmFnZVRtcCA9IE5VTEw7CiAgICBzdGF0aWMgc3RydWN0IHRyYWNlUm91dGVDdGxUYWJsZV9kYXRhICpTdG9yYWdlTmV3ID0gTlVMTDsKICAgIHN0YXRpYyBzdHJ1Y3QgdHJhY2VSb3V0ZUN0bFRhYmxlX2RhdGEgKlN0b3JhZ2VEZWwgPSBOVUxMOwogICAgc2l6ZV90ICAgICAgICAgIG5ld2xlbiA9CiAgICAgICAgbmFtZV9sZW4gLQogICAgICAgIChzaXplb2YodHJhY2VSb3V0ZUN0bFRhYmxlX3ZhcmlhYmxlc19vaWQpIC8gc2l6ZW9mKG9pZCkgKyAzIC0gMSk7CiAgICBzdGF0aWMgaW50ICAgICAgb2xkX3ZhbHVlOwogICAgaW50ICAgICAgICAgICAgIHNldF92YWx1ZTsKICAgIHN0YXRpYyBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKnZhcnMgPSBOVUxMOwogICAgc3RydWN0IGhlYWRlcl9jb21wbGV4X2luZGV4ICpoY2lwdHIgPSBOVUxMOwoKICAgIFN0b3JhZ2VUbXAgPQogICAgICAgIGhlYWRlcl9jb21wbGV4KHRyYWNlUm91dGVDdGxUYWJsZVN0b3JhZ2UsIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgJm5hbWVbc2l6ZW9mKHRyYWNlUm91dGVDdGxUYWJsZV92YXJpYWJsZXNfb2lkKSAvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9pZCkgKyAzIC0gMV0sICZuZXdsZW4sIDEsIE5VTEwsIE5VTEwpOwoKICAgIGlmICh2YXJfdmFsX3R5cGUgIT0gQVNOX0lOVEVHRVIgfHwgdmFyX3ZhbCA9PSBOVUxMKSB7CiAgICAgICAgc25tcF9sb2coTE9HX0VSUiwKICAgICAgICAgICAgICAgICAid3JpdGUgdG8gdHJhY2VSb3V0ZUN0bFJvd1N0YXR1cyBub3QgQVNOX0lOVEVHRVJcbiIpOwogICAgICAgIHJldHVybiBTTk1QX0VSUl9XUk9OR1RZUEU7CiAgICB9CiAgICBpZiAoU3RvcmFnZVRtcCAmJiBTdG9yYWdlVG1wLT5zdG9yYWdlVHlwZSA9PSBTVF9SRUFET05MWSkgewogICAgICAgIHJldHVybiBTTk1QX0VSUl9OT1RXUklUQUJMRTsKICAgIH0KCiAgICBzZXRfdmFsdWUgPSAqKChsb25nICopIHZhcl92YWwpOwoKCiAgICAvKgogICAgICogY2hlY2sgbGVnYWwgcmFuZ2UsIGFuZCBub3RSZWFkeSBpcyByZXNlcnZlZCBmb3IgdXMsIG5vdCBhIHVzZXIgCiAgICAgKi8KICAgIGlmIChzZXRfdmFsdWUgPCAxIHx8IHNldF92YWx1ZSA+IDYgfHwgc2V0X3ZhbHVlID09IFJTX05PVFJFQURZKQogICAgICAgIHJldHVybiBTTk1QX0VSUl9JTkNPTlNJU1RFTlRWQUxVRTsKCgogICAgc3dpdGNoIChhY3Rpb24pIHsKICAgIGNhc2UgUkVTRVJWRTE6CiAgICAgICAgLyoKICAgICAgICAgKiBzdGFnZSBvbmU6IHRlc3QgdmFsaWRpdHkgCiAgICAgICAgICovCiAgICAgICAgaWYgKFN0b3JhZ2VUbXAgPT0gTlVMTCkgewogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBjcmVhdGUgdGhlIHJvdyBub3c/IAogICAgICAgICAgICAgKi8KCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIGRpdGNoIGlsbGVnYWwgdmFsdWVzIG5vdyAKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGlmIChzZXRfdmFsdWUgPT0gUlNfQUNUSVZFIHx8IHNldF92YWx1ZSA9PSBSU19OT1RJTlNFUlZJQ0UpIHsKCiAgICAgICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfSU5DT05TSVNURU5UVkFMVUU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIGRlc3Ryb3lpbmcgYSBub24tZXhpc3RlbnQgcm93IGlzIGFjdHVhbGx5IGxlZ2FsIAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgaWYgKHNldF92YWx1ZSA9PSBSU19ERVNUUk9ZKSB7CgogICAgICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PRVJST1I7CiAgICAgICAgICAgIH0KCgogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBpbGxlZ2FsIGNyZWF0aW9uIHZhbHVlcyAKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGlmIChzZXRfdmFsdWUgPT0gUlNfQUNUSVZFIHx8IHNldF92YWx1ZSA9PSBSU19OT1RJTlNFUlZJQ0UpIHsKICAgICAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9JTkNPTlNJU1RFTlRWQUxVRTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIHJvdyBleGlzdHMuICBDaGVjayBmb3IgYSB2YWxpZCBzdGF0ZSBjaGFuZ2UgCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBpZiAoc2V0X3ZhbHVlID09IFJTX0NSRUFURUFOREdPCiAgICAgICAgICAgICAgICB8fCBzZXRfdmFsdWUgPT0gUlNfQ1JFQVRFQU5EV0FJVCkgewogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIGNhbid0IGNyZWF0ZSBhIHJvdyB0aGF0IGV4aXN0cyAKICAgICAgICAgICAgICAgICAqLwoKICAgICAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9JTkNPTlNJU1RFTlRWQUxVRTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogWFhYOiBpbnRlcmFjdGlvbiB3aXRoIHJvdyBzdG9yYWdlIHR5cGUgbmVlZGVkIAogICAgICAgICAgICAgKi8KCiAgICAgICAgICAgIGlmIChTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsUm93U3RhdHVzID09IFJTX0FDVElWRSAmJgogICAgICAgICAgICAgICAgc2V0X3ZhbHVlICE9IFJTX0RFU1RST1kpIHsKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiAiT25jZSBtYWRlIGFjdGl2ZSBhbiBlbnRyeSBtYXkgbm90IGJlIG1vZGlmaWVkIGV4Y2VwdCB0byAKICAgICAgICAgICAgICAgICAqIGRlbGV0ZSBpdC4iICBYWFg6IGRvZXNuJ3QgdGhpcyBpbiBmYWN0IGFwcGx5IHRvIEFMTAogICAgICAgICAgICAgICAgICogY29sdW1ucyBvZiB0aGUgdGFibGUgYW5kIG5vdCBqdXN0IHRoaXMgb25lPyAgCiAgICAgICAgICAgICAgICAgKi8KCiAgICAgICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfSU5DT05TSVNURU5UVkFMVUU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKFN0b3JhZ2VUbXAtPnN0b3JhZ2VUeXBlICE9IFNUX05PTlZPTEFUSUxFKSB7CgogICAgICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX05PVFdSSVRBQkxFOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBicmVhazsKCgoKCiAgICBjYXNlIFJFU0VSVkUyOgogICAgICAgIC8qCiAgICAgICAgICogbWVtb3J5IHJlc2V2ZXJhdGlvbiwgZmluYWwgcHJlcGFyYXRpb24uLi4gCiAgICAgICAgICovCiAgICAgICAgaWYgKFN0b3JhZ2VUbXAgPT0gTlVMTCkgewoKICAgICAgICAgICAgaWYgKHNldF92YWx1ZSA9PSBSU19ERVNUUk9ZKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9FUlJPUjsKICAgICAgICAgICAgfQogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBjcmVhdGlvbiAKICAgICAgICAgICAgICovCgoKICAgICAgICAgICAgc25tcF92YXJsaXN0X2FkZF92YXJpYWJsZSgmdmFycywgTlVMTCwgMCwgQVNOX09DVEVUX1NUUiwgTlVMTCwgMCk7ICAvKiB0cmFjZVJvdXRlQ3RsT3duZXJJbmRleCAqLwogICAgICAgICAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzLCBOVUxMLCAwLCBBU05fT0NURVRfU1RSLCBOVUxMLCAwKTsgIC8qIHRyYWNlUm91dGVDdGxUZXN0TmFtZSAqLwoKICAgICAgICAgICAgaWYgKGhlYWRlcl9jb21wbGV4X3BhcnNlX29pZAogICAgICAgICAgICAgICAgKCYKICAgICAgICAgICAgICAgICAobmFtZQogICAgICAgICAgICAgICAgICBbc2l6ZW9mKHRyYWNlUm91dGVDdGxUYWJsZV92YXJpYWJsZXNfb2lkKSAvIHNpemVvZihvaWQpICsKICAgICAgICAgICAgICAgICAgIDJdKSwgbmV3bGVuLCB2YXJzKSAhPSBTTk1QRVJSX1NVQ0NFU1MpIHsKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiBYWFg6IGZyZWUsIHplcm8gdmFycyAKICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX0lOQ09OU0lTVEVOVE5BTUU7CiAgICAgICAgICAgIH0KCgogICAgICAgICAgICBTdG9yYWdlTmV3ID0gY3JlYXRlX3RyYWNlUm91dGVDdGxUYWJsZV9kYXRhKCk7CiAgICAgICAgICAgIGlmICh2YXJzLT52YWxfbGVuIDw9IDMyKSB7CiAgICAgICAgICAgICAgICBTdG9yYWdlTmV3LT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleCA9CiAgICAgICAgICAgICAgICAgICAgbWFsbG9jKHZhcnMtPnZhbF9sZW4gKyAxKTsKICAgICAgICAgICAgICAgIG1lbWNweShTdG9yYWdlTmV3LT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleCwKICAgICAgICAgICAgICAgICAgICAgICB2YXJzLT52YWwuc3RyaW5nLCB2YXJzLT52YWxfbGVuKTsKICAgICAgICAgICAgICAgIFN0b3JhZ2VOZXctPnRyYWNlUm91dGVDdGxPd25lckluZGV4W3ZhcnMtPnZhbF9sZW5dID0gJ1wwJzsKICAgICAgICAgICAgICAgIFN0b3JhZ2VOZXctPnRyYWNlUm91dGVDdGxPd25lckluZGV4TGVuID0gdmFycy0+dmFsX2xlbjsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIFN0b3JhZ2VOZXctPnRyYWNlUm91dGVDdGxPd25lckluZGV4ID0gbWFsbG9jKDMzKTsKICAgICAgICAgICAgICAgIG1lbWNweShTdG9yYWdlTmV3LT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleCwKICAgICAgICAgICAgICAgICAgICAgICB2YXJzLT52YWwuc3RyaW5nLCAzMik7CiAgICAgICAgICAgICAgICBTdG9yYWdlTmV3LT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleFszMl0gPSAnXDAnOwogICAgICAgICAgICAgICAgU3RvcmFnZU5ldy0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXhMZW4gPSAzMjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFycyA9IHZhcnMtPm5leHRfdmFyaWFibGU7CgogICAgICAgICAgICBpZiAodmFycy0+dmFsX2xlbiA8PSAzMikgewogICAgICAgICAgICAgICAgU3RvcmFnZU5ldy0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lID0KICAgICAgICAgICAgICAgICAgICBtYWxsb2ModmFycy0+dmFsX2xlbiArIDEpOwogICAgICAgICAgICAgICAgbWVtY3B5KFN0b3JhZ2VOZXctPnRyYWNlUm91dGVDdGxUZXN0TmFtZSwgdmFycy0+dmFsLnN0cmluZywKICAgICAgICAgICAgICAgICAgICAgICB2YXJzLT52YWxfbGVuKTsKICAgICAgICAgICAgICAgIFN0b3JhZ2VOZXctPnRyYWNlUm91dGVDdGxUZXN0TmFtZVt2YXJzLT52YWxfbGVuXSA9ICdcMCc7CiAgICAgICAgICAgICAgICBTdG9yYWdlTmV3LT50cmFjZVJvdXRlQ3RsVGVzdE5hbWVMZW4gPSB2YXJzLT52YWxfbGVuOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgU3RvcmFnZU5ldy0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lID0gbWFsbG9jKDMzKTsKICAgICAgICAgICAgICAgIG1lbWNweShTdG9yYWdlTmV3LT50cmFjZVJvdXRlQ3RsVGVzdE5hbWUsIHZhcnMtPnZhbC5zdHJpbmcsCiAgICAgICAgICAgICAgICAgICAgICAgMzIpOwogICAgICAgICAgICAgICAgU3RvcmFnZU5ldy0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lWzMyXSA9ICdcMCc7CiAgICAgICAgICAgICAgICBTdG9yYWdlTmV3LT50cmFjZVJvdXRlQ3RsVGVzdE5hbWVMZW4gPSAzMjsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXJzID0gdmFycy0+bmV4dF92YXJpYWJsZTsKCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIFhYWDogZmlsbCBpbiBkZWZhdWx0IHJvdyB2YWx1ZXMgaGVyZSBpbnRvIFN0b3JhZ2VOZXcgCiAgICAgICAgICAgICAqLwoKICAgICAgICAgICAgU3RvcmFnZU5ldy0+dHJhY2VSb3V0ZUN0bFJvd1N0YXR1cyA9IHNldF92YWx1ZTsKCgogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBYWFg6IGZyZWUsIHplcm8gdmFycywgbm8gbG9uZ2VyIG5lZWRlZD8gCiAgICAgICAgICAgICAqLwogICAgICAgIH0KICAgICAgICBzbm1wX2ZyZWVfdmFyYmluZCh2YXJzKTsKICAgICAgICB2YXJzID0gTlVMTDsKICAgICAgICBicmVhazsKCiAgICBjYXNlIEZSRUU6CiAgICAgICAgLyoKICAgICAgICAgKiBYWFg6IGZyZWUsIHplcm8gdmFycyAKICAgICAgICAgKi8KICAgICAgICBzbm1wX2ZyZWVfdmFyYmluZCh2YXJzKTsKICAgICAgICB2YXJzID0gTlVMTDsKICAgICAgICAvKgogICAgICAgICAqIFJlbGVhc2UgYW55IHJlc291cmNlcyB0aGF0IGhhdmUgYmVlbiBhbGxvY2F0ZWQgCiAgICAgICAgICovCiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBBQ1RJT046CiAgICAgICAgLyoKICAgICAgICAgKiBUaGUgdmFyaWFibGUgaGFzIGJlZW4gc3RvcmVkIGluIHNldF92YWx1ZSBmb3IgeW91IHRvCiAgICAgICAgICogdXNlLCBhbmQgeW91IGhhdmUganVzdCBiZWVuIGFza2VkIHRvIGRvIHNvbWV0aGluZyB3aXRoCiAgICAgICAgICogaXQuICBOb3RlIHRoYXQgYW55dGhpbmcgZG9uZSBoZXJlIG11c3QgYmUgcmV2ZXJzYWJsZSBpbgogICAgICAgICAqIHRoZSBVTkRPIGNhc2UgCiAgICAgICAgICovCgogICAgICAgIGlmIChTdG9yYWdlVG1wID09IE5VTEwpIHsKICAgICAgICAgICAgaWYgKHNldF92YWx1ZSA9PSBSU19ERVNUUk9ZKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9FUlJPUjsKICAgICAgICAgICAgfQogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiByb3cgY3JlYXRpb24sIHNvIGFkZCBpdCAKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGlmIChTdG9yYWdlTmV3ICE9IE5VTEwpIHsKI2lmIDEKICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlQ3RsVGFibGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIndyaXRlX3RyYWNlUm91dGVDdGxSb3dTdGF0dXMgZW50ZXJpbmcgbmV3PSVkLi4uICBcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb24pKTsKI2VuZGlmCiAgICAgICAgICAgICAgICB0cmFjZVJvdXRlQ3RsVGFibGVfYWRkKFN0b3JhZ2VOZXcpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBYWFg6IGFjaywgYW5kIGlmIGl0IGlzIE5VTEw/IAogICAgICAgICAgICAgKi8KICAgICAgICB9IGVsc2UgaWYgKHNldF92YWx1ZSAhPSBSU19ERVNUUk9ZKSB7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIHNldCB0aGUgZmxhZz8gCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBvbGRfdmFsdWUgPSBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsUm93U3RhdHVzOwogICAgICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsUm93U3RhdHVzID0gKigobG9uZyAqKSB2YXJfdmFsKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBkZXN0cm95Li4uICBleHRyYWN0IGl0IGZvciBub3cgCiAgICAgICAgICAgICAqLwoKICAgICAgICAgICAgaGNpcHRyID0KICAgICAgICAgICAgICAgIGhlYWRlcl9jb21wbGV4X2ZpbmRfZW50cnkodHJhY2VSb3V0ZUN0bFRhYmxlU3RvcmFnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RvcmFnZVRtcCk7CiAgICAgICAgICAgIFN0b3JhZ2VEZWwgPQogICAgICAgICAgICAgICAgaGVhZGVyX2NvbXBsZXhfZXh0cmFjdF9lbnRyeSgmdHJhY2VSb3V0ZUN0bFRhYmxlU3RvcmFnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGNpcHRyKTsKICAgICAgICAgICAgc25tcF9hbGFybV91bnJlZ2lzdGVyKFN0b3JhZ2VEZWwtPnRpbWVyX2lkKTsKCiAgICAgICAgICAgIHRyYWNlUm91dGVSZXN1bHRzVGFibGVfZGVsKFN0b3JhZ2VUbXApOwogICAgICAgICAgICB0cmFjZVJvdXRlUHJvYmVIaXN0b3J5VGFibGVfZGVsKFN0b3JhZ2VUbXApOwogICAgICAgICAgICB0cmFjZVJvdXRlSG9wc1RhYmxlX2RlbChTdG9yYWdlVG1wKTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CgoKCgogICAgY2FzZSBVTkRPOgogICAgICAgIC8qCiAgICAgICAgICogQmFjayBvdXQgYW55IGNoYW5nZXMgbWFkZSBpbiB0aGUgQUNUSU9OIGNhc2UgCiAgICAgICAgICovCiAgICAgICAgaWYgKFN0b3JhZ2VUbXAgPT0gTlVMTCkgewogICAgICAgICAgICBpZiAoc2V0X3ZhbHVlID09IFJTX0RFU1RST1kpIHsKICAgICAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9OT0VSUk9SOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIHJvdyBjcmVhdGlvbiwgc28gcmVtb3ZlIGl0IGFnYWluIAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgaGNpcHRyID0KICAgICAgICAgICAgICAgIGhlYWRlcl9jb21wbGV4X2ZpbmRfZW50cnkodHJhY2VSb3V0ZUN0bFRhYmxlU3RvcmFnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RvcmFnZVRtcCk7CiAgICAgICAgICAgIFN0b3JhZ2VEZWwgPQogICAgICAgICAgICAgICAgaGVhZGVyX2NvbXBsZXhfZXh0cmFjdF9lbnRyeSgmdHJhY2VSb3V0ZUN0bFRhYmxlU3RvcmFnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGNpcHRyKTsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogWFhYOiBmcmVlIGl0IAogICAgICAgICAgICAgKi8KICAgICAgICB9IGVsc2UgaWYgKFN0b3JhZ2VEZWwgIT0gTlVMTCkgewogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiByb3cgZGVsZXRpb24sIHNvIGFkZCBpdCBhZ2FpbiAKICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRyYWNlUm91dGVDdGxUYWJsZV9hZGQoU3RvcmFnZURlbCk7CiAgICAgICAgICAgIHRyYWNlUm91dGVSZXN1bHRzVGFibGVfYWRkKFN0b3JhZ2VEZWwpOwogICAgICAgICAgICB0cmFjZVJvdXRlUHJvYmVIaXN0b3J5VGFibGVfYWRkYWxsKFN0b3JhZ2VEZWwpOwogICAgICAgICAgICB0cmFjZVJvdXRlSG9wc1RhYmxlX2FkZGFsbChTdG9yYWdlRGVsKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsUm93U3RhdHVzID0gb2xkX3ZhbHVlOwogICAgICAgIH0KICAgICAgICBicmVhazsKCgoKCiAgICBjYXNlIENPTU1JVDoKICAgICAgICAvKgogICAgICAgICAqIFRoaW5ncyBhcmUgd29ya2luZyB3ZWxsLCBzbyBpdCdzIG5vdyBzYWZlIHRvIG1ha2UgdGhlIGNoYW5nZQogICAgICAgICAqIHBlcm1hbmVudGx5LiAgTWFrZSBzdXJlIHRoYXQgYW55dGhpbmcgZG9uZSBoZXJlIGNhbid0IGZhaWwhIAogICAgICAgICAqLwogICAgICAgIGlmIChTdG9yYWdlVG1wID09IE5VTEwpIHsKICAgICAgICAgICAgaWYgKHNldF92YWx1ZSA9PSBSU19ERVNUUk9ZKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9FUlJPUjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoU3RvcmFnZURlbCAhPSBOVUxMKSB7CiAgICAgICAgICAgIGZyZWUoU3RvcmFnZURlbC0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXgpOwogICAgICAgICAgICBTdG9yYWdlRGVsLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleCA9IE5VTEw7CiAgICAgICAgICAgIGZyZWUoU3RvcmFnZURlbC0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lKTsKICAgICAgICAgICAgU3RvcmFnZURlbC0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lID0gTlVMTDsKICAgICAgICAgICAgZnJlZShTdG9yYWdlRGVsLT50cmFjZVJvdXRlQ3RsVGFyZ2V0QWRkcmVzcyk7CiAgICAgICAgICAgIFN0b3JhZ2VEZWwtPnRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzID0gTlVMTDsKICAgICAgICAgICAgZnJlZShTdG9yYWdlRGVsLT50cmFjZVJvdXRlQ3RsU291cmNlQWRkcmVzcyk7CiAgICAgICAgICAgIFN0b3JhZ2VEZWwtPnRyYWNlUm91dGVDdGxTb3VyY2VBZGRyZXNzID0gTlVMTDsKICAgICAgICAgICAgZnJlZShTdG9yYWdlRGVsLT50cmFjZVJvdXRlQ3RsTWlzY09wdGlvbnMpOwogICAgICAgICAgICBTdG9yYWdlRGVsLT50cmFjZVJvdXRlQ3RsTWlzY09wdGlvbnMgPSBOVUxMOwogICAgICAgICAgICBmcmVlKFN0b3JhZ2VEZWwtPnRyYWNlUm91dGVDdGxEZXNjcik7CiAgICAgICAgICAgIFN0b3JhZ2VEZWwtPnRyYWNlUm91dGVDdGxEZXNjciA9IE5VTEw7CiAgICAgICAgICAgIGZyZWUoU3RvcmFnZURlbC0+dHJhY2VSb3V0ZUN0bFRyYXBHZW5lcmF0aW9uKTsKICAgICAgICAgICAgU3RvcmFnZURlbC0+dHJhY2VSb3V0ZUN0bFRyYXBHZW5lcmF0aW9uID0gTlVMTDsKICAgICAgICAgICAgZnJlZShTdG9yYWdlRGVsLT50cmFjZVJvdXRlQ3RsVHlwZSk7CiAgICAgICAgICAgIFN0b3JhZ2VEZWwtPnRyYWNlUm91dGVDdGxUeXBlID0gTlVMTDsKICAgICAgICAgICAgZnJlZShTdG9yYWdlRGVsKTsKICAgICAgICAgICAgU3RvcmFnZURlbCA9IE5VTEw7CgogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBYWFg6IGZyZWUgaXQsIGl0cyBkZWFkIAogICAgICAgICAgICAgKi8KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAoU3RvcmFnZVRtcAogICAgICAgICAgICAgICAgJiYgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFJvd1N0YXR1cyA9PSBSU19DUkVBVEVBTkRHTykgewogICAgICAgICAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFJvd1N0YXR1cyA9IFJTX0FDVElWRTsKICAgICAgICAgICAgfSBlbHNlIGlmIChTdG9yYWdlVG1wICYmCiAgICAgICAgICAgICAgICAgICAgICAgU3RvcmFnZVRtcC0+dHJhY2VSb3V0ZUN0bFJvd1N0YXR1cyA9PQogICAgICAgICAgICAgICAgICAgICAgIFJTX0NSRUFURUFORFdBSVQpIHsKCiAgICAgICAgICAgICAgICBTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsUm93U3RhdHVzID0gUlNfTk9USU5TRVJWSUNFOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChTdG9yYWdlVG1wICYmIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxSb3dTdGF0dXMgPT0gUlNfQUNUSVZFKSB7CiNpZiAxCiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlQ3RsVGFibGUiLAogICAgICAgICAgICAgICAgICAgICAgICAid3JpdGVfdHJhY2VSb3V0ZUN0bFJvd1N0YXR1cyBlbnRlcmluZyBydW5iZWZvcmU9JWxkLi4uICBcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzVHlwZSkpOwoKI2VuZGlmCiAgICAgICAgICAgIGlmIChTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsQWRtaW5TdGF0dXMgPT0gMSkgewogICAgICAgICAgICAgICAgaW5pdF90clJlc3VsdHNUYWJsZShTdG9yYWdlVG1wKTsKICAgICAgICAgICAgICAgIGlmIChTdG9yYWdlVG1wLT50cmFjZVJvdXRlQ3RsRnJlcXVlbmN5ICE9IDApCiAgICAgICAgICAgICAgICAgICAgU3RvcmFnZVRtcC0+dGltZXJfaWQgPQogICAgICAgICAgICAgICAgICAgICAgICBzbm1wX2FsYXJtX3JlZ2lzdGVyKFN0b3JhZ2VUbXAtPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlUm91dGVDdGxGcmVxdWVuY3ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0FfUkVQRUFULCBydW5fdHJhY2VSb3V0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdG9yYWdlVG1wKTsKICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICBTdG9yYWdlVG1wLT50aW1lcl9pZCA9CiAgICAgICAgICAgICAgICAgICAgICAgIHNubXBfYWxhcm1fcmVnaXN0ZXIoMSwgMCwgcnVuX3RyYWNlUm91dGUsIFN0b3JhZ2VUbXApOwoKICAgICAgICAgICAgfQoKICAgICAgICB9CiAgICAgICAgc25tcF9zdG9yZV9uZWVkZWQoTlVMTCk7CiAgICAgICAgYnJlYWs7CiAgICB9CiAgICByZXR1cm4gU05NUF9FUlJfTk9FUlJPUjsKfQoKCnZvaWQKcnVuX3RyYWNlUm91dGUodW5zaWduZWQgaW50IGNsaWVudHJlZywgdm9pZCAqY2xpZW50YXJnKQp7CiAgICBzdHJ1Y3QgdHJhY2VSb3V0ZUN0bFRhYmxlX2RhdGEgKml0ZW0gPSBjbGllbnRhcmc7CiAgICB1X3Nob3J0ICAgICAgICAgcG9ydCA9IGl0ZW0tPnRyYWNlUm91dGVDdGxQb3J0OyAgICAgLyogc3RhcnQgdWRwIGRlc3QgcG9ydCAjIGZvciBwcm9iZSBwYWNrZXRzIM/gtbHT2mN0bHBvcnQgKi8KICAgIGludCAgICAgICAgICAgICB3YWl0dGltZSA9IGl0ZW0tPnRyYWNlUm91dGVDdGxUaW1lT3V0OyAgICAgIC8qIHRpbWUgdG8gd2FpdCBmb3IgcmVzcG9uc2UgKGluIHNlY29uZHMpIM/gtcjT2mN0bHRpbWVvdXQgKi8KICAgIGludCAgICAgICAgICAgICBucHJvYmVzID0gaXRlbS0+dHJhY2VSb3V0ZUN0bFByb2Jlc1BlckhvcDsKCiAgICBpZiAoaXRlbS0+dHJhY2VSb3V0ZUN0bEluaXRpYWxUdGwgPiBpdGVtLT50cmFjZVJvdXRlQ3RsTWF4VHRsKSB7CiAgICAgICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVDdGxUYWJsZSIsCiAgICAgICAgICAgICAgICAgICAgImZpcnN0IHR0bCAoJWx1KSBtYXkgbm90IGJlIGdyZWF0ZXIgdGhhbiBtYXggdHRsICglbHUpXG4iLAogICAgICAgICAgICAgICAgICAgIGl0ZW0tPnRyYWNlUm91dGVDdGxJbml0aWFsVHRsLAogICAgICAgICAgICAgICAgICAgIGl0ZW0tPnRyYWNlUm91dGVDdGxNYXhUdGwpKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgY2hhciAgICAgICAgICAgKm9sZF9Ib3BzQWRkcmVzc1syNTVdOwogICAgaW50ICAgICAgICAgICAgIGNvdW50ID0gMDsKICAgIGludCAgICAgICAgICAgICBmbGFnID0gMDsKCiAgICBpZiAoaXRlbS0+dHJhY2VSb3V0ZUN0bFRhcmdldEFkZHJlc3NUeXBlID09IDEKICAgICAgICB8fCBpdGVtLT50cmFjZVJvdXRlQ3RsVGFyZ2V0QWRkcmVzc1R5cGUgPT0gMTYpIHsKICAgICAgICByZWdpc3RlciBpbnQgICAgY29kZSwgbjsKICAgICAgICBjb25zdCAgICBjaGFyICAqY3A7CiAgICAgICAgcmVnaXN0ZXIgY29uc3QgY2hhciAqZXJyOwogICAgICAgIHJlZ2lzdGVyIHVfY2hhciAqb3V0cDsKICAgICAgICByZWdpc3RlciB1X2ludDMyX3QgKmFwOwogICAgICAgIHN0cnVjdCBzb2NrYWRkciB3aGVyZXRvOyAgICAgICAgLyogV2hvIHRvIHRyeSB0byByZWFjaCAqLwogICAgICAgIHN0cnVjdCBzb2NrYWRkciB3aGVyZWZyb207ICAgICAgLyogV2hvIHdlIGFyZSAqLwoKICAgICAgICByZWdpc3RlciBzdHJ1Y3Qgc29ja2FkZHJfaW4gKmZyb20gPQogICAgICAgICAgICAoc3RydWN0IHNvY2thZGRyX2luICopICZ3aGVyZWZyb207CiAgICAgICAgcmVnaXN0ZXIgc3RydWN0IHNvY2thZGRyX2luICp0byA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikgJndoZXJldG87CiAgICAgICAgcmVnaXN0ZXIgc3RydWN0IGhvc3RpbmZvICpoaTsKICAgICAgICBpbnQgICAgICAgICAgICAgb24gPSAxOwogICAgICAgIHJlZ2lzdGVyIHN0cnVjdCBwcm90b2VudCAqcGU7CiAgICAgICAgcmVnaXN0ZXIgaW50ICAgIHR0bCwgcHJvYmUsIGk7CiAgICAgICAgcmVnaXN0ZXIgaW50ICAgIHNlcSA9IDA7CiAgICAgICAgaW50ICAgICAgICAgICAgIHRvcyA9IDAsIHNldHRvcyA9IDA7CiAgICAgICAgcmVnaXN0ZXIgaW50ICAgIGxzcnIgPSAwOwogICAgICAgIHJlZ2lzdGVyIHVfc2hvcnQgb2ZmID0gMDsKICAgICAgICBzdHJ1Y3QgaWZhZGRybGlzdCAqYWw7CiAgICAgICAgY2hhciAgICAgICAgICAgIGVycmJ1ZlsxMzJdOwogICAgICAgIGludCAgICAgICAgICAgICBtaW5wYWNrZXQgPSAwOyAgLyogbWluIGlwIHBhY2tldCBzaXplICovCgoKICAgICAgICBzdHJ1Y3QgaXAgICAgICAqb3V0aXA7ICAvKiBsYXN0IG91dHB1dCAodWRwKSBwYWNrZXQgKi8KICAgICAgICBzdHJ1Y3QgdWRwaGRyICAqb3V0dWRwOyAvKiBsYXN0IG91dHB1dCAodWRwKSBwYWNrZXQgKi8KICAgICAgICBpbnQgICAgICAgICAgICAgcGFja2xlbiA9IDA7ICAgIC8qIHRvdGFsIGxlbmd0aCBvZiBwYWNrZXQgKi8KICAgICAgICBpbnQgICAgICAgICAgICAgb3B0bGVuID0gMDsgICAgIC8qIGxlbmd0aCBvZiBpcCBvcHRpb25zICovCiAgICAgICAgaW50ICAgICAgICAgICAgIG9wdGlvbnMgPSAwOyAgICAvKiBzb2NrZXQgb3B0aW9ucyAqLwogICAgICAgIGludCAgICAgICAgICAgICBzOyAgICAgIC8qIHJlY2VpdmUgKGljbXApIHNvY2tldCBmaWxlIGRlc2NyaXB0b3IgKi8KICAgICAgICBpbnQgICAgICAgICAgICAgc25kc29jazsgICAgICAgIC8qIHNlbmQgKHVkcC9pY21wKSBzb2NrZXQgZmlsZSBkZXNjcmlwdG9yICovCgogICAgICAgIHVfc2hvcnQgICAgICAgICBpZGVudDsKICAgICAgICAvKgogICAgICAgICAqIGxvb3NlIHNvdXJjZSByb3V0ZSBnYXRld2F5IGxpc3QgKGluY2x1ZGluZyByb29tIGZvciBmaW5hbCBkZXN0aW5hdGlvbikgCiAgICAgICAgICovCiAgICAgICAgdV9pbnQzMl90ICAgICAgIGd3bGlzdFtOR0FURVdBWVMgKyAxXTsKICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBkZXZudWxsW10gPSAiL2Rldi9udWxsIjsKICAgICAgICBjaGFyICAgICAgICAgICAqZGV2aWNlID0gTlVMTDsKICAgICAgICBjaGFyICAgICAgICAgICAqc291cmNlID0gTlVMTDsKICAgICAgICBjaGFyICAgICAgICAgICAqaG9zdG5hbWU7CiAgICAgICAgdV9pbnQgICAgICAgICAgIHBhdXNlbXNlY3MgPSAwOwogICAgICAgIHVfY2hhciAgICAgICAgICBwYWNrZXRbNTEyXTsgICAgLyogbGFzdCBpbmJvdW5kIChpY21wKSBwYWNrZXQgKi8KCiAgICAgICAgaW50ICAgICAgICAgICAgIHBtdHUgPSAwOyAgICAgICAvKiBQYXRoIE1UVSBEaXNjb3ZlcnkgKFJGQzExOTEpICovCgogICAgICAgIHN0cnVjdCBvdXRkYXRhICpvdXRkYXRhOyAgICAgICAgLyogbGFzdCBvdXRwdXQgKHVkcCkgcGFja2V0ICovCgogICAgICAgIG1pbnBhY2tldCA9IHNpemVvZigqb3V0aXApICsgc2l6ZW9mKCpvdXRkYXRhKSArIG9wdGxlbjsKICAgICAgICBtaW5wYWNrZXQgKz0gc2l6ZW9mKCpvdXR1ZHApOwogICAgICAgIHBhY2tsZW4gPSBtaW5wYWNrZXQ7ICAgIC8qIG1pbmltdW0gc2l6ZWQgcGFja2V0ICovCgogICAgICAgIGhvc3RuYW1lID0KICAgICAgICAgICAgKGNoYXIgKikgbWFsbG9jKGl0ZW0tPnRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzTGVuICsgMSk7CiAgICAgICAgaWYgKGhvc3RuYW1lID09IE5VTEwpCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICBtZW1jcHkoaG9zdG5hbWUsIGl0ZW0tPnRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzLAogICAgICAgICAgICAgICBpdGVtLT50cmFjZVJvdXRlQ3RsVGFyZ2V0QWRkcmVzc0xlbiArIDEpOwogICAgICAgIGhvc3RuYW1lW2l0ZW0tPnRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzTGVuXSA9ICdcMCc7CgogICAgICAgIGhpID0gZ2V0aG9zdGluZm8oaG9zdG5hbWUpOwogICAgICAgIHNldHNpbih0bywgaGktPmFkZHJzWzBdKTsKICAgICAgICBpZiAoaGktPm4gPiAxKQogICAgICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZUN0bFRhYmxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgIldhcm5pbmc6ICVzIGhhcyBtdWx0aXBsZSBhZGRyZXNzZXM7IHVzaW5nICVzXG4iLAogICAgICAgICAgICAgICAgICAgICAgICBob3N0bmFtZSwgaW5ldF9udG9hKHRvLT5zaW5fYWRkcikpKTsKICAgICAgICBob3N0bmFtZSA9IGhpLT5uYW1lOwogICAgICAgIGhpLT5uYW1lID0gTlVMTDsKICAgICAgICBmcmVlaG9zdGluZm8oaGkpOwoKCiAgICAgICAgbmV0c25tcF9zZXRfbGluZV9idWZmZXJpbmcoc3Rkb3V0KTsKCiAgICAgICAgb3V0aXAgPSAoc3RydWN0IGlwICopIG1hbGxvYyhwYWNrbGVuKTsKICAgICAgICBpZiAob3V0aXAgPT0gTlVMTCkgewogICAgICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZUN0bFRhYmxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgIm1hbGxvYzogJXNcbiIsIHN0cmVycm9yKGVycm5vKSkpOwogICAgICAgICAgICBleGl0KDEpOwogICAgICAgIH0KICAgICAgICBtZW1zZXQoKGNoYXIgKikgb3V0aXAsIDAsIHBhY2tsZW4pOwoKICAgICAgICBvdXRpcC0+aXBfdiA9IElQVkVSU0lPTjsKICAgICAgICBpZiAoc2V0dG9zKQogICAgICAgICAgICBvdXRpcC0+aXBfdG9zID0gdG9zOwojaWZkZWYgQllURVNXQVBfSVBfSERSCiAgICAgICAgb3V0aXAtPmlwX2xlbiA9IGh0b25zKHBhY2tsZW4pOwogICAgICAgIG91dGlwLT5pcF9vZmYgPSBodG9ucyhvZmYpOwojZWxzZQogICAgICAgIG91dGlwLT5pcF9sZW4gPSBwYWNrbGVuOwogICAgICAgIG91dGlwLT5pcF9vZmYgPSBvZmY7CiNlbmRpZgogICAgICAgIG91dHAgPSAodV9jaGFyICopIChvdXRpcCArIDEpOwojaWZkZWYgSEFWRV9SQVdfT1BUSU9OUwogICAgICAgIGlmIChsc3JyID4gMCkgewogICAgICAgICAgICByZWdpc3RlciB1X2NoYXIgKm9wdGxpc3Q7CgogICAgICAgICAgICBvcHRsaXN0ID0gb3V0cDsKICAgICAgICAgICAgb3V0cCArPSBvcHRsZW47CgogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBmaW5hbCBob3AgCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnd2xpc3RbbHNycl0gPSB0by0+c2luX2FkZHIuc19hZGRyOwoKICAgICAgICAgICAgb3V0aXAtPmlwX2RzdC5zX2FkZHIgPSBnd2xpc3RbMF07CgogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBmb3JjZSA0IGJ5dGUgYWxpZ25tZW50IAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgb3B0bGlzdFswXSA9IElQT1BUX05PUDsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogbG9vc2Ugc291cmNlIHJvdXRlIG9wdGlvbiAKICAgICAgICAgICAgICovCiAgICAgICAgICAgIG9wdGxpc3RbMV0gPSBJUE9QVF9MU1JSOwogICAgICAgICAgICBpID0gbHNyciAqIHNpemVvZihnd2xpc3RbMF0pOwogICAgICAgICAgICBvcHRsaXN0WzJdID0gaSArIDM7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIFBvaW50ZXIgdG8gTFNSUiBhZGRyZXNzZXMgCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBvcHRsaXN0WzNdID0gSVBPUFRfTUlOT0ZGOwogICAgICAgICAgICBtZW1jcHkob3B0bGlzdCArIDQsIGd3bGlzdCArIDEsIGkpOwogICAgICAgIH0gZWxzZQojZW5kaWYKICAgICAgICAgICAgb3V0aXAtPmlwX2RzdCA9IHRvLT5zaW5fYWRkcjsKICAgICAgICBvdXRpcC0+aXBfaGwgPSAob3V0cCAtICh1X2NoYXIgKikgb3V0aXApID4+IDI7CiAgICAgICAgaWRlbnQgPSAoZ2V0cGlkKCkgJiAweGZmZmYpIHwgMHg4MDAwOwoKICAgICAgICBvdXRpcC0+aXBfcCA9IElQUFJPVE9fVURQOwoKICAgICAgICBvdXR1ZHAgPSAoc3RydWN0IHVkcGhkciAqKSBvdXRwOwogICAgICAgIG91dHVkcC0+c291cmNlID0gaHRvbnMoaWRlbnQpOwogICAgICAgIG91dHVkcC0+bGVuID0KICAgICAgICAgICAgaHRvbnMoKHVfc2hvcnQpIChwYWNrbGVuIC0gKHNpemVvZigqb3V0aXApICsgb3B0bGVuKSkpOwogICAgICAgIG91dGRhdGEgPSAoc3RydWN0IG91dGRhdGEgKikgKG91dHVkcCArIDEpOwoKICAgICAgICBjcCA9ICJpY21wIjsKICAgICAgICBpZiAoKHBlID0gZ2V0cHJvdG9ieW5hbWUoY3ApKSA9PSBOVUxMKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlQ3RsVGFibGUiLAogICAgICAgICAgICAgICAgICAgICAgICAidW5rbm93biBwcm90b2NvbCAlc1xuIiwgY3ApKTsKICAgICAgICAgICAgZXhpdCgxKTsKICAgICAgICB9CgogICAgICAgIC8qCiAgICAgICAgICogSW5zdXJlIHRoZSBzb2NrZXQgZmRzIHdvbid0IGJlIDAsIDEgb3IgMiAKICAgICAgICAgKi8KICAgICAgICBpZiAob3BlbihkZXZudWxsLCBPX1JET05MWSkgPCAwIHx8CiAgICAgICAgICAgIG9wZW4oZGV2bnVsbCwgT19SRE9OTFkpIDwgMCB8fCBvcGVuKGRldm51bGwsIE9fUkRPTkxZKSA8IDApIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVDdGxUYWJsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJvcGVuIFwiJXNcIjogJXNcbiIsIGRldm51bGwsIHN0cmVycm9yKGVycm5vKSkpOwogICAgICAgICAgICBleGl0KDEpOwogICAgICAgIH0KICAgICAgICBpZiAoKHMgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19SQVcsIHBlLT5wX3Byb3RvKSkgPCAwKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlQ3RsVGFibGUiLAogICAgICAgICAgICAgICAgICAgICAgICAiaWNtcCBzb2NrZXQ6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpKTsKICAgICAgICAgICAgZXhpdCgxKTsKICAgICAgICB9CiAgICAgICAgaWYgKG9wdGlvbnMgJiBTT19ERUJVRykKICAgICAgICAgICAgKHZvaWQpIHNldHNvY2tvcHQocywgU09MX1NPQ0tFVCwgU09fREVCVUcsIChjaGFyICopICZvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9uKSk7CiAgICAgICAgaWYgKG9wdGlvbnMgJiBTT19ET05UUk9VVEUpCiAgICAgICAgICAgICh2b2lkKSBzZXRzb2Nrb3B0KHMsIFNPTF9TT0NLRVQsIFNPX0RPTlRST1VURSwgKGNoYXIgKikgJm9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yob24pKTsKI2lmbmRlZiBfX2hwdXgKICAgICAgICBwcmludGYoInJhd1xuIik7CiAgICAgICAgc25kc29jayA9IHNvY2tldChBRl9JTkVULCBTT0NLX1JBVywgSVBQUk9UT19SQVcpOwojZWxzZQogICAgICAgIHByaW50ZigidWRwXG4iKTsKICAgICAgICBzbmRzb2NrID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfUkFXLCBJUFBST1RPX1VEUCk7CiNlbmRpZgogICAgICAgIGlmIChzbmRzb2NrIDwgMCkgewogICAgICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZUN0bFRhYmxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgInJhdyBzb2NrZXQ6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpKTsKICAgICAgICAgICAgZXhpdCgxKTsKICAgICAgICB9CiNpZiBkZWZpbmVkKElQX09QVElPTlMpICYmICFkZWZpbmVkKEhBVkVfUkFXX09QVElPTlMpCiAgICAgICAgaWYgKGxzcnIgPiAwKSB7CiAgICAgICAgICAgIHVfY2hhciAgICAgICAgICBvcHRsaXN0W01BWF9JUE9QVExFTl07CgogICAgICAgICAgICBjcCA9ICJpcCI7CiAgICAgICAgICAgIGlmICgocGUgPSBnZXRwcm90b2J5bmFtZShjcCkpID09IE5VTEwpIHsKICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlQ3RsVGFibGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInVua25vd24gcHJvdG9jb2wgJXNcbiIsIGNwKSk7CiAgICAgICAgICAgICAgICBleGl0KDEpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIGZpbmFsIGhvcCAKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGd3bGlzdFtsc3JyXSA9IHRvLT5zaW5fYWRkci5zX2FkZHI7CiAgICAgICAgICAgICsrbHNycjsKCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIGZvcmNlIDQgYnl0ZSBhbGlnbm1lbnQgCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBvcHRsaXN0WzBdID0gSVBPUFRfTk9QOwogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBsb29zZSBzb3VyY2Ugcm91dGUgb3B0aW9uIAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgb3B0bGlzdFsxXSA9IElQT1BUX0xTUlI7CiAgICAgICAgICAgIGkgPSBsc3JyICogc2l6ZW9mKGd3bGlzdFswXSk7CiAgICAgICAgICAgIG9wdGxpc3RbMl0gPSBpICsgMzsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogUG9pbnRlciB0byBMU1JSIGFkZHJlc3NlcyAKICAgICAgICAgICAgICovCiAgICAgICAgICAgIG9wdGxpc3RbM10gPSBJUE9QVF9NSU5PRkY7CiAgICAgICAgICAgIG1lbWNweShvcHRsaXN0ICsgNCwgZ3dsaXN0LCBpKTsKCiAgICAgICAgICAgIGlmICgoc2V0c29ja29wdChzbmRzb2NrLCBwZS0+cF9wcm90bywgSVBfT1BUSU9OUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopIG9wdGxpc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpICsgc2l6ZW9mKGd3bGlzdFswXSkpKSA8IDApIHsKICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlQ3RsVGFibGUiLCAiSVBfT1BUSU9OUzogJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcihlcnJubykpKTsKICAgICAgICAgICAgICAgIGV4aXQoMSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiNlbmRpZgojaWZkZWYgU09fU05EQlVGCiAgICAgICAgaWYgKHNldHNvY2tvcHQoc25kc29jaywgU09MX1NPQ0tFVCwgU09fU05EQlVGLCAoY2hhciAqKSAmcGFja2xlbiwKICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YocGFja2xlbikpIDwgMCkgewogICAgICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZUN0bFRhYmxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgIlNPX1NOREJVRjogJXNcbiIsIHN0cmVycm9yKGVycm5vKSkpOwogICAgICAgICAgICBleGl0KDEpOwogICAgICAgIH0KI2VuZGlmCiNpZmRlZiBJUF9IRFJJTkNMCiAgICAgICAgaWYgKHNldHNvY2tvcHQoc25kc29jaywgSVBQUk9UT19JUCwgSVBfSERSSU5DTCwgKGNoYXIgKikgJm9uLAogICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihvbikpIDwgMCkgewogICAgICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZUN0bFRhYmxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgIklQX0hEUklOQ0w6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpKTsKICAgICAgICAgICAgZXhpdCgxKTsKICAgICAgICB9CiNlbHNlCiNpZmRlZiBJUF9UT1MKICAgICAgICBpZiAoc2V0dG9zICYmIHNldHNvY2tvcHQoc25kc29jaywgSVBQUk9UT19JUCwgSVBfVE9TLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKSAmdG9zLCBzaXplb2YodG9zKSkgPCAwKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlQ3RsVGFibGUiLAogICAgICAgICAgICAgICAgICAgICAgICAic2V0c29ja29wdCB0b3MgJWQ6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpKTsKICAgICAgICAgICAgZXhpdCgxKTsKICAgICAgICB9CiNlbmRpZgojZW5kaWYKICAgICAgICBpZiAob3B0aW9ucyAmIFNPX0RFQlVHKQogICAgICAgICAgICAodm9pZCkgc2V0c29ja29wdChzbmRzb2NrLCBTT0xfU09DS0VULCBTT19ERUJVRywgKGNoYXIgKikgJm9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yob24pKTsKICAgICAgICBpZiAob3B0aW9ucyAmIFNPX0RPTlRST1VURSkKICAgICAgICAgICAgKHZvaWQpIHNldHNvY2tvcHQoc25kc29jaywgU09MX1NPQ0tFVCwgU09fRE9OVFJPVVRFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKSAmb24sIHNpemVvZihvbikpOwogICAgICAgIC8qCiAgICAgICAgICogR2V0IHRoZSBpbnRlcmZhY2UgYWRkcmVzcyBsaXN0IAogICAgICAgICAqLwogICAgICAgIG4gPSBpZmFkZHJsaXN0KCZhbCwgZXJyYnVmKTsKICAgICAgICBpZiAobiA8IDApIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVDdGxUYWJsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICIgaWZhZGRybGlzdDogJXNcbiIsIGVycmJ1ZikpOwogICAgICAgICAgICBleGl0KDEpOwogICAgICAgIH0KICAgICAgICBpZiAobiA9PSAwKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlQ3RsVGFibGUiLAogICAgICAgICAgICAgICAgICAgICAgICAiIENhbid0IGZpbmQgYW55IG5ldHdvcmsgaW50ZXJmYWNlc1xuIikpOwoKICAgICAgICAgICAgZXhpdCgxKTsKICAgICAgICB9CgogICAgICAgIC8qCiAgICAgICAgICogTG9vayBmb3IgYSBzcGVjaWZpYyBkZXZpY2UgCiAgICAgICAgICovCiAgICAgICAgaWYgKGRldmljZSAhPSBOVUxMKSB7CiAgICAgICAgICAgIGZvciAoaSA9IG47IGkgPiAwOyAtLWksICsrYWwpCiAgICAgICAgICAgICAgICBpZiAoc3RyY21wKGRldmljZSwgYWwtPmRldmljZSkgPT0gMCkKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgaWYgKGkgPD0gMCkgewogICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVDdGxUYWJsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIENhbid0IGZpbmQgaW50ZXJmYWNlICUuMzJzXG4iLCBkZXZpY2UpKTsKCiAgICAgICAgICAgICAgICBleGl0KDEpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qCiAgICAgICAgICogRGV0ZXJtaW5lIG91ciBzb3VyY2UgYWRkcmVzcyAKICAgICAgICAgKi8KICAgICAgICBpZiAoc291cmNlID09IE5VTEwpIHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogSWYgYSBkZXZpY2Ugd2FzIHNwZWNpZmllZCwgdXNlIHRoZSBpbnRlcmZhY2UgYWRkcmVzcy4KICAgICAgICAgICAgICogT3RoZXJ3aXNlLCB0cnkgdG8gZGV0ZXJtaW5lIG91ciBzb3VyY2UgYWRkcmVzcy4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGlmIChkZXZpY2UgIT0gTlVMTCkKICAgICAgICAgICAgICAgIHNldHNpbihmcm9tLCBhbC0+YWRkcik7CiAgICAgICAgICAgIGVsc2UgaWYgKChlcnIgPSBmaW5kc2FkZHIodG8sIGZyb20pKSAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZUN0bFRhYmxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgZmluZHNhZGRyOiAlc1xuIiwgZXJyKSk7CiAgICAgICAgICAgICAgICBleGl0KDEpOwogICAgICAgICAgICB9CgogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGhpID0gZ2V0aG9zdGluZm8oc291cmNlKTsKICAgICAgICAgICAgc291cmNlID0gaGktPm5hbWU7CiAgICAgICAgICAgIGhpLT5uYW1lID0gTlVMTDsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogSWYgdGhlIGRldmljZSB3YXMgc3BlY2lmaWVkIG1ha2Ugc3VyZSBpdAogICAgICAgICAgICAgKiBjb3JyZXNwb25kcyB0byB0aGUgc291cmNlIGFkZHJlc3Mgc3BlY2lmaWVkLgogICAgICAgICAgICAgKiBPdGhlcndpc2UsIHVzZSB0aGUgZmlyc3QgYWRkcmVzcyAoYW5kIHdhcm4gaWYKICAgICAgICAgICAgICogdGhlcmUgYXJlIG1vcmUgdGhhbiBvbmUpLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgaWYgKGRldmljZSAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICBmb3IgKGkgPSBoaS0+biwgYXAgPSBoaS0+YWRkcnM7IGkgPiAwOyAtLWksICsrYXApCiAgICAgICAgICAgICAgICAgICAgaWYgKCphcCA9PSBhbC0+YWRkcikKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBpZiAoaSA8PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVDdGxUYWJsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAlcyBpcyBub3Qgb24gaW50ZXJmYWNlICUuMzJzXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZSwgZGV2aWNlKSk7CgogICAgICAgICAgICAgICAgICAgIGV4aXQoMSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBzZXRzaW4oZnJvbSwgKmFwKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHNldHNpbihmcm9tLCBoaS0+YWRkcnNbMF0pOwogICAgICAgICAgICAgICAgaWYgKGhpLT5uID4gMSkKICAgICAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZUN0bFRhYmxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIFdhcm5pbmc6ICVzIGhhcyBtdWx0aXBsZSBhZGRyZXNzZXM7IHVzaW5nICVzXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZSwgaW5ldF9udG9hKGZyb20tPnNpbl9hZGRyKSkpOwoKICAgICAgICAgICAgfQogICAgICAgICAgICBmcmVlaG9zdGluZm8oaGkpOwogICAgICAgIH0KICAgICAgICAvKgogICAgICAgICAqIFJldmVydCB0byBub24tcHJpdmlsZWdlZCB1c2VyIGFmdGVyIG9wZW5pbmcgc29ja2V0cyAKICAgICAgICAgKi8KICAgICAgICBzZXRnaWQoZ2V0Z2lkKCkpOwogICAgICAgIHNldHVpZChnZXR1aWQoKSk7CgogICAgICAgIG91dGlwLT5pcF9zcmMgPSBmcm9tLT5zaW5fYWRkcjsKI2lmbmRlZiBJUF9IRFJJTkNMCiAgICAgICAgaWYgKGJpbmQoc25kc29jaywgKHN0cnVjdCBzb2NrYWRkciAqKSBmcm9tLCBzaXplb2YoKmZyb20pKSA8IDApIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVDdGxUYWJsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICIgYmluZDogJXNcbiIsIHN0cmVycm9yKGVycm5vKSkpOwogICAgICAgICAgICBleGl0KDEpOwogICAgICAgIH0KI2VuZGlmCiAgICAgICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVDdGxUYWJsZSIsCiAgICAgICAgICAgICAgICAgICAgIiB0byAlcyAoJXMpIiwgaG9zdG5hbWUsIGluZXRfbnRvYSh0by0+c2luX2FkZHIpKSk7CgogICAgICAgIGlmIChzb3VyY2UpCiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlQ3RsVGFibGUiLCAiIGZyb20gJXMiLCBzb3VyY2UpKTsKCiAgICAgICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVDdGxUYWJsZSIsCiAgICAgICAgICAgICAgICAgICAgIiwgJWx1IGhvcHMgbWF4LCAlZCBieXRlIHBhY2tldHNcbiIsCiAgICAgICAgICAgICAgICAgICAgaXRlbS0+dHJhY2VSb3V0ZUN0bE1heFR0bCwgcGFja2xlbikpOwogICAgICAgICh2b2lkKSBmZmx1c2goc3RkZXJyKTsKCiAgICAgICAgc3RydWN0IHRyYWNlUm91dGVSZXN1bHRzVGFibGVfZGF0YSAqU3RvcmFnZVJlc3VsdHMgPSBOVUxMOwogICAgICAgIG5ldHNubXBfdmFyaWFibGVfbGlzdCAqdmFyc19yZXN1bHRzID0gTlVMTDsKCiAgICAgICAgc3RydWN0IHRyYWNlUm91dGVIb3BzVGFibGVfZGF0YSAqdGVtcCA9IE5VTEw7CiAgICAgICAgc3RydWN0IHRyYWNlUm91dGVIb3BzVGFibGVfZGF0YSAqY3VycmVudF90ZW1wID0gTlVMTDsKICAgICAgICBzdHJ1Y3QgdHJhY2VSb3V0ZUhvcHNUYWJsZV9kYXRhICpjdXJyZW50ID0gTlVMTDsKCiAgICAgICAgdW5zaWduZWQgbG9uZyAgIGluZGV4ID0gMDsKCiAgICAgICAgc3RydWN0IHRyYWNlUm91dGVQcm9iZUhpc3RvcnlUYWJsZV9kYXRhICp0ZW1wX2hpcyA9IE5VTEw7CiAgICAgICAgc3RydWN0IHRyYWNlUm91dGVQcm9iZUhpc3RvcnlUYWJsZV9kYXRhICpjdXJyZW50X3RlbXBfaGlzID0gTlVMTDsKCiAgICAgICAgc25tcF92YXJsaXN0X2FkZF92YXJpYWJsZSgmdmFyc19yZXN1bHRzLCBOVUxMLCAwLCBBU05fT0NURVRfU1RSLCAoY2hhciAqKSBpdGVtLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleCwgaXRlbS0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXhMZW4pOyAgICAgLyogIHRyYWNlUm91dGVDdGxPd25lckluZGV4ICAqLwogICAgICAgIHNubXBfdmFybGlzdF9hZGRfdmFyaWFibGUoJnZhcnNfcmVzdWx0cywgTlVMTCwgMCwgQVNOX09DVEVUX1NUUiwgKGNoYXIgKikgaXRlbS0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lLCBpdGVtLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWVMZW4pOyAvKiAgdHJhY2VSb3V0ZUN0bFRlc3ROYW1lICAqLwogICAgICAgIGlmICgoU3RvcmFnZVJlc3VsdHMgPQogICAgICAgICAgICAgaGVhZGVyX2NvbXBsZXhfZ2V0KHRyYWNlUm91dGVSZXN1bHRzVGFibGVTdG9yYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcnNfcmVzdWx0cykpID09IE5VTEwpCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICBzbm1wX2ZyZWVfdmFyYmluZCh2YXJzX3Jlc3VsdHMpOwogICAgICAgIHZhcnNfcmVzdWx0cyA9IE5VTEw7CgoKICAgICAgICBmb3IgKHR0bCA9IGl0ZW0tPnRyYWNlUm91dGVDdGxJbml0aWFsVHRsOwogICAgICAgICAgICAgdHRsIDw9IGl0ZW0tPnRyYWNlUm91dGVDdGxNYXhUdGw7ICsrdHRsKSB7CgogICAgICAgICAgICB1X2ludDMyX3QgICAgICAgbGFzdGFkZHIgPSAwOwogICAgICAgICAgICBpbnQgICAgICAgICAgICAgZ290bGFzdGFkZHIgPSAwOwogICAgICAgICAgICBpbnQgICAgICAgICAgICAgZ290X3RoZXJlID0gMDsKICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHVucmVhY2hhYmxlID0gMDsKICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlbnRmaXJzdCA9IDA7CiAgICAgICAgICAgIHRpbWVfdCAgICAgICAgICB0aW1lcCA9IDA7CgogICAgICAgICAgICBTdG9yYWdlUmVzdWx0cy0+dHJhY2VSb3V0ZVJlc3VsdHNDdXJIb3BDb3VudCA9IHR0bDsKICAgICAgICAgICAgaWYgKGl0ZW0tPnRyYWNlUm91dGVDdGxDcmVhdGVIb3BzRW50cmllcyA9PSAxKSB7CiAgICAgICAgICAgICAgICBpZiAodHRsID09IGl0ZW0tPnRyYWNlUm91dGVDdGxJbml0aWFsVHRsKSB7CiAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIGsgPSAwOwogICAgICAgICAgICAgICAgICAgIGNvdW50ID0gdHJhY2VSb3V0ZUhvcHNUYWJsZV9jb3VudChpdGVtKTsKCgogICAgICAgICAgICAgICAgICAgIHN0cnVjdCB0cmFjZVJvdXRlSG9wc1RhYmxlX2RhdGEgKlN0b3JhZ2VUbXAgPSBOVUxMOwogICAgICAgICAgICAgICAgICAgIHN0cnVjdCBoZWFkZXJfY29tcGxleF9pbmRleCAqaGNpcHRyMiA9IE5VTEw7CiAgICAgICAgICAgICAgICAgICAgbmV0c25tcF92YXJpYWJsZV9saXN0ICp2YXJzID0gTlVMTDsKICAgICAgICAgICAgICAgICAgICBvaWQgICAgICAgICAgICAgbmV3b2lkW01BWF9PSURfTEVOXTsKICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICAgbmV3b2lkX2xlbjsKCiAgICAgICAgICAgICAgICAgICAgc25tcF92YXJsaXN0X2FkZF92YXJpYWJsZSgmdmFycywgTlVMTCwgMCwgQVNOX09DVEVUX1NUUiwgKGNoYXIgKikgaXRlbS0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXgsIGl0ZW0tPnRyYWNlUm91dGVDdGxPd25lckluZGV4TGVuKTsgLyogdHJhY2VSb3V0ZUN0bE93bmVySW5kZXggKi8KICAgICAgICAgICAgICAgICAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzLCBOVUxMLCAwLCBBU05fT0NURVRfU1RSLCAoY2hhciAqKSBpdGVtLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWUsIGl0ZW0tPnRyYWNlUm91dGVDdGxUZXN0TmFtZUxlbik7ICAgICAvKiB0cmFjZVJvdXRlQ3RsVGVzdE5hbWUgKi8KCiAgICAgICAgICAgICAgICAgICAgaGVhZGVyX2NvbXBsZXhfZ2VuZXJhdGVfb2lkKG5ld29pZCwgJm5ld29pZF9sZW4sIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIHZhcnMpOwoKICAgICAgICAgICAgICAgICAgICBmb3IgKGhjaXB0cjIgPSB0cmFjZVJvdXRlSG9wc1RhYmxlU3RvcmFnZTsKICAgICAgICAgICAgICAgICAgICAgICAgIGhjaXB0cjIgIT0gTlVMTDsgaGNpcHRyMiA9IGhjaXB0cjItPm5leHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNubXBfb2lkX2NvbXBhcmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZXdvaWQsIG5ld29pZF9sZW4sIGhjaXB0cjItPm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3b2lkX2xlbikgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RvcmFnZVRtcCA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyX2NvbXBsZXhfZXh0cmFjdF9lbnRyeQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgmdHJhY2VSb3V0ZUhvcHNUYWJsZVN0b3JhZ2UsIGhjaXB0cjIpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZF9Ib3BzQWRkcmVzc1trXSA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikgbWFsbG9jKFN0b3JhZ2VUbXAtPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZVJvdXRlSG9wc0lwVGd0QWRkcmVzc0xlbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9sZF9Ib3BzQWRkcmVzc1trXSA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpdCgxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZF9Ib3BzQWRkcmVzc1trXSA9IG5ldHNubXBfbWVtZHVwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVIb3BzSXBUZ3RBZGRyZXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0b3JhZ2VUbXAtPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlUm91dGVIb3BzSXBUZ3RBZGRyZXNzTGVuICsgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRfSG9wc0FkZHJlc3Nba11bU3RvcmFnZVRtcC0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VSb3V0ZUhvcHNJcFRndEFkZHJlc3NMZW5dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnXDAnOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGsrKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0b3JhZ2VUbXAgPSBOVUxMOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHRyYWNlUm91dGVIb3BzVGFibGVfZGVsKGl0ZW0pOwogICAgICAgICAgICAgICAgICAgIGluZGV4ID0gMDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB0ZW1wID0gU05NUF9NQUxMT0NfU1RSVUNUKHRyYWNlUm91dGVIb3BzVGFibGVfZGF0YSk7CiAgICAgICAgICAgICAgICB0ZW1wLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleCA9CiAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikgbWFsbG9jKGl0ZW0tPnRyYWNlUm91dGVDdGxPd25lckluZGV4TGVuICsgMSk7CiAgICAgICAgICAgICAgICBtZW1jcHkodGVtcC0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgaXRlbS0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgaXRlbS0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXhMZW4gKyAxKTsKICAgICAgICAgICAgICAgIHRlbXAtPnRyYWNlUm91dGVDdGxPd25lckluZGV4W2l0ZW0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VSb3V0ZUN0bE93bmVySW5kZXhMZW5dID0KICAgICAgICAgICAgICAgICAgICAnXDAnOwogICAgICAgICAgICAgICAgdGVtcC0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXhMZW4gPQogICAgICAgICAgICAgICAgICAgIGl0ZW0tPnRyYWNlUm91dGVDdGxPd25lckluZGV4TGVuOwoKICAgICAgICAgICAgICAgIHRlbXAtPnRyYWNlUm91dGVDdGxUZXN0TmFtZSA9CiAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikgbWFsbG9jKGl0ZW0tPnRyYWNlUm91dGVDdGxUZXN0TmFtZUxlbiArIDEpOwogICAgICAgICAgICAgICAgbWVtY3B5KHRlbXAtPnRyYWNlUm91dGVDdGxUZXN0TmFtZSwKICAgICAgICAgICAgICAgICAgICAgICBpdGVtLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgaXRlbS0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lTGVuICsgMSk7CiAgICAgICAgICAgICAgICB0ZW1wLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWVbaXRlbS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VSb3V0ZUN0bFRlc3ROYW1lTGVuXSA9CiAgICAgICAgICAgICAgICAgICAgJ1wwJzsKICAgICAgICAgICAgICAgIHRlbXAtPnRyYWNlUm91dGVDdGxUZXN0TmFtZUxlbiA9CiAgICAgICAgICAgICAgICAgICAgaXRlbS0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lTGVuOwoKICAgICAgICAgICAgICAgIC8qIGFkZCBsb2NrIHRvIHByb3RlY3QgKi8KICAgICAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdCBjb3VudGVyX211dGV4ID0gUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUjsKICAgICAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmY291bnRlcl9tdXRleCk7CiAgICAgICAgICAgICAgICB0ZW1wLT50cmFjZVJvdXRlSG9wc0hvcEluZGV4ID0gKytpbmRleDsKICAgICAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZjb3VudGVyX211dGV4KTsKICAgICAgICAgICAgICAgIC8qIGVuZHNhZHNhZHNhZCAqLwoKCiAgICAgICAgICAgICAgICB0ZW1wLT50cmFjZVJvdXRlSG9wc0lwVGd0QWRkcmVzc1R5cGUgPSAwOwogICAgICAgICAgICAgICAgdGVtcC0+dHJhY2VSb3V0ZUhvcHNJcFRndEFkZHJlc3MgPSBzdHJkdXAoIiIpOwogICAgICAgICAgICAgICAgdGVtcC0+dHJhY2VSb3V0ZUhvcHNJcFRndEFkZHJlc3NMZW4gPSAwOwogICAgICAgICAgICAgICAgdGVtcC0+dHJhY2VSb3V0ZUhvcHNNaW5SdHQgPSAwOwogICAgICAgICAgICAgICAgdGVtcC0+dHJhY2VSb3V0ZUhvcHNNYXhSdHQgPSAwOwogICAgICAgICAgICAgICAgdGVtcC0+dHJhY2VSb3V0ZUhvcHNBdmVyYWdlUnR0ID0gMDsKICAgICAgICAgICAgICAgIHRlbXAtPnRyYWNlUm91dGVIb3BzUnR0U3VtT2ZTcXVhcmVzID0gMDsKICAgICAgICAgICAgICAgIHRlbXAtPnRyYWNlUm91dGVIb3BzU2VudFByb2JlcyA9IDA7CiAgICAgICAgICAgICAgICB0ZW1wLT50cmFjZVJvdXRlSG9wc1Byb2JlUmVzcG9uc2VzID0gMDsKCiAgICAgICAgICAgICAgICB0ZW1wLT50cmFjZVJvdXRlSG9wc0xhc3RHb29kUHJvYmVMZW4gPSAwOwogICAgICAgICAgICAgICAgaWYgKGluZGV4ID09IDEpCiAgICAgICAgICAgICAgICAgICAgaXRlbS0+dHJhY2VSb3V0ZUhvcHMgPSB0ZW1wOwogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgKGN1cnJlbnRfdGVtcCktPm5leHQgPSB0ZW1wOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGN1cnJlbnRfdGVtcCA9IHRlbXA7CgogICAgICAgICAgICAgICAgaWYgKGluZGV4ICsgMSA+PSBpdGVtLT50cmFjZVJvdXRlQ3RsTWF4VHRsKSB7CiAgICAgICAgICAgICAgICAgICAgY3VycmVudF90ZW1wLT5uZXh0ID0gTlVMTDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoaXRlbS0+dHJhY2VSb3V0ZUhvcHMgIT0gTlVMTCkKCiAgICAgICAgICAgICAgICAgICAgaWYgKHRyYWNlUm91dGVIb3BzVGFibGVfYWRkKGN1cnJlbnRfdGVtcCkgIT0KICAgICAgICAgICAgICAgICAgICAgICAgU05NUEVSUl9TVUNDRVNTKQogICAgICAgICAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZUhvcHNUYWJsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWdpc3RlcmVkIGFuIGVudHJ5IGVycm9yXG4iKSk7CgogICAgICAgICAgICB9CiAgICAgICAgICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgbWF4UnR0ID0gMDsKICAgICAgICAgICAgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBtaW5SdHQgPSAwOwogICAgICAgICAgICByZWdpc3RlciB1bnNpZ25lZCBsb25nIGF2ZXJhZ2VSdHQgPSAwOwogICAgICAgICAgICByZWdpc3RlciB1bnNpZ25lZCBsb25nIHN1bVJ0dCA9IDA7CiAgICAgICAgICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgcmVzcG9uc2VQcm9iZSA9IDA7CiAgICAgICAgICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgc3VtT2ZTcXVhcmUgPSAwOwogICAgICAgICAgICBmb3IgKHByb2JlID0gMDsgcHJvYmUgPCBucHJvYmVzOyArK3Byb2JlKSB7CiAgICAgICAgICAgICAgICByZWdpc3RlciBpbnQgICAgY2M7CiAgICAgICAgICAgICAgICBzdHJ1Y3QgdGltZXZhbCAgdDEsIHQyOwogICAgICAgICAgICAgICAgc3RydWN0IHRpbWV6b25lIHR6OwogICAgICAgICAgICAgICAgcmVnaXN0ZXIgc3RydWN0IGlwICppcCA9IE5VTEw7CiAgICAgICAgICAgICAgICByZWdpc3RlciB1bnNpZ25lZCBsb25nIFJ0dCA9IDA7CgogICAgICAgICAgICAgICAgaWYgKHNlbnRmaXJzdCAmJiBwYXVzZW1zZWNzID4gMCkKICAgICAgICAgICAgICAgICAgICB1c2xlZXAocGF1c2Vtc2VjcyAqIDEwMDApOwogICAgICAgICAgICAgICAgKHZvaWQpIGdldHRpbWVvZmRheSgmdDEsICZ0eik7CiAgICAgICAgICAgICAgICBzZW5kX3Byb2JlKHRvLCArK3NlcSwgdHRsLCAmdDEsIG91dGlwLCBvdXR1ZHAsIHBhY2tsZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGxlbiwgaG9zdG5hbWUsIGlkZW50LCBzbmRzb2NrLCBwb3J0LAogICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRkYXRhKTsKICAgICAgICAgICAgICAgICsrc2VudGZpcnN0OwogICAgICAgICAgICAgICAgd2hpbGUgKChjYyA9CiAgICAgICAgICAgICAgICAgICAgICAgIHdhaXRfZm9yX3JlcGx5KHMsIGZyb20sICZ0MSwgcGFja2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YWl0dGltZSkpICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAodm9pZCkgZ2V0dGltZW9mZGF5KCZ0MiwgJnR6KTsKICAgICAgICAgICAgICAgICAgICB0aW1lcCA9IDA7CiAgICAgICAgICAgICAgICAgICAgdGltZSgmdGltZXApOwogICAgICAgICAgICAgICAgICAgIGkgPSBwYWNrZXRfb2socGFja2V0LCBjYywgZnJvbSwgc2VxLCBpZGVudCwgcG10dSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQpOwogICAgICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICAgICogU2tpcCBzaG9ydCBwYWNrZXQgCiAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT0gMCkKICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFnb3RsYXN0YWRkciB8fCBmcm9tLT5zaW5fYWRkci5zX2FkZHIgIT0gbGFzdGFkZHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgc3RydWN0IGlwICppcDsKICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgaW50ICAgIGhsZW47CiAgICAgICAgICAgICAgICAgICAgICAgIGlwID0gKHN0cnVjdCBpcCAqKSBwYWNrZXQ7CiAgICAgICAgICAgICAgICAgICAgICAgIGhsZW4gPSBpcC0+aXBfaGwgPDwgMjsKICAgICAgICAgICAgICAgICAgICAgICAgY2MgLT0gaGxlbjsKICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVDdGxUYWJsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgJXMiLCBpbmV0X250b2EoZnJvbS0+c2luX2FkZHIpKSk7CgoKICAgICAgICAgICAgICAgICAgICAgICAgbGFzdGFkZHIgPSBmcm9tLT5zaW5fYWRkci5zX2FkZHI7CiAgICAgICAgICAgICAgICAgICAgICAgICsrZ290bGFzdGFkZHI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIFJ0dCA9IGRlbHRhVCgmdDEsICZ0Mik7CiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VQcm9iZSA9IHJlc3BvbnNlUHJvYmUgKyAxOwogICAgICAgICAgICAgICAgICAgIGlmIChwcm9iZSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1pblJ0dCA9IFJ0dDsKICAgICAgICAgICAgICAgICAgICAgICAgbWF4UnR0ID0gUnR0OwogICAgICAgICAgICAgICAgICAgICAgICBhdmVyYWdlUnR0ID0gUnR0OwogICAgICAgICAgICAgICAgICAgICAgICBzdW1SdHQgPSBSdHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIHN1bU9mU3F1YXJlID0gUnR0ICogUnR0OwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChSdHQgPCBtaW5SdHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5SdHQgPSBSdHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChSdHQgPiBtYXhSdHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhSdHQgPSBSdHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIHN1bVJ0dCA9IChzdW1SdHQpICsgUnR0OwogICAgICAgICAgICAgICAgICAgICAgICBhdmVyYWdlUnR0ID0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdW5kKChkb3VibGUpIChzdW1SdHQpIC8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkb3VibGUpIHJlc3BvbnNlUHJvYmUpOwogICAgICAgICAgICAgICAgICAgICAgICBzdW1PZlNxdWFyZSA9IHN1bU9mU3F1YXJlICsgUnR0ICogUnR0OwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgU3RvcmFnZVJlc3VsdHMtPnRyYWNlUm91dGVSZXN1bHRzQ3VyUHJvYmVDb3VudCA9CiAgICAgICAgICAgICAgICAgICAgICAgIHByb2JlICsgMTsKICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PSAtMikgewojaWZuZGVmIEFSQ0hBSUMKICAgICAgICAgICAgICAgICAgICAgICAgaXAgPSAoc3RydWN0IGlwICopIHBhY2tldDsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlwLT5pcF90dGwgPD0gMSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50ZigiICEiKTsKI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgICAgICsrZ290X3RoZXJlOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgICAgKiB0aW1lIGV4Y2VlZGVkIGluIHRyYW5zaXQgCiAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT0gLTEpCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNvZGUgPSBpIC0gMTsKICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGNvZGUpIHsKCiAgICAgICAgICAgICAgICAgICAgY2FzZSBJQ01QX1VOUkVBQ0hfUE9SVDoKI2lmbmRlZiBBUkNIQUlDCiAgICAgICAgICAgICAgICAgICAgICAgIGlwID0gKHN0cnVjdCBpcCAqKSBwYWNrZXQ7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpcC0+aXBfdHRsIDw9IDEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmludGYoIiAhIik7CiNlbmRpZgogICAgICAgICAgICAgICAgICAgICAgICArK2dvdF90aGVyZTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgICAgIGNhc2UgSUNNUF9VTlJFQUNIX05FVDoKICAgICAgICAgICAgICAgICAgICAgICAgKyt1bnJlYWNoYWJsZTsKICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRmKCIgIU4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgICAgIGNhc2UgSUNNUF9VTlJFQUNIX0hPU1Q6CiAgICAgICAgICAgICAgICAgICAgICAgICsrdW5yZWFjaGFibGU7CiAgICAgICAgICAgICAgICAgICAgICAgIFByaW50ZigiICFIIik7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgICAgICBjYXNlIElDTVBfVU5SRUFDSF9QUk9UT0NPTDoKICAgICAgICAgICAgICAgICAgICAgICAgKytnb3RfdGhlcmU7CiAgICAgICAgICAgICAgICAgICAgICAgIFByaW50ZigiICFQIik7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgICAgICBjYXNlIElDTVBfVU5SRUFDSF9ORUVERlJBRzoKICAgICAgICAgICAgICAgICAgICAgICAgKyt1bnJlYWNoYWJsZTsKICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRmKCIgIUYtJWQiLCBwbXR1KTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgICAgIGNhc2UgSUNNUF9VTlJFQUNIX1NSQ0ZBSUw6CiAgICAgICAgICAgICAgICAgICAgICAgICsrdW5yZWFjaGFibGU7CiAgICAgICAgICAgICAgICAgICAgICAgIFByaW50ZigiICFTIik7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgICAgICBjYXNlIElDTVBfVU5SRUFDSF9GSUxURVJfUFJPSElCOgogICAgICAgICAgICAgICAgICAgICAgICArK3VucmVhY2hhYmxlOwogICAgICAgICAgICAgICAgICAgICAgICBQcmludGYoIiAhWCIpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICAgICAgY2FzZSBJQ01QX1VOUkVBQ0hfSE9TVF9QUkVDRURFTkNFOgogICAgICAgICAgICAgICAgICAgICAgICArK3VucmVhY2hhYmxlOwogICAgICAgICAgICAgICAgICAgICAgICBQcmludGYoIiAhViIpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICAgICAgY2FzZSBJQ01QX1VOUkVBQ0hfUFJFQ0VERU5DRV9DVVRPRkY6CiAgICAgICAgICAgICAgICAgICAgICAgICsrdW5yZWFjaGFibGU7CiAgICAgICAgICAgICAgICAgICAgICAgIFByaW50ZigiICFDIik7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICArK3VucmVhY2hhYmxlOwogICAgICAgICAgICAgICAgICAgICAgICBQcmludGYoIiAhPCVkPiIsIGNvZGUpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoY2MgPT0gMCkgewogICAgICAgICAgICAgICAgICAgIHRpbWVwID0gMDsKICAgICAgICAgICAgICAgICAgICB0aW1lKCZ0aW1lcCk7CiAgICAgICAgICAgICAgICAgICAgUHJpbnRmKCIgKiIpOwogICAgICAgICAgICAgICAgICAgIFJ0dCA9IChpdGVtLT50cmFjZVJvdXRlQ3RsVGltZU91dCkgKiAxMDAwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGl0ZW0tPnRyYWNlUm91dGVDdGxNYXhSb3dzICE9IDApIHsKCiAgICAgICAgICAgICAgICAgICAgdGVtcF9oaXMgPQogICAgICAgICAgICAgICAgICAgICAgICBTTk1QX01BTExPQ19TVFJVQ1QKICAgICAgICAgICAgICAgICAgICAgICAgKHRyYWNlUm91dGVQcm9iZUhpc3RvcnlUYWJsZV9kYXRhKTsKICAgICAgICAgICAgICAgICAgICB0ZW1wX2hpcy0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXggPQogICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKSBtYWxsb2MoaXRlbS0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXhMZW4gKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7CiAgICAgICAgICAgICAgICAgICAgbWVtY3B5KHRlbXBfaGlzLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPnRyYWNlUm91dGVDdGxPd25lckluZGV4TGVuICsgMSk7CiAgICAgICAgICAgICAgICAgICAgdGVtcF9oaXMtPnRyYWNlUm91dGVDdGxPd25lckluZGV4W2l0ZW0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZVJvdXRlQ3RsT3duZXJJbmRleExlbl0KICAgICAgICAgICAgICAgICAgICAgICAgPSAnXDAnOwogICAgICAgICAgICAgICAgICAgIHRlbXBfaGlzLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleExlbiA9CiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPnRyYWNlUm91dGVDdGxPd25lckluZGV4TGVuOwoKICAgICAgICAgICAgICAgICAgICB0ZW1wX2hpcy0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lID0KICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikgbWFsbG9jKGl0ZW0tPnRyYWNlUm91dGVDdGxUZXN0TmFtZUxlbiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsKICAgICAgICAgICAgICAgICAgICBtZW1jcHkodGVtcF9oaXMtPnRyYWNlUm91dGVDdGxUZXN0TmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWVMZW4gKyAxKTsKICAgICAgICAgICAgICAgICAgICB0ZW1wX2hpcy0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lW2l0ZW0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VSb3V0ZUN0bFRlc3ROYW1lTGVuXQogICAgICAgICAgICAgICAgICAgICAgICA9ICdcMCc7CiAgICAgICAgICAgICAgICAgICAgdGVtcF9oaXMtPnRyYWNlUm91dGVDdGxUZXN0TmFtZUxlbiA9CiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPnRyYWNlUm91dGVDdGxUZXN0TmFtZUxlbjsKCiAgICAgICAgICAgICAgICAgICAgLyogYWRkIGxvY2sgdG8gcHJvdGVjdCAqLwogICAgICAgICAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdCBjb3VudGVyX211dGV4ID0KICAgICAgICAgICAgICAgICAgICAgICAgUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUjsKICAgICAgICAgICAgICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJmNvdW50ZXJfbXV0ZXgpOwogICAgICAgICAgICAgICAgICAgIGlmIChpdGVtLT50cmFjZVJvdXRlUHJvYmVIaXN0b3J5TWF4SW5kZXggPj0KICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpICgyMTQ3NDgzNjQ3KSkKICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS0+dHJhY2VSb3V0ZVByb2JlSGlzdG9yeU1heEluZGV4ID0gMDsKICAgICAgICAgICAgICAgICAgICB0ZW1wX2hpcy0+dHJhY2VSb3V0ZVByb2JlSGlzdG9yeUluZGV4ID0KICAgICAgICAgICAgICAgICAgICAgICAgKysoaXRlbS0+dHJhY2VSb3V0ZVByb2JlSGlzdG9yeU1heEluZGV4KTsKICAgICAgICAgICAgICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmY291bnRlcl9tdXRleCk7CiAgICAgICAgICAgICAgICAgICAgLyogZW5kc2Fkc2Fkc2FkICovCiAgICAgICAgICAgICAgICAgICAgdGVtcF9oaXMtPnRyYWNlUm91dGVQcm9iZUhpc3RvcnlIb3BJbmRleCA9IHR0bDsKICAgICAgICAgICAgICAgICAgICB0ZW1wX2hpcy0+dHJhY2VSb3V0ZVByb2JlSGlzdG9yeVByb2JlSW5kZXggPSBwcm9iZSArIDE7CgogICAgICAgICAgICAgICAgICAgIHRlbXBfaGlzLT50cmFjZVJvdXRlUHJvYmVIaXN0b3J5SEFkZHJUeXBlID0gMTsKICAgICAgICAgICAgICAgICAgICB0ZW1wX2hpcy0+dHJhY2VSb3V0ZVByb2JlSGlzdG9yeUhBZGRyID0KICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikgbWFsbG9jKHN0cmxlbihpbmV0X250b2EoZnJvbS0+c2luX2FkZHIpKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsKICAgICAgICAgICAgICAgICAgICBzdHJjcHkodGVtcF9oaXMtPnRyYWNlUm91dGVQcm9iZUhpc3RvcnlIQWRkciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgKGluZXRfbnRvYShmcm9tLT5zaW5fYWRkcikpKTsKICAgICAgICAgICAgICAgICAgICB0ZW1wX2hpcy0+CiAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlUm91dGVQcm9iZUhpc3RvcnlIQWRkcltzdHJsZW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbmV0X250b2EKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZnJvbS0+c2luX2FkZHIpKV0gPQogICAgICAgICAgICAgICAgICAgICAgICAnXDAnOwogICAgICAgICAgICAgICAgICAgIHRlbXBfaGlzLT50cmFjZVJvdXRlUHJvYmVIaXN0b3J5SEFkZHJMZW4gPQogICAgICAgICAgICAgICAgICAgICAgICBzdHJsZW4oaW5ldF9udG9hKGZyb20tPnNpbl9hZGRyKSk7CgogICAgICAgICAgICAgICAgICAgIHRlbXBfaGlzLT50cmFjZVJvdXRlUHJvYmVIaXN0b3J5UmVzcG9uc2UgPSBSdHQ7CiAgICAgICAgICAgICAgICAgICAgdGVtcF9oaXMtPnRyYWNlUm91dGVQcm9iZUhpc3RvcnlTdGF0dXMgPSAxOwogICAgICAgICAgICAgICAgICAgIHRlbXBfaGlzLT50cmFjZVJvdXRlUHJvYmVIaXN0b3J5TGFzdFJDID0gMDsKCgkJICAgIHRlbXBfaGlzLT50cmFjZVJvdXRlUHJvYmVIaXN0b3J5VGltZV90aW1lID0gdGltZXA7CiAgICAgICAgICAgICAgICAgICAgdGVtcF9oaXMtPnRyYWNlUm91dGVQcm9iZUhpc3RvcnlUaW1lID0KICAgICAgICAgICAgICAgICAgICAgICAgbmV0c25tcF9tZW1kdXAoZGF0ZV9uX3RpbWUoJnRpbWVwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZW1wX2hpcy0+dHJhY2VSb3V0ZVByb2JlSGlzdG9yeVRpbWVMZW4pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHByb2JlID09IDApCiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPnRyYWNlUm91dGVQcm9iZUhpcyA9IHRlbXBfaGlzOwogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAoY3VycmVudF90ZW1wX2hpcyktPm5leHQgPSB0ZW1wX2hpczsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfdGVtcF9oaXMgPSB0ZW1wX2hpczsKCiAgICAgICAgICAgICAgICAgICAgaWYgKHByb2JlICsgMSA+PSBucHJvYmVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfdGVtcF9oaXMtPm5leHQgPSBOVUxMOwoKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGlmIChpdGVtLT50cmFjZVJvdXRlUHJvYmVIaXMgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodHJhY2VSb3V0ZVByb2JlSGlzdG9yeVRhYmxlX2NvdW50KGl0ZW0pIDwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPnRyYWNlUm91dGVDdGxNYXhSb3dzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHJhY2VSb3V0ZVByb2JlSGlzdG9yeVRhYmxlX2FkZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjdXJyZW50X3RlbXBfaGlzKSAhPSBTTk1QRVJSX1NVQ0NFU1MpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVQcm9iZUhpc3RvcnlUYWJsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlZ2lzdGVyZWQgYW4gZW50cnkgZXJyb3JcbiIpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlUm91dGVQcm9iZUhpc3RvcnlUYWJsZV9kZWxMYXN0KGl0ZW0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRyYWNlUm91dGVQcm9iZUhpc3RvcnlUYWJsZV9hZGQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY3VycmVudF90ZW1wX2hpcykgIT0gU05NUEVSUl9TVUNDRVNTKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlUHJvYmVIaXN0b3J5VGFibGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWdpc3RlcmVkIGFuIGVudHJ5IGVycm9yXG4iKSk7CgogICAgICAgICAgICAgICAgICAgICAgICB9CgkJICAgIH0KCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKGl0ZW0tPnRyYWNlUm91dGVDdGxDcmVhdGVIb3BzRW50cmllcyA9PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgbmV0c25tcF92YXJpYWJsZV9saXN0ICp2YXJzX2hvcHMgPSBOVUxMOwogICAgICAgICAgICAgICAgICAgIHNubXBfdmFybGlzdF9hZGRfdmFyaWFibGUoJnZhcnNfaG9wcywgTlVMTCwgMCwgQVNOX09DVEVUX1NUUiwgKGNoYXIgKikgaXRlbS0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXgsIGl0ZW0tPnRyYWNlUm91dGVDdGxPd25lckluZGV4TGVuKTsgICAgLyogIHRyYWNlUm91dGVDdGxPd25lckluZGV4ICAqLwogICAgICAgICAgICAgICAgICAgIHNubXBfdmFybGlzdF9hZGRfdmFyaWFibGUoJnZhcnNfaG9wcywgTlVMTCwgMCwgQVNOX09DVEVUX1NUUiwgKGNoYXIgKikgaXRlbS0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lLCBpdGVtLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWVMZW4pOyAgICAgICAgLyogIHRyYWNlUm91dGVDdGxUZXN0TmFtZSAgKi8KICAgICAgICAgICAgICAgICAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzX2hvcHMsIE5VTEwsIDAsIEFTTl9VTlNJR05FRCwgKGNoYXIgKikgJmluZGV4LCBzaXplb2YoaW5kZXgpKTsgICAgICAgLyogIHRyYWNlUm91dGVIb3BzSW5kZXggICovCiAgICAgICAgICAgICAgICAgICAgaWYgKChjdXJyZW50ID0KICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcl9jb21wbGV4X2dldCh0cmFjZVJvdXRlSG9wc1RhYmxlU3RvcmFnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJzX2hvcHMpKSA9PSBOVUxMKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgc25tcF9mcmVlX3ZhcmJpbmQodmFyc19ob3BzKTsKICAgICAgICAgICAgICAgICAgICB2YXJzX2hvcHMgPSBOVUxMOwoKICAgICAgICAgICAgICAgICAgICBjdXJyZW50LT50cmFjZVJvdXRlSG9wc0lwVGd0QWRkcmVzc1R5cGUgPSAxOwogICAgICAgICAgICAgICAgICAgIGN1cnJlbnQtPnRyYWNlUm91dGVIb3BzSXBUZ3RBZGRyZXNzID0KICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikgbWFsbG9jKHN0cmxlbihpbmV0X250b2EoZnJvbS0+c2luX2FkZHIpKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsKICAgICAgICAgICAgICAgICAgICBjdXJyZW50LT50cmFjZVJvdXRlSG9wc0lwVGd0QWRkcmVzcyA9CiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmR1cChpbmV0X250b2EoZnJvbS0+c2luX2FkZHIpKTsKICAgICAgICAgICAgICAgICAgICBjdXJyZW50LT4KICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VSb3V0ZUhvcHNJcFRndEFkZHJlc3Nbc3RybGVuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbmV0X250b2EKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmcm9tLT5zaW5fYWRkcikpXSA9CiAgICAgICAgICAgICAgICAgICAgICAgICdcMCc7CiAgICAgICAgICAgICAgICAgICAgY3VycmVudC0+dHJhY2VSb3V0ZUhvcHNJcFRndEFkZHJlc3NMZW4gPQogICAgICAgICAgICAgICAgICAgICAgICBzdHJsZW4oaW5ldF9udG9hKGZyb20tPnNpbl9hZGRyKSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGNvdW50ICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmNtcAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9sZF9Ib3BzQWRkcmVzc1tpbmRleCAtIDFdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQtPnRyYWNlUm91dGVIb3BzSXBUZ3RBZGRyZXNzKSAhPSAwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZyA9IDE7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBjdXJyZW50LT50cmFjZVJvdXRlSG9wc0lwVGd0QWRkcmVzc0xlbiA9CiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmxlbihpbmV0X250b2EoZnJvbS0+c2luX2FkZHIpKTsKICAgICAgICAgICAgICAgICAgICBjdXJyZW50LT50cmFjZVJvdXRlSG9wc01pblJ0dCA9IG1pblJ0dDsKICAgICAgICAgICAgICAgICAgICBjdXJyZW50LT50cmFjZVJvdXRlSG9wc01heFJ0dCA9IG1heFJ0dDsKICAgICAgICAgICAgICAgICAgICBjdXJyZW50LT50cmFjZVJvdXRlSG9wc0F2ZXJhZ2VSdHQgPSBhdmVyYWdlUnR0OwogICAgICAgICAgICAgICAgICAgIGN1cnJlbnQtPnRyYWNlUm91dGVIb3BzUnR0U3VtT2ZTcXVhcmVzID0gc3VtT2ZTcXVhcmU7CiAgICAgICAgICAgICAgICAgICAgY3VycmVudC0+dHJhY2VSb3V0ZUhvcHNTZW50UHJvYmVzID0gcHJvYmUgKyAxOwogICAgICAgICAgICAgICAgICAgIGN1cnJlbnQtPnRyYWNlUm91dGVIb3BzUHJvYmVSZXNwb25zZXMgPSByZXNwb25zZVByb2JlOwoJCSAgICBjdXJyZW50LT50cmFjZVJvdXRlSG9wc0xhc3RHb29kUHJvYmVfdGltZSA9IHRpbWVwOwogICAgICAgICAgICAgICAgICAgIGN1cnJlbnQtPnRyYWNlUm91dGVIb3BzTGFzdEdvb2RQcm9iZSA9CiAgICAgICAgICAgICAgICAgICAgICAgIG5ldHNubXBfbWVtZHVwKGRhdGVfbl90aW1lKCZ0aW1lcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3VycmVudC0+dHJhY2VSb3V0ZUhvcHNMYXN0R29vZFByb2JlTGVuKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICh2b2lkKSBmZmx1c2goc3Rkb3V0KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBwdXRjaGFyKCdcbicpOwoKCiAgICAgICAgICAgIGlmIChnb3RfdGhlcmUKICAgICAgICAgICAgICAgIHx8ICh1bnJlYWNoYWJsZSA+IDAgJiYgdW5yZWFjaGFibGUgPj0gbnByb2JlcyAtIDEpKSB7CgogICAgICAgICAgICAgICAgaWYgKGdvdF90aGVyZSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgU3RvcmFnZVJlc3VsdHMtPnRyYWNlUm91dGVSZXN1bHRzVGVzdEF0dGVtcHRzID0KICAgICAgICAgICAgICAgICAgICAgICAgU3RvcmFnZVJlc3VsdHMtPnRyYWNlUm91dGVSZXN1bHRzVGVzdEF0dGVtcHRzICsgMTsKCiAgICAgICAgICAgICAgICAgICAgU3RvcmFnZVJlc3VsdHMtPnRyYWNlUm91dGVSZXN1bHRzVGVzdFN1Y2Nlc3NlcyA9CiAgICAgICAgICAgICAgICAgICAgICAgIFN0b3JhZ2VSZXN1bHRzLT50cmFjZVJvdXRlUmVzdWx0c1Rlc3RTdWNjZXNzZXMgKyAxOwoKCQkgICAgU3RvcmFnZVJlc3VsdHMtPnRyYWNlUm91dGVSZXN1bHRzTGFzdEdvb2RQYXRoX3RpbWUgPSB0aW1lcDsKICAgICAgICAgICAgICAgICAgICBTdG9yYWdlUmVzdWx0cy0+dHJhY2VSb3V0ZVJlc3VsdHNMYXN0R29vZFBhdGggPQogICAgICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX21lbWR1cChkYXRlX25fdGltZSgmdGltZXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RvcmFnZVJlc3VsdHMtPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VSb3V0ZVJlc3VsdHNMYXN0R29vZFBhdGhMZW4pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKChpdGVtLT4KICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlUm91dGVDdGxUcmFwR2VuZXJhdGlvblswXSAmCiAgICAgICAgICAgICAgICAgICAgICAgICBUUkFDRVJPVVRFVFJBUEdFTkVSQVRJT05fVEVTVENPTVBMRVRFRCkgIT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZVByb2JlSGlzdG9yeVRhYmxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRFU1QgY29tcGxldGVkIVxuIikpOwogICAgICAgICAgICAgICAgICAgICAgICBzZW5kX3RyYWNlUm91dGVfdHJhcChpdGVtLCB0cmFjZVJvdXRlVGVzdENvbXBsZXRlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0cmFjZVJvdXRlVGVzdENvbXBsZXRlZCkgLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yob2lkKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIFN0b3JhZ2VSZXN1bHRzLT50cmFjZVJvdXRlUmVzdWx0c1Rlc3RBdHRlbXB0cyA9CiAgICAgICAgICAgICAgICAgICAgICAgIFN0b3JhZ2VSZXN1bHRzLT50cmFjZVJvdXRlUmVzdWx0c1Rlc3RBdHRlbXB0cyArIDE7CiAgICAgICAgICAgICAgICAgICAgaWYgKChpdGVtLT4KICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlUm91dGVDdGxUcmFwR2VuZXJhdGlvblswXSAmCiAgICAgICAgICAgICAgICAgICAgICAgICBUUkFDRVJPVVRFVFJBUEdFTkVSQVRJT05fVEVTVEZBSUxFRCkgIT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZVByb2JlSGlzdG9yeVRhYmxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRlc3QgRmFpbGVkIVxuIikpOwogICAgICAgICAgICAgICAgICAgICAgICBzZW5kX3RyYWNlUm91dGVfdHJhcChpdGVtLCB0cmFjZVJvdXRlVGVzdEZhaWxlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHRyYWNlUm91dGVUZXN0RmFpbGVkKSAvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihvaWQpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIH0gZWxzZSBpZiAodHRsID09IGl0ZW0tPnRyYWNlUm91dGVDdGxNYXhUdGwKICAgICAgICAgICAgICAgICAgICAgICAmJiAocHJvYmUgKyAxKSA9PSBucHJvYmVzKSB7CiAgICAgICAgICAgICAgICBTdG9yYWdlUmVzdWx0cy0+dHJhY2VSb3V0ZVJlc3VsdHNUZXN0QXR0ZW1wdHMgPQogICAgICAgICAgICAgICAgICAgIFN0b3JhZ2VSZXN1bHRzLT50cmFjZVJvdXRlUmVzdWx0c1Rlc3RBdHRlbXB0cyArIDE7CgogICAgICAgICAgICAgICAgaWYgKChpdGVtLT4KICAgICAgICAgICAgICAgICAgICAgdHJhY2VSb3V0ZUN0bFRyYXBHZW5lcmF0aW9uWzBdICYKICAgICAgICAgICAgICAgICAgICAgVFJBQ0VST1VURVRSQVBHRU5FUkFUSU9OX1RFU1RGQUlMRUQpICE9IDApIHsKICAgICAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZVByb2JlSGlzdG9yeVRhYmxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGVzdCBGYWlsZWQhXG4iKSk7CiAgICAgICAgICAgICAgICAgICAgc2VuZF90cmFjZVJvdXRlX3RyYXAoaXRlbSwgdHJhY2VSb3V0ZVRlc3RGYWlsZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHRyYWNlUm91dGVUZXN0RmFpbGVkKSAvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9pZCkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgIH0KCiAgICAgICAgY2xvc2Uoc25kc29jayk7CgogICAgICAgIGlmIChmbGFnID09IDEpIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoInRyYWNlUm91dGVQcm9iZUhpc3RvcnlUYWJsZSIsICJwYXRoIGNoYW5nZWQhXG4iKSk7CiAgICAgICAgICAgIHNlbmRfdHJhY2VSb3V0ZV90cmFwKGl0ZW0sIHRyYWNlUm91dGVQYXRoQ2hhbmdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodHJhY2VSb3V0ZVBhdGhDaGFuZ2UpIC8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9pZCkpOwogICAgICAgIH0KCiAgICAgICAgaW50ICAgICAgICAgICAgIGsgPSAwOwogICAgICAgIGZvciAoayA9IDA7IGsgPCBjb3VudDsgaysrKSB7CiAgICAgICAgICAgIGZyZWUob2xkX0hvcHNBZGRyZXNzW2tdKTsKICAgICAgICAgICAgb2xkX0hvcHNBZGRyZXNzW2tdID0gTlVMTDsKICAgICAgICB9CiAgICB9CiAgICBpZiAoaXRlbS0+dHJhY2VSb3V0ZUN0bFRhcmdldEFkZHJlc3NUeXBlID09IDIpIHsKICAgICAgICBpbnQgICAgICAgICAgICAgaWNtcF9zb2NrID0gMDsgIC8qIHJlY2VpdmUgKGljbXApIHNvY2tldCBmaWxlIGRlc2NyaXB0b3IgKi8KICAgICAgICBpbnQgICAgICAgICAgICAgc25kc29jayA9IDA7ICAgIC8qIHNlbmQgKHVkcCkgc29ja2V0IGZpbGUgZGVzY3JpcHRvciAqLwoKICAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfaW42IHdoZXJldG87ICAgIC8qIFdobyB0byB0cnkgdG8gcmVhY2ggKi8KCiAgICAgICAgc3RydWN0IHNvY2thZGRyX2luNiBzYWRkcjsKICAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfaW42IGZpcnN0aG9wOwogICAgICAgIGNoYXIgICAgICAgICAgICpzb3VyY2UgPSBOVUxMOwogICAgICAgIGNoYXIgICAgICAgICAgICpkZXZpY2UgPSBOVUxMOwogICAgICAgIGNoYXIgICAgICAgICAgICpob3N0bmFtZSA9IE5VTEw7CgogICAgICAgIHBpZF90ICAgICAgICAgICBpZGVudCA9IDA7CiAgICAgICAgdV9zaG9ydCAgICAgICAgIHBvcnQgPSAzMjc2OCArIDY2NjsgICAgIC8qIHN0YXJ0IHVkcCBkZXN0IHBvcnQgIyBmb3IgcHJvYmUgcGFja2V0cyAqLwogICAgICAgIGludCAgICAgICAgICAgICBvcHRpb25zID0gMDsgICAgLyogc29ja2V0IG9wdGlvbnMgKi8KICAgICAgICBpbnQgICAgICAgICAgICAgd2FpdHRpbWUgPSA1OyAgIC8qIHRpbWUgdG8gd2FpdCBmb3IgcmVzcG9uc2UgKGluIHNlY29uZHMpICovCgogICAgICAgIGNoYXIgICAgICAgICAgICpzZW5kYnVmZiA9IE5VTEw7CiAgICAgICAgaW50ICAgICAgICAgICAgIGRhdGFsZW4gPSBzaXplb2Yoc3RydWN0IHBrdF9mb3JtYXQpOwoKICAgICAgICB1X2NoYXIgICAgICAgICAgcGFja2V0WzUxMl07ICAgIC8qIGxhc3QgaW5ib3VuZCAoaWNtcCkgcGFja2V0ICovCgogICAgICAgIGNoYXIgICAgICAgICAgICBwYVs2NF07CiAgICAgICAgc3RydWN0IGhvc3RlbnQgKmhwID0gTlVMTDsKICAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfaW42IGZyb20sICp0byA9IE5VTEw7CiAgICAgICAgaW50ICAgICAgICAgICAgIGkgPSAwLCBvbiA9IDAsIHByb2JlID0gMCwgc2VxID0gMCwgdG9zID0KICAgICAgICAgICAgMCwgdHRsID0gMDsKICAgICAgICBpbnQgICAgICAgICAgICAgc29ja2V0X2Vycm5vID0gMDsKCiAgICAgICAgaWNtcF9zb2NrID0gc29ja2V0KEFGX0lORVQ2LCBTT0NLX1JBVywgSVBQUk9UT19JQ01QVjYpOwogICAgICAgIHNvY2tldF9lcnJubyA9IGVycm5vOwoKICAgICAgICBzZXR1aWQoZ2V0dWlkKCkpOwoKICAgICAgICBvbiA9IDE7CiAgICAgICAgc2VxID0gdG9zID0gMDsKICAgICAgICB0byA9IChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopICZ3aGVyZXRvOwoKICAgICAgICBob3N0bmFtZSA9CiAgICAgICAgICAgIChjaGFyICopIG1hbGxvYyhpdGVtLT50cmFjZVJvdXRlQ3RsVGFyZ2V0QWRkcmVzc0xlbiArIDEpOwogICAgICAgIG1lbWNweShob3N0bmFtZSwgaXRlbS0+dHJhY2VSb3V0ZUN0bFRhcmdldEFkZHJlc3MsCiAgICAgICAgICAgICAgIGl0ZW0tPnRyYWNlUm91dGVDdGxUYXJnZXRBZGRyZXNzTGVuICsgMSk7CiAgICAgICAgaG9zdG5hbWVbaXRlbS0+dHJhY2VSb3V0ZUN0bFRhcmdldEFkZHJlc3NMZW5dID0gJ1wwJzsKCiAgICAgICAgc2V0bGluZWJ1ZihzdGRvdXQpOwoKICAgICAgICBtZW1zZXQoJndoZXJldG8sICdcMCcsIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW42KSk7CgogICAgICAgIHRvLT5zaW42X2ZhbWlseSA9IEFGX0lORVQ2OwogICAgICAgIHRvLT5zaW42X3BvcnQgPSBodG9ucyhwb3J0KTsKCiAgICAgICAgaWYgKGluZXRfcHRvbihBRl9JTkVUNiwgaG9zdG5hbWUsICZ0by0+c2luNl9hZGRyKSA8PSAwKSB7CiAgICAgICAgICAgIGhwID0gZ2V0aG9zdGJ5bmFtZTIoaG9zdG5hbWUsIEFGX0lORVQ2KTsKICAgICAgICAgICAgaWYgKGhwICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgIG1lbW1vdmUoKGNhZGRyX3QpICYgdG8tPnNpbjZfYWRkciwgaHAtPmhfYWRkciwgMTYpOwogICAgICAgICAgICAgICAgaG9zdG5hbWUgPSAoY2hhciAqKSBocC0+aF9uYW1lOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgKHZvaWQpIGZwcmludGYoc3RkZXJyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRyYWNlcm91dGU6IHVua25vd24gaG9zdCAlc1xuIiwgaG9zdG5hbWUpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZpcnN0aG9wID0gKnRvOwoKICAgICAgICBkYXRhbGVuID0gaXRlbS0+dHJhY2VSb3V0ZUN0bERhdGFTaXplOwogICAgICAgIGlmIChkYXRhbGVuIDwgKGludCkgc2l6ZW9mKHN0cnVjdCBwa3RfZm9ybWF0KQogICAgICAgICAgICB8fCBkYXRhbGVuID49IE1BWFBBQ0tFVCkgewogICAgICAgICAgICBGcHJpbnRmKHN0ZGVyciwKICAgICAgICAgICAgICAgICAgICAidHJhY2Vyb3V0ZTogcGFja2V0IHNpemUgbXVzdCBiZSAlZCA8PSBzIDwgJWQuXG4iLAogICAgICAgICAgICAgICAgICAgIChpbnQpIHNpemVvZihzdHJ1Y3QgcGt0X2Zvcm1hdCksIE1BWFBBQ0tFVCk7CiAgICAgICAgICAgIGRhdGFsZW4gPSAxNjsKICAgICAgICB9CgogICAgICAgIGlkZW50ID0gZ2V0cGlkKCk7CgogICAgICAgIHNlbmRidWZmID0gbWFsbG9jKGRhdGFsZW4pOwogICAgICAgIGlmIChzZW5kYnVmZiA9PSBOVUxMKSB7CiAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAibWFsbG9jIGZhaWxlZFxuIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIGlmIChpY21wX3NvY2sgPCAwKSB7CiAgICAgICAgICAgIGVycm5vID0gc29ja2V0X2Vycm5vOwogICAgICAgICAgICBwZXJyb3IoInRyYWNlcm91dGU2OiBpY21wIHNvY2tldCIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBpZiAob3B0aW9ucyAmIFNPX0RFQlVHKQogICAgICAgICAgICBzZXRzb2Nrb3B0KGljbXBfc29jaywgU09MX1NPQ0tFVCwgU09fREVCVUcsCiAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikgJm9uLCBzaXplb2Yob24pKTsKICAgICAgICBpZiAob3B0aW9ucyAmIFNPX0RPTlRST1VURSkKICAgICAgICAgICAgc2V0c29ja29wdChpY21wX3NvY2ssIFNPTF9TT0NLRVQsIFNPX0RPTlRST1VURSwKICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKSAmb24sIHNpemVvZihvbikpOwoKICAgICAgICBpZiAoKHNuZHNvY2sgPSBzb2NrZXQoQUZfSU5FVDYsIFNPQ0tfREdSQU0sIDApKSA8IDApIHsKICAgICAgICAgICAgcGVycm9yKCJ0cmFjZXJvdXRlOiBVRFAgc29ja2V0Iik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiNpZmRlZiBTT19TTkRCVUYKICAgICAgICBpZiAoc2V0c29ja29wdChzbmRzb2NrLCBTT0xfU09DS0VULCBTT19TTkRCVUYsIChjaGFyICopICZkYXRhbGVuLAogICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihkYXRhbGVuKSkgPCAwKSB7CiAgICAgICAgICAgIHBlcnJvcigidHJhY2Vyb3V0ZTogU09fU05EQlVGIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU09fU05EQlVGICovCgogICAgICAgIGlmIChvcHRpb25zICYgU09fREVCVUcpCiAgICAgICAgICAgICh2b2lkKSBzZXRzb2Nrb3B0KHNuZHNvY2ssIFNPTF9TT0NLRVQsIFNPX0RFQlVHLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKSAmb24sIHNpemVvZihvbikpOwogICAgICAgIGlmIChvcHRpb25zICYgU09fRE9OVFJPVVRFKQogICAgICAgICAgICAodm9pZCkgc2V0c29ja29wdChzbmRzb2NrLCBTT0xfU09DS0VULCBTT19ET05UUk9VVEUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopICZvbiwgc2l6ZW9mKG9uKSk7CgogICAgICAgIGlmIChzb3VyY2UgPT0gTlVMTCkgewogICAgICAgICAgICBzb2NrbGVuX3QgICAgICAgYWxlbjsKICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHByb2JlX2ZkID0gc29ja2V0KEFGX0lORVQ2LCBTT0NLX0RHUkFNLCAwKTsKCiAgICAgICAgICAgIGlmIChwcm9iZV9mZCA8IDApIHsKICAgICAgICAgICAgICAgIHBlcnJvcigic29ja2V0Iik7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGRldmljZSkgewogICAgICAgICAgICAgICAgaWYgKHNldHNvY2tvcHQKICAgICAgICAgICAgICAgICAgICAocHJvYmVfZmQsIFNPTF9TT0NLRVQsIFNPX0JJTkRUT0RFVklDRSwgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICBzdHJsZW4oZGV2aWNlKSArIDEpID09IC0xKQogICAgICAgICAgICAgICAgICAgIHBlcnJvcigiV0FSTklORzogaW50ZXJmYWNlIGlzIGlnbm9yZWQiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmaXJzdGhvcC5zaW42X3BvcnQgPSBodG9ucygxMDI1KTsKICAgICAgICAgICAgaWYgKGNvbm5lY3QKICAgICAgICAgICAgICAgIChwcm9iZV9mZCwgKHN0cnVjdCBzb2NrYWRkciAqKSAmZmlyc3Rob3AsCiAgICAgICAgICAgICAgICAgc2l6ZW9mKGZpcnN0aG9wKSkgPT0gLTEpIHsKICAgICAgICAgICAgICAgIHBlcnJvcigiY29ubmVjdCIpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGFsZW4gPSBzaXplb2Yoc2FkZHIpOwogICAgICAgICAgICBpZiAoZ2V0c29ja25hbWUocHJvYmVfZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJnNhZGRyLCAmYWxlbikgPT0KICAgICAgICAgICAgICAgIC0xKSB7CiAgICAgICAgICAgICAgICBwZXJyb3IoImdldHNvY2tuYW1lIik7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2FkZHIuc2luNl9wb3J0ID0gMDsKICAgICAgICAgICAgY2xvc2UocHJvYmVfZmQpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIG1lbXNldCgmc2FkZHIsICdcMCcsIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW42KSk7CiAgICAgICAgICAgIHNhZGRyLnNpbjZfZmFtaWx5ID0gQUZfSU5FVDY7CiAgICAgICAgICAgIGlmIChpbmV0X3B0b24oQUZfSU5FVDYsIHNvdXJjZSwgJnNhZGRyLnNpbjZfYWRkcikgPCAwKSB7CiAgICAgICAgICAgICAgICBQcmludGYoInRyYWNlcm91dGU6IHVua25vd24gYWRkciAlc1xuIiwgc291cmNlKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKGJpbmQoc25kc29jaywgKHN0cnVjdCBzb2NrYWRkciAqKSAmc2FkZHIsIHNpemVvZihzYWRkcikpIDwgMCkgewogICAgICAgICAgICBwZXJyb3IoInRyYWNlcm91dGU6IGJpbmQgc2VuZGluZyBzb2NrZXQiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAoYmluZChpY21wX3NvY2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikgJnNhZGRyLCBzaXplb2Yoc2FkZHIpKSA8IDApIHsKICAgICAgICAgICAgcGVycm9yKCJ0cmFjZXJvdXRlOiBiaW5kIGljbXA2IHNvY2tldCIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBGcHJpbnRmKHN0ZGVyciwgInRyYWNlcm91dGUgdG8gJXMgKCVzKSIsIGhvc3RuYW1lLAogICAgICAgICAgICAgICAgaW5ldF9udG9wKEFGX0lORVQ2LCAmdG8tPnNpbjZfYWRkciwgcGEsIDY0KSk7CgogICAgICAgIEZwcmludGYoc3RkZXJyLCAiIGZyb20gJXMiLAogICAgICAgICAgICAgICAgaW5ldF9udG9wKEFGX0lORVQ2LCAmc2FkZHIuc2luNl9hZGRyLCBwYSwgNjQpKTsKICAgICAgICBGcHJpbnRmKHN0ZGVyciwgIiwgJWx1IGhvcHMgbWF4LCAlZCBieXRlIHBhY2tldHNcbiIsCiAgICAgICAgICAgICAgICBpdGVtLT50cmFjZVJvdXRlQ3RsTWF4VHRsLCBkYXRhbGVuKTsKICAgICAgICAodm9pZCkgZmZsdXNoKHN0ZGVycik7CgoKICAgICAgICBzdHJ1Y3QgdHJhY2VSb3V0ZVJlc3VsdHNUYWJsZV9kYXRhICpTdG9yYWdlUmVzdWx0cyA9IE5VTEw7CiAgICAgICAgbmV0c25tcF92YXJpYWJsZV9saXN0ICp2YXJzX3Jlc3VsdHMgPSBOVUxMOwoKICAgICAgICBzdHJ1Y3QgdHJhY2VSb3V0ZUhvcHNUYWJsZV9kYXRhICp0ZW1wID0gTlVMTDsKICAgICAgICBzdHJ1Y3QgdHJhY2VSb3V0ZUhvcHNUYWJsZV9kYXRhICpjdXJyZW50X3RlbXAgPSBOVUxMOwogICAgICAgIHN0cnVjdCB0cmFjZVJvdXRlSG9wc1RhYmxlX2RhdGEgKmN1cnJlbnQgPSBOVUxMOwoKICAgICAgICB1bnNpZ25lZCBsb25nICAgaW5kZXggPSAwOwoKICAgICAgICBzdHJ1Y3QgdHJhY2VSb3V0ZVByb2JlSGlzdG9yeVRhYmxlX2RhdGEgKnRlbXBfaGlzID0gTlVMTDsKICAgICAgICBzdHJ1Y3QgdHJhY2VSb3V0ZVByb2JlSGlzdG9yeVRhYmxlX2RhdGEgKmN1cnJlbnRfdGVtcF9oaXMgPSBOVUxMOwoKICAgICAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzX3Jlc3VsdHMsIE5VTEwsIDAsIEFTTl9PQ1RFVF9TVFIsIChjaGFyICopIGl0ZW0tPnRyYWNlUm91dGVDdGxPd25lckluZGV4LCBpdGVtLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleExlbik7ICAgICAvKiAgdHJhY2VSb3V0ZUN0bE93bmVySW5kZXggICovCiAgICAgICAgc25tcF92YXJsaXN0X2FkZF92YXJpYWJsZSgmdmFyc19yZXN1bHRzLCBOVUxMLCAwLCBBU05fT0NURVRfU1RSLCAoY2hhciAqKSBpdGVtLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWUsIGl0ZW0tPnRyYWNlUm91dGVDdGxUZXN0TmFtZUxlbik7IC8qICB0cmFjZVJvdXRlQ3RsVGVzdE5hbWUgICovCiAgICAgICAgaWYgKChTdG9yYWdlUmVzdWx0cyA9CiAgICAgICAgICAgICBoZWFkZXJfY29tcGxleF9nZXQodHJhY2VSb3V0ZVJlc3VsdHNUYWJsZVN0b3JhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyc19yZXN1bHRzKSkgPT0gTlVMTCkKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIHNubXBfZnJlZV92YXJiaW5kKHZhcnNfcmVzdWx0cyk7CiAgICAgICAgdmFyc19yZXN1bHRzID0gTlVMTDsKCiAgICAgICAgZm9yICh0dGwgPSBpdGVtLT50cmFjZVJvdXRlQ3RsSW5pdGlhbFR0bDsKICAgICAgICAgICAgIHR0bCA8PSBpdGVtLT50cmFjZVJvdXRlQ3RsTWF4VHRsOyArK3R0bCkgewogICAgICAgICAgICBzdHJ1Y3QgaW42X2FkZHIgbGFzdGFkZHIgPSB7IHt7MCx9fSB9OwogICAgICAgICAgICBpbnQgICAgICAgICAgICAgZ290X3RoZXJlID0gMDsKICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHVucmVhY2hhYmxlID0gMDsKICAgICAgICAgICAgdGltZV90ICAgICAgICAgIHRpbWVwID0gMDsKICAgICAgICAgICAgUHJpbnRmKCIlMmQgIiwgdHRsKTsKCgogICAgICAgICAgICBTdG9yYWdlUmVzdWx0cy0+dHJhY2VSb3V0ZVJlc3VsdHNDdXJIb3BDb3VudCA9IHR0bDsKICAgICAgICAgICAgaWYgKGl0ZW0tPnRyYWNlUm91dGVDdGxDcmVhdGVIb3BzRW50cmllcyA9PSAxKSB7CiAgICAgICAgICAgICAgICBpZiAodHRsID09IGl0ZW0tPnRyYWNlUm91dGVDdGxJbml0aWFsVHRsKSB7CgogICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBrID0gMDsKICAgICAgICAgICAgICAgICAgICBjb3VudCA9IHRyYWNlUm91dGVIb3BzVGFibGVfY291bnQoaXRlbSk7CiAgICAgICAgICAgICAgICAgICAgc3RydWN0IHRyYWNlUm91dGVIb3BzVGFibGVfZGF0YSAqU3RvcmFnZVRtcCA9IE5VTEw7CiAgICAgICAgICAgICAgICAgICAgc3RydWN0IGhlYWRlcl9jb21wbGV4X2luZGV4ICpoY2lwdHIyID0gTlVMTDsKICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX3ZhcmlhYmxlX2xpc3QgKnZhcnMgPSBOVUxMOwogICAgICAgICAgICAgICAgICAgIG9pZCAgICAgICAgICAgICBuZXdvaWRbTUFYX09JRF9MRU5dOwogICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgICBuZXdvaWRfbGVuOwoKICAgICAgICAgICAgICAgICAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzLCBOVUxMLCAwLCBBU05fT0NURVRfU1RSLCAoY2hhciAqKSBpdGVtLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleCwgaXRlbS0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXhMZW4pOyAvKiB0cmFjZVJvdXRlQ3RsT3duZXJJbmRleCAqLwogICAgICAgICAgICAgICAgICAgIHNubXBfdmFybGlzdF9hZGRfdmFyaWFibGUoJnZhcnMsIE5VTEwsIDAsIEFTTl9PQ1RFVF9TVFIsIChjaGFyICopIGl0ZW0tPnRyYWNlUm91dGVDdGxUZXN0TmFtZSwgaXRlbS0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lTGVuKTsgICAgIC8qIHRyYWNlUm91dGVDdGxUZXN0TmFtZSAqLwoKICAgICAgICAgICAgICAgICAgICBoZWFkZXJfY29tcGxleF9nZW5lcmF0ZV9vaWQobmV3b2lkLCAmbmV3b2lkX2xlbiwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgdmFycyk7CgogICAgICAgICAgICAgICAgICAgIHNubXBfZnJlZV92YXJiaW5kKHZhcnMpOwogICAgICAgICAgICAgICAgICAgIHZhcnMgPSBOVUxMOwoKICAgICAgICAgICAgICAgICAgICBmb3IgKGhjaXB0cjIgPSB0cmFjZVJvdXRlSG9wc1RhYmxlU3RvcmFnZTsKICAgICAgICAgICAgICAgICAgICAgICAgIGhjaXB0cjIgIT0gTlVMTDsgaGNpcHRyMiA9IGhjaXB0cjItPm5leHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNubXBfb2lkX2NvbXBhcmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZXdvaWQsIG5ld29pZF9sZW4sIGhjaXB0cjItPm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3b2lkX2xlbikgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RvcmFnZVRtcCA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyX2NvbXBsZXhfZXh0cmFjdF9lbnRyeQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgmdHJhY2VSb3V0ZUhvcHNUYWJsZVN0b3JhZ2UsIGhjaXB0cjIpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZF9Ib3BzQWRkcmVzc1trXSA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikgbWFsbG9jKFN0b3JhZ2VUbXAtPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZVJvdXRlSG9wc0lwVGd0QWRkcmVzc0xlbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9sZF9Ib3BzQWRkcmVzc1trXSA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpdCgxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZF9Ib3BzQWRkcmVzc1trXSA9IG5ldHNubXBfbWVtZHVwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0b3JhZ2VUbXAtPnRyYWNlUm91dGVIb3BzSXBUZ3RBZGRyZXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0b3JhZ2VUbXAtPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlUm91dGVIb3BzSXBUZ3RBZGRyZXNzTGVuICsgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRfSG9wc0FkZHJlc3Nba11bU3RvcmFnZVRtcC0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VSb3V0ZUhvcHNJcFRndEFkZHJlc3NMZW5dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAnXDAnOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGsrKzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB0cmFjZVJvdXRlSG9wc1RhYmxlX2RlbChpdGVtKTsKICAgICAgICAgICAgICAgICAgICBpbmRleCA9IDA7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdGVtcCA9IFNOTVBfTUFMTE9DX1NUUlVDVCh0cmFjZVJvdXRlSG9wc1RhYmxlX2RhdGEpOwogICAgICAgICAgICAgICAgdGVtcC0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXggPQogICAgICAgICAgICAgICAgICAgIChjaGFyICopIG1hbGxvYyhpdGVtLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleExlbiArIDEpOwogICAgICAgICAgICAgICAgbWVtY3B5KHRlbXAtPnRyYWNlUm91dGVDdGxPd25lckluZGV4LAogICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPnRyYWNlUm91dGVDdGxPd25lckluZGV4LAogICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPnRyYWNlUm91dGVDdGxPd25lckluZGV4TGVuICsgMSk7CiAgICAgICAgICAgICAgICB0ZW1wLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleFtpdGVtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlUm91dGVDdGxPd25lckluZGV4TGVuXSA9CiAgICAgICAgICAgICAgICAgICAgJ1wwJzsKICAgICAgICAgICAgICAgIHRlbXAtPnRyYWNlUm91dGVDdGxPd25lckluZGV4TGVuID0KICAgICAgICAgICAgICAgICAgICBpdGVtLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleExlbjsKCiAgICAgICAgICAgICAgICB0ZW1wLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWUgPQogICAgICAgICAgICAgICAgICAgIChjaGFyICopIG1hbGxvYyhpdGVtLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWVMZW4gKyAxKTsKICAgICAgICAgICAgICAgIG1lbWNweSh0ZW1wLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgaXRlbS0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lLAogICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPnRyYWNlUm91dGVDdGxUZXN0TmFtZUxlbiArIDEpOwogICAgICAgICAgICAgICAgdGVtcC0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lW2l0ZW0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlUm91dGVDdGxUZXN0TmFtZUxlbl0gPQogICAgICAgICAgICAgICAgICAgICdcMCc7CiAgICAgICAgICAgICAgICB0ZW1wLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWVMZW4gPQogICAgICAgICAgICAgICAgICAgIGl0ZW0tPnRyYWNlUm91dGVDdGxUZXN0TmFtZUxlbjsKCiAgICAgICAgICAgICAgICAvKiBhZGQgbG9jayB0byBwcm90ZWN0ICovCiAgICAgICAgICAgICAgICBwdGhyZWFkX211dGV4X3QgY291bnRlcl9tdXRleCA9IFBUSFJFQURfTVVURVhfSU5JVElBTElaRVI7CiAgICAgICAgICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJmNvdW50ZXJfbXV0ZXgpOwogICAgICAgICAgICAgICAgdGVtcC0+dHJhY2VSb3V0ZUhvcHNIb3BJbmRleCA9ICsraW5kZXg7CiAgICAgICAgICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmY291bnRlcl9tdXRleCk7CiAgICAgICAgICAgICAgICAvKiBlbmRzYWRzYWRzYWQgKi8KCgogICAgICAgICAgICAgICAgdGVtcC0+dHJhY2VSb3V0ZUhvcHNJcFRndEFkZHJlc3NUeXBlID0gMDsKICAgICAgICAgICAgICAgIHRlbXAtPnRyYWNlUm91dGVIb3BzSXBUZ3RBZGRyZXNzID0gc3RyZHVwKCIiKTsKICAgICAgICAgICAgICAgIHRlbXAtPnRyYWNlUm91dGVIb3BzSXBUZ3RBZGRyZXNzTGVuID0gMDsKICAgICAgICAgICAgICAgIHRlbXAtPnRyYWNlUm91dGVIb3BzTWluUnR0ID0gMDsKICAgICAgICAgICAgICAgIHRlbXAtPnRyYWNlUm91dGVIb3BzTWF4UnR0ID0gMDsKICAgICAgICAgICAgICAgIHRlbXAtPnRyYWNlUm91dGVIb3BzQXZlcmFnZVJ0dCA9IDA7CiAgICAgICAgICAgICAgICB0ZW1wLT50cmFjZVJvdXRlSG9wc1J0dFN1bU9mU3F1YXJlcyA9IDA7CiAgICAgICAgICAgICAgICB0ZW1wLT50cmFjZVJvdXRlSG9wc1NlbnRQcm9iZXMgPSAwOwogICAgICAgICAgICAgICAgdGVtcC0+dHJhY2VSb3V0ZUhvcHNQcm9iZVJlc3BvbnNlcyA9IDA7CgogICAgICAgICAgICAgICAgdGVtcC0+dHJhY2VSb3V0ZUhvcHNMYXN0R29vZFByb2JlTGVuID0gMDsKICAgICAgICAgICAgICAgIGlmIChpbmRleCA9PSAxKQogICAgICAgICAgICAgICAgICAgIGl0ZW0tPnRyYWNlUm91dGVIb3BzID0gdGVtcDsKICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIChjdXJyZW50X3RlbXApLT5uZXh0ID0gdGVtcDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjdXJyZW50X3RlbXAgPSB0ZW1wOwoKICAgICAgICAgICAgICAgIGlmIChpbmRleCA+PSBpdGVtLT50cmFjZVJvdXRlQ3RsTWF4VHRsKSB7CiAgICAgICAgICAgICAgICAgICAgY3VycmVudF90ZW1wLT5uZXh0ID0gTlVMTDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoaXRlbS0+dHJhY2VSb3V0ZUhvcHMgIT0gTlVMTCkKCiAgICAgICAgICAgICAgICAgICAgaWYgKHRyYWNlUm91dGVIb3BzVGFibGVfYWRkKGN1cnJlbnRfdGVtcCkgIT0KICAgICAgICAgICAgICAgICAgICAgICAgU05NUEVSUl9TVUNDRVNTKQogICAgICAgICAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZUhvcHNUYWJsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWdpc3RlcmVkIGFuIGVudHJ5IGVycm9yXG4iKSk7CgogICAgICAgICAgICB9CgogICAgICAgICAgICByZWdpc3RlciB1bnNpZ25lZCBsb25nIG1heFJ0dCA9IDA7CiAgICAgICAgICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgbWluUnR0ID0gMDsKICAgICAgICAgICAgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBhdmVyYWdlUnR0ID0gMDsKICAgICAgICAgICAgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBzdW1SdHQgPSAwOwogICAgICAgICAgICByZWdpc3RlciB1bnNpZ25lZCBsb25nIHJlc3BvbnNlUHJvYmUgPSAwOwogICAgICAgICAgICByZWdpc3RlciB1bnNpZ25lZCBsb25nIHN1bU9mU3F1YXJlID0gMDsKICAgICAgICAgICAgZm9yIChwcm9iZSA9IDA7IHByb2JlIDwgbnByb2JlczsgKytwcm9iZSkgewogICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIGNjID0gMCwgcmVzZXRfdGltZXIgPSAwOwogICAgICAgICAgICAgICAgc3RydWN0IHRpbWV2YWwgIHQxLCB0MjsKICAgICAgICAgICAgICAgIHN0cnVjdCB0aW1lem9uZSB0ejsKICAgICAgICAgICAgICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgUnR0ID0gMDsKCiAgICAgICAgICAgICAgICBnZXR0aW1lb2ZkYXkoJnQxLCAmdHopOwoKICAgICAgICAgICAgICAgIHNlbmRfcHJvYmVfdjYoKytzZXEsIHR0bCwgc2VuZGJ1ZmYsIGlkZW50LCAmdHosIHNuZHNvY2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFsZW4sICZ3aGVyZXRvLCBob3N0bmFtZSk7CiAgICAgICAgICAgICAgICByZXNldF90aW1lciA9IDE7CgogICAgICAgICAgICAgICAgd2hpbGUgKChjYyA9CiAgICAgICAgICAgICAgICAgICAgICAgIHdhaXRfZm9yX3JlcGx5X3Y2KGljbXBfc29jaywgJmZyb20sIHJlc2V0X3RpbWVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YWl0dGltZSwgaWNtcF9zb2NrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrZXQpKSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgZ2V0dGltZW9mZGF5KCZ0MiwgJnR6KTsKICAgICAgICAgICAgICAgICAgICB0aW1lcCA9IDA7CiAgICAgICAgICAgICAgICAgICAgdGltZSgmdGltZXApOwogICAgICAgICAgICAgICAgICAgIGlmICgoaSA9CiAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrZXRfb2tfdjYocGFja2V0LCBjYywgJmZyb20sIHNlcSwgJnQxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50KSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXRfdGltZXIgPSAxOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAobWVtY21wCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJmZyb20uc2luNl9hZGRyLCAmbGFzdGFkZHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcikpKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCZsYXN0YWRkciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZnJvbS5zaW42X2FkZHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcikpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBSdHQgPSBkZWx0YVQoJnQxLCAmdDIpOwogICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZVByb2JlID0gcmVzcG9uc2VQcm9iZSArIDE7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9iZSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5SdHQgPSBSdHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhSdHQgPSBSdHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmVyYWdlUnR0ID0gUnR0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VtUnR0ID0gUnR0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VtT2ZTcXVhcmUgPSBSdHQgKiBSdHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoUnR0IDwgbWluUnR0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pblJ0dCA9IFJ0dDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChSdHQgPiBtYXhSdHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4UnR0ID0gUnR0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VtUnR0ID0gKHN1bVJ0dCkgKyBSdHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmVyYWdlUnR0ID0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3VuZCgoZG91YmxlKSAoc3VtUnR0KSAvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRvdWJsZSkgcmVzcG9uc2VQcm9iZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW1PZlNxdWFyZSA9IHN1bU9mU3F1YXJlICsgUnR0ICogUnR0OwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBTdG9yYWdlUmVzdWx0cy0+dHJhY2VSb3V0ZVJlc3VsdHNDdXJQcm9iZUNvdW50ID0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2JlICsgMTsKCgogICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGkgLSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSUNNUDZfRFNUX1VOUkVBQ0hfTk9QT1JUOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgKytnb3RfdGhlcmU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSUNNUDZfRFNUX1VOUkVBQ0hfTk9ST1VURToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrdW5yZWFjaGFibGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmludGYoIiAhTiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSUNNUDZfRFNUX1VOUkVBQ0hfQUREUjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrdW5yZWFjaGFibGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmludGYoIiAhSCIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIElDTVA2X0RTVF9VTlJFQUNIX0FETUlOOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgKyt1bnJlYWNoYWJsZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50ZigiICFTIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXRfdGltZXIgPSAwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGNjID09IDApIHsKICAgICAgICAgICAgICAgICAgICB0aW1lcCA9IDA7CiAgICAgICAgICAgICAgICAgICAgdGltZSgmdGltZXApOwogICAgICAgICAgICAgICAgICAgIFByaW50ZigiICoiKTsKICAgICAgICAgICAgICAgICAgICBSdHQgPSAoaXRlbS0+dHJhY2VSb3V0ZUN0bFRpbWVPdXQpICogMTAwMDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoaXRlbS0+dHJhY2VSb3V0ZUN0bE1heFJvd3MgIT0gMCkgewoKICAgICAgICAgICAgICAgICAgICB0ZW1wX2hpcyA9CiAgICAgICAgICAgICAgICAgICAgICAgIFNOTVBfTUFMTE9DX1NUUlVDVAogICAgICAgICAgICAgICAgICAgICAgICAodHJhY2VSb3V0ZVByb2JlSGlzdG9yeVRhYmxlX2RhdGEpOwogICAgICAgICAgICAgICAgICAgIHRlbXBfaGlzLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleCA9CiAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopIG1hbGxvYyhpdGVtLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleExlbiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsKICAgICAgICAgICAgICAgICAgICBtZW1jcHkodGVtcF9oaXMtPnRyYWNlUm91dGVDdGxPd25lckluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLT50cmFjZVJvdXRlQ3RsT3duZXJJbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXhMZW4gKyAxKTsKICAgICAgICAgICAgICAgICAgICB0ZW1wX2hpcy0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXhbaXRlbS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlUm91dGVDdGxPd25lckluZGV4TGVuXQogICAgICAgICAgICAgICAgICAgICAgICA9ICdcMCc7CiAgICAgICAgICAgICAgICAgICAgdGVtcF9oaXMtPnRyYWNlUm91dGVDdGxPd25lckluZGV4TGVuID0KICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXhMZW47CgogICAgICAgICAgICAgICAgICAgIHRlbXBfaGlzLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWUgPQogICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKSBtYWxsb2MoaXRlbS0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lTGVuICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOwogICAgICAgICAgICAgICAgICAgIG1lbWNweSh0ZW1wX2hpcy0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPnRyYWNlUm91dGVDdGxUZXN0TmFtZUxlbiArIDEpOwogICAgICAgICAgICAgICAgICAgIHRlbXBfaGlzLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWVbaXRlbS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZVJvdXRlQ3RsVGVzdE5hbWVMZW5dCiAgICAgICAgICAgICAgICAgICAgICAgID0gJ1wwJzsKICAgICAgICAgICAgICAgICAgICB0ZW1wX2hpcy0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lTGVuID0KICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lTGVuOwoKICAgICAgICAgICAgICAgICAgICAvKiBhZGQgbG9jayB0byBwcm90ZWN0ICovCiAgICAgICAgICAgICAgICAgICAgcHRocmVhZF9tdXRleF90IGNvdW50ZXJfbXV0ZXggPQogICAgICAgICAgICAgICAgICAgICAgICBQVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSOwogICAgICAgICAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmY291bnRlcl9tdXRleCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0tPnRyYWNlUm91dGVQcm9iZUhpc3RvcnlNYXhJbmRleCA+PQogICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykgKDIxNDc0ODM2NDcpKQogICAgICAgICAgICAgICAgICAgICAgICBpdGVtLT50cmFjZVJvdXRlUHJvYmVIaXN0b3J5TWF4SW5kZXggPSAwOwogICAgICAgICAgICAgICAgICAgIHRlbXBfaGlzLT50cmFjZVJvdXRlUHJvYmVIaXN0b3J5SW5kZXggPQogICAgICAgICAgICAgICAgICAgICAgICArKyhpdGVtLT50cmFjZVJvdXRlUHJvYmVIaXN0b3J5TWF4SW5kZXgpOwogICAgICAgICAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZjb3VudGVyX211dGV4KTsKICAgICAgICAgICAgICAgICAgICAvKiBlbmRzYWRzYWRzYWQgKi8KICAgICAgICAgICAgICAgICAgICB0ZW1wX2hpcy0+dHJhY2VSb3V0ZVByb2JlSGlzdG9yeUhvcEluZGV4ID0gdHRsOwogICAgICAgICAgICAgICAgICAgIHRlbXBfaGlzLT50cmFjZVJvdXRlUHJvYmVIaXN0b3J5UHJvYmVJbmRleCA9IHByb2JlICsgMTsKCiAgICAgICAgICAgICAgICAgICAgdGVtcF9oaXMtPnRyYWNlUm91dGVQcm9iZUhpc3RvcnlIQWRkclR5cGUgPSAyOwogICAgICAgICAgICAgICAgICAgIHRlbXBfaGlzLT50cmFjZVJvdXRlUHJvYmVIaXN0b3J5SEFkZHIgPQogICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKQogICAgICAgICAgICAgICAgICAgICAgICBtYWxsb2Moc3RybGVuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5ldF9udG9wCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFGX0lORVQ2LCAmZnJvbS5zaW42X2FkZHIsIHBhLCA2NCkpICsgMSk7CiAgICAgICAgICAgICAgICAgICAgdGVtcF9oaXMtPnRyYWNlUm91dGVQcm9iZUhpc3RvcnlIQWRkciA9CiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmR1cChpbmV0X250b3AKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBRl9JTkVUNiwgJmZyb20uc2luNl9hZGRyLCBwYSwgNjQpKTsKICAgICAgICAgICAgICAgICAgICB0ZW1wX2hpcy0+CiAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlUm91dGVQcm9iZUhpc3RvcnlIQWRkcltzdHJsZW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbmV0X250b3AKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQUZfSU5FVDYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmcm9tLnNpbjZfYWRkciwgcGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY0KSldID0gJ1wwJzsKICAgICAgICAgICAgICAgICAgICB0ZW1wX2hpcy0+dHJhY2VSb3V0ZVByb2JlSGlzdG9yeUhBZGRyTGVuID0KICAgICAgICAgICAgICAgICAgICAgICAgc3RybGVuKGluZXRfbnRvcAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFGX0lORVQ2LCAmZnJvbS5zaW42X2FkZHIsIHBhLCA2NCkpOwoKICAgICAgICAgICAgICAgICAgICB0ZW1wX2hpcy0+dHJhY2VSb3V0ZVByb2JlSGlzdG9yeVJlc3BvbnNlID0gUnR0OwogICAgICAgICAgICAgICAgICAgIHRlbXBfaGlzLT50cmFjZVJvdXRlUHJvYmVIaXN0b3J5U3RhdHVzID0gMTsKICAgICAgICAgICAgICAgICAgICB0ZW1wX2hpcy0+dHJhY2VSb3V0ZVByb2JlSGlzdG9yeUxhc3RSQyA9IDA7CgoJCSAgICB0ZW1wX2hpcy0+dHJhY2VSb3V0ZVByb2JlSGlzdG9yeVRpbWVfdGltZSA9IHRpbWVwOwogICAgICAgICAgICAgICAgICAgIHRlbXBfaGlzLT50cmFjZVJvdXRlUHJvYmVIaXN0b3J5VGltZSA9IG5ldHNubXBfbWVtZHVwKAogICAgICAgICAgICAgICAgICAgICAgICBkYXRlX25fdGltZSgmdGltZXAsCgkJCSAgICAmdGVtcF9oaXMtPnRyYWNlUm91dGVQcm9iZUhpc3RvcnlUaW1lTGVuKSwgMTEpOwoKICAgICAgICAgICAgICAgICAgICBpZiAocHJvYmUgPT0gMCkKICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS0+dHJhY2VSb3V0ZVByb2JlSGlzID0gdGVtcF9oaXM7CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIChjdXJyZW50X3RlbXBfaGlzKS0+bmV4dCA9IHRlbXBfaGlzOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgY3VycmVudF90ZW1wX2hpcyA9IHRlbXBfaGlzOwoKICAgICAgICAgICAgICAgICAgICBpZiAocHJvYmUgKyAxID49IG5wcm9iZXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF90ZW1wX2hpcy0+bmV4dCA9IE5VTEw7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbS0+dHJhY2VSb3V0ZVByb2JlSGlzICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRyYWNlUm91dGVQcm9iZUhpc3RvcnlUYWJsZV9jb3VudChpdGVtKSA8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLT50cmFjZVJvdXRlQ3RsTWF4Um93cykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRyYWNlUm91dGVQcm9iZUhpc3RvcnlUYWJsZV9hZGQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY3VycmVudF90ZW1wX2hpcykgIT0gU05NUEVSUl9TVUNDRVNTKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ0cmFjZVJvdXRlUHJvYmVIaXN0b3J5VGFibGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWdpc3RlcmVkIGFuIGVudHJ5IGVycm9yXG4iKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZVJvdXRlUHJvYmVIaXN0b3J5VGFibGVfZGVsTGFzdChpdGVtKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0cmFjZVJvdXRlUHJvYmVIaXN0b3J5VGFibGVfYWRkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGN1cnJlbnRfdGVtcF9oaXMpICE9IFNOTVBFUlJfU1VDQ0VTUykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgidHJhY2VSb3V0ZVByb2JlSGlzdG9yeVRhYmxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVnaXN0ZXJlZCBhbiBlbnRyeSBlcnJvclxuIikpOwoKICAgICAgICAgICAgICAgICAgICAgICAgfQoJCSAgICB9CgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGl0ZW0tPnRyYWNlUm91dGVDdGxDcmVhdGVIb3BzRW50cmllcyA9PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgbmV0c25tcF92YXJpYWJsZV9saXN0ICp2YXJzX2hvcHMgPSBOVUxMOwogICAgICAgICAgICAgICAgICAgIHNubXBfdmFybGlzdF9hZGRfdmFyaWFibGUoJnZhcnNfaG9wcywgTlVMTCwgMCwgQVNOX09DVEVUX1NUUiwgKGNoYXIgKikgaXRlbS0+dHJhY2VSb3V0ZUN0bE93bmVySW5kZXgsIGl0ZW0tPnRyYWNlUm91dGVDdGxPd25lckluZGV4TGVuKTsgICAgLyogIHRyYWNlUm91dGVDdGxPd25lckluZGV4ICAqLwogICAgICAgICAgICAgICAgICAgIHNubXBfdmFybGlzdF9hZGRfdmFyaWFibGUoJnZhcnNfaG9wcywgTlVMTCwgMCwgQVNOX09DVEVUX1NUUiwgKGNoYXIgKikgaXRlbS0+dHJhY2VSb3V0ZUN0bFRlc3ROYW1lLCBpdGVtLT50cmFjZVJvdXRlQ3RsVGVzdE5hbWVMZW4pOyAgICAgICAgLyogIHRyYWNlUm91dGVDdGxUZXN0TmFtZSAgKi8KICAgICAgICAgICAgICAgICAgICBzbm1wX3Zhcmxpc3RfYWRkX3ZhcmlhYmxlKCZ2YXJzX2hvcHMsIE5VTEwsIDAsIEFTTl9VTlNJR05FRCwgKGNoYXIgKikgJmluZGV4LCBzaXplb2YoaW5kZXgpKTsgICAgICAgLyogIHRyYWNlUm91dGVIb3BzSW5kZXggICovCiAgICAgICAgICAgICAgICAgICAgaWYgKChjdXJyZW50ID0KICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcl9jb21wbGV4X2dldCh0cmFjZVJvdXRlSG9wc1RhYmxlU3RvcmFnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJzX2hvcHMpKSA9PSBOVUxMKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgY3VycmVudC0+dHJhY2VSb3V0ZUhvcHNJcFRndEFkZHJlc3NUeXBlID0gMjsKICAgICAgICAgICAgICAgICAgICBjdXJyZW50LT50cmFjZVJvdXRlSG9wc0lwVGd0QWRkcmVzcyA9CiAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopCiAgICAgICAgICAgICAgICAgICAgICAgIG1hbGxvYyhzdHJsZW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbmV0X250b3AKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQUZfSU5FVDYsICZmcm9tLnNpbjZfYWRkciwgcGEsIDY0KSkgKyAxKTsKICAgICAgICAgICAgICAgICAgICBjdXJyZW50LT50cmFjZVJvdXRlSG9wc0lwVGd0QWRkcmVzcyA9CiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmR1cChpbmV0X250b3AKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBRl9JTkVUNiwgJmZyb20uc2luNl9hZGRyLCBwYSwgNjQpKTsKICAgICAgICAgICAgICAgICAgICBjdXJyZW50LT4KICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VSb3V0ZUhvcHNJcFRndEFkZHJlc3Nbc3RybGVuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbmV0X250b3AKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBRl9JTkVUNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZnJvbS5zaW42X2FkZHIsIHBhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY0KSldID0gJ1wwJzsKCiAgICAgICAgICAgICAgICAgICAgaWYgKGNvdW50ICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmNtcAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9sZF9Ib3BzQWRkcmVzc1tpbmRleCAtIDFdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQtPnRyYWNlUm91dGVIb3BzSXBUZ3RBZGRyZXNzKSAhPSAwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZyA9IDE7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBjdXJyZW50LT50cmFjZVJvdXRlSG9wc0lwVGd0QWRkcmVzc0xlbiA9CiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmxlbihpbmV0X250b3AKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBRl9JTkVUNiwgJmZyb20uc2luNl9hZGRyLCBwYSwgNjQpKTsKICAgICAgICAgICAgICAgICAgICBjdXJyZW50LT50cmFjZVJvdXRlSG9wc01pblJ0dCA9IG1pblJ0dDsKICAgICAgICAgICAgICAgICAgICBjdXJyZW50LT50cmFjZVJvdXRlSG9wc01heFJ0dCA9IG1heFJ0dDsKICAgICAgICAgICAgICAgICAgICBjdXJyZW50LT50cmFjZVJvdXRlSG9wc0F2ZXJhZ2VSdHQgPSBhdmVyYWdlUnR0OwogICAgICAgICAgICAgICAgICAgIGN1cnJlbnQtPnRyYWNlUm91dGVIb3BzUnR0U3VtT2ZTcXVhcmVzID0gc3VtT2ZTcXVhcmU7CiAgICAgICAgICAgICAgICAgICAgY3VycmVudC0+dHJhY2VSb3V0ZUhvcHNTZW50UHJvYmVzID0gcHJvYmUgKyAxOwogICAgICAgICAgICAgICAgICAgIGN1cnJlbnQtPnRyYWNlUm91dGVIb3BzUHJvYmVSZXNwb25zZXMgPSByZXNwb25zZVByb2JlOwoJCSAgICBjdXJyZW50LT50cmFjZVJvdXRlSG9wc0xhc3RHb29kUHJvYmVfdGltZSA9IHRpbWVwOwogICAgICAgICAgICAgICAgICAgIGN1cnJlbnQtPnRyYWNlUm91dGVIb3BzTGFzdEdvb2RQcm9iZSA9IAogICAgICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX21lbWR1cChkYXRlX25fdGltZSgmdGltZXAsCgkJCSAgICAmY3VycmVudC0+dHJhY2VSb3V0ZUhvcHNMYXN0R29vZFByb2JlTGVuKSwgMTEpOwoKICAgICAgICAgICAgICAgICAgICBzbm1wX2ZyZWVfdmFyYmluZCh2YXJzX2hvcHMpOwogICAgICAgICAgICAgICAgICAgIHZhcnNfaG9wcyA9IE5VTEw7CiAgICAgICAgICAgICAgICB9CgoKICAgICAgICAgICAgICAgICh2b2lkKSBmZmx1c2goc3Rkb3V0KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBwdXRjaGFyKCdcbicpOwoKCiAgICAgICAgICAgIGlmIChnb3RfdGhlcmUgfHwgdW5yZWFjaGFibGUgPj0gbnByb2JlcyAtIDEpIHsKCgogICAgICAgICAgICAgICAgaWYgKGdvdF90aGVyZSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgU3RvcmFnZVJlc3VsdHMtPnRyYWNlUm91dGVSZXN1bHRzVGVzdEF0dGVtcHRzID0KICAgICAgICAgICAgICAgICAgICAgICAgU3RvcmFnZVJlc3VsdHMtPnRyYWNlUm91dGVSZXN1bHRzVGVzdEF0dGVtcHRzICsgMTsKCiAgICAgICAgICAgICAgICAgICAgU3RvcmFnZVJlc3VsdHMtPnRyYWNlUm91dGVSZXN1bHRzVGVzdFN1Y2Nlc3NlcyA9CiAgICAgICAgICAgICAgICAgICAgICAgIFN0b3JhZ2VSZXN1bHRzLT50cmFjZVJvdXRlUmVzdWx0c1Rlc3RTdWNjZXNzZXMgKyAxOwoJCSAgICBTdG9yYWdlUmVzdWx0cy0+dHJhY2VSb3V0ZVJlc3VsdHNMYXN0R29vZFBhdGhfdGltZSA9IHRpbWVwOwogICAgICAgICAgICAgICAgICAgIFN0b3JhZ2VSZXN1bHRzLT50cmFjZVJvdXRlUmVzdWx0c0xhc3RHb29kUGF0aCA9CiAgICAgICAgICAgICAgICAgICAgICAgIG5ldHNubXBfbWVtZHVwKGRhdGVfbl90aW1lKCZ0aW1lcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlN0b3JhZ2VSZXN1bHRzLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlUm91dGVSZXN1bHRzTGFzdEdvb2RQYXRoTGVuKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEpOwogICAgICAgICAgICAgICAgICAgIGlmICgoaXRlbS0+CiAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZVJvdXRlQ3RsVHJhcEdlbmVyYXRpb25bMF0gJgogICAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0VST1VURVRSQVBHRU5FUkFUSU9OX1RFU1RDT01QTEVURUQpICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJURVNUIGNvbXBsZXRlZCFcbiIpOwogICAgICAgICAgICAgICAgICAgICAgICBzZW5kX3RyYWNlUm91dGVfdHJhcChpdGVtLCB0cmFjZVJvdXRlVGVzdENvbXBsZXRlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0cmFjZVJvdXRlVGVzdENvbXBsZXRlZCkgLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yob2lkKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIFN0b3JhZ2VSZXN1bHRzLT50cmFjZVJvdXRlUmVzdWx0c1Rlc3RBdHRlbXB0cyA9CiAgICAgICAgICAgICAgICAgICAgICAgIFN0b3JhZ2VSZXN1bHRzLT50cmFjZVJvdXRlUmVzdWx0c1Rlc3RBdHRlbXB0cyArIDE7CiAgICAgICAgICAgICAgICAgICAgaWYgKChpdGVtLT4KICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlUm91dGVDdGxUcmFwR2VuZXJhdGlvblswXSAmCiAgICAgICAgICAgICAgICAgICAgICAgICBUUkFDRVJPVVRFVFJBUEdFTkVSQVRJT05fVEVTVEZBSUxFRCkgIT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoInRlc3QgRmFpbGVkIVxuIik7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRfdHJhY2VSb3V0ZV90cmFwKGl0ZW0sIHRyYWNlUm91dGVUZXN0RmFpbGVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodHJhY2VSb3V0ZVRlc3RGYWlsZWQpIC8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9pZCkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgfSBlbHNlIGlmICh0dGwgPT0gaXRlbS0+dHJhY2VSb3V0ZUN0bE1heFR0bAogICAgICAgICAgICAgICAgICAgICAgICYmIChwcm9iZSArIDEpID09IG5wcm9iZXMpIHsKICAgICAgICAgICAgICAgIFN0b3JhZ2VSZXN1bHRzLT50cmFjZVJvdXRlUmVzdWx0c1Rlc3RBdHRlbXB0cyA9CiAgICAgICAgICAgICAgICAgICAgU3RvcmFnZVJlc3VsdHMtPnRyYWNlUm91dGVSZXN1bHRzVGVzdEF0dGVtcHRzICsgMTsKCiAgICAgICAgICAgICAgICBpZiAoKGl0ZW0tPgogICAgICAgICAgICAgICAgICAgICB0cmFjZVJvdXRlQ3RsVHJhcEdlbmVyYXRpb25bMF0gJgogICAgICAgICAgICAgICAgICAgICBUUkFDRVJPVVRFVFJBUEdFTkVSQVRJT05fVEVTVEZBSUxFRCkgIT0gMCkgewogICAgICAgICAgICAgICAgICAgIHByaW50ZigidGVzdCBGYWlsZWQhXG4iKTsKICAgICAgICAgICAgICAgICAgICBzZW5kX3RyYWNlUm91dGVfdHJhcChpdGVtLCB0cmFjZVJvdXRlVGVzdEZhaWxlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodHJhY2VSb3V0ZVRlc3RGYWlsZWQpIC8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yob2lkKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgfQoKICAgICAgICBjbG9zZShzbmRzb2NrKTsKCiAgICAgICAgaWYgKGZsYWcgPT0gMSkgewogICAgICAgICAgICBwcmludGYoInBhdGggY2hhbmdlZCFcbiIpOwogICAgICAgICAgICBzZW5kX3RyYWNlUm91dGVfdHJhcChpdGVtLCB0cmFjZVJvdXRlUGF0aENoYW5nZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHRyYWNlUm91dGVQYXRoQ2hhbmdlKSAvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihvaWQpKTsKICAgICAgICB9CgogICAgICAgIGludCAgICAgICAgICAgICBrID0gMDsKICAgICAgICBmb3IgKGsgPSAwOyBrIDwgY291bnQ7IGsrKykgewogICAgICAgICAgICBmcmVlKG9sZF9Ib3BzQWRkcmVzc1trXSk7CiAgICAgICAgICAgIG9sZF9Ib3BzQWRkcmVzc1trXSA9IE5VTEw7CiAgICAgICAgfQoKICAgIH0KICAgIHJldHVybjsKfQoKCmludAp3YWl0X2Zvcl9yZXBseShyZWdpc3RlciBpbnQgc29jaywgcmVnaXN0ZXIgc3RydWN0IHNvY2thZGRyX2luICpmcm9tcCwKICAgICAgICAgICAgICAgcmVnaXN0ZXIgY29uc3Qgc3RydWN0IHRpbWV2YWwgKnRwLCB1X2NoYXIgKiBwYWNrZXQsCiAgICAgICAgICAgICAgIGludCB3YWl0dGltZSkKewogICAgZmRfc2V0ICAgICAgICAgIGZkczsKICAgIHN0cnVjdCB0aW1ldmFsICBub3csIHdhaXQ7CiAgICBzdHJ1Y3QgdGltZXpvbmUgdHo7CiAgICByZWdpc3RlciBpbnQgICAgY2MgPSAwOwogICAgc29ja2xlbl90ICAgICAgIGZyb21sZW4gPSBzaXplb2YoKmZyb21wKTsKCiAgICBGRF9aRVJPKCZmZHMpOwogICAgRkRfU0VUKHNvY2ssICZmZHMpOwogICAgd2FpdC50dl9zZWMgPSB0cC0+dHZfc2VjICsgd2FpdHRpbWU7CiAgICB3YWl0LnR2X3VzZWMgPSB0cC0+dHZfdXNlYzsKICAgICh2b2lkKSBnZXR0aW1lb2ZkYXkoJm5vdywgJnR6KTsKICAgIHR2c3ViKCZ3YWl0LCAmbm93KTsKICAgIGlmIChzZWxlY3Qoc29jayArIDEsICZmZHMsIE5VTEwsIE5VTEwsICZ3YWl0KSA+IDApCiAgICAgICAgY2MgPSByZWN2ZnJvbShzb2NrLCAoY2hhciAqKSBwYWNrZXQsIDUxMiwgMCwKICAgICAgICAgICAgICAgICAgICAgIChzdHJ1Y3Qgc29ja2FkZHIgKikgZnJvbXAsICZmcm9tbGVuKTsKICAgIHJldHVybiAoY2MpOwp9CgoKaW50CndhaXRfZm9yX3JlcGx5X3Y2KGludCBzb2NrLCBzdHJ1Y3Qgc29ja2FkZHJfaW42ICpmcm9tLCBpbnQgcmVzZXRfdGltZXIsCiAgICAgICAgICAgICAgICAgIGludCB3YWl0dGltZSwgaW50IGljbXBfc29jaywgdV9jaGFyICogcGFja2V0KQp7CiAgICBmZF9zZXQgICAgICAgICAgZmRzOwogICAgc3RhdGljIHN0cnVjdCB0aW1ldmFsIHdhaXQ7CiAgICBpbnQgICAgICAgICAgICAgY2MgPSAwOwogICAgc29ja2xlbl90ICAgICAgIGZyb21sZW4gPSBzaXplb2YoKmZyb20pOwoKICAgIEZEX1pFUk8oJmZkcyk7CiAgICBGRF9TRVQoc29jaywgJmZkcyk7CiAgICBpZiAocmVzZXRfdGltZXIpIHsKICAgICAgICAvKgogICAgICAgICAqIHRyYWNlcm91dGUgY291bGQgaGFuZyBpZiBzb21lb25lIGVsc2UgaGFzIGEgcGluZwogICAgICAgICAqIHJ1bm5pbmcgYW5kIG91ciBJQ01QIHJlcGx5IGdldHMgZHJvcHBlZCBidXQgd2UgZG9uJ3QKICAgICAgICAgKiByZWFsaXplIGl0IGJlY2F1c2Ugd2Uga2VlcCB3YWtpbmcgdXAgdG8gaGFuZGxlIHRob3NlCiAgICAgICAgICogb3RoZXIgSUNNUCBwYWNrZXRzIHRoYXQga2VlcCBjb21pbmcgaW4uICBUbyBmaXggdGhpcywKICAgICAgICAgKiAicmVzZXRfdGltZXIiIHdpbGwgb25seSBiZSB0cnVlIGlmIHRoZSBsYXN0IHBhY2tldCB0aGF0CiAgICAgICAgICogY2FtZSBpbiB3YXMgZm9yIHVzIG9yIGlmIHRoaXMgaXMgdGhlIGZpcnN0IHRpbWUgd2UncmUKICAgICAgICAgKiB3YWl0aW5nIGZvciBhIHJlcGx5IHNpbmNlIHNlbmRpbmcgb3V0IGEgcHJvYmUuICBOb3RlCiAgICAgICAgICogdGhhdCB0aGlzIHRha2VzIGFkdmFudGFnZSBvZiB0aGUgc2VsZWN0KCkgZmVhdHVyZSBvbgogICAgICAgICAqIExpbnV4IHdoZXJlIHRoZSByZW1haW5pbmcgdGltZW91dCBpcyB3cml0dGVuIHRvIHRoZQogICAgICAgICAqIHN0cnVjdCB0aW1ldmFsIGFyZWEuCiAgICAgICAgICovCiAgICAgICAgd2FpdC50dl9zZWMgPSB3YWl0dGltZTsKICAgICAgICB3YWl0LnR2X3VzZWMgPSAwOwogICAgfQoKICAgIGlmIChzZWxlY3Qoc29jayArIDEsICZmZHMsIChmZF9zZXQgKikgMCwgKGZkX3NldCAqKSAwLCAmd2FpdCkgPiAwKSB7CiAgICAgICAgY2MgPSByZWN2ZnJvbShpY21wX3NvY2ssIChjaGFyICopIHBhY2tldCwgNTEyLCAwLAogICAgICAgICAgICAgICAgICAgICAgKHN0cnVjdCBzb2NrYWRkciAqKSBmcm9tLCAmZnJvbWxlbik7CiAgICB9CgogICAgcmV0dXJuIChjYyk7Cn0KCi8qCiAqIHNlbmRfcHJvYmUoKSB1c2VzIHRoZSBCU0QtaXNoIHVkcGlwaGRyLgogKiBEZWZpbmUgc29tZXRoaW5nIHRoYXQgbG9va3MgZW5vdWdoIGxpa2UgaXQgdG8gd29yay4KICovCnN0cnVjdCB1ZHBpcGhkciB7CiAgIHN0cnVjdCBpcGhkciB1aV9pOwogICBzdHJ1Y3QgdWRwaGRyIHVpX3U7Cn07CiNkZWZpbmUgdWlfc3JjIHVpX2kuc2FkZHIKI2RlZmluZSB1aV9kc3QgdWlfaS5kYWRkcgojZGVmaW5lIHVpX3ByIHVpX2kucHJvdG9jb2wKI2RlZmluZSB1aV9sZW4gdWlfaS50b3RfbGVuCgp2b2lkCnNlbmRfcHJvYmUoc3RydWN0IHNvY2thZGRyX2luICp3aGVyZXRvLCByZWdpc3RlciBpbnQgc2VxLCBpbnQgdHRsLAogICAgICAgICAgIHJlZ2lzdGVyIHN0cnVjdCB0aW1ldmFsICp0cCwgcmVnaXN0ZXIgc3RydWN0IGlwICpvdXRpcCwKICAgICAgICAgICByZWdpc3RlciBzdHJ1Y3QgdWRwaGRyICpvdXR1ZHAsIGludCBwYWNrbGVuLCBpbnQgb3B0bGVuLAogICAgICAgICAgIGNoYXIgKmhvc3RuYW1lLCB1X3Nob3J0IGlkZW50LCBpbnQgc25kc29jaywgdV9zaG9ydCBwb3J0LAogICAgICAgICAgIHN0cnVjdCBvdXRkYXRhICpvdXRkYXRhKQp7CiAgICByZWdpc3RlciBpbnQgICAgY2MgPSAwOwogICAgcmVnaXN0ZXIgc3RydWN0IHVkcGlwaGRyICp1aSA9IE5VTEwsICpvdWkgPSBOVUxMOwogICAgc3RydWN0IGlwICAgICAgIHRpcDsKCiAgICBvdXRpcC0+aXBfdHRsID0gdHRsOwojaWZuZGVmIF9faHB1eAogICAgb3V0aXAtPmlwX2lkID0gaHRvbnMoaWRlbnQgKyBzZXEpOwojZW5kaWYKCiAgICAvKgogICAgICogSW4gbW9zdCBjYXNlcywgdGhlIGtlcm5lbCB3aWxsIHJlY2FsY3VsYXRlIHRoZSBpcCBjaGVja3N1bS4KICAgICAqIEJ1dCB3ZSBtdXN0IGRvIGl0IGFueXdheSBzbyB0aGF0IHRoZSB1ZHAgY2hlY2tzdW0gY29tZXMgb3V0CiAgICAgKiByaWdodC4KICAgICAqLwoKICAgIG91dGlwLT5pcF9zdW0gPQogICAgICAgIGluX2NoZWNrc3VtKCh1X3Nob3J0ICopIG91dGlwLCBzaXplb2YoKm91dGlwKSArIG9wdGxlbik7CiAgICBpZiAob3V0aXAtPmlwX3N1bSA9PSAwKQogICAgICAgIG91dGlwLT5pcF9zdW0gPSAweGZmZmY7CgoKICAgIC8qCiAgICAgKiBQYXlsb2FkIAogICAgICovCiAgICBvdXRkYXRhLT5zZXEgPSBzZXE7CiAgICBvdXRkYXRhLT50dGwgPSB0dGw7CiAgICBvdXRkYXRhLT50diA9ICp0cDsKCgogICAgb3V0dWRwLT5kZXN0ID0gaHRvbnMocG9ydCArIHNlcSk7CgoKICAgIC8qCiAgICAgKiBDaGVja3N1bSAod2UgbXVzdCBzYXZlIGFuZCByZXN0b3JlIGlwIGhlYWRlcikgCiAgICAgKi8KICAgIHRpcCA9ICpvdXRpcDsKICAgIHVpID0gKHN0cnVjdCB1ZHBpcGhkciAqKSBvdXRpcDsKICAgIG91aSA9IChzdHJ1Y3QgdWRwaXBoZHIgKikgJnRpcDsKICAgIC8qCiAgICAgKiBFYXNpZXIgdG8gemVybyBhbmQgcHV0IGJhY2sgdGhpbmdzIHRoYXQgYXJlIG9rIAogICAgICovCiAgICBtZW1zZXQoKGNoYXIgKikgdWksIDAsIHNpemVvZih1aS0+dWlfaSkpOwogICAgdWktPnVpX3NyYyA9IG91aS0+dWlfc3JjOwogICAgdWktPnVpX2RzdCA9IG91aS0+dWlfZHN0OwogICAgdWktPnVpX3ByID0gb3VpLT51aV9wcjsKICAgIHVpLT51aV9sZW4gPSBvdXR1ZHAtPmxlbjsKICAgIG91dHVkcC0+Y2hlY2sgPSAwOwogICAgb3V0dWRwLT5jaGVjayA9IGluX2NoZWNrc3VtKCh1X3Nob3J0ICopIHVpLCBwYWNrbGVuKTsKICAgIGlmIChvdXR1ZHAtPmNoZWNrID09IDApCiAgICAgICAgb3V0dWRwLT5jaGVjayA9IDB4ZmZmZjsKICAgICpvdXRpcCA9IHRpcDsKCgogICAgLyoKICAgICAqIFhYWCB1bmRvY3VtZW50ZWQgZGVidWdnaW5nIGhhY2sgCiAgICAgKi8KCgojaWYgIWRlZmluZWQoSVBfSERSSU5DTCkgJiYgZGVmaW5lZChJUF9UVEwpCiAgICBwcmludGYoInR0bFxuIik7CiAgICBpZiAoc2V0c29ja29wdChzbmRzb2NrLCBJUFBST1RPX0lQLCBJUF9UVEwsCiAgICAgICAgICAgICAgICAgICAoY2hhciAqKSAmdHRsLCBzaXplb2YodHRsKSkgPCAwKSB7CiAgICAgICAgRnByaW50ZihzdGRlcnIsICIlczogc2V0c29ja29wdCB0dGwgJWQ6ICVzXG4iLAogICAgICAgICAgICAgICAgInRyYWNlcm91dGUiLCB0dGwsIHN0cmVycm9yKGVycm5vKSk7CiAgICAgICAgZXhpdCgxKTsKICAgIH0KI2VuZGlmCgojaWZkZWYgX19ocHV4CgogICAgUHJpbnRmKCJ3aGVyZXRvPSVzXG4iLAogICAgICAgICAgIGluZXRfbnRvYSgoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSB3aGVyZXRvKS0+c2luX2FkZHIpKTsKICAgIGNjID0gc2VuZHRvKHNuZHNvY2ssIChjaGFyICopIG91dHVkcCwKICAgICAgICAgICAgICAgIHBhY2tsZW4gLSAoc2l6ZW9mKCpvdXRpcCkgKyBvcHRsZW4pLCAwLCB3aGVyZXRvLAogICAgICAgICAgICAgICAgc2l6ZW9mKCp3aGVyZXRvKSk7CiAgICBpZiAoY2MgPiAwKQogICAgICAgIGNjICs9IHNpemVvZigqb3V0aXApICsgb3B0bGVuOwojZWxzZQoKICAgIGNjID0gc2VuZHRvKHNuZHNvY2ssIChjaGFyICopIG91dGlwLAogICAgICAgICAgICAgICAgcGFja2xlbiwgMCwgd2hlcmV0bywgc2l6ZW9mKCp3aGVyZXRvKSk7CiNlbmRpZgogICAgaWYgKGNjIDwgMCB8fCBjYyAhPSBwYWNrbGVuKSB7CiAgICAgICAgaWYgKGNjIDwgMCkKICAgICAgICAgICAgRnByaW50ZihzdGRlcnIsICIlczogc2VuZHRvOiAlc1xuIiwgInRyYWNlcm91dGUiLCBzdHJlcnJvcihlcnJubykpOwogICAgICAgIFByaW50ZigiJXM6IHdyb3RlICVzICVkIGNoYXJzLCByZXQ9JWRcbiIsCiAgICAgICAgICAgICAgICJ0cmFjZXJvdXRlIiwgaG9zdG5hbWUsIHBhY2tsZW4sIGNjKTsKICAgICAgICAodm9pZCkgZmZsdXNoKHN0ZG91dCk7CiAgICB9Cn0KCgoKdm9pZApzZW5kX3Byb2JlX3Y2KGludCBzZXEsIGludCB0dGwsIGNoYXIgKnNlbmRidWZmLCBwaWRfdCBpZGVudCwKICAgICAgICAgICAgICBzdHJ1Y3QgdGltZXpvbmUgKnR6LCBpbnQgc25kc29jaywgaW50IGRhdGFsZW4sCiAgICAgICAgICAgICAgc3RydWN0IHNvY2thZGRyX2luNiAqd2hlcmV0bywgY2hhciAqaG9zdG5hbWUpCnsKICAgIHN0cnVjdCBwa3RfZm9ybWF0ICpwa3QgPSAoc3RydWN0IHBrdF9mb3JtYXQgKikgc2VuZGJ1ZmY7CiAgICBpbnQgICAgICAgICAgICAgaSA9IDA7CgogICAgcGt0LT5pZGVudCA9IGh0b25sKGlkZW50KTsKICAgIHBrdC0+c2VxID0gaHRvbmwoc2VxKTsKICAgIGdldHRpbWVvZmRheSgmcGt0LT50diwgdHopOwoKICAgIGkgPSBzZXRzb2Nrb3B0KHNuZHNvY2ssIFNPTF9JUFY2LCBJUFY2X1VOSUNBU1RfSE9QUywgJnR0bCwKICAgICAgICAgICAgICAgICAgIHNpemVvZihpbnQpKTsKICAgIGlmIChpIDwgMCkgewogICAgICAgIHBlcnJvcigic2V0c29ja29wdCIpOwogICAgICAgIGV4aXQoMSk7CiAgICB9CgogICAgZG8gewogICAgICAgIGkgPSBzZW5kdG8oc25kc29jaywgc2VuZGJ1ZmYsIGRhdGFsZW4sIDAsCiAgICAgICAgICAgICAgICAgICAoc3RydWN0IHNvY2thZGRyICopIHdoZXJldG8sCiAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luNikpOwogICAgfSB3aGlsZSAoaSA8IDAgJiYgZXJybm8gPT0gRUNPTk5SRUZVU0VEKTsKCiAgICBpZiAoaSA8IDAgfHwgaSAhPSBkYXRhbGVuKSB7CiAgICAgICAgaWYgKGkgPCAwKQogICAgICAgICAgICBwZXJyb3IoInNlbmR0byIpOwogICAgICAgIFByaW50ZigidHJhY2Vyb3V0ZTogd3JvdGUgJXMgJWQgY2hhcnMsIHJldD0lZFxuIiwgaG9zdG5hbWUsCiAgICAgICAgICAgICAgIGRhdGFsZW4sIGkpOwogICAgICAgICh2b2lkKSBmZmx1c2goc3Rkb3V0KTsKICAgIH0KfQoKCnVuc2lnbmVkIGxvbmcKZGVsdGFUKHN0cnVjdCB0aW1ldmFsICp0MXAsIHN0cnVjdCB0aW1ldmFsICp0MnApCnsKICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgZHQ7CgogICAgZHQgPSAodW5zaWduZWQgbG9uZykgKChsb25nKSAodDJwLT50dl9zZWMgLSB0MXAtPnR2X3NlYykgKiAxMDAwICsKICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZykgKHQycC0+dHZfdXNlYyAtIHQxcC0+dHZfdXNlYykgLyAxMDAwKTsKICAgIHJldHVybiAoZHQpOwp9CgoKaW50CnBhY2tldF9vayhyZWdpc3RlciB1X2NoYXIgKiBidWYsIGludCBjYywgcmVnaXN0ZXIgc3RydWN0IHNvY2thZGRyX2luICpmcm9tLAogICAgICAgICAgcmVnaXN0ZXIgaW50IHNlcSwgdV9zaG9ydCBpZGVudCwgaW50IHBtdHUsIHVfc2hvcnQgcG9ydCkKewogICAgcmVnaXN0ZXIgc3RydWN0IGljbXAgKmljcCA9IE5VTEw7CiAgICByZWdpc3RlciB1X2NoYXIgdHlwZSwgY29kZTsKICAgIHJlZ2lzdGVyIGludCAgICBobGVuID0gMDsKI2lmbmRlZiBBUkNIQUlDCiAgICByZWdpc3RlciBzdHJ1Y3QgaXAgKmlwID0gTlVMTDsKCiAgICBpcCA9IChzdHJ1Y3QgaXAgKikgYnVmOwogICAgaGxlbiA9IGlwLT5pcF9obCA8PCAyOwogICAgaWYgKGNjIDwgaGxlbiArIElDTVBfTUlOTEVOKSB7CgogICAgICAgIHJldHVybiAoMCk7CiAgICB9CiAgICBjYyAtPSBobGVuOwogICAgaWNwID0gKHN0cnVjdCBpY21wICopIChidWYgKyBobGVuKTsKI2Vsc2UKICAgIGljcCA9IChzdHJ1Y3QgaWNtcCAqKSBidWY7CiNlbmRpZgogICAgdHlwZSA9IGljcC0+aWNtcF90eXBlOwogICAgY29kZSA9IGljcC0+aWNtcF9jb2RlOwogICAgLyoKICAgICAqIFBhdGggTVRVIERpc2NvdmVyeSAoUkZDMTE5MSkgCiAgICAgKi8KICAgIGlmIChjb2RlICE9IElDTVBfVU5SRUFDSF9ORUVERlJBRykKICAgICAgICBwbXR1ID0gMDsKICAgIGVsc2UgewojaWZkZWYgSEFWRV9JQ01QX05FWFRNVFUKICAgICAgICBwbXR1ID0gbnRvaHMoaWNwLT5pY21wX25leHRtdHUpOwojZWxzZQogICAgICAgIHBtdHUgPSBudG9ocygoKHN0cnVjdCBteV9wbXR1ICopICZpY3AtPmljbXBfdm9pZCktPmlwbV9uZXh0bXR1KTsKI2VuZGlmCiAgICB9CiAgICBpZiAoKHR5cGUgPT0gSUNNUF9USU1YQ0VFRCAmJiBjb2RlID09IElDTVBfVElNWENFRURfSU5UUkFOUykgfHwKICAgICAgICB0eXBlID09IElDTVBfVU5SRUFDSCB8fCB0eXBlID09IElDTVBfRUNIT1JFUExZKSB7CiAgICAgICAgcmVnaXN0ZXIgc3RydWN0IGlwICpoaXA7CiAgICAgICAgcmVnaXN0ZXIgc3RydWN0IHVkcGhkciAqdXA7CgogICAgICAgIGhpcCA9ICZpY3AtPmljbXBfaXA7CiAgICAgICAgaGxlbiA9IGhpcC0+aXBfaGwgPDwgMjsKICAgICAgICB1cCA9IChzdHJ1Y3QgdWRwaGRyICopICgodV9jaGFyICopIGhpcCArIGhsZW4pOwogICAgICAgIC8qCiAgICAgICAgICogWFhYIDggaXMgYSBtYWdpYyBudW1iZXIgCiAgICAgICAgICovCiAgICAgICAgaWYgKGhsZW4gKyAxMiA8PSBjYyAmJgogICAgICAgICAgICBoaXAtPmlwX3AgPT0gSVBQUk9UT19VRFAgJiYKICAgICAgICAgICAgdXAtPnNvdXJjZSA9PSBodG9ucyhpZGVudCkgJiYgdXAtPmRlc3QgPT0gaHRvbnMocG9ydCArIHNlcSkpCiAgICAgICAgICAgIHJldHVybiAodHlwZSA9PSBJQ01QX1RJTVhDRUVEID8gLTEgOiBjb2RlICsgMSk7CiAgICB9CgoKICAgIHJldHVybiAoMCk7Cn0KCgoKCmludApwYWNrZXRfb2tfdjYodV9jaGFyICogYnVmLCBpbnQgY2MsIHN0cnVjdCBzb2NrYWRkcl9pbjYgKmZyb20sIGludCBzZXEsCiAgICAgICAgICAgICBzdHJ1Y3QgdGltZXZhbCAqdHYsIHBpZF90IGlkZW50KQp7CiAgICBzdHJ1Y3QgaWNtcDZfaGRyICppY3AgPSBOVUxMOwogICAgdV9jaGFyICAgICAgICAgIHR5cGUsIGNvZGU7CgogICAgaWNwID0gKHN0cnVjdCBpY21wNl9oZHIgKikgYnVmOwoKICAgIHR5cGUgPSBpY3AtPmljbXA2X3R5cGU7CiAgICBjb2RlID0gaWNwLT5pY21wNl9jb2RlOwoKICAgIGlmICgodHlwZSA9PSBJQ01QNl9USU1FX0VYQ0VFREVEICYmIGNvZGUgPT0gSUNNUDZfVElNRV9FWENFRURfVFJBTlNJVCkgfHwKICAgICAgICB0eXBlID09IElDTVA2X0RTVF9VTlJFQUNIKSB7CiAgICAgICAgc3RydWN0IGlwNl9oZHIgICpoaXAgPSBOVUxMOwogICAgICAgIHN0cnVjdCB1ZHBoZHIgICp1cCA9IE5VTEw7CiAgICAgICAgaW50ICAgICAgICAgICAgIG5leHRoZHIgPSAwOwoKICAgICAgICBoaXAgPSAoc3RydWN0IGlwNl9oZHIgKikgKGljcCArIDEpOwogICAgICAgIHVwID0gKHN0cnVjdCB1ZHBoZHIgKikgKGhpcCArIDEpOwogICAgICAgIG5leHRoZHIgPSBoaXAtPmlwNl9ueHQ7CgogICAgICAgIGlmIChuZXh0aGRyID09IDQ0KSB7CiAgICAgICAgICAgIG5leHRoZHIgPSAqKHVuc2lnbmVkIGNoYXIgKikgdXA7CiAgICAgICAgICAgIHVwKys7CiAgICAgICAgfQogICAgICAgIGlmIChuZXh0aGRyID09IElQUFJPVE9fVURQKSB7CiAgICAgICAgICAgIHN0cnVjdCBwa3RfZm9ybWF0ICpwa3Q7CgogICAgICAgICAgICBwa3QgPSAoc3RydWN0IHBrdF9mb3JtYXQgKikgKHVwICsgMSk7CgogICAgICAgICAgICBpZiAobnRvaGwocGt0LT5pZGVudCkgPT0gaWRlbnQgJiYgbnRvaGwocGt0LT5zZXEpID09IHNlcSkgewogICAgICAgICAgICAgICAgKnR2ID0gcGt0LT50djsKICAgICAgICAgICAgICAgIHJldHVybiAodHlwZSA9PSBJQ01QNl9USU1FX0VYQ0VFREVEID8gLTEgOiBjb2RlICsgMSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgfQoKICAgIHJldHVybiAoMCk7Cn0KCgovKgogKiBDaGVja3N1bSByb3V0aW5lIGZvciBJbnRlcm5ldCBQcm90b2NvbCBmYW1pbHkgaGVhZGVycyAoQyBWZXJzaW9uKQogKi8KCnVfc2hvcnQKaW5fY2hlY2tzdW0ocmVnaXN0ZXIgdV9zaG9ydCAqIGFkZHIsIHJlZ2lzdGVyIGludCBsZW4pCnsKICAgIHJlZ2lzdGVyIGludCAgICBubGVmdCA9IGxlbjsKICAgIHJlZ2lzdGVyIHVfc2hvcnQgKncgPSBhZGRyOwogICAgcmVnaXN0ZXIgdV9zaG9ydCBhbnN3ZXI7CiAgICByZWdpc3RlciBpbnQgICAgc3VtID0gMDsKCiAgICAvKgogICAgICogIE91ciBhbGdvcml0aG0gaXMgc2ltcGxlLCB1c2luZyBhIDMyIGJpdCBhY2N1bXVsYXRvciAoc3VtKSwKICAgICAqICB3ZSBhZGQgc2VxdWVudGlhbCAxNiBiaXQgd29yZHMgdG8gaXQsIGFuZCBhdCB0aGUgZW5kLCBmb2xkCiAgICAgKiAgYmFjayBhbGwgdGhlIGNhcnJ5IGJpdHMgZnJvbSB0aGUgdG9wIDE2IGJpdHMgaW50byB0aGUgbG93ZXIKICAgICAqICAxNiBiaXRzLgogICAgICovCiAgICB3aGlsZSAobmxlZnQgPiAxKSB7CiAgICAgICAgc3VtICs9ICp3Kys7CiAgICAgICAgbmxlZnQgLT0gMjsKICAgIH0KCiAgICAvKgogICAgICogbW9wIHVwIGFuIG9kZCBieXRlLCBpZiBuZWNlc3NhcnkgCiAgICAgKi8KICAgIGlmIChubGVmdCA9PSAxKQogICAgICAgIHN1bSArPSAqKHVfY2hhciAqKSB3OwoKICAgIC8qCiAgICAgKiBhZGQgYmFjayBjYXJyeSBvdXRzIGZyb20gdG9wIDE2IGJpdHMgdG8gbG93IDE2IGJpdHMKICAgICAqLwogICAgc3VtID0gKHN1bSA+PiAxNikgKyAoc3VtICYgMHhmZmZmKTsgLyogYWRkIGhpIDE2IHRvIGxvdyAxNiAqLwogICAgc3VtICs9IChzdW0gPj4gMTYpOyAgICAgICAgIC8qIGFkZCBjYXJyeSAqLwogICAgYW5zd2VyID0gfnN1bTsgICAgICAgICAgICAgIC8qIHRydW5jYXRlIHRvIDE2IGJpdHMgKi8KICAgIHJldHVybiAoYW5zd2VyKTsKfQoKLyoKICogU3VidHJhY3QgMiB0aW1ldmFsIHN0cnVjdHM6ICBvdXQgPSBvdXQgLSBpbi4KICogT3V0IGlzIGFzc3VtZWQgdG8gYmUgPj0gaW4uCiAqLwp2b2lkCnR2c3ViKHJlZ2lzdGVyIHN0cnVjdCB0aW1ldmFsICpvdXQsIHJlZ2lzdGVyIHN0cnVjdCB0aW1ldmFsICppbikKewoKICAgIGlmICgob3V0LT50dl91c2VjIC09IGluLT50dl91c2VjKSA8IDApIHsKICAgICAgICAtLW91dC0+dHZfc2VjOwogICAgICAgIG91dC0+dHZfdXNlYyArPSAxMDAwMDAwOwogICAgfQogICAgb3V0LT50dl9zZWMgLT0gaW4tPnR2X3NlYzsKfQoKCnN0cnVjdCBob3N0aW5mbyAqCmdldGhvc3RpbmZvKHJlZ2lzdGVyIGNoYXIgKmhvc3RuYW1lKQp7CiAgICByZWdpc3RlciBpbnQgICAgbjsKICAgIHJlZ2lzdGVyIHN0cnVjdCBob3N0ZW50ICpocCA9IE5VTEw7CiAgICByZWdpc3RlciBzdHJ1Y3QgaG9zdGluZm8gKmhpID0gTlVMTDsKICAgIHJlZ2lzdGVyIGNoYXIgKipwID0gTlVMTDsKICAgIHJlZ2lzdGVyIHVfaW50MzJfdCBhZGRyLCAqYXAgPSBOVUxMOwoKICAgIGlmIChzdHJsZW4oaG9zdG5hbWUpID4gNjQpIHsKICAgICAgICBGcHJpbnRmKHN0ZGVyciwgIiVzOiBob3N0bmFtZSBcIiUuMzJzLi4uXCIgaXMgdG9vIGxvbmdcbiIsCiAgICAgICAgICAgICAgICAidHJhY2Vyb3V0ZSIsIGhvc3RuYW1lKTsKICAgICAgICBleGl0KDEpOwogICAgfQogICAgaGkgPSBjYWxsb2MoMSwgc2l6ZW9mKCpoaSkpOwogICAgaWYgKGhpID09IE5VTEwpIHsKICAgICAgICBGcHJpbnRmKHN0ZGVyciwgIiVzOiBjYWxsb2MgJXNcbiIsICJ0cmFjZXJvdXRlIiwgc3RyZXJyb3IoZXJybm8pKTsKICAgICAgICBleGl0KDEpOwogICAgfQogICAgYWRkciA9IGluZXRfYWRkcihob3N0bmFtZSk7CiAgICBpZiAoKGludDMyX3QpIGFkZHIgIT0gLTEpIHsKICAgICAgICBoaS0+bmFtZSA9IHN0cmR1cChob3N0bmFtZSk7CiAgICAgICAgaGktPm4gPSAxOwogICAgICAgIGhpLT5hZGRycyA9IGNhbGxvYygxLCBzaXplb2YoaGktPmFkZHJzWzBdKSk7CiAgICAgICAgaWYgKGhpLT5hZGRycyA9PSBOVUxMKSB7CiAgICAgICAgICAgIEZwcmludGYoc3RkZXJyLCAiJXM6IGNhbGxvYyAlc1xuIiwgInRyYWNlcm91dGUiLCBzdHJlcnJvcihlcnJubykpOwogICAgICAgICAgICBleGl0KDEpOwogICAgICAgIH0KICAgICAgICBoaS0+YWRkcnNbMF0gPSBhZGRyOwogICAgICAgIHJldHVybiAoaGkpOwogICAgfQoKICAgIGhwID0gbmV0c25tcF9nZXRob3N0YnluYW1lKGhvc3RuYW1lKTsKICAgIGlmIChocCA9PSBOVUxMKSB7CiAgICAgICAgRnByaW50ZihzdGRlcnIsICIlczogdW5rbm93biBob3N0ICVzXG4iLCAidHJhY2Vyb3V0ZSIsIGhvc3RuYW1lKTsKICAgICAgICBwcmludGYoImhwPU5VTExcbiIpOwogICAgICAgIGV4aXQoMSk7CiAgICB9CiAgICBpZiAoaHAtPmhfYWRkcnR5cGUgIT0gQUZfSU5FVCB8fCBocC0+aF9sZW5ndGggIT0gNCkgewogICAgICAgIEZwcmludGYoc3RkZXJyLCAiJXM6IGJhZCBob3N0ICVzXG4iLCAidHJhY2Vyb3V0ZSIsIGhvc3RuYW1lKTsKICAgICAgICBleGl0KDEpOwogICAgfQogICAgaGktPm5hbWUgPSBzdHJkdXAoaHAtPmhfbmFtZSk7CiAgICBmb3IgKG4gPSAwLCBwID0gaHAtPmhfYWRkcl9saXN0OyAqcCAhPSBOVUxMOyArK24sICsrcCkKICAgICAgICBjb250aW51ZTsKICAgIGhpLT5uID0gbjsKICAgIGhpLT5hZGRycyA9IGNhbGxvYyhuLCBzaXplb2YoaGktPmFkZHJzWzBdKSk7CiAgICBpZiAoaGktPmFkZHJzID09IE5VTEwpIHsKICAgICAgICBGcHJpbnRmKHN0ZGVyciwgIiVzOiBjYWxsb2MgJXNcbiIsICJ0cmFjZXJvdXRlIiwgc3RyZXJyb3IoZXJybm8pKTsKICAgICAgICBleGl0KDEpOwogICAgfQogICAgZm9yIChhcCA9IGhpLT5hZGRycywgcCA9IGhwLT5oX2FkZHJfbGlzdDsgKnAgIT0gTlVMTDsgKythcCwgKytwKQogICAgICAgIG1lbWNweShhcCwgKnAsIHNpemVvZigqYXApKTsKICAgIHJldHVybiAoaGkpOwp9Cgp2b2lkCmZyZWVob3N0aW5mbyhyZWdpc3RlciBzdHJ1Y3QgaG9zdGluZm8gKmhpKQp7CiAgICBpZiAoaGktPm5hbWUgIT0gTlVMTCkgewogICAgICAgIGZyZWUoaGktPm5hbWUpOwogICAgICAgIGhpLT5uYW1lID0gTlVMTDsKICAgIH0KICAgIGZyZWUoKGNoYXIgKikgaGktPmFkZHJzKTsKICAgIGZyZWUoKGNoYXIgKikgaGkpOwp9Cgp2b2lkCnNldHNpbihyZWdpc3RlciBzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNpbiwgcmVnaXN0ZXIgdV9pbnQzMl90IGFkZHIpCnsKCiAgICBtZW1zZXQoc2luLCAwLCBzaXplb2YoKnNpbikpOwojaWZkZWYgSEFWRV9TT0NLQUREUl9TQV9MRU4KICAgIHNpbi0+c2luX2xlbiA9IHNpemVvZigqc2luKTsKI2VuZGlmCiAgICBzaW4tPnNpbl9mYW1pbHkgPSBBRl9JTkVUOwogICAgc2luLT5zaW5fYWRkci5zX2FkZHIgPSBhZGRyOwp9CgoKLyoKICogUmV0dXJuIHRoZSBzb3VyY2UgYWRkcmVzcyBmb3IgdGhlIGdpdmVuIGRlc3RpbmF0aW9uIGFkZHJlc3MKICovCmNvbnN0IGNoYXIgICAgICoKZmluZHNhZGRyKHJlZ2lzdGVyIGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9pbiAqdG8sCiAgICAgICAgICByZWdpc3RlciBzdHJ1Y3Qgc29ja2FkZHJfaW4gKmZyb20pCnsKICAgIHJlZ2lzdGVyIGludCAgICBpLCBuOwogICAgcmVnaXN0ZXIgRklMRSAgKmY7CiAgICByZWdpc3RlciB1X2ludDMyX3QgbWFzazsKICAgIHVfaW50MzJfdCAgICAgICBkZXN0LCB0bWFzazsKICAgIHN0cnVjdCBpZmFkZHJsaXN0ICphbDsKICAgIGNoYXIgICAgICAgICAgICBidWZbMjU2XSwgdGRldmljZVsyNTZdLCBkZXZpY2VbMjU2XTsKICAgIHN0YXRpYyBjaGFyICAgICBlcnJidWZbMTMyXTsKICAgIHN0YXRpYyBjb25zdCBjaGFyIHJvdXRlW10gPSAiL3Byb2MvbmV0L3JvdXRlIjsKCiAgICBpZiAoKGYgPSBmb3Blbihyb3V0ZSwgInIiKSkgPT0gTlVMTCkgewogICAgICAgIHNwcmludGYoZXJyYnVmLCAib3BlbiAlczogJS4xMjhzIiwgcm91dGUsIHN0cmVycm9yKGVycm5vKSk7CiAgICAgICAgcmV0dXJuIChlcnJidWYpOwogICAgfQoKICAgIC8qCiAgICAgKiBGaW5kIHRoZSBhcHByb3ByaWF0ZSBpbnRlcmZhY2UgCiAgICAgKi8KICAgIG4gPSAwOwogICAgbWFzayA9IDA7CiAgICBkZXZpY2VbMF0gPSAnXDAnOwogICAgd2hpbGUgKGZnZXRzKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGYpICE9IE5VTEwpIHsKICAgICAgICArK247CiAgICAgICAgaWYgKG4gPT0gMSAmJiBzdHJuY21wKGJ1ZiwgIklmYWNlIiwgNSkgPT0gMCkKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgaWYgKChpID0gc3NjYW5mKGJ1ZiwgIiVzICV4ICUqcyAlKnMgJSpzICUqcyAlKnMgJXgiLAogICAgICAgICAgICAgICAgICAgICAgICB0ZGV2aWNlLCAmZGVzdCwgJnRtYXNrKSkgIT0gMykKICAgICAgICAgICAgcmV0dXJuICgianVuayBpbiBidWZmZXIiKTsKICAgICAgICBpZiAoKHRvLT5zaW5fYWRkci5zX2FkZHIgJiB0bWFzaykgPT0gZGVzdCAmJgogICAgICAgICAgICAodG1hc2sgPiBtYXNrIHx8IG1hc2sgPT0gMCkpIHsKICAgICAgICAgICAgbWFzayA9IHRtYXNrOwogICAgICAgICAgICBzdHJjcHkoZGV2aWNlLCB0ZGV2aWNlKTsKICAgICAgICB9CiAgICB9CiAgICBmY2xvc2UoZik7CgogICAgaWYgKGRldmljZVswXSA9PSAnXDAnKQogICAgICAgIHJldHVybiAoIkNhbid0IGZpbmQgaW50ZXJmYWNlIik7CgogICAgLyoKICAgICAqIEdldCB0aGUgaW50ZXJmYWNlIGFkZHJlc3MgbGlzdCAKICAgICAqLwogICAgaWYgKChuID0gaWZhZGRybGlzdCgmYWwsIGVycmJ1ZikpIDwgMCkKICAgICAgICByZXR1cm4gKGVycmJ1Zik7CgogICAgaWYgKG4gPT0gMCkKICAgICAgICByZXR1cm4gKCJDYW4ndCBmaW5kIGFueSBuZXR3b3JrIGludGVyZmFjZXMiKTsKCiAgICAvKgogICAgICogRmluZCBvdXIgYXBwcm9wcmlhdGUgc291cmNlIGFkZHJlc3MgCiAgICAgKi8KICAgIGZvciAoaSA9IG47IGkgPiAwOyAtLWksICsrYWwpCiAgICAgICAgaWYgKHN0cmNtcChkZXZpY2UsIGFsLT5kZXZpY2UpID09IDApCiAgICAgICAgICAgIGJyZWFrOwogICAgaWYgKGkgPD0gMCkgewogICAgICAgIHNwcmludGYoZXJyYnVmLCAiQ2FuJ3QgZmluZCBpbnRlcmZhY2UgXCIlLjMyc1wiIiwgZGV2aWNlKTsKICAgICAgICByZXR1cm4gKGVycmJ1Zik7CiAgICB9CgogICAgc2V0c2luKGZyb20sIGFsLT5hZGRyKTsKICAgIHJldHVybiAoTlVMTCk7Cn0KCmludAppZmFkZHJsaXN0KHJlZ2lzdGVyIHN0cnVjdCBpZmFkZHJsaXN0ICoqaXBhZGRycCwgcmVnaXN0ZXIgY2hhciAqZXJyYnVmKQp7CiAgICByZWdpc3RlciBpbnQgICAgZmQsIG5pcGFkZHI7CiNpZmRlZiBIQVZFX1NPQ0tBRERSX1NBX0xFTgogICAgcmVnaXN0ZXIgaW50ICAgIG47CiNlbmRpZgogICAgcmVnaXN0ZXIgc3RydWN0IGlmcmVxICppZnJwLCAqaWZlbmQsICppZm5leHQ7CiAgICByZWdpc3RlciBzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNpbjsKICAgIHJlZ2lzdGVyIHN0cnVjdCBpZmFkZHJsaXN0ICphbDsKICAgIHN0cnVjdCBpZmNvbmYgICBpZmM7CiAgICBzdHJ1Y3QgaWZyZXEgICAgaWJ1ZlsoMzIgKiAxMDI0KSAvIHNpemVvZihzdHJ1Y3QgaWZyZXEpXSwgaWZyOwojZGVmaW5lIE1BWF9JUEFERFIgKHNpemVvZihpYnVmKSAvIHNpemVvZihpYnVmWzBdKSkKICAgIHN0YXRpYyBzdHJ1Y3QgaWZhZGRybGlzdCBpZmFkZHJsaXN0W01BWF9JUEFERFJdOwogICAgY2hhciAgICAgICAgICAgIGRldmljZVtzaXplb2YoaWZyLmlmcl9uYW1lKSArIDFdOwoKICAgIGZkID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIDApOwogICAgaWYgKGZkIDwgMCkgewogICAgICAgICh2b2lkKSBzcHJpbnRmKGVycmJ1ZiwgInNvY2tldDogJXMiLCBzdHJlcnJvcihlcnJubykpOwogICAgICAgIHJldHVybiAoLTEpOwogICAgfQogICAgaWZjLmlmY19sZW4gPSBzaXplb2YoaWJ1Zik7CiAgICBpZmMuaWZjX2J1ZiA9IChjYWRkcl90KSBpYnVmOwoKICAgIGlmIChpb2N0bChmZCwgU0lPQ0dJRkNPTkYsIChjaGFyICopICZpZmMpIDwgMCB8fAogICAgICAgIGlmYy5pZmNfbGVuIDwgc2l6ZW9mKHN0cnVjdCBpZnJlcSkpIHsKICAgICAgICBpZiAoZXJybm8gPT0gRUlOVkFMKQogICAgICAgICAgICAodm9pZCkgc3ByaW50ZihlcnJidWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJTSU9DR0lGQ09ORjogaWZyZXEgc3RydWN0IHRvbyBzbWFsbCAoJWQgYnl0ZXMpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludClzaXplb2YoaWJ1ZikpOwogICAgICAgIGVsc2UKICAgICAgICAgICAgKHZvaWQpIHNwcmludGYoZXJyYnVmLCAiU0lPQ0dJRkNPTkY6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKICAgICAgICAodm9pZCkgY2xvc2UoZmQpOwogICAgICAgIHJldHVybiAoLTEpOwogICAgfQogICAgaWZycCA9IGlidWY7CiAgICBpZmVuZCA9IChzdHJ1Y3QgaWZyZXEgKikgKChjaGFyICopIGlidWYgKyBpZmMuaWZjX2xlbik7CgogICAgYWwgPSBpZmFkZHJsaXN0OwogICAgbmlwYWRkciA9IDA7CiAgICBmb3IgKDsgaWZycCA8IGlmZW5kOyBpZnJwID0gaWZuZXh0KSB7CiNpZmRlZiBIQVZFX1NPQ0tBRERSX1NBX0xFTgogICAgICAgIG4gPSBpZnJwLT5pZnJfYWRkci5zYV9sZW4gKyBzaXplb2YoaWZycC0+aWZyX25hbWUpOwogICAgICAgIGlmIChuIDwgc2l6ZW9mKCppZnJwKSkKICAgICAgICAgICAgaWZuZXh0ID0gaWZycCArIDE7CiAgICAgICAgZWxzZQogICAgICAgICAgICBpZm5leHQgPSAoc3RydWN0IGlmcmVxICopICgoY2hhciAqKSBpZnJwICsgbik7CiAgICAgICAgaWYgKGlmcnAtPmlmcl9hZGRyLnNhX2ZhbWlseSAhPSBBRl9JTkVUKQogICAgICAgICAgICBjb250aW51ZTsKI2Vsc2UKICAgICAgICBpZm5leHQgPSBpZnJwICsgMTsKI2VuZGlmCiAgICAgICAgLyoKICAgICAgICAgKiBOZWVkIGEgdGVtcGxhdGUgdG8gcHJlc2VydmUgYWRkcmVzcyBpbmZvIHRoYXQgaXMKICAgICAgICAgKiB1c2VkIGJlbG93IHRvIGxvY2F0ZSB0aGUgbmV4dCBlbnRyeS4gIChPdGhlcndpc2UsCiAgICAgICAgICogU0lPQ0dJRkZMQUdTIHN0b21wcyBvdmVyIGl0IGJlY2F1c2UgdGhlIHJlcXVlc3RzCiAgICAgICAgICogYXJlIHJldHVybmVkIGluIGEgdW5pb24uKQogICAgICAgICAqLwogICAgICAgIHN0cmxjcHkoaWZyLmlmcl9uYW1lLCBpZnJwLT5pZnJfbmFtZSwgc2l6ZW9mKGlmci5pZnJfbmFtZSkpOwogICAgICAgIGlmIChpb2N0bChmZCwgU0lPQ0dJRkZMQUdTLCAoY2hhciAqKSAmaWZyKSA8IDApIHsKICAgICAgICAgICAgaWYgKGVycm5vID09IEVOWElPKQogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICh2b2lkKSBzcHJpbnRmKGVycmJ1ZiwgIlNJT0NHSUZGTEFHUzogJS4qczogJXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSBzaXplb2YoaWZyLmlmcl9uYW1lKSwgaWZyLmlmcl9uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcihlcnJubykpOwogICAgICAgICAgICAodm9pZCkgY2xvc2UoZmQpOwogICAgICAgICAgICByZXR1cm4gKC0xKTsKICAgICAgICB9CgogICAgICAgIC8qCiAgICAgICAgICogTXVzdCBiZSB1cCAKICAgICAgICAgKi8KICAgICAgICBpZiAoKGlmci5pZnJfZmxhZ3MgJiBJRkZfVVApID09IDApCiAgICAgICAgICAgIGNvbnRpbnVlOwoKICAgICAgICBzcHJpbnRmKGRldmljZSwgIiUuKnMiLCAoaW50KSBzaXplb2YoaWZyLmlmcl9uYW1lKSwgaWZyLmlmcl9uYW1lKTsKI2lmZGVmIHN1bgogICAgICAgIC8qCiAgICAgICAgICogSWdub3JlIHN1biB2aXJ0dWFsIGludGVyZmFjZXMgCiAgICAgICAgICovCiAgICAgICAgaWYgKHN0cmNocihkZXZpY2UsICc6JykgIT0gTlVMTCkKICAgICAgICAgICAgY29udGludWU7CiNlbmRpZgogICAgICAgIGlmIChpb2N0bChmZCwgU0lPQ0dJRkFERFIsIChjaGFyICopICZpZnIpIDwgMCkgewogICAgICAgICAgICAodm9pZCkgc3ByaW50ZihlcnJidWYsICJTSU9DR0lGQUREUjogJXM6ICVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLCBzdHJlcnJvcihlcnJubykpOwogICAgICAgICAgICAodm9pZCkgY2xvc2UoZmQpOwogICAgICAgICAgICByZXR1cm4gKC0xKTsKICAgICAgICB9CgogICAgICAgIGlmIChuaXBhZGRyID49IE1BWF9JUEFERFIpIHsKICAgICAgICAgICAgKHZvaWQpIHNwcmludGYoZXJyYnVmLCAiVG9vIG1hbnkgaW50ZXJmYWNlcyAoJWQpIiwgbmlwYWRkcik7CiAgICAgICAgICAgICh2b2lkKSBjbG9zZShmZCk7CiAgICAgICAgICAgIHJldHVybiAoLTEpOwogICAgICAgIH0KICAgICAgICBzaW4gPSAoc3RydWN0IHNvY2thZGRyX2luICopICZpZnIuaWZyX2FkZHI7CiAgICAgICAgYWwtPmFkZHIgPSBzaW4tPnNpbl9hZGRyLnNfYWRkcjsKICAgICAgICBhbC0+ZGV2aWNlID0gc3RyZHVwKGRldmljZSk7CiAgICAgICAgKythbDsKICAgICAgICArK25pcGFkZHI7CiAgICB9CiAgICAodm9pZCkgY2xvc2UoZmQpOwoKICAgICppcGFkZHJwID0gaWZhZGRybGlzdDsKICAgIHJldHVybiAobmlwYWRkcik7Cn0K