LyogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29weXJpZ2h0KHMpLiAgU2VlCiAqIHRoZSBOZXQtU05NUCdzIENPUFlJTkcgZmlsZSBmb3IgbW9yZSBkZXRhaWxzIGFuZCBvdGhlciBjb3B5cmlnaHRzCiAqIHRoYXQgbWF5IGFwcGx5OgogKi8KLyoKICogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBjb3B5cmlnaHRlZCBieToKICogQ29weXJpZ2h0IKkgMjAwMyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqIFVzZSBpcyBzdWJqZWN0IHRvIGxpY2Vuc2UgdGVybXMgc3BlY2lmaWVkIGluIHRoZSBDT1BZSU5HIGZpbGUKICogZGlzdHJpYnV0ZWQgd2l0aCB0aGUgTmV0LVNOTVAgcGFja2FnZS4KICovCgovKgogKiAgSG9zdCBSZXNvdXJjZXMgTUlCIC0gUnVubmluZyBTb2Z0d2FyZSBncm91cCBpbXBsZW1lbnRhdGlvbiAtIGhyX3N3cnVuLmMKICogICAgICAoYWxzbyBpbmNsdWRlcyBSdW5uaW5nIFNvZnR3YXJlIFBlcmZvcm1hbmNlIGdyb3VwICkKICoKICovCgojaW5jbHVkZSA8bmV0LXNubXAvbmV0LXNubXAtY29uZmlnLmg+CiNpZiBIQVZFX1NURExJQl9ICiNpbmNsdWRlIDxzdGRsaWIuaD4KI2VuZGlmCiNpbmNsdWRlIDxmY250bC5oPgojaWYgSEFWRV9VTklTVERfSAojaW5jbHVkZSA8dW5pc3RkLmg+CiNlbmRpZgoKI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgojaW5jbHVkZSA8Y3R5cGUuaD4KI2lmIEhBVkVfU1lTX1BTVEFUX0gKI2luY2x1ZGUgPHN5cy9wc3RhdC5oPgojZW5kaWYKI2lmIEhBVkVfU1lTX1VTRVJfSAojaWZkZWYgc29sYXJpczIKI2luY2x1ZGUgPGxpYmdlbi5oPgojZGVmaW5lIF9LTUVNVVNFUgojZW5kaWYKI2luY2x1ZGUgPHN5cy91c2VyLmg+CiNlbmRpZgojaWYgSEFWRV9TWVNfUFJPQ19ICiNpbmNsdWRlIDxzeXMvcHJvYy5oPgojZW5kaWYKI2lmIEhBVkVfS1ZNX0gKI2luY2x1ZGUgPGt2bS5oPgojZW5kaWYKI2lmIEhBVkVfU1lTX1NZU0NUTF9ICiNpbmNsdWRlIDxzeXMvc3lzY3RsLmg+CiNlbmRpZgojaWYgSEFWRV9ESVJFTlRfSCAmJiAhZGVmaW5lZChjeWd3aW4pCiNpbmNsdWRlIDxkaXJlbnQuaD4KI2Vsc2UKIyBkZWZpbmUgZGlyZW50IGRpcmVjdAojIGlmIEhBVkVfU1lTX05ESVJfSAojICBpbmNsdWRlIDxzeXMvbmRpci5oPgojIGVuZGlmCiMgaWYgSEFWRV9TWVNfRElSX0gKIyAgaW5jbHVkZSA8c3lzL2Rpci5oPgojIGVuZGlmCiMgaWYgSEFWRV9ORElSX0gKIyAgaW5jbHVkZSA8bmRpci5oPgojIGVuZGlmCiNlbmRpZgojaWZkZWYgY3lnd2luCiNpbmNsdWRlIDx3aW5kb3dzLmg+CiNpbmNsdWRlIDxzeXMvY3lnd2luLmg+CiNpbmNsdWRlIDx0bGhlbHAzMi5oPgojaW5jbHVkZSA8cHNhcGkuaD4KI2VuZGlmCgojaWYgX1NMQVNIX1BST0NfTUVUSE9EXwojaW5jbHVkZSA8cHJvY2ZzLmg+CiNlbmRpZgoKI2lmIEhBVkVfU1RSSU5HX0gKI2luY2x1ZGUgPHN0cmluZy5oPgojZWxzZQojaW5jbHVkZSA8c3RyaW5ncy5oPgojZW5kaWYKCiNpbmNsdWRlIDxzdGRpby5oPgoKI2luY2x1ZGUgPG5ldC1zbm1wL291dHB1dF9hcGkuaD4KI2luY2x1ZGUgImhvc3RfcmVzLmgiCiNpbmNsdWRlICJocl9zd3J1bi5oIgojaW5jbHVkZSA8bmV0LXNubXAvYWdlbnQvYXV0b19ubGlzdC5oPgojaW5jbHVkZSAia2VybmVsLmgiCiNpZmRlZiBzb2xhcmlzMgojaWYgX1NMQVNIX1BST0NfTUVUSE9EXyAmJiBkZWZpbmVkIF9JTFAzMgojaW5jbHVkZSA8bmV0LXNubXAvYWdlbnQvY2FjaGVfaGFuZGxlci5oPgojaW5jbHVkZSA8bmV0LXNubXAvYWdlbnQvaGFyZHdhcmUvbWVtb3J5Lmg+CiNlbmRpZgoKI2luY2x1ZGUgImtlcm5lbF9zdW5vczUuaCIKI2VuZGlmCiNpZiBkZWZpbmVkKGFpeDQpIHx8IGRlZmluZWQoYWl4NSkgfHwgZGVmaW5lZChhaXg2KQojaW5jbHVkZSA8cHJvY2luZm8uaD4KI2luY2x1ZGUgPHN5cy90eXBlcy5oPgojZW5kaWYKCiAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKgoJICoKCSAqICBJbml0aWFsaXNhdGlvbiAmIGNvbW1vbiBpbXBsZW1lbnRhdGlvbiBmdW5jdGlvbnMKCSAqCgkgKioqKioqKioqKioqKioqKioqKioqLwp2b2lkICAgICAgICAgICAgSW5pdF9IUl9TV1J1bih2b2lkKTsKaW50ICAgICAgICAgICAgIEdldF9OZXh0X0hSX1NXUnVuKHZvaWQpOwp2b2lkICAgICAgICAgICAgRW5kX0hSX1NXUnVuKHZvaWQpOwppbnQgICAgICAgICAgICAgaGVhZGVyX2hyc3dydW4oc3RydWN0IHZhcmlhYmxlICosIG9pZCAqLCBzaXplX3QgKiwgaW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICosIFdyaXRlTWV0aG9kICoqKTsKaW50ICAgICAgICAgICAgIGhlYWRlcl9ocnN3cnVuRW50cnkoc3RydWN0IHZhcmlhYmxlICosIG9pZCAqLCBzaXplX3QgKiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50LCBzaXplX3QgKiwgV3JpdGVNZXRob2QgKiopOwoKI2lmZGVmIGR5bml4CnBpZF90ICAgICAgICAgICBuZXh0cHJvYzsKc3RhdGljIHBycHNpbmZvX3QgbG93cHNpbmZvLCBteXBzaW5mbzsKI2VuZGlmCiNpZmRlZiBjeWd3aW4Kc3RhdGljIHN0cnVjdCBleHRlcm5hbF9waW5mbyAqY3VycHJvYzsKc3RhdGljIHN0cnVjdCBleHRlcm5hbF9waW5mbyBsb3dwcm9jOwojZWxpZiAhZGVmaW5lZChsaW51eCkKc3RhdGljIGludCAgICAgIExvd1Byb2NJbmRleDsKI2VuZGlmCiNpZiBkZWZpbmVkKGhwdXgxMCkgfHwgZGVmaW5lZChocHV4MTEpCnN0cnVjdCBwc3Rfc3RhdHVzICpwcm9jX3RhYmxlOwpzdHJ1Y3QgcHN0X2R5bmFtaWMgcHN0X2R5bjsKI2VsaWYgSEFWRV9LVk1fR0VUUFJPQzIKc3RydWN0IGtpbmZvX3Byb2MyICpwcm9jX3RhYmxlOwojZWxpZiBIQVZFX0tWTV9HRVRQUk9DUwpzdHJ1Y3Qga2luZm9fcHJvYyAqcHJvY190YWJsZTsKI2VsaWYgZGVmaW5lZChzb2xhcmlzMikKaW50ICAgICAgICAgICAgKnByb2NfdGFibGU7CiNlbGlmIGRlZmluZWQoYWl4NCkgfHwgZGVmaW5lZChhaXg1KSB8fCBkZWZpbmVkKGFpeDYpCnN0cnVjdCBwcm9jc2luZm8gKnByb2NfdGFibGU7CiNlbHNlCnN0cnVjdCBwcm9jICAgICpwcm9jX3RhYmxlOwojZW5kaWYKI2lmbmRlZiBkeW5peAppbnQgICAgICAgICAgICAgY3VycmVudF9wcm9jX2VudHJ5OwojZW5kaWYKCgojZGVmaW5lCUhSU1dSVU5fT1NJTkRFWAkJMQoKI2RlZmluZQlIUlNXUlVOX0lOREVYCQkyCiNkZWZpbmUJSFJTV1JVTl9OQU1FCQkzCiNkZWZpbmUJSFJTV1JVTl9JRAkJNAojZGVmaW5lCUhSU1dSVU5fUEFUSAkJNQojZGVmaW5lCUhSU1dSVU5fUEFSQU1TCQk2CiNkZWZpbmUJSFJTV1JVTl9UWVBFCQk3CiNkZWZpbmUJSFJTV1JVTl9TVEFUVVMJCTgKCiNkZWZpbmUJSFJTV1JVTlBFUkZfQ1BVCQk5CiNkZWZpbmUJSFJTV1JVTlBFUkZfTUVNCQkxMAoKc3RydWN0IHZhcmlhYmxlNCBocnN3cnVuX3ZhcmlhYmxlc1tdID0gewogICAge0hSU1dSVU5fT1NJTkRFWCwgQVNOX0lOVEVHRVIsIE5FVFNOTVBfT0xEQVBJX1JPTkxZLAogICAgIHZhcl9ocnN3cnVuLCAxLCB7MX19LAogICAge0hSU1dSVU5fSU5ERVgsIEFTTl9JTlRFR0VSLCBORVRTTk1QX09MREFQSV9ST05MWSwKICAgICB2YXJfaHJzd3J1biwgMywgezIsIDEsIDF9fSwKICAgIHtIUlNXUlVOX05BTUUsIEFTTl9PQ1RFVF9TVFIsIE5FVFNOTVBfT0xEQVBJX1JPTkxZLAogICAgIHZhcl9ocnN3cnVuLCAzLCB7MiwgMSwgMn19LAogICAge0hSU1dSVU5fSUQsIEFTTl9PQkpFQ1RfSUQsIE5FVFNOTVBfT0xEQVBJX1JPTkxZLAogICAgIHZhcl9ocnN3cnVuLCAzLCB7MiwgMSwgM319LAogICAge0hSU1dSVU5fUEFUSCwgQVNOX09DVEVUX1NUUiwgTkVUU05NUF9PTERBUElfUk9OTFksCiAgICAgdmFyX2hyc3dydW4sIDMsIHsyLCAxLCA0fX0sCiAgICB7SFJTV1JVTl9QQVJBTVMsIEFTTl9PQ1RFVF9TVFIsIE5FVFNOTVBfT0xEQVBJX1JPTkxZLAogICAgIHZhcl9ocnN3cnVuLCAzLCB7MiwgMSwgNX19LAogICAge0hSU1dSVU5fVFlQRSwgQVNOX0lOVEVHRVIsIE5FVFNOTVBfT0xEQVBJX1JPTkxZLAogICAgIHZhcl9ocnN3cnVuLCAzLCB7MiwgMSwgNn19LAogICAge0hSU1dSVU5fU1RBVFVTLCBBU05fSU5URUdFUiwgTkVUU05NUF9PTERBUElfUk9OTFksCiAgICAgdmFyX2hyc3dydW4sIDMsIHsyLCAxLCA3fX0KfTsKCnN0cnVjdCB2YXJpYWJsZTQgaHJzd3J1bnBlcmZfdmFyaWFibGVzW10gPSB7CiAgICB7SFJTV1JVTlBFUkZfQ1BVLCBBU05fSU5URUdFUiwgTkVUU05NUF9PTERBUElfUk9OTFksCiAgICAgdmFyX2hyc3dydW4sIDMsIHsxLCAxLCAxfX0sCiAgICB7SFJTV1JVTlBFUkZfTUVNLCBBU05fSU5URUdFUiwgTkVUU05NUF9PTERBUElfUk9OTFksCiAgICAgdmFyX2hyc3dydW4sIDMsIHsxLCAxLCAyfX0KfTsKCm9pZCAgICAgICAgICAgICBocnN3cnVuX3ZhcmlhYmxlc19vaWRbXSA9IHsgMSwgMywgNiwgMSwgMiwgMSwgMjUsIDQgfTsKb2lkICAgICAgICAgICAgIGhyc3dydW5wZXJmX3ZhcmlhYmxlc19vaWRbXSA9IHsgMSwgMywgNiwgMSwgMiwgMSwgMjUsIDUgfTsKCiNpZmRlZiBjeWd3aW4KCi8qCiAqIGEgbG90IG9mIHRoaXMgaXMgInN0b2xlbiIgZnJvbSBjeWd3aW4gcHMuY2MKICovCgp0eXBlZGVmICAgICAgICAgQk9PTChXSU5BUEkgKiBFTlVNUFJPQ0VTU01PRFVMRVMpIChIQU5ETEUgaFByb2Nlc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhNT0RVTEUgKiBscGhNb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGNiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUERXT1JEIGxwY2JOZWVkZWQpOwoKdHlwZWRlZiAgICAgICAgIERXT1JEKFdJTkFQSSAqIEdFVE1PRFVMRUZJTEVOQU1FKSAoSEFORExFIGhQcm9jZXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBITU9EVUxFIGhNb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQVFNUUiBscHN0ckZJbGVOYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBuU2l6ZSk7Cgp0eXBlZGVmICAgICAgICAgRFdPUkQoV0lOQVBJICogR0VUUFJPQ0VTU01FTU9SWUlORk8pIChIQU5ETEUgaFByb2Nlc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBQUk9DRVNTX01FTU9SWV9DT1VOVEVSUwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbWMsIERXT1JEIG5TaXplKTsKCnR5cGVkZWYgICAgICAgICBIQU5ETEUoV0lOQVBJICogQ1JFQVRFU05BUFNIT1QpIChEV09SRCBkd0ZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgdGgzMlByb2Nlc3NJRCk7Cgp0eXBlZGVmICAgICAgICAgQk9PTChXSU5BUEkgKiBQUk9DRVNTV0FMSykgKEhBTkRMRSBoU25hcHNob3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBQUk9DRVNTRU5UUlkzMiBscHBlKTsKCkVOVU1QUk9DRVNTTU9EVUxFUyBteUVudW1Qcm9jZXNzTW9kdWxlczsKR0VUTU9EVUxFRklMRU5BTUUgbXlHZXRNb2R1bGVGaWxlTmFtZUV4OwpDUkVBVEVTTkFQU0hPVCAgbXlDcmVhdGVUb29saGVscDMyU25hcHNob3Q7ClBST0NFU1NXQUxLICAgICBteVByb2Nlc3MzMkZpcnN0OwpQUk9DRVNTV0FMSyAgICAgbXlQcm9jZXNzMzJOZXh0OwpHRVRQUk9DRVNTTUVNT1JZSU5GTyBteUdldFByb2Nlc3NNZW1vcnlJbmZvID0gTlVMTDsKY3lnd2luX2dldGluZm9fdHlwZXMgcXVlcnkgPSBDV19HRVRQSU5GTzsKCnN0YXRpYyBCT09MIFdJTkFQSQpkdW1teXByb2Nlc3Ntb2R1bGVzKEhBTkRMRSBoUHJvY2VzcywKICAgICAgICAgICAgICAgICAgICBITU9EVUxFICogbHBoTW9kdWxlLCBEV09SRCBjYiwgTFBEV09SRCBscGNiTmVlZGVkKQp7CiAgICBscGhNb2R1bGVbMF0gPSAoSE1PRFVMRSkgKiBscGNiTmVlZGVkOwogICAgKmxwY2JOZWVkZWQgPSAxOwogICAgcmV0dXJuIDE7Cn0KCnN0YXRpYyBEV09SRCBXSU5BUEkKR2V0TW9kdWxlRmlsZU5hbWVFeDk1KEhBTkRMRSBoUHJvY2VzcywKICAgICAgICAgICAgICAgICAgICAgIEhNT0RVTEUgaE1vZHVsZSwgTFBUU1RSIGxwc3RyRmlsZU5hbWUsIERXT1JEIG4pCnsKICAgIEhBTkRMRSAgICAgICAgICBoOwogICAgRFdPUkQgICAgICAgICAgIHBpZCA9IChEV09SRCkgaE1vZHVsZTsKICAgIFBST0NFU1NFTlRSWTMyICBwcm9jOwoKICAgIGggPSBteUNyZWF0ZVRvb2xoZWxwMzJTbmFwc2hvdChUSDMyQ1NfU05BUFBST0NFU1MsIDApOwogICAgaWYgKCFoKQogICAgICAgIHJldHVybiAwOwogICAgcHJvYy5kd1NpemUgPSBzaXplb2YocHJvYyk7CiAgICBpZiAobXlQcm9jZXNzMzJGaXJzdChoLCAmcHJvYykpCiAgICAgICAgZG8KICAgICAgICAgICAgaWYgKHByb2MudGgzMlByb2Nlc3NJRCA9PSBwaWQpIHsKICAgICAgICAgICAgICAgIENsb3NlSGFuZGxlKGgpOwogICAgICAgICAgICAgICAgc3RyY3B5KGxwc3RyRmlsZU5hbWUsIHByb2Muc3pFeGVGaWxlKTsKICAgICAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgICAgICB9CiAgICAgICAgd2hpbGUgKG15UHJvY2VzczMyTmV4dChoLCAmcHJvYykpOwogICAgQ2xvc2VIYW5kbGUoaCk7CiAgICByZXR1cm4gMDsKfQoKI2RlZmluZSBGQUNUT1IgKDB4MTlkYjFkZWQ1M2VhNzEwTEwpCiNkZWZpbmUgTlNQRVJTRUMgMTAwMDAwMDBMTAojZGVmaW5lIE5TUEVSTVNFQyAxMDAwMExMCgpzdGF0aWMgdGltZV90ICAgX19zdGRjYWxsCnRvX3RpbWVfdChQRklMRVRJTUUgcHRyKQp7CiAgICBsb25nICAgICAgICAgICAgcmVtOwogICAgbG9uZyBsb25nICAgICAgIHggPQogICAgICAgICgobG9uZyBsb25nKSBwdHItPmR3SGlnaERhdGVUaW1lIDw8IDMyKSArCiAgICAgICAgKCh1bnNpZ25lZCkgcHRyLT5kd0xvd0RhdGVUaW1lKTsKICAgIHggLT0gRkFDVE9SOwogICAgcmVtID0geCAlIE5TUEVSU0VDOwogICAgcmVtICs9IE5TUEVSU0VDIC8gMjsKICAgIHggLz0gTlNQRVJTRUM7CiAgICB4ICs9IHJlbSAvIE5TUEVSU0VDOwogICAgcmV0dXJuIHg7Cn0KCnN0YXRpYyBsb25nCnRvX21zZWMoUEZJTEVUSU1FIHB0cikKewogICAgbG9uZyBsb25nICAgICAgIHggPQogICAgICAgICgobG9uZyBsb25nKSBwdHItPmR3SGlnaERhdGVUaW1lIDw8IDMyKSArCiAgICAgICAgKHVuc2lnbmVkKSBwdHItPmR3TG93RGF0ZVRpbWU7CiAgICB4IC89IE5TUEVSTVNFQzsKICAgIHJldHVybiB4Owp9CgojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGN5Z3dpbiAqLwoKCnZvaWQKaW5pdF9ocl9zd3J1bih2b2lkKQp7CiNpZmRlZiBjeWd3aW4KICAgIE9TVkVSU0lPTklORk8gICB2ZXI7CiAgICBITU9EVUxFICAgICAgICAgaDsKCiAgICBtZW1zZXQoJnZlciwgMCwgc2l6ZW9mIHZlcik7CiAgICB2ZXIuZHdPU1ZlcnNpb25JbmZvU2l6ZSA9IHNpemVvZiB2ZXI7CiAgICBHZXRWZXJzaW9uRXgoJnZlcik7CgogICAgaWYgKHZlci5kd1BsYXRmb3JtSWQgPT0gVkVSX1BMQVRGT1JNX1dJTjMyX05UKSB7CiAgICAgICAgaCA9IExvYWRMaWJyYXJ5KCJwc2FwaS5kbGwiKTsKICAgICAgICBpZiAoaCkgewogICAgICAgICAgICBteUVudW1Qcm9jZXNzTW9kdWxlcyA9CiAgICAgICAgICAgICAgICAoRU5VTVBST0NFU1NNT0RVTEVTKSBHZXRQcm9jQWRkcmVzcyhoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVudW1Qcm9jZXNzTW9kdWxlcyIpOwogICAgICAgICAgICBteUdldE1vZHVsZUZpbGVOYW1lRXggPQogICAgICAgICAgICAgICAgKEdFVE1PRFVMRUZJTEVOQU1FKSBHZXRQcm9jQWRkcmVzcyhoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR2V0TW9kdWxlRmlsZU5hbWVFeEEiKTsKICAgICAgICAgICAgbXlHZXRQcm9jZXNzTWVtb3J5SW5mbyA9CiAgICAgICAgICAgICAgICAoR0VUUFJPQ0VTU01FTU9SWUlORk8pIEdldFByb2NBZGRyZXNzKGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHZXRQcm9jZXNzTWVtb3J5SW5mbyIpOwogICAgICAgICAgICBpZiAobXlFbnVtUHJvY2Vzc01vZHVsZXMgJiYgbXlHZXRNb2R1bGVGaWxlTmFtZUV4KQogICAgICAgICAgICAgICAgcXVlcnkgPSBDV19HRVRQSU5GT19GVUxMOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLCAiaHJfc3dydW4gZmFpbGVkIE5UIGluaXRcbiIpOwogICAgICAgIH0gZWxzZQogICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLCAiaHJfc3dydW4gZmFpbGVkIHRvIGxvYWQgcHNhcGkuZGxsXG4iKTsKICAgIH0gZWxzZSB7CiAgICAgICAgaCA9IEdldE1vZHVsZUhhbmRsZSgiS0VSTkVMMzIuRExMIik7CiAgICAgICAgbXlDcmVhdGVUb29saGVscDMyU25hcHNob3QgPQogICAgICAgICAgICAoQ1JFQVRFU05BUFNIT1QpIEdldFByb2NBZGRyZXNzKGgsICJDcmVhdGVUb29saGVscDMyU25hcHNob3QiKTsKICAgICAgICBteVByb2Nlc3MzMkZpcnN0ID0KICAgICAgICAgICAgKFBST0NFU1NXQUxLKSBHZXRQcm9jQWRkcmVzcyhoLCAiUHJvY2VzczMyRmlyc3QiKTsKICAgICAgICBteVByb2Nlc3MzMk5leHQgPSAoUFJPQ0VTU1dBTEspIEdldFByb2NBZGRyZXNzKGgsICJQcm9jZXNzMzJOZXh0Iik7CiAgICAgICAgbXlFbnVtUHJvY2Vzc01vZHVsZXMgPSBkdW1teXByb2Nlc3Ntb2R1bGVzOwogICAgICAgIG15R2V0TW9kdWxlRmlsZU5hbWVFeCA9IEdldE1vZHVsZUZpbGVOYW1lRXg5NTsKICAgICAgICBpZiAobXlDcmVhdGVUb29saGVscDMyU25hcHNob3QgJiYgbXlQcm9jZXNzMzJGaXJzdAogICAgICAgICAgICAmJiBteVByb2Nlc3MzMk5leHQpCiNpZiAwCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIFRoaXMgZG9lc24ndCB3b3JrIGFmdGVyIGFsbCBvbiBXaW45OCBTRSAKICAgICAgICAgICAgICovCiAgICAgICAgICAgIHF1ZXJ5ID0gQ1dfR0VUUElORk9fRlVMTDsKI2Vsc2UKICAgICAgICAgICAgcXVlcnkgPSBDV19HRVRQSU5GTzsKI2VuZGlmCiAgICAgICAgZWxzZQogICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLCAiaHJfc3dydW4gZmFpbGVkIG5vbi1OVCBpbml0XG4iKTsKICAgIH0KI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjeWd3aW4gKi8KI2lmZGVmIFBST0NfU1lNQk9MCiAgICBhdXRvX25saXN0KFBST0NfU1lNQk9MLCAwLCAwKTsKI2VuZGlmCiNpZmRlZiBOUFJPQ19TWU1CT0wKICAgIGF1dG9fbmxpc3QoTlBST0NfU1lNQk9MLCAwLCAwKTsKI2VuZGlmCgogICAgcHJvY190YWJsZSA9IE5VTEw7CgogICAgUkVHSVNURVJfTUlCKCJob3N0L2hyX3N3cnVuIiwgaHJzd3J1bl92YXJpYWJsZXMsIHZhcmlhYmxlNCwKICAgICAgICAgICAgICAgICBocnN3cnVuX3ZhcmlhYmxlc19vaWQpOwogICAgUkVHSVNURVJfTUlCKCJob3N0L2hyX3N3cnVuIiwgaHJzd3J1bnBlcmZfdmFyaWFibGVzLCB2YXJpYWJsZTQsCiAgICAgICAgICAgICAgICAgaHJzd3J1bnBlcmZfdmFyaWFibGVzX29pZCk7Cn0KCi8qCiAqIGhlYWRlcl9ocnN3cnVuKC4uLgogKiBBcmd1bWVudHM6CiAqIHZwICAgICBJTiAgICAgIC0gcG9pbnRlciB0byB2YXJpYWJsZSBlbnRyeSB0aGF0IHBvaW50cyBoZXJlCiAqIG5hbWUgICAgSU4vT1VUICAtIElOL25hbWUgcmVxdWVzdGVkLCBPVVQvbmFtZSBmb3VuZAogKiBsZW5ndGggIElOL09VVCAgLSBsZW5ndGggb2YgSU4vT1VUIG9pZCdzIAogKiBleGFjdCAgIElOICAgICAgLSBUUlVFIGlmIGFuIGV4YWN0IG1hdGNoIHdhcyByZXF1ZXN0ZWQKICogdmFyX2xlbiBPVVQgICAgIC0gbGVuZ3RoIG9mIHZhcmlhYmxlIG9yIDAgaWYgZnVuY3Rpb24gcmV0dXJuZWQKICogd3JpdGVfbWV0aG9kCiAqIAogKi8KCmludApoZWFkZXJfaHJzd3J1bihzdHJ1Y3QgdmFyaWFibGUgKnZwLAogICAgICAgICAgICAgICBvaWQgKiBuYW1lLAogICAgICAgICAgICAgICBzaXplX3QgKiBsZW5ndGgsCiAgICAgICAgICAgICAgIGludCBleGFjdCwgc2l6ZV90ICogdmFyX2xlbiwgV3JpdGVNZXRob2QgKiogd3JpdGVfbWV0aG9kKQp7CiNkZWZpbmUgSFJTV1JVTl9OQU1FX0xFTkdUSAk5CiAgICBvaWQgICAgICAgICAgICAgbmV3bmFtZVtNQVhfT0lEX0xFTl07CiAgICBpbnQgICAgICAgICAgICAgcmVzdWx0OwoKICAgIERFQlVHTVNHVEwoKCJob3N0L2hyX3N3cnVuIiwgInZhcl9ocnN3cnVuOiAiKSk7CiAgICBERUJVR01TR09JRCgoImhvc3QvaHJfc3dydW4iLCBuYW1lLCAqbGVuZ3RoKSk7CiAgICBERUJVR01TRygoImhvc3QvaHJfc3dydW4iLCAiICVkXG4iLCBleGFjdCkpOwoKICAgIG1lbWNweSgoY2hhciAqKSBuZXduYW1lLCAoY2hhciAqKSB2cC0+bmFtZSwgdnAtPm5hbWVsZW4gKiBzaXplb2Yob2lkKSk7CiAgICBuZXduYW1lW0hSU1dSVU5fTkFNRV9MRU5HVEhdID0gMDsKICAgIHJlc3VsdCA9IHNubXBfb2lkX2NvbXBhcmUobmFtZSwgKmxlbmd0aCwgbmV3bmFtZSwgdnAtPm5hbWVsZW4gKyAxKTsKICAgIGlmICgoZXhhY3QgJiYgKHJlc3VsdCAhPSAwKSkgfHwgKCFleGFjdCAmJiAocmVzdWx0ID49IDApKSkKICAgICAgICByZXR1cm4gKE1BVENIX0ZBSUxFRCk7CiAgICBtZW1jcHkoKGNoYXIgKikgbmFtZSwgKGNoYXIgKikgbmV3bmFtZSwKICAgICAgICAgICAodnAtPm5hbWVsZW4gKyAxKSAqIHNpemVvZihvaWQpKTsKICAgICpsZW5ndGggPSB2cC0+bmFtZWxlbiArIDE7CgogICAgKndyaXRlX21ldGhvZCA9IChXcml0ZU1ldGhvZCopMDsKICAgICp2YXJfbGVuID0gc2l6ZW9mKGxvbmcpOyAgICAvKiBkZWZhdWx0IHRvICdsb25nJyByZXN1bHRzICovCiAgICByZXR1cm4gKE1BVENIX1NVQ0NFRURFRCk7Cn0KCmludApoZWFkZXJfaHJzd3J1bkVudHJ5KHN0cnVjdCB2YXJpYWJsZSAqdnAsCiAgICAgICAgICAgICAgICAgICAgb2lkICogbmFtZSwKICAgICAgICAgICAgICAgICAgICBzaXplX3QgKiBsZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgaW50IGV4YWN0LAogICAgICAgICAgICAgICAgICAgIHNpemVfdCAqIHZhcl9sZW4sIFdyaXRlTWV0aG9kICoqIHdyaXRlX21ldGhvZCkKewojZGVmaW5lIEhSU1dSVU5fRU5UUllfTkFNRV9MRU5HVEgJMTEKICAgIG9pZCAgICAgICAgICAgICBuZXduYW1lW01BWF9PSURfTEVOXTsKICAgIGludCAgICAgICAgICAgICBwaWQsIExvd1BpZCA9IC0xOwogICAgaW50ICAgICAgICAgICAgIHJlc3VsdDsKCiAgICBERUJVR01TR1RMKCgiaG9zdC9ocl9zd3J1biIsICJ2YXJfaHJzd3J1bkVudHJ5OiAiKSk7CiAgICBERUJVR01TR09JRCgoImhvc3QvaHJfc3dydW4iLCBuYW1lLCAqbGVuZ3RoKSk7CiAgICBERUJVR01TRygoImhvc3QvaHJfc3dydW4iLCAiICVkXG4iLCBleGFjdCkpOwoKICAgIG1lbWNweSgoY2hhciAqKSBuZXduYW1lLCAoY2hhciAqKSB2cC0+bmFtZSwgdnAtPm5hbWVsZW4gKiBzaXplb2Yob2lkKSk7CgogICAgLyoKICAgICAqICBGaW5kIHRoZSAibmV4dCIgcnVubmluZyBwcm9jZXNzCiAgICAgKi8KICAgIEluaXRfSFJfU1dSdW4oKTsKICAgIGZvciAoOzspIHsKICAgICAgICBwaWQgPSBHZXRfTmV4dF9IUl9TV1J1bigpOwojaWZuZGVmIGxpbnV4CiNpZm5kZWYgZHluaXgKICAgICAgICBERUJVR01TRygoImhvc3QvaHJfc3dydW4iLAogICAgICAgICAgICAgICAgICAiKGluZGV4ICVkIChlbnRyeSAjJWQpIC4uLi4iLCBwaWQsIGN1cnJlbnRfcHJvY19lbnRyeSkpOwojZWxzZQogICAgICAgIERFQlVHTVNHKCgiaG9zdC9ocl9zd3J1biIsICJwaWQgJWQ7IG5leHRwcm9jICVkIC4uLi4iLCBwaWQsCiAgICAgICAgICAgICAgICAgIG5leHRwcm9jKSk7CiNlbmRpZgojZW5kaWYKICAgICAgICBpZiAocGlkID09IC0xKQogICAgICAgICAgICBicmVhazsKICAgICAgICBuZXduYW1lW0hSU1dSVU5fRU5UUllfTkFNRV9MRU5HVEhdID0gcGlkOwogICAgICAgIERFQlVHTVNHT0lEKCgiaG9zdC9ocl9zd3J1biIsIG5ld25hbWUsICpsZW5ndGgpKTsKICAgICAgICBERUJVR01TRygoImhvc3QvaHJfc3dydW4iLCAiXG4iKSk7CiAgICAgICAgcmVzdWx0ID0gc25tcF9vaWRfY29tcGFyZShuYW1lLCAqbGVuZ3RoLCBuZXduYW1lLCB2cC0+bmFtZWxlbiArIDEpOwogICAgICAgIGlmIChleGFjdCAmJiAocmVzdWx0ID09IDApKSB7CiAgICAgICAgICAgIExvd1BpZCA9IHBpZDsKI2lmZGVmIGN5Z3dpbgogICAgICAgICAgICBsb3dwcm9jID0gKmN1cnByb2M7CiNlbGlmICBkeW5peAogICAgICAgICAgICBtZW1jcHkoJmxvd3BzaW5mbywgJm15cHNpbmZvLCBzaXplb2YocHJwc2luZm9fdCkpOwojZWxpZiAhZGVmaW5lZChsaW51eCkKICAgICAgICAgICAgTG93UHJvY0luZGV4ID0gY3VycmVudF9wcm9jX2VudHJ5IC0gMTsKI2VuZGlmCiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJob3N0L2hyX3N3cnVuIiwgIiBzYXZlZFxuIikpOwogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBTYXZlIHByb2Nlc3Mgc3RhdHVzIGluZm9ybWF0aW9uIAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGlmICgoIWV4YWN0ICYmIChyZXN1bHQgPCAwKSkgJiYgKExvd1BpZCA9PSAtMSB8fCBwaWQgPCBMb3dQaWQpKSB7CiAgICAgICAgICAgIExvd1BpZCA9IHBpZDsKI2lmZGVmIGN5Z3dpbgogICAgICAgICAgICBsb3dwcm9jID0gKmN1cnByb2M7CiNlbGlmICFkZWZpbmVkKGxpbnV4KQogICAgICAgICAgICBMb3dQcm9jSW5kZXggPSBjdXJyZW50X3Byb2NfZW50cnkgLSAxOwojZW5kaWYKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogU2F2ZSBwcm9jZXNzIHN0YXR1cyBpbmZvcm1hdGlvbiAKICAgICAgICAgICAgICovCiAgICAgICAgICAgIERFQlVHTVNHKCgiaG9zdC9ocl9zd3J1biIsICIgc2F2ZWQiKSk7CiAgICAgICAgfQogICAgICAgIERFQlVHTVNHKCgiaG9zdC9ocl9zd3J1biIsICJcbiIpKTsKICAgIH0KICAgIEVuZF9IUl9TV1J1bigpOwoKICAgIGlmIChMb3dQaWQgPT0gLTEpIHsKICAgICAgICBERUJVR01TR1RMKCgiaG9zdC9ocl9zd3J1biIsICIuLi4gaW5kZXggb3V0IG9mIHJhbmdlXG4iKSk7CiAgICAgICAgcmV0dXJuIChNQVRDSF9GQUlMRUQpOwogICAgfQoKICAgIG5ld25hbWVbSFJTV1JVTl9FTlRSWV9OQU1FX0xFTkdUSF0gPSBMb3dQaWQ7CiAgICBtZW1jcHkoKGNoYXIgKikgbmFtZSwgKGNoYXIgKikgbmV3bmFtZSwKICAgICAgICAgICAodnAtPm5hbWVsZW4gKyAxKSAqIHNpemVvZihvaWQpKTsKICAgICpsZW5ndGggPSB2cC0+bmFtZWxlbiArIDE7CiAgICAqd3JpdGVfbWV0aG9kID0gKFdyaXRlTWV0aG9kKikwOwogICAgKnZhcl9sZW4gPSBzaXplb2YobG9uZyk7ICAgIC8qIGRlZmF1bHQgdG8gJ2xvbmcnIHJlc3VsdHMgKi8KCiAgICBERUJVR01TR1RMKCgiaG9zdC9ocl9zd3J1biIsICIuLi4gZ2V0IHByb2Nlc3Mgc3RhdHMgIikpOwogICAgREVCVUdNU0dPSUQoKCJob3N0L2hyX3N3cnVuIiwgbmFtZSwgKmxlbmd0aCkpOwogICAgREVCVUdNU0coKCJob3N0L2hyX3N3cnVuIiwgIlxuIikpOwogICAgcmV0dXJuIExvd1BpZDsKfQoKICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqCgkgKgoJICogIFN5c3RlbSBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBmdW5jdGlvbnMKCSAqCgkgKioqKioqKioqKioqKioqKioqKioqLwoKI2lmIGRlZmluZWQobGludXgpCnN0YXRpYyBjaGFyICAgICAqCnNraXBfdG9fbmV4dF9maWVsZChjaGFyICpjcCkKewogICAgd2hpbGUgKCpjcCAmJiAhIGlzc3BhY2UoKmNwKSkgLyogc2tpcCBwYXN0IG5vbi1zcGFjZSAqLwoJKytjcDsKICAgIHdoaWxlICgqY3AgJiYgaXNzcGFjZSgqY3ApKSAvKiBza2lwIHBhc3Qgc3BhY2UgKi8KCSsrY3A7CiAgICByZXR1cm4gY3A7Cgp9CgpzdGF0aWMgY2hhciAgICAgKgpnZXRfcHJvY19maWxlX2xpbmUoY2hhciAqZm10LAoJCSAgICBpbnQgcGlkLAoJCSAgICBjaGFyICpidWYsCgkJICAgIGludCBidWZsZW4gKQp7CiAgICBzdGF0aWMgY2hhciAgICAgc3RyaW5nWzEwMjRdOwogICAgRklMRSAqZnA7CiAgICAqYnVmID0gJ1wwJzsKICAgIHNwcmludGYoc3RyaW5nLGZtdCxwaWQpOwogICAgaWYgKCAgICgoZnAgPSBmb3BlbihzdHJpbmcsICJyIikpID09IE5VTEwpCgl8fCAoZmdldHMoYnVmLCBidWZsZW4sIGZwKSA9PSBOVUxMKSApIHsKCWlmIChmcCkKCSAgICBmY2xvc2UoZnApOwoJcmV0dXJuIE5VTEw7CiAgICB9CiAgICBmY2xvc2UoZnApOwogICAgcmV0dXJuIGJ1ZjsKfQoKc3RhdGljIGNoYXIgICAgICoKZ2V0X3Byb2Nfc3RhdF9maWVsZChpbnQgcGlkLAoJCSAgICBjaGFyICpidWYsCgkJICAgIGludCBidWZsZW4sCgkJICAgIGludCBza2lwICkKewogICAgaW50IGk7CiAgICBjaGFyICpjcDsKCiAgICBpZiAoKGNwID0gZ2V0X3Byb2NfZmlsZV9saW5lKCIvcHJvYy8lZC9zdGF0IiwgcGlkLCBidWYsIGJ1ZmxlbikpID09IE5VTEwgKQoJcmV0dXJuIE5VTEw7CiAgICBmb3IgKGkgPSAwOyAqY3AgJiYgaSA8IHNraXA7ICsraSkgewoJY3AgPSBza2lwX3RvX25leHRfZmllbGQoY3ApOwogICAgfQogICAgcmV0dXJuIGNwOwp9CgpzdGF0aWMgY2hhciAqCmdldF9wcm9jX25hbWVfZnJvbV9jbWRsaW5lKGludCBwaWQsCgkJCSAgICBjaGFyICpidWYsCgkJCSAgICBpbnQgYnVmbGVuICkKewogICAgcmV0dXJuIGdldF9wcm9jX2ZpbGVfbGluZSgiL3Byb2MvJWQvY21kbGluZSIsIHBpZCwgYnVmLCBidWZsZW4pOwp9CgpzdGF0aWMgY2hhciAqCmdldF9wcm9jX25hbWVfZnJvbV9zdGF0dXMoaW50IHBpZCwKCSAgICBjaGFyICpidWYsCgkgICAgaW50IGJ1ZmxlbiApCnsKICAgIGNoYXIgKmNwLCpjcDI7CiAgICBpZiAoKGNwID0gZ2V0X3Byb2NfZmlsZV9saW5lKCIvcHJvYy8lZC9zdGF0dXMiLCBwaWQsIGJ1ZiwgYnVmbGVuKSkgPT0gTlVMTCApCglyZXR1cm4gTlVMTDsKICAgIGNwID0gc3RyY2hyKGNwLCAnOicpOwogICAgaWYgKCBjcCA9PSBOVUxMICkgewoJcmV0dXJuIE5VTEw7ICAgIC8qIHRoZSBwcm9jZXNzIGZpbGUgaXMgbWFsZm9ybWVkICovCiAgICB9CiAgICBjcCA9IHNraXBfdG9fbmV4dF9maWVsZChjcCk7CiAgICBjcDIgPSBzdHJjaHIoY3AsICdcbicpOwogICAgaWYgKGNwMikKCSpjcDIgPSAwOwogICAgcmV0dXJuIGNwOwp9CiNlbmRpZgoKdV9jaGFyICAgICAgICAgKgp2YXJfaHJzd3J1bihzdHJ1Y3QgdmFyaWFibGUgKiB2cCwKICAgICAgICAgICAgb2lkICogbmFtZSwKICAgICAgICAgICAgc2l6ZV90ICogbGVuZ3RoLAogICAgICAgICAgICBpbnQgZXhhY3QsIHNpemVfdCAqIHZhcl9sZW4sIFdyaXRlTWV0aG9kICoqIHdyaXRlX21ldGhvZCkKewogICAgaW50ICAgICAgICAgICAgIHBpZCA9IDA7CiAgICBzdGF0aWMgY2hhciAgICAgc3RyaW5nWzEwMjRdOwojaWZkZWYgSEFWRV9TWVNfUFNUQVRfSAogICAgc3RydWN0IHBzdF9zdGF0dXMgcHJvY19idWY7CiNlbGlmIGRlZmluZWQoc29sYXJpczIpCiNpZiBfU0xBU0hfUFJPQ19NRVRIT0RfCiAgICBzdGF0aWMgcHNpbmZvX3QgcHNpbmZvOwogICAgc3RhdGljIHBzaW5mb190ICpwcm9jX2J1ZjsKICAgIGludCAgICAgICAgICAgICBwcm9jZmQ7CiAgICBpbnQgICAgICAgICAgICAgcmV0OwogICAgY2hhciAgICAgICAgICAgIHByb2NmbltzaXplb2YgIi9wcm9jLzAwMDAwL3BzaW5mbyJdOwojZWxzZQogICAgc3RhdGljIHN0cnVjdCBwcm9jICpwcm9jX2J1ZjsKICAgIGNoYXIgICAgICAgICAgICpjcDE7CiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogX1NMQVNIX1BST0NfTUVUSE9EXyAqLwogICAgc3RhdGljIHRpbWVfdCAgIHdoZW4gPSAwOwogICAgdGltZV90ICAgICAgICAgIG5vdzsKICAgIHN0YXRpYyBpbnQgICAgICBvbGRwaWQgPSAtMTsKI2VuZGlmCiNpZiAoZGVmaW5lZChIQVZFX0tWTV9HRVRQUk9DUykgfHwgZGVmaW5lZChIQVZFX0tWTV9HRVRQUk9DMikpCiAgICBjaGFyICAgICAgICAgICoqYXJndjsKI2VuZGlmCiNpZmRlZiBsaW51eAogICAgRklMRSAgICAgICAgICAgKmZwOwogICAgY2hhciAgICAgICAgICAgIGJ1ZlsxMDI0XTsKICAgIGludCAgICAgICAgICAgICBpOwojZW5kaWYKICAgIGNoYXIgICAgICAgICAgICpjcDsKCiAgICBpZiAodnAtPm1hZ2ljID09IEhSU1dSVU5fT1NJTkRFWCkgewogICAgICAgIGlmIChoZWFkZXJfaHJzd3J1bih2cCwgbmFtZSwgbGVuZ3RoLCBleGFjdCwgdmFyX2xlbiwgd3JpdGVfbWV0aG9kKQogICAgICAgICAgICA9PSBNQVRDSF9GQUlMRUQpCiAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgfSBlbHNlIHsKCiAgICAgICAgcGlkID0KICAgICAgICAgICAgaGVhZGVyX2hyc3dydW5FbnRyeSh2cCwgbmFtZSwgbGVuZ3RoLCBleGFjdCwgdmFyX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZV9tZXRob2QpOwogICAgICAgIGlmIChwaWQgPT0gTUFUQ0hfRkFJTEVEKQogICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KCiNpZmRlZiBIQVZFX1NZU19QU1RBVF9ICiAgICBpZiAocHN0YXRfZ2V0cHJvYygmcHJvY19idWYsIHNpemVvZihzdHJ1Y3QgcHN0X3N0YXR1cyksIDAsIHBpZCkgPT0gLTEpCiAgICAgICAgcmV0dXJuIE5VTEw7CiNlbGlmIGRlZmluZWQoc29sYXJpczIpCiAgICB0aW1lKCZub3cpOwogICAgaWYgKHBpZCA9PSBvbGRwaWQpIHsKICAgICAgICBpZiAobm93ICE9IHdoZW4pCiAgICAgICAgICAgIG9sZHBpZCA9IC0xOwogICAgfQogICAgaWYgKG9sZHBpZCAhPSBwaWQgfHwgcHJvY19idWYgPT0gTlVMTCkgewojaWYgX1NMQVNIX1BST0NfTUVUSE9EXwogICAgICAgIHByb2NfYnVmID0gJnBzaW5mbzsKICAgICAgICBzcHJpbnRmKHByb2NmbiwgIi9wcm9jLyUuNWQvcHNpbmZvIiwgcGlkKTsKICAgICAgICBpZiAoKHByb2NmZCA9IG9wZW4ocHJvY2ZuLCBPX1JET05MWSkpICE9IC0xKSB7CiAgICAgICAgICAgIHJldCA9ICByZWFkKHByb2NmZCwgcHJvY19idWYsIHNpemVvZigqcHJvY19idWYpKTsKICAgICAgICAgICAgY2xvc2UocHJvY2ZkKTsKICAgICAgICAgICAgaWYgKHJldCAhPSBzaXplb2YoKnByb2NfYnVmKSkKICAgICAgICAgICAgICAgIHByb2NfYnVmID0gTlVMTDsKICAgICAgICB9IGVsc2UKICAgICAgICAgICAgcHJvY19idWYgPSAgTlVMTDsKI2Vsc2UKICAgICAgICBpZiAoa2QgPT0gTlVMTCkKICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgaWYgKChwcm9jX2J1ZiA9IGt2bV9nZXRwcm9jKGtkLCBwaWQpKSA9PSBOVUxMKQogICAgICAgICAgICByZXR1cm4gTlVMTDsKI2VuZGlmCiAgICAgICAgb2xkcGlkID0gcGlkOwogICAgICAgIHdoZW4gPSBub3c7CiAgICB9CiNlbmRpZgoKICAgIHN3aXRjaCAodnAtPm1hZ2ljKSB7CiAgICBjYXNlIEhSU1dSVU5fT1NJTkRFWDoKI2lmIE5FVFNOTVBfTk9fRFVNTVlfVkFMVUVTCiAgICAgICAgcmV0dXJuIE5VTEw7CiNlbHNlCiAgICAgICAgLyogCiAgICAgICAgICogcGVyIGR0cywgb24gY29kZXJzOgogICAgICAgICAqIGNvcyAoaW4gZ2VuZXJhbCkgd2Ugd29uJ3Qga25vdyB3aGljaCBwcm9jZXNzIHNob3VsZAogICAgICAgICAqIGJlIHJlZ2FyZGVkIGFzICJ0aGUgcHJpbWFyeSBPL1MgcHJvY2VzcyIuCiAgICAgICAgICogVGhlIG1vc3Qgb2J2aW91cyBjYW5kaWRhdGUgb24gYSBVbml4IGJveCBpcyBwcm9iYWJseSAnaW5pdCcKICAgICAgICAgKiB3aGljaCBpcyB0eXBpY2FsbHkgKGFsd2F5cz8pIHByb2Nlc3MgIzEuCiAgICAgICAgICovCiAgICAgICAgbG9uZ19yZXR1cm4gPSAxOyAgICAgICAgLyogUHJvYmFibHkhICovCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKI2VuZGlmCgogICAgY2FzZSBIUlNXUlVOX0lOREVYOgogICAgICAgIGxvbmdfcmV0dXJuID0gcGlkOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIEhSU1dSVU5fTkFNRToKI2lmZGVmIEhBVkVfU1lTX1BTVEFUX0gKICAgICAgICBzdHJsY3B5KHN0cmluZywgcHJvY19idWYucHN0X2NtZCwgc2l6ZW9mKHN0cmluZykpOwogICAgICAgIGNwID0gc3RyY2hyKHN0cmluZywgJyAnKTsKICAgICAgICBpZiAoY3AgIT0gTlVMTCkKICAgICAgICAgICAgKmNwID0gJ1wwJzsKI2VsaWYgZGVmaW5lZChkeW5peCkKICAgICAgICBzdHJsY3B5KHN0cmluZywgbG93cHNpbmZvLnByX2ZuYW1lLCBzaXplb2Yoc3RyaW5nKSk7CiAgICAgICAgY3AgPSBzdHJjaHIoc3RyaW5nLCAnICcpOwogICAgICAgIGlmIChjcCAhPSBOVUxMKQogICAgICAgICAgICAqY3AgPSAnXDAnOwojZWxpZiBkZWZpbmVkKHNvbGFyaXMyKQojaWYgX1NMQVNIX1BST0NfTUVUSE9EXwogICAgICAgIGlmIChwcm9jX2J1ZikgeyAKICAgICAgICAgICAgY2hhciAqcG9zPXN0cmNocihwcm9jX2J1Zi0+cHJfcHNhcmdzLCcgJyk7CiAgICAgICAgICAgIGlmIChwb3MgIT0gTlVMTCkgKnBvcyA9ICdcMCc7CiAgICAgICAgICAgIHN0cmxjcHkoc3RyaW5nLCBiYXNlbmFtZShwcm9jX2J1Zi0+cHJfcHNhcmdzKSwgc2l6ZW9mKHN0cmluZykpOwogICAgICAgICAgICBpZiAocG9zICE9IE5VTEwpICpwb3M9JyAnOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHN0cmxjcHkoc3RyaW5nLCAiPGV4aXRlZD4iLCBzaXplb2Yoc3RyaW5nKSk7CiAgICAgICAgfQojZWxzZQogICAgICAgIHN0cmxjcHkoc3RyaW5nLCBwcm9jX2J1Zi0+cF91c2VyLnVfY29tbSwgc2l6ZW9mKHN0cmluZykpOwojZW5kaWYKI2VsaWYgZGVmaW5lZChhaXg0KSB8fCBkZWZpbmVkKGFpeDUpIHx8IGRlZmluZWQoYWl4NikKICAgICAgICBzdHJsY3B5KHN0cmluZywgcHJvY190YWJsZVtMb3dQcm9jSW5kZXhdLnBpX2NvbW0sIHNpemVvZihzdHJpbmcpKTsKICAgICAgICBjcCA9IHN0cmNocihzdHJpbmcsICcgJyk7CiAgICAgICAgaWYgKGNwICE9IE5VTEwpCiAgICAgICAgICAgICpjcCA9ICdcMCc7CiNlbGlmIEhBVkVfS1ZNX0dFVFBST0MyCiAgICAgICAgc3RybGNweShzdHJpbmcsIHByb2NfdGFibGVbTG93UHJvY0luZGV4XS5wX2NvbW0sIHNpemVvZihzdHJpbmcpKTsKICAgICAgICAvKiBwcm9jZXNzIG5hbWU6IHRydW5jYXRlIHRoZSBzdHJpbmcgYXQgdGhlIGZpcnN0IHNwYWNlICovCiAgICAgICAgY3AgPSBzdHJjaHIoc3RyaW5nLCAnICcpOwogICAgICAgIGlmIChjcCAhPSBOVUxMKQogICAgICAgICAgICAqY3AgPSAnXDAnOwojZWxpZiBIQVZFX0tWTV9HRVRQUk9DUwogICAgI2lmIGRlZmluZWQoZnJlZWJzZDUpICYmIF9fRnJlZUJTRF92ZXJzaW9uID49IDUwMDAxNAogICAgICAgIHN0cmNweShzdHJpbmcsIHByb2NfdGFibGVbTG93UHJvY0luZGV4XS5raV9jb21tKTsKICAgICNlbGlmIGRlZmluZWQoZHJhZ29uZmx5KSAmJiBfX0RyYWdvbkZseV92ZXJzaW9uID49IDE5MDAwMAogICAgICAgIHN0cmNweShzdHJpbmcsIHByb2NfdGFibGVbTG93UHJvY0luZGV4XS5rcF9jb21tKTsKICAgICNlbGlmIGRlZmluZWQob3BlbmJzZDUpCiAgICAgICAgc3RyY3B5KHN0cmluZywgcHJvY190YWJsZVtMb3dQcm9jSW5kZXhdLnBfY29tbSk7CiAgICAjZWxzZQogICAgICAgIHN0cmNweShzdHJpbmcsIHByb2NfdGFibGVbTG93UHJvY0luZGV4XS5rcF9wcm9jLnBfY29tbSk7CiAgICAjZW5kaWYKI2VsaWYgZGVmaW5lZChsaW51eCkKCWlmKCAoY3A9Z2V0X3Byb2NfbmFtZV9mcm9tX3N0YXR1cyhwaWQsYnVmLHNpemVvZihidWYpKSkgPT0gTlVMTCApIHsKICAgICAgICAgICAgc3RyY3B5KHN0cmluZywgIjxleGl0ZWQ+Iik7CiAgICAgICAgICAgICp2YXJfbGVuID0gc3RybGVuKHN0cmluZyk7CiAgICAgICAgICAgIHJldHVybiAodV9jaGFyICopIHN0cmluZzsKICAgICAgICB9CiAgICAgICAgc3RyY3B5KHN0cmluZywgY3ApOwojZWxpZiBkZWZpbmVkKGN5Z3dpbikKICAgICAgICAvKiBpZiAobG93cHJvYy5wcm9jZXNzX3N0YXRlICYgKFBJRF9aT01CSUUgfCBQSURfRVhJVEVEKSkgKi8KICAgICAgICBpZiAobG93cHJvYy5wcm9jZXNzX3N0YXRlICYgUElEX0VYSVRFRCB8fCAobG93cHJvYy5leGl0Y29kZSAmIH4weGZmZmYpKQogICAgICAgICAgICBzdHJjcHkoc3RyaW5nLCAiPGRlZnVuY3Q+Iik7CiAgICAgICAgZWxzZSBpZiAobG93cHJvYy5wcGlkKSB7CiAgICAgICAgICAgIGN5Z3dpbl9jb252X3RvX3Bvc2l4X3BhdGgobG93cHJvYy5wcm9nbmFtZSwgc3RyaW5nKTsKICAgICAgICAgICAgY3AgPSBzdHJyY2hyKHN0cmluZywgJy8nKTsKICAgICAgICAgICAgaWYgKGNwKQogICAgICAgICAgICAgICAgc3RyY3B5KHN0cmluZywgY3AgKyAxKTsKICAgICAgICB9IGVsc2UgaWYgKHF1ZXJ5ID09IENXX0dFVFBJTkZPX0ZVTEwpIHsKICAgICAgICAgICAgRFdPUkQgICAgICAgICAgIG4gPSBsb3dwcm9jLmR3UHJvY2Vzc0lkICYgMHhmZmZmOwogICAgICAgICAgICBIQU5ETEUgICAgICAgICAgaCA9CiAgICAgICAgICAgICAgICBPcGVuUHJvY2VzcyhQUk9DRVNTX1FVRVJZX0lORk9STUFUSU9OIHwgUFJPQ0VTU19WTV9SRUFELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UsIG4pOwoKICAgICAgICAgICAgaWYgKGgpIHsKICAgICAgICAgICAgICAgIEhNT0RVTEUgICAgICAgICBobVsxMDAwXTsKICAgICAgICAgICAgICAgIGlmICghbXlFbnVtUHJvY2Vzc01vZHVsZXMoaCwgaG0sIHNpemVvZiBobSwgJm4pKSB7CiAgICAgICAgICAgICAgICAgICAgc25tcF9sb2coTE9HX0RFQlVHLCAibm8gbW9kdWxlIGhhbmRsZSBmb3IgJWx1XG4iLCBuKTsKICAgICAgICAgICAgICAgICAgICBuID0gMDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChuCiAgICAgICAgICAgICAgICAgICAgJiYgbXlHZXRNb2R1bGVGaWxlTmFtZUV4KGgsIGhtWzBdLCBzdHJpbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiBzdHJpbmcpKSB7CiAgICAgICAgICAgICAgICAgICAgY3AgPSBzdHJyY2hyKHN0cmluZywgJ1xcJyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGNwKQogICAgICAgICAgICAgICAgICAgICAgICBzdHJjcHkoc3RyaW5nLCBjcCArIDEpOwogICAgICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICAgICAgc3RyY3B5KHN0cmluZywgIioqKiB1bmtub3duIik7CiAgICAgICAgICAgICAgICBDbG9zZUhhbmRsZShoKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHNubXBfbG9nKExPR19JTkZPLCAibm8gcHJvY2VzcyBoYW5kbGUgZm9yICVsdVxuIiwgbik7CiAgICAgICAgICAgICAgICBzdHJjcHkoc3RyaW5nLCAiKiogdW5rbm93biIpOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlCiAgICAgICAgICAgIHN0cmNweShzdHJpbmcsICIqIHVua25vd24iKTsKICAgICAgICBjcCA9IHN0cmNocihzdHJpbmcsICdcMCcpIC0gNDsKICAgICAgICBpZiAoY3AgPiBzdHJpbmcgJiYgc3RyY2FzZWNtcChjcCwgIi5leGUiKSA9PSAwKQogICAgICAgICAgICAqY3AgPSAnXDAnOwojZWxzZQojaWYgTkVUU05NUF9OT19EVU1NWV9WQUxVRVMKICAgICAgICByZXR1cm4gTlVMTDsKI2VuZGlmCiAgICAgICAgc3ByaW50ZihzdHJpbmcsICJwcm9jZXNzIG5hbWUiKTsKI2VuZGlmCiAgICAgICAgKnZhcl9sZW4gPSBzdHJsZW4oc3RyaW5nKTsKICAgICAgICAvKgogICAgICAgICAqIHJlbW92ZSB0cmFpbGluZyBuZXdsaW5lIAogICAgICAgICAqLwogICAgICAgIGlmICgqdmFyX2xlbikgewogICAgICAgICAgICBjcCA9IHN0cmluZyArICp2YXJfbGVuIC0gMTsKICAgICAgICAgICAgaWYgKCpjcCA9PSAnXG4nKQogICAgICAgICAgICAgICAgLS0oKnZhcl9sZW4pOwogICAgICAgIH0KICAgICAgICBpZiAoKnZhcl9sZW4gPiA2NCkgeyAvKiBNSUIgbGltaXQgKi8KICAgICAgICAgICAgKnZhcl9sZW4gPSA2NDsKICAgICAgICAgICAgc3RyaW5nWzY0XSA9ICdcMCc7CiAgICAgICAgfQogICAgICAgIHJldHVybiAodV9jaGFyICopIHN0cmluZzsKICAgIGNhc2UgSFJTV1JVTl9JRDoKICAgICAgICAqdmFyX2xlbiA9IG51bGxPaWRMZW47CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgbnVsbE9pZDsKICAgIGNhc2UgSFJTV1JVTl9QQVRIOgojaWZkZWYgSEFWRV9TWVNfUFNUQVRfSAogICAgICAgIC8qCiAgICAgICAgICogUGF0aCBub3QgYXZhaWxhYmxlIC0gdXNlIGFyZ3ZbMF0gCiAgICAgICAgICovCiAgICAgICAgc3ByaW50ZihzdHJpbmcsICIlcyIsIHByb2NfYnVmLnBzdF9jbWQpOwogICAgICAgIGNwID0gc3RyY2hyKHN0cmluZywgJyAnKTsKICAgICAgICBpZiAoY3AgIT0gTlVMTCkKICAgICAgICAgICAgKmNwID0gJ1wwJzsKI2VsaWYgZGVmaW5lZChkeW5peCkKICAgICAgICAvKgogICAgICAgICAqIFBhdGggbm90IGF2YWlsYWJsZSAtIHVzZSBhcmd2WzBdIAogICAgICAgICAqLwogICAgICAgIHNwcmludGYoc3RyaW5nLCAiJXMiLCBsb3dwc2luZm8ucHJfcHNhcmdzKTsKICAgICAgICBjcCA9IHN0cmNocihzdHJpbmcsICcgJyk7CiAgICAgICAgaWYgKGNwICE9IE5VTEwpCiAgICAgICAgICAgICpjcCA9ICdcMCc7CiNlbGlmIGRlZmluZWQoc29sYXJpczIpCiNpZmRlZiBfU0xBU0hfUFJPQ19NRVRIT0RfCiAgICAgICAgaWYgKHByb2NfYnVmKQogICAgICAgICAgICBzdHJjcHkoc3RyaW5nLCBwcm9jX2J1Zi0+cHJfcHNhcmdzKTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIHNwcmludGYoc3RyaW5nLCAiPGV4aXRlZD4iKTsKICAgICAgICBjcCA9IHN0cmNocihzdHJpbmcsICcgJyk7CiAgICAgICAgaWYgKGNwKQogICAgICAgICAgICAqY3AgPSAwOwojZWxzZQogICAgICAgIGNwID0gcHJvY19idWYtPnBfdXNlci51X3BzYXJnczsKICAgICAgICBjcDEgPSBzdHJpbmc7CiAgICAgICAgd2hpbGUgKCpjcCAmJiAqY3AgIT0gJyAnKQogICAgICAgICAgICAqY3AxKysgPSAqY3ArKzsKICAgICAgICAqY3AxID0gMDsKI2VuZGlmCiNlbGlmIGRlZmluZWQoYWl4NCkgfHwgZGVmaW5lZChhaXg1KSB8fCBkZWZpbmVkKGFpeDYpCiAgICAgICAgc3RybGNweShzdHJpbmcsIHByb2NfdGFibGVbTG93UHJvY0luZGV4XS5waV9jb21tLCBzaXplb2Yoc3RyaW5nKSk7CiAgICAgICAgY3AgPSBzdHJjaHIoc3RyaW5nLCAnICcpOwogICAgICAgIGlmIChjcCAhPSBOVUxMKQogICAgICAgICAgICAqY3AgPSAnXDAnOwojZWxpZiBIQVZFX0tWTV9HRVRQUk9DMgogICAgICAgIC8qIFNob3VsZCBiZSBwYXRoLCBidXQgdGhpcyBpcyBub3QgYXZhaWxhYmxlLCBqdXN0IHVzZSBhcmd2WzBdIGFnYWluICovCiAgICAgICAgc3RybGNweShzdHJpbmcsIHByb2NfdGFibGVbTG93UHJvY0luZGV4XS5wX2NvbW0sIHNpemVvZihzdHJpbmcpKTsKICAgICAgICBjcCA9IHN0cmNocihzdHJpbmcsICcgJyk7CiAgICAgICAgaWYgKGNwICE9IE5VTEwpCiAgICAgICAgICAgICpjcCA9ICdcMCc7CiNlbGlmIEhBVkVfS1ZNX0dFVFBST0NTCiAgICAjaWYgZGVmaW5lZChmcmVlYnNkNSkgJiYgX19GcmVlQlNEX3ZlcnNpb24gPj0gNTAwMDE0CiAgICAgICAgc3RyY3B5KHN0cmluZywgcHJvY190YWJsZVtMb3dQcm9jSW5kZXhdLmtpX2NvbW0pOwogICAgI2VsaWYgZGVmaW5lZChkcmFnb25mbHkpICYmIF9fRHJhZ29uRmx5X3ZlcnNpb24gPj0gMTkwMDAwCiAgICAgICAgc3RyY3B5KHN0cmluZywgcHJvY190YWJsZVtMb3dQcm9jSW5kZXhdLmtwX2NvbW0pOwogICAgI2VsaWYgZGVmaW5lZChvcGVuYnNkNSkKICAgICAgICBzdHJjcHkoc3RyaW5nLCBwcm9jX3RhYmxlW0xvd1Byb2NJbmRleF0ucF9jb21tKTsKICAgICNlbHNlCiAgICAgICAgc3RyY3B5KHN0cmluZywgcHJvY190YWJsZVtMb3dQcm9jSW5kZXhdLmtwX3Byb2MucF9jb21tKTsKICAgICNlbmRpZgojZWxpZiBkZWZpbmVkKGxpbnV4KQogICAgICAgIGNwID0gZ2V0X3Byb2NfbmFtZV9mcm9tX2NtZGxpbmUocGlkLGJ1ZixzaXplb2YoYnVmKS0xKTsKICAgICAgICBpZiAoY3AgIT0gTlVMTCAmJiAqY3ApICAgIC8qIGFyZ3ZbMF0gJ1wwJyBhcmd2WzFdICdcMCcgLi4uLiAqLwogICAgICAgICAgICBzdHJjcHkoc3RyaW5nLCBjcCk7CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIHN3YXBwZWQgb3V0IC0gbm8gY21kbGluZSAKICAgICAgICAgICAgICovCgkgICAgaWYoIChjcD1nZXRfcHJvY19uYW1lX2Zyb21fc3RhdHVzKHBpZCxidWYsc2l6ZW9mKGJ1ZiktMSkpID09IE5VTEwgKSB7CgkJc3RyY3B5KHN0cmluZywgIjxleGl0ZWQ+Iik7CgkJKnZhcl9sZW4gPSBzdHJsZW4oc3RyaW5nKTsKCQlyZXR1cm4gKHVfY2hhciAqKSBzdHJpbmc7CgkgICAgfQogICAgICAgICAgICBzdHJjcHkoc3RyaW5nLCBjcCk7CiAgICAgICAgfQojZWxpZiBkZWZpbmVkKGN5Z3dpbikKICAgICAgICAvKiBpZiAobG93cHJvYy5wcm9jZXNzX3N0YXRlICYgKFBJRF9aT01CSUUgfCBQSURfRVhJVEVEKSkgKi8KICAgICAgICBpZiAobG93cHJvYy5wcm9jZXNzX3N0YXRlICYgUElEX0VYSVRFRCB8fCAobG93cHJvYy5leGl0Y29kZSAmIH4weGZmZmYpKQogICAgICAgICAgICBzdHJjcHkoc3RyaW5nLCAiPGRlZnVuY3Q+Iik7CiAgICAgICAgZWxzZSBpZiAobG93cHJvYy5wcGlkKQogICAgICAgICAgICBjeWd3aW5fY29udl90b19wb3NpeF9wYXRoKGxvd3Byb2MucHJvZ25hbWUsIHN0cmluZyk7CiAgICAgICAgZWxzZSBpZiAocXVlcnkgPT0gQ1dfR0VUUElORk9fRlVMTCkgewogICAgICAgICAgICBEV09SRCAgICAgICAgICAgbiA9IGxvd3Byb2MuZHdQcm9jZXNzSWQgJiAweEZGRkY7CiAgICAgICAgICAgIEhBTkRMRSAgICAgICAgICBoID0KICAgICAgICAgICAgICAgIE9wZW5Qcm9jZXNzKFBST0NFU1NfUVVFUllfSU5GT1JNQVRJT04gfCBQUk9DRVNTX1ZNX1JFQUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSwgbik7CiAgICAgICAgICAgIGlmIChoKSB7CiAgICAgICAgICAgICAgICBITU9EVUxFICAgICAgICAgaG1bMTAwMF07CiAgICAgICAgICAgICAgICBpZiAoIW15RW51bVByb2Nlc3NNb2R1bGVzKGgsIGhtLCBzaXplb2YgaG0sICZuKSkKICAgICAgICAgICAgICAgICAgICBuID0gMDsKICAgICAgICAgICAgICAgIGlmICghbgogICAgICAgICAgICAgICAgICAgIHx8ICFteUdldE1vZHVsZUZpbGVOYW1lRXgoaCwgaG1bMF0sIHN0cmluZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiBzdHJpbmcpKQogICAgICAgICAgICAgICAgICAgIHN0cmNweShzdHJpbmcsICIqKiogdW5rbm93biIpOwogICAgICAgICAgICAgICAgQ2xvc2VIYW5kbGUoaCk7CiAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgc3RyY3B5KHN0cmluZywgIioqIHVua25vd24iKTsKICAgICAgICB9IGVsc2UKICAgICAgICAgICAgc3RyY3B5KHN0cmluZywgIiogdW5rbm93biIpOwojZWxzZQojaWYgTkVUU05NUF9OT19EVU1NWV9WQUxVRVMKICAgICAgICByZXR1cm4gTlVMTDsKI2VuZGlmCiAgICAgICAgc3ByaW50ZihzdHJpbmcsICIvYmluL3dvbWJhdCIpOwojZW5kaWYKICAgICAgICAqdmFyX2xlbiA9IHN0cmxlbihzdHJpbmcpOwogICAgICAgIGlmICgqdmFyX2xlbiA+IDEyOCkgeyAvKiBNSUIgbGltaXQgKi8KICAgICAgICAgICAgKnZhcl9sZW4gPSAxMjg7CiAgICAgICAgICAgIHN0cmluZ1sxMjhdID0gJ1wwJzsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgc3RyaW5nOwogICAgY2FzZSBIUlNXUlVOX1BBUkFNUzoKI2lmZGVmIEhBVkVfU1lTX1BTVEFUX0gKICAgICAgICBjcCA9IHN0cmNocihwcm9jX2J1Zi5wc3RfY21kLCAnICcpOwogICAgICAgIGlmIChjcCAhPSBOVUxMKSB7CiAgICAgICAgICAgIGNwKys7CiAgICAgICAgICAgIHNwcmludGYoc3RyaW5nLCAiJXMiLCBjcCk7CiAgICAgICAgfSBlbHNlCiAgICAgICAgICAgIHN0cmluZ1swXSA9ICdcMCc7CiNlbGlmIGRlZmluZWQoZHluaXgpCiAgICAgICAgY3AgPSBzdHJjaHIobG93cHNpbmZvLnByX3BzYXJncywgJyAnKTsKICAgICAgICBpZiAoY3AgIT0gTlVMTCkgewogICAgICAgICAgICBjcCsrOwogICAgICAgICAgICBzcHJpbnRmKHN0cmluZywgIiVzIiwgY3ApOwogICAgICAgIH0gZWxzZQogICAgICAgICAgICBzdHJpbmdbMF0gPSAnXDAnOwojZWxpZiBkZWZpbmVkKHNvbGFyaXMyKQojaWZkZWYgX1NMQVNIX1BST0NfTUVUSE9EXwogICAgICAgIGlmIChwcm9jX2J1ZikgewogICAgICAgICAgICBjcCA9IHN0cmNocihwcm9jX2J1Zi0+cHJfcHNhcmdzLCAnICcpOwogICAgICAgICAgICBpZiAoY3ApCiAgICAgICAgICAgICAgICBzdHJjcHkoc3RyaW5nLCBjcCArIDEpOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBzdHJpbmdbMF0gPSAwOwogICAgICAgIH0gZWxzZQogICAgICAgICAgICBzdHJpbmdbMF0gPSAwOwojZWxzZQogICAgICAgIGNwID0gcHJvY19idWYtPnBfdXNlci51X3BzYXJnczsKICAgICAgICB3aGlsZSAoKmNwICYmICpjcCAhPSAnICcpCiAgICAgICAgICAgIGNwKys7CiAgICAgICAgaWYgKCpjcCA9PSAnICcpCiAgICAgICAgICAgIGNwKys7CiAgICAgICAgc3RyY3B5KHN0cmluZywgY3ApOwojZW5kaWYKI2VsaWYgZGVmaW5lZChhaXg0KSB8fCBkZWZpbmVkKGFpeDUpIHx8IGRlZmluZWQoYWl4NikKICAgICAgICBjcCA9IHN0cmNocihwcm9jX3RhYmxlW0xvd1Byb2NJbmRleF0ucGlfY29tbSwgJyAnKTsKICAgICAgICBpZiAoY3AgIT0gTlVMTCkgewogICAgICAgICAgICBjcCsrOwogICAgICAgICAgICBzcHJpbnRmKHN0cmluZywgIiVzIiwgY3ApOwogICAgICAgIH0gZWxzZQogICAgICAgICAgICBzdHJpbmdbMF0gPSAnXDAnOwojZWxpZiBIQVZFX0tWTV9HRVRQUk9DMgogICAgICAgIHN0cmluZ1swXSA9IDA7CiAgICAgICAgYXJndiA9IGt2bV9nZXRhcmd2MihrZCwgcHJvY190YWJsZSArIExvd1Byb2NJbmRleCwgc2l6ZW9mKHN0cmluZykpOwogICAgICAgIGlmIChhcmd2KQogICAgICAgICAgICBhcmd2Kys7CiAgICAgICAgd2hpbGUgKGFyZ3YgJiYgKmFyZ3YpIHsKICAgICAgICAgICAgaWYgKHN0cmluZ1swXSAhPSAwKQogICAgICAgICAgICAgICAgc3RyY2F0KHN0cmluZywgIiAiKTsKICAgICAgICAgICAgc3RyY2F0KHN0cmluZywgKmFyZ3YpOwogICAgICAgICAgICBhcmd2Kys7CiAgICAgICAgfQojZWxpZiBIQVZFX0tWTV9HRVRQUk9DUwogICAgICAgIHN0cmluZ1swXSA9IDA7CiAgICAgICAgYXJndiA9IGt2bV9nZXRhcmd2KGtkLCBwcm9jX3RhYmxlICsgTG93UHJvY0luZGV4LCBzaXplb2Yoc3RyaW5nKSk7CiAgICAgICAgaWYgKGFyZ3YpCiAgICAgICAgICAgIGFyZ3YrKzsKICAgICAgICB3aGlsZSAoYXJndiAmJiAqYXJndikgewogICAgICAgICAgICBpZiAoc3RyaW5nWzBdICE9IDApCiAgICAgICAgICAgICAgICBzdHJjYXQoc3RyaW5nLCAiICIpOwogICAgICAgICAgICBzdHJjYXQoc3RyaW5nLCAqYXJndik7CiAgICAgICAgICAgIGFyZ3YrKzsKICAgICAgICB9CiNlbGlmIGRlZmluZWQobGludXgpCiAgICAgICAgbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKGJ1ZikpOwoJaWYoIChjcD1nZXRfcHJvY19uYW1lX2Zyb21fY21kbGluZShwaWQsYnVmLHNpemVvZihidWYpLTIpKSA9PSBOVUxMICkgewogICAgICAgICAgICBzdHJjcHkoc3RyaW5nLCAiIik7CiAgICAgICAgICAgICp2YXJfbGVuID0gMDsKICAgICAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgc3RyaW5nOwogICAgICAgIH0KCiAgICAgICAgLyoKICAgICAgICAgKiBTa2lwIG92ZXIgYXJndlswXSAKICAgICAgICAgKi8KICAgICAgICBjcCA9IGJ1ZjsKICAgICAgICB3aGlsZSAoKmNwKQogICAgICAgICAgICArK2NwOwogICAgICAgICsrY3A7CiAgICAgICAgLyoKICAgICAgICAgKiBOb3cgam9pbiB0b2dldGhlciBzZXBhcmF0ZSBhcmd1bWVudHMuIAogICAgICAgICAqLwogICAgICAgIHdoaWxlICgxKSB7CiAgICAgICAgICAgIHdoaWxlICgqY3ApCiAgICAgICAgICAgICAgICArK2NwOwogICAgICAgICAgICBpZiAoKihjcCArIDEpID09ICdcMCcpCiAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgLyogJ1wwJydcMCcgPT4gRW5kIG9mIGNvbW1hbmQgbGluZSAqLwogICAgICAgICAgICAqY3AgPSAnICc7CiAgICAgICAgfQoKICAgICAgICBjcCA9IGJ1ZjsKICAgICAgICB3aGlsZSAoKmNwKQogICAgICAgICAgICArK2NwOwogICAgICAgICsrY3A7CiAgICAgICAgc3RyY3B5KHN0cmluZywgY3ApOwojZWxpZiBkZWZpbmVkKGN5Z3dpbikKICAgICAgICBzdHJpbmdbMF0gPSAwOwojZWxzZQojaWYgTkVUU05NUF9OT19EVU1NWV9WQUxVRVMKICAgICAgICByZXR1cm4gTlVMTDsKI2VuZGlmCiAgICAgICAgc3ByaW50ZihzdHJpbmcsICItaCAtcSAtdiIpOwojZW5kaWYKICAgICAgICAqdmFyX2xlbiA9IHN0cmxlbihzdHJpbmcpOwogICAgICAgIGlmICgqdmFyX2xlbiA+IDEyOCkgeyAvKiBNSUIgbGltaXQgKi8KICAgICAgICAgICAgKnZhcl9sZW4gPSAxMjg7CiAgICAgICAgICAgIHN0cmluZ1sxMjhdID0gJ1wwJzsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgc3RyaW5nOwogICAgY2FzZSBIUlNXUlVOX1RZUEU6CiNpZmRlZiBQSURfTUFYU1lTCiAgICAgICAgaWYgKHBpZCA8IFBJRF9NQVhTWVMpCiAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gMjsgICAgLyogb3BlcmF0aW5nU3lzdGVtICovCiAgICAgICAgZWxzZQogICAgICAgICAgICBsb25nX3JldHVybiA9IDQ7ICAgIC8qIGFwcGxpY2F0aW9uICovCiNlbGlmIGRlZmluZWQoYWl4NCkgfHwgZGVmaW5lZChhaXg1KSB8fCBkZWZpbmVkKGFpeDYpCgkJaWYgKHByb2NfdGFibGVbTG93UHJvY0luZGV4XS5waV9mbGFncyAmIFNLUFJPQykgewoJCQlsb25nX3JldHVybiA9IDI7CS8qIGtlcm5lbCBwcm9jZXNzICovCgkJfSBlbHNlCgkJCWxvbmdfcmV0dXJuID0gNDsJLyogYXBwbGljYXRpb24gKi8KI2VsaWYgSEFWRV9LVk1fR0VUUFJPQzIKICAgICAgICBpZiAocHJvY190YWJsZVtMb3dQcm9jSW5kZXhdLnBfZmxhZyAmIFBfU1lTVEVNKQoJICAgIGxvbmdfcmV0dXJuID0gMjsJLyogb3BlcmF0aW5nU3lzdGVtICovCgllbHNlCgkgICAgbG9uZ19yZXR1cm4gPSA0OwkvKiBhcHBsaWNhdGlvbiAqLwojZWxpZiBIQVZFX0tWTV9HRVRQUk9DUwogICAgI2lmIGRlZmluZWQoZnJlZWJzZDUpICYmIF9fRnJlZUJTRF92ZXJzaW9uID49IDUwMDAxNAoJaWYgKHByb2NfdGFibGVbTG93UHJvY0luZGV4XS5raV9mbGFnICYgUF9TWVNURU0pIHsKCSAgICBpZiAocHJvY190YWJsZVtMb3dQcm9jSW5kZXhdLmtpX3ByaS5wcmlfY2xhc3MgPT0gUFJJX0lUSEQpCgkJbG9uZ19yZXR1cm4gPSAzOy8qIGRldmljZURyaXZlciAqLwoJICAgIGVsc2UKCQlsb25nX3JldHVybiA9IDI7Lyogb3BlcmF0aW5nU3lzdGVtICovCgl9IGVsc2UKCSAgICBsb25nX3JldHVybiA9IDQ7CS8qIGFwcGxpY2F0aW9uICovCiAgICAjZWxpZiBkZWZpbmVkKG9wZW5ic2Q1KQogICAgICAgIGlmIChwcm9jX3RhYmxlW0xvd1Byb2NJbmRleF0ucF9mbGFnICYgUF9TWVNURU0pCgkgICAgbG9uZ19yZXR1cm4gPSAyOwkvKiBvcGVyYXRpbmdTeXN0ZW0gKi8KCWVsc2UKCSAgICBsb25nX3JldHVybiA9IDQ7CS8qIGFwcGxpY2F0aW9uICovCiAgICAjZWxzZQogICAgICAjaWYgZGVmaW5lZChkcmFnb25mbHkpICYmIF9fRHJhZ29uRmx5X3ZlcnNpb24gPj0gMTkwMDAwCiAgICAgICAgaWYgKHByb2NfdGFibGVbTG93UHJvY0luZGV4XS5rcF9mbGFncyAmIFBfU1lTVEVNKQogICAgICAjZWxzZQogICAgICAgIGlmIChwcm9jX3RhYmxlW0xvd1Byb2NJbmRleF0ua3BfcHJvYy5wX2ZsYWcgJiBQX1NZU1RFTSkKICAgICAgI2VuZGlmCgkgICAgbG9uZ19yZXR1cm4gPSAyOwkvKiBvcGVyYXRpbmdTeXN0ZW0gKi8KCWVsc2UKCSAgICBsb25nX3JldHVybiA9IDQ7CS8qIGFwcGxpY2F0aW9uICovCiAgICAjZW5kaWYKI2Vsc2UKCWxvbmdfcmV0dXJuID0gNDsJLyogYXBwbGljYXRpb24gKi8KI2VuZGlmCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSFJTV1JVTl9TVEFUVVM6CiNpZiBkZWZpbmVkKGN5Z3dpbikKICAgICAgICBpZiAobG93cHJvYy5wcm9jZXNzX3N0YXRlICYgUElEX1NUT1BQRUQpCiAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gMzsgICAgLyogbm90UnVubmFibGUgKi8KICAgICAgICAvKiBlbHNlIGlmIChsb3dwcm9jLnByb2Nlc3Nfc3RhdGUgJiBQSURfWk9NQklFKSAqLwogICAgICAgIGVsc2UgaWYgKGxvd3Byb2MuZXhpdGNvZGUgJiB+MHhmZmZmKQogICAgICAgICAgICBsb25nX3JldHVybiA9IDQ7ICAgIC8qIGludmFsaWQgKi8KICAgICAgICBlbHNlCiAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gMTsgICAgLyogcnVubmluZyAqLwojZWxpZiAhZGVmaW5lZChsaW51eCkKI2lmIGRlZmluZWQoaHB1eDEwKSB8fCBkZWZpbmVkKGhwdXgxMSkKICAgICAgICBzd2l0Y2ggKHByb2NfdGFibGVbTG93UHJvY0luZGV4XS5wc3Rfc3RhdCkgewogICAgICAgIGNhc2UgUFNfU1RPUDoKICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSAzOyAgICAvKiBub3RSdW5uYWJsZSAqLwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFBTX1NMRUVQOgogICAgICAgICAgICBsb25nX3JldHVybiA9IDI7ICAgIC8qIHJ1bm5hYmxlICovCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgUFNfUlVOOgogICAgICAgICAgICBsb25nX3JldHVybiA9IDE7ICAgIC8qIHJ1bm5pbmcgKi8KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBQU19aT01CSUU6CiAgICAgICAgY2FzZSBQU19JRExFOgogICAgICAgIGNhc2UgUFNfT1RIRVI6CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSA0OyAgICAvKiBpbnZhbGlkICovCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KI2Vsc2UKI2lmIEhBVkVfS1ZNX0dFVFBST0MyCiAgICAgICAgc3dpdGNoIChwcm9jX3RhYmxlW0xvd1Byb2NJbmRleF0ucF9zdGF0KSB7CiNlbGlmIEhBVkVfS1ZNX0dFVFBST0NTCiAgICAjaWYgZGVmaW5lZChmcmVlYnNkNSkgJiYgX19GcmVlQlNEX3ZlcnNpb24gPj0gNTAwMDE0CiAgICAgICAgc3dpdGNoIChwcm9jX3RhYmxlW0xvd1Byb2NJbmRleF0ua2lfc3RhdCkgewogICAgI2VsaWYgZGVmaW5lZChkcmFnb25mbHkpICYmIF9fRHJhZ29uRmx5X3ZlcnNpb24gPj0gMTkwMDAwCiAgICAgICAgc3dpdGNoIChwcm9jX3RhYmxlW0xvd1Byb2NJbmRleF0ua3Bfc3RhdCkgewogICAgI2VsaWYgZGVmaW5lZChvcGVuYnNkNSkKICAgICAgICBzd2l0Y2ggKHByb2NfdGFibGVbTG93UHJvY0luZGV4XS5wX3N0YXQpIHsKICAgICNlbHNlCiAgICAgICAgc3dpdGNoIChwcm9jX3RhYmxlW0xvd1Byb2NJbmRleF0ua3BfcHJvYy5wX3N0YXQpIHsKICAgICNlbmRpZgojZWxpZiBkZWZpbmVkKGR5bml4KQogICAgICAgIHN3aXRjaCAobG93cHNpbmZvLnByX3N0YXRlKSB7CiNlbGlmIGRlZmluZWQoc29sYXJpczIpCiNpZiBfU0xBU0hfUFJPQ19NRVRIT0RfCiAgICAgICAgc3dpdGNoIChwcm9jX2J1ZiA/IHByb2NfYnVmLT5wcl9sd3AucHJfc3RhdGUgOiBTSURMKSB7CiNlbHNlCiAgICAgICAgc3dpdGNoIChwcm9jX2J1Zi0+cF9zdGF0KSB7CiNlbmRpZgojZWxpZiBkZWZpbmVkKGFpeDQpIHx8IGRlZmluZWQoYWl4NSkgfHwgZGVmaW5lZChhaXg2KQogICAgICAgIHN3aXRjaCAocHJvY190YWJsZVtMb3dQcm9jSW5kZXhdLnBpX3N0YXRlKSB7CiNlbHNlCiAgICAgICAgc3dpdGNoIChwcm9jX3RhYmxlW0xvd1Byb2NJbmRleF0ucF9zdGF0KSB7CiNlbmRpZgogICAgICAgIGNhc2UgU1NUT1A6CiAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gMzsgICAgLyogbm90UnVubmFibGUgKi8KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAwOgojaWZkZWYgU1NXQVAKICAgICAgICBjYXNlIFNTV0FQOgojZW5kaWYKI2lmZGVmIFNTTEVFUAogICAgICAgIGNhc2UgU1NMRUVQOgojZW5kaWYKI2lmZGVmIFNXQUlUCiAgICAgICAgY2FzZSBTV0FJVDoKI2VuZGlmCiAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gMjsgICAgLyogcnVubmFibGUgKi8KICAgICAgICAgICAgYnJlYWs7CiNpZmRlZiBTQUNUSVZFCiAgICAgICAgY2FzZSBTQUNUSVZFOgojZW5kaWYKI2lmZGVmIFNSVU4KICAgICAgICBjYXNlIFNSVU46CiNlbmRpZgojaWZkZWYgU09OUFJPQwogICAgICAgIGNhc2UgU09OUFJPQzoKI2VuZGlmCiAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gMTsgICAgLyogcnVubmluZyAqLwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFNJREw6CiAgICAgICAgY2FzZSBTWk9NQjoKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBsb25nX3JldHVybiA9IDQ7ICAgIC8qIGludmFsaWQgKi8KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQojZW5kaWYKI2Vsc2UKCWlmICgoY3AgPSBnZXRfcHJvY19zdGF0X2ZpZWxkKHBpZCxidWYsc2l6ZW9mKGJ1ZiksMikpICE9IE5VTEwgKSB7CiAgICAgICAgICAgIHN3aXRjaCAoKmNwKSB7CiAgICAgICAgICAgIGNhc2UgJ1InOgogICAgICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSAxOyAgICAgICAgLyogcnVubmluZyAqLwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ1MnOgogICAgICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSAyOyAgICAgICAgLyogcnVubmFibGUgKi8KICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdEJzoKICAgICAgICAgICAgY2FzZSAnVCc6CiAgICAgICAgICAgICAgICBsb25nX3JldHVybiA9IDM7ICAgICAgICAvKiBub3RSdW5uYWJsZSAqLwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ1onOgogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSA0OyAgICAgICAgLyogaW52YWxpZCAqLwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UKICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSA0OyAgICAvKiBpbnZhbGlkICovCiNlbmRpZgogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CgogICAgY2FzZSBIUlNXUlVOUEVSRl9DUFU6CiNpZmRlZiBIQVZFX1NZU19QU1RBVF9ICiAgICAgICAgbG9uZ19yZXR1cm4gPSBwcm9jX2J1Zi5wc3RfY3B0aWNrc3RvdGFsOwogICAgICAgIC8qCiAgICAgICAgICogTm90IGNvbnZpbmNlZCB0aGlzIGlzIHJpZ2h0LCBidXQuLi4uCiAgICAgICAgICovCiNlbGlmIGRlZmluZWQoZHluaXgpCiAgICAgICAgbG9uZ19yZXR1cm4gPSBsb3dwc2luZm8ucHJfdGltZS50dl9zZWMgKiAxMDAgKwogICAgICAgICAgICBsb3dwc2luZm8ucHJfdGltZS50dl9uc2VjIC8gMTAwMDAwMDA7CiNlbGlmIGRlZmluZWQoc29sYXJpczIpCiNpZiBfU0xBU0hfUFJPQ19NRVRIT0RfCiAgICAgICAgbG9uZ19yZXR1cm4gPSBwcm9jX2J1ZiA/IHByb2NfYnVmLT5wcl90aW1lLnR2X3NlYyAqIDEwMCArCiAgICAgICAgICAgIHByb2NfYnVmLT5wcl90aW1lLnR2X25zZWMgLyAxMDAwMDAwMCA6IDA7CiNlbHNlCiAgICAgICAgbG9uZ19yZXR1cm4gPSBwcm9jX2J1Zi0+cF91dGltZSAqIDEwMCArIHByb2NfYnVmLT5wX3N0aW1lICogMTAwOwojZW5kaWYKI2VsaWYgSEFWRV9LVk1fR0VUUFJPQzIKICAgICAgICBsb25nX3JldHVybiA9IHByb2NfdGFibGVbTG93UHJvY0luZGV4XS5wX3V0aWNrcyArCiAgICAgICAgICAgIHByb2NfdGFibGVbTG93UHJvY0luZGV4XS5wX3N0aWNrcyArCiAgICAgICAgICAgIHByb2NfdGFibGVbTG93UHJvY0luZGV4XS5wX2l0aWNrczsKI2VsaWYgSEFWRV9LVk1fR0VUUFJPQ1MKICAgICNpZiBkZWZpbmVkKE5PVF9ERUZJTkVEKSAmJiBkZWZpbmVkKGZyZWVic2Q1KSAmJiBfX0ZyZWVCU0RfdmVyc2lvbiA+PSA1MDAwMTQKICAgICAgICAvKiBYWFg6IEFjY2Vzc2luZyBraV9wYWRkciBjYXVzZXMgc2lnMTAgLi4uCiAgICAgICAgbG9uZ19yZXR1cm4gPSBwcm9jX3RhYmxlW0xvd1Byb2NJbmRleF0ua2lfcGFkZHItPnBfdXRpY2tzICsKICAgICAgICAgICAgcHJvY190YWJsZVtMb3dQcm9jSW5kZXhdLmtpX3BhZGRyLT5wX3N0aWNrcyArCiAgICAgICAgICAgIHByb2NfdGFibGVbTG93UHJvY0luZGV4XS5raV9wYWRkci0+cF9pdGlja3M7ICovCiAgICAgICAgbG9uZ19yZXR1cm4gPSAwOwogICAgI2VsaWYgZGVmaW5lZChmcmVlYnNkNSkKICAgICAgICBsb25nX3JldHVybiA9IHByb2NfdGFibGVbTG93UHJvY0luZGV4XS5raV9ydW50aW1lIC8gMTAwMDAwOwogICAgI2VsaWYgZGVmaW5lZChkcmFnb25mbHkpICYmIF9fRHJhZ29uRmx5X3ZlcnNpb24gPj0gMTkwMDAwCiAgICAgICAgbG9uZ19yZXR1cm4gPSBwcm9jX3RhYmxlW0xvd1Byb2NJbmRleF0ua3BfbHdwLmtsX3V0aWNrcyArCiAgICAgICAgICAgIHByb2NfdGFibGVbTG93UHJvY0luZGV4XS5rcF9sd3Aua2xfc3RpY2tzICsKICAgICAgICAgICAgcHJvY190YWJsZVtMb3dQcm9jSW5kZXhdLmtwX2x3cC5rbF9pdGlja3M7CiAgICAjZWxpZiBkZWZpbmVkKG9wZW5ic2Q1KQogICAgICAgIGxvbmdfcmV0dXJuID0gcHJvY190YWJsZVtMb3dQcm9jSW5kZXhdLnBfdXRpY2tzICsKICAgICAgICAgICAgcHJvY190YWJsZVtMb3dQcm9jSW5kZXhdLnBfc3RpY2tzICsKICAgICAgICAgICAgcHJvY190YWJsZVtMb3dQcm9jSW5kZXhdLnBfaXRpY2tzOwogICAgI2VsaWYgZGVmaW5lZChkcmFnb25mbHkpCiAgICAgICAgbG9uZ19yZXR1cm4gPSBwcm9jX3RhYmxlW0xvd1Byb2NJbmRleF0ua3BfZXByb2MuZV91dGlja3MgKwogICAgICAgICAgICBwcm9jX3RhYmxlW0xvd1Byb2NJbmRleF0ua3BfZXByb2MuZV9zdGlja3MgKwogICAgICAgICAgICBwcm9jX3RhYmxlW0xvd1Byb2NJbmRleF0ua3BfZXByb2MuZV9pdGlja3M7CiAgICAjZWxzZQogICAgICAgIGxvbmdfcmV0dXJuID0gcHJvY190YWJsZVtMb3dQcm9jSW5kZXhdLmtwX3Byb2MucF91dGlja3MgKwogICAgICAgICAgICBwcm9jX3RhYmxlW0xvd1Byb2NJbmRleF0ua3BfcHJvYy5wX3N0aWNrcyArCiAgICAgICAgICAgIHByb2NfdGFibGVbTG93UHJvY0luZGV4XS5rcF9wcm9jLnBfaXRpY2tzOwogICAgI2VuZGlmCiNlbGlmIGRlZmluZWQobGludXgpCglpZiAoKGNwID0gZ2V0X3Byb2Nfc3RhdF9maWVsZChwaWQsYnVmLHNpemVvZihidWYpLDEzKSkgPT0gTlVMTCApIHsKICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSAwOwogICAgICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgbG9uZ19yZXR1cm4gPSBhdG9pKGNwKTsgLyogdXRpbWUgKi8KCiAgICAgICAgY3AgPSBza2lwX3RvX25leHRfZmllbGQoY3ApOwoKICAgICAgICBsb25nX3JldHVybiArPSBhdG9pKGNwKTsgICAgICAgIC8qICsgc3RpbWUgKi8KI2VsaWYgZGVmaW5lZChzdW5vczQpCiAgICAgICAgbG9uZ19yZXR1cm4gPSBwcm9jX3RhYmxlW0xvd1Byb2NJbmRleF0ucF90aW1lOwojZWxpZiBkZWZpbmVkKGN5Z3dpbikKICAgICAgICB7CiAgICAgICAgICAgIERXT1JEICAgICAgICAgICBuID0gbG93cHJvYy5kd1Byb2Nlc3NJZDsKICAgICAgICAgICAgSEFORExFICAgICAgICAgIGggPQogICAgICAgICAgICAgICAgT3BlblByb2Nlc3MoUFJPQ0VTU19RVUVSWV9JTkZPUk1BVElPTiB8IFBST0NFU1NfVk1fUkVBRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFLCBuKTsKICAgICAgICAgICAgRklMRVRJTUUgICAgICAgIGN0LCBldCwga3QsIHV0OwoKICAgICAgICAgICAgaWYgKGgpIHsKICAgICAgICAgICAgICAgIGlmIChHZXRQcm9jZXNzVGltZXMoaCwgJmN0LCAmZXQsICZrdCwgJnV0KSkKICAgICAgICAgICAgICAgICAgICBsb25nX3JldHVybiA9ICh0b19tc2VjKCZrdCkgKyB0b19tc2VjKCZ1dCkpIC8gMTA7CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBzbm1wX2xvZyhMT0dfSU5GTywgIm5vIHByb2Nlc3MgdGltZXMgZm9yICVsdSAoJWx1KVxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3dwcm9jLnBpZCwgbik7CiAgICAgICAgICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSAwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgQ2xvc2VIYW5kbGUoaCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBzbm1wX2xvZyhMT0dfSU5GTywgIm5vIHByb2Nlc3MgaGFuZGxlIGZvciAlbHUgKCVsdSlcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICBsb3dwcm9jLnBpZCwgbik7CiAgICAgICAgICAgICAgICBsb25nX3JldHVybiA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICB9CiNlbGlmIGRlZmluZWQoYWl4NCkgfHwgZGVmaW5lZChhaXg1KSB8fCBkZWZpbmVkKGFpeDYpCiAgICAgICAgbG9uZ19yZXR1cm4gPSBwcm9jX3RhYmxlW0xvd1Byb2NJbmRleF0ucGlfcnUucnVfdXRpbWUudHZfc2VjICogMTAwICsKICAgICAgICAgICAgcHJvY190YWJsZVtMb3dQcm9jSW5kZXhdLnBpX3J1LnJ1X3V0aW1lLnR2X3VzZWMgLyAxMDAwMDAwMCArIC8qIG5hbm9zZWNvbmRzICovCiAgICAgICAgICAgIHByb2NfdGFibGVbTG93UHJvY0luZGV4XS5waV9ydS5ydV9zdGltZS50dl9zZWMgKiAxMDAgKwogICAgICAgICAgICBwcm9jX3RhYmxlW0xvd1Byb2NJbmRleF0ucGlfcnUucnVfc3RpbWUudHZfdXNlYyAvIDEwMDAwMDAwOyAvKiBuYW5vc2Vjb25kcyAqLwojZWxzZQogICAgICAgIGxvbmdfcmV0dXJuID0gcHJvY190YWJsZVtMb3dQcm9jSW5kZXhdLnBfdXRpbWUudHZfc2VjICogMTAwICsKICAgICAgICAgICAgcHJvY190YWJsZVtMb3dQcm9jSW5kZXhdLnBfdXRpbWUudHZfdXNlYyAvIDEwMDAwICsKICAgICAgICAgICAgcHJvY190YWJsZVtMb3dQcm9jSW5kZXhdLnBfc3RpbWUudHZfc2VjICogMTAwICsKICAgICAgICAgICAgcHJvY190YWJsZVtMb3dQcm9jSW5kZXhdLnBfc3RpbWUudHZfdXNlYyAvIDEwMDAwOwojZW5kaWYKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBIUlNXUlVOUEVSRl9NRU06CiNpZmRlZiBIQVZFX1NZU19QU1RBVF9ICiMgaWZkZWYgUEdTSElGVAogICAgICAgIGxvbmdfcmV0dXJuID0gKHByb2NfYnVmLnBzdF9yc3NpemUgPDwgUEdTSElGVCkgLyAxMDI0OwojIGVsc2UKICAgICAgICBsb25nX3JldHVybiA9IHByb2NfYnVmLnBzdF9yc3NpemUgKiBnZXRwYWdlc2l6ZSgpIC8gMTAyNDsKIyBlbmRpZgojZWxpZiBkZWZpbmVkKGR5bml4KQogICAgICAgIGxvbmdfcmV0dXJuID0gKGxvd3BzaW5mby5wcl9yc3NpemUgKiBNTVVfUEFHRVNJWkUpIC8gMTAyNDsKI2VsaWYgZGVmaW5lZChzb2xhcmlzMikKI2lmIF9TTEFTSF9QUk9DX01FVEhPRF8KI2lmZGVmIF9JTFAzMgogICAgICAgIGlmKE5VTEwgIT0gcHJvY19idWYgJiYgMCA9PSBwcm9jX2J1Zi0+cHJfcnNzaXplKQogICAgICAgIHsgLyogT2RkcyBvbiB0aGF0IHdlIGFyZSBsb29raW5nIHdpdGggYSAzMiBiaXQgYXBwIGF0IGEgNjQgYml0IHBzaW5mby4qLwogICAgICAgICAgICBuZXRzbm1wX21lbW9yeV9pbmZvICptZW07CiAgICAgICAgICAgIG5ldHNubXBfbWVtb3J5X2xvYWQoKTsKICAgICAgICAgICAgbWVtID0gbmV0c25tcF9tZW1vcnlfZ2V0X2J5SWR4KCBORVRTTk1QX01FTV9UWVBFX1BIWVNNRU0sIDAgKTsKICAgICAgICAgICAgaWYgKCFtZW0pIAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzbm1wX2xvZyhMT0dfSU5GTywgIm5ldHNubXBfbWVtb3J5X2dldF9ieUlkeCByZXR1cm5lZCBOVUxMIHBvaW50ZXJcbiIpOwogICAgICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSAwOy8qIFRyaWVkIG15IGJlc3QsIGdpdmluZyB1cC4qLwogICAgICAgICAgICB9IAogICAgICAgICAgICBlbHNlIAogICAgICAgICAgICB7LyogMHg4MDAwIGlzIHRoZSBtYXhpbXVtIHJhbmdlIG9mIHByX3BjdG1lbS4gZGV2aXNpb24gb2YgMTAyNCBpcyB0byBnbyBmcm9tIEIgdG8ga0IqLwogICAgICAgICAgICAgICAgdWludDMyX3QgcGN0X3VuaXQgPSAobWVtLT5zaXplLzB4ODAwMCkgKiAobWVtLT51bml0cy8xMDI0KTsKICAgICAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gcHJvY19idWYgPyBwcm9jX2J1Zi0+cHJfcGN0bWVtICogcGN0X3VuaXQgOiAwOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7ICAgIAogICAgICAgICAgICBsb25nX3JldHVybiA9IHByb2NfYnVmID8gcHJvY19idWYtPnByX3Jzc2l6ZSA6IDA7CiAgICAgICAgCiAgICAgICAgfQojZWxzZSAvKl9MUDY0Ki8KICAgICAgICBsb25nX3JldHVybiA9IHByb2NfYnVmID8gcHJvY19idWYtPnByX3Jzc2l6ZSA6IDA7CiNlbmRpZiAvKl9MUDY0Ki8KCiNlbHNlCiAgICAgICAgbG9uZ19yZXR1cm4gPSBwcm9jX2J1Zi0+cF9zd3JzczsKI2VuZGlmCiNlbGlmIGRlZmluZWQoYWl4NCkgfHwgZGVmaW5lZChhaXg1KSB8fCBkZWZpbmVkKGFpeDYpCiAgICAgICAgbG9uZ19yZXR1cm4gPSBwcm9jX3RhYmxlW0xvd1Byb2NJbmRleF0ucGlfc2l6ZSAqIGdldHBhZ2VzaXplKCkgLyAxMDI0OwojZWxpZiBIQVZFX0tWTV9HRVRQUk9DMgogICAgICAgIGxvbmdfcmV0dXJuID0gcHJvY190YWJsZVtMb3dQcm9jSW5kZXhdLnBfdm1fdHNpemUgKwogICAgICAgICAgICBwcm9jX3RhYmxlW0xvd1Byb2NJbmRleF0ucF92bV9zc2l6ZSArCiAgICAgICAgICAgIHByb2NfdGFibGVbTG93UHJvY0luZGV4XS5wX3ZtX2RzaXplOwogICAgICAgIGxvbmdfcmV0dXJuID0gbG9uZ19yZXR1cm4gKiAoZ2V0cGFnZXNpemUoKSAvIDEwMjQpOwojZWxpZiBIQVZFX0tWTV9HRVRQUk9DUyAmJiAhZGVmaW5lZChkYXJ3aW44KQogICNpZiBkZWZpbmVkKE5PVF9ERUZJTkVEKSAmJiBkZWZpbmVkKGZyZWVic2Q1KSAmJiBfX0ZyZWVCU0RfdmVyc2lvbiA+PSA1MDAwMTQKCSAgICAvKiBYWFgKCSAgICBsb25nX3JldHVybiA9IHByb2NfdGFibGVbTG93UHJvY0luZGV4XS5raV92bXNwYWNlLT52bV90c2l6ZSArCgkJCSAgcHJvY190YWJsZVtMb3dQcm9jSW5kZXhdLmtpX3Ztc3BhY2UtPnZtX3NzaXplICsKCQkJICBwcm9jX3RhYmxlW0xvd1Byb2NJbmRleF0ua2lfdm1zcGFjZS0+dm1fZHNpemU7CgkgICAgbG9uZ19yZXR1cm4gPSBsb25nX3JldHVybiAqIChnZXRwYWdlc2l6ZSgpIC8gMTAyNCk7ICovCgkgICAgbG9uZ19yZXR1cm4gPSAwOwogICNlbGlmIGRlZmluZWQoZnJlZWJzZDMpICYmICFkZWZpbmVkKGRhcndpbikKICAgICAgICBsb25nX3JldHVybiA9CiAgICAjaWYgZGVmaW5lZChmcmVlYnNkNSkKICAgICAgICAgICAgcHJvY190YWJsZVtMb3dQcm9jSW5kZXhdLmtpX3NpemUgLyAxMDI0OwogICAgI2VsaWYgZGVmaW5lZChkcmFnb25mbHkpICYmIF9fRHJhZ29uRmx5X3ZlcnNpb24gPj0gMTkwMDAwCiAgICAgICAgICAgIHByb2NfdGFibGVbTG93UHJvY0luZGV4XS5rcF92bV9tYXBfc2l6ZSAvIDEwMjQ7CiAgICAjZWxzZQogICAgICAgICAgICBwcm9jX3RhYmxlW0xvd1Byb2NJbmRleF0ua3BfZXByb2MuZV92bS52bV9tYXAuc2l6ZSAvIDEwMjQ7CiAgICAjZW5kaWYKICAjZWxpZiBkZWZpbmVkKG9wZW5ic2Q1KQogICAgICAgIGxvbmdfcmV0dXJuID0gcHJvY190YWJsZVtMb3dQcm9jSW5kZXhdLnBfdm1fdHNpemUgKwogICAgICAgICAgICBwcm9jX3RhYmxlW0xvd1Byb2NJbmRleF0ucF92bV9zc2l6ZSArCiAgICAgICAgICAgIHByb2NfdGFibGVbTG93UHJvY0luZGV4XS5wX3ZtX2RzaXplOwogICAgICAgIGxvbmdfcmV0dXJuID0gbG9uZ19yZXR1cm4gKiAoZ2V0cGFnZXNpemUoKSAvIDEwMjQpOwogICNlbHNlCiAgICAgICAgbG9uZ19yZXR1cm4gPSBwcm9jX3RhYmxlW0xvd1Byb2NJbmRleF0ua3BfZXByb2MuZV92bS52bV90c2l6ZSArCiAgICAgICAgICAgIHByb2NfdGFibGVbTG93UHJvY0luZGV4XS5rcF9lcHJvYy5lX3ZtLnZtX3NzaXplICsKICAgICAgICAgICAgcHJvY190YWJsZVtMb3dQcm9jSW5kZXhdLmtwX2Vwcm9jLmVfdm0udm1fZHNpemU7CiAgICAgICAgbG9uZ19yZXR1cm4gPSBsb25nX3JldHVybiAqIChnZXRwYWdlc2l6ZSgpIC8gMTAyNCk7CiAgI2VuZGlmCiNlbGlmIGRlZmluZWQobGludXgpCglpZiAoKGNwID0gZ2V0X3Byb2Nfc3RhdF9maWVsZChwaWQsYnVmLHNpemVvZihidWYpLDIzKSkgPT0gTlVMTCApIHsKICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSAwOwogICAgICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgICAgIH0KICAgICAgICBsb25nX3JldHVybiA9IGF0b2koY3ApICogKGdldHBhZ2VzaXplKCkgLyAxMDI0KTsgICAgICAgIC8qIHJzcyAqLwojZWxpZiBkZWZpbmVkKGN5Z3dpbikKICAgICAgICB7CiAgICAgICAgICAgIERXT1JEICAgICAgICAgICBuID0gbG93cHJvYy5kd1Byb2Nlc3NJZDsKICAgICAgICAgICAgSEFORExFICAgICAgICAgIGggPQogICAgICAgICAgICAgICAgT3BlblByb2Nlc3MoUFJPQ0VTU19RVUVSWV9JTkZPUk1BVElPTiB8IFBST0NFU1NfVk1fUkVBRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFLCBuKTsKICAgICAgICAgICAgUFJPQ0VTU19NRU1PUllfQ09VTlRFUlMgcG1jOwoKICAgICAgICAgICAgaWYgKGgpIHsKICAgICAgICAgICAgICAgIGlmIChteUdldFByb2Nlc3NNZW1vcnlJbmZvCiAgICAgICAgICAgICAgICAgICAgJiYgbXlHZXRQcm9jZXNzTWVtb3J5SW5mbyhoLCAmcG1jLCBzaXplb2YgcG1jKSkKICAgICAgICAgICAgICAgICAgICBsb25nX3JldHVybiA9IHBtYy5Xb3JraW5nU2V0U2l6ZSAvIDEwMjQ7CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBzbm1wX2xvZyhMT0dfSU5GTywgIm5vIHByb2Nlc3MgdGltZXMgZm9yICVsdSAoJWx1KVxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3dwcm9jLnBpZCwgbik7CiAgICAgICAgICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSAwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgQ2xvc2VIYW5kbGUoaCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBzbm1wX2xvZyhMT0dfSU5GTywgIm5vIHByb2Nlc3MgaGFuZGxlIGZvciAlbHUgKCVsdSlcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICBsb3dwcm9jLnBpZCwgbik7CiAgICAgICAgICAgICAgICBsb25nX3JldHVybiA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICB9CiNlbHNlCiNpZiBORVRTTk1QX05PX0RVTU1ZX1ZBTFVFUwogICAgICAgIHJldHVybiBOVUxMOwojZW5kaWYKICAgICAgICBsb25nX3JldHVybiA9IDE2ICogMTAyNDsgICAgICAgIC8qIFhYWCAtIDE2TSEgKi8KI2VuZGlmCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGRlZmF1bHQ6CiAgICAgICAgREVCVUdNU0dUTCgoInNubXBkIiwgInVua25vd24gc3ViLWlkICVkIGluIHZhcl9ocnN3cnVuXG4iLAogICAgICAgICAgICAgICAgICAgIHZwLT5tYWdpYykpOwogICAgfQogICAgcmV0dXJuIE5VTEw7Cn0KCgogICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioKCSAqCgkgKiAgSW50ZXJuYWwgaW1wbGVtZW50YXRpb24gZnVuY3Rpb25zCgkgKgoJICoqKioqKioqKioqKioqKioqKioqKi8KCiNpZiBkZWZpbmVkKGxpbnV4KQoKRElSICAgICAgICAgICAgKnByb2NkaXIgPSBOVUxMOwpzdHJ1Y3QgZGlyZW50ICAqcHJvY2VudHJ5X3A7Cgp2b2lkCkluaXRfSFJfU1dSdW4odm9pZCkKewogICAgaWYgKHByb2NkaXIgIT0gTlVMTCkKICAgICAgICBjbG9zZWRpcihwcm9jZGlyKTsKICAgIHByb2NkaXIgPSBvcGVuZGlyKCIvcHJvYyIpOwp9CgppbnQKR2V0X05leHRfSFJfU1dSdW4odm9pZCkKewogICAgaW50ICAgICAgICAgICAgIHBpZDsKICAgIGlmIChwcm9jZGlyID09IE5VTEwpCiAgICAgIHJldHVybiAtMTsKICAgIHByb2NlbnRyeV9wID0gcmVhZGRpcihwcm9jZGlyKTsKCiAgICBpZiAocHJvY2VudHJ5X3AgPT0gTlVMTCkKICAgICAgICByZXR1cm4gLTE7CgogICAgcGlkID0gYXRvaShwcm9jZW50cnlfcC0+ZF9uYW1lKTsKICAgIGlmIChwaWQgPT0gMCkKICAgICAgICByZXR1cm4gKEdldF9OZXh0X0hSX1NXUnVuKCkpOwogICAgcmV0dXJuIHBpZDsKfQoKdm9pZApFbmRfSFJfU1dSdW4odm9pZCkKewogICAgaWYgKHByb2NkaXIpCiAgICAgICAgY2xvc2VkaXIocHJvY2Rpcik7CiAgICBwcm9jZGlyID0gTlVMTDsKfQoKI2VsaWYgZGVmaW5lZChjeWd3aW4pCgpzdGF0aWMgcGlkX3QgICAgY3VycGlkOwoKdm9pZApJbml0X0hSX1NXUnVuKHZvaWQpCnsKICAgIGN5Z3dpbl9pbnRlcm5hbChDV19MT0NLX1BJTkZPLCAxMDAwKTsKICAgIGN1cnBpZCA9IDA7Cn0KCmludApHZXRfTmV4dF9IUl9TV1J1bih2b2lkKQp7CiAgICBjdXJwcm9jID0KICAgICAgICAoc3RydWN0IGV4dGVybmFsX3BpbmZvICopIGN5Z3dpbl9pbnRlcm5hbChxdWVyeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJwaWQgfCBDV19ORVhUUElEKTsKICAgIGlmIChjdXJwcm9jKQogICAgICAgIGN1cnBpZCA9IGN1cnByb2MtPnBpZDsKICAgIGVsc2UgewogICAgICAgIGN1cnBpZCA9IC0xOwogICAgfQogICAgcmV0dXJuIGN1cnBpZDsKfQoKdm9pZApFbmRfSFJfU1dSdW4odm9pZCkKewogICAgY3lnd2luX2ludGVybmFsKENXX1VOTE9DS19QSU5GTyk7Cn0KCiNlbGlmIGRlZmluZWQoZHluaXgpCgp2b2lkCkluaXRfSFJfU1dSdW4odm9pZCkKewogICAgbmV4dHByb2MgPSAwOwp9CgppbnQKR2V0X05leHRfSFJfU1dSdW4odm9pZCkKewogICAgZ2V0cHJwc2luZm9fdCAgKnNlbGVjdCA9IDA7CgogICAgREVCVUdNU0dUTCgoImhvc3QvaHJfc3dydW46OkdldE5leHRIUl9TV1J1biIsCiAgICAgICAgICAgICAgICAibmV4dHByb2MgPT0gJWQuLi4gJm5leHRwcm9jID0gJXVcbiIsIG5leHRwcm9jLAogICAgICAgICAgICAgICAgJm5leHRwcm9jKSk7CiAgICBpZiAoKG5leHRwcm9jID0gZ2V0cHJwc2luZm8obmV4dHByb2MsIHNlbGVjdCwgJm15cHNpbmZvKSkgPCAwKSB7CiAgICAgICAgcmV0dXJuIC0xOwogICAgfSBlbHNlIHsKICAgICAgICBERUJVR01TR1RMKCgiaG9zdC9ocl9zd3J1bjo6R2V0TmV4dEhSX1NXUnVuIiwKICAgICAgICAgICAgICAgICAgICAiZ2V0cHJwc2luZm8gcmV0dXJuZWQgJWRcbiIsIG5leHRwcm9jKSk7CiAgICAgICAgcmV0dXJuIG15cHNpbmZvLnByX3BpZDsKICAgIH0KCn0KCnZvaWQKRW5kX0hSX1NXUnVuKHZvaWQpCnsKICAgIC8qCiAgICAgKiBqdXN0IGEgc3R1Yi4uLiBiZWNhdXNlIGl0J3MgZGVjbGFyZWQgCiAgICAgKi8KfQoKI2Vsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsaW51eCAqLwoKc3RhdGljIGludCAgICAgIG5wcm9jOwoKdm9pZApJbml0X0hSX1NXUnVuKHZvaWQpCnsKICAgIHNpemVfdCAgICAgICAgICBieXRlczsKICAgIHN0YXRpYyB0aW1lX3QgICBpd2hlbiA9IDA7CiAgICB0aW1lX3QgICAgICAgICAgbm93OwoKICAgIHRpbWUoJm5vdyk7CiAgICBpZiAobm93ID09IGl3aGVuKSB7CiAgICAgICAgY3VycmVudF9wcm9jX2VudHJ5ID0gMDsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBpd2hlbiA9IG5vdzsKCiNpZiBkZWZpbmVkKGhwdXgxMCkgfHwgZGVmaW5lZChocHV4MTEpCiAgICBwc3RhdF9nZXRkeW5hbWljKCZwc3RfZHluLCBzaXplb2Yoc3RydWN0IHBzdF9keW5hbWljKSwgMSwgMCk7CiAgICBucHJvYyA9IHBzdF9keW4ucHNkX2FjdGl2ZXByb2NzOwogICAgYnl0ZXMgPSBucHJvYyAqIHNpemVvZihzdHJ1Y3QgcHN0X3N0YXR1cyk7CiAgICBpZiAoKHByb2NfdGFibGUgPQogICAgICAgICAoc3RydWN0IHBzdF9zdGF0dXMgKikgcmVhbGxvYyhwcm9jX3RhYmxlLCBieXRlcykpID09IE5VTEwpIHsKICAgICAgICBjdXJyZW50X3Byb2NfZW50cnkgPSBucHJvYyArIDE7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgcHN0YXRfZ2V0cHJvYyhwcm9jX3RhYmxlLCBzaXplb2Yoc3RydWN0IHBzdF9zdGF0dXMpLCBucHJvYywgMCk7CgojZWxpZiBkZWZpbmVkKHNvbGFyaXMyKQogICAgaWYgKGdldEtzdGF0SW50KCJ1bml4IiwgInN5c3RlbV9taXNjIiwgIm5wcm9jIiwgJm5wcm9jKSkgewogICAgICAgIGN1cnJlbnRfcHJvY19lbnRyeSA9IG5wcm9jICsgMTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBieXRlcyA9IG5wcm9jICogc2l6ZW9mKGludCk7CiAgICBpZiAoKHByb2NfdGFibGUgPSAoaW50ICopIHJlYWxsb2MocHJvY190YWJsZSwgYnl0ZXMpKSA9PSBOVUxMKSB7CiAgICAgICAgY3VycmVudF9wcm9jX2VudHJ5ID0gbnByb2MgKyAxOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIHsKICAgICAgICBESVIgICAgICAgICAgICAqZjsKICAgICAgICBzdHJ1Y3QgZGlyZW50ICAqZHA7CiNpZiBfU0xBU0hfUFJPQ19NRVRIT0RfID09IDAKICAgICAgICBpZiAoa2QgPT0gTlVMTCkgewogICAgICAgICAgICBjdXJyZW50X3Byb2NfZW50cnkgPSBucHJvYyArIDE7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiNlbmRpZgogICAgICAgIGYgPSBvcGVuZGlyKCIvcHJvYyIpOwogICAgICAgIGN1cnJlbnRfcHJvY19lbnRyeSA9IDA7CiAgICAgICAgd2hpbGUgKChkcCA9IHJlYWRkaXIoZikpICE9IE5VTEwgJiYgY3VycmVudF9wcm9jX2VudHJ5IDwgbnByb2MpCiAgICAgICAgICAgIGlmIChkcC0+ZF9uYW1lWzBdICE9ICcuJykKICAgICAgICAgICAgICAgIHByb2NfdGFibGVbY3VycmVudF9wcm9jX2VudHJ5KytdID0gYXRvaShkcC0+ZF9uYW1lKTsKICAgICAgICAvKgogICAgICAgICAqIGlmIHdlIGFyZSBpbiBhIFNvbGFyaXMgem9uZSwgbnByb2MgPiBjdXJyZW50X3Byb2NfZW50cnkgIQogICAgICAgICAqIGJ1dCB3ZSBvbmx5IHdhbnQgdGhlIHByb2Nlc3NlcyBmcm9tIHRoZSBsb2NhbCB6b25lCiAgICAgICAgICovCiAgICAgICAgaWYgKGN1cnJlbnRfcHJvY19lbnRyeSAhPSBucHJvYykKICAgICAgICAgICAgbnByb2MgPSBjdXJyZW50X3Byb2NfZW50cnk7CiAgICAgICAgY2xvc2VkaXIoZik7CiAgICB9CiNlbGlmIGRlZmluZWQoYWl4NCkgfHwgZGVmaW5lZChhaXg1KSB8fCBkZWZpbmVkKGFpeDYpCiAgICB7CgkJcGlkX3QgcHJvY19pbmRleCA9IDA7CgkJaW50IGF2YWlsID0gMTAyNDsKCQlpZiAocHJvY190YWJsZSkgewoJCQlmcmVlKHByb2NfdGFibGUpOwoJCX0KCQlucHJvYyA9IDA7CgkJcHJvY190YWJsZSA9IG1hbGxvYyhzaXplb2YocHJvY190YWJsZVswXSkgKiBhdmFpbCk7CgkJZm9yICg7OykgewoJCQlpbnQgZ290OwoJCQlpZiAoIXByb2NfdGFibGUpIHsKCQkJCW5wcm9jID0gMDsKCQkJCXNubXBfbG9nX3BlcnJvcigiSW5pdF9IUl9TV1J1bi1tYWxsb2MiKTsKCQkJCXJldHVybjsKCQkJfQoJCQlnb3QgPSBnZXRwcm9jcyhwcm9jX3RhYmxlICsgbnByb2MsIHNpemVvZihwcm9jX3RhYmxlWzBdKSwKCQkJCQkJICAgMCwgc2l6ZW9mKHN0cnVjdCBmZHNpbmZvKSwKCQkJCQkJICAgJnByb2NfaW5kZXgsIGF2YWlsIC0gbnByb2MpOwoJCQlucHJvYyArPSBnb3Q7CgkJCWlmIChucHJvYyA8IGF2YWlsKSB7CgkJCQlicmVhazsKCQkJfQoJCQlhdmFpbCArPSAxMDI0OwoJCQlwcm9jX3RhYmxlID0gcmVhbGxvYyhwcm9jX3RhYmxlLCBhdmFpbCAqIHNpemVvZihwcm9jX3RhYmxlWzBdKSk7CgkJfQogICAgfQojZWxpZiBIQVZFX0tWTV9HRVRQUk9DMgogICAgewogICAgICAgIGlmIChrZCA9PSBOVUxMKSB7CiAgICAgICAgICAgIG5wcm9jID0gMDsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBwcm9jX3RhYmxlID0ga3ZtX2dldHByb2MyKGtkLCBLRVJOX1BST0NfQUxMLCAwLCBzaXplb2YgKHN0cnVjdCBraW5mb19wcm9jMiksICZucHJvYyk7CiAgICB9CiNlbGlmIEhBVkVfS1ZNX0dFVFBST0NTCiAgICB7CiAgICAgICAgaWYgKGtkID09IE5VTEwpIHsKICAgICAgICAgICAgbnByb2MgPSAwOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICNpZiBkZWZpbmVkKG9wZW5ic2Q1KQogICAgICAgIHByb2NfdGFibGUgPSBrdm1fZ2V0cHJvY3Moa2QsIEtFUk5fUFJPQ19BTEwsIDAsIHNpemVvZiAoc3RydWN0IGtpbmZvX3Byb2MpLCAmbnByb2MpOwogICNlbHNlCiAgICAgICAgcHJvY190YWJsZSA9IGt2bV9nZXRwcm9jcyhrZCwgS0VSTl9QUk9DX0FMTCwgMCwgJm5wcm9jKTsKICAjZW5kaWYKICAgIH0KI2Vsc2UKCiAgICBjdXJyZW50X3Byb2NfZW50cnkgPSAxOwojaWZuZGVmIGJzZGkyCiAgICBucHJvYyA9IDA7CgogICAgaWYgKGF1dG9fbmxpc3QoTlBST0NfU1lNQk9MLCAoY2hhciAqKSAmbnByb2MsIHNpemVvZihpbnQpKSA9PSAwKSB7CiAgICAgICAgc25tcF9sb2dfcGVycm9yKCJJbml0X0hSX1NXUnVuLWF1dG9fbmxpc3QgTlBST0MiKTsKICAgICAgICByZXR1cm47CiAgICB9CiNlbmRpZgogICAgYnl0ZXMgPSBucHJvYyAqIHNpemVvZihzdHJ1Y3QgcHJvYyk7CgogICAgaWYgKHByb2NfdGFibGUpCiAgICAgICAgZnJlZSgoY2hhciAqKSBwcm9jX3RhYmxlKTsKICAgIGlmICgocHJvY190YWJsZSA9IChzdHJ1Y3QgcHJvYyAqKSBtYWxsb2MoYnl0ZXMpKSA9PSBOVUxMKSB7CiAgICAgICAgbnByb2MgPSAwOwogICAgICAgIHNubXBfbG9nX3BlcnJvcigiSW5pdF9IUl9TV1J1bi1tYWxsb2MiKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgewogICAgICAgIGludCAgICAgICAgICAgICBwcm9jX3RhYmxlX2Jhc2U7CiAgICAgICAgaWYgKGF1dG9fbmxpc3QKICAgICAgICAgICAgKFBST0NfU1lNQk9MLCAoY2hhciAqKSAmcHJvY190YWJsZV9iYXNlLAogICAgICAgICAgICAgc2l6ZW9mKHByb2NfdGFibGVfYmFzZSkpID09IDApIHsKICAgICAgICAgICAgbnByb2MgPSAwOwogICAgICAgICAgICBzbm1wX2xvZ19wZXJyb3IoIkluaXRfSFJfU1dSdW4tYXV0b19ubGlzdCBQUk9DIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgaWYgKE5FVFNOTVBfS0xPT0tVUChwcm9jX3RhYmxlX2Jhc2UsIChjaGFyICopIHByb2NfdGFibGUsIGJ5dGVzKSA9PSAwKSB7CiAgICAgICAgICAgIG5wcm9jID0gMDsKICAgICAgICAgICAgc25tcF9sb2dfcGVycm9yKCJJbml0X0hSX1NXUnVuLWtsb29rdXAiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KI2VuZGlmCiAgICBjdXJyZW50X3Byb2NfZW50cnkgPSAwOwp9CgppbnQKR2V0X05leHRfSFJfU1dSdW4odm9pZCkKewogICAgd2hpbGUgKGN1cnJlbnRfcHJvY19lbnRyeSA8IG5wcm9jKSB7CiNpZiBkZWZpbmVkKGhwdXgxMCkgfHwgZGVmaW5lZChocHV4MTEpCiAgICAgICAgcmV0dXJuIHByb2NfdGFibGVbY3VycmVudF9wcm9jX2VudHJ5KytdLnBzdF9waWQ7CiNlbGlmIGRlZmluZWQoc29sYXJpczIpCiAgICAgICAgcmV0dXJuIHByb2NfdGFibGVbY3VycmVudF9wcm9jX2VudHJ5KytdOwojZWxpZiBIQVZFX0tWTV9HRVRQUk9DMgogICAgICAgIGlmIChwcm9jX3RhYmxlW2N1cnJlbnRfcHJvY19lbnRyeV0ucF9zdGF0ICE9IDApCiAgICAgICAgICAgIHJldHVybiBwcm9jX3RhYmxlW2N1cnJlbnRfcHJvY19lbnRyeSsrXS5wX3BpZDsKI2VsaWYgSEFWRV9LVk1fR0VUUFJPQ1MKICAgICNpZiBkZWZpbmVkKGZyZWVic2Q1KSAmJiBfX0ZyZWVCU0RfdmVyc2lvbiA+PSA1MDAwMTQKICAgICAgICBpZiAocHJvY190YWJsZVtjdXJyZW50X3Byb2NfZW50cnldLmtpX3N0YXQgIT0gMCkKICAgICAgICAgICAgcmV0dXJuIHByb2NfdGFibGVbY3VycmVudF9wcm9jX2VudHJ5KytdLmtpX3BpZDsKICAgICNlbGlmIGRlZmluZWQoZHJhZ29uZmx5KSAmJiBfX0RyYWdvbkZseV92ZXJzaW9uID49IDE5MDAwMAogICAgICAgIGlmIChwcm9jX3RhYmxlW2N1cnJlbnRfcHJvY19lbnRyeV0ua3Bfc3RhdCAhPSAwKQogICAgICAgICAgICByZXR1cm4gcHJvY190YWJsZVtjdXJyZW50X3Byb2NfZW50cnkrK10ua3BfcGlkOwogICAgI2VsaWYgZGVmaW5lZChvcGVuYnNkNSkKICAgICAgICBpZiAocHJvY190YWJsZVtjdXJyZW50X3Byb2NfZW50cnldLnBfc3RhdCAhPSAwKQogICAgICAgICAgICByZXR1cm4gcHJvY190YWJsZVtjdXJyZW50X3Byb2NfZW50cnkrK10ucF9waWQ7CiAgICAjZWxzZQogICAgICAgIGlmIChwcm9jX3RhYmxlW2N1cnJlbnRfcHJvY19lbnRyeV0ua3BfcHJvYy5wX3N0YXQgIT0gMCkKICAgICAgICAgICAgcmV0dXJuIHByb2NfdGFibGVbY3VycmVudF9wcm9jX2VudHJ5KytdLmtwX3Byb2MucF9waWQ7CiAgICAjZW5kaWYKI2VsaWYgZGVmaW5lZChhaXg0KSB8fCBkZWZpbmVkKGFpeDUpIHx8IGRlZmluZWQoYWl4NikKICAgICAgICBpZiAocHJvY190YWJsZVtjdXJyZW50X3Byb2NfZW50cnldLnBpX3N0YXRlICE9IDApCiAgICAgICAgICAgIHJldHVybiBwcm9jX3RhYmxlW2N1cnJlbnRfcHJvY19lbnRyeSsrXS5waV9waWQ7CiAgICAgICAgZWxzZQogICAgICAgICAgICArK2N1cnJlbnRfcHJvY19lbnRyeTsKI2Vsc2UKICAgICAgICBpZiAocHJvY190YWJsZVtjdXJyZW50X3Byb2NfZW50cnldLnBfc3RhdCAhPSAwKQogICAgICAgICAgICByZXR1cm4gcHJvY190YWJsZVtjdXJyZW50X3Byb2NfZW50cnkrK10ucF9waWQ7CiAgICAgICAgZWxzZQogICAgICAgICAgICArK2N1cnJlbnRfcHJvY19lbnRyeTsKI2VuZGlmCgogICAgfQogICAgcmV0dXJuIC0xOwp9Cgp2b2lkCkVuZF9IUl9TV1J1bih2b2lkKQp7CiAgICBjdXJyZW50X3Byb2NfZW50cnkgPSBucHJvYyArIDE7Cn0KI2VuZGlmCgppbnQKY291bnRfcHJvY2Vzc2VzKHZvaWQpCnsKI2lmICEoZGVmaW5lZChsaW51eCkgfHwgZGVmaW5lZChjeWd3aW4pIHx8IGRlZmluZWQoaHB1eDEwKSB8fCBkZWZpbmVkKGhwdXgxMSkgfHwgZGVmaW5lZChzb2xhcmlzMikgfHwgSEFWRV9LVk1fR0VUUFJPQ1MgfHwgSEFWRV9LVk1fR0VUUFJPQzIgfHwgZGVmaW5lZChkeW5peCkpCiAgICBpbnQgICAgICAgICAgICAgaTsKI2VuZGlmCiAgICBpbnQgICAgICAgICAgICAgdG90YWwgPSAwOwoKICAgIEluaXRfSFJfU1dSdW4oKTsKI2lmIGRlZmluZWQoaHB1eDEwKSB8fCBkZWZpbmVkKGhwdXgxMSkgfHwgSEFWRV9LVk1fR0VUUFJPQ1MgfHwgSEFWRV9LVk1fR0VUUFJPQzIgfHwgZGVmaW5lZChzb2xhcmlzMikKICAgIHRvdGFsID0gbnByb2M7CiNlbHNlCiNpZiBkZWZpbmVkKGFpeDQpIHx8IGRlZmluZWQoYWl4NSkgfHwgZGVmaW5lZChhaXg2KQogICAgZm9yIChpID0gMDsgaSA8IG5wcm9jOyArK2kpIHsKICAgICAgICBpZiAocHJvY190YWJsZVtpXS5waV9zdGF0ZSAhPSAwKQojZWxpZiAhZGVmaW5lZChsaW51eCkgJiYgIWRlZmluZWQoY3lnd2luKSAmJiAhZGVmaW5lZChkeW5peCkKICAgIGZvciAoaSA9IDA7IGkgPCBucHJvYzsgKytpKSB7CiAgICAgICAgaWYgKHByb2NfdGFibGVbaV0ucF9zdGF0ICE9IDApCiNlbHNlCiAgICB3aGlsZSAoR2V0X05leHRfSFJfU1dSdW4oKSAhPSAtMSkgewojZW5kaWYKICAgICAgICArK3RvdGFsOwogICAgfQojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICFocHV4MTAgJiYgIWhwdXgxMSAmJiAhSEFWRV9LVk1fR0VUUFJPQ1MgJiYgIUhBVkVfS1ZNX0dFVFBST0MyICYmICFzb2xhcmlzMiAqLwogICAgRW5kX0hSX1NXUnVuKCk7CiAgICByZXR1cm4gdG90YWw7Cn0K