ZGlmZiAtLWdpdCBhL3NyYy9NYWtlX2JjMy5tYWsgYi9zcmMvTWFrZV9iYzMubWFrCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGU3ODQ3Li4wMDAwMDAwCi0tLSBhL3NyYy9NYWtlX2JjMy5tYWsKKysrIC9kZXYvbnVsbApAQCAtMSwxODQgKzAsMCBAQAotIyBNYWtlZmlsZSBmb3IgQm9ybGFuZCBDKysgMy4xIG9yIDQuMCB0byBjb21waWxlIGEgMTYgYml0IHZlcnNpb24gb2YgVmltLgotIwotIyBOT1RFOiBUSElTIElTIE9MRCBBTkQgUFJPQkFCTFkgTk8gTE9OR0VSIFdPUktTLgotIwotIyBUaGVyZSBhcmUgY29tcGlsYXRpb24gb3B0aW9ucyBhdCB0aGUgZW5kIG9mIHRoaXMgZmlsZS4KLSMKLSMgQ29tbWFuZCBsaW5lIHZhcmlhYmxlczoKLSMgQk9SCQlwYXRoIHRvIHJvb3Qgb2YgQm9ybGFuZCBDIChFOlxCT1JMQU5EQykKLSMgREVCVUcJCXNldCB0byAieWVzIiBmb3IgZGVidWdnaW5nIChubykKLSMgU1BBV05PCXBhdGggdG8gdGhlIHNwYXdubyBsaWJyYXJ5IGRpcmVjdG9yeSwgZW1wdHkgaWYgeW91IGRvIG5vdCBoYXZlCi0jCQlpdDsgdXNlIDguMyBmaWxlbmFtZXMhIChDOlxDQ1xTUEFXTikKLQotLkFVVE9ERVBFTkQKLQotIWlmbmRlZiBCT1IKLUJPUiA9IEU6XEJPUkxBTkRDCi0hZW5kaWYKLQotIWlmICgiJChERUJVRykiID09ICJ5ZXMiKQotREVCVUdfRkxBRyA9IC12Ci0hZWxzZQotREVCVUdfRkxBRyA9Ci0hZW5kaWYKLQotQ0MgPSAkKEJPUilcYmluXGJjYy5leGUgK1ZJTS5DRkcKLVRMSU5LID0gJChCT1IpXGJpblx0bGluay5leGUKLQotIWlmbmRlZiBTUEFXTk8KLVNQQVdOTyA9IEM6XENDXFNQQVdOCi0hZW5kaWYKLQotIWlmICgiJChTUEFXTk8pIiA9PSAiIikKLUxJQlBBVEggPSAkKEJPUilcTElCCi1JTkNMVURFUEFUSCA9ICQoQk9SKVxJTkNMVURFCi1TUEFXTkQgPQotU1BBV05MID0KLSFlbHNlCi1MSUJQQVRIID0gJChCT1IpXExJQjskKFNQQVdOTykKLUlOQ0xVREVQQVRIID0gJChCT1IpXElOQ0xVREU7JChTUEFXTk8pCi1TUEFXTkQgPSA7U1BBV05PCi1TUEFXTkwgPSBzcGF3bmwubGliCi0hZW5kaWYKLQotCi0jCQkqSW1wbGljaXQgUnVsZXMqCi0jCi0jIHVzZSAtdiBmb3IgZGVidWdnaW5nCi0jCi0uYy5vYmo6Ci0JJChDQykgLWMgJChERUJVR19GTEFHKSB7JDwgfQotCi0jCQkqTGlzdCBNYWNyb3MqCi0KLQotRVhFX2RlcGVuZGVuY2llcyA9IFwKLQlibG93ZmlzaC5vYmogXAotCWJ1ZmZlci5vYmogXAotCWNoYXJzZXQub2JqIFwKLQljcnlwdC5vYmogXAotCWNyeXB0X3ppcC5vYmogXAotCWRpZmYub2JqIFwKLQlkaWdyYXBoLm9iaiBcCi0JZWRpdC5vYmogXAotCWV2YWwub2JqIFwKLQlleF9jbWRzLm9iaiBcCi0JZXhfY21kczIub2JqIFwKLQlleF9kb2NtZC5vYmogXAotCWV4X2V2YWwub2JqIFwKLQlleF9nZXRsbi5vYmogXAotCWZpbGVpby5vYmogXAotCWZvbGQub2JqIFwKLQlnZXRjaGFyLm9iaiBcCi0JaGFyZGNvcHkub2JqIFwKLQloYXNodGFiLm9iaiBcCi0JanNvbi5vYmogXAotCW1haW4ub2JqIFwKLQltYXJrLm9iaiBcCi0JbWVtZmlsZS5vYmogXAotCW1lbWxpbmUub2JqIFwKLQltZW51Lm9iaiBcCi0JbWVzc2FnZS5vYmogXAotCW1pc2MxLm9iaiBcCi0JbWlzYzIub2JqIFwKLQltb3ZlLm9iaiBcCi0Jb3NfbXNkb3Mub2JqIFwKLQlub3JtYWwub2JqIFwKLQlvcHMub2JqIFwKLQlvcHRpb24ub2JqIFwKLQlwb3B1cG1udS5vYmogXAotCXF1aWNrZml4Lm9iaiBcCi0JcmVnZXhwLm9iaiBcCi0Jc2NyZWVuLm9iaiBcCi0Jc2VhcmNoLm9iaiBcCi0Jc2hhMjU2Lm9iaiBcCi0Jc3BlbGwub2JqIFwKLQlzeW50YXgub2JqIFwKLQl0YWcub2JqIFwKLQl0ZXJtLm9iaiBcCi0JdWkub2JqIFwKLQl1bmRvLm9iaiBcCi0Jd2luZG93Lm9iagotCi1hbGw6IHZpbS5leGUgaW5zdGFsbC5leGUgdW5pbnN0YWwuZXhlIHh4ZC94eGQuZXhlCi0KLSMJCSpFeHBsaWNpdCBSdWxlcyoKLQotdmltLmV4ZTogdmltLmNmZyAkKEVYRV9kZXBlbmRlbmNpZXMpIHZlcnNpb24uYwotCSQoQ0MpICQoREVCVUdfRkxBRykgLWMgdmVyc2lvbi5jCi0JJChUTElOSykgL3gvYy9MJChMSUJQQVRIKSAkKERFQlVHX0ZMQUcpIEAmJnwKLWMwbC5vYmogJChFWEVfZGVwZW5kZW5jaWVzKSB2ZXJzaW9uLm9iagotdmltCi0JCSMgbm8gbWFwIGZpbGUKLSQoU1BBV05MKSBjbC5saWIKLXwKLQotaW5zdGFsbC5leGU6IGRvc2luc3QuYwotCSQoQ0MpIC1laW5zdGFsbCAkKERFQlVHX0ZMQUcpIGRvc2luc3QuYwotCi11bmluc3RhbC5leGU6IHVuaW5zdGFsLmMKLQkkKENDKSAkKERFQlVHX0ZMQUcpIHVuaW5zdGFsLmMKLQotIyBUaGlzIG1heSBmYWlsIGZvciBvbGRlciBtYWtlIHZlcnNpb25zLCBidWlsZGluZyB4eGQgd2lsbCBmYWlsIGFueXdheSB0aGVuLgoteHhkL3h4ZC5leGU6IHh4ZC94eGQuYwotCWNkIHh4ZAotCSQoTUFLRSkgLWYgTWFrZV9iYzMubWFrIEJPUj0kKEJPUikgREVCVUc9JChERUJVRykKLQljZCAuLgotCi0jIGNsZWFuaW5nIHVwOiBEZWxldGUgYWxsIGdlbmVyYXRlZCBmaWxlcwotY2xlYW46Ci0JLWRlbCAqLm9iagotCS1kZWwgdmltLmV4ZQotCS1kZWwgdmltLnN5bQotCS1kZWwgaW5zdGFsbC5leGUKLQktZGVsIHVuaW5zdGFsLmV4ZQotCS1kZWwgeHhkXCoub2JqCi0JLWRlbCB4eGRceHhkLmV4ZQotCS1kZWwgdmltLmNmZwotCS1kZWwgdGVzdGRpclwqLm91dAotCi0jIEluZGl2aWR1YWwgRmlsZSBEZXBlbmRlbmNpZXMgKGluY29tcGxldGUpCi1leF9kb2NtZC5vYmo6IGV4X2RvY21kLmMgZXhfY21kcy5oCi0KLWV4X2V2YWwub2JqOiBleF9ldmFsLmMgZXhfY21kcy5oCi0KLW1haW4ub2JqOiBtYWluLmMgZ2xvYmFscy5oIG9wdGlvbi5oCi0KLXRlcm0ub2JqOiB0ZXJtLmMgdGVybS5oCi0KLXZlcnNpb24ub2JqOiB2ZXJzaW9uLmMgdmVyc2lvbi5oCi0KLQotIyBDb21waWxlciBDb25maWd1cmF0aW9uIEZpbGUKLSMKLSMgVGhlIGZvbGxvd2luZyBjb21waWxlIG9wdGlvbnMgY2FuIGJlIGNoYW5nZWQgZm9yIGJldHRlciBtYWNoaW5lcy4KLSMJcmVwbGFjZSAtMS0gd2l0aCAtMiB0byBwcm9kdWNlIGNvZGUgZm9yIGEgODAyODYgb3IgaGlnaGVyCi0jCXJlcGxhY2UgLTEtIHdpdGggLTMgdG8gcHJvZHVjZSBjb2RlIGZvciBhIDgwMzg2IG9yIGhpZ2hlcgotIwlhZGQgLXYgZm9yIHNvdXJjZSBkZWJ1Z2dpbmcKLXZpbS5jZmc6IE1ha2VfYmMzLm1hawotCWNvcHkgJiZ8Ci0tbWwKLS0xLQotLWYtCi0tQwotLU4KLS1PCi0tWgotLWstCi0tZAotLWgKLS12aS0KLS1IPVZJTS5TWU0KLS13LXBhcgotLXdlYXMKLS13cHJlCi0tSXByb3RvCi0tSSQoSU5DTFVERVBBVEgpCi0tTCQoTElCUEFUSCkKLS1ETVNET1M7RkVBVF9USU5ZJChTUEFXTkQpCi18IHZpbS5jZmcKLQotdGVzdDoKLQljZCB0ZXN0ZGlyCi0JJChNQUtFKSAtZiBNYWtlX2Rvcy5tYWsgc21hbGwKLQljZCAuLgpkaWZmIC0tZ2l0IGEvc3JjL01ha2VfYmM1Lm1hayBiL3NyYy9NYWtlX2JjNS5tYWsKaW5kZXggY2I0OGNlMC4uMDEyODY2YiAxMDA2NDQKLS0tIGEvc3JjL01ha2VfYmM1Lm1haworKysgYi9zcmMvTWFrZV9iYzUubWFrCkBAIC03LDYgKzcsNyBAQAogIwogIyBDb250cmlidXRlZCBieSBCZW4gU2luZ2VyLgogIyBVcGRhdGVkIDQvMTk5NyBieSBSb24gQWFyb24KKyMJMjAxNjogcmVtb3ZlZCBzdXBwb3J0IGZvciAxNiBiaXQgRE9TCiAjCTYvMTk5NyAtIGFkZGVkIHN1cHBvcnQgZm9yIDE2IGJpdCBET1MKICMJTm90ZTogdGhpcyBoYXMgYmVlbiB0ZXN0ZWQsIGFuZCB3b3JrcywgZm9yIEJDNS4gIFlvdXIgbWlsZWFnZSBtYXkgdmFyeS4KICMJSGFzIGJlZW4gcmVwb3J0ZWQgTk9UIHRvIHdvcmsgd2l0aCBCQyA0LjUyLiAgTWF5YmUgaXQgY2FuIGJlIGZpeGVkPwpAQCAtMzQsOCArMzUsNyBAQAogIyBuYW1lCQl2YWx1ZSAoZGVmYXVsdCkKICMKICMgQk9SCQlwYXRoIHRvIHJvb3Qgb2YgQm9ybGFuZCBDIGluc3RhbGwgKGM6XGJjNSkKLSMgTElOSwkJbmFtZSBvZiB0aGUgbGlua2VyICgkKEJPUilcYmluXGlsaW5rIGlmIE9TVFlQRSBpcyBET1MxNiwKLSMJCSQoQk9SKVxiaW5caWxpbmszMiBvdGhlcndpc2UpCisjIExJTksJCW5hbWUgb2YgdGhlIGxpbmtlciAoJChCT1IpXGJpblxpbGluazMyKQogIyBHVUkJCW5vIG9yIHllczogc2V0IHRvIHllcyBpZiB5b3Ugd2FudCB0aGUgR1VJIHZlcnNpb24gKHllcykKICMgTFVBICAgICBkZWZpbmUgdG8gcGF0aCB0byBMdWEgZGlyIHRvIGdldCBMdWEgc3VwcG9ydCAobm90IGRlZmluZWQpCiAjICAgTFVBX1ZFUgkgIGRlZmluZSB0byB2ZXJzaW9uIG9mIEx1YSBiZWluZyB1c2VkICg1MSkKQEAgLTcwLDcgKzcwLDYgQEAKICMgR0VUVEVYVAlubyBvciB5ZXM6IHNldCB0byB5ZXMgZm9yIG11bHRpLWxhbmd1YWdlIHN1cHBvcnQgKHllcykKICMgSUNPTlYJCW5vIG9yIHllczogc2V0IHRvIHllcyBmb3IgZHluYW1pYyBpY29udiBzdXBwb3J0ICh5ZXMpCiAjIE9MRQkJbm8gb3IgeWVzOiBzZXQgdG8geWVzIHRvIG1ha2UgT0xFIGd2aW0gKG5vKQotIyBPU1RZUEUJRE9TMTYgb3IgV0lOMzIgKFdJTjMyKQogIyBERUJVRwkJbm8gb3IgeWVzOiBzZXQgdG8geWVzIGlmIHlvdSB3aXNoIGEgREVCVUdnaW5nIGJ1aWxkIChubykKICMgQ09ERUdVQVJECW5vIG9yIHllczogc2V0IHRvIHllcyBpZiB5b3Ugd2FudCB0byB1c2UgQ09ERUdVQVJEIChubykKICMgQ1BVTlIJCTEgdGhyb3VnaCA2OiBzZWxlY3QgLUNQVSBhcmd1bWVudCB0byBjb21waWxlIHdpdGggKDMpCkBAIC03OCwxMiArNzcsMTEgQEAKICMgVVNFRExMCW5vIG9yIHllczogc2V0IHRvIHllcyB0byB1c2UgdGhlIFJ1bnRpbWUgbGlicmFyeSBETEwgKG5vKQogIwkJRm9yIFVTRURMTD15ZXMgdGhlIGNjMzI1MC5kbGwgaXMgcmVxdWlyZWQgdG8gcnVuIFZpbS4KICMgVklNRExMCW5vIG9yIHllczogY3JlYXRlIHZpbTMyLmRsbCwgYW5kIHN0dWIgKGcpdmltLmV4ZSAobm8pCi0jIEFMSUdOCQkxLCAyIG9yIDQ6IEFsaWdubWVudCB0byB1c2UgKDQgZm9yIFdpbjMyLCAyIGZvciBET1MxNikKKyMgQUxJR04JCTEsIDIgb3IgNDogQWxpZ25tZW50IHRvIHVzZSAoNCBmb3IgV2luMzIpCiAjIEZBU1RDQUxMCW5vIG9yIHllczogc2V0IHRvIHllcyB0byB1c2UgcmVnaXN0ZXItYmFzZWQgZnVuY3Rpb24gcHJvdG9jb2wgKHllcykKICMgT1BUSU1JWkUJU1BBQ0UsIFNQRUVELCBvciBNQVhTUEVFRDogdHlwZSBvZiBvcHRpbWl6YXRpb24gKE1BWFNQRUVEKQogIyBQT1NUU0NSSVBUCW5vIG9yIHllczogc2V0IHRvIHllcyBmb3IgUG9zdFNjcmlwdCBwcmludGluZwotIyBGRUFUVVJFUwlUSU5ZLCBTTUFMTCwgTk9STUFMLCBCSUcgb3IgSFVHRQotIwkJKEJJRyBmb3IgV0lOMzIsIFNNQUxMIGZvciBET1MxNikKKyMgRkVBVFVSRVMJVElOWSwgU01BTEwsIE5PUk1BTCwgQklHIG9yIEhVR0UgKEJJRyBmb3IgV0lOMzIpCiAjIFdJTlZFUgkweDA0MDAgb3IgMHgwNTAwOiBtaW5pbXVtIFdpbjMyIHZlcnNpb24gdG8gc3VwcG9ydCAoMHgwNDAwKQogIyBDU0NPUEUJbm8gb3IgeWVzOiBpbmNsdWRlIHN1cHBvcnQgZm9yIENzY29wZSBpbnRlcmZhY2UgKHllcykKICMgTkVUQkVBTlMJbm8gb3IgeWVzOiBpbmNsdWRlIHN1cHBvcnQgZm9yIE5ldGJlYW5zIGludGVyZmFjZTsgYWxzbwpAQCAtOTksOCArOTcsNyBAQAogQk9SID0gYzpcYmM1CiAhZW5kaWYKIAotIyMjIExJTks6IE5hbWUgb2YgdGhlIGxpbmtlcjogdGxpbmsgb3IgaWxpbmszMiAodGhpcyBpcyBiZWxvdywgZGVwZW5kcyBvbgotIyAkKE9TVFlQRSkKKyMjIyBMSU5LOiBOYW1lIG9mIHRoZSBsaW5rZXI6IGlsaW5rMzIgKHRoaXMgaXMgYmVsb3cpCiAKICMjIyBHVUk6IHllcyBmb3IgR1VJIHZlcnNpb24sIG5vIGZvciBjb25zb2xlIHZlcnNpb24KICFpZiAoIiQoR1VJKSI9PSIiKQpAQCAtMTY2LDEyICsxNjMsNiBAQAogIyMjIE9MRTogbm8gZm9yIG5vcm1hbCBndmltLCB5ZXMgZm9yIE9MRS1jYXBhYmxlIGd2aW0gKG9ubHkgd29ya3Mgd2l0aCBHVUkpCiAjT0xFID0geWVzCiAKLSMjIyBPU1RZUEU6IERPUzE2IGZvciBXaW5kb3dzIDMuMSB2ZXJzaW9uLCBXSU4zMiBmb3IgV2luZG93cyA5NS85OC9OVC8yMDAwCi0jICAgdmVyc2lvbgotIWlmICgiJChPU1RZUEUpIj09IiIpCi1PU1RZUEUgPSBXSU4zMgotIWVuZGlmCi0KICMjIyBERUJVRzogVW5jb21tZW50IHRvIG1ha2UgYW4gZXhlY3V0YWJsZSBmb3IgZGVidWdnaW5nCiAjIERFQlVHID0geWVzCiAhaWYgKCIkKERFQlVHKSI9PSJ5ZXMiKQpAQCAtMjA4LDE0ICsxOTksMTAgQEAKICMjIyBWSU1ETEw6IHllcyBmb3IgYSBETEwgdmVyc2lvbiBvZiBWSU0gKE5PVCBSRUNPTU1FTkRFRCksIG5vIG90aGVyd2lzZQogI1ZJTURMTCA9IHllcwogCi0jIyMgQUxJR046IGFsaWdubWVudCB5b3UgZGVzaXJlOiAoMSwyIG9yIDQ6IHMvYiA0IGZvciBXaW4zMiwgMiBmb3IgRE9TKQorIyMjIEFMSUdOOiBhbGlnbm1lbnQgeW91IGRlc2lyZTogKDEsMiBvciA0OiBzL2IgNCBmb3IgV2luMzIpCiAhaWYgKCIkKEFMSUdOKSI9PSIiKQotIWlmICgkKE9TVFlQRSk9PURPUzE2KQotQUxJR04gPSAyCi0hZWxzZQogQUxJR04gPSA0CiAhZW5kaWYKLSFlbmRpZgogCiAjIyMgRkFTVENBTEw6IHllcyB0byB1c2UgRkFTVENBTEwgY2FsbGluZyBjb252ZW50aW9uIChSRUNPTU1FTkRFRCEpLCBubyBvdGhlcndpc2UKICMgICBJbmNvbXBhdGlibGUgd2hlbiBjYWxsaW5nIGV4dGVybmFsIGZ1bmN0aW9ucyAobGlrZSBNU1ZDLWNvbXBpbGVkIERMTHMpLCBzbwpAQCAtMjM5LDEzICsyMjYsOSBAQAogT1BUSU1JWkUgPSBNQVhTUEVFRAogIWVuZGlmCiAKLSMjIyBGRUFUVVJFUzogVElOWSwgU01BTEwsIE5PUk1BTCwgQklHIG9yIEhVR0UgKEJJRyBmb3IgV0lOMzIsIFNNQUxMIGZvciBET1MxNikKKyMjIyBGRUFUVVJFUzogVElOWSwgU01BTEwsIE5PUk1BTCwgQklHIG9yIEhVR0UgKEJJRyBmb3IgV0lOMzIpCiAhaWYgKCIkKEZFQVRVUkVTKSI9PSIiKQotISBpZiAoJChPU1RZUEUpPT1ET1MxNikKLUZFQVRVUkVTID0gU01BTEwKLSEgZWxzZQogRkVBVFVSRVMgPSBCSUcKLSEgZW5kaWYKICFlbmRpZgogCiAjIyMgUE9TVFNDUklQVDogdW5jb21tZW50IHRoaXMgbGluZSBpZiB5b3Ugd2FudCBQb3N0U2NyaXB0IHByaW50aW5nCkBAIC0yNjYsMjQgKzI0OSw3IEBACiAjIFNhbml0eSBjaGVja3MgZm9yIHRoZSBhYm92ZSBvcHRpb25zOgogIwogCi0haWYgKCQoT1NUWVBFKT09RE9TMTYpCi0haWYgKCgkKENQVU5SKSswKT40KQotIWVycm9yIENQVU5SIE11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDQgZm9yIERPUzE2Ci0hZW5kaWYKLQotIWlmICgoJChBTElHTikrMCk+MikKLSFlcnJvciBBTElHTiBNdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAyIGZvciBET1MxNgotIWVuZGlmCi0KLSFlbHNlCSMgbm90IERPUzE2Ci0haWYgKCgkKENQVU5SKSswKTwzKQotIWVycm9yIENQVU5SIE11c3QgYmUgZ3JlYXRlciBvciBlcXVhbCB0byAzIGZvciBXSU4zMgotIWVuZGlmCi0hZW5kaWYKLQotIWlmICgkKE9TVFlQRSkhPVdJTjMyKSAmJiAoJChPU1RZUEUpIT1ET1MxNikKLSFlcnJvciBDaGVjayB0aGUgT1NUWVBFIHZhcmlhYmxlIGFnYWluOiAkKE9TVFlQRSkgaXMgbm90IHN1cHBvcnRlZCEKLSFlbmRpZgorT1NUWVBFID0gV0lOMzIKIAogIwogIyBPcHRpbWl6YXRpb25zOiBjaGFuZ2UgYXMgZGVzaXJlZCAoUkVDT01NRU5EQVRJT046IERvbid0IGNoYW5nZSEpOgpAQCAtMzA1LDExICsyNzEsNiBAQAogT1BUID0gJChPUFQpIC12aS0KICFlbmRpZgogIWVuZGlmCi0haWYgKCQoT1NUWVBFKT09RE9TMTYpCi0hdW5kZWYgR1VJCi0hdW5kZWYgVklNRExMCi0hdW5kZWYgVVNFRExMCi0hZW5kaWYKICMgc2hvdWxkbid0IGhhdmUgdG8gY2hhbmdlOgogTElCID0gJChCT1IpXGxpYgogSU5DTFVERSA9ICQoQk9SKVxpbmNsdWRlOy47cHJvdG8KQEAgLTQ4MywxNiArNDQ0LDkgQEAKICMgZm9yIG5vdywgYW55d2F5OiBWSU1ETEwgaXMgb25seSBmb3IgdGhlIEdVSSB2ZXJzaW9uCiBUQVJHRVQgPSB2aW0uZXhlCiAhZW5kaWYKLSFpZiAoJChPU1RZUEUpPT1ET1MxNikKLURFRklORVM9IC1ERkVBVF8kKEZFQVRVUkVTKSAtRE1TRE9TCi1FWEVUWVBFPS1tbAotU1RBUlRVUE9CSiA9IGMwbC5vYmoKLUxJTksyID0KLSFlbHNlCiBFWEVUWVBFPS1XQwogU1RBUlRVUE9CSiA9IGMweDMyLm9iagogTElOSzIgPSAtYXAgLU9TIC1vIC1QCi0hZW5kaWYKIFJFU0ZJTEUgPSB2aW0ucmVzCiAhZW5kaWYKIApAQCAtNTQ1LDE2ICs0OTksNiBAQAogIyMjIyMgQkFTRSBDT01QSUxFUi9UT09MUyBSVUxFUyAjIyMjIwogTUFLRSA9ICQoQk9SKVxiaW5cbWFrZQogQ0ZMQUdTID0gLXctYXVzIC13LXBhciAtdy1wY2ggLXctbmd1IC13LWNzdSAtSSQoSU5DTFVERSkKLSFpZiAoJChPU1RZUEUpPT1ET1MxNikKLUJSQyA9Ci0haWYgKCIkKExJTkspIj09IiIpCi1MSU5LCT0gJChCT1IpXEJJTlxUTGluawotIWVuZGlmCi1DQyAgID0gJChCT1IpXEJJTlxCY2MKLUxGTEFHUwk9IC1UZGUgLWMgLW0gLUwkKExJQikgJChERUJVR19GTEFHKSAkKExJTksyKQotTEZMQUdTRExMICA9Ci1DRkxBR1MgPSAkKENGTEFHUykgLUgtICQoSEVBREVSUykKLSFlbHNlCiBCUkMgPSAkKEJPUilcQklOXGJyYzMyCiAhaWYgKCIkKExJTkspIj09IiIpCiBMSU5LCT0gJChCT1IpXEJJTlxJTGluazMyCkBAIC01NjMsNyArNTA3LDYgQEAKIExGTEFHUwk9IC1PUyAtVHBlIC1jIC1tIC1MJChMSUIpICQoREVCVUdfRkxBRykgJChMSU5LMikKIExGTEFHU0RMTCAgPSAtVHBkIC1jIC1tIC1MJChMSUIpICQoREVCVUdfRkxBRykgJChMSU5LMikKIENGTEFHUyA9ICQoQ0ZMQUdTKSAtZCAtUlQtIC1rLSAtT2kgJChIRUFERVJTKSAtZi0KLSFlbmRpZgogCiBDQzEgPSAtYwogQ0MyID0gLW8KQEAgLTU4Myw4ICs1MjYsNiBAQAogLmNwcC5vYmo6CiAJJChDQykgJChDQ0FSRykgJChDQzEpICQoQ0MyKSRAICQqLmNwcAogCi0haWYgKCQoT1NUWVBFKT09RE9TMTYpCi0hZWxzZSAjIHdpbjMyOgogdmltbWFpbiA9IFwKIAkkKE9CSkRJUilcb3NfdzMyZXhlLm9iagogIWlmICgiJChWSU1ETEwpIj09InllcyIpCkBAIC01OTQsNyArNTM1LDYgQEAKIHZpbXdpbm1haW4gPSBcCiAJJChPQkpESVIpXG9zX3czMmV4ZS5vYmoKICFlbmRpZgotIWVuZGlmCiAKIHZpbW9iaiA9ICBcCiAJJChPQkpESVIpXGJsb3dmaXNoLm9iaiBcCkBAIC03MjAsMTMgKzY2MCw4IEBACiAJJChPQkpESVIpXGd1aV93MzIub2JqCiAhZW5kaWYKIAotIWlmICgkKE9TVFlQRSk9PVdJTjMyKQogdmltb2JqID0gJCh2aW1vYmopIFwKIAkkKE9CSkRJUilcb3Nfd2luMzIub2JqICQoT0JKRElSKVxvc19tc3dpbi5vYmogJChPQkpESVIpXHdpbmNsaXAub2JqCi0hZWxpZiAoJChPU1RZUEUpPT1ET1MxNikKLXZpbW9iaiA9ICQodmltb2JqKSBcCi0JJChPQkpESVIpXG9zX21zZG9zLm9iagotIWVuZGlmCiAjIEJsYWIgd2hhdCB3ZSBhcmUgZ29pbmcgdG8gZG86CiBNU0cgPSBDb21waWxpbmcgJChPU1RZUEUpICQoVEFSR0VUKSAkKE9MRVRBUkdFVCksIHdpdGg6CiAhaWYgKCIkKEdVSSkiPT0ieWVzIikKQEAgLTgxOCwxNCArNzUzLDEwIEBACiAKICFtZXNzYWdlICQoTVNHKQogCi0haWYgKCQoT1NUWVBFKT09RE9TMTYpCi1UQVJHRVRTID0gJChUQVJHRVQpCi0hZWxzZQogIWlmICgiJChWSU1ETEwpIj09InllcyIpCiBUQVJHRVRTID0gJChETExUQVJHRVQpCiAhZW5kaWYKIFRBUkdFVFMgPSAkKFRBUkdFVFMpICQoVEFSR0VUKQotIWVuZGlmCiAKICMgVGFyZ2V0czoKIGFsbDogdmltIHZpbXJ1bi5leGUgaW5zdGFsbC5leGUgeHhkIHVuaW5zdGFsLmV4ZSBHdmltRXh0L2d2aW1leHQuZGxsCkBAIC04NTEsMTggKzc4MiwxMCBAQAogCWNkIC4uCiAKIGluc3RhbGwuZXhlOiBkb3NpbnN0LmMgJChPQkpESVIpXGJjYy5jZmcKLSFpZiAoJChPU1RZUEUpPT1XSU4zMikKIAkkKENDKSAkKENDQVJHKSAtV0MgLURXSU4zMiAtZWluc3RhbGwgZG9zaW5zdC5jCi0hZWxzZQotCSQoQ0MpICQoQ0NBUkcpIC1XQyAtZWluc3RhbGwgZG9zaW5zdC5jCi0hZW5kaWYKIAogdW5pbnN0YWwuZXhlOiB1bmluc3RhbC5jICQoT0JKRElSKVxiY2MuY2ZnCi0haWYgKCQoT1NUWVBFKT09V0lOMzIpCiAJJChDQykgJChDQ0FSRykgLVdDIC1EV0lOMzIgLU8yIC1ldW5pbnN0YWwgdW5pbnN0YWwuYwotIWVsc2UKLQkkKENDKSAkKENDQVJHKSAtV0MgLU8yIC1ldW5pbnN0YWwgdW5pbnN0YWwuYwotIWVuZGlmCiAKIGNsZWFuOgogIWlmICIkKE9TKSIgPT0gIldpbmRvd3NfTlQiCkBAIC05MjMsMTAgKzg0Niw3IEBACiAJY2czMi5saWIrCiAhZW5kaWYKICMgJChPU1RZUEUpPT1XSU4zMiBjYXVzZXMgb3NfbXN3aW4uYyBjb21waWxhdGlvbi4gRkVBVF9TSE9SVENVVCBpbiBpdCBuZWVkcyBPTEUKLSFpZiAoIiQoT0xFKSI9PSJ5ZXMiIHx8ICQoT1NUWVBFKT09V0lOMzIpCiAJb2xlMnczMi5saWIgKwotIWVuZGlmCi0haWYgKCQoT1NUWVBFKT09V0lOMzIpCiAJaW1wb3J0MzIubGliKwogIWlmZGVmIExVQQogCSQoTFVBX0xJQl9GTEFHKWx1YS5saWIrCkBAIC05NTUsOSArODc1LDYgQEAKIAljdzMyLmxpYgogIWVuZGlmCiAJdmltLmRlZgotIWVsc2UKLQljbC5saWIKLSFlbmRpZgogfAogCiAhaWYgKCIkKFZJTURMTCkiPT0ieWVzIikKQEAgLTk3NCwxNCArODkxLDExIEBACiAJJCh2aW1vYmopCiAhZW5kaWYKIAkkPCwkKgotIWlmICgkKE9TVFlQRSk9PVdJTjMyKQogIWlmICgiJChDT0RFR1VBUkQpIj09InllcyIpCiAJY2czMi5saWIrCiAhZW5kaWYKICMgJChPU1RZUEUpPT1XSU4zMiBjYXVzZXMgb3NfbXN3aW4uYyBjb21waWxhdGlvbi4gRkVBVF9TSE9SVENVVCBpbiBpdCBuZWVkcyBPTEUKLSFpZiAoIiQoT0xFKSI9PSJ5ZXMiIHx8ICQoT1NUWVBFKT09V0lOMzIpCiAJb2xlMnczMi5saWIgKwotIWVuZGlmCiAJaW1wb3J0MzIubGliKwogIWlmZGVmIExVQQogCSQoTFVBX0xJQl9GTEFHKWx1YS5saWIrCkBAIC0xMDExLDkgKzkyNSw2IEBACiAhZW5kaWYKIAogCSQoT0JKRElSKVwkKFJFU0ZJTEUpCi0hZWxzZQotCWVtdS5saWIgKyBjbC5saWIKLSFlbmRpZgogfAogCiB0ZXN0OgpkaWZmIC0tZ2l0IGEvc3JjL01ha2VfZGpnLm1hayBiL3NyYy9NYWtlX2RqZy5tYWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViNzdiNWMuLjAwMDAwMDAKLS0tIGEvc3JjL01ha2VfZGpnLm1haworKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0jCi0jIE1ha2VmaWxlIGZvciBWSU0gb24gTVNET1MsIHVzaW5nIERKR1BQIDIuMAotIwotIyBOT1RFOiBUSElTIElTIE9MRCBBTkQgUFJPQkFCTFkgTk8gTE9OR0VSIFdPUktTLgotIwotCi0jPj4+Pj4gY2hvb3NlIG9wdGlvbnM6Ci0KLSMjIyBTZWUgZmVhdHVyZS5oIGZvciBhIGxpc3Qgb2Ygb3B0aW9uYWxzLgotIyMjIEFueSBvdGhlciBkZWZpbmVzIGNhbiBiZSBpbmNsdWRlZCBoZXJlLgotCi1ERUZJTkVTID0KLQotIz4+Pj4+IG5hbWUgb2YgdGhlIGNvbXBpbGVyIGFuZCBsaW5rZXIsIG5hbWUgb2YgbGliIGRpcmVjdG9yeQotQ0MgPSBnY2MKLQotIz4+Pj4+IGVuZCBvZiBjaG9pY2VzCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotSU5DTCA9IHZpbS5oIGdsb2JhbHMuaCBvcHRpb24uaCBrZXltYXAuaCBtYWNyb3MuaCBhc2NpaS5oIHRlcm0uaCBvc19tc2Rvcy5oIHN0cnVjdHMuaAotQ0ZMQUdTID0gLU8yIC1ETVNET1MgLUlwcm90byAkKERFRklORVMpIC1XYWxsIC1EaW50ZXJydXB0PSAtRGZhcj0gLURNQVhNRU09NTEyIC1EX05BSVZFX0RPU19SRUdTCi0KLU9CSiA9IFwKLQlvYmovYmxvd2Zpc2gubyBcCi0Jb2JqL2J1ZmZlci5vIFwKLQlvYmovY2hhcnNldC5vIFwKLQlvYmovY3J5cHQubyBcCi0Jb2JqL2NyeXB0X3ppcC5vIFwKLQlvYmovZGlmZi5vIFwKLQlvYmovZGlncmFwaC5vIFwKLQlvYmovZWRpdC5vIFwKLQlvYmovZXZhbC5vIFwKLQlvYmovZXhfY21kcy5vIFwKLQlvYmovZXhfY21kczIubyBcCi0Jb2JqL2V4X2RvY21kLm8gXAotCW9iai9leF9ldmFsLm8gXAotCW9iai9leF9nZXRsbi5vIFwKLQlvYmovZmlsZWlvLm8gXAotCW9iai9mb2xkLm8gXAotCW9iai9nZXRjaGFyLm8gXAotCW9iai9oYXJkY29weS5vIFwKLQlvYmovaGFzaHRhYi5vIFwKLQlvYmovbWFpbi5vIFwKLQlvYmovbWFyay5vIFwKLQlvYmovbWVtZmlsZS5vIFwKLQlvYmovbWVtbGluZS5vIFwKLQlvYmovbWVudS5vIFwKLQlvYmovbWVzc2FnZS5vIFwKLQlvYmovbWlzYzEubyBcCi0Jb2JqL21pc2MyLm8gXAotCW9iai9tb3ZlLm8gXAotCW9iai9tYnl0ZS5vIFwKLQlvYmovbm9ybWFsLm8gXAotCW9iai9vcHMubyBcCi0Jb2JqL29wdGlvbi5vIFwKLQlvYmovb3NfbXNkb3MubyBcCi0Jb2JqL3BvcHVwbW51Lm8gXAotCW9iai9xdWlja2ZpeC5vIFwKLQlvYmovcmVnZXhwLm8gXAotCW9iai9zY3JlZW4ubyBcCi0Jb2JqL3NlYXJjaC5vIFwKLQlvYmovc2hhMjU2Lm8gXAotCW9iai9zcGVsbC5vIFwKLQlvYmovc3ludGF4Lm8gXAotCW9iai90YWcubyBcCi0Jb2JqL3Rlcm0ubyBcCi0Jb2JqL3VpLm8gXAotCW9iai91bmRvLm8gXAotCW9iai93aW5kb3cubyBcCi0JJChURVJNTElCKQotCi1hbGw6IHZpbS5leGUgaW5zdGFsbC5leGUgdW5pbnN0YWwuZXhlIHh4ZC94eGQuZXhlCi0KLSMgdmVyc2lvbi5jIGlzIGNvbXBpbGVkIGVhY2ggdGltZSwgc28gdGhhdCBpdCBzZXRzIHRoZSBidWlsZCB0aW1lLgotdmltLmV4ZTogb2JqICQoT0JKKSB2ZXJzaW9uLmMgdmVyc2lvbi5oCi0JJChDQykgJChDRkxBR1MpIC1zIC1vIHZpbS5leGUgdmVyc2lvbi5jICQoT0JKKSAtbHBjCi0KLWluc3RhbGwuZXhlOiBkb3NpbnN0LmMKLQkkKENDKSAkKENGTEFHUykgLXMgLW8gaW5zdGFsbC5leGUgZG9zaW5zdC5jIC1scGMKLQotdW5pbnN0YWwuZXhlOiB1bmluc3RhbC5jCi0JJChDQykgJChDRkxBR1MpIC1zIC1vIHVuaW5zdGFsLmV4ZSB1bmluc3RhbC5jIC1scGMKLQotIyBUaGlzIHJlcXVpcmVzIEdOVSBtYWtlLgoteHhkL3h4ZC5leGU6IHh4ZC94eGQuYwotCSQoTUFLRSkgLS1kaXJlY3Rvcnk9eHhkIC1mIE1ha2VfZGpnLm1hawotCi1vYmo6Ci0JbWtkaXIgb2JqCi0KLXRhZ3M6Ci0JY29tbWFuZCAvYyBjdGFncyAqLmMgJChJTkNMKSBleF9jbWRzLmgKLQotY2xlYW46Ci0JLWRlbCBvYmpcKi5vCi0JLXJtZGlyIG9iagotCS1kZWwgdmltLmV4ZQotCS1kZWwgaW5zdGFsbC5leGUKLQktZGVsIHh4ZFx4eGQuZXhlCi0JLWRlbCB0ZXN0ZGlyXCoub3V0Ci0KLSMgVGhpcyByZXF1aXJlcyBHTlUgbWFrZS4KLXRlc3Q6Ci0JJChNQUtFKSAtLWRpcmVjdG9yeT10ZXN0ZGlyIC1mIE1ha2VfZG9zLm1hawotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotb2JqLyUubzogJS5jIG9iaiAkKElOQ0wpCi0JJChDQykgLWMgJChDRkxBR1MpIC1vICRAICQ8Ci0KLSMgRXh0cmEgZGVwZW5kZW5jeSAodGhlcmUgYXJlIGFjdHVhbGx5IG1hbnkgbW9yZS4uLikKLW9iai9leF9kb2NtZC5vOglleF9jbWRzLmgKZGlmZiAtLWdpdCBhL3NyYy9NYWtlZmlsZSBiL3NyYy9NYWtlZmlsZQppbmRleCAxM2M3YmM2Li4xMzI2Y2YwIDEwMDY0NAotLS0gYS9zcmMvTWFrZWZpbGUKKysrIGIvc3JjL01ha2VmaWxlCkBAIC05MDgsNyArOTA4LDcgQEAKICMjIyBhZnRlciBjaGFuZ2luZyB0aGlzLCB5b3UgbmVlZCB0byBkbyAibWFrZSByZWNvbmZpZyIuCiAjQ09ORl9URVJNX0xJQiA9IC0td2l0aC10bGliPW5jdXJzZXMKIAotIyMjIEZvciBHQ0Mgb24gTVNET1MsIHRoZSAiLmV4ZSIgc3VmZml4IHdpbGwgYmUgYWRkZWQuCisjIyMgRm9yIEdDQyBvbiBNUy1XaW5kb3dzLCB0aGUgIi5leGUiIHN1ZmZpeCB3aWxsIGJlIGFkZGVkLgogI0VYRUVYVCA9IC5leGUKICNMTktFWFQgPSAuZXhlCiAKQEAgLTE3MTUsNyArMTcxNSw3IEBACiAjIFJlc291cmNlcyB1c2VkIGZvciB0aGUgTWFjIGFyZSBpbiBvbmUgZGlyZWN0b3J5LgogUlNSQ19ESVIgPSBvc19tYWNfcnNyYwogCi1QUk9fTUFOVUFMID0gb3NfYW1pZ2EucHJvIG9zX21zZG9zLnBybyBvc193aW4zMi5wcm8gXAorUFJPX01BTlVBTCA9IG9zX2FtaWdhLnBybyBvc193aW4zMi5wcm8gXAogCW9zX21zd2luLnBybyB3aW5jbGlwLnBybyBvc19iZW9zLnBybyBvc192bXMucHJvICQoUEVSTF9QUk8pCiAKICMgRGVmYXVsdCB0YXJnZXQgaXMgbWFraW5nIHRoZSBleGVjdXRhYmxlIGFuZCB0b29scwpAQCAtMTgzNiw3ICsxODM2LDcgQEAKICMgR2VuZXJhdGUgZnVuY3Rpb24gcHJvdG90eXBlcy4gIFRoaXMgaXMgbm90IG5lZWRlZCB0byBjb21waWxlIHZpbSwgYnV0IGlmCiAjIHlvdSB3YW50IHRvIHVzZSBpdCwgY3Byb3RvIGlzIG91dCB0aGVyZSBvbiB0aGUgbmV0IHNvbWV3aGVyZSAtLSBXZWJiCiAjCi0jIFdoZW4gZ2VuZXJhdGluZyBvc19hbWlnYS5wcm8sIG9zX21zZG9zLnBybyBhbmQgb3Nfd2luMzIucHJvIHRoZXJlIHdpbGwgYmUgYQorIyBXaGVuIGdlbmVyYXRpbmcgb3NfYW1pZ2EucHJvIGFuZCBvc193aW4zMi5wcm8gdGhlcmUgd2lsbCBiZSBhCiAjIGZldyBpbmNsdWRlIGZpbGVzIHRoYXQgY2FuIG5vdCBiZSBmb3VuZCwgdGhhdCdzIE9LLgogCiBwcm90bzogJChQUk9fQVVUTykgJChQUk9fTUFOVUFMKQpAQCAtMTg2NCwxMCArMTg2NCw2IEBACiAJJChDUFJPVE8pIC1EQU1JR0EgLVVIQVZFX0NPTkZJR19IIC1EQlBUUj1jaGFyKiAkPCA+IHByb3RvLyRACiAJZWNobyAiLyogdmltOiBzZXQgZnQ9YyA6ICovIiA+PiBwcm90by8kQAogCi1vc19tc2Rvcy5wcm86IG9zX21zZG9zLmMKLQkkKENQUk9UTykgLURNU0RPUyAtVUhBVkVfQ09ORklHX0ggJDwgPiBwcm90by8kQAotCWVjaG8gIi8qIHZpbTogc2V0IGZ0PWMgOiAqLyIgPj4gcHJvdG8vJEAKLQogb3Nfd2luMzIucHJvOiBvc193aW4zMi5jCiAJJChDUFJPVE8pIC1EV0lOMzIgLVVIQVZFX0NPTkZJR19IICQ8ID4gcHJvdG8vJEAKIAllY2hvICIvKiB2aW06IHNldCBmdD1jIDogKi8iID4+IHByb3RvLyRACmRpZmYgLS1naXQgYS9zcmMvYmxvd2Zpc2guYyBiL3NyYy9ibG93ZmlzaC5jCmluZGV4IGQyNGFhMmMuLjM3ZDVhNTUgMTAwNjQ0Ci0tLSBhL3NyYy9ibG93ZmlzaC5jCisrKyBiL3NyYy9ibG93ZmlzaC5jCkBAIC0zNCw3ICszNCw3IEBACiAgICAgY2hhcl91ICAgdWNbOF07CiB9IGJsb2NrODsKIAotI2lmIGRlZmluZWQoV0lOMzI2NCkgfHwgZGVmaW5lZChET1MzMikKKyNpZiBkZWZpbmVkKFdJTjMyNjQpCiAgIC8qIE1TLVdpbmRvd3MgaXMgYWx3YXlzIGxpdHRsZSBlbmRpYW4gKi8KICNlbHNlCiAjIGlmZGVmIEhBVkVfQ09ORklHX0gKZGlmZiAtLWdpdCBhL3NyYy9idWZmZXIuYyBiL3NyYy9idWZmZXIuYwppbmRleCA5ZjYxZWVmLi44OWRlZGM1IDEwMDY0NAotLS0gYS9zcmMvYnVmZmVyLmMKKysrIGIvc3JjL2J1ZmZlci5jCkBAIC01NDEsOSArNTQxLDcgQEAKIHsKICAgICBidWYtPmJfbWwubWxfbGluZV9jb3VudCA9IDE7CiAgICAgdW5jaGFuZ2VkKGJ1ZiwgVFJVRSk7Ci0jaWZuZGVmIFNIT1JUX0ZOQU1FCiAgICAgYnVmLT5iX3Nob3J0bmFtZSA9IEZBTFNFOwotI2VuZGlmCiAgICAgYnVmLT5iX3BfZW9sID0gVFJVRTsKICAgICBidWYtPmJfc3RhcnRfZW9sID0gVFJVRTsKICNpZmRlZiBGRUFUX01CWVRFCkBAIC0yOTExLDkgKzI5MDksNyBAQAogICAgIH0KICNlbmRpZgogCi0jaWZuZGVmIFNIT1JUX0ZOQU1FCiAgICAgYnVmLT5iX3Nob3J0bmFtZSA9IEZBTFNFOwotI2VuZGlmCiAKICAgICBidWZfbmFtZV9jaGFuZ2VkKGJ1Zik7CiAgICAgcmV0dXJuIE9LOwpAQCAtNDQ4MCw3ICs0NDc2LDcgQEAKICMgaWZkZWYgQkFDS1NMQVNIX0lOX0ZJTEVOQU1FCiAJICAgIHx8IHN0cnN0cigoY2hhciAqKWZuYW1lLCAiXFxcXCIpICE9IE5VTEwKICMgZW5kaWYKLSMgaWYgZGVmaW5lZChNU1dJTikgfHwgZGVmaW5lZChESkdQUCkKKyMgaWYgZGVmaW5lZChNU1dJTikKIAkgICAgfHwgdmltX3N0cmNocihmbmFtZSwgJ34nKSAhPSBOVUxMCiAjIGVuZGlmCiAJICAgICkKZGlmZiAtLWdpdCBhL3NyYy9kaWZmLmMgYi9zcmMvZGlmZi5jCmluZGV4IGRiMWQwNjYuLmJlN2UzOGMgMTAwNjQ0Ci0tLSBhL3NyYy9kaWZmLmMKKysrIGIvc3JjL2RpZmYuYwpAQCAtMjksNyArMjksNyBAQAogCiBzdGF0aWMgaW50IGRpZmZfYV93b3JrcyA9IE1BWUJFOyAvKiBUUlVFIHdoZW4gImRpZmYgLWEiIHdvcmtzLCBGQUxTRSB3aGVuIGl0CiAJCQkJICAgIGRvZXNuJ3Qgd29yaywgTUFZQkUgd2hlbiBub3QgY2hlY2tlZCB5ZXQgKi8KLSNpZiBkZWZpbmVkKE1TV0lOKSB8fCBkZWZpbmVkKE1TRE9TKQorI2lmIGRlZmluZWQoTVNXSU4pCiBzdGF0aWMgaW50IGRpZmZfYmluX3dvcmtzID0gTUFZQkU7IC8qIFRSVUUgd2hlbiAiZGlmZiAtLWJpbmFyeSIgd29ya3MsIEZBTFNFCiAJCQkJICAgICAgd2hlbiBpdCBkb2Vzbid0IHdvcmssIE1BWUJFIHdoZW4gbm90CiAJCQkJICAgICAgY2hlY2tlZCB5ZXQgKi8KQEAgLTczMyw3ICs3MzMsNyBAQAogCSAgICBicmVhazsKICNlbmRpZgogCi0jaWYgZGVmaW5lZChNU1dJTikgfHwgZGVmaW5lZChNU0RPUykKKyNpZiBkZWZpbmVkKE1TV0lOKQogCS8qIElmIHRoZSAiLWEiIGFyZ3VtZW50IHdvcmtzLCBhbHNvIGNoZWNrIGlmICItLWJpbmFyeSIgd29ya3MuICovCiAJaWYgKG9rICYmIGRpZmZfYV93b3JrcyA9PSBNQVlCRSAmJiBkaWZmX2Jpbl93b3JrcyA9PSBNQVlCRSkKIAl7CkBAIC03NjQsNyArNzY0LDcgQEAKIAkgICAgRU1TRyhfKCJFODEwOiBDYW5ub3QgcmVhZCBvciB3cml0ZSB0ZW1wIGZpbGVzIikpOwogCUVNU0coXygiRTk3OiBDYW5ub3QgY3JlYXRlIGRpZmZzIikpOwogCWRpZmZfYV93b3JrcyA9IE1BWUJFOwotI2lmIGRlZmluZWQoTVNXSU4pIHx8IGRlZmluZWQoTVNET1MpCisjaWYgZGVmaW5lZChNU1dJTikKIAlkaWZmX2Jpbl93b3JrcyA9IE1BWUJFOwogI2VuZGlmCiAJZ290byB0aGVlbmQ7CkBAIC04NDUsNyArODQ1LDcgQEAKIAkgICAgICogbm9uLXplcm8gd2hlbiBkaWZmZXJlbmNlcyBoYXZlIGJlZW4gZm91bmQuICovCiAJICAgIHZpbV9zbnByaW50ZigoY2hhciAqKWNtZCwgbGVuLCAiZGlmZiAlcyVzJXMlcyVzICVzIiwKIAkJICAgIGRpZmZfYV93b3JrcyA9PSBGQUxTRSA/ICIiIDogIi1hICIsCi0jaWYgZGVmaW5lZChNU1dJTikgfHwgZGVmaW5lZChNU0RPUykKKyNpZiBkZWZpbmVkKE1TV0lOKQogCQkgICAgZGlmZl9iaW5fd29ya3MgPT0gVFJVRSA/ICItLWJpbmFyeSAiIDogIiIsCiAjZWxzZQogCQkgICAgIiIsCmRpZmYgLS1naXQgYS9zcmMvZGlncmFwaC5jIGIvc3JjL2RpZ3JhcGguYwppbmRleCAyMTk1ZDY0Li41ZGFiNTFiIDEwMDY0NAotLS0gYS9zcmMvZGlncmFwaC5jCisrKyBiL3NyYy9kaWdyYXBoLmMKQEAgLTM5LDc0ICszOSw3IEBACiAgKiBjb21waWxlcnMgY2Fubm90IGhhbmRsZSB0aGVtIChBbWlnYSBTQVMvQyBpcyB0aGUgbW9zdCBwaWNreSBvbmUpLgogICovCiBzdGF0aWMgZGlncl9UIGRpZ3JhcGhkZWZhdWx0W10gPQotI2lmIGRlZmluZWQoTVNET1MpCi0JLyoKLQkgKiBNU0RPUyBkaWdyYXBocy4KLQkgKi8KLSAgICAgICB7eydDJywgJywnLCAxMjh9LAkvKiB+QCBYWCAqLwotCXsndScsICciJywgMTI5fSwJLyoggSAqLwotCXsnZScsICdcJycsIDEzMH0sCS8qIIIgKi8KLQl7J2EnLCAnXicsIDEzMX0sCS8qIIMgKi8KLQl7J2EnLCAnIicsIDEzMn0sCS8qIIQgKi8KLQl7J2EnLCAnYCcsIDEzM30sCS8qIIUgKi8KLQl7J2EnLCAnQCcsIDEzNH0sCS8qIIYgKi8KLQl7J2MnLCAnLCcsIDEzNX0sCS8qIH5HIFhYICovCi0JeydlJywgJ14nLCAxMzZ9LAkvKiB+SCBYWCAqLwotCXsnZScsICciJywgMTM3fSwJLyogiSAqLwotCXsnZScsICdgJywgMTM4fSwJLyogiiAqLwotCXsnaScsICciJywgMTM5fSwJLyogiyAqLwotCXsnaScsICdeJywgMTQwfSwJLyogjCAqLwotCXsnaScsICdgJywgMTQxfSwJLyogjSAqLwotCXsnQScsICciJywgMTQyfSwJLyogfk4gWFggKi8KLQl7J0EnLCAnQCcsIDE0M30sCS8qII8gKi8KLQl7J0UnLCAnXCcnLCAxNDR9LAkvKiCQICovCi0JeydhJywgJ2UnLCAxNDV9LAkvKiCRICovCi0JeydBJywgJ0UnLCAxNDZ9LAkvKiCSICovCi0JeydvJywgJ14nLCAxNDd9LAkvKiCTICovCi0JeydvJywgJyInLCAxNDh9LAkvKiCUICovCi0JeydvJywgJ2AnLCAxNDl9LAkvKiCVICovCi0Jeyd1JywgJ14nLCAxNTB9LAkvKiCWICovCi0Jeyd1JywgJ2AnLCAxNTF9LAkvKiCXICovCi0Jeyd5JywgJyInLCAxNTJ9LAkvKiCYICovCi0JeydPJywgJyInLCAxNTN9LAkvKiCZICovCi0JeydVJywgJyInLCAxNTR9LAkvKiCaICovCi0JeydjJywgJ3wnLCAxNTV9LAkvKiCbICovCi0JeyckJywgJyQnLCAxNTZ9LAkvKiCcICovCi0JeydZJywgJy0nLCAxNTd9LAkvKiB+XSBYWCAqLwotCXsnUCcsICd0JywgMTU4fSwJLyogniAqLwotCXsnZicsICdmJywgMTU5fSwJLyognyAqLwotCXsnYScsICdcJycsIDE2MH0sCS8qIKAgKi8KLQl7J2knLCAnXCcnLCAxNjF9LAkvKiChICovCi0JeydvJywgJ1wnJywgMTYyfSwJLyogoiAqLwotCXsndScsICdcJycsIDE2M30sCS8qIHggWFggKi8KLQl7J24nLCAnficsIDE2NH0sCS8qIKQgKi8KLQl7J04nLCAnficsIDE2NX0sCS8qIKUgKi8KLQl7J2EnLCAnYScsIDE2Nn0sCS8qIKYgKi8KLQl7J28nLCAnbycsIDE2N30sCS8qIKcgKi8KLQl7J34nLCAnPycsIDE2OH0sCS8qIKggKi8KLQl7Jy0nLCAnYScsIDE2OX0sCS8qIKkgKi8KLQl7J2EnLCAnLScsIDE3MH0sCS8qIKogKi8KLQl7JzEnLCAnMicsIDE3MX0sCS8qIKsgKi8KLQl7JzEnLCAnNCcsIDE3Mn0sCS8qIKwgKi8KLQl7J34nLCAnIScsIDE3M30sCS8qIK0gKi8KLQl7JzwnLCAnPCcsIDE3NH0sCS8qIK4gKi8KLQl7Jz4nLCAnPicsIDE3NX0sCS8qIK8gKi8KLQotCXsncycsICdzJywgMjI1fSwJLyog4SAqLwotCXsnaicsICd1JywgMjMwfSwJLyog5iAqLwotCXsnbycsICcvJywgMjM3fSwJLyog7SAqLwotCXsnKycsICctJywgMjQxfSwJLyog8SAqLwotCXsnPicsICc9JywgMjQyfSwJLyog8iAqLwotCXsnPCcsICc9JywgMjQzfSwJLyog8yAqLwotCXsnOicsICctJywgMjQ2fSwJLyog9iAqLwotCXsnficsICd+JywgMjQ3fSwJLyog9yAqLwotCXsnficsICdvJywgMjQ4fSwJLyog+CAqLwotCXsnMicsICcyJywgMjUzfSwJLyog/SAqLwotCXtOVUwsIE5VTCwgTlVMfQotCX07Ci0KLSNlbHNlCS8qICFNU0RPUyAqLwotIyBpZmRlZiBfX01JTlRfXworI2lmZGVmIF9fTUlOVF9fCiAKIAkvKgogCSAqIEFUQVJJIGRpZ3JhcGhzCkBAIC0xNzEsOCArMTA0LDggQEAKIAl7TlVMLCBOVUwsIE5VTH0KIAl9OwogCi0jIGVsc2UJLyogIV9fTUlOVF9fICovCi0jICBpZmRlZiBIUFVYX0RJR1JBUEhTCisjZWxzZQkvKiAhX19NSU5UX18gKi8KKyMgaWZkZWYgSFBVWF9ESUdSQVBIUwogCiAJLyoKIAkgKiBkaWZmZXJlbnQgSFBVWCBkaWdyYXBocwpAQCAtMjc1LDkgKzIwOCw5IEBACiAJe05VTCwgTlVMLCBOVUx9CiAJfTsKIAotIyAgZWxzZQkvKiAhSFBVWF9ESUdSQVBIUyAqLworIyBlbHNlCS8qICFIUFVYX0RJR1JBUEhTICovCiAKLSMgICBpZmRlZiBFQkNESUMKKyMgIGlmZGVmIEVCQ0RJQwogCiAJLyoKIAkgKiBFQkNESUMgLSBJU08gZGlncmFwaHMKQEAgLTM4Nyw4ICszMjAsOCBAQAogCXtOVUwsIE5VTCwgTlVMfQogCX07CiAKLSMgICBlbHNlCi0jICAgIGlmIGRlZmluZWQoTUFDT1MpICYmICFkZWZpbmVkKEZFQVRfTUJZVEUpCisjICBlbHNlCisjICAgaWYgZGVmaW5lZChNQUNPUykgJiYgIWRlZmluZWQoRkVBVF9NQllURSkKIAogCS8qCiAJICogTWFjaW50b3NoIGRpZ3JhcGhzCkBAIC01MTYsOSArNDQ5LDkgQEAKIAl7TlVMLCBOVUwsIE5VTH0KIAl9OwogCi0jICAgIGVsc2UJLyogIU1BQ09TICovCisjICAgZWxzZQkvKiAhTUFDT1MgKi8KIAotIyAgICAgaWZkZWYgT0xEX0RJR1JBUEhTCisjICAgIGlmZGVmIE9MRF9ESUdSQVBIUwogCiAJLyoKIAkgKiBkaWdyYXBocyBjb21wYXRpYmxlIHdpdGggVmltIDUueApAQCAtNjI1LDcgKzU1OCw3IEBACiAJeyd5JywgJyInLCAyNTV9LAkvKiB4IFhYICovCiAJe05VTCwgTlVMLCBOVUx9CiAJfTsKLSMgICAgIGVsc2UgLyogT0xEX0RJR1JBUEhTICovCisjICAgIGVsc2UgLyogT0xEX0RJR1JBUEhTICovCiAKIAkvKgogCSAqIGRpZ3JhcGhzIGZvciBVbmljb2RlIGZyb20gUkZDMTM0NQpAQCAtMjAwMSwxMyArMTkzNCwxMiBAQAogCXtOVUwsIE5VTCwgTlVMfQogICAgICAgIH07CiAKLSMgICAgIGVuZGlmIC8qIE9MRF9ESUdSQVBIUyAqLworIyAgICBlbmRpZiAvKiBPTERfRElHUkFQSFMgKi8KIAotIyAgICBlbmRpZiAvKiBNYWNpbnRvc2ggKi8KLSMgICBlbmRpZiAvKiBFQkNESUMgKi8KLSMgIGVuZGlmICAgIC8qICFIUFVYX0RJR1JBUEhTICovCi0jIGVuZGlmCS8qICFfX01JTlRfXyAqLwotI2VuZGlmCS8qICFNU0RPUyAqLworIyAgIGVuZGlmIC8qIE1hY2ludG9zaCAqLworIyAgZW5kaWYgLyogRUJDRElDICovCisjIGVuZGlmICAgIC8qICFIUFVYX0RJR1JBUEhTICovCisjZW5kaWYJLyogIV9fTUlOVF9fICovCiAKIC8qCiAgKiBoYW5kbGUgZGlncmFwaHMgYWZ0ZXIgdHlwaW5nIGEgY2hhcmFjdGVyCmRpZmYgLS1naXQgYS9zcmMvZG9zaW5zdC5oIGIvc3JjL2Rvc2luc3QuaAppbmRleCA5N2Q4M2Q5Li5iNzNmMDk3IDEwMDY0NAotLS0gYS9zcmMvZG9zaW5zdC5oCisrKyBiL3NyYy9kb3NpbnN0LmgKQEAgLTQ2LDE0ICs0NiwxNCBAQAogY2hhciAqc2VhcmNocGF0aChjaGFyICpuYW1lKTsKICNlbmRpZgogCi0jaWYgZGVmaW5lZChESkdQUCkgfHwgZGVmaW5lZChVTklYX0xJTlQpCisjaWYgZGVmaW5lZChVTklYX0xJTlQpCiAjIGluY2x1ZGUgPHVuaXN0ZC5oPgogIyBpbmNsdWRlIDxlcnJuby5oPgogI2VuZGlmCiAKICNpbmNsdWRlICJ2ZXJzaW9uLmgiCiAKLSNpZiBkZWZpbmVkKERKR1BQKSB8fCBkZWZpbmVkKFVOSVhfTElOVCkKKyNpZiBkZWZpbmVkKFVOSVhfTElOVCkKICMgZGVmaW5lIHZpbV9ta2Rpcih4LCB5KSBta2RpcigoY2hhciAqKSh4KSwgeSkKICNlbHNlCiAjIGlmIGRlZmluZWQoV0lOMzI2NCkgJiYgIWRlZmluZWQoX19CT1JMQU5EQ19fKQpAQCAtNjMsOSArNjMsNyBAQAogIyBlbmRpZgogI2VuZGlmCiAKLSNpZm5kZWYgREpHUFAKLSMgZGVmaW5lIHNsZWVwKG4pIFNsZWVwKChuKSAqIDEwMDApCi0jZW5kaWYKKyNkZWZpbmUgc2xlZXAobikgU2xlZXAoKG4pICogMTAwMCkKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCkBAIC00MjMsOSArNDIxLDcgQEAKICAgICBjaGFyCSpwOwogCiAgICAgLyogT24gV2luTlQsICdzdGFydCcgaXMgYSBzaGVsbCBidWlsdC1pbiBmb3IgY21kLmV4ZSByYXRoZXIgdGhhbiBhbgotICAgICAqIGV4ZWN1dGFibGUgKHN0YXJ0LmV4ZSkgbGlrZSBpbiBXaW45eC4gIERKR1BQLCBiZWluZyBhIERPUyBwcm9ncmFtLAotICAgICAqIGlzIGdpdmVuIHRoZSBDT01TUEVDIGNvbW1hbmQuY29tIGJ5IFdpbk5ULCBzbyB3ZSBoYXZlIHRvIGZpbmQKLSAgICAgKiBjbWQuZXhlIG1hbnVhbGx5IGFuZCB1c2UgaXQuICovCisgICAgICogZXhlY3V0YWJsZSAoc3RhcnQuZXhlKSBsaWtlIGluIFdpbjl4LiAqLwogICAgIGNtZF9wYXRoID0gc2VhcmNocGF0aF9zYXZlKCJjbWQuZXhlIik7CiAgICAgaWYgKGNtZF9wYXRoICE9IE5VTEwpCiAgICAgewpAQCAtNjQwLDE0ICs2MzYsNiBAQAogICAgIHN0YXRpYyB2b2lkCiBkb19pbml0cyhjaGFyICoqYXJndikKIHsKLSNpZmRlZiBESkdQUAotICAgIC8qCi0gICAgICogVXNlIExvbmcgRmlsZSBOYW1lcyBieSBkZWZhdWx0LCBpZiAkTEZOIG5vdCBzZXQuCi0gICAgICovCi0gICAgaWYgKGdldGVudigiTEZOIikgPT0gTlVMTCkKLQlwdXRlbnYoIkxGTj15Iik7Ci0jZW5kaWYKLQogICAgIC8qIEZpbmQgb3V0IHRoZSBmdWxsIHBhdGggb2Ygb3VyIGV4ZWN1dGFibGUuICovCiAgICAgaWYgKG15X2Z1bGxwYXRoKGluc3RhbGxkaXIsIGFyZ3ZbMF0sIEJVRlNJWkUpID09IE5VTEwpCiAgICAgewpkaWZmIC0tZ2l0IGEvc3JjL2V2YWwuYyBiL3NyYy9ldmFsLmMKaW5kZXggMzQxMTk5Yy4uM2IxMTcyZSAxMDA2NDQKLS0tIGEvc3JjL2V2YWwuYworKysgYi9zcmMvZXZhbC5jCkBAIC0xMzUwMywxMyArMTM1MDMsNiBAQAogI2lmZGVmIF9fQkVPU19fCiAJImJlb3MiLAogI2VuZGlmCi0jaWZkZWYgTVNET1MKLSMgaWZkZWYgREpHUFAKLQkiZG9zMzIiLAotIyBlbHNlCi0JImRvczE2IiwKLSMgZW5kaWYKLSNlbmRpZgogI2lmZGVmIE1BQ09TCiAJIm1hYyIsCiAjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9leF9jbWRzLmMgYi9zcmMvZXhfY21kcy5jCmluZGV4IDc4ZDlmOTUuLmEyMTg2YjIgMTAwNjQ0Ci0tLSBhL3NyYy9leF9jbWRzLmMKKysrIGIvc3JjL2V4X2NtZHMuYwpAQCAtMTkyNSwxNCArMTkyNSwxMCBAQAogI2lmZGVmIFVOSVgKIAkJCQkgICAgc2hvcnRuYW1lLAogI2Vsc2UKLSMgaWZkZWYgU0hPUlRfRk5BTUUKLQkJCQkgICAgVFJVRSwKLSMgZWxzZQotIyAgaWZkZWYgRkVBVF9HVUlfVzMyCisjIGlmZGVmIEZFQVRfR1VJX1czMgogCQkJCSAgICBndWlfaXNfd2luMzJzKCksCi0jICBlbHNlCisjIGVsc2UKIAkJCQkgICAgRkFMU0UsCi0jICBlbmRpZgogIyBlbmRpZgogI2VuZGlmCiAJCQkJICAgIGZuYW1lLApkaWZmIC0tZ2l0IGEvc3JjL2V4X2NtZHMyLmMgYi9zcmMvZXhfY21kczIuYwppbmRleCBlMTA1ZmEwLi5lYzIwZGFhIDEwMDY0NAotLS0gYS9zcmMvZXhfY21kczIuYworKysgYi9zcmMvZXhfY21kczIuYwpAQCAtNDI1Niw4ICs0MjU2LDcgQEAKIHsKICAgICBjaGFyX3UJKmxvYzsKIAotICAgIC8qIE9idGFpbiB0aGUgbG9jYWxlIHZhbHVlIGZyb20gdGhlIGxpYnJhcmllcy4gIEZvciBESkdQUCB0aGlzIGlzCi0gICAgICogcmVkZWZpbmVkIGFuZCBpdCBkb2Vzbid0IHVzZSB0aGUgYXJndW1lbnRzLiAqLworICAgIC8qIE9idGFpbiB0aGUgbG9jYWxlIHZhbHVlIGZyb20gdGhlIGxpYnJhcmllcy4gKi8KICAgICBsb2MgPSAoY2hhcl91ICopc2V0bG9jYWxlKHdoYXQsIE5VTEwpOwogCiAjIGlmZGVmIFdJTjMyCmRpZmYgLS1naXQgYS9zcmMvZXhfZG9jbWQuYyBiL3NyYy9leF9kb2NtZC5jCmluZGV4IDEzMjFiN2YuLjFmNDkzYWQgMTAwNjQ0Ci0tLSBhL3NyYy9leF9kb2NtZC5jCisrKyBiL3NyYy9leF9kb2NtZC5jCkBAIC0zNzU4LDcgKzM3NTgsNyBAQAogCiAJLyogQ2hlY2sgZm9yIGVudmlyb25tZW50IHZhcmlhYmxlICovCiAJaWYgKCp4cC0+eHBfcGF0dGVybiA9PSAnJCcKLSNpZiBkZWZpbmVkKE1TRE9TKSB8fCBkZWZpbmVkKE1TV0lOKQorI2lmIGRlZmluZWQoTVNXSU4pCiAJCXx8ICp4cC0+eHBfcGF0dGVybiA9PSAnJScKICNlbmRpZgogCQkpCmRpZmYgLS1naXQgYS9zcmMvZXhfZ2V0bG4uYyBiL3NyYy9leF9nZXRsbi5jCmluZGV4IGEwYzk4NzcuLjY3NDFlMTEgMTAwNjQ0Ci0tLSBhL3NyYy9leF9nZXRsbi5jCisrKyBiL3NyYy9leF9nZXRsbi5jCkBAIC00OTE4LDcgKzQ5MTgsNyBAQAogCWlmICgqcyA9PSAnICcpCiAJICAgICsrczsJLyogU2tpcCBzcGFjZSB1c2VkIGZvciBhYnNvbHV0ZSBwYXRoIG5hbWUuICovCiAKLSNpZiBkZWZpbmVkKE1TRE9TKSB8fCBkZWZpbmVkKE1TV0lOKQorI2lmIGRlZmluZWQoTVNXSU4pCiAJZSA9IHZpbV9zdHJjaHIocywgJzsnKTsKICNlbHNlCiAJZSA9IHZpbV9zdHJjaHIocywgJzonKTsKQEAgLTUyMTcsNyArNTIxNyw3IEBACiAJY29weV9vcHRpb25fcGFydCgmcGF0aCwgYnVmLCBNQVhQQVRITCwgIiwiKTsKIAlpZiAoU1RSTEVOKGJ1ZikgKyBTVFJMRU4oZmlsZSkgKyAyIDwgTUFYUEFUSEwpCiAJewotIyBpZiBkZWZpbmVkKE1TV0lOKSB8fCBkZWZpbmVkKE1TRE9TKQorIyBpZiBkZWZpbmVkKE1TV0lOKQogCSAgICAvKiBVc2luZyB0aGUgcGxhdGZvcm0ncyBwYXRoIHNlcGFyYXRvciAoXCkgbWFrZXMgdmltIGluY29ycmVjdGx5CiAJICAgICAqIHRyZWF0IGl0IGFzIGFuIGVzY2FwZSBjaGFyYWN0ZXIsIHVzZSAnLycgaW5zdGVhZC4gKi8KIAkgICAgaWYgKCpidWYgIT0gTlVMICYmICFhZnRlcl9wYXRoc2VwKGJ1ZiwgYnVmICsgU1RSTEVOKGJ1ZikpKQpkaWZmIC0tZ2l0IGEvc3JjL2ZlYXR1cmUuaCBiL3NyYy9mZWF0dXJlLmgKaW5kZXggYWIwZWM1YS4uNDE1MGYwNyAxMDA2NDQKLS0tIGEvc3JjL2ZlYXR1cmUuaAorKysgYi9zcmMvZmVhdHVyZS5oCkBAIC02NSwxNCArNjUsMTAgQEAKICMgaWYgZGVmaW5lZChVTklYKSB8fCBkZWZpbmVkKFdJTjMyNjQpIHx8IGRlZmluZWQoTUFDT1MpCiAjICBkZWZpbmUgRkVBVF9IVUdFCiAjIGVsc2UKLSMgIGlmIGRlZmluZWQoTVNXSU4pIHx8IGRlZmluZWQoREpHUFApIHx8IGRlZmluZWQoVk1TKSB8fCBkZWZpbmVkKE1BQ09TKSB8fCBkZWZpbmVkKEFNSUdBKQorIyAgaWYgZGVmaW5lZChNU1dJTikgfHwgZGVmaW5lZChWTVMpIHx8IGRlZmluZWQoTUFDT1MpIHx8IGRlZmluZWQoQU1JR0EpCiAjICAgZGVmaW5lIEZFQVRfQklHCiAjICBlbHNlCi0jICAgaWZkZWYgTVNET1MKLSMgICAgZGVmaW5lIEZFQVRfU01BTEwKLSMgICBlbHNlCi0jICAgIGRlZmluZSBGRUFUX05PUk1BTAotIyAgIGVuZGlmCisjICAgZGVmaW5lIEZFQVRfTk9STUFMCiAjICBlbmRpZgogIyBlbmRpZgogI2VuZGlmCkBAIC00NjcsNyArNDYzLDcgQEAKICAqCQkJYW5kIGJ5dGUybGluZSgpLgogICoJCQlOb3RlOiBSZXF1aXJlZCBmb3IgTWFjaW50b3NoLgogICovCi0jaWYgZGVmaW5lZChGRUFUX05PUk1BTCkgJiYgIWRlZmluZWQoTVNET1MpCisjaWYgZGVmaW5lZChGRUFUX05PUk1BTCkKICMgZGVmaW5lIEZFQVRfVElUTEUKICNlbmRpZgogCkBAIC01NDEsNyArNTM3LDYgQEAKICAqCQkJd2l0aCBIQVZFX1RHRVRFTlQgZGVmaW5lZCkuCiAgKgogICogKG5vdGhpbmcpCQlNYWNoaW5lIHNwZWNpZmljIHRlcm1jYXAgZW50cmllcyB3aWxsIGJlIGluY2x1ZGVkLgotICoJCQlUaGlzIGlzIGRlZmF1bHQgZm9yIHdpbjE2IHRvIHNhdmUgc3RhdGljIGRhdGEuCiAgKgogICogU09NRV9CVUlMVElOX1RDQVBTCUluY2x1ZGUgbW9zdCB1c2VmdWwgYnVpbHRpbiB0ZXJtY2FwIGVudHJpZXMgKHVzZWQgb25seQogICoJCQl3aXRoIE5PX0JVSUxUSU5fVENBUFMgbm90IGRlZmluZWQpLgpAQCAtMTA2MCw3ICsxMDU1LDcgQEAKICMgaWZkZWYgRkVBVF9CSUcKICMgIGRlZmluZSBGRUFUX01PVVNFX1NHUgogIyBlbmRpZgotIyBpZiBkZWZpbmVkKEZFQVRfTk9STUFMKSAmJiAoZGVmaW5lZChNU0RPUykgfHwgZGVmaW5lZChXSU4zMjY0KSkKKyMgaWYgZGVmaW5lZChGRUFUX05PUk1BTCkgJiYgZGVmaW5lZChXSU4zMjY0KQogIyAgZGVmaW5lIERPU19NT1VTRQogIyBlbmRpZgogIyBpZiBkZWZpbmVkKEZFQVRfTk9STUFMKSAmJiBkZWZpbmVkKF9fUU5YX18pCkBAIC0xMTc2LDcgKzExNzEsNyBAQAogICovCiAjaWZkZWYgRkVBVF9OT1JNQUwKIC8qIE1TLURPUyBjb25zb2xlIGFuZCBXaW4zMiBjb25zb2xlIGNhbiBjaGFuZ2UgY3Vyc29yIHNoYXBlICovCi0jIGlmIGRlZmluZWQoTVNET1MpIHx8IChkZWZpbmVkKFdJTjMyNjQpICYmICFkZWZpbmVkKEZFQVRfR1VJX1czMikpCisjIGlmIGRlZmluZWQoV0lOMzI2NCkgJiYgIWRlZmluZWQoRkVBVF9HVUlfVzMyKQogIyAgZGVmaW5lIE1DSF9DVVJTT1JfU0hBUEUKICMgZW5kaWYKICMgaWYgZGVmaW5lZChGRUFUX0dVSV9XMzIpIHx8IGRlZmluZWQoRkVBVF9HVUlfTU9USUYpIFwKZGlmZiAtLWdpdCBhL3NyYy9maWxlaW8uYyBiL3NyYy9maWxlaW8uYwppbmRleCBjNWEzZjJhLi5lZDhkNDViIDEwMDY0NAotLS0gYS9zcmMvZmlsZWlvLmMKKysrIGIvc3JjL2ZpbGVpby5jCkBAIC00NDUsNyArNDQ1LDcgQEAKIAkgICAgcmV0dXJuIEZBSUw7CiAJfQogI2VuZGlmCi0jaWYgZGVmaW5lZChNU0RPUykgfHwgZGVmaW5lZChNU1dJTikKKyNpZiBkZWZpbmVkKE1TV0lOKQogCS8qCiAJICogTVMtV2luZG93cyBhbGxvd3Mgb3BlbmluZyBhIGRldmljZSwgYnV0IHdlIHdpbGwgcHJvYmFibHkgZ2V0IHN0dWNrCiAJICogdHJ5aW5nIHRvIHJlYWQgaXQuCkBAIC01MjEsMTIgKzUyMSwxMiBAQAogCiAvKgogICogZm9yIFVOSVg6IGNoZWNrIHJlYWRvbmx5IHdpdGggcGVybSBhbmQgbWNoX2FjY2VzcygpCi0gKiBmb3IgTVNET1MgYW5kIEFtaWdhOiBjaGVjayByZWFkb25seSBieSB0cnlpbmcgdG8gb3BlbiB0aGUgZmlsZSBmb3Igd3JpdGluZworICogZm9yIEFtaWdhOiBjaGVjayByZWFkb25seSBieSB0cnlpbmcgdG8gb3BlbiB0aGUgZmlsZSBmb3Igd3JpdGluZwogICovCiAgICAgZmlsZV9yZWFkb25seSA9IEZBTFNFOwogICAgIGlmIChyZWFkX3N0ZGluKQogICAgIHsKLSNpZiBkZWZpbmVkKE1TRE9TKSB8fCBkZWZpbmVkKE1TV0lOKQorI2lmIGRlZmluZWQoTVNXSU4pCiAJLyogRm9yY2UgYmluYXJ5IEkvTyBvbiBzdGRpbiB0byBhdm9pZCBDUi1MRiAtPiBMRiBjb252ZXJzaW9uLiAqLwogCXNldG1vZGUoMCwgT19CSU5BUlkpOwogI2VuZGlmCkBAIC01NjEsNyArNTYxLDcgQEAKIAltc2dfc2Nyb2xsID0gbXNnX3NhdmU7CiAjaWZuZGVmIFVOSVgKIAkvKgotCSAqIE9uIE1TRE9TIGFuZCBBbWlnYSB3ZSBjYW4ndCBvcGVuIGEgZGlyZWN0b3J5LCBjaGVjayBoZXJlLgorCSAqIE9uIEFtaWdhIHdlIGNhbid0IG9wZW4gYSBkaXJlY3RvcnksIGNoZWNrIGhlcmUuCiAJICovCiAJaXNkaXJfZiA9IChtY2hfaXNkaXIoZm5hbWUpKTsKIAlwZXJtID0gbWNoX2dldHBlcm0oZm5hbWUpOyAgLyogY2hlY2sgaWYgdGhlIGZpbGUgZXhpc3RzICovCkBAIC0zNTQ2LDcgKzM1NDYsNyBAQAogICAgIH0KICAgICBpZiAoYyA9PSBOT0RFX1dSSVRBQkxFKQogICAgIHsKLSMgaWYgZGVmaW5lZChNU0RPUykgfHwgZGVmaW5lZChNU1dJTikKKyMgaWYgZGVmaW5lZChNU1dJTikKIAkvKiBNUy1XaW5kb3dzIGFsbG93cyBvcGVuaW5nIGEgZGV2aWNlLCBidXQgd2Ugd2lsbCBwcm9iYWJseSBnZXQgc3R1Y2sKIAkgKiB0cnlpbmcgdG8gd3JpdGUgdG8gaXQuICAqLwogCWlmICghcF9vZGV2KQpAQCAtMzc5MSw3ICszNzkxLDcgQEAKIAkgICAgc3RydWN0IHN0YXQJc3RfbmV3OwogCSAgICBjaGFyX3UJKmRpcnA7CiAJICAgIGNoYXJfdQkqcm9vdG5hbWU7Ci0jaWYgZGVmaW5lZChVTklYKSAmJiAhZGVmaW5lZChTSE9SVF9GTkFNRSkKKyNpZiBkZWZpbmVkKFVOSVgpCiAJICAgIGludAkJZGlkX3NldF9zaG9ydG5hbWU7CiAjZW5kaWYKIApAQCAtMzgzNCw3ICszODM0LDcgQEAKIAkJICAgIGdvdG8gbm9iYWNrdXA7CiAJCX0KIAotI2lmIGRlZmluZWQoVU5JWCkgJiYgIWRlZmluZWQoU0hPUlRfRk5BTUUpCisjaWYgZGVmaW5lZChVTklYKQogCQlkaWRfc2V0X3Nob3J0bmFtZSA9IEZBTFNFOwogI2VuZGlmCiAKQEAgLTM4NDYsMTIgKzM4NDYsNyBAQAogCQkgICAgLyoKIAkJICAgICAqIE1ha2UgYmFja3VwIGZpbGUgbmFtZS4KIAkJICAgICAqLwotCQkgICAgYmFja3VwID0gYnVmX21vZG5hbWUoCi0jaWZkZWYgU0hPUlRfRk5BTUUKLQkJCSAgICBUUlVFLAotI2Vsc2UKLQkJCSAgICAoYnVmLT5iX3Bfc24gfHwgYnVmLT5iX3Nob3J0bmFtZSksCi0jZW5kaWYKKwkJICAgIGJhY2t1cCA9IGJ1Zl9tb2RuYW1lKChidWYtPmJfcF9zbiB8fCBidWYtPmJfc2hvcnRuYW1lKSwKIAkJCQkJCSByb290bmFtZSwgYmFja3VwX2V4dCwgRkFMU0UpOwogCQkgICAgaWYgKGJhY2t1cCA9PSBOVUxMKQogCQkgICAgewpAQCAtMzg3OCw3ICszODczLDYgQEAKIAkJCXsKIAkJCSAgICB2aW1fZnJlZShiYWNrdXApOwogCQkJICAgIGJhY2t1cCA9IE5VTEw7CS8qIG5vIGJhY2t1cCBmaWxlIHRvIGRlbGV0ZSAqLwotIyBpZm5kZWYgU0hPUlRfRk5BTUUKIAkJCSAgICAvKgogCQkJICAgICAqIG1heSB0cnkgYWdhaW4gd2l0aCAnc2hvcnRuYW1lJyBzZXQKIAkJCSAgICAgKi8KQEAgLTM4OTEsNyArMzg4NSw2IEBACiAJCQkJLyogc2V0dGluZyBzaG9ydG5hbWUgZGlkbid0IGhlbHAgKi8KIAkJCSAgICBpZiAoZGlkX3NldF9zaG9ydG5hbWUpCiAJCQkJYnVmLT5iX3Nob3J0bmFtZSA9IEZBTFNFOwotIyBlbmRpZgogCQkJICAgIGJyZWFrOwogCQkJfQogI2VuZGlmCkBAIC00MDU5LDEyICs0MDUyLDcgQEAKIAkJICAgIGJhY2t1cCA9IE5VTEw7CiAJCWVsc2UKIAkJewotCQkgICAgYmFja3VwID0gYnVmX21vZG5hbWUoCi0jaWZkZWYgU0hPUlRfRk5BTUUKLQkJCSAgICBUUlVFLAotI2Vsc2UKLQkJCSAgICAoYnVmLT5iX3Bfc24gfHwgYnVmLT5iX3Nob3J0bmFtZSksCi0jZW5kaWYKKwkJICAgIGJhY2t1cCA9IGJ1Zl9tb2RuYW1lKChidWYtPmJfcF9zbiB8fCBidWYtPmJfc2hvcnRuYW1lKSwKIAkJCQkJCSByb290bmFtZSwgYmFja3VwX2V4dCwgRkFMU0UpOwogCQkgICAgdmltX2ZyZWUocm9vdG5hbWUpOwogCQl9CkBAIC00OTExLDEyICs0ODk5LDcgQEAKICAgICAgKi8KICAgICBpZiAoKnBfcG0gJiYgZG9iYWNrdXApCiAgICAgewotCWNoYXIgKm9yZyA9IChjaGFyICopYnVmX21vZG5hbWUoCi0jaWZkZWYgU0hPUlRfRk5BTUUKLQkJCQkJVFJVRSwKLSNlbHNlCi0JCQkJCShidWYtPmJfcF9zbiB8fCBidWYtPmJfc2hvcnRuYW1lKSwKLSNlbmRpZgorCWNoYXIgKm9yZyA9IChjaGFyICopYnVmX21vZG5hbWUoKGJ1Zi0+Yl9wX3NuIHx8IGJ1Zi0+Yl9zaG9ydG5hbWUpLAogCQkJCQkJCSAgZm5hbWUsIHBfcG0sIEZBTFNFKTsKIAogCWlmIChiYWNrdXAgIT0gTlVMTCkKQEAgLTUyODcsNyArNTI3MCw3IEBACiAgICAgc3RhdGljIGludAogdGltZV9kaWZmZXJzKGxvbmcgdDEsIGxvbmcgdDIpCiB7Ci0jaWYgZGVmaW5lZChfX2xpbnV4X18pIHx8IGRlZmluZWQoTVNET1MpIHx8IGRlZmluZWQoTVNXSU4pCisjaWYgZGVmaW5lZChfX2xpbnV4X18pIHx8IGRlZmluZWQoTVNXSU4pCiAgICAgLyogT24gYSBGQVQgZmlsZXN5c3RlbSwgZXNwLiB1bmRlciBMaW51eCwgdGhlcmUgYXJlIG9ubHkgNSBiaXRzIHRvIHN0b3JlCiAgICAgICogdGhlIHNlY29uZHMuICBTaW5jZSB0aGUgcm91bmRvZmYgaXMgZG9uZSB3aGVuIGZsdXNoaW5nIHRoZSBpbm9kZSwgdGhlCiAgICAgICogdGltZSBtYXkgY2hhbmdlIHVuZXhwZWN0ZWRseSBieSBvbmUgc2Vjb25kISEhICovCkBAIC02MDMwLDkgKzYwMTMsOSBAQAogICAgIGlmIChmbmFtZW5jbXAoZGlyX25hbWUsIGZ1bGxfcGF0aCwgbGVuKSA9PSAwKQogICAgIHsKIAlwID0gZnVsbF9wYXRoICsgbGVuOwotI2lmIGRlZmluZWQoTVNET1MpIHx8IGRlZmluZWQoTVNXSU4pCisjaWYgZGVmaW5lZChNU1dJTikKIAkvKgotCSAqIE1TRE9TOiB3aGVuIGEgZmlsZSBpcyBpbiB0aGUgcm9vdCBkaXJlY3RvcnksIGRpcl9uYW1lIHdpbGwgZW5kIGluIGEKKwkgKiBNU1dJTjogd2hlbiBhIGZpbGUgaXMgaW4gdGhlIHJvb3QgZGlyZWN0b3J5LCBkaXJfbmFtZSB3aWxsIGVuZCBpbiBhCiAJICogc2xhc2gsIHNpbmNlIEM6IGJ5IGl0c2VsZiBkb2VzIG5vdCBkZWZpbmUgYSBzcGVjaWZpYyBkaXIuIEluIHRoaXMKIAkgKiBjYXNlIHAgbWF5IGFscmVhZHkgYmUgY29ycmVjdC4gPG5lZ3JpPgogCSAqLwpAQCAtNjA0Nyw3ICs2MDMwLDcgQEAKICNlbmRpZgogCX0KICAgICB9Ci0jaWYgZGVmaW5lZChNU0RPUykgfHwgZGVmaW5lZChNU1dJTikKKyNpZiBkZWZpbmVkKE1TV0lOKQogICAgIC8qCiAgICAgICogV2hlbiB1c2luZyBhIGZpbGUgaW4gdGhlIGN1cnJlbnQgZHJpdmUsIHJlbW92ZSB0aGUgZHJpdmUgbmFtZToKICAgICAgKiAiQTpcZGlyXGZpbGUiIC0+ICJcZGlyXGZpbGUiLiAgVGhpcyBoZWxwcyB3aGVuIG1vdmluZyBhIHNlc3Npb24gZmlsZSBvbgpAQCAtNjE2MywxMiArNjE0Niw3IEBACiAgICAgY2hhcl91ICpleHQsCiAgICAgaW50CSAgICBwcmVwZW5kX2RvdCkJLyogbWF5IHByZXBlbmQgYSAnLicgdG8gZmlsZSBuYW1lICovCiB7Ci0gICAgcmV0dXJuIGJ1Zl9tb2RuYW1lKAotI2lmZGVmIFNIT1JUX0ZOQU1FCi0JCQlUUlVFLAotI2Vsc2UKLQkJCShjdXJidWYtPmJfcF9zbiB8fCBjdXJidWYtPmJfc2hvcnRuYW1lKSwKLSNlbmRpZgorICAgIHJldHVybiBidWZfbW9kbmFtZSgoY3VyYnVmLT5iX3Bfc24gfHwgY3VyYnVmLT5iX3Nob3J0bmFtZSksCiAJCQkJCQkgICAgIGZuYW1lLCBleHQsIHByZXBlbmRfZG90KTsKIH0KIApAQCAtNjIwNyw5ICs2MTg1LDcgQEAKIAkgICAgcmV0dmFsW2ZuYW1lbGVuKytdID0gUEFUSFNFUDsKIAkgICAgcmV0dmFsW2ZuYW1lbGVuXSA9IE5VTDsKIAl9Ci0jaWZuZGVmIFNIT1JUX0ZOQU1FCiAJcHJlcGVuZF9kb3QgPSBGQUxTRTsJICAgIC8qIG5vdGhpbmcgdG8gcHJlcGVuZCBhIGRvdCB0byAqLwotI2VuZGlmCiAgICAgfQogICAgIGVsc2UKICAgICB7CkBAIC02MjM1LDkgKzYyMTEsNyBAQAogI2lmZGVmIFVTRV9MT05HX0ZOQU1FCiAJCSAgICAmJiAoIVVTRV9MT05HX0ZOQU1FIHx8IHNob3J0bmFtZSkKICNlbHNlCi0jIGlmbmRlZiBTSE9SVF9GTkFNRQogCQkgICAgJiYgc2hvcnRuYW1lCi0jIGVuZGlmCiAjZW5kaWYKIAkJCQkJCQkJKQogCSAgICBpZiAoKnB0ciA9PSAnLicpCS8qIHJlcGxhY2UgJy4nIGJ5ICdfJyAqLwpAQCAtNjI1MCwxMCArNjIyNCw4IEBACiAgICAgfQogCiAgICAgLyogdGhlIGZpbGUgbmFtZSBoYXMgYXQgbW9zdCBCQVNFTkFNRUxFTiBjaGFyYWN0ZXJzLiAqLwotI2lmbmRlZiBTSE9SVF9GTkFNRQogICAgIGlmIChTVFJMRU4ocHRyKSA+ICh1bnNpZ25lZClCQVNFTkFNRUxFTikKIAlwdHJbQkFTRU5BTUVMRU5dID0gJ1wwJzsKLSNlbmRpZgogCiAgICAgcyA9IHB0ciArIFNUUkxFTihwdHIpOwogCkBAIC02MjYzLDkgKzYyMzUsNyBAQAogI2lmZGVmIFVTRV9MT05HX0ZOQU1FCiAgICAgaWYgKCFVU0VfTE9OR19GTkFNRSB8fCBzaG9ydG5hbWUpCiAjZWxzZQotIyBpZm5kZWYgU0hPUlRfRk5BTUUKICAgICBpZiAoc2hvcnRuYW1lKQotIyBlbmRpZgogI2VuZGlmCiAgICAgewogCS8qCkBAIC02MzIwLDcgKzYyOTAsNiBAQAogICAgICAqLwogICAgIFNUUkNQWShzLCBleHQpOwogCi0jaWZuZGVmIFNIT1JUX0ZOQU1FCiAgICAgLyoKICAgICAgKiBQcmVwZW5kIHRoZSBkb3QuCiAgICAgICovCkBAIC02MzMzLDcgKzYzMDIsNiBAQAogCVNUUk1PVkUoZSArIDEsIGUpOwogCSplID0gJy4nOwogICAgIH0KLSNlbmRpZgogCiAgICAgLyoKICAgICAgKiBDaGVjayB0aGF0LCBhZnRlciBhcHBlbmRpbmcgdGhlIGV4dGVuc2lvbiwgdGhlIGZpbGUgbmFtZSBpcyByZWFsbHkKZGlmZiAtLWdpdCBhL3NyYy9nZXRjaGFyLmMgYi9zcmMvZ2V0Y2hhci5jCmluZGV4IDAzNDc1MTQuLjRhMjI1ZTEgMTAwNjQ0Ci0tLSBhL3NyYy9nZXRjaGFyLmMKKysrIGIvc3JjL2dldGNoYXIuYwpAQCAtMTY3NywxNSArMTY3Nyw2IEBACiAJCWMgPSBDU0k7CiAjZW5kaWYKIAl9Ci0jaWZkZWYgTVNET1MKLQkvKgotCSAqIElmIEtfTlVMIHdhcyB0eXBlZCwgaXQgaXMgcmVwbGFjZWQgYnkgS19OVUwsIDMgaW4gbWNoX2luY2hhcigpLgotCSAqIERlbGV0ZSB0aGUgMyBoZXJlLgotCSAqLwotCWVsc2UgaWYgKGMgPT0gS19OVUwgJiYgdnBlZWtjKCkgPT0gMykKLQkgICAgKHZvaWQpdmdldG9ycGVlayhUUlVFKTsKLSNlbmRpZgotCiAJLyogYSBrZXlwYWQgb3Igc3BlY2lhbCBmdW5jdGlvbiBrZXkgd2FzIG5vdCBtYXBwZWQsIHVzZSBpdCBsaWtlCiAJICogaXRzIEFTQ0lJIGVxdWl2YWxlbnQgKi8KIAlzd2l0Y2ggKGMpCkBAIC01MjQxLDcgKzUyMzIsNyBAQAogfQogI2VuZGlmCiAKLSNpZiBkZWZpbmVkKE1TRE9TKSB8fCBkZWZpbmVkKE1TV0lOKSB8fCBkZWZpbmVkKE1BQ09TKQorI2lmIGRlZmluZWQoTVNXSU4pIHx8IGRlZmluZWQoTUFDT1MpCiAKICNkZWZpbmUgVklTX1NFTAkoVklTVUFMK1NFTEVDVE1PREUpCS8qIGFiYnJldmlhdGlvbiAqLwogCkBAIC01MjU0LDcgKzUyNDUsNyBAQAogICAgIGludAkJbW9kZTsKIH0gaW5pdG1hcHBpbmdzW10gPQogewotI2lmIGRlZmluZWQoTVNET1MpIHx8IGRlZmluZWQoTVNXSU4pCisjaWYgZGVmaW5lZChNU1dJTikKIAkvKiBVc2UgdGhlIFdpbmRvd3MgKENVQSkga2V5YmluZGluZ3MuICovCiAjIGlmZGVmIEZFQVRfR1VJCiAJLyogcGFzdGUsIGNvcHkgYW5kIGN1dCAqLwpAQCAtNTI3NCwxNyArNTI2NSw2IEBACiAKIAkvKiBwYXN0ZSwgY29weSBhbmQgY3V0ICovCiAjICBpZmRlZiBGRUFUX0NMSVBCT0FSRAotIyAgIGlmZGVmIERKR1BQCi0JeyhjaGFyX3UgKikiXDMxNlwxMjIgXCIqUCIsIE5PUk1BTH0sCSAgICAvKiBTSElGVC1JbnNlcnQgaXMgIipQICovCi0JeyhjaGFyX3UgKikiXDMxNlwxMjIgXCItZFwiKlAiLCBWSVNfU0VMfSwgICAvKiBTSElGVC1JbnNlcnQgaXMgIi1kIipQICovCi0JeyhjaGFyX3UgKikiXDMxNlwxMjIgXDAyMlwwMTcqIiwgSU5TRVJUfSwgIC8qIFNISUZULUluc2VydCBpcyBeUl5PKiAqLwotCXsoY2hhcl91ICopIlwzMTZcMjIyIFwiKnkiLCBWSVNfU0VMfSwJICAgIC8qIENUUkwtSW5zZXJ0IGlzICIqeSAqLwotIyAgICBpZiAwIC8qIFNoaWZ0LURlbCBwcm9kdWNlcyB0aGUgc2FtZSBjb2RlIGFzIERlbCAqLwotCXsoY2hhcl91ICopIlwzMTZcMTIzIFwiKmQiLCBWSVNfU0VMfSwJICAgIC8qIFNISUZULURlbCBpcyAiKmQgKi8KLSMgICAgZW5kaWYKLQl7KGNoYXJfdSAqKSJcMzE2XDIyMyBcIipkIiwgVklTX1NFTH0sCSAgICAvKiBDVFJMLURlbCBpcyAiKmQgKi8KLQl7KGNoYXJfdSAqKSJcMDMwIFwiLWQiLCBWSVNfU0VMfSwJICAgIC8qIENUUkwtWCBpcyAiLWQgKi8KLSMgICBlbHNlCiAJeyhjaGFyX3UgKikiXDMxNlwzMjQgXCIqUCIsIE5PUk1BTH0sCSAgICAvKiBTSElGVC1JbnNlcnQgaXMgIipQICovCiAJeyhjaGFyX3UgKikiXDMxNlwzMjQgXCItZFwiKlAiLCBWSVNfU0VMfSwgICAvKiBTSElGVC1JbnNlcnQgaXMgIi1kIipQICovCiAJeyhjaGFyX3UgKikiXDMxNlwzMjQgXDAyMlwwMTcqIiwgSU5TRVJUfSwgIC8qIFNISUZULUluc2VydCBpcyBeUl5PKiAqLwpAQCAtNTI5Miw3ICs1MjcyLDYgQEAKIAl7KGNoYXJfdSAqKSJcMzE2XDMyNyBcIipkIiwgVklTX1NFTH0sCSAgICAvKiBTSElGVC1EZWwgaXMgIipkICovCiAJeyhjaGFyX3UgKikiXDMxNlwzMzAgXCIqZCIsIFZJU19TRUx9LAkgICAgLyogQ1RSTC1EZWwgaXMgIipkICovCiAJeyhjaGFyX3UgKikiXDAzMCBcIi1kIiwgVklTX1NFTH0sCSAgICAvKiBDVFJMLVggaXMgIi1kICovCi0jICAgZW5kaWYKICMgIGVsc2UKIAl7KGNoYXJfdSAqKSJcMzE2XDMyNCBQIiwgTk9STUFMfSwJICAgIC8qIFNISUZULUluc2VydCBpcyBQICovCiAJeyhjaGFyX3UgKikiXDMxNlwzMjQgXCItZFAiLCBWSVNfU0VMfSwJICAgIC8qIFNISUZULUluc2VydCBpcyAiLWRQICovCkBAIC01MzI1LDcgKzUzMDQsNyBAQAogICAgIHZvaWQKIGluaXRfbWFwcGluZ3Modm9pZCkKIHsKLSNpZiBkZWZpbmVkKE1TRE9TKSB8fCBkZWZpbmVkKE1TV0lOKSB8fGRlZmluZWQoTUFDT1MpCisjaWYgZGVmaW5lZChNU1dJTikgfHxkZWZpbmVkKE1BQ09TKQogICAgIGludAkJaTsKIAogICAgIGZvciAoaSA9IDA7IGkgPCAoaW50KShzaXplb2YoaW5pdG1hcHBpbmdzKSAvIHNpemVvZihzdHJ1Y3QgaW5pdG1hcCkpOyArK2kpCkBAIC01MzMzLDggKzUzMTIsNyBAQAogI2VuZGlmCiB9CiAKLSNpZiBkZWZpbmVkKE1TRE9TKSB8fCBkZWZpbmVkKE1TV0lOKSBcCi0JfHwgZGVmaW5lZChGRUFUX0NNRFdJTikgfHwgZGVmaW5lZChNQUNPUykgfHwgZGVmaW5lZChQUk9UTykKKyNpZiBkZWZpbmVkKE1TV0lOKSB8fCBkZWZpbmVkKEZFQVRfQ01EV0lOKSB8fCBkZWZpbmVkKE1BQ09TKSB8fCBkZWZpbmVkKFBST1RPKQogLyoKICAqIEFkZCBhIG1hcHBpbmcgIm1hcCIgZm9yIG1vZGUgIm1vZGUiLgogICogTmVlZCB0byBwdXQgc3RyaW5nIGluIGFsbG9jYXRlZCBtZW1vcnksIGJlY2F1c2UgZG9fbWFwKCkgd2lsbCBtb2RpZnkgaXQuCmRpZmYgLS1naXQgYS9zcmMvZ2xvYmFscy5oIGIvc3JjL2dsb2JhbHMuaAppbmRleCBiNDNmMWEyLi42ZmQ4NmZiIDEwMDY0NAotLS0gYS9zcmMvZ2xvYmFscy5oCisrKyBiL3NyYy9nbG9iYWxzLmgKQEAgLTE5LDcgKzE5LDcgQEAKICAqLwogRVhURVJOIGxvbmcJUm93cwkJCS8qIG5yIG9mIHJvd3MgaW4gdGhlIHNjcmVlbiAqLwogI2lmZGVmIERPX0lOSVQKLSMgaWYgZGVmaW5lZChNU0RPUykgfHwgZGVmaW5lZChXSU4zMjY0KQorIyBpZiBkZWZpbmVkKFdJTjMyNjQpCiAJCQkgICAgPSAyNUwKICMgZWxzZQogCQkJICAgID0gMjRMCkBAIC05NDgsOSArOTQ4LDYgQEAKICNlbmRpZgogCiBFWFRFUk4gaW50CW5vX2FiYnIgSU5JVCg9IFRSVUUpOwkvKiBUUlVFIHdoZW4gbm8gYWJicmV2aWF0aW9ucyBsb2FkZWQgKi8KLSNpZmRlZiBNU0RPUwotRVhURVJOIGludAliZWVwX2NvdW50IElOSVQoPSAwKTsJLyogbnIgb2YgYmVlcHMgc2luY2UgbGFzdCBjaGFyIHR5cGVkICovCi0jZW5kaWYKIAogI2lmZGVmIFVTRV9FWEVfTkFNRQogRVhURVJOIGNoYXJfdQkqZXhlX25hbWU7CQkvKiB0aGUgbmFtZSBvZiB0aGUgZXhlY3V0YWJsZSAqLwpkaWZmIC0tZ2l0IGEvc3JjL21hY3Jvcy5oIGIvc3JjL21hY3Jvcy5oCmluZGV4IDAxMmRlZjYuLmZmYzI5ZjAgMTAwNjQ0Ci0tLSBhL3NyYy9tYWNyb3MuaAorKysgYi9zcmMvbWFjcm9zLmgKQEAgLTIyNiw3ICsyMjYsNyBAQAogI2lmIGRlZmluZWQoVU5JWCkgfHwgZGVmaW5lZChWTVMpICAvKiBvcGVuIGluIHJ3LS0tLS0tLSBtb2RlICovCiAjIGRlZmluZSBtY2hfb3Blbl9ydyhuLCBmKQltY2hfb3BlbigobiksIChmKSwgKG1vZGVfdCkwNjAwKQogI2Vsc2UKLSMgaWYgZGVmaW5lZChNU0RPUykgfHwgZGVmaW5lZChNU1dJTikgIC8qIG9wZW4gcmVhZC93cml0ZSAqLworIyBpZiBkZWZpbmVkKE1TV0lOKSAgLyogb3BlbiByZWFkL3dyaXRlICovCiAjICBkZWZpbmUgbWNoX29wZW5fcncobiwgZikJbWNoX29wZW4oKG4pLCAoZiksIFNfSVJFQUQgfCBTX0lXUklURSkKICMgZWxzZQogIyAgZGVmaW5lIG1jaF9vcGVuX3J3KG4sIGYpCW1jaF9vcGVuKChuKSwgKGYpLCAwKQpkaWZmIC0tZ2l0IGEvc3JjL21haW4uYyBiL3NyYy9tYWluLmMKaW5kZXggZjE5ZWExZC4uYWM0YzdhNiAxMDA2NDQKLS0tIGEvc3JjL21haW4uYworKysgYi9zcmMvbWFpbi5jCkBAIC0xMCwxMCArMTAsNiBAQAogI2RlZmluZSBFWFRFUk4KICNpbmNsdWRlICJ2aW0uaCIKIAotI2lmZGVmIFNQQVdOTwotIyBpbmNsdWRlIDxzcGF3bm8uaD4JCS8qIHNwZWNpYWwgTVMtRE9TIHN3YXBwaW5nIGxpYnJhcnkgKi8KLSNlbmRpZgotCiAjaWZkZWYgX19DWUdXSU5fXwogIyBpZm5kZWYgV0lOMzIKICMgIGluY2x1ZGUgPGN5Z3dpbi92ZXJzaW9uLmg+CkBAIC01MDUsOCArNTAxLDcgQEAKIAogICAgIC8qCiAgICAgICogbWNoX2luaXQoKSBzZXRzIHVwIHRoZSB0ZXJtaW5hbCAod2luZG93KSBmb3IgdXNlLiAgVGhpcyBtdXN0IGJlCi0gICAgICogZG9uZSBhZnRlciByZXNldHRpbmcgZnVsbF9zY3JlZW4sIG90aGVyd2lzZSBpdCBtYXkgbW92ZSB0aGUgY3Vyc29yCi0gICAgICogKE1TRE9TKS4KKyAgICAgKiBkb25lIGFmdGVyIHJlc2V0dGluZyBmdWxsX3NjcmVlbiwgb3RoZXJ3aXNlIGl0IG1heSBtb3ZlIHRoZSBjdXJzb3IuCiAgICAgICogTm90ZSB0aGF0IHdlIG1heSB1c2UgbWNoX2V4aXQoKSBiZWZvcmUgbWNoX2luaXQoKSEKICAgICAgKi8KICAgICBtY2hfaW5pdCgpOwpAQCAtNzEwLDEwICs3MDUsNiBAQAogICAgIH0KICNlbmRpZgogCi0jaWZkZWYgU1BBV05PCQkvKiBzcGVjaWFsIE1TRE9TIHN3YXBwaW5nIGxpYnJhcnkgKi8KLSAgICBpbml0X1NQQVdOTygiIiwgU1dBUF9BTlkpOwotI2VuZGlmCi0KICNpZmRlZiBGRUFUX1ZJTUlORk8KICAgICAvKgogICAgICAqIFJlYWQgaW4gcmVnaXN0ZXJzLCBoaXN0b3J5IGV0YywgYnV0IG5vdCBtYXJrcywgZnJvbSB0aGUgdmltaW5mbyBmaWxlLgpkaWZmIC0tZ2l0IGEvc3JjL21ieXRlLmMgYi9zcmMvbWJ5dGUuYwppbmRleCBjNWIwYjU5Li4xNjA5Mjg0IDEwMDY0NAotLS0gYS9zcmMvbWJ5dGUuYworKysgYi9zcmMvbWJ5dGUuYwpAQCAtNjAwNSw3ICs2MDA1LDcgQEAKIH0KIAogI2lmIGRlZmluZWQoRkVBVF9HVUkpIHx8IGRlZmluZWQoQU1JR0EpIHx8IGRlZmluZWQoV0lOMzI2NCkgXAotCXx8IGRlZmluZWQoTVNET1MpIHx8IGRlZmluZWQoUFJPVE8pCisJfHwgZGVmaW5lZChQUk9UTykKIC8qCiAgKiBEbyBjb252ZXJzaW9uIG9uIHR5cGVkIGlucHV0IGNoYXJhY3RlcnMgaW4tcGxhY2UuCiAgKiBUaGUgaW5wdXQgYW5kIG91dHB1dCBhcmUgbm90IE5VTCB0ZXJtaW5hdGVkIQpkaWZmIC0tZ2l0IGEvc3JjL21lbWZpbGUuYyBiL3NyYy9tZW1maWxlLmMKaW5kZXggNTY3MTllZS4uZjZmZGE4ZCAxMDA2NDQKLS0tIGEvc3JjL21lbWZpbGUuYworKysgYi9zcmMvbWVtZmlsZS5jCkBAIC01NDEsNyArNTQxLDcgQEAKIHsKICAgICBpbnQJCXN0YXR1czsKICAgICBiaGRyX1QJKmhwOwotI2lmIGRlZmluZWQoU1lOQ19EVVBfQ0xPU0UpICYmICFkZWZpbmVkKE1TRE9TKQorI2lmIGRlZmluZWQoU1lOQ19EVVBfQ0xPU0UpCiAgICAgaW50CQlmZDsKICNlbmRpZgogICAgIGludAkJZ290X2ludF9zYXZlID0gZ290X2ludDsKQEAgLTYzNSwxOCArNjM1LDEzIEBACiAJCXN0YXR1cyA9IEZBSUw7CiAJfQogI2VuZGlmCi0jaWZkZWYgTVNET1MKLQlpZiAoX2Rvc19jb21taXQobWZwLT5tZl9mZCkpCi0JICAgIHN0YXR1cyA9IEZBSUw7Ci0jZWxzZQotIyBpZmRlZiBTWU5DX0RVUF9DTE9TRQorI2lmZGVmIFNZTkNfRFVQX0NMT1NFCiAJLyoKIAkgKiBXaW4zMiBpcyBhIGJpdCBtb3JlIHdvcms6IER1cGxpY2F0ZSB0aGUgZmlsZSBoYW5kbGUgYW5kIGNsb3NlIGl0LgogCSAqIFRoaXMgc2hvdWxkIGZsdXNoIHRoZSBmaWxlIHRvIGRpc2suCiAJICovCiAJaWYgKChmZCA9IGR1cChtZnAtPm1mX2ZkKSkgPj0gMCkKIAkgICAgY2xvc2UoZmQpOwotIyBlbmRpZgogI2VuZGlmCiAjaWZkZWYgQU1JR0EKICMgaWYgZGVmaW5lZChfX0FST1NfXykgfHwgZGVmaW5lZChfX2FtaWdhb3M0X18pCkBAIC0xMjYzLDcgKzEyNTgsNyBAQAogICAgICAqIGZuYW1lIGNhbm5vdCBiZSBOYW1lQnVmZiwgYmVjYXVzZSBpdCBtdXN0IGhhdmUgYmVlbiBhbGxvY2F0ZWQuCiAgICAgICovCiAgICAgbWZfc2V0X2ZmbmFtZShtZnApOwotI2lmIGRlZmluZWQoTVNET1MpIHx8IGRlZmluZWQoTVNXSU4pCisjaWYgZGVmaW5lZChNU1dJTikKICAgICAvKgogICAgICAqIEEgIjohY2QgZTp4eHgiIG1heSBjaGFuZ2UgdGhlIGRpcmVjdG9yeSB3aXRob3V0IHVzIGtub3dpbmcsIHVzZSB0aGUKICAgICAgKiBmdWxsIHBhdGhuYW1lIGFsd2F5cy4gIENhcmVmdWw6IFRoaXMgZnJlZXMgZm5hbWUhCmRpZmYgLS1naXQgYS9zcmMvbWVtbGluZS5jIGIvc3JjL21lbWxpbmUuYwppbmRleCAxY2IxYmIwLi4xNzA2MjgyIDEwMDY0NAotLS0gYS9zcmMvbWVtbGluZS5jCisrKyBiL3NyYy9tZW1saW5lLmMKQEAgLTMyNiwxMyArMzI2LDYgQEAKICAgICBjdXJ3aW4tPndfbnJ3aWR0aF9saW5lX2NvdW50ID0gMDsKICNlbmRpZgogCi0jaWYgZGVmaW5lZChNU0RPUykgJiYgIWRlZmluZWQoREpHUFApCi0gICAgLyogZm9yIDE2IGJpdCBNUy1ET1MgY3JlYXRlIGEgc3dhcGZpbGUgbm93LCBiZWNhdXNlIHdlIHJ1biBvdXQgb2YKLSAgICAgKiBtZW1vcnkgdmVyeSBxdWlja2x5ICovCi0gICAgaWYgKHBfdWMgIT0gMCkKLQltbF9vcGVuX2ZpbGUoYnVmKTsKLSNlbmRpZgotCiAvKgogICogZmlsbCBibG9jazAgc3RydWN0IGFuZCB3cml0ZSBwYWdlIDAKICAqLwpAQCAtNjQxLDcgKzYzNCw3IEBACiAgICAgbWVtZmlsZV9UCSptZnA7CiAgICAgY2hhcl91CSpmbmFtZTsKICAgICBjaGFyX3UJKmRpcnA7Ci0jaWYgZGVmaW5lZChNU0RPUykgfHwgZGVmaW5lZChNU1dJTikKKyNpZiBkZWZpbmVkKE1TV0lOKQogICAgIGNoYXJfdQkqcDsKICNlbmRpZgogCkBAIC02NzIsNyArNjY1LDcgQEAKIAlpZiAoZm5hbWUgPT0gTlVMTCkJICAgIC8qIG5vIGZpbGUgbmFtZSBmb3VuZCBmb3IgdGhpcyBkaXIgKi8KIAkgICAgY29udGludWU7CiAKLSNpZiBkZWZpbmVkKE1TRE9TKSB8fCBkZWZpbmVkKE1TV0lOKQorI2lmIGRlZmluZWQoTVNXSU4pCiAJLyoKIAkgKiBTZXQgZnVsbCBwYXRobmFtZSBmb3Igc3dhcCBmaWxlIG5vdywgYmVjYXVzZSBhICI6IWNkIGRpciIgbWF5CiAJICogY2hhbmdlIGRpcmVjdG9yeSB3aXRob3V0IHVzIGtub3dpbmcgaXQuCkBAIC03MDQsNyArNjk3LDcgQEAKIAkgICAgdmltX2ZyZWUobWZwLT5tZl9mbmFtZSk7CiAJICAgIG1mcC0+bWZfZm5hbWUgPSBmbmFtZTsKIAkgICAgdmltX2ZyZWUobWZwLT5tZl9mZm5hbWUpOwotI2lmIGRlZmluZWQoTVNET1MpIHx8IGRlZmluZWQoTVNXSU4pCisjaWYgZGVmaW5lZChNU1dJTikKIAkgICAgbWZwLT5tZl9mZm5hbWUgPSBOVUxMOyAgLyogbWZfZm5hbWUgaXMgZnVsbCBwYXRobmFtZSBhbHJlYWR5ICovCiAjZWxzZQogCSAgICBtZl9zZXRfZmZuYW1lKG1mcCk7CkBAIC03OTcsNyArNzkwLDcgQEAKIAkgICAgY29udGludWU7CiAJaWYgKG1mX29wZW5fZmlsZShtZnAsIGZuYW1lKSA9PSBPSykJLyogY29uc3VtZXMgZm5hbWUhICovCiAJewotI2lmIGRlZmluZWQoTVNET1MpIHx8IGRlZmluZWQoTVNXSU4pCisjaWYgZGVmaW5lZChNU1dJTikKIAkgICAgLyoKIAkgICAgICogc2V0IGZ1bGwgcGF0aG5hbWUgZm9yIHN3YXAgZmlsZSBub3csIGJlY2F1c2UgYSAiOiFjZCBkaXIiIG1heQogCSAgICAgKiBjaGFuZ2UgZGlyZWN0b3J5IHdpdGhvdXQgdXMga25vd2luZyBpdC4KQEAgLTk4Niw3ICs5NzksNyBAQAogCWIwcC0+YjBfZm5hbWVbMF0gPSBOVUw7CiAgICAgZWxzZQogICAgIHsKLSNpZiBkZWZpbmVkKE1TRE9TKSB8fCBkZWZpbmVkKE1TV0lOKSB8fCBkZWZpbmVkKEFNSUdBKQorI2lmIGRlZmluZWQoTVNXSU4pIHx8IGRlZmluZWQoQU1JR0EpCiAJLyogU3lzdGVtcyB0aGF0IGNhbm5vdCB0cmFuc2xhdGUgIn51c2VyIiBiYWNrIGludG8gYSBwYXRoOiBjb3B5IHRoZQogCSAqIGZpbGUgbmFtZSB1bm1vZGlmaWVkLiAgRG8gdXNlIHNsYXNoZXMgaW5zdGVhZCBvZiBiYWNrc2xhc2hlcyBmb3IKIAkgKiBwb3J0YWJpbGl0eS4gKi8KQEAgLTEyODAsNyArMTI3Myw3IEBACiAgICAgewogCW1zZ19zdGFydCgpOwogCW1zZ19vdXR0cmFuc19hdHRyKG1mcC0+bWZfZm5hbWUsIGF0dHIgfCBNU0dfSElTVCk7Ci0jaWYgZGVmaW5lZChNU0RPUykgfHwgZGVmaW5lZChNU1dJTikKKyNpZiBkZWZpbmVkKE1TV0lOKQogCWlmIChTVFJOQ01QKGIwcC0+YjBfaG5hbWUsICJQQyAiLCAzKSA9PSAwKQogCSAgICBNU0dfUFVUU19BVFRSKF8oIiBjYW5ub3QgYmUgdXNlZCB3aXRoIHRoaXMgdmVyc2lvbiBvZiBWaW0uXG4iKSwKIAkJCQkJCQkgICAgIGF0dHIgfCBNU0dfSElTVCk7CkBAIC0yMTQ3LDcgKzIxNDAsNyBAQAogCiAJCWlmIChiMF9tYWdpY193cm9uZygmYjApKQogCQl7Ci0jaWYgZGVmaW5lZChNU0RPUykgfHwgZGVmaW5lZChNU1dJTikKKyNpZiBkZWZpbmVkKE1TV0lOKQogCQkgICAgaWYgKFNUUk5DTVAoYjAuYjBfaG5hbWUsICJQQyAiLCAzKSA9PSAwKQogCQkJTVNHX1BVVFMoXygiXG4gICAgICAgICBbbm90IHVzYWJsZSB3aXRoIHRoaXMgdmVyc2lvbiBvZiBWaW1dIikpOwogCQkgICAgZWxzZQpAQCAtMjE3MiwxMyArMjE2NSw2IEBACiB7CiAgICAgaW50CQludW1fbmFtZXM7CiAKLSNpZmRlZiBTSE9SVF9GTkFNRQotICAgIC8qCi0gICAgICogKE1TLURPUykgYWx3YXlzIHNob3J0IG5hbWVzCi0gICAgICovCi0gICAgbmFtZXNbMF0gPSBtb2RuYW1lKHBhdGgsIChjaGFyX3UgKikiLnN3PyIsIEZBTFNFKTsKLSAgICBudW1fbmFtZXMgPSAxOwotI2Vsc2UgLyogIVNIT1JUX0ZOQU1FICovCiAgICAgLyoKICAgICAgKiAoV2luMzIgYW5kIFdpbjY0KSBuZXZlciBzaG9ydCBuYW1lcywgYnV0IGRvIHByZXBlbmQgYSBkb3QuCiAgICAgICogKE5vdCBNUy1ET1Mgb3IgV2luMzIgb3IgV2luNjQpIG1heWJlIHNob3J0IG5hbWUsIG1heWJlIG5vdDogVHJ5IGJvdGguCkBAIC0yMjYyLDggKzIyNDgsNiBAQAogICAgIGN1cmJ1Zi0+Yl9zaG9ydG5hbWUgPSBzaG9ydG5hbWU7CiAjIGVuZGlmCiAKLSNlbmRpZiAvKiAhU0hPUlRfRk5BTUUgKi8KLQogICAgIHJldHVybiBudW1fbmFtZXM7CiB9CiAKQEAgLTM5NTMsMTEgKzM5MzcsNyBAQAogI2VuZGlmCiAKICAgICByID0gYnVmX21vZG5hbWUoCi0jaWZkZWYgU0hPUlRfRk5BTUUKLQkgICAgVFJVRSwKLSNlbHNlCiAJICAgIChidWYtPmJfcF9zbiB8fCBidWYtPmJfc2hvcnRuYW1lKSwKLSNlbmRpZgogCSAgICBmbmFtZV9yZXMsCiAJICAgIChjaGFyX3UgKikKICNpZiBkZWZpbmVkKFZNUykKQEAgLTM5NjUsMTMgKzM5NDUsOCBAQAogI2Vsc2UKIAkgICAgIi5zd3AiLAogI2VuZGlmCi0jaWZkZWYgU0hPUlRfRk5BTUUJCS8qIGFsd2F5cyA4LjMgZmlsZSBuYW1lICovCi0JICAgIEZBTFNFCi0jZWxzZQogCSAgICAvKiBQcmVwZW5kIGEgJy4nIHRvIHRoZSBzd2FwIGZpbGUgbmFtZSBmb3IgdGhlIGN1cnJlbnQgZGlyZWN0b3J5LiAqLwotCSAgICBkaXJfbmFtZVswXSA9PSAnLicgJiYgZGlyX25hbWVbMV0gPT0gTlVMCi0jZW5kaWYKLQkgICAgICAgKTsKKwkgICAgZGlyX25hbWVbMF0gPT0gJy4nICYmIGRpcl9uYW1lWzFdID09IE5VTCk7CiAgICAgaWYgKHIgPT0gTlVMTCkJICAgIC8qIG91dCBvZiBtZW1vcnkgKi8KIAlyZXR1cm4gTlVMTDsKIApAQCAtNDE1MiwxMiArNDEyNywxMCBAQAogI2lmZGVmIEFNSUdBCiAgICAgQlBUUglmaDsKICNlbmRpZgotI2lmbmRlZiBTSE9SVF9GTkFNRQogICAgIGludAkJcjsKLSNlbmRpZgogICAgIGNoYXJfdQkqYnVmX2ZuYW1lID0gYnVmLT5iX2ZuYW1lOwogCi0jaWYgIWRlZmluZWQoU0hPUlRfRk5BTUUpICYmICFkZWZpbmVkKFVOSVgpCisjaWYgIWRlZmluZWQoVU5JWCkKICMgZGVmaW5lIENSRUFURV9EVU1NWV9GSUxFCiAgICAgRklMRQkqZHVtbXlmZCA9IE5VTEw7CiAKQEAgLTQyMTcsNyArNDE5MCw3IEBACiAJICAgIGZuYW1lID0gTlVMTDsKIAkgICAgYnJlYWs7CiAJfQotI2lmIGRlZmluZWQoVU5JWCkgJiYgIWRlZmluZWQoU0hPUlRfRk5BTUUpCisjaWYgZGVmaW5lZChVTklYKQogLyoKICAqIFNvbWUgc3lzdGVtcyBoYXZlIGEgTVMtRE9TIGNvbXBhdGlibGUgZmlsZXN5c3RlbSB0aGF0IHVzZSA4LjMgY2hhcmFjdGVyCiAgKiBmaWxlIG5hbWVzLiBJZiB0aGlzIGlzIHRoZSBmaXJzdCB0cnkgYW5kIHRoZSBzd2FwIGZpbGUgbmFtZSBkb2VzIG5vdCBmaXQgaW4KQEAgLTQzNTYsNyArNDMyOSw2IEBACiAJICovCiAJaWYgKGZuYW1lW24gLSAyXSA9PSAndycgJiYgZm5hbWVbbiAtIDFdID09ICdwJykJLyogZmlyc3QgdHJ5ICovCiAJewotI2lmbmRlZiBTSE9SVF9GTkFNRQogCSAgICAvKgogCSAgICAgKiBvbiBNUy1ET1MgY29tcGF0aWJsZSBmaWxlc3lzdGVtcyAoZS5nLiBtZXNzeWRvcykgZmlsZS5kb2Muc3dwCiAJICAgICAqIGFuZCBmaWxlLmRvYyBhcmUgdGhlIHNhbWUgZmlsZS4gVG8gZ3Vlc3MgaWYgdGhpcyBwcm9ibGVtIGlzCkBAIC00Mzc5LDcgKzQzNTEsNiBAQAogCQkgICAgY29udGludWU7CSAgICAvKiB0cnkgYWdhaW4gd2l0aCAnLicgcmVwbGFjZWQgd2l0aCAnXycgKi8KIAkJfQogCSAgICB9Ci0jZW5kaWYKIAkgICAgLyoKIAkgICAgICogSWYgd2UgZ2V0IGhlcmUgdGhlICIuc3dwIiBmaWxlIHJlYWxseSBleGlzdHMuCiAJICAgICAqIEdpdmUgYW4gZXJyb3IgbWVzc2FnZSwgdW5sZXNzIHJlY292ZXJpbmcsIG5vIGZpbGUgbmFtZSwgd2UgYXJlCmRpZmYgLS1naXQgYS9zcmMvbWlzYzEuYyBiL3NyYy9taXNjMS5jCmluZGV4IGNiNDVhNzIuLjI3Y2E4M2UgMTAwNjQ0Ci0tLSBhL3NyYy9taXNjMS5jCisrKyBiL3NyYy9taXNjMS5jCkBAIC0zNjc2LDI4ICszNjc2LDkgQEAKIAkJICAgICYmICEoZ3VpLmluX3VzZSAmJiBndWkuc3RhcnRpbmcpCiAjZW5kaWYKIAkJICAgICkKLQkgICAgewogCQlvdXRfc3RyKFRfVkIpOwotCSAgICB9CiAJICAgIGVsc2UKLQkgICAgewotI2lmZGVmIE1TRE9TCi0JCS8qCi0JCSAqIFRoZSBudW1iZXIgb2YgYmVlcHMgb3V0cHV0dGVkIGlzIHJlZHVjZWQgdG8gYXZvaWQgaGF2aW5nIHRvCi0JCSAqIHdhaXQgZm9yIGFsbCB0aGUgYmVlcHMgdG8gZmluaXNoLiBUaGlzIGlzIG9ubHkgYSBwcm9ibGVtIG9uCi0JCSAqIHN5c3RlbXMgd2hlcmUgdGhlIGJlZXBzIGRvbid0IG92ZXJsYXAuCi0JCSAqLwotCQlpZiAoYmVlcF9jb3VudCA9PSAwIHx8IGJlZXBfY291bnQgPT0gMTApCi0JCXsKLQkJICAgIG91dF9jaGFyKEJFTEwpOwotCQkgICAgYmVlcF9jb3VudCA9IDE7Ci0JCX0KLQkJZWxzZQotCQkgICAgKytiZWVwX2NvdW50OwotI2Vsc2UKIAkJb3V0X2NoYXIoQkVMTCk7Ci0jZW5kaWYKLQkgICAgfQogCX0KIAogCS8qIFdoZW4gJ3ZlcmJvc2UnIGlzIHNldCBhbmQgd2UgYXJlIHNvdXJjaW5nIGEgc2NyaXB0IG9yIGV4ZWN1dGluZyBhCkBAIC0zODExLDcgKzM3OTIsNyBAQAogIyBlbmRpZgogI2VuZGlmCiAKLSNpZiBkZWZpbmVkKE1TRE9TKSB8fCBkZWZpbmVkKE1TV0lOKQorI2lmIGRlZmluZWQoTVNXSU4pCiAgICAgLyoKICAgICAgKiBEZWZhdWx0IGhvbWUgZGlyIGlzIEM6LwogICAgICAqIEJlc3QgYXNzdW1wdGlvbiB3ZSBjYW4gbWFrZSBpbiBzdWNoIGEgc2l0dWF0aW9uLgpAQCAtMzk0Nyw3ICszOTI4LDcgQEAKIAkJICAgICYmIGF0X3N0YXJ0CiAjZW5kaWYKIAkgICApCi0jaWYgZGVmaW5lZChNU0RPUykgfHwgZGVmaW5lZChNU1dJTikKKyNpZiBkZWZpbmVkKE1TV0lOKQogCQl8fCAqc3JjID09ICclJwogI2VuZGlmCiAJCXx8ICgqc3JjID09ICd+JyAmJiBhdF9zdGFydCkpCkBAIC0zOTc2LDcgKzM5NTcsNyBAQAogI2VuZGlmCiAJCXsKIAkJICAgIHdoaWxlIChjLS0gPiAwICYmICp0YWlsICE9IE5VTCAmJiAoKHZpbV9pc0lEYygqdGFpbCkpCi0jaWYgZGVmaW5lZChNU0RPUykgfHwgZGVmaW5lZChNU1dJTikKKyNpZiBkZWZpbmVkKE1TV0lOKQogCQkJICAgIHx8ICgqc3JjID09ICclJyAmJiAqdGFpbCAhPSAnJScpCiAjZW5kaWYKIAkJCSAgICApKQpAQCAtMzk4NSw3ICszOTY2LDcgQEAKIAkJICAgIH0KIAkJfQogCi0jaWYgZGVmaW5lZChNU0RPUykgfHwgZGVmaW5lZChNU1dJTikgfHwgZGVmaW5lZChVTklYKQorI2lmIGRlZmluZWQoTVNXSU4pIHx8IGRlZmluZWQoVU5JWCkKICMgaWZkZWYgVU5JWAogCQlpZiAoc3JjWzFdID09ICd7JyAmJiAqdGFpbCAhPSAnfScpCiAjIGVsc2UKQEAgLTQwMDMsNyArMzk4NCw3IEBACiAjZW5kaWYKIAkJICAgICp2YXIgPSBOVUw7CiAJCSAgICB2YXIgPSB2aW1fZ2V0ZW52KGRzdCwgJm11c3RmcmVlKTsKLSNpZiBkZWZpbmVkKE1TRE9TKSB8fCBkZWZpbmVkKE1TV0lOKSB8fCBkZWZpbmVkKFVOSVgpCisjaWYgZGVmaW5lZChNU1dJTikgfHwgZGVmaW5lZChVTklYKQogCQl9CiAjZW5kaWYKIAkgICAgfQpAQCAtNDE5NCw3ICs0MTc1LDcgQEAKICAgICBjaGFyX3UJKnBlbmQ7CiAgICAgaW50CQl2aW1ydW50aW1lOwogCi0jaWYgZGVmaW5lZChNU0RPUykgfHwgZGVmaW5lZChNU1dJTikKKyNpZiBkZWZpbmVkKE1TV0lOKQogICAgIC8qIHVzZSAiQzovIiB3aGVuICRIT01FIGlzIG5vdCBzZXQgKi8KICAgICBpZiAoU1RSQ01QKG5hbWUsICJIT01FIikgPT0gMCkKIAlyZXR1cm4gaG9tZWRpcjsKQEAgLTQ5MzIsNyArNDkxMyw3IEBACiB7CiAgICAgY2hhcl91ICAqcmV0dmFsOwogCi0jaWYgZGVmaW5lZChNU0RPUykgfHwgZGVmaW5lZChNU1dJTikKKyNpZiBkZWZpbmVkKE1TV0lOKQogICAgIC8qIG1heSBza2lwICJjOiIgKi8KICAgICBpZiAoaXNhbHBoYShwYXRoWzBdKSAmJiBwYXRoWzFdID09ICc6JykKIAlyZXR2YWwgPSBwYXRoICsgMjsKQEAgLTk3MzQsMTMgKzk3MTUsMTMgQEAKIHN0YXRpYyBpbnQgZXhwYW5kX2JhY2t0aWNrKGdhcnJheV9UICpnYXAsIGNoYXJfdSAqcGF0LCBpbnQgZmxhZ3MpOwogIyBlbmRpZgogCi0jIGlmIGRlZmluZWQoTVNET1MpIHx8IGRlZmluZWQoV0lOMzI2NCkKKyMgaWYgZGVmaW5lZChXSU4zMjY0KQogLyoKICAqIEZpbGUgbmFtZSBleHBhbnNpb24gY29kZSBmb3IgTVMtRE9TLCBXaW4xNiBhbmQgV2luMzIuICBJdCdzIGhlcmUgYmVjYXVzZQogICogaXQncyBzaGFyZWQgYmV0d2VlbiB0aGVzZSBzeXN0ZW1zLgogICovCi0jIGlmIGRlZmluZWQoREpHUFApIHx8IGRlZmluZWQoUFJPVE8pCi0jICBkZWZpbmUgX2NkZWNsCSAgICAvKiBESkdQUCBkb2Vzbid0IGhhdmUgdGhpcyAqLworIyBpZiBkZWZpbmVkKFBST1RPKQorIyAgZGVmaW5lIF9jZGVjbAogIyBlbHNlCiAjICBpZmRlZiBfX0JPUkxBTkRDX18KICMgICBkZWZpbmUgX2NkZWNsIF9SVExFTlRSWUYKQEAgLTk3NjIsMTQgKzk3NDMsOCBAQAogICAgIGNoYXJfdSAqZCwKICAgICBjaGFyX3UgKnMpCiB7Ci0jICBpZmRlZiBESkdQUAotICAgIGlmIChVU0VfTE9OR19GTkFNRSkJICAgIC8qIGRvbid0IGxvd2VyIGNhc2Ugb24gV2luZG93cyA5NS9OVCBzeXN0ZW1zICovCi0Jd2hpbGUgKCpzKQotCSAgICAqZCsrID0gKnMrKzsKLSAgICBlbHNlCi0jICBlbmRpZgotCXdoaWxlICgqcykKLQkgICAgKmQrKyA9IFRPTE9XRVJfTE9DKCpzKyspOworICAgIHdoaWxlICgqcykKKwkqZCsrID0gVE9MT1dFUl9MT0MoKnMrKyk7CiAgICAgKmQgPSBOVUw7CiB9CiAjIGVuZGlmCkBAIC0xMDA3OCw3ICsxMDA1Myw3IEBACiB7CiAgICAgcmV0dXJuIGRvc19leHBhbmRwYXRoKGdhcCwgcGF0aCwgMCwgZmxhZ3MsIEZBTFNFKTsKIH0KLSMgZW5kaWYgLyogTVNET1MgfHwgV0lOMzI2NCAqLworIyBlbmRpZiAvKiBXSU4zMjY0ICovCiAKICNpZiAoZGVmaW5lZChVTklYKSAmJiAhZGVmaW5lZChWTVMpKSB8fCBkZWZpbmVkKFVTRV9VTklYRklMRU5BTUUpIFwKIAl8fCBkZWZpbmVkKFBST1RPKQpAQCAtMTA0NDQsNyArMTA0MTksNyBAQAogCWlmIChnYV9ncm93KGdhcCwgMSkgPT0gRkFJTCkKIAkgICAgYnJlYWs7CiAKLSMgaWYgZGVmaW5lZChNU1dJTikgfHwgZGVmaW5lZChNU0RPUykKKyMgaWYgZGVmaW5lZChNU1dJTikKIAkvKiBBdm9pZCB0aGUgcGF0aCBlbmRpbmcgaW4gYSBiYWNrc2xhc2gsIGl0IGZhaWxzIHdoZW4gYSBjb21tYSBpcwogCSAqIGFwcGVuZGVkLiAqLwogCWxlbiA9IChpbnQpU1RSTEVOKGJ1Zik7CkBAIC0xMDQ4Miw3ICsxMDQ1Nyw3IEBACiAJaW50IGogPSAwOwogCiAJd2hpbGUgKChmbmFtZVtqXSA9PSBwYXRoX3BhcnRbaV1bal0KLSMgaWYgZGVmaW5lZChNU1dJTikgfHwgZGVmaW5lZChNU0RPUykKKyMgaWYgZGVmaW5lZChNU1dJTikKIAkJfHwgKHZpbV9pc3BhdGhzZXAoZm5hbWVbal0pICYmIHZpbV9pc3BhdGhzZXAocGF0aF9wYXJ0W2ldW2pdKSkKICNlbmRpZgogCQkJICAgICApICYmIGZuYW1lW2pdICE9IE5VTCAmJiBwYXRoX3BhcnRbaV1bal0gIT0gTlVMKQpAQCAtMTA2MDMsNyArMTA1NzgsNyBAQAogCSAgICAgKi8KIAkgICAgc2hvcnRfbmFtZSA9IHNob3J0ZW5fZm5hbWUocGF0aCwgY3VyZGlyKTsKIAkgICAgaWYgKHNob3J0X25hbWUgIT0gTlVMTCAmJiBzaG9ydF9uYW1lID4gcGF0aCArIDEKLSNpZiBkZWZpbmVkKE1TV0lOKSB8fCBkZWZpbmVkKE1TRE9TKQorI2lmIGRlZmluZWQoTVNXSU4pCiAJCSAgICAvKiBPbiB3aW5kb3dzLAogCQkgICAgICoJICAgIHNob3J0ZW5fZm5hbWUoImM6XGFcYS50eHQiLCAiYzpcYVxiIikKIAkJICAgICAqIHJldHVybnMgIlxhXGEudHh0Iiwgd2hpY2ggaXMgbm90IHJlYWxseSB0aGUgc2hvcnQKQEAgLTEwNzQzLDcgKzEwNzE4LDcgQEAKIAlpZiAoKnAgPT0gJ1xcJyAmJiBwWzFdICE9IE5VTCkKIAkgICAgKytwOwogCWVsc2UgaWYgKHZpbV9zdHJjaHIoKGNoYXJfdSAqKQotI2lmIGRlZmluZWQoTVNET1MpIHx8IGRlZmluZWQoTVNXSU4pCisjaWYgZGVmaW5lZChNU1dJTikKIAkJCQkgICAgIiQlIgogI2Vsc2UKIAkJCQkgICAgIiQiCmRpZmYgLS1naXQgYS9zcmMvbWlzYzIuYyBiL3NyYy9taXNjMi5jCmluZGV4IDc2NjVkMjkuLmMxNTE5ZWYgMTAwNjQ0Ci0tLSBhL3NyYy9taXNjMi5jCisrKyBiL3NyYy9taXNjMi5jCkBAIC04MDUsMTIgKzgwNSw3IEBACiAgKiBTb21lIG1lbW9yeSBpcyByZXNlcnZlZCBmb3IgZXJyb3IgbWVzc2FnZXMgYW5kIGZvciBiZWluZyBhYmxlIHRvCiAgKiBjYWxsIG1mX3JlbGVhc2VfYWxsKCksIHdoaWNoIG5lZWRzIHNvbWUgbWVtb3J5IGZvciBtZl90cmFuc19hZGQoKS4KICAqLwotI2lmIGRlZmluZWQoTVNET1MpICYmICFkZWZpbmVkKERKR1BQKQotIyBkZWZpbmUgU01BTExfTUVNCi0jIGRlZmluZSBLRUVQX1JPT00gODE5MkwKLSNlbHNlCi0jIGRlZmluZSBLRUVQX1JPT00gKDIgKiA4MTkyTCkKLSNlbmRpZgorI2RlZmluZSBLRUVQX1JPT00gKDIgKiA4MTkyTCkKICNkZWZpbmUgS0VFUF9ST09NX0tCIChLRUVQX1JPT00gLyAxMDI0TCkKIAogLyoKQEAgLTg5Miw3ICs4ODcsNyBAQAogICAgIGNoYXJfdQkqcDsJCSAgICAvKiBwb2ludGVyIHRvIG5ldyBzdG9yYWdlIHNwYWNlICovCiAgICAgc3RhdGljIGludAlyZWxlYXNpbmcgPSBGQUxTRTsgIC8qIGRvbid0IGRvIG1mX3JlbGVhc2VfYWxsKCkgcmVjdXJzaXZlICovCiAgICAgaW50CQl0cnlfYWdhaW47Ci0jaWYgZGVmaW5lZChIQVZFX0FWQUlMX01FTSkgJiYgIWRlZmluZWQoU01BTExfTUVNKQorI2lmIGRlZmluZWQoSEFWRV9BVkFJTF9NRU0pCiAgICAgc3RhdGljIGxvbmdfdSBhbGxvY2F0ZWQgPSAwOyAgICAvKiBhbGxvY2F0ZWQgc2luY2UgbGFzdCBhdmFpbCBjaGVjayAqLwogI2VuZGlmCiAKQEAgLTkwOSwxMiArOTA0LDYgQEAKICAgICBtZW1fcHJlX2FsbG9jX2woJnNpemUpOwogI2VuZGlmCiAKLSNpZiBkZWZpbmVkKE1TRE9TKSAmJiAhZGVmaW5lZChESkdQUCkKLSAgICBpZiAoc2l6ZSA+PSAweGZmZjApCQkvKiBpbiBNU0RPUyB3ZSBjYW4ndCBkZWFsIHdpdGggPjY0SyBibG9ja3MgKi8KLQlwID0gTlVMTDsKLSAgICBlbHNlCi0jZW5kaWYKLQogICAgIC8qCiAgICAgICogTG9vcCB3aGVuIG91dCBvZiBtZW1vcnk6IFRyeSB0byByZWxlYXNlIHNvbWUgbWVtZmlsZSBibG9ja3MgYW5kCiAgICAgICogaWYgc29tZSBibG9ja3MgYXJlIHJlbGVhc2VkIGNhbGwgbWFsbG9jIGFnYWluLgpAQCAtOTM0LDE0ICs5MjMsMTMgQEAKIAkgICAgLyogMS4gTm8gY2hlY2sgZm9yIGF2YWlsYWJsZSBtZW1vcnk6IEp1c3QgcmV0dXJuLiAqLwogCSAgICBnb3RvIHRoZWVuZDsKICNlbHNlCi0jIGlmbmRlZiBTTUFMTF9NRU0KIAkgICAgLyogMi4gU2xvdyBjaGVjayBmb3IgYXZhaWxhYmxlIG1lbW9yeTogY2FsbCBtY2hfYXZhaWxfbWVtKCkgYWZ0ZXIKIAkgICAgICogICAgYWxsb2NhdGluZyAoS0VFUF9ST09NIC8gMikgYW1vdW50IG9mIG1lbW9yeS4gKi8KIAkgICAgYWxsb2NhdGVkICs9IHNpemU7CiAJICAgIGlmIChhbGxvY2F0ZWQgPCBLRUVQX1JPT00gLyAyKQogCQlnb3RvIHRoZWVuZDsKIAkgICAgYWxsb2NhdGVkID0gMDsKLSMgZW5kaWYKKwogCSAgICAvKiAzLiBjaGVjayBmb3IgYXZhaWxhYmxlIG1lbW9yeTogY2FsbCBtY2hfYXZhaWxfbWVtKCkgKi8KIAkgICAgaWYgKG1jaF9hdmFpbF9tZW0oVFJVRSkgPCBLRUVQX1JPT01fS0IgJiYgIXJlbGVhc2luZykKIAkgICAgewpAQCAtNTQ1Myw3ICs1NDQxLDcgQEAKICAgICBpZiAodmltX2lzQWJzTmFtZShmZl9maWxlX3RvX2ZpbmQpCiAJICAgIC8qICIuLiIsICIuLi9wYXRoIiwgIi4iIGFuZCAiLi9wYXRoIjogZG9uJ3QgdXNlIHRoZSBwYXRoX29wdGlvbiAqLwogCSAgICB8fCByZWxfdG9fY3VyZGlyCi0jaWYgZGVmaW5lZChNU1dJTikgfHwgZGVmaW5lZChNU0RPUykKKyNpZiBkZWZpbmVkKE1TV0lOKQogCSAgICAvKiBoYW5kbGUgIlx0bXAiIGFzIGFic29sdXRlIHBhdGggKi8KIAkgICAgfHwgdmltX2lzcGF0aHNlcChmZl9maWxlX3RvX2ZpbmRbMF0pCiAJICAgIC8qIGhhbmRsZSAiYzpuYW1lIiBhcyBhYnNvbHV0ZSBwYXRoICovCkBAIC01NTA3LDE4ICs1NDk1LDEwIEBACiAJCWJ1ZiA9IHN1ZmZpeGVzOwogCQlmb3IgKDs7KQogCQl7Ci0JCSAgICBpZiAoCi0jaWZkZWYgREpHUFAKLQkJCSAgICAvKiAiQzoiIGJ5IGl0c2VsZiB3aWxsIGZhaWwgZm9yIG1jaF9nZXRwZXJtKCksCi0JCQkgICAgICogYXNzdW1lIGl0J3MgYWx3YXlzIHZhbGlkLiAqLwotCQkJICAgIChmaW5kX3doYXQgIT0gRklOREZJTEVfRklMRSAmJiBOYW1lQnVmZlswXSAhPSBOVUwKLQkJCQkgICYmIE5hbWVCdWZmWzFdID09ICc6JwotCQkJCSAgJiYgTmFtZUJ1ZmZbMl0gPT0gTlVMKSB8fAotI2VuZGlmCi0JCQkgICAgKG1jaF9nZXRwZXJtKE5hbWVCdWZmKSA+PSAwCisJCSAgICBpZiAobWNoX2dldHBlcm0oTmFtZUJ1ZmYpID49IDAKIAkJCSAgICAgJiYgKGZpbmRfd2hhdCA9PSBGSU5ERklMRV9CT1RICiAJCQkJIHx8ICgoZmluZF93aGF0ID09IEZJTkRGSUxFX0RJUikKLQkJCQkJCSAgICA9PSBtY2hfaXNkaXIoTmFtZUJ1ZmYpKSkpKQorCQkJCQkJICAgID09IG1jaF9pc2RpcihOYW1lQnVmZikpKSkKIAkJICAgIHsKIAkJCWZpbGVfbmFtZSA9IHZpbV9zdHJzYXZlKE5hbWVCdWZmKTsKIAkJCWdvdG8gdGhlZW5kOwpkaWZmIC0tZ2l0IGEvc3JjL25ldGJlYW5zLmMgYi9zcmMvbmV0YmVhbnMuYwppbmRleCAwNTE0MmE4Li5jYTAyNzhlIDEwMDY0NAotLS0gYS9zcmMvbmV0YmVhbnMuYworKysgYi9zcmMvbmV0YmVhbnMuYwpAQCAtMTQzMiw3ICsxNDMyLDcgQEAKIAkJaWYgKGJ1Zl93YXNfZW1wdHkpCiAJCXsKIAkJICAgIGlmIChmZl9kZXRlY3RlZCA9PSBFT0xfVU5LTk9XTikKLSNpZiBkZWZpbmVkKE1TRE9TKSB8fCBkZWZpbmVkKE1TV0lOKQorI2lmIGRlZmluZWQoTVNXSU4pCiAJCQlmZl9kZXRlY3RlZCA9IEVPTF9ET1M7CiAjZWxzZQogCQkJZmZfZGV0ZWN0ZWQgPSBFT0xfVU5JWDsKZGlmZiAtLWdpdCBhL3NyYy9vcHRpb24uYyBiL3NyYy9vcHRpb24uYwppbmRleCA0ZjczYzBiLi5iNjI0YWFkIDEwMDY0NAotLS0gYS9zcmMvb3B0aW9uLmMKKysrIGIvc3JjL29wdGlvbi5jCkBAIC0xNTUsOSArMTU1LDcgQEAKICNpZmRlZiBGRUFUX1NNQVJUSU5ERU5UCiAjIGRlZmluZSBQVl9TSQkJT1BUX0JVRihCVl9TSSkKICNlbmRpZgotI2lmbmRlZiBTSE9SVF9GTkFNRQotIyBkZWZpbmUgUFZfU04JCU9QVF9CVUYoQlZfU04pCi0jZW5kaWYKKyNkZWZpbmUgUFZfU04JCU9QVF9CVUYoQlZfU04pCiAjaWZkZWYgRkVBVF9TWU5fSEwKICMgZGVmaW5lIFBWX1NNQwkJT1BUX0JVRihCVl9TTUMpCiAjIGRlZmluZSBQVl9TWU4JCU9QVF9CVUYoQlZfU1lOKQpAQCAtMzUyLDkgKzM1MCw3IEBACiAjaWZkZWYgRkVBVF9TTUFSVElOREVOVAogc3RhdGljIGludAlwX3NpOwogI2VuZGlmCi0jaWZuZGVmIFNIT1JUX0ZOQU1FCiBzdGF0aWMgaW50CXBfc247Ci0jZW5kaWYKIHN0YXRpYyBsb25nCXBfc3RzOwogI2lmIGRlZmluZWQoRkVBVF9TRUFSQ0hQQVRIKQogc3RhdGljIGNoYXJfdQkqcF9zdWE7CkBAIC00NjQsNyArNDYwLDcgQEAKIAogLyogJ2lzcHJpbnQnIGZvciBsYXRpbjEgaXMgYWxzbyB1c2VkIGZvciBNUy1XaW5kb3dzIGNwMTI1Miwgd2hlcmUgMHg4MCBpcyB1c2VkCiAgKiBmb3IgdGhlIGN1cnJlbmN5IHNpZ24uICovCi0jaWYgZGVmaW5lZChNU0RPUykgfHwgZGVmaW5lZChNU1dJTikKKyNpZiBkZWZpbmVkKE1TV0lOKQogIyBkZWZpbmUgSVNQX0xBVElOMSAoY2hhcl91ICopIkAsfi0yNTUiCiAjZWxzZQogIyBkZWZpbmUgSVNQX0xBVElOMSAoY2hhcl91ICopIkAsMTYxLTI1NSIKQEAgLTQ5Nyw3ICs0OTMsNyBAQAogCQkJICAgIChjaGFyX3UgKilOVUxMLCBQVl9OT05FLAogI2VuZGlmCiAJCQkgICAgewotI2lmIChkZWZpbmVkKE1TRE9TKSB8fCBkZWZpbmVkKFdJTjMyNjQpKSAmJiAhZGVmaW5lZChGRUFUX0dVSV9XMzIpCisjaWYgKGRlZmluZWQoV0lOMzI2NCkpICYmICFkZWZpbmVkKEZFQVRfR1VJX1czMikKIAkJCSAgICAoY2hhcl91ICopMTI4TCwKICNlbHNlCiAJCQkgICAgKGNoYXJfdSAqKTIyNEwsCkBAIC01NzIsNyArNTY4LDcgQEAKICAgICB7ImJhY2tncm91bmQiLCAgImJnIiwgICBQX1NUUklOR3xQX1ZJX0RFRnxQX1JDTFIsCiAJCQkgICAgKGNoYXJfdSAqKSZwX2JnLCBQVl9OT05FLAogCQkJICAgIHsKLSNpZiAoZGVmaW5lZChNU0RPUykgfHwgZGVmaW5lZChXSU4zMjY0KSkgJiYgIWRlZmluZWQoRkVBVF9HVUkpCisjaWYgKGRlZmluZWQoV0lOMzI2NCkpICYmICFkZWZpbmVkKEZFQVRfR1VJKQogCQkJICAgIChjaGFyX3UgKikiZGFyayIsCiAjZWxzZQogCQkJICAgIChjaGFyX3UgKikibGlnaHQiLApAQCAtNjM3LDExICs2MzMsNyBAQAogCQkJICAgIChjaGFyX3UgKikmcF9iaW4sIFBWX0JJTiwKIAkJCSAgICB7KGNoYXJfdSAqKUZBTFNFLCAoY2hhcl91ICopMEx9IFNDUklQVElEX0lOSVR9LAogICAgIHsiYmlvc2tleSIsCSAgICAiYmlvc2siLFBfQk9PTHxQX1ZJX0RFRiwKLSNpZmRlZiBNU0RPUwotCQkJICAgIChjaGFyX3UgKikmcF9iaW9zaywgUFZfTk9ORSwKLSNlbHNlCiAJCQkgICAgKGNoYXJfdSAqKU5VTEwsIFBWX05PTkUsCi0jZW5kaWYKIAkJCSAgICB7KGNoYXJfdSAqKVRSVUUsIChjaGFyX3UgKikwTH0gU0NSSVBUSURfSU5JVH0sCiAgICAgeyJib21iIiwJICAgIE5VTEwsICAgUF9CT09MfFBfTk9fTUtSQ3xQX1ZJX0RFRnxQX1JTVEFULAogI2lmZGVmIEZFQVRfTUJZVEUKQEAgLTg4OSwxMSArODgxLDcgQEAKICNlbmRpZgogCQkJICAgIHsoY2hhcl91ICopRkFMU0UsIChjaGFyX3UgKikwTH0gU0NSSVBUSURfSU5JVH0sCiAgICAgeyJjb25za2V5IiwJICAgICJjb25zayIsUF9CT09MfFBfVklfREVGLAotI2lmZGVmIE1TRE9TCi0JCQkgICAgKGNoYXJfdSAqKSZwX2NvbnNrLCBQVl9OT05FLAotI2Vsc2UKIAkJCSAgICAoY2hhcl91ICopTlVMTCwgUFZfTk9ORSwKLSNlbmRpZgogCQkJICAgIHsoY2hhcl91ICopRkFMU0UsIChjaGFyX3UgKikwTH0gU0NSSVBUSURfSU5JVH0sCiAgICAgeyJjb3B5aW5kZW50IiwgICJjaSIsICAgUF9CT09MfFBfVklfREVGfFBfVklNLAogCQkJICAgIChjaGFyX3UgKikmcF9jaSwgUFZfQ0ksCkBAIC0xMzE3LDcgKzEzMDUsNyBAQAogCQkJICAgIHsKICMgaWZkZWYgRkVBVF9HVUkKIAkJCQkoY2hhcl91ICopIm4tdi1jOmJsb2NrLUN1cnNvci9sQ3Vyc29yLHZlOnZlcjM1LUN1cnNvcixvOmhvcjUwLUN1cnNvcixpLWNpOnZlcjI1LUN1cnNvci9sQ3Vyc29yLHItY3I6aG9yMjAtQ3Vyc29yL2xDdXJzb3Isc206YmxvY2stQ3Vyc29yLWJsaW5rd2FpdDE3NS1ibGlua29mZjE1MC1ibGlua29uMTc1IiwKLSMgZWxzZQkvKiBNU0RPUyBvciBXaW4zMiBjb25zb2xlICovCisjIGVsc2UJLyogV2luMzIgY29uc29sZSAqLwogCQkJCShjaGFyX3UgKikibi12LWM6YmxvY2ssbzpob3I1MCxpLWNpOmhvcjE1LHItY3I6aG9yMzAsc206YmxvY2siLAogIyBlbmRpZgogCQkJCSAgICAoY2hhcl91ICopMEx9CkBAIC0xNTk2LDcgKzE1ODQsNyBAQAogICAgIHsiaXNpZGVudCIsCSAgICAiaXNpIiwgIFBfU1RSSU5HfFBfVklfREVGfFBfQ09NTUF8UF9OT0RVUCwKIAkJCSAgICAoY2hhcl91ICopJnBfaXNpLCBQVl9OT05FLAogCQkJICAgIHsKLSNpZiBkZWZpbmVkKE1TRE9TKSB8fCBkZWZpbmVkKE1TV0lOKQorI2lmIGRlZmluZWQoTVNXSU4pCiAJCQkgICAgKGNoYXJfdSAqKSJALDQ4LTU3LF8sMTI4LTE2NywyMjQtMjM1IiwKICNlbHNlCiAjIGlmZGVmIEVCQ0RJQwpAQCAtMTYyMiw3ICsxNjEwLDcgQEAKIAkJCQkgICAgIjI1MS0yNTQiLAogI2Vsc2UKIAkJCQkoY2hhcl91ICopIkAsNDgtNTcsXyIsCi0jIGlmIGRlZmluZWQoTVNET1MpIHx8IGRlZmluZWQoTVNXSU4pCisjIGlmIGRlZmluZWQoTVNXSU4pCiAJCQkJKGNoYXJfdSAqKSJALDQ4LTU3LF8sMTI4LTE2NywyMjQtMjM1IgogIyBlbHNlCiAJCQkJSVNLX0xBVElOMQpAQCAtMTYzMiw4ICsxNjIwLDcgQEAKICAgICB7ImlzcHJpbnQiLAkgICAgImlzcCIsICBQX1NUUklOR3xQX1ZJX0RFRnxQX1JBTEx8UF9DT01NQXxQX05PRFVQLAogCQkJICAgIChjaGFyX3UgKikmcF9pc3AsIFBWX05PTkUsCiAJCQkgICAgewotI2lmIGRlZmluZWQoTVNET1MpIHx8IGRlZmluZWQoTVNXSU4pIFwKLQkJfHwgKGRlZmluZWQoTUFDT1MpICYmICFkZWZpbmVkKE1BQ09TX1gpKSBcCisjaWYgZGVmaW5lZChNU1dJTikgfHwgKGRlZmluZWQoTUFDT1MpICYmICFkZWZpbmVkKE1BQ09TX1gpKSBcCiAJCXx8IGRlZmluZWQoVk1TKQogCQkJICAgIChjaGFyX3UgKikiQCx+LTI1NSIsCiAjZWxzZQpAQCAtMTY3MiwxOSArMTY1OSwxOSBAQAogICAgIHsia2V5d29yZHByZyIsICAia3AiLCAgIFBfU1RSSU5HfFBfRVhQQU5EfFBfVklfREVGfFBfU0VDVVJFLAogCQkJICAgIChjaGFyX3UgKikmcF9rcCwgUFZfS1AsCiAJCQkgICAgewotI2lmIGRlZmluZWQoTVNET1MpIHx8IGRlZmluZWQoTVNXSU4pCisjaWYgZGVmaW5lZChNU1dJTikKIAkJCSAgICAoY2hhcl91ICopIjpoZWxwIiwKICNlbHNlCi0jaWZkZWYgVk1TCisjIGlmZGVmIFZNUwogCQkJICAgIChjaGFyX3UgKikiaGVscCIsCi0jZWxzZQotIyBpZmRlZiBVU0VNQU5fUwotCQkJICAgIChjaGFyX3UgKikibWFuIC1zIiwKICMgZWxzZQorIyAgaWZkZWYgVVNFTUFOX1MKKwkJCSAgICAoY2hhcl91ICopIm1hbiAtcyIsCisjICBlbHNlCiAJCQkgICAgKGNoYXJfdSAqKSJtYW4iLAorIyAgZW5kaWYKICMgZW5kaWYKICNlbmRpZgotI2VuZGlmCiAJCQkJKGNoYXJfdSAqKTBMfSBTQ1JJUFRJRF9JTklUfSwKICAgICB7ImxhbmdtYXAiLCAgICAgImxtYXAiLCBQX1NUUklOR3xQX1ZJX0RFRnxQX09ORUNPTU1BfFBfTk9EVVB8UF9TRUNVUkUsCiAjaWZkZWYgRkVBVF9MQU5HTUFQCkBAIC0xNzI5LDcgKzE3MTYsNyBAQAogICAgIHsibGluZXMiLAkgICAgTlVMTCwgICBQX05VTXxQX05PREVGQVVMVHxQX05PX01LUkN8UF9WSV9ERUZ8UF9SQ0xSLAogCQkJICAgIChjaGFyX3UgKikmUm93cywgUFZfTk9ORSwKIAkJCSAgICB7Ci0jaWYgZGVmaW5lZChNU0RPUykgfHwgZGVmaW5lZChXSU4zMjY0KQorI2lmIGRlZmluZWQoV0lOMzI2NCkKIAkJCSAgICAoY2hhcl91ICopMjVMLAogI2Vsc2UKIAkJCSAgICAoY2hhcl91ICopMjRMLApAQCAtMTg4MCw3ICsxODY3LDcgQEAKICAgICB7Im1vdXNlIiwJICAgIE5VTEwsICAgUF9TVFJJTkd8UF9WSV9ERUZ8UF9GTEFHTElTVCwKIAkJCSAgICAoY2hhcl91ICopJnBfbW91c2UsIFBWX05PTkUsCiAJCQkgICAgewotI2lmIGRlZmluZWQoTVNET1MpIHx8IGRlZmluZWQoV0lOMzI2NCkKKyNpZiBkZWZpbmVkKFdJTjMyNjQpCiAJCQkJKGNoYXJfdSAqKSJhIiwKICNlbHNlCiAJCQkJKGNoYXJfdSAqKSIiLApAQCAtMTkwMyw3ICsxODkwLDcgQEAKICAgICB7Im1vdXNlbW9kZWwiLCAgIm1vdXNlbSIsIFBfU1RSSU5HfFBfVklfREVGLAogCQkJICAgIChjaGFyX3UgKikmcF9tb3VzZW0sIFBWX05PTkUsCiAJCQkgICAgewotI2lmIGRlZmluZWQoTVNET1MpIHx8IGRlZmluZWQoTVNXSU4pCisjaWYgZGVmaW5lZChNU1dJTikKIAkJCQkoY2hhcl91ICopInBvcHVwIiwKICNlbHNlCiAjIGlmIGRlZmluZWQoTUFDT1MpCkBAIC0xOTYyLDcgKzE5NDksNyBAQAogCQkJICAgIChjaGFyX3UgKilOVUxMLCBQVl9OT05FLAogCQkJICAgIHsoY2hhcl91ICopRkFMU0UsIChjaGFyX3UgKikwTH0gU0NSSVBUSURfSU5JVH0sCiAgICAgeyJvcGVuZGV2aWNlIiwgICJvZGV2IiwgUF9CT09MfFBfVklfREVGLAotI2lmIGRlZmluZWQoTVNET1MpIHx8IGRlZmluZWQoTVNXSU4pCisjaWYgZGVmaW5lZChNU1dJTikKIAkJCSAgICAoY2hhcl91ICopJnBfb2RldiwgUFZfTk9ORSwKICNlbHNlCiAJCQkgICAgKGNoYXJfdSAqKU5VTEwsIFBWX05PTkUsCkBAIC0yMDA4LDcgKzE5OTUsNyBAQAogICAgIHsicGF0aCIsCSAgICAicGEiLCAgIFBfU1RSSU5HfFBfRVhQQU5EfFBfVklfREVGfFBfQ09NTUF8UF9OT0RVUCwKIAkJCSAgICAoY2hhcl91ICopJnBfcGF0aCwgUFZfUEFUSCwKIAkJCSAgICB7Ci0jaWYgZGVmaW5lZCBBTUlHQSB8fCBkZWZpbmVkIE1TRE9TIHx8IGRlZmluZWQgTVNXSU4KKyNpZiBkZWZpbmVkKEFNSUdBKSB8fCBkZWZpbmVkKE1TV0lOKQogCQkJICAgIChjaGFyX3UgKikiLiwsIiwKICNlbHNlCiAjIGlmIGRlZmluZWQoX19FTVhfXykKQEAgLTIyOTQsMjEgKzIyODEsMTcgQEAKICNpZmRlZiBWTVMKIAkJCSAgICAoY2hhcl91ICopIi0iLAogI2Vsc2UKLSMgaWYgZGVmaW5lZChNU0RPUykKLQkJCSAgICAoY2hhcl91ICopImNvbW1hbmQiLAotIyBlbHNlCi0jICBpZiBkZWZpbmVkKFdJTjMyNjQpCisjIGlmIGRlZmluZWQoV0lOMzI2NCkKIAkJCSAgICAoY2hhcl91ICopIiIsCS8qIHNldCBpbiBzZXRfaW5pdF8xKCkgKi8KLSMgIGVsc2UKKyMgZWxzZQogCQkJICAgIChjaGFyX3UgKikic2giLAotIyAgZW5kaWYKICMgZW5kaWYKICNlbmRpZiAvKiBWTVMgKi8KIAkJCQkoY2hhcl91ICopMEx9IFNDUklQVElEX0lOSVR9LAogICAgIHsic2hlbGxjbWRmbGFnIiwic2hjZiIsIFBfU1RSSU5HfFBfVklfREVGfFBfU0VDVVJFLAogCQkJICAgIChjaGFyX3UgKikmcF9zaGNmLCBQVl9OT05FLAogCQkJICAgIHsKLSNpZiBkZWZpbmVkKE1TRE9TKSB8fCBkZWZpbmVkKE1TV0lOKQorI2lmIGRlZmluZWQoTVNXSU4pCiAJCQkgICAgKGNoYXJfdSAqKSIvYyIsCiAjZWxzZQogCQkJICAgIChjaGFyX3UgKikiLWMiLApAQCAtMjM2NCw3ICsyMzQ3LDcgQEAKICAgICB7InNoZWxseGVzY2FwZSIsICJzeGUiLCBQX1NUUklOR3xQX1ZJX0RFRnxQX1NFQ1VSRSwKIAkJCSAgICAoY2hhcl91ICopJnBfc3hlLCBQVl9OT05FLAogCQkJICAgIHsKLSNpZiBkZWZpbmVkKE1TRE9TKSB8fCBkZWZpbmVkKFdJTjMyNjQpCisjaWYgZGVmaW5lZChXSU4zMjY0KQogCQkJICAgIChjaGFyX3UgKikiXCImfDw+KClAXiIsCiAjZWxzZQogCQkJICAgIChjaGFyX3UgKikiIiwKQEAgLTIzODEsMTEgKzIzNjQsNyBAQAogCQkJICAgIHsoY2hhcl91ICopIiIsIChjaGFyX3UgKikiZmlsbnh0VG9PIn0KIAkJCSAgICBTQ1JJUFRJRF9JTklUfSwKICAgICB7InNob3J0bmFtZSIsICAgInNuIiwgICBQX0JPT0x8UF9WSV9ERUYsCi0jaWZkZWYgU0hPUlRfRk5BTUUKLQkJCSAgICAoY2hhcl91ICopTlVMTCwgUFZfTk9ORSwKLSNlbHNlCiAJCQkgICAgKGNoYXJfdSAqKSZwX3NuLCBQVl9TTiwKLSNlbmRpZgogCQkJICAgIHsoY2hhcl91ICopRkFMU0UsIChjaGFyX3UgKikwTH0gU0NSSVBUSURfSU5JVH0sCiAgICAgeyJzaG93YnJlYWsiLCAgICJzYnIiLCAgUF9TVFJJTkd8UF9WSV9ERUZ8UF9SQUxMLAogI2lmZGVmIEZFQVRfTElORUJSRUFLCkBAIC0yNzk1LDcgKzI3NzQsNyBAQAogICAgIHsidmltaW5mbyIsCSAgICAidmkiLCAgIFBfU1RSSU5HfFBfT05FQ09NTUF8UF9OT0RVUHxQX1NFQ1VSRSwKICNpZmRlZiBGRUFUX1ZJTUlORk8KIAkJCSAgICAoY2hhcl91ICopJnBfdmltaW5mbywgUFZfTk9ORSwKLSNpZiBkZWZpbmVkKE1TRE9TKSB8fCBkZWZpbmVkKE1TV0lOKQorI2lmIGRlZmluZWQoTVNXSU4pCiAJCQkgICAgeyhjaGFyX3UgKikiIiwgKGNoYXJfdSAqKSInMTAwLDw1MCxzMTAsaCxyQTosckI6In0KICNlbHNlCiAjIGlmZGVmIEFNSUdBCkBAIC0zMTg3LDcgKzMxNjYsNyBAQAogICAgICAqIERvbid0IHVzZSBpdCBpZiBpdCBpcyBlbXB0eS4KICAgICAgKi8KICAgICBpZiAoKChwID0gbWNoX2dldGVudigoY2hhcl91ICopIlNIRUxMIikpICE9IE5VTEwgJiYgKnAgIT0gTlVMKQotI2lmIGRlZmluZWQoTVNET1MpIHx8IGRlZmluZWQoTVNXSU4pCisjaWYgZGVmaW5lZChNU1dJTikKICMgaWZkZWYgX19FTVhfXwogCSAgICB8fCAoKHAgPSBtY2hfZ2V0ZW52KChjaGFyX3UgKikiRU1YU0hFTEwiKSkgIT0gTlVMTCAmJiAqcCAhPSBOVUwpCiAjIGVuZGlmCkBAIC0zMzYzLDcgKzMzNDIsNyBAQAogI2lmZGVmIEZFQVRfUE9TVFNDUklQVAogICAgIC8qICdwcmludGV4cHInIG11c3QgYmUgYWxsb2NhdGVkIHRvIGJlIGFibGUgdG8gZXZhbHVhdGUgaXQuICovCiAgICAgc2V0X3N0cmluZ19kZWZhdWx0KCJwZXhwciIsCi0jIGlmIGRlZmluZWQoTVNXSU4pIHx8IGRlZmluZWQoTVNET1MpCisjIGlmIGRlZmluZWQoTVNXSU4pCiAJICAgIChjaGFyX3UgKikic3lzdGVtKCdjb3B5JyAuICcgJyAuIHY6Zm5hbWVfaW4gLiAoJnByaW50ZGV2aWNlID09ICcnID8gJyBMUFQxOicgOiAoJyBcIicgLiAmcHJpbnRkZXZpY2UgLiAnXCInKSkpIC4gZGVsZXRlKHY6Zm5hbWVfaW4pIgogIyBlbHNlCiAjICBpZmRlZiBWTVMKQEAgLTM1MTMsOCArMzQ5Miw3IEBACiAJCW9wdGlvbnNbb3B0X2lkeF0uZmxhZ3MgfD0gUF9ERUZfQUxMT0NFRDsKIAkgICAgfQogCi0jaWYgZGVmaW5lZChNU0RPUykgfHwgZGVmaW5lZChNU1dJTikgfHwgZGVmaW5lZChNQUNPUykgXAotCQl8fCBkZWZpbmVkKFZNUykKKyNpZiBkZWZpbmVkKE1TV0lOKSB8fCBkZWZpbmVkKE1BQ09TKSB8fCBkZWZpbmVkKFZNUykKIAkgICAgaWYgKFNUUkNNUChwX2VuYywgImxhdGluMSIpID09IDAKICMgaWZkZWYgRkVBVF9NQllURQogCQkgICAgfHwgZW5jX3V0ZjgKQEAgLTM3OTMsNyArMzc3MSw3IEBACiAgICAgc2V0X251bWJlcl9kZWZhdWx0KCJ3aW5kb3ciLCBSb3dzIC0gMSk7CiAKICAgICAvKiBGb3IgRE9TIGNvbnNvbGUgdGhlIGRlZmF1bHQgaXMgYWx3YXlzIGJsYWNrLiAqLwotI2lmICEoKGRlZmluZWQoTVNET1MpIHx8IGRlZmluZWQoV0lOMzI2NCkpICYmICFkZWZpbmVkKEZFQVRfR1VJKSkKKyNpZiAhKChkZWZpbmVkKFdJTjMyNjQpKSAmJiAhZGVmaW5lZChGRUFUX0dVSSkpCiAgICAgLyoKICAgICAgKiBJZiAnYmFja2dyb3VuZCcgd2Fzbid0IHNldCBieSB0aGUgdXNlciwgdHJ5IGd1ZXNzaW5nIHRoZSB2YWx1ZSwKICAgICAgKiBkZXBlbmRpbmcgb24gdGhlIHRlcm1pbmFsIG5hbWUuICBPbmx5IG5lZWQgdG8gY2hlY2sgZm9yIHRlcm1pbmFscwpAQCAtMzgzNiw3ICszODE0LDcgQEAKICAgICBzdGF0aWMgY2hhcl91ICoKIHRlcm1fYmdfZGVmYXVsdCh2b2lkKQogewotI2lmIGRlZmluZWQoTVNET1MpIHx8IGRlZmluZWQoV0lOMzI2NCkKKyNpZiBkZWZpbmVkKFdJTjMyNjQpCiAgICAgLyogRE9TIGNvbnNvbGUgbmVhcmx5IGFsd2F5cyBibGFjayAqLwogICAgIHJldHVybiAoY2hhcl91ICopImRhcmsiOwogI2Vsc2UKQEAgLTM5NjMsMTUgKzM5NDEsMTQgQEAKICAgICB9CiAjZW5kaWYKIAotI2lmIGRlZmluZWQoTVNET1MpIHx8IGRlZmluZWQoV0lOMzI2NCkKKyNpZiBkZWZpbmVkKFdJTjMyNjQpCiAgICAgLyoKICAgICAgKiBTZXQgJ3NoZWxsY21kZmxhZycsICdzaGVsbHhxdW90ZScsIGFuZCAnc2hlbGxxdW90ZScgZGVwZW5kaW5nIG9uIHRoZQogICAgICAqICdzaGVsbCcgb3B0aW9uLgogICAgICAqIFRoaXMgaXMgZG9uZSBhZnRlciBvdGhlciBpbml0aWFsaXphdGlvbnMsIHdoZXJlICdzaGVsbCcgbWlnaHQgaGF2ZSBiZWVuCiAgICAgICogc2V0LCBidXQgb25seSBpZiB0aGV5IGhhdmUgbm90IGJlZW4gc2V0IGJlZm9yZS4gIERlZmF1bHQgZm9yIHBfc2hjZiBpcwogICAgICAqICIvYyIsIGZvciBwX3NocSBpcyAiIi4gIEZvciAic2giIGxpa2UgIHNoZWxscyBpdCBpcyBjaGFuZ2VkIGhlcmUgdG8KLSAgICAgKiAiLWMiIGFuZCAiXCIiLCBidXQgbm90IGZvciBESkdQUCwgYmVjYXVzZSBpdCBzdGFydHMgdGhlIHNoZWxsIHdpdGhvdXQKLSAgICAgKiBjb21tYW5kLmNvbS4gIEFuZCBmb3IgV2luMzIgd2UgbmVlZCB0byBzZXQgcF9zeHEgaW5zdGVhZC4KKyAgICAgKiAiLWMiIGFuZCAiXCIiLiAgQW5kIGZvciBXaW4zMiB3ZSBuZWVkIHRvIHNldCBwX3N4cSBpbnN0ZWFkLgogICAgICAqLwogICAgIGlmIChzdHJzdHIoKGNoYXIgKilnZXR0YWlsKHBfc2gpLCAic2giKSAhPSBOVUxMKQogICAgIHsKQEAgLTM5ODQsOCArMzk2MSw3IEBACiAJICAgIG9wdGlvbnNbaWR4M10uZGVmX3ZhbFtWSV9ERUZBVUxUXSA9IHBfc2hjZjsKIAl9CiAKLSMgaWZuZGVmIERKR1BQCi0jICBpZmRlZiBXSU4zMjY0CisjIGlmZGVmIFdJTjMyNjQKIAkvKiBTb21laG93IFdpbjMyIHJlcXVpcmVzIHRoZSBxdW90ZXMgYXJvdW5kIHRoZSByZWRpcmVjdGlvbiB0b28gKi8KIAlpZHgzID0gZmluZG9wdGlvbigoY2hhcl91ICopInN4cSIpOwogCWlmIChpZHgzID49IDAgJiYgIShvcHRpb25zW2lkeDNdLmZsYWdzICYgUF9XQVNfU0VUKSkKQEAgLTM5OTMsMTQgKzM5NjksMTMgQEAKIAkgICAgcF9zeHEgPSAoY2hhcl91ICopIlwiIjsKIAkgICAgb3B0aW9uc1tpZHgzXS5kZWZfdmFsW1ZJX0RFRkFVTFRdID0gcF9zeHE7CiAJfQotIyAgZWxzZQorIyBlbHNlCiAJaWR4MyA9IGZpbmRvcHRpb24oKGNoYXJfdSAqKSJzaHEiKTsKIAlpZiAoaWR4MyA+PSAwICYmICEob3B0aW9uc1tpZHgzXS5mbGFncyAmIFBfV0FTX1NFVCkpCiAJewogCSAgICBwX3NocSA9IChjaGFyX3UgKikiXCIiOwogCSAgICBvcHRpb25zW2lkeDNdLmRlZl92YWxbVklfREVGQVVMVF0gPSBwX3NocTsKIAl9Ci0jICBlbmRpZgogIyBlbmRpZgogICAgIH0KICAgICBlbHNlIGlmIChzdHJzdHIoKGNoYXIgKilnZXR0YWlsKHBfc2gpLCAiY21kLmV4ZSIpICE9IE5VTEwpCkBAIC00NDI0LDggKzQzOTksOCBAQAogCSAgICB9CiAKIAkgICAgLyoKLQkgICAgICogYWxsb3cgJz0nIGFuZCAnOicgYXMgTVNET1MgY29tbWFuZC5jb20gYWxsb3dzIG9ubHkgb25lCi0JICAgICAqICc9JyBjaGFyYWN0ZXIgcGVyICJzZXQiIGNvbW1hbmQgbGluZS4gZ3Jyci4gKGp3KQorCSAgICAgKiBhbGxvdyAnPScgYW5kICc6JyBmb3IgaHlzdG9yaWNhbCByZWFzb25zIChNU0RPUyBjb21tYW5kLmNvbQorCSAgICAgKiBhbGxvd3Mgb25seSBvbmUgJz0nIGNoYXJhY3RlciBwZXIgInNldCIgY29tbWFuZCBsaW5lLiBncnJyLiAoancpCiAJICAgICAqLwogCSAgICBpZiAobmV4dGNoYXIgPT0gJz8nCiAJCSAgICB8fCAocHJlZml4ID09IDEKQEAgLTY1NTgsNyArNjUzMyw3IEBACiAJewogCSAgICBvdXRfc3RyKFRfTUUpOwogCSAgICByZWRyYXdfbGF0ZXIoQ0xFQVIpOwotI2lmIGRlZmluZWQoTVNET1MpIHx8IChkZWZpbmVkKFdJTjMyNjQpICYmICFkZWZpbmVkKEZFQVRfR1VJX1czMikpCisjaWYgZGVmaW5lZChXSU4zMjY0KSAmJiAhZGVmaW5lZChGRUFUX0dVSV9XMzIpCiAJICAgIC8qIFNpbmNlIHRfbWUgaGFzIGJlZW4gc2V0LCB0aGlzIHByb2JhYmx5IG1lYW5zIHRoYXQgdGhlIHVzZXIKIAkgICAgICogd2FudHMgdG8gdXNlIHRoaXMgYXMgZGVmYXVsdCBjb2xvcnMuICBOZWVkIHRvIHJlc2V0IGRlZmF1bHQKIAkgICAgICogYmFja2dyb3VuZC9mb3JlZ3JvdW5kIGNvbG9ycy4gKi8KQEAgLTg3OTQsMTIgKzg3NjksNiBAQAogICAgIH0KICAgICBsaW1pdF9zY3JlZW5fc2l6ZSgpOwogCi0jaWZkZWYgREpHUFAKLSAgICAvKiBhdm9pZCBhIGNyYXNoIGJ5IGNoZWNraW5nIGZvciBhIHRvbyBsYXJnZSB2YWx1ZSBvZiAnY29sdW1ucycgKi8KLSAgICBpZiAob2xkX0NvbHVtbnMgIT0gQ29sdW1ucyAmJiBmdWxsX3NjcmVlbiAmJiB0ZXJtX2NvbnNvbGUpCi0JbWNoX2NoZWNrX2NvbHVtbnMoKTsKLSNlbmRpZgotCiAgICAgLyoKICAgICAgKiBJZiB0aGUgc2NyZWVuIChzaGVsbCkgaGVpZ2h0IGhhcyBiZWVuIGNoYW5nZWQsIGFzc3VtZSBpdCBpcyB0aGUKICAgICAgKiBwaHlzaWNhbCBzY3JlZW5oZWlnaHQuCkBAIC0xMDM4OSw5ICsxMDM1OCw3IEBACiAjaWZkZWYgRkVBVF9TTUFSVElOREVOVAogCWNhc2UgUFZfU0k6CXJldHVybiAoY2hhcl91ICopJihjdXJidWYtPmJfcF9zaSk7CiAjZW5kaWYKLSNpZm5kZWYgU0hPUlRfRk5BTUUKIAljYXNlIFBWX1NOOglyZXR1cm4gKGNoYXJfdSAqKSYoY3VyYnVmLT5iX3Bfc24pOwotI2VuZGlmCiAJY2FzZSBQVl9TVFM6CXJldHVybiAoY2hhcl91ICopJihjdXJidWYtPmJfcF9zdHMpOwogI2lmZGVmIEZFQVRfU0VBUkNIUEFUSAogCWNhc2UgUFZfU1VBOglyZXR1cm4gKGNoYXJfdSAqKSYoY3VyYnVmLT5iX3Bfc3VhKTsKQEAgLTEwNzIyLDkgKzEwNjg5LDcgQEAKICNlbmRpZgogCSAgICBidWYtPmJfcF9zdHMgPSBwX3N0czsKIAkgICAgYnVmLT5iX3Bfc3RzX25vcGFzdGUgPSBwX3N0c19ub3Bhc3RlOwotI2lmbmRlZiBTSE9SVF9GTkFNRQogCSAgICBidWYtPmJfcF9zbiA9IHBfc247Ci0jZW5kaWYKICNpZmRlZiBGRUFUX0NPTU1FTlRTCiAJICAgIGJ1Zi0+Yl9wX2NvbSA9IHZpbV9zdHJzYXZlKHBfY29tKTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL29wdGlvbi5oIGIvc3JjL29wdGlvbi5oCmluZGV4IDI0ZTQxODQuLjJmMWYwNGYgMTAwNjQ0Ci0tLSBhL3NyYy9vcHRpb24uaAorKysgYi9zcmMvb3B0aW9uLmgKQEAgLTE4LDcgKzE4LDcgQEAKICNpZmRlZiBBTUlHQQogIyBkZWZpbmUgREZMVF9FRk0JIiVmPiVsOiVjOiV0OiVuOiVtLCVmOiVsOiAldCUqXFxEJW46ICVtLCVmICVsICV0JSpcXEQlbjogJW0sJSpbXlwiXVwiJWZcIiUqXFxEJWw6ICVtLCVmOiVsOiVtLCVmfCVsfCAlbSIKICNlbHNlCi0jIGlmIGRlZmluZWQoTVNET1MpIHx8IGRlZmluZWQoV0lOMzI2NCkKKyMgaWYgZGVmaW5lZChXSU4zMjY0KQogIyAgZGVmaW5lIERGTFRfRUZNCSIlZiglbCkgOiAldCUqXFxEJW46ICVtLCUqW15cIl1cIiVmXCIlKlxcRCVsOiAlbSwlZiglbCkgOiAlbSwlKlteIF0gJWYgJWw6ICVtLCVmOiVsOiVjOiVtLCVmKCVsKTolbSwlZjolbDolbSwlZnwlbHwgJW0iCiAjIGVsc2UKICMgIGlmIGRlZmluZWQoX19FTVhfXykJLyogcHV0IG1vc3QgY29tbW9uIGhlcmUgKGkuZS4gZ2NjIGZvcm1hdCkgYXQgZnJvbnQgKi8KQEAgLTM4NiwxMCArMzg2LDYgQEAKICNpZmRlZiBGRUFUX0JST1dTRQogRVhURVJOIGNoYXJfdQkqcF9ic2RpcjsJLyogJ2Jyb3dzZWRpcicgKi8KICNlbmRpZgotI2lmZGVmIE1TRE9TCi1FWFRFUk4gaW50CXBfYmlvc2s7CS8qICdiaW9za2V5JyAqLwotRVhURVJOIGludAlwX2NvbnNrOwkvKiAnY29uc2tleScgKi8KLSNlbmRpZgogI2lmZGVmIEZFQVRfTElORUJSRUFLCiBFWFRFUk4gY2hhcl91CSpwX2JyZWFrYXQ7CS8qICdicmVha2F0JyAqLwogI2VuZGlmCkBAIC02NzEsNyArNjY3LDcgQEAKICNpZmRlZiBGRUFUX01aU0NIRU1FCiBFWFRFUk4gbG9uZwlwX216cTsJCS8qICdtenF1YW50dW0gKi8KICNlbmRpZgotI2lmIGRlZmluZWQoTVNET1MpIHx8IGRlZmluZWQoTVNXSU4pCisjaWYgZGVmaW5lZChNU1dJTikKIEVYVEVSTiBpbnQJcF9vZGV2OwkJLyogJ29wZW5kZXZpY2UnICovCiAjZW5kaWYKIEVYVEVSTiBjaGFyX3UJKnBfb3BmdW5jOwkvKiAnb3BlcmF0b3JmdW5jJyAqLwpAQCAtMTA3NCw5ICsxMDcwLDcgQEAKICNpZmRlZiBGRUFUX1NNQVJUSU5ERU5UCiAgICAgLCBCVl9TSQogI2VuZGlmCi0jaWZuZGVmIFNIT1JUX0ZOQU1FCiAgICAgLCBCVl9TTgotI2VuZGlmCiAjaWZkZWYgRkVBVF9TWU5fSEwKICAgICAsIEJWX1NNQwogICAgICwgQlZfU1lOCmRpZmYgLS1naXQgYS9zcmMvb3NfbXNkb3MuYyBiL3NyYy9vc19tc2Rvcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTk2ZTM0Li4wMDAwMDAwCi0tLSBhL3NyYy9vc19tc2Rvcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMzA4NiArMCwwIEBACi0vKiB2aTpzZXQgdHM9OCBzdHM9NCBzdz00OgotICoKLSAqIFZJTSAtIFZpIElNcHJvdmVkCWJ5IEJyYW0gTW9vbGVuYWFyCi0gKgotICogRG8gIjpoZWxwIHVnYW5kYSIgIGluIFZpbSB0byByZWFkIGNvcHlpbmcgYW5kIHVzYWdlIGNvbmRpdGlvbnMuCi0gKiBEbyAiOmhlbHAgY3JlZGl0cyIgaW4gVmltIHRvIHNlZSBhIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZC4KLSAqIFNlZSBSRUFETUUudHh0IGZvciBhbiBvdmVydmlldyBvZiB0aGUgVmltIHNvdXJjZSBjb2RlLgotICovCi0KLS8qCi0gKiBvc19tc2Rvcy5jCi0gKgotICogTVNET1Mgc3lzdGVtLWRlcGVuZGVudCByb3V0aW5lcy4KLSAqIEEgY2hlYXAgcGxhc3RpYyBpbWl0YXRpb24gb2YgdGhlIGFtaWdhIGRlcGVuZGVudCBjb2RlLgotICogQSBsb3QgaW4gdGhpcyBmaWxlIHdhcyBtYWRlIGJ5IEp1ZXJnZW4gV2VpZ2VydCAoancpLgotICoKLSAqIERKR1BQIGNoYW5nZXMgYnkgR2VydCB2YW4gQW50d2VycGVuCi0gKiBGYXN0ZXIgdGV4dCBzY3JlZW5zIGJ5IEpvaG4gTGFuZ2UgKGpsYW5nZUB6aWxrZXIubmV0KQotICogV2luZG93cyBjbGlwYm9hcmQgZnVuY3Rpb25hbGl0eSBhZGRlZCBieSBEYXZpZCBLb3RjaGFuIChkaykKLSAqCi0gKiBTb21lIGZ1bmN0aW9ucyBhcmUgYWxzbyB1c2VkIGZvciBXaW4xNiAoTVMtV2luZG93cyAzLjEpLgotICovCi0KLSNpbmNsdWRlICJ2aW0uaCIKLQotLyogY3Byb3RvIGZhaWxzIG9uIG1pc3NpbmcgaW5jbHVkZSBmaWxlcyAqLwotI2lmbmRlZiBQUk9UTwotIyBpbmNsdWRlIDxjb25pby5oPgotI2VuZGlmCi0KLSNpZm5kZWYgUFJPVE8KLSMgaW5jbHVkZSA8Ymlvcy5oPgotIyBpZmRlZiBESkdQUAotIyAgaW5jbHVkZSA8ZHBtaS5oPgotIyAgaW5jbHVkZSA8c2lnbmFsLmg+Ci0jICBpbmNsdWRlIDxzeXMvbW92ZWRhdGEuaD4KLSMgIGluY2x1ZGUgPGNydDAuaD4KLSMgIGlmZGVmIEZFQVRfQ0xJUEJPQVJECi0jICAgaW5jbHVkZSA8c3lzL3NlZ21lbnRzLmg+Ci0jICBlbmRpZgotIyBlbHNlCi0jICBpbmNsdWRlIDxhbGxvYy5oPgotIyBlbmRpZgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKERKR1BQKSB8fCBkZWZpbmVkKFBST1RPKQotIyBkZWZpbmUgX2NkZWNsCSAgICAvKiBESkdQUCBkb2Vzbid0IGhhdmUgdGhpcyAqLwotI2VuZGlmCi0KLXN0YXRpYyBpbnQgY2Jya19wcmVzc2VkID0gRkFMU0U7ICAgIC8qIHNldCBieSBjdHJsLWJyZWFrIGludGVycnVwdCAqLwotc3RhdGljIGludCBjdHJsY19wcmVzc2VkID0gRkFMU0U7ICAgLyogc2V0IHdoZW4gY3RybC1DIG9yIGN0cmwtYnJlYWsgZGV0ZWN0ZWQgKi8KLXN0YXRpYyBpbnQgZGVsYXllZF9yZWRyYXcgPSBGQUxTRTsgIC8qIHNldCB3aGVuIGN0cmwtQyBkZXRlY3RlZCAqLwotCi1zdGF0aWMgaW50IGJpb3NrZXlfcmVhZCA9IF9OS0VZQlJEX1JFQUQ7ICAgLyogYmlvc2tleSgpIGFyZ3VtZW50OiByZWFkIGtleSAqLwotc3RhdGljIGludCBiaW9za2V5X3JlYWR5ID0gX05LRVlCUkRfUkVBRFk7IC8qIGJpb3NrZXkoKSBhcmd1bWVudDoga2V5IHJlYWR5PyAqLwotCi0jaWZkZWYgRkVBVF9NT1VTRQotc3RhdGljIGludCBtb3VzZV9hdmFpbCA9IEZBTFNFOwkJLyogbW91c2UgcHJlc2VudCAqLwotc3RhdGljIGludCBtb3VzZV9hY3RpdmU7CQkvKiBtb3VzZSBlbmFibGVkICovCi1zdGF0aWMgaW50IG1vdXNlX2hpZGRlbjsJCS8qIG1vdXNlIG5vdCBzaG93biAqLwotc3RhdGljIGludCBtb3VzZV9jbGljayA9IC0xOwkJLyogbW91c2Ugc3RhdHVzICovCi1zdGF0aWMgaW50IG1vdXNlX2xhc3RfY2xpY2sgPSAtMTsJLyogcHJldmlvdXMgc3RhdHVzIGF0IGNsaWNrICovCi1zdGF0aWMgaW50IG1vdXNlX3ggPSAtMTsJCS8qIG1vdXNlIHggY29vcmRpbmF0ZSAqLwotc3RhdGljIGludCBtb3VzZV95ID0gLTE7CQkvKiBtb3VzZSB5IGNvb3JkaW5hdGUgKi8KLXN0YXRpYyBsb25nIG1vdXNlX2NsaWNrX3RpbWUgPSAwOwkvKiBiaW9zdGltZSgpIG9mIGxhc3QgY2xpY2sgKi8KLXN0YXRpYyBpbnQgbW91c2VfY2xpY2tfY291bnQgPSAwOwkvKiBjb3VudCBmb3IgbXVsdGktY2xpY2tzICovCi1zdGF0aWMgaW50IG1vdXNlX2NsaWNrX3ggPSAwOwkJLyogeCBvZiBwcmV2aW91cyBtb3VzZSBjbGljayAqLwotc3RhdGljIGludCBtb3VzZV9jbGlja195ID0gMDsJCS8qIHkgb2YgcHJldmlvdXMgbW91c2UgY2xpY2sgKi8KLXN0YXRpYyBsaW5lbnJfVCBtb3VzZV90b3BsaW5lID0gMDsJLyogd190b3BsaW5lIGF0IHByZXZpb3VzIG1vdXNlIGNsaWNrICovCi0jaWZkZWYgRkVBVF9ESUZGCi1zdGF0aWMgaW50IG1vdXNlX3RvcGZpbGwgPSAwOwkJLyogd190b3BmaWxsIGF0IHByZXZpb3VzIG1vdXNlIGNsaWNrICovCi0jZW5kaWYKLXN0YXRpYyBpbnQgbW91c2VfeF9kaXYgPSA4OwkJLyogY29sdW1uID0geCBjb29yZCAvIG1vdXNlX3hfZGl2ICovCi1zdGF0aWMgaW50IG1vdXNlX3lfZGl2ID0gODsJCS8qIGxpbmUgICA9IHkgY29vcmQgLyBtb3VzZV95X2RpdiAqLwotI2VuZGlmCi0KLSNkZWZpbmUgQklPU1RJQ0sgICAgNTUJCQkvKiBiaW9zdGltZSgpIGluY3JlYXNlcyBvbmUgdGljayBhYm91dAotCQkJCQkgICBldmVyeSA1NSBtc2VjICovCi0KLXN0YXRpYyBpbnQgb3JpZ19hdHRyID0gMHgwNzAwOwkJLyogdmlkZW8gYXR0cmlidXRlcyB3aGVuIHN0YXJ0aW5nICovCi0KLXN0YXRpYyBpbnQgU19pTGVmdCA9IDA7CQkJLyogU2Nyb2xsIHdpbmRvdzsgdGhlc2UgYXJlIDEgb2Zmc2V0ICovCi1zdGF0aWMgaW50IFNfaVRvcCA9IDA7Ci1zdGF0aWMgaW50IFNfaVJpZ2h0ID0gMDsKLXN0YXRpYyBpbnQgU19pQm90dG9tID0gMDsKLQotLyoKLSAqIE5lZWQgdG8gcmVtZW1iZXIgdGhlIHZhbHVlcywgYmVjYXVzZSB3ZSBzZXQgaG9yaXpvbnRhbCBhbmQgdmVydGljYWwKLSAqIGVkZ2VzIHNlcGFyYXRlbHkuCi0gKi8KLSAgICBzdGF0aWMgdm9pZAotbXl3aW5kb3coaW50IGlMZWZ0LCBpbnQgaVRvcCwgaW50IGlSaWdodCwgaW50IGlCb3R0b20pCi17Ci0gICAgU19pTGVmdCA9IGlMZWZ0OwotICAgIFNfaVRvcCA9IGlUb3A7Ci0gICAgU19pUmlnaHQgPSBpUmlnaHQ7Ci0gICAgU19pQm90dG9tID0gaUJvdHRvbTsKLSAgICB3aW5kb3coaUxlZnQsIGlUb3AsIGlSaWdodCwgaUJvdHRvbSk7Ci19Ci0KLSNpZmRlZiBESkdQUAotLyoKLSAqIEZvciBESkdQUCwgdXNlIG91ciBvd24gZnVuY3Rpb25zIGZvciBmYXN0IHRleHQgc2NyZWVucy4gIEpNTCAxLzE4Lzk4Ci0gKi8KLQotdW5zaWduZWQgbG9uZwlTX3VsU2NyZWVuQmFzZSA9IDB4YjgwMDA7Ci11bnNpZ25lZCBzaG9ydAlTX3VpQXR0cmlidXRlID0gMDsKLWludAkJU19pQ3VycmVudFJvdyA9IDA7CS8qIFRoZXNlIGFyZSAwIG9mZnNldCAqLwotaW50CQlTX2lDdXJyZW50Q29sdW1uID0gMDsKLXNob3J0CQlTX3NlbFZpZGVvOwkvKiBTZWxlY3RvciBmb3IgREpHUFAgZGlyZWN0IHZpZGVvIHRyYW5zZmVycyAqLwotCi0vKgotICogVXNlIGJ1cnN0IHdyaXRlcyB0byBpbXByb3ZlIG1jaF93cml0ZSBzcGVlZCAtIFZKTiAwMS8xMC85OQotICovCi11bnNpZ25lZCBzaG9ydAlTX2xpbmVidWZmZXJbODAwMF07IC8qIDxWTj4gZW5vdWdoIGZvciAxNjB4NTAgKi8KLXVuc2lnbmVkIHNob3J0CVNfYmxhbmtidWZmZXJbMjU2XTsgLyogPFZOPiBtYXggbGVuZ3RoIG9mIGNvbnNvbGUgbGluZSAqLwotdW5zaWduZWQgc2hvcnQJKlNfbGluZWJ1ZmZlcnBvcyA9IFNfbGluZWJ1ZmZlcjsKLWludAkJU19pQnVmZmVyUm93OwotaW50CQlTX2lCdWZmZXJDb2x1bW47Ci0KLSAgICBzdGF0aWMgdm9pZAotbXlmbHVzaCh2b2lkKQotewotICAgIGlmIChTX2xpbmVidWZmZXJwb3MgIT0gU19saW5lYnVmZmVyKQotICAgIHsKLQlfZG9zbWVtcHV0dyhTX2xpbmVidWZmZXIsIChTX2xpbmVidWZmZXJwb3MgLSBTX2xpbmVidWZmZXIpLAotCQlTX3VsU2NyZWVuQmFzZQotCQkgICAgICArIFNfaUJ1ZmZlclJvdyAqIChDb2x1bW5zIDw8IDEpICsgKFNfaUJ1ZmZlckNvbHVtbiA8PCAxKSk7Ci0JU19saW5lYnVmZmVycG9zID0gU19saW5lYnVmZmVyOwotICAgIH0KLX0KLQotICAgIHN0YXRpYyB2b2lkCi1teWdvdG94eShpbnQgeCwgaW50IHkpCi17Ci0gICAgU19pQ3VycmVudFJvdyA9IHkgLSAxOwotICAgIFNfaUN1cnJlbnRDb2x1bW4gPSB4IC0gMTsKLX0KLQotLyoKLSAqIFNldCB0aGUgc3lzdGVtIGN1cnNvciB0byBvdXIgY3Vyc29yIHBvc2l0aW9uLgotICovCi0gICAgc3RhdGljIHZvaWQKLXNldF9zeXNfY3Vyc29yKHZvaWQpCi17Ci0gICAgaWYgKHRlcm1fY29uc29sZSAmJiBmdWxsX3NjcmVlbikKLSAgICB7Ci0JbXlmbHVzaCgpOwotCWdvdG94eShTX2lDdXJyZW50Q29sdW1uICsgMSwgU19pQ3VycmVudFJvdyArIDEpOwotICAgIH0KLX0KLQotICAgIHN0YXRpYyB2b2lkCi1zZXRibGFua2J1ZmZlcih1bnNpZ25lZCBzaG9ydCB1aVZhbHVlKQotewotICAgIGludAkJCQlpOwotICAgIHN0YXRpYyB1bnNpZ25lZCBzaG9ydAlvbGR1aVZhbHVlID0gMDsKLQotICAgIGlmIChvbGR1aVZhbHVlICE9IHVpVmFsdWUpCi0gICAgewotCS8qIExvYWQgYmxhbmsgbGluZSBidWZmZXIgd2l0aCBzcGFjZXMgKi8KLQlmb3IgKGkgPSAwOyBpIDwgQ29sdW1uczsgKytpKQotCSAgICBTX2JsYW5rYnVmZmVyW2ldID0gdWlWYWx1ZTsKLQlvbGR1aVZhbHVlID0gdWlWYWx1ZTsKLSAgICB9Ci19Ci0KLSAgICBzdGF0aWMgdm9pZAotbXljbHJlb2wodm9pZCkKLXsKLSAgICAvKiBDbGVhciB0byBlbmQgb2YgbGluZSAqLwotICAgIHNldGJsYW5rYnVmZmVyKFNfdWlBdHRyaWJ1dGUgfCAnICcpOwotICAgIF9kb3NtZW1wdXR3KFNfYmxhbmtidWZmZXIsIFNfaVJpZ2h0IC0gU19pQ3VycmVudENvbHVtbiwgU191bFNjcmVlbkJhc2UKLQkJCSArIChTX2lDdXJyZW50Um93KSAqIChDb2x1bW5zIDw8IDEpCi0JCQkgKyAoU19pQ3VycmVudENvbHVtbiA8PCAxKSk7Ci19Ci0KLSAgICBzdGF0aWMgdm9pZAotbXljbHJzY3Iodm9pZCkKLXsKLSAgICAvKiBDbGVhciB3aG9sZSBzY3JlZW4gKi8KLSAgICBzaG9ydAlpQ29sdW1uOwotICAgIGludAkJZW5kcG9pbnQgPSAoUm93cyAqIENvbHVtbnMpIDw8IDE7Ci0KLSAgICBzZXRibGFua2J1ZmZlcihTX3VpQXR0cmlidXRlIHwgJyAnKTsKLQotICAgIGZvciAoaUNvbHVtbiA9IDA7IGlDb2x1bW4gPCBlbmRwb2ludDsgaUNvbHVtbiArPSAoQ29sdW1ucyA8PCAxKSkKLQlfZG9zbWVtcHV0dyhTX2JsYW5rYnVmZmVyLCBDb2x1bW5zLCBTX3VsU2NyZWVuQmFzZSArIGlDb2x1bW4pOwotfQotCi0gICAgc3RhdGljIHZvaWQKLW15ZGVsbGluZSh2b2lkKQotewotICAgIHNob3J0IGlSb3csIGlDb2x1bW47Ci0KLSAgICBpQ29sdW1uID0gKFNfaUxlZnQgLSAxKSA8PCAxOwotCi0gICAgLyogQ29weSB0aGUgbGluZXMgdW5kZXJuZWF0aCAqLwotICAgIGZvciAoaVJvdyA9IFNfaUN1cnJlbnRSb3c7IGlSb3cgPCBTX2lCb3R0b20gLSAxOyBpUm93KyspCi0JbW92ZWRhdGEoU19zZWxWaWRlbywgKCgoaVJvdyArIDEpICogQ29sdW1ucykgPDwgMSkgKyBpQ29sdW1uLAotCQlTX3NlbFZpZGVvLCAoKGlSb3cgKiBDb2x1bW5zKSA8PCAxKSArIGlDb2x1bW4sCi0JCShTX2lSaWdodCAtIFNfaUxlZnQgKyAxKSA8PCAxKTsKLQotICAgIC8qIENsZWFyIHRoZSBuZXcgcm93ICovCi0gICAgc2V0YmxhbmtidWZmZXIoU191aUF0dHJpYnV0ZSB8ICcgJyk7Ci0KLSAgICBfZG9zbWVtcHV0dyhTX2JsYW5rYnVmZmVyLCAoU19pUmlnaHQgLSBTX2lMZWZ0KSArIDEsIFNfdWxTY3JlZW5CYXNlCi0JCQkgKyAoU19pQm90dG9tIC0gMSkgKiAoQ29sdW1ucyA8PCAxKSArIGlDb2x1bW4pOwotfQotCi0gICAgc3RhdGljIHZvaWQKLW15aW5zbGluZSh2b2lkKQotewotICAgIHNob3J0IGlSb3csIGlDb2x1bW47Ci0KLSAgICBpQ29sdW1uID0gKFNfaUxlZnQgLSAxKSA8PCAxOwotCi0gICAgLyogQ29weSB0aGUgbGluZXMgdW5kZXJuZWF0aCAqLwotICAgIGZvciAoaVJvdyA9IFNfaUJvdHRvbSAtIDE7IGlSb3cgPj0gU19pVG9wOyBpUm93LS0pCi0JbW92ZWRhdGEoU19zZWxWaWRlbywgKCgoaVJvdyAtIDEpICogQ29sdW1ucykgPDwgMSkgKyBpQ29sdW1uLAotCQlTX3NlbFZpZGVvLCAoKGlSb3cgKiBDb2x1bW5zKSA8PCAxKSArIGlDb2x1bW4sCi0JCShTX2lSaWdodCAtIFNfaUxlZnQgKyAxKSA8PCAxKTsKLQotICAgIC8qIENsZWFyIHRoZSBuZXcgcm93ICovCi0gICAgc2V0YmxhbmtidWZmZXIoU191aUF0dHJpYnV0ZSB8ICcgJyk7Ci0KLSAgICBfZG9zbWVtcHV0dyhTX2JsYW5rYnVmZmVyLCAoU19pUmlnaHQgLSBTX2lMZWZ0KSArIDEsIFNfdWxTY3JlZW5CYXNlCi0JCQkgKyAoU19pVG9wIC0gMSkgKiAoQ29sdW1ucyA8PCAxKSArIGlDb2x1bW4pOwotfQotCi0vKgotICogU2Nyb2xsIHRoZSBzY3JlZW4gb25lIGxpbmUgdXAsIGNsZWFyIHRoZSBsYXN0IGxpbmUuCi0gKi8KLSAgICBzdGF0aWMgdm9pZAotbXlzY3JvbGwodm9pZCkKLXsKLSAgICBzaG9ydAkJaVJvdywgaUNvbHVtbjsKLQotICAgIGlDb2x1bW4gPSAoU19pTGVmdCAtIDEpIDw8IDE7Ci0KLSAgICAvKiBDb3B5IHRoZSBzY3JlZW4gKi8KLSAgICBmb3IgKGlSb3cgPSBTX2lUb3A7IGlSb3cgPCBTX2lCb3R0b207IGlSb3crKykKLQltb3ZlZGF0YShTX3NlbFZpZGVvLCAoKGlSb3cgKiBDb2x1bW5zKSA8PCAxKSArIGlDb2x1bW4sCi0JCVNfc2VsVmlkZW8sICgoKGlSb3cgLSAxKSAqIENvbHVtbnMpIDw8IDEpICsgaUNvbHVtbiwKLQkJKFNfaVJpZ2h0IC0gU19pTGVmdCArIDEpIDw8IDEpOwotCi0gICAgLyogQ2xlYXIgdGhlIGJvdHRvbSByb3cgKi8KLSAgICBzZXRibGFua2J1ZmZlcihTX3VpQXR0cmlidXRlIHwgJyAnKTsKLQotICAgIF9kb3NtZW1wdXR3KFNfYmxhbmtidWZmZXIsIChTX2lSaWdodCAtIFNfaUxlZnQpICsgMSwgU191bFNjcmVlbkJhc2UKLQkJCSArIChTX2lCb3R0b20gLSAxKSAqIChDb2x1bW5zIDw8IDEpICsgaUNvbHVtbik7Ci19Ci0KLSAgICBzdGF0aWMgaW50Ci1teXB1dGNoKGludCBpQ2hhcikKLXsKLSAgICB1bnNpZ25lZCBzaG9ydCB1aVZhbHVlOwotCi0gICAgaWYgKGlDaGFyID09ICdcbicpCi0gICAgewotCW15Zmx1c2goKTsKLQlpZiAoU19pQ3VycmVudFJvdyA+PSBTX2lCb3R0b20gLSBTX2lUb3ApCi0JICAgIG15c2Nyb2xsKCk7Ci0JZWxzZQotCXsKLQkgICAgU19pQ3VycmVudENvbHVtbiA9IFNfaUxlZnQgLSAxOwotCSAgICBTX2lDdXJyZW50Um93Kys7Ci0JfQotICAgIH0KLSAgICBlbHNlIGlmIChpQ2hhciA9PSAnXHInKQotICAgIHsKLQlteWZsdXNoKCk7Ci0JU19pQ3VycmVudENvbHVtbiA9IFNfaUxlZnQgLSAxOwotICAgIH0KLSAgICBlbHNlIGlmIChpQ2hhciA9PSAnXGInKQotICAgIHsKLQlteWZsdXNoKCk7Ci0JaWYgKFNfaUN1cnJlbnRDb2x1bW4gPj0gU19pTGVmdCkKLQkgICAgU19pQ3VycmVudENvbHVtbi0tOwotICAgIH0KLSAgICBlbHNlIGlmIChpQ2hhciA9PSA3KQotICAgIHsKLQlzb3VuZCg0NDApOwkvKiBzaG9ydCBiZWVwICovCi0JZGVsYXkoMjAwKTsKLQlub3NvdW5kKCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0JdWlWYWx1ZSA9IFNfdWlBdHRyaWJ1dGUgfCAodW5zaWduZWQgY2hhcilpQ2hhcjsKLQotCS8qCi0JICogTm9ybWFsIGNoYXIgLSBhcmUgd2Ugc3RhcnRpbmcgdG8gYnVmZmVyPwotCSAqLwotCWlmIChTX2xpbmVidWZmZXJwb3MgPT0gU19saW5lYnVmZmVyKQotCXsKLQkgICAgU19pQnVmZmVyQ29sdW1uID0gU19pQ3VycmVudENvbHVtbjsKLQkgICAgU19pQnVmZmVyUm93ID0gU19pQ3VycmVudFJvdzsKLQl9Ci0KLQkqU19saW5lYnVmZmVycG9zKysgPSB1aVZhbHVlOwotCi0JU19pQ3VycmVudENvbHVtbisrOwotCWlmIChTX2lDdXJyZW50Q29sdW1uID49IFNfaVJpZ2h0ICYmIFNfaUN1cnJlbnRSb3cgPj0gU19pQm90dG9tIC0gU19pVG9wKQotCXsKLQkgICAgbXlmbHVzaCgpOwotCSAgICBteXNjcm9sbCgpOwotCSAgICBTX2lDdXJyZW50Q29sdW1uID0gU19pTGVmdCAtIDE7Ci0JICAgIFNfaUN1cnJlbnRSb3crKzsKLQl9Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLSAgICBzdGF0aWMgdm9pZAotbXl0ZXh0aW5pdChzdHJ1Y3QgdGV4dF9pbmZvICpwVGV4dGluZm8pCi17Ci0gICAgU19zZWxWaWRlbyA9IF9fZHBtaV9zZWdtZW50X3RvX2Rlc2NyaXB0b3IoU191bFNjcmVlbkJhc2UgPj4gNCk7Ci0gICAgU191aUF0dHJpYnV0ZSA9IHBUZXh0aW5mby0+bm9ybWF0dHIgPDwgODsKLX0KLQotICAgIHN0YXRpYyB2b2lkCi1nZXRfc2NyZWVuYmFzZSh2b2lkKQotewotICAgIHN0YXRpYyB1bmlvbiBSRUdTCSAgICByZWdzOwotCi0gICAgLyogb2xkIEhlcmN1bGVzIGdyYWZpYyBjYXJkIGhhcyBkaWZmZXJlbnQgYmFzZSBhZGRyZXNzIChNYWNld2ljeikgKi8KLSAgICByZWdzLmguYWggPSAweDBmOwotICAgICh2b2lkKWludDg2KDB4MTAsICZyZWdzLCAmcmVncyk7CS8qIGludCAxMCAwZiAqLwotICAgIGlmIChyZWdzLmguYWwgPT0gMHgwNykJCS8qIHZpZGVvIG1vZGUgNyAtLSBoZXJjdWxlcyBtb25vICovCi0JU191bFNjcmVlbkJhc2UgPSAweGIwMDAwOwotICAgIGVsc2UKLQlTX3VsU2NyZWVuQmFzZSA9IDB4YjgwMDA7Ci19Ci0KLSAgICBzdGF0aWMgdm9pZAotbXl0ZXh0YXR0cihpbnQgaUF0dHJpYnV0ZSkKLXsKLSAgICBTX3VpQXR0cmlidXRlID0gKHVuc2lnbmVkIHNob3J0KWlBdHRyaWJ1dGUgPDwgODsKLX0KLQotICAgIHN0YXRpYyB2b2lkCi1teW5vcm12aWRlbyh2b2lkKQotewotICAgIG15dGV4dGF0dHIob3JpZ19hdHRyKTsKLX0KLQotICAgIHN0YXRpYyB2b2lkCi1teXRleHRjb2xvcihpbnQgaVRleHRDb2xvcikKLXsKLSAgICBTX3VpQXR0cmlidXRlID0gKHVuc2lnbmVkIHNob3J0KSgoU191aUF0dHJpYnV0ZSAmIDB4ZjAwMCkKLQkJCQkJICAgfCAodW5zaWduZWQgc2hvcnQpaVRleHRDb2xvciA8PCA4KTsKLX0KLQotICAgIHN0YXRpYyB2b2lkCi1teXRleHRiYWNrZ3JvdW5kKGludCBpQmtnQ29sb3IpCi17Ci0gICAgU191aUF0dHJpYnV0ZSA9ICh1bnNpZ25lZCBzaG9ydCkoKFNfdWlBdHRyaWJ1dGUgJiAweDBmMDApCi0JCQkJCSB8ICh1bnNpZ25lZCBzaG9ydCkoaUJrZ0NvbG9yIDw8IDEyKSk7Ci19Ci0vKgotICogR2V0ZGlnaXRzOiBHZXQgYSBudW1iZXIgZnJvbSBhIHN0cmluZyBhbmQgc2tpcCBvdmVyIGl0LgotICogTm90ZTogdGhlIGFyZ3VtZW50IGlzIGEgcG9pbnRlciB0byBhIGNoYXJfdSBwb2ludGVyIQotICovCi0KLSAgICBzdGF0aWMgbG9uZwotbXlnZXRkaWdpdHMoY2hhcl91ICoqcHApCi17Ci0gICAgY2hhcl91CSpwOwotICAgIGxvbmcJcmV0dmFsID0gMDsKLQotICAgIHAgPSAqcHA7Ci0gICAgaWYgKCpwID09ICctJykJCS8qIHNraXAgbmVnYXRpdmUgc2lnbiAqLwotCSsrcDsKLSAgICB3aGlsZSAoVklNX0lTRElHSVQoKnApKQotICAgIHsKLQlyZXR2YWwgPSAocmV0dmFsICogMTApICsgKCpwIC0gJzAnKTsKLQkrK3A7Ci0gICAgfQotICAgIGlmICgqKnBwID09ICctJykJCS8qIHByb2Nlc3MgbmVnYXRpdmUgc2lnbiAqLwotCXJldHZhbCA9IC1yZXR2YWw7Ci0KLSAgICAqcHAgPSBwOwotICAgIHJldHVybiByZXR2YWw7Ci19Ci0jZWxzZQotIyBkZWZpbmUgbXlnb3RveHkgZ290b3h5Ci0jIGRlZmluZSBteXB1dGNoIHB1dGNoCi0jIGRlZmluZSBteXNjcm9sbCBzY3JvbGwKLSMgZGVmaW5lIG15bm9ybXZpZGVvIG5vcm12aWRlbwotIyBkZWZpbmUgbXl0ZXh0YXR0ciB0ZXh0YXR0cgotIyBkZWZpbmUgbXl0ZXh0Y29sb3IgdGV4dGNvbG9yCi0jIGRlZmluZSBteXRleHRiYWNrZ3JvdW5kIHRleHRiYWNrZ3JvdW5kCi0jIGRlZmluZSBteWdldGRpZ2l0cyBnZXRkaWdpdHMKLSMgZGVmaW5lIG15Y2xyZW9sIGNscmVvbAotIyBkZWZpbmUgbXljbHJzY3IgY2xyc2NyCi0jIGRlZmluZSBteWluc2xpbmUgaW5zbGluZQotIyBkZWZpbmUgbXlkZWxsaW5lIGRlbGxpbmUKLSNlbmRpZgotCi1zdGF0aWMgY29uc3Qgc3RydWN0Ci17Ci0gICAgY2hhcl91CXNjYW5jb2RlOwotICAgIGNoYXJfdQltZXRha2V5OwotfSBhbHRrZXlfdGFibGVbXSA9Ci17Ci0gICAgezB4MWUsIDB4ZTF9LCAvKiBhICovCi0gICAgezB4MzAsIDB4ZTJ9LCAvKiBiICovCi0gICAgezB4MmUsIDB4ZTN9LCAvKiBjICovCi0gICAgezB4MjAsIDB4ZTR9LCAvKiBkICovCi0gICAgezB4MTIsIDB4ZTV9LCAvKiBlICovCi0gICAgezB4MjEsIDB4ZTZ9LCAvKiBmICovCi0gICAgezB4MjIsIDB4ZTd9LCAvKiBnICovCi0gICAgezB4MjMsIDB4ZTh9LCAvKiBoICovCi0gICAgezB4MTcsIDB4ZTl9LCAvKiBpICovCi0gICAgezB4MjQsIDB4ZWF9LCAvKiBqICovCi0gICAgezB4MjUsIDB4ZWJ9LCAvKiBrICovCi0gICAgezB4MjYsIDB4ZWN9LCAvKiBsICovCi0gICAgezB4MzIsIDB4ZWR9LCAvKiBtICovCi0gICAgezB4MzEsIDB4ZWV9LCAvKiBuICovCi0gICAgezB4MTgsIDB4ZWZ9LCAvKiBvICovCi0gICAgezB4MTksIDB4ZjB9LCAvKiBwICovCi0gICAgezB4MTAsIDB4ZjF9LCAvKiBxICovCi0gICAgezB4MTMsIDB4ZjJ9LCAvKiByICovCi0gICAgezB4MWYsIDB4ZjN9LCAvKiBzICovCi0gICAgezB4MTQsIDB4ZjR9LCAvKiB0ICovCi0gICAgezB4MTYsIDB4ZjV9LCAvKiB1ICovCi0gICAgezB4MmYsIDB4ZjZ9LCAvKiB2ICovCi0gICAgezB4MTEsIDB4Zjd9LCAvKiB3ICovCi0gICAgezB4MmQsIDB4Zjh9LCAvKiB4ICovCi0gICAgezB4MTUsIDB4Zjl9LCAvKiB5ICovCi0gICAgezB4MmMsIDB4ZmF9LCAvKiB6ICovCi0gICAgezB4NzgsIDB4YjF9LCAvKiAxICovCi0gICAgezB4NzksIDB4YjJ9LCAvKiAyICovCi0gICAgezB4N2EsIDB4YjN9LCAvKiAzICovCi0gICAgezB4N2IsIDB4YjR9LCAvKiA0ICovCi0gICAgezB4N2MsIDB4YjV9LCAvKiA1ICovCi0gICAgezB4N2QsIDB4YjZ9LCAvKiA2ICovCi0gICAgezB4N2UsIDB4Yjd9LCAvKiA3ICovCi0gICAgezB4N2YsIDB4Yjh9LCAvKiA4ICovCi0gICAgezB4ODAsIDB4Yjl9LCAvKiA5ICovCi0gICAgezB4ODEsIDB4YjB9LCAvKiAwICovCi19OwotCi0vKgotICogVHJhbnNsYXRlIGV4dGVuZGVkIGtleWNvZGVzIGludG8gbWV0YS1jaGFycyB3aGVyZSBhcHBsaWNhYmxlCi0gKi8KLSAgICBzdGF0aWMgaW50Ci10cmFuc2xhdGVfYWx0a2V5cyhpbnQgcmF3a2V5KQotewotICAgIGludCBpLCBjOwotCi0gICAgaWYgKChyYXdrZXkgJiAweGZmKSA9PSAwKQotICAgIHsKLQljID0gKHJhd2tleSA+PiA4KTsKLQlmb3IgKGkgPSBzaXplb2YoYWx0a2V5X3RhYmxlKSAvIHNpemVvZihhbHRrZXlfdGFibGVbMF0pOyAtLWkgPj0gMDsgKQotCXsKLQkgICAgaWYgKGMgPT0gYWx0a2V5X3RhYmxlW2ldLnNjYW5jb2RlKQotCQlyZXR1cm4gKGludClhbHRrZXlfdGFibGVbaV0ubWV0YWtleTsKLQl9Ci0gICAgfQotICAgIHJldHVybiByYXdrZXk7Ci19Ci0KLS8qCi0gKiBTZXQgbm9ybWFsIGZnL2JnIGNvbG9yLCBiYXNlZCBvbiBUX01FLiAgQ2FsbGVkIHdoZW4gdF9tZSBoYXMgYmVlbiBzZXQuCi0gKi8KLSAgICB2b2lkCi1tY2hfc2V0X25vcm1hbF9jb2xvcnModm9pZCkKLXsKLSAgICBjaGFyX3UJKnA7Ci0gICAgaW50CQluOwotCi0gICAgY3Rlcm1fbm9ybWFsX2ZnX2NvbG9yID0gKG9yaWdfYXR0ciAmIDB4ZikgKyAxOwotICAgIGN0ZXJtX25vcm1hbF9iZ19jb2xvciA9ICgob3JpZ19hdHRyID4+IDQpICYgMHhmKSArIDE7Ci0gICAgaWYgKFRfTUVbMF0gPT0gRVNDICYmIFRfTUVbMV0gPT0gJ3wnKQotICAgIHsKLQlwID0gVF9NRSArIDI7Ci0JbiA9IGdldGRpZ2l0cygmcCk7Ci0JaWYgKCpwID09ICdtJyAmJiBuID4gMCkKLQl7Ci0JICAgIGN0ZXJtX25vcm1hbF9mZ19jb2xvciA9IChuICYgMHhmKSArIDE7Ci0JICAgIGN0ZXJtX25vcm1hbF9iZ19jb2xvciA9ICgobiA+PiA0KSAmIDB4ZikgKyAxOwotCX0KLSAgICB9Ci19Ci0KLSNpZiBkZWZpbmVkKE1DSF9DVVJTT1JfU0hBUEUpIHx8IGRlZmluZWQoUFJPVE8pCi0vKgotICogU2F2ZS9yZXN0b3JlIHRoZSBzaGFwZSBvZiB0aGUgY3Vyc29yLgotICogY2FsbCB3aXRoIEZBTFNFIHRvIHNhdmUsIFRSVUUgdG8gcmVzdG9yZQotICovCi0gICAgc3RhdGljIHZvaWQKLW1jaF9yZXN0b3JlX2N1cnNvcl9zaGFwZShpbnQgcmVzdG9yZSkKLXsKLSAgICBzdGF0aWMgdW5pb24gUkVHUwkgICAgcmVnczsKLSAgICBzdGF0aWMgaW50CQkgICAgc2F2ZWQgPSBGQUxTRTsKLQotICAgIGlmIChyZXN0b3JlKQotICAgIHsKLQlpZiAoc2F2ZWQpCi0JICAgIHJlZ3MuaC5haCA9IDB4MDE7CSAgICAvKiBTZXQgQ3Vyc29yICovCi0JZWxzZQotCSAgICByZXR1cm47Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0JcmVncy5oLmFoID0gMHgwMzsJICAgIC8qIEdldCBDdXJzb3IgKi8KLQlyZWdzLmguYmggPSAweDAwOwkgICAgLyogUGFnZSAqLwotCXNhdmVkID0gVFJVRTsKLSAgICB9Ci0KLSAgICAodm9pZClpbnQ4NigweDEwLCAmcmVncywgJnJlZ3MpOwotfQotCi0vKgotICogU2V0IHRoZSBzaGFwZSBvZiB0aGUgY3Vyc29yLgotICogJ3RoaWNrbmVzcycgY2FuIGJlIGZyb20gMCAodGhpbikgdG8gNyAoYmxvY2spCi0gKi8KLSAgICBzdGF0aWMgdm9pZAotbWNoX3NldF9jdXJzb3Jfc2hhcGUoaW50IHRoaWNrbmVzcykKLXsKLSAgICB1bmlvbiBSRUdTCSAgICByZWdzOwotCi0gICAgcmVncy5oLmNoID0gNyAtIHRoaWNrbmVzczsJICAgIC8qIFN0YXJ0aW5nIExpbmUgKi8KLSAgICByZWdzLmguY2wgPSA3OwkJICAgIC8qIEVuZGluZyBMaW5lICovCi0gICAgcmVncy5oLmFoID0gMHgwMTsJCSAgICAvKiBTZXQgQ3Vyc29yICovCi0gICAgKHZvaWQpaW50ODYoMHgxMCwgJnJlZ3MsICZyZWdzKTsKLX0KLQotICAgIHZvaWQKLW1jaF91cGRhdGVfY3Vyc29yKHZvaWQpCi17Ci0gICAgaW50CQlpZHg7Ci0gICAgaW50CQl0aGlja25lc3M7Ci0KLSAgICAvKgotICAgICAqIEhvdyB0aGUgY3Vyc29yIGlzIGRyYXduIGRlcGVuZHMgb24gdGhlIGN1cnJlbnQgbW9kZS4KLSAgICAgKi8KLSAgICBpZHggPSBnZXRfc2hhcGVfaWR4KEZBTFNFKTsKLQotICAgIGlmIChzaGFwZV90YWJsZVtpZHhdLnNoYXBlID09IFNIQVBFX0JMT0NLKQotCXRoaWNrbmVzcyA9IDc7Ci0gICAgZWxzZQotCXRoaWNrbmVzcyA9ICg3ICogc2hhcGVfdGFibGVbaWR4XS5wZXJjZW50YWdlICsgOTApIC8gMTAwOwotICAgIG1jaF9zZXRfY3Vyc29yX3NoYXBlKHRoaWNrbmVzcyk7Ci19Ci0jZW5kaWYKLQotLyoKLSAqIFJldHVybiBhbW91bnQgb2YgbWVtb3J5IGN1cnJlbnRseSBhdmFpbGFibGUgaW4gS2J5dGUuCi0gKi8KLSAgICBsb25nX3UKLW1jaF9hdmFpbF9tZW0oaW50IHNwZWNpYWwpCi17Ci0jaWZkZWYgREpHUFAKLSAgICByZXR1cm4gX2dvMzJfZHBtaV9yZW1haW5pbmdfdmlydHVhbF9tZW1vcnkoKSA+PiAxMDsKLSNlbHNlCi0gICAgcmV0dXJuIGNvcmVsZWZ0KCkgPj4gMTA7Ci0jZW5kaWYKLX0KLQotI2lmZGVmIEZFQVRfTU9VU0UKLQotLyoKLSAqIFNldCBhcmVhIHdoZXJlIG1vdXNlIGNhbiBiZSBtb3ZlZCB0bzogVGhlIHdob2xlIHNjcmVlbi4KLSAqIFJvd3MgYW5kIENvbHVtbnMgbXVzdCBiZSB2YWxpZCB3aGVuIGNhbGxpbmchCi0gKi8KLSAgICBzdGF0aWMgdm9pZAotbW91c2VfYXJlYSh2b2lkKQotewotICAgIHVuaW9uIFJFR1MJICAgIHJlZ3M7Ci0KLSAgICBpZiAobW91c2VfYXZhaWwpCi0gICAgewotCXJlZ3MueC5jeCA9IDA7CS8qIG1vdXNlIHZpc2libGUgYmV0d2VlbiBjeCBhbmQgZHggKi8KLQlyZWdzLnguZHggPSBDb2x1bW5zICogbW91c2VfeF9kaXYgLSAxOwotCXJlZ3MueC5heCA9IDc7Ci0JKHZvaWQpaW50ODYoMHgzMywgJnJlZ3MsICZyZWdzKTsKLQotCXJlZ3MueC5jeCA9IDA7CS8qIG1vdXNlIHZpc2libGUgYmV0d2VlbiBjeCBhbmQgZHggKi8KLQlyZWdzLnguZHggPSBSb3dzICogbW91c2VfeV9kaXYgLSAxOwotCXJlZ3MueC5heCA9IDg7Ci0JKHZvaWQpaW50ODYoMHgzMywgJnJlZ3MsICZyZWdzKTsKLSAgICB9Ci19Ci0KLSAgICBzdGF0aWMgdm9pZAotc2hvd19tb3VzZShpbnQgb24pCi17Ci0gICAgc3RhdGljIGludAkgICAgd2FzX29uID0gRkFMU0U7Ci0gICAgdW5pb24gUkVHUwkgICAgcmVnczsKLQotICAgIGlmIChtb3VzZV9hdmFpbCkKLSAgICB7Ci0JaWYgKCFtb3VzZV9hY3RpdmUgfHwgbW91c2VfaGlkZGVuKQotCSAgICBvbiA9IEZBTFNFOwotCS8qCi0JICogQ2FyZWZ1bDogRWFjaCBzd2l0Y2ggb24gbXVzdCBiZSBjb21wZW5zYXRlZCBieSBleGFjdGx5IG9uZSBzd2l0Y2gKLQkgKiBvZmYKLQkgKi8KLQlpZiAoKG9uICYmICF3YXNfb24pIHx8ICghb24gJiYgd2FzX29uKSkKLQl7Ci0JICAgIHdhc19vbiA9IG9uOwotCSAgICByZWdzLnguYXggPSBvbiA/IDEgOiAyOwotCSAgICBpbnQ4NigweDMzLCAmcmVncywgJnJlZ3MpOwkvKiBzaG93IG1vdXNlICovCi0JICAgIGlmIChvbikKLQkJbW91c2VfYXJlYSgpOwotCX0KLSAgICB9Ci19Ci0KLSNlbmRpZgotCi0vKgotICogVmVyc2lvbiBvZiBrYmhpdCgpIGFuZCBnZXRjaCgpIHRoYXQgdXNlIGRpcmVjdCBjb25zb2xlIEkvTy4KLSAqIFRoaXMgYXZvaWRzIHRyb3VibGUgd2l0aCBDVFJMLVAgYW5kIHRoZSBsaWtlLCBhbmQgc2hvdWxkIHdvcmsgb3ZlciBhIHRlbG5ldAotICogY29ubmVjdGlvbiAoaXQgd29ya3MgZm9yIFh2aSkuCi0gKi8KLQotc3RhdGljIGludCBjb25zX2tleSA9IC0xOwotCi0vKgotICogVHJ5IHRvIGdldCBvbmUgY2hhcmFjdGVyIGRpcmVjdGx5IGZyb20gdGhlIGNvbnNvbGUuCi0gKiBJZiB0aGVyZSBpcyBhIGtleSwgaXQgaXMgc3RvcmVkIGluIGNvbnNfa2V5LgotICogT25seSBjYWxsIHdoZW4gY29uc19rZXkgaXMgLTEhCi0gKi8KLSAgICBzdGF0aWMgdm9pZAotY29uc19nZXRrZXkodm9pZCkKLXsKLSAgICB1bmlvbiBSRUdTIHJlZ3M7Ci0KLSAgICAvKiBjYWxsIERPUyBmdW5jdGlvbiA2OiBEaXJlY3QgY29uc29sZSBJL08gKi8KLSAgICByZWdzLmguYWggPSAweDA2OwotICAgIHJlZ3MuaC5kbCA9IDB4ZmY7Ci0gICAgKHZvaWQpaW50ZG9zKCZyZWdzLCAmcmVncyk7Ci0gICAgaWYgKChyZWdzLnguZmxhZ3MgJiAweDQwKSA9PSAwKQkvKiB6ZXJvIGZsYWcgbm90IHNldD8gKi8KLQljb25zX2tleSA9IChyZWdzLmguYWwgJiAweGZmKTsKLX0KLQotLyoKLSAqIFJldHVybiBUUlVFIGlmIGEgY2hhcmFjdGVyIGlzIGF2YWlsYWJsZS4KLSAqLwotICAgIHN0YXRpYyBpbnQKLWNvbnNfa2JoaXQodm9pZCkKLXsKLSAgICBpZiAoY29uc19rZXkgPCAwKQotCWNvbnNfZ2V0a2V5KCk7Ci0gICAgcmV0dXJuIChjb25zX2tleSA+PSAwKTsKLX0KLQotLyoKLSAqIFJldHVybiBhIGNoYXJhY3RlciBmcm9tIHRoZSBjb25zb2xlLgotICogU2hvdWxkIG9ubHkgYmUgY2FsbGVkIHdoZW4gdmltX2tiaGl0KCkgcmV0dXJucyBUUlVFLgotICovCi0gICAgc3RhdGljIGludAotY29uc19nZXRjaCh2b2lkKQotewotICAgIGludAkgICAgYyA9IC0xOwotCi0gICAgaWYgKGNvbnNfa2V5IDwgMCkKLQljb25zX2dldGtleSgpOwotICAgIGMgPSBjb25zX2tleTsKLSAgICBjb25zX2tleSA9IC0xOwotICAgIHJldHVybiBjOwotfQotCi0KLSNpZmRlZiBESkdQUAotLyoKLSAqIERKR1BQIHByb3ZpZGVzIGEga2JoaXQoKSBmdW5jdGlvbiB0aGF0IGdvZXMgdG8gdGhlIEJJT1MgaW5zdGVhZCBvZiBET1MuCi0gKiBUaGlzIGRvZXNuJ3Qgd29yayBmb3IgdGVybWluYWxzIGNvbm5lY3RlZCB0byBhIHNlcmlhbCBwb3J0LgotICogUmVkZWZpbmUga2JoaXQoKSBoZXJlIHRvIG1ha2UgaXQgd29yay4KLSAqLwotICAgIHN0YXRpYyBpbnQKLXZpbV9rYmhpdCh2b2lkKQotewotICAgIHVuaW9uIFJFR1MgcmVnczsKLQotICAgIHJlZ3MuaC5haCA9IDB4MGI7Ci0gICAgKHZvaWQpaW50ZG9zKCZyZWdzLCAmcmVncyk7Ci0gICAgcmV0dXJuIHJlZ3MuaC5hbDsKLX0KLQotI2lmZGVmIGtiaGl0Ci0jIHVuZGVmIGtiaGl0CSAgICAvKiBtaWdodCBoYXZlIGJlZW4gZGVmaW5lZCBpbiBjb25pby5oICovCi0jZW5kaWYKLSNkZWZpbmUga2JoaXQoKQl2aW1fa2JoaXQoKQotCi0jZW5kaWYKLQotLyoKLSAqIFNpbXVsYXRlIFdhaXRGb3JDaGFyKCkgYnkgc2xvd2x5IHBvbGxpbmcgd2l0aCBiaW9za2V5KDEpIG9yIGtiaGl0KCkuCi0gKgotICogSWYgVmltIHNob3VsZCB3b3JrIG92ZXIgdGhlIHNlcmlhbCBsaW5lIGFmdGVyIGEgJ2N0dHkgY29tMScgd2UgbXVzdCB1c2UKLSAqIGtiaGl0KCkgYW5kIGdldGNoKCkuIChqdykKLSAqIFVzdWFsbHkga2JoaXQoKSBpcyBub3QgdXNlZCwgYmVjYXVzZSB0aGVuIENUUkwtQyBhbmQgQ1RSTC1QCi0gKiB3aWxsIGJlIGNhdWdodCBieSBET1MgKG1vb2wpLgotICoKLSAqIHJldHVybiBUUlVFIGlmIGEgY2hhcmFjdGVyIGlzIGF2YWlsYWJsZSwgRkFMU0Ugb3RoZXJ3aXNlCi0gKi8KLQotI2RlZmluZSBGT1JFVkVSIDE5OTk5OTk5OTlMCi0KLSAgICBzdGF0aWMgIGludAotV2FpdEZvckNoYXIobG9uZyBtc2VjKQotewotICAgIGxvbmcJc3RhcnR0aW1lID0gMDsKLQotICAgIGlmIChtc2VjICE9IDApCi0Jc3RhcnR0aW1lID0gYmlvc3RpbWUoMCwgMEwpOwotCi0gICAgZm9yICg7OykKLSAgICB7Ci0jaWZkZWYgRkVBVF9NT1VTRQotCWxvbmcJCWNsaWNrdGltZTsKLQlzdGF0aWMgaW50CW9sZF9zdGF0dXMgPSAwOwotCXVuaW9uIFJFR1MJcmVnczsKLQlpbnQJCXgsIHk7Ci0KLQlpZiAobW91c2VfYXZhaWwgJiYgbW91c2VfYWN0aXZlICYmIG1vdXNlX2NsaWNrIDwgMCkKLQl7Ci0JICAgIHJlZ3MueC5heCA9IDM7Ci0JICAgIGludDg2KDB4MzMsICZyZWdzLCAmcmVncyk7CSAgICAvKiBjaGVjayBtb3VzZSBzdGF0dXMgKi8KLQkJLyogb25seSByZWNvZ25pemUgYnV0dG9uLWRvd24gYW5kIGJ1dHRvbi11cCBldmVudCAqLwotCSAgICB4ID0gcmVncy54LmN4IC8gbW91c2VfeF9kaXY7Ci0JICAgIHkgPSByZWdzLnguZHggLyBtb3VzZV95X2RpdjsKLQkgICAgaWYgKChvbGRfc3RhdHVzID09IDApICE9IChyZWdzLnguYnggPT0gMCkpCi0JICAgIHsKLQkJaWYgKG9sZF9zdGF0dXMpCS8qIGJ1dHRvbiB1cCAqLwotCQkgICAgbW91c2VfY2xpY2sgPSBNT1VTRV9SRUxFQVNFOwotCQllbHNlCQkJLyogYnV0dG9uIGRvd24gKi8KLQkJewotCQkgICAgLyoKLQkJICAgICAqIFRyYW5zbGF0ZSBNU0RPUyBtb3VzZSBldmVudHMgdG8gVmltIG1vdXNlIGV2ZW50cy4KLQkJICAgICAqIFRPRE86IHNob3VsZCBoYW5kbGUgbWlkZGxlIG1vdXNlIGJ1dHRvbiwgYnkgcHJlc3NpbmcKLQkJICAgICAqIGxlZnQgYW5kIHJpZ2h0IGF0IHRoZSBzYW1lIHRpbWUuCi0JCSAgICAgKi8KLQkJICAgIGlmIChyZWdzLnguYnggJiBNU0RPU19NT1VTRV9MRUZUKQotCQkJbW91c2VfY2xpY2sgPSBNT1VTRV9MRUZUOwotCQkgICAgZWxzZSBpZiAocmVncy54LmJ4ICYgTVNET1NfTU9VU0VfUklHSFQpCi0JCQltb3VzZV9jbGljayA9IE1PVVNFX1JJR0hUOwotCQkgICAgZWxzZSBpZiAocmVncy54LmJ4ICYgTVNET1NfTU9VU0VfTUlERExFKQotCQkJbW91c2VfY2xpY2sgPSBNT1VTRV9NSURETEU7Ci0KLQkJICAgIC8qCi0JCSAgICAgKiBGaW5kIG91dCBpZiB0aGlzIGlzIGEgbXVsdGktY2xpY2sKLQkJICAgICAqLwotCQkgICAgY2xpY2t0aW1lID0gYmlvc3RpbWUoMCwgMEwpOwotCQkgICAgaWYgKG1vdXNlX2NsaWNrX3ggPT0geCAmJiBtb3VzZV9jbGlja195ID09IHkKLQkJCSAgICAmJiBtb3VzZV90b3BsaW5lID09IGN1cndpbi0+d190b3BsaW5lCi0jaWZkZWYgRkVBVF9ESUZGCi0JCQkgICAgJiYgbW91c2VfdG9wZmlsbCA9PSBjdXJ3aW4tPndfdG9wZmlsbAotI2VuZGlmCi0JCQkgICAgJiYgbW91c2VfY2xpY2tfY291bnQgIT0gNAotCQkJICAgICYmIG1vdXNlX2NsaWNrID09IG1vdXNlX2xhc3RfY2xpY2sKLQkJCSAgICAmJiBjbGlja3RpbWUgPCBtb3VzZV9jbGlja190aW1lCi0JCQkJCQkJKyBwX21vdXNldCAvIEJJT1NUSUNLKQotCQkJKyttb3VzZV9jbGlja19jb3VudDsKLQkJICAgIGVsc2UKLQkJCW1vdXNlX2NsaWNrX2NvdW50ID0gMTsKLQkJICAgIG1vdXNlX2NsaWNrX3RpbWUgPSBjbGlja3RpbWU7Ci0JCSAgICBtb3VzZV9sYXN0X2NsaWNrID0gbW91c2VfY2xpY2s7Ci0JCSAgICBtb3VzZV9jbGlja194ID0geDsKLQkJICAgIG1vdXNlX2NsaWNrX3kgPSB5OwotCQkgICAgbW91c2VfdG9wbGluZSA9IGN1cndpbi0+d190b3BsaW5lOwotI2lmZGVmIEZFQVRfRElGRgotCQkgICAgbW91c2VfdG9wZmlsbCA9IGN1cndpbi0+d190b3BmaWxsOwotI2VuZGlmCi0JCSAgICBTRVRfTlVNX01PVVNFX0NMSUNLUyhtb3VzZV9jbGljaywgbW91c2VfY2xpY2tfY291bnQpOwotCQl9Ci0JICAgIH0KLQkgICAgZWxzZSBpZiAob2xkX3N0YXR1cyAmJiAoeCAhPSBtb3VzZV94IHx8IHkgIT0gbW91c2VfeSkpCi0JCW1vdXNlX2NsaWNrID0gTU9VU0VfRFJBRzsKLQkgICAgb2xkX3N0YXR1cyA9IHJlZ3MueC5ieDsKLQkgICAgaWYgKG1vdXNlX2hpZGRlbiAmJiBtb3VzZV94ID49IDAgJiYgKG1vdXNlX3ggIT0geCB8fCBtb3VzZV95ICE9IHkpKQotCSAgICB7Ci0JCW1vdXNlX2hpZGRlbiA9IEZBTFNFOwotCQlzaG93X21vdXNlKFRSVUUpOwotCSAgICB9Ci0JICAgIG1vdXNlX3ggPSB4OwotCSAgICBtb3VzZV95ID0geTsKLQl9Ci0jZW5kaWYKLQotCWlmICgocF9jb25zayA/IGNvbnNfa2JoaXQoKQotCQkJCSA6IHBfYmlvc2sgPyBiaW9za2V5KGJpb3NrZXlfcmVhZHkpIDoga2JoaXQoKSkKLQkJfHwgY2Jya19wcmVzc2VkCi0jaWZkZWYgRkVBVF9NT1VTRQotCQkJCQkJICAgIHx8IG1vdXNlX2NsaWNrID49IDAKLSNlbmRpZgotCQkpCi0JICAgIHJldHVybiBUUlVFOwotCS8qCi0JICogVXNlIGJpb3N0aW1lKCkgdG8gd2FpdCB1bnRpbCBvdXIgdGltZSBpcyBkb25lLgotCSAqIFdlIGJ1c3ktd2FpdCBoZXJlLiAgVW5mb3J0dW5hdGVseSwgZGVsYXkoKSBhbmQgdXNsZWVwKCkgaGF2ZSBiZWVuCi0JICogcmVwb3J0ZWQgdG8gZ2l2ZSBwcm9ibGVtcyB3aXRoIHRoZSBvcmlnaW5hbCBXaW5kb3dzIDk1LiAgVGhpcyBpcwotCSAqIGZpeGVkIGluIHNlcnZpY2UgcGFjayAxLCBidXQgbm90IGV2ZXJ5Ym9keSBpbnN0YWxsZWQgdGhhdC4KLQkgKiBUaGUgREpHUFAgaW1wbGVtZW50YXRpb24gb2YgdXNsZWVwKCkgdXNlcyBhIGJ1c3ktd2FpdCBsb29wIHRvby4KLQkgKi8KLQlpZiAobXNlYyA9PSAwIHx8IChtc2VjICE9IEZPUkVWRVIKLQkJCSAgICAmJiBiaW9zdGltZSgwLCAwTCkgPiBzdGFydHRpbWUgKyBtc2VjIC8gQklPU1RJQ0spKQotCSAgICBicmVhazsKLQotI2lmZGVmIERKR1BQCi0JLyogWWllbGQgdGhlIENQVSB0byB0aGUgbmV4dCBwcm9jZXNzLiAqLwotCV9fZHBtaV95aWVsZCgpOwotI2VuZGlmCi0gICAgfQotICAgIHJldHVybiBGQUxTRTsKLX0KLQotLyoKLSAqIGRvbid0IGRvIGFueXRoaW5nIGZvciBhYm91dCAibXNlYyIgbXNlYwotICovCi0gICAgdm9pZAotbWNoX2RlbGF5KAotICAgIGxvbmcJbXNlYywKLSAgICBpbnQJCWlnbm9yZWlucHV0KQotewotICAgIGxvbmcJc3RhcnR0aW1lOwotCi0gICAgaWYgKGlnbm9yZWlucHV0KQotICAgIHsKLQkvKgotCSAqIFdlIGJ1c3ktd2FpdCBoZXJlLiAgVW5mb3J0dW5hdGVseSwgZGVsYXkoKSBhbmQgdXNsZWVwKCkgaGF2ZSBiZWVuCi0JICogcmVwb3J0ZWQgdG8gZ2l2ZSBwcm9ibGVtcyB3aXRoIHRoZSBvcmlnaW5hbCBXaW5kb3dzIDk1LiAgVGhpcyBpcwotCSAqIGZpeGVkIGluIHNlcnZpY2UgcGFjayAxLCBidXQgbm90IGV2ZXJ5Ym9keSBpbnN0YWxsZWQgdGhhdC4KLQkgKi8KLQlzdGFydHRpbWUgPSBiaW9zdGltZSgwLCAwTCk7Ci0Jd2hpbGUgKGJpb3N0aW1lKDAsIDBMKSA8IHN0YXJ0dGltZSArIG1zZWMgLyBCSU9TVElDSykKLQkgICAgOwotICAgIH0KLSAgICBlbHNlCi0JV2FpdEZvckNoYXIobXNlYyk7Ci19Ci0KLS8qCi0gKiBtY2hfd3JpdGUoKTogd3JpdGUgdGhlIG91dHB1dCBidWZmZXIgdG8gdGhlIHNjcmVlbgotICovCi0gICAgdm9pZAotbWNoX3dyaXRlKAotICAgIGNoYXJfdQkqcywKLSAgICBpbnQJCWxlbikKLXsKLSAgICBjaGFyX3UJKnA7Ci0gICAgaW50CQlyb3csIGNvbDsKLQotICAgIGlmICh0ZXJtX2NvbnNvbGUgJiYgZnVsbF9zY3JlZW4pCi0Jd2hpbGUgKGxlbi0tKQotCXsKLQkgICAgLyogdHJhbnNsYXRlIEVTQyB8IHNlcXVlbmNlcyBpbnRvIGJpb3MgY2FsbHMgKi8KLQkgICAgaWYgKHBfd2QpCSAgICAvKiB0ZXN0aW5nOiB3YWl0IGEgYml0IGZvciBlYWNoIGNoYXIgKi8KLQkJV2FpdEZvckNoYXIocF93ZCk7Ci0KLQkgICAgaWYgKHNbMF0gPT0gJ1xuJykKLSNpZmRlZiBESkdQUAotCSAgICB7Ci0JCW15Zmx1c2goKTsKLQkJU19pQ3VycmVudENvbHVtbiA9IFNfaUxlZnQgLSAxOwotCSAgICB9Ci0jZWxzZQotCQlteXB1dGNoKCdccicpOwotI2VuZGlmCi0JICAgIGVsc2UgaWYgKHNbMF0gPT0gRVNDICYmIGxlbiA+IDEgJiYgc1sxXSA9PSAnfCcpCi0JICAgIHsKLQkJc3dpdGNoIChzWzJdKQotCQl7Ci0jaWZkZWYgREpHUFAKLQkJY2FzZSAnQic6ICAgU2NyZWVuVmlzdWFsQmVsbCgpOwotCQkJICAgIGdvdG8gZ290MzsKLSNlbmRpZgotCQljYXNlICdKJzoKLSNpZmRlZiBESkdQUAotCQkJICAgIG15Zmx1c2goKTsKLSNlbmRpZgotCQkJICAgIG15Y2xyc2NyKCk7Ci0JCQkgICAgZ290byBnb3QzOwotCi0JCWNhc2UgJ0snOgotI2lmZGVmIERKR1BQCi0JCQkgICAgbXlmbHVzaCgpOwotI2VuZGlmCi0JCQkgICAgbXljbHJlb2woKTsKLQkJCSAgICBnb3RvIGdvdDM7Ci0KLQkJY2FzZSAnTCc6Ci0jaWZkZWYgREpHUFAKLQkJCSAgICBteWZsdXNoKCk7Ci0jZW5kaWYKLQkJCSAgICBteWluc2xpbmUoKTsKLQkJCSAgICBnb3RvIGdvdDM7Ci0KLQkJY2FzZSAnTSc6Ci0jaWZkZWYgREpHUFAKLQkJCSAgICBteWZsdXNoKCk7Ci0jZW5kaWYKLQkJCSAgICBteWRlbGxpbmUoKTsKLWdvdDM6CQkJICAgIHMgKz0gMzsKLQkJCSAgICBsZW4gLT0gMjsKLQkJCSAgICBjb250aW51ZTsKLQotCQljYXNlICcwJzoKLQkJY2FzZSAnMSc6Ci0JCWNhc2UgJzInOgotCQljYXNlICczJzoKLQkJY2FzZSAnNCc6Ci0JCWNhc2UgJzUnOgotCQljYXNlICc2JzoKLQkJY2FzZSAnNyc6Ci0JCWNhc2UgJzgnOgotCQljYXNlICc5JzogICBwID0gcyArIDI7Ci0JCQkgICAgcm93ID0gbXlnZXRkaWdpdHMoJnApOyAgICAvKiBubyBjaGVjayBmb3IgbGVuZ3RoISAqLwotCQkJICAgIGlmIChwID4gcyArIGxlbikKLQkJCQlicmVhazsKLQkJCSAgICBpZiAoKnAgPT0gJzsnKQotCQkJICAgIHsKLQkJCQkrK3A7Ci0JCQkJY29sID0gbXlnZXRkaWdpdHMoJnApOyAvKiBubyBjaGVjayBmb3IgbGVuZ3RoISAqLwotCQkJCWlmIChwID4gcyArIGxlbikKLQkJCQkgICAgYnJlYWs7Ci0JCQkJaWYgKCpwID09ICdIJyB8fCAqcCA9PSAncicgfHwgKnAgPT0gJ1YnKQotCQkJCXsKLSNpZmRlZiBESkdQUAotCQkJCSAgICBteWZsdXNoKCk7Ci0jZW5kaWYKLQkJCQkgICAgaWYgKCpwID09ICdIJykgIC8qIHNldCBjdXJzb3IgcG9zaXRpb24gKi8KLQkJCQkJbXlnb3RveHkoY29sLCByb3cpOwotCQkJCSAgICBlbHNlIGlmICgqcCA9PSAnVicpCi0JCQkJCW15d2luZG93KHJvdywgU19pVG9wLCBjb2wsIFNfaUJvdHRvbSk7Ci0JCQkJICAgIGVsc2UJICAgIC8qIHNldCBzY3JvbGwgcmVnaW9uICAqLwotCQkJCQlteXdpbmRvdyhTX2lMZWZ0LCByb3csIFNfaVJpZ2h0LCBjb2wpOwotCQkJCSAgICBsZW4gLT0gcCAtIHM7Ci0JCQkJICAgIHMgPSBwICsgMTsKLQkJCQkgICAgY29udGludWU7Ci0JCQkJfQotCQkJICAgIH0KLQkJCSAgICBlbHNlIGlmICgqcCA9PSAnbScgfHwgKnAgPT0gJ2YnIHx8ICpwID09ICdiJykKLQkJCSAgICB7Ci0JCQkJaWYgKCpwID09ICdtJykJICAgIC8qIHNldCBjb2xvciAqLwotCQkJCXsKLQkJCQkgICAgaWYgKHJvdyA9PSAwKQotCQkJCQlteW5vcm12aWRlbygpOy8qIHJlc2V0IGNvbG9yICovCi0JCQkJICAgIGVsc2UKLQkJCQkJbXl0ZXh0YXR0cihyb3cpOwotCQkJCX0KLQkJCQllbHNlIGlmICgqcCA9PSAnZicpIC8qIHNldCBmb3JlZ3JvdW5kIGNvbG9yICovCi0JCQkJICAgIG15dGV4dGNvbG9yKHJvdyk7Ci0JCQkJZWxzZQkJICAgIC8qIHNldCBiYWNrZ3JvdW5kIGNvbG9yICovCi0JCQkJICAgIG15dGV4dGJhY2tncm91bmQocm93KTsKLQotCQkJCWxlbiAtPSBwIC0gczsKLQkJCQlzID0gcCArIDE7Ci0JCQkJY29udGludWU7Ci0JCQkgICAgfQotCQl9Ci0JICAgIH0KLQkgICAgbXlwdXRjaCgqcysrKTsKLQl9Ci0gICAgZWxzZQotICAgIHsKLQl3cml0ZSgxLCBzLCAodW5zaWduZWQpbGVuKTsKLSAgICB9Ci19Ci0KLS8qCi0gKiBtY2hfaW5jaGFyKCk6IGxvdyBsZXZlbCBpbnB1dCBmdW5jdGlvbi4KLSAqIEdldCBhIGNoYXJhY3RlcnMgZnJvbSB0aGUga2V5Ym9hcmQuCi0gKiBJZiB0aW1lID09IDAgZG8gbm90IHdhaXQgZm9yIGNoYXJhY3RlcnMuCi0gKiBJZiB0aW1lID09IG4gd2FpdCBhIHNob3J0IHRpbWUgZm9yIGNoYXJhY3RlcnMuCi0gKiBJZiB0aW1lID09IC0xIHdhaXQgZm9yZXZlciBmb3IgY2hhcmFjdGVycy4KLSAqCi0gKiByZXR1cm4gdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIG9idGFpbmVkCi0gKi8KLSAgICBpbnQKLW1jaF9pbmNoYXIoCi0gICAgY2hhcl91CSpidWYsCi0gICAgaW50CQltYXhsZW4sCi0gICAgbG9uZwl0aW1lLAotICAgIGludAkJdGJfY2hhbmdlX2NudCkKLXsKLSAgICBpbnQJCWxlbiA9IDA7Ci0gICAgaW50CQljOwotICAgIGludAkJdG1wX2M7Ci0gICAgc3RhdGljIGludAluZXh0Y2hhciA9IDA7CSAgICAvKiBtYXkga2VlcCBjaGFyYWN0ZXIgd2hlbiBtYXhsZW4gPT0gMSAqLwotCi0gICAgLyoKLSAgICAgKiBpZiB3ZSBnb3QgYSBjdHJsLUMgd2hlbiB3ZSB3ZXJlIGJ1c3ksIHRoZXJlIHdpbGwgYmUgYSAiXkMiIHNvbWV3aGVyZQotICAgICAqIG9uIHRoZSBzY3JlZW4sIHNvIHdlIG5lZWQgdG8gcmVkaXNwbGF5IGl0LgotICAgICAqLwotICAgIGlmIChkZWxheWVkX3JlZHJhdykKLSAgICB7Ci0JZGVsYXllZF9yZWRyYXcgPSBGQUxTRTsKLQl1cGRhdGVfc2NyZWVuKENMRUFSKTsKLQlzZXRjdXJzb3IoKTsKLQlvdXRfZmx1c2goKTsKLSAgICB9Ci0KLSAgICAvKiByZXR1cm4gcmVtYWluaW5nIGNoYXJhY3RlciBmcm9tIGxhc3QgY2FsbCAqLwotICAgIGlmIChuZXh0Y2hhcikKLSAgICB7Ci0JKmJ1ZiA9IG5leHRjaGFyOwotCW5leHRjaGFyID0gMDsKLQlyZXR1cm4gMTsKLSAgICB9Ci0KLSNpZmRlZiBGRUFUX01PVVNFCi0gICAgaWYgKHRpbWUgIT0gMCkKLQlzaG93X21vdXNlKFRSVUUpOwotI2VuZGlmCi0jaWZkZWYgREpHUFAKLSAgICBzZXRfc3lzX2N1cnNvcigpOwotI2VuZGlmCi0gICAgaWYgKHRpbWUgPj0gMCkKLSAgICB7Ci0JaWYgKFdhaXRGb3JDaGFyKHRpbWUpID09IDApCS8qIG5vIGNoYXJhY3RlciBhdmFpbGFibGUgKi8KLQl7Ci0jaWZkZWYgRkVBVF9NT1VTRQotCSAgICBzaG93X21vdXNlKEZBTFNFKTsKLSNlbmRpZgotCSAgICByZXR1cm4gMDsKLQl9Ci0gICAgfQotICAgIGVsc2UgICAgLyogdGltZSA9PSAtMSAqLwotICAgIHsKLQkvKgotCSAqIElmIHRoZXJlIGlzIG5vIGNoYXJhY3RlciBhdmFpbGFibGUgd2l0aGluIDIgc2Vjb25kcyAoZGVmYXVsdCkKLQkgKiB3cml0ZSB0aGUgYXV0b3NjcmlwdCBmaWxlIHRvIGRpc2suICBPciBjYXVzZSB0aGUgQ3Vyc29ySG9sZCBldmVudAotCSAqIHRvIGJlIHRyaWdnZXJlZC4KLQkgKi8KLQlpZiAoV2FpdEZvckNoYXIocF91dCkgPT0gMCkKLQl7Ci0jaWZkZWYgRkVBVF9BVVRPQ01ECi0JICAgIGlmICh0cmlnZ2VyX2N1cnNvcmhvbGQoKSAmJiBtYXhsZW4gPj0gMykKLQkgICAgewotCQlidWZbMF0gPSBLX1NQRUNJQUw7Ci0JCWJ1ZlsxXSA9IEtTX0VYVFJBOwotCQlidWZbMl0gPSAoaW50KUtFX0NVUlNPUkhPTEQ7Ci0JCXJldHVybiAzOwotCSAgICB9Ci0jZW5kaWYKLQkgICAgYmVmb3JlX2Jsb2NraW5nKCk7Ci0JfQotICAgIH0KLSAgICBXYWl0Rm9yQ2hhcihGT1JFVkVSKTsJLyogd2FpdCBmb3Iga2V5IG9yIG1vdXNlIGNsaWNrICovCi0KLS8qCi0gKiBUcnkgdG8gcmVhZCBhcyBtYW55IGNoYXJhY3RlcnMgYXMgdGhlcmUgYXJlLCB1bnRpbCB0aGUgYnVmZmVyIGlzIGZ1bGwuCi0gKi8KLSAgICAvKgotICAgICAqIHdlIHdpbGwgZ2V0IGF0IGxlYXN0IG9uZSBrZXkuIEdldCBtb3JlIGlmIHRoZXkgYXJlIGF2YWlsYWJsZQotICAgICAqIEFmdGVyIGEgY3RybC1icmVhayB3ZSBoYXZlIHRvIHJlYWQgYSAwICghKSBmcm9tIHRoZSBidWZmZXIuCi0gICAgICogYmlvc2tleSgxKSB3aWxsIHJldHVybiAwIGlmIG5vIGtleSBpcyBhdmFpbGFibGUgYW5kIHdoZW4gYQotICAgICAqIGN0cmwtYnJlYWsgd2FzIHR5cGVkLiBXaGVuIGN0cmwtYnJlYWsgaXMgaGl0LCB0aGlzIGRvZXMgbm90IGFsd2F5cwotICAgICAqIGltcGxpZXMgYSBrZXkgaGl0LgotICAgICAqLwotICAgIGNicmtfcHJlc3NlZCA9IEZBTFNFOwotI2lmZGVmIEZFQVRfTU9VU0UKLSAgICBpZiAobW91c2VfY2xpY2sgPj0gMCAmJiBtYXhsZW4gPj0gNSkKLSAgICB7Ci0JbGVuID0gNTsKLQkqYnVmKysgPSBFU0MgKyAxMjg7Ci0JKmJ1ZisrID0gJ00nOwotCSpidWYrKyA9IG1vdXNlX2NsaWNrOwotCSpidWYrKyA9IG1vdXNlX3ggKyAnISc7Ci0JKmJ1ZisrID0gbW91c2VfeSArICchJzsKLQltb3VzZV9jbGljayA9IC0xOwotICAgIH0KLSAgICBlbHNlCi0jZW5kaWYKLSAgICB7Ci0jaWZkZWYgRkVBVF9NT1VTRQotCW1vdXNlX2hpZGRlbiA9IFRSVUU7Ci0jZW5kaWYKLQlpZiAocF9iaW9zayAmJiAhcF9jb25zaykKLQl7Ci0JICAgIHdoaWxlICgobGVuID09IDAgfHwgYmlvc2tleShiaW9za2V5X3JlYWR5KSkgJiYgbGVuIDwgbWF4bGVuKQotCSAgICB7Ci0JCWMgPSB0cmFuc2xhdGVfYWx0a2V5cyhiaW9za2V5KGJpb3NrZXlfcmVhZCkpOyAvKiBnZXQgdGhlIGtleSAqLwotCQkvKgotCQkgKiB0cmFuc2xhdGUgYSBmZXcgdGhpbmdzIGZvciBpbmNoYXIoKToKLQkJICogMHgwMDAwID09IENUUkwtYnJlYWsJCS0+IDMJKENUUkwtQykKLQkJICogMHgwMzAwID09IENUUkwtQAkJLT4gTlVMCi0JCSAqIDB4bm4wMCA9PSBleHRlbmRlZCBrZXkgY29kZQktPiBLX05VTCwgbm4KLQkJICogMHhubmUwID09IGVuaGFuY2VkIGtleWJvYXJkCS0+IEtfTlVMLCBubgotCQkgKiBLX05VTAkJCS0+IEtfTlVMLCAzCi0JCSAqLwotCQlpZiAoYyA9PSAwKQotCQkgICAgYyA9IDM7Ci0JCWVsc2UgaWYgKGMgPT0gMHgwMzAwKQotCQkgICAgYyA9IE5VTDsKLQkJZWxzZSBpZiAoKGMgJiAweGZmKSA9PSAwCi0JCQl8fCBjID09IEtfTlVMCi0JCQl8fCBjID09IDB4NGUyYgotCQkJfHwgYyA9PSAweDRhMmQKLQkJCXx8IGMgPT0gMHgzNzJhCi0JCQl8fCAoKGMgJiAweGZmKSA9PSAweGUwICYmIGMgIT0gMHhlMCkpCi0JCXsKLQkJICAgIGlmIChjID09IEtfTlVMKQotCQkJYyA9IDM7Ci0JCSAgICBlbHNlCi0JCQljID4+PSA4OwotCQkgICAgKmJ1ZisrID0gS19OVUw7Ci0JCSAgICArK2xlbjsKLQkJfQotCi0JCWlmIChsZW4gPCBtYXhsZW4pCi0JCXsKLQkJICAgICpidWYrKyA9IGM7Ci0JCSAgICBsZW4rKzsKLSNpZmRlZiBGRUFUX01CWVRFCi0JCSAgICAvKiBDb252ZXJ0IGZyb20gJ3Rlcm1lbmNvZGluZycgdG8gJ2VuY29kaW5nJy4gT25seQotCQkgICAgICogdHJhbnNsYXRlIG5vcm1hbCBjaGFyYWN0ZXJzLCBub3Qga2V5IGNvZGVzLiAqLwotCQkgICAgaWYgKGlucHV0X2NvbnYudmNfdHlwZSAhPSBDT05WX05PTkUKLQkJCQkJICAgICYmIChsZW4gPT0gMSB8fCBidWZbLTJdICE9IEtfTlVMKSkKLQkJCWxlbiArPSBjb252ZXJ0X2lucHV0KGJ1ZiAtIDEsIDEsIG1heGxlbiAtIGxlbiArIDEpIC0gMTsKLSNlbmRpZgotCQl9Ci0JCWVsc2UKLQkJICAgIG5leHRjaGFyID0gYzsKLQkgICAgfQotCX0KLQllbHNlCi0JewotCSAgICB3aGlsZSAoKGxlbiA9PSAwIHx8IChwX2NvbnNrID8gY29uc19rYmhpdCgpIDoga2JoaXQoKSkpCi0JCSAgICAmJiBsZW4gPCBtYXhsZW4pCi0JICAgIHsKLQkJc3dpdGNoIChjID0gKHBfY29uc2sgPyBjb25zX2dldGNoKCkgOiBnZXRjaCgpKSkKLQkJewotCQkgICAgY2FzZSAwOgotCQkJLyogTlVMIG1lYW5zIHRoYXQgdGhlcmUgaXMgYW5vdGhlciBjaGFyYWN0ZXIuCi0JCQkgKiBHZXQgaXQgaW1tZWRpYXRlbHksIGJlY2F1c2Uga2JoaXQoKSBkb2Vzbid0IGFsd2F5cwotCQkJICogcmV0dXJuIFRSVUUgZm9yIHRoZSBzZWNvbmQgY2hhcmFjdGVyLgotCQkJICovCi0JCQlpZiAocF9jb25zaykKLQkJCSAgICBjID0gY29uc19nZXRjaCgpOwotCQkJZWxzZQotCQkJICAgIGMgPSBnZXRjaCgpOwotCQkJdG1wX2MgPSB0cmFuc2xhdGVfYWx0a2V5cyhjIDw8IDgpOwotCQkJaWYgKHRtcF9jID09IChjIDw8IDgpKQotCQkJewotCQkJICAgICpidWYrKyA9IEtfTlVMOwotCQkJICAgICsrbGVuOwotCQkJfQotCQkJZWxzZQotCQkJICAgIGMgPSB0bXBfYzsKLQkJCWJyZWFrOwotCQkgICAgY2FzZSBLX05VTDoKLQkJCSpidWYrKyA9IEtfTlVMOwotCQkJKytsZW47Ci0JCQljID0gMzsKLQkJCWJyZWFrOwotCQkgICAgY2FzZSAzOgotCQkJY2Jya19wcmVzc2VkID0gVFJVRTsKLQkJCS8qRkFMTFRIUk9VR0gqLwotCQkgICAgZGVmYXVsdDoKLQkJCWJyZWFrOwotCQl9Ci0JCWlmIChsZW4gPCBtYXhsZW4pCi0JCXsKLQkJICAgICpidWYrKyA9IGM7Ci0JCSAgICArK2xlbjsKLQkJfQotCQllbHNlCi0JCSAgICBuZXh0Y2hhciA9IGM7Ci0JICAgIH0KLQl9Ci0gICAgfQotI2lmZGVmIEZFQVRfTU9VU0UKLSAgICBzaG93X21vdXNlKEZBTFNFKTsKLSNlbmRpZgotCi0gICAgYmVlcF9jb3VudCA9IDA7CSAgICAvKiBtYXkgYmVlcCBhZ2FpbiBub3cgdGhhdCB3ZSBnb3Qgc29tZSBjaGFycyAqLwotICAgIHJldHVybiBsZW47Ci19Ci0KLS8qCi0gKiByZXR1cm4gbm9uLXplcm8gaWYgYSBjaGFyYWN0ZXIgaXMgYXZhaWxhYmxlCi0gKi8KLSAgICBpbnQKLW1jaF9jaGFyX2F2YWlsKHZvaWQpCi17Ci0gICAgcmV0dXJuIFdhaXRGb3JDaGFyKDBMKTsKLX0KLQotI2lmZGVmIERKR1BQCi0jIGRlZmluZSBJTlRfQVJHICAgIGludAotI2Vsc2UKLSMgZGVmaW5lIElOVF9BUkcKLSNlbmRpZgotCi0vKgotICogZnVuY3Rpb24gZm9yIGN0cmwtYnJlYWsgaW50ZXJydXB0Ci0gKi8KLSAgICBzdGF0aWMgdm9pZCBpbnRlcnJ1cHQKLSNpZmRlZiBESkdQUAotY2F0Y2hfY2JyayhpbnQgYSkKLSNlbHNlCi1jYXRjaF9jYnJrKHZvaWQpCi0jZW5kaWYKLXsKLSAgICBjYnJrX3ByZXNzZWQgPSBUUlVFOwotICAgIGN0cmxjX3ByZXNzZWQgPSBUUlVFOwotfQotCi0jaWZuZGVmIERKR1BQCi0vKgotICogY3RybC1icmVhayBoYW5kbGVyIGZvciBET1MuIE5ldmVyIGNhbGxlZCB3aGVuIGEgY3RybC1icmVhayBpcyB0eXBlZCwgYmVjYXVzZQotICogd2UgY2F0Y2ggaW50ZXJydXB0IDFiLiBJZiB5b3UgdHlwZSBjdHJsLUMgd2hpbGUgVmltIGlzIHdhaXRpbmcgZm9yIGEKLSAqIGNoYXJhY3RlciB0aGlzIGZ1bmN0aW9uIGlzIG5vdCBjYWxsZWQuIFdoZW4gYSBjdHJsLUMgaXMgdHlwZWQgd2hpbGUgVmltIGlzCi0gKiBidXN5IHRoaXMgZnVuY3Rpb24gbWF5IGJlIGNhbGxlZC4gQnkgdGhhdCB0aW1lIGEgXkMgaGFzIGJlZW4gZGlzcGxheWVkIG9uCi0gKiB0aGUgc2NyZWVuLCBzbyB3ZSBoYXZlIHRvIHJlZGlzcGxheSB0aGUgc2NyZWVuLiBXZSBjYW4ndCBkbyB0aGF0IGhlcmUsCi0gKiBiZWNhdXNlIHdlIG1heSBiZSBjYWxsZWQgYnkgRE9TLiBUaGUgcmVkcmF3IGlzIGluIG1jaF9pbmNoYXIoKS4KLSAqLwotICAgIHN0YXRpYyBpbnQgX2NkZWNsCi1jYnJrX2hhbmRsZXIodm9pZCkKLXsKLSAgICBkZWxheWVkX3JlZHJhdyA9IFRSVUU7Ci0gICAgcmV0dXJuIDE7CQkgICAgLyogcmVzdW1lIG9wZXJhdGlvbiBhZnRlciBjdHJsLWJyZWFrICovCi19Ci0KLS8qCi0gKiBmdW5jdGlvbiBmb3IgY3JpdGljYWwgZXJyb3IgaW50ZXJydXB0Ci0gKiBGb3IgRE9TIDEgYW5kIDIgcmV0dXJuIDAgKElnbm9yZSkuCi0gKiBGb3IgRE9TIDMgYW5kIGxhdGVyIHJldHVybiAzIChGYWlsKQotICovCi0gICAgc3RhdGljIHZvaWQgaW50ZXJydXB0Ci1jYXRjaF9jaW50KAotICAgIHVuc2lnbmVkIGJwLAotICAgIHVuc2lnbmVkIGRpLAotICAgIHVuc2lnbmVkIHNpLAotICAgIHVuc2lnbmVkIGRzLAotICAgIHVuc2lnbmVkIGVzLAotICAgIHVuc2lnbmVkIGR4LAotICAgIHVuc2lnbmVkIGN4LAotICAgIHVuc2lnbmVkIGJ4LAotICAgIHVuc2lnbmVkIGF4KQotewotICAgIGF4ID0gKGF4ICYgMHhmZjAwKTsJICAgIC8qIHNldCBBTCB0byAwICovCi0gICAgaWYgKF9vc21ham9yID49IDMpCi0JYXggfD0gMzsJICAgIC8qIHNldCBBTCB0byAzICovCi19Ci0jZW5kaWYKLQotLyoKLSAqIFNldCB0aGUgaW50ZXJydXB0IHZlY3RvcnMgZm9yIHVzZSB3aXRoIFZpbSBvbiBvciBvZmYuCi0gKiBvbiA9PSBUUlVFIG1lYW5zIGFzIHVzZWQgd2l0aGluIFZpbQotICovCi0gICAgc3RhdGljIHZvaWQKLXNldF9pbnRlcnJ1cHRzKGludCBvbikKLXsKLSAgICBzdGF0aWMgaW50IHNhdmVkX2Nicms7Ci0jaWZuZGVmIERKR1BQCi0gICAgc3RhdGljIHZvaWQgaW50ZXJydXB0ICgqb2xkX2NpbnQpKCk7Ci0jZW5kaWYKLSAgICBzdGF0aWMgdm9pZCBpbnRlcnJ1cHQgKCpvbGRfY2JyaykoSU5UX0FSRyk7Ci0KLSAgICBpZiAob24pCi0gICAgewotCXNhdmVkX2NicmsgPSBnZXRjYnJrKCk7CQkvKiBzYXZlIG9sZCBjdHJsLWJyZWFrIHNldHRpbmcgKi8KLQlzZXRjYnJrKDApOwkJCS8qIGRvIG5vdCBjaGVjayBmb3IgY3RybC1icmVhayAqLwotI2lmZGVmIERKR1BQCi0Jb2xkX2NicmsgPSBzaWduYWwoU0lHSU5ULCBjYXRjaF9jYnJrKTsJLyogY3JpdGljYWwgZXJyb3IgaW50ZXJydXB0ICovCi0jZWxzZQotCW9sZF9jaW50ID0gZ2V0dmVjdCgweDI0KTsJLyogc2F2ZSBvbGQgY3JpdGljYWwgZXJyb3IgaW50ZXJydXB0ICovCi0Jc2V0dmVjdCgweDI0LCBjYXRjaF9jaW50KTsJLyogaW5zdGFsbCBvdXIgY3JpdGljYWwgZXJyb3IgaW50ZXJydXB0ICovCi0Jb2xkX2NicmsgPSBnZXR2ZWN0KDB4MUIpOwkvKiBzYXZlIG9sZCBjdHJsLWJyZWFrIGludGVycnVwdCAqLwotCXNldHZlY3QoMHgxQiwgY2F0Y2hfY2Jyayk7CS8qIGluc3RhbGwgb3VyIGN0cmwtYnJlYWsgaW50ZXJydXB0ICovCi0JY3RybGJyayhjYnJrX2hhbmRsZXIpOwkJLyogdmltJ3MgY3RybC1icmVhayBoYW5kbGVyICovCi0jZW5kaWYKLQlpZiAodGVybV9jb25zb2xlKQotCSAgICBvdXRfc3RyKFRfTUUpOwkJLyogc2V0IGNvbG9ycyAqLwotICAgIH0KLSAgICBlbHNlCi0gICAgewotCXNldGNicmsoc2F2ZWRfY2Jyayk7CQkvKiByZXN0b3JlIGN0cmwtYnJlYWsgc2V0dGluZyAqLwotI2lmZGVmIERKR1BQCi0Jc2lnbmFsKFNJR0lOVCxvbGRfY2Jyayk7CS8qIGNyaXRpY2FsIGVycm9yIGludGVycnVwdCAqLwotI2Vsc2UKLQlzZXR2ZWN0KDB4MjQsIG9sZF9jaW50KTsJLyogcmVzdG9yZSBjcml0aWNhbCBlcnJvciBpbnRlcnJ1cHQgKi8KLQlzZXR2ZWN0KDB4MUIsIG9sZF9jYnJrKTsJLyogcmVzdG9yZSBjdHJsLWJyZWFrIGludGVycnVwdCAqLwotI2VuZGlmCi0JLyogcmVzdG9yZSBjdHJsLWJyZWFrIGhhbmRsZXIsIGhvdyA/Pz8gKi8KLQlpZiAodGVybV9jb25zb2xlKQotCSAgICBteW5vcm12aWRlbygpOwkJLyogcmVzdG9yZSBzY3JlZW4gY29sb3JzICovCi0gICAgfQotfQotCi0vKgotICogV2UgaGF2ZSBubyBqb2IgY29udHJvbCwgZmFrZSBpdCBieSBzdGFydGluZyBhIG5ldyBzaGVsbC4KLSAqLwotICAgIHZvaWQKLW1jaF9zdXNwZW5kKHZvaWQpCi17Ci0gICAgc3VzcGVuZF9zaGVsbCgpOwotfQotCi1leHRlcm4gaW50IF9mbW9kZTsKLQotLyoKLSAqIFByZXBhcmUgd2luZG93IGZvciB1c2UgYnkgVmltLgotICovCi0gICAgdm9pZAotbWNoX2luaXQodm9pZCkKLXsKLSAgICB1bmlvbiBSRUdTIHJlZ3M7Ci0KLSNpZiBkZWZpbmVkKERKR1BQKSAmJiBkZWZpbmVkKEZFQVRfQ0xJUEJPQVJEKQotICAgIF9fZHBtaV9yZWdzICBkcG1pX3JlZ3M7Ci0jZW5kaWYKLQotICAgIC8qCi0gICAgICogR2V0IHRoZSB2aWRlbyBhdHRyaWJ1dGVzIGF0IHRoZSBjdXJzb3IuICBUaGVzZSB3aWxsIGJlIHVzZWQgYXMgdGhlCi0gICAgICogZGVmYXVsdCBhdHRyaWJ1dGVzLgotICAgICAqLwotICAgIHJlZ3MuaC5haCA9IDB4MDg7Ci0gICAgcmVncy5oLmJoID0gMHgwMDsJCS8qIHZpZGVvIHBhZ2UgMCAqLwotICAgIGludDg2KDB4MTAsICZyZWdzLCAmcmVncyk7Ci0gICAgb3JpZ19hdHRyID0gcmVncy5oLmFoOwotICAgIG15bm9ybXZpZGVvKCk7Ci0gICAgaWYgKGN0ZXJtX25vcm1hbF9mZ19jb2xvciA9PSAwKQotCWN0ZXJtX25vcm1hbF9mZ19jb2xvciA9IChvcmlnX2F0dHIgJiAweGYpICsgMTsKLSAgICBpZiAoY3Rlcm1fbm9ybWFsX2JnX2NvbG9yID09IDApCi0JY3Rlcm1fbm9ybWFsX2JnX2NvbG9yID0gKChvcmlnX2F0dHIgPj4gNCkgJiAweGYpICsgMTsKLQotICAgIHRlcm1fY29uc29sZSA9IFRSVUU7ICAgIC8qIGFzc3VtZSB1c2luZyB0aGUgY29uc29sZSBmb3IgdGhlIHRoaW5ncyBoZXJlICovCi0gICAgX2Ztb2RlID0gT19CSU5BUlk7CSAgICAvKiB3ZSBkbyBvdXIgb3duIENSLUxGIHRyYW5zbGF0aW9uICovCi0gICAgb3V0X2ZsdXNoKCk7Ci0gICAgc2V0X2ludGVycnVwdHMoVFJVRSk7ICAgLyogY2F0Y2ggaW50ZXJydXB0cyAqLwotCi0jaWZkZWYgREpHUFAKLSAgICAvKgotICAgICAqIFVzZSBMb25nIEZpbGUgTmFtZXMgYnkgZGVmYXVsdCwgaWYgJExGTiBub3Qgc2V0LgotICAgICAqLwotICAgIGlmIChnZXRlbnYoIkxGTiIpID09IE5VTEwpCi0JcHV0ZW52KCJMRk49eSIpOwotCi0gICAgZ2V0X3NjcmVlbmJhc2UoKTsKLSNlbmRpZgotCi0jaWZkZWYgRkVBVF9NT1VTRQotLyogZmluZCBvdXQgaWYgYSBNUyBjb21wYXRpYmxlIG1vdXNlIGlzIGF2YWlsYWJsZSAqLwotICAgIHJlZ3MueC5heCA9IDA7Ci0gICAgKHZvaWQpaW50ODYoMHgzMywgJnJlZ3MsICZyZWdzKTsKLSAgICBtb3VzZV9hdmFpbCA9IHJlZ3MueC5heDsKLSAgICAvKiBiZXN0IGd1ZXNzIGZvciBtb3VzZSBjb29yZGluYXRlIGNvbXB1dGF0aW9ucyAqLwotICAgIG1jaF9nZXRfc2hlbGxzaXplKCk7Ci0gICAgaWYgKENvbHVtbnMgPD0gNDApCi0JbW91c2VfeF9kaXYgPSAxNjsKLSAgICBpZiAoUm93cyA9PSAzMCkKLQltb3VzZV95X2RpdiA9IDE2OwotI2VuZGlmCi0KLSAgICAvKgotICAgICAqIFRyeSBzd2l0Y2hpbmcgdG8gMTYgY29sb3JzIGZvciBiYWNrZ3JvdW5kLCBpbnN0ZWFkIG9mIDggY29sb3JzIGFuZAotICAgICAqIGJsaW5raW5nLiAgRG9lcyB0aGlzIGFsd2F5cyB3b3JrPyAgQ2FuIHRoZSBvbGQgdmFsdWUgYmUgcmVzdG9yZWQ/Ci0gICAgICovCi0gICAgcmVncy54LmF4ID0gMHgxMDAzOwotICAgIHJlZ3MuaC5ibCA9IDB4MDA7Ci0gICAgcmVncy5oLmJoID0gMHgwMDsKLSAgICBpbnQ4NigweDEwLCAmcmVncywgJnJlZ3MpOwotCi0gICAgLyoKLSAgICAgKiBUZXN0IGlmIHdlIGhhdmUgYW4gZW5oYW5jZWQgQVQga2V5Ym9hcmQuICBXcml0ZSAweEZGRkYgdG8gdGhlIGtleWJvYXJkCi0gICAgICogYnVmZmVyIGFuZCB0cnkgdG8gcmVhZCBpdCBiYWNrLiAgSWYgd2UgY2FuJ3QgaW4gMTYgdHJpZXMsIGl0J3MgYW4gb2xkCi0gICAgICogdHlwZSBYVCBrZXlib2FyZC4KLSAgICAgKi8KLSAgICByZWdzLmguYWggPSAweDA1OwotICAgIHJlZ3MueC5jeCA9IDB4ZmZmZjsKLSAgICBpbnQ4NigweDE2LCAmcmVncywgJnJlZ3MpOwotICAgIGlmIChyZWdzLmguYWwgIT0gMSkJLyogc2tpcCB0aGlzIHdoZW4ga2V5Ym9hcmQgYnVmZmVyIGlzIGZ1bGwgKi8KLSAgICB7Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgMTY7ICsraSkKLQl7Ci0JICAgIHJlZ3MuaC5haCA9IDB4MTA7Ci0JICAgIGludDg2KDB4MTYsICZyZWdzLCAmcmVncyk7Ci0JICAgIGlmIChyZWdzLnguYXggPT0gMHhmZmZmKQotCQlicmVhazsKLQl9Ci0JaWYgKGkgPT0gMTYpCS8qIDB4ZmZmZiBub3QgcmVhZCwgbXVzdCBiZSBvbGQga2V5Ym9hcmQgKi8KLQl7Ci0JICAgIGJpb3NrZXlfcmVhZCA9IDA7Ci0JICAgIGJpb3NrZXlfcmVhZHkgPSAxOwotCX0KLSAgICB9Ci0KLSNpZmRlZiBNQ0hfQ1VSU09SX1NIQVBFCi0gICAgLyogU2F2ZSB0aGUgb2xkIGN1cnNvciBzaGFwZSAqLwotICAgIG1jaF9yZXN0b3JlX2N1cnNvcl9zaGFwZShGQUxTRSk7Ci0gICAgLyogSW5pdGlhbGlzZSB0aGUgY3Vyc29yIHNoYXBlICovCi0gICAgbWNoX3VwZGF0ZV9jdXJzb3IoKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChESkdQUCkgJiYgZGVmaW5lZChGRUFUX0NMSVBCT0FSRCkKLSAgICAvKgotICAgICAqIENoZWNrIHRvIHNlZSBpZiB0aGUgV2luZG93cyBjbGlwYm9hcmQgaXMgYXZhaWxhYmxlLCBpZS4gYXJlIHdlCi0gICAgICogcnVubmluZyBmcm9tIGEgRE9TIHNlc3Npb24gd2l0aGluIFdpbmRvd3MuICBPYnZpb3VzbHksIHRoZSBXaW5kb3dzCi0gICAgICogY2xpcGJvYXJkIHdpbGwgbm90IGJlIGF2YWlsYWJsZSBpZiB3ZSdyZSBydW5uaW5nIHVuZGVyIHB1cmUgRE9TLgotICAgICAqCi0gICAgICogaW50IDB4MmYsIEFYID0gMHgxNzAwIGlkZW50aWZpZXMgdGhlIFdpbmRvd3MgdmVyc2lvbiB3ZSdyZSBydW5uaW5nCi0gICAgICogdW5kZXIuICBVcG9uIHJldHVybiBmcm9tIHRoZSBpbnRlcnJ1cHQsIGlmIEFYIGlzIHVuY2hhbmdlZCwgd2UncmUKLSAgICAgKiBydW5uaW5nIHVuZGVyIHB1cmUgRE9TIGFuZCBubyBXaW5kb3dzIGNsaXBib2FyZCBpcyBhdmFpbGFibGUuCi0gICAgICoKLSAgICAgKiBSZW1hcms6IGNvdWxkIHVzZSBpbnQ4NigpIGhlcmUgYnV0IF9fZHBtaV9pbnQoKSBpcyByZWNvbW1lbmRlZCBpbgotICAgICAqIHRoZSBESkdQUCBkb2NzLCBzaW5jZSBpbnQ4NigpIGRvZXNuJ3QgY292ZXIgYWxsIGF2YWlsYWJsZSBpbnRlcnJ1cHRzLgotICAgICAqLwotICAgIGRwbWlfcmVncy54LmF4ID0gMHgxNzAwOwotICAgIGlmIChfX2RwbWlfaW50KDB4MmYsICZkcG1pX3JlZ3MpID09IC0xKQotCS8qIHJlYWwtbW9kZSBpbnRlcnJ1cHQgZmFpbGVkPyAqLwotCWRwbWlfcmVncy54LmF4ID0gMHgxNzAwOwkvKiBmb3JjZSBmYWlsdXJlICovCi0KLSAgICBpZiAoZHBtaV9yZWdzLnguYXggPT0gMHgxNzAwKQkvKiBubyBjaGFuZ2UgaW4gQVg/ICovCi0JY2xpcF9pbml0KEZBTFNFKTsJCS8qIG5vIGNsaXBib2FyZCBhdmFpbGFibGUsIHRvbyBiYWQgKi8KLSAgICBlbHNlCQkJCS8qIGVsc2UsIHJ1bm5pbmcgdW5kZXIgV2luZG93cywgT0sgKi8KLQljbGlwX2luaXQoVFJVRSk7CQkvKiBjbGlwYm9hcmQgaXMgYXZhaWxhYmxlICovCi0jZW5kaWYKLX0KLQotICAgIGludAotbWNoX2NoZWNrX3dpbigKLSAgICBpbnQJCWFyZ2MsCi0gICAgY2hhcgkqKmFyZ3YpCi17Ci0gICAgLyogc3RvcmUgYXJndlswXSwgbWF5IGJlIHVzZWQgZm9yICRWSU0gKi8KLSAgICBpZiAoKmFyZ3ZbMF0gIT0gTlVMKQotCWV4ZV9uYW1lID0gRnVsbE5hbWVfc2F2ZSgoY2hhcl91ICopYXJndlswXSwgRkFMU0UpOwotCi0gICAgLyoKLSAgICAgKiBUcnkgdGhlIERPUyBzZWFyY2ggcGF0aC4gIFRoZSBleGVjdXRhYmxlIG1heSBpbgotICAgICAqIGZhY3QgYmUgY2FsbGVkIGRpZmZlcmVudGx5LCBzbyB0cnkgdGhpcyBsYXN0LgotICAgICAqLwotICAgIGlmIChleGVfbmFtZSA9PSBOVUxMIHx8ICpleGVfbmFtZSA9PSBOVUwpCi0JZXhlX25hbWUgPSBzZWFyY2hwYXRoKCJ2aW0uZXhlIik7Ci0KLSAgICBpZiAoaXNhdHR5KDEpKQotCXJldHVybiBPSzsKLSAgICByZXR1cm4gRkFJTDsKLX0KLQotLyoKLSAqIFJldHVybiBUUlVFIGlmIHRoZSBpbnB1dCBjb21lcyBmcm9tIGEgdGVybWluYWwsIEZBTFNFIG90aGVyd2lzZS4KLSAqLwotICAgIGludAotbWNoX2lucHV0X2lzYXR0eSh2b2lkKQotewotICAgIGlmIChpc2F0dHkocmVhZF9jbWRfZmQpKQotCXJldHVybiBUUlVFOwotICAgIHJldHVybiBGQUxTRTsKLX0KLQotI2lmIGRlZmluZWQoVVNFX0ZOQU1FX0NBU0UpIHx8IGRlZmluZWQoUFJPVE8pCi0vKgotICogZm5hbWVfY2FzZSgpOiBTZXQgdGhlIGNhc2Ugb2YgdGhlIGZpbGUgbmFtZSwgaWYgaXQgYWxyZWFkeSBleGlzdHMuCi0gKiBUT0RPOiBzaG91bGQgZXhwYW5kIHNob3J0IHRvIGxvbmcgZmlsZSBuYW1lcy4gIE5lZWQgdG8gdXNlIERPUyBpbnRlcnJ1cHRzLAotICogc2VlIERKR1BQIHNvdXJjZXMgbGliYy9kb3MvZGlyL2ZpbmRmaXJzLmMuCi0gKi8KLSAgICB2b2lkCi1mbmFtZV9jYXNlKGNoYXJfdSAqbmFtZSwgaW50IGxlbikKLXsKLSAgICBjaGFyX3UJICAgICp0YWlsOwotICAgIHN0cnVjdCBmZmJsayAgICBmYjsKLQotICAgIHNsYXNoX2FkanVzdChuYW1lKTsKLSAgICBpZiAoZmluZGZpcnN0KG5hbWUsICZmYiwgMCkgPT0gMCkKLSAgICB7Ci0JdGFpbCA9IGdldHRhaWwobmFtZSk7Ci0JaWYgKGxlbiA9PSAwID8gU1RSTEVOKHRhaWwpID09IFNUUkxFTihmYi5mZl9uYW1lKQotCQk6ICh0YWlsIC0gbmFtZSkgKyBTVFJMRU4oZmIuZmZfbmFtZSkgPCBsZW4pCi0JICAgIFNUUkNQWSh0YWlsLCBmYi5mZl9uYW1lKTsKLSAgICB9Ci19Ci0jZW5kaWYKLQotLyoKLSAqIHJldHVybiBwcm9jZXNzIElECi0gKi8KLSAgICBsb25nCi1tY2hfZ2V0X3BpZCh2b2lkKQotewotICAgIHJldHVybiAobG9uZykwOwotfQotCi0vKgotICogQ2hhbmdlIGRlZmF1bHQgZHJpdmUgKGp1c3QgbGlrZSBfY2hkcml2ZSBvZiBCb3JsYW5kIEMgMy4xKQotICovCi0gICAgc3RhdGljIGludAotY2hhbmdlX2RyaXZlKGludCBkcml2ZSkKLXsKLSAgICB1bmlvbiBSRUdTIHJlZ3M7Ci0KLSAgICByZWdzLmguYWggPSAweDBlOwotICAgIHJlZ3MuaC5kbCA9IGRyaXZlIC0gMTsKLSAgICBpbnRkb3MoJnJlZ3MsICZyZWdzKTsgICAvKiBzZXQgZGVmYXVsdCBkcml2ZSAqLwotICAgIHJlZ3MuaC5haCA9IDB4MTk7Ci0gICAgaW50ZG9zKCZyZWdzLCAmcmVncyk7ICAgLyogZ2V0IGRlZmF1bHQgZHJpdmUgKi8KLSAgICBpZiAocmVncy5oLmFsID09IGRyaXZlIC0gMSkKLQlyZXR1cm4gMDsKLSAgICByZXR1cm4gLTE7Ci19Ci0KLS8qCi0gKiBHZXQgYWJzb2x1dGUgZmlsZSBuYW1lIGludG8gYnVmZmVyICdidWYnIG9mIGxlbmd0aCAnbGVuJyBieXRlcy4KLSAqIEFsbCBzbGFzaGVzIGFyZSByZXBsYWNlZCB3aXRoIGJhY2tzbGFzaGVzLCB0byBhdm9pZCB0cm91YmxlIHdoZW4gY29tcGFyaW5nCi0gKiBmaWxlIG5hbWVzLiAgV2hlbiAnc2hlbGxzbGFzaCcgc2V0IGRvIGl0IHRoZSBvdGhlciB3YXkgYXJvdW5kLgotICoKLSAqIHJldHVybiBGQUlMIGZvciBmYWlsdXJlLCBPSyBvdGhlcndpc2UKLSAqLwotICAgIGludAotbWNoX0Z1bGxOYW1lKAotICAgIGNoYXJfdQkqZm5hbWUsCi0gICAgY2hhcl91CSpidWYsCi0gICAgaW50CQlsZW4sCi0gICAgaW50CQlmb3JjZSkKLXsKLSAgICBpZiAoIWZvcmNlICYmIG1jaF9pc0Z1bGxOYW1lKGZuYW1lKSkJLyogYWxyZWFkeSBleHBhbmRlZCAqLwotICAgIHsKLQl2aW1fc3RybmNweShidWYsIGZuYW1lLCBsZW4gLSAxKTsKLQlzbGFzaF9hZGp1c3QoYnVmKTsKLQlyZXR1cm4gT0s7Ci0gICAgfQotCi0jaWZkZWYgX19CT1JMQU5EQ19fCQkvKiBPbmx5IEJvcmxhbmQgQysrIGhhcyB0aGlzICovCi0gICAgaWYgKF9mdWxscGF0aCgoY2hhciAqKWJ1ZiwgKGNoYXIgKilmbmFtZSwgbGVuIC0gMSkgPT0gTlVMTCkKLQlyZXR1cm4gRkFJTDsKLSAgICByZXR1cm4gT0s7Ci0jZWxzZQkJCS8qIGFsbW9zdCB0aGUgc2FtZSBhcyBtY2hfRnVsbE5hbWUoKSBpbiBvc191bml4LmMgKi8KLSAgICB7Ci0jIGlmIDEKLQljaGFyX3UJZnVsbHBhdGhbTUFYUEFUSExdOwotCi0JaWYgKCFfdHJ1ZW5hbWUoZm5hbWUsIGZ1bGxwYXRoKSkKLQkgICAgcmV0dXJuIEZBSUw7Ci0Jc2xhc2hfYWRqdXN0KGZ1bGxwYXRoKTsJICAgIC8qIE9ubHkgbmVlZGVkIHdoZW4gJ3NoZWxsc2xhc2gnIHNldCAqLwotCXZpbV9zdHJuY3B5KGJ1ZiwgZnVsbHBhdGgsIGxlbiAtIDEpOwotCXJldHVybiBPSzsKLQotIyBlbHNlICAvKiBPbGQgY29kZSwgdG8gYmUgZGVsZXRlZC4uLiAqLwotCWludAlsOwotCWNoYXJfdQlvbGRkaXJbTUFYUEFUSExdOwotCWNoYXJfdQkqcCwgKnE7Ci0JaW50CWM7Ci0JaW50CXJldHZhbCA9IE9LOwotCi0JKmJ1ZiA9IDA7Ci0JLyoKLQkgKiBjaGFuZ2UgdG8gdGhlIGRpcmVjdG9yeSBmb3IgYSBtb21lbnQsCi0JICogYW5kIHRoZW4gZG8gdGhlIGdldHdkKCkgKGFuZCBnZXQgYmFjayB0byB3aGVyZSB3ZSB3ZXJlKS4KLQkgKiBUaGlzIHdpbGwgZ2V0IHRoZSBjb3JyZWN0IHBhdGggbmFtZSB3aXRoICIuLi8iIHRoaW5ncy4KLQkgKi8KLQlwID0gdmltX3N0cnJjaHIoZm5hbWUsICcvJyk7Ci0JcSA9IHZpbV9zdHJyY2hyKGZuYW1lLCAnXFwnKTsKLQlpZiAocSAhPSBOVUxMICYmIChwID09IE5VTEwgfHwgcSA+IHApKQotCSAgICBwID0gcTsKLQlxID0gdmltX3N0cnJjaHIoZm5hbWUsICc6Jyk7Ci0JaWYgKHEgIT0gTlVMTCAmJiAocCA9PSBOVUxMIHx8IHEgPiBwKSkKLQkgICAgcCA9IHE7Ci0JaWYgKHAgIT0gTlVMTCkKLQl7Ci0JICAgIGlmIChnZXRjd2Qob2xkZGlyLCBNQVhQQVRITCkgPT0gTlVMTCkKLQkgICAgewotCQlwID0gTlVMTDsJLyogY2FuJ3QgZ2V0IGN1cnJlbnQgZGlyOiBkb24ndCBjaGRpciAqLwotCQlyZXR2YWwgPSBGQUlMOwotCSAgICB9Ci0JICAgIGVsc2UKLQkgICAgewotCQlpZiAocCA9PSBmbmFtZSkJCQkvKiAvZm5hbWUJICAgICovCi0JCSAgICBxID0gcCArIDE7CQkJLyogLT4gLwkJICAgICovCi0JCWVsc2UgaWYgKHEgKyAxID09IHApCQkvKiAuLi4gYzpcZm9vCSAgICAqLwotCQkgICAgcSA9IHAgKyAxOwkJCS8qIC0+IGM6XAkgICAgKi8KLQkJZWxzZQkJCQkvKiBidXQgYzpcZm9vXGJhciAgICovCi0JCSAgICBxID0gcDsJCQkvKiAtPiBjOlxmb28JICAgICovCi0KLQkJYyA9ICpxOwkJCS8qIHRydW5jYXRlIGF0IHN0YXJ0IG9mIGZuYW1lICovCi0JCSpxID0gTlVMOwotIyBpZmRlZiBESkdQUAotCQlTVFJDUFkoYnVmLCBmbmFtZSk7Ci0JCXNsYXNoX2FkanVzdChidWYpOwkvKiBuZWVkZWQgd2hlbiBmbmFtZSBzdGFydHMgd2l0aCBcICovCi0JCWlmIChtY2hfY2hkaXIoYnVmKSkJLyogY2hhbmdlIHRvIHRoZSBkaXJlY3RvcnkgKi8KLSMgZWxzZQotCQlpZiAobWNoX2NoZGlyKGZuYW1lKSkJLyogY2hhbmdlIHRvIHRoZSBkaXJlY3RvcnkgKi8KLSMgZW5kaWYKLQkJICAgIHJldHZhbCA9IEZBSUw7Ci0JCWVsc2UKLQkJewotCQkgICAgZm5hbWUgPSBxOwotCQkgICAgaWYgKGMgPT0gcHNlcGMpCSAgICAvKiBpZiB3ZSBjdXQgdGhlIG5hbWUgYXQgYSAqLwotCQkJZm5hbWUrKzsJICAgIC8qICdcJywgZG9uJ3QgYWRkIGl0IGFnYWluICovCi0JCX0KLQkJKnEgPSBjOwotCSAgICB9Ci0JfQotCWlmIChnZXRjd2QoYnVmLCBsZW4pID09IE5VTEwpCi0JewotCSAgICByZXR2YWwgPSBGQUlMOwotCSAgICAqYnVmID0gTlVMOwotCX0KLSMgIGlmZGVmIFVTRV9GTkFNRV9DQVNFCi0JZWxzZQotCXsKLQkgICAgY2hhcl91CSpoZWFkOwotCSAgICBjaGFyX3UJKnRhaWw7Ci0JICAgIHN0cnVjdCBmZmJsayBmYjsKLQkgICAgaW50CQljOwotCSAgICBpbnQJCWFkZGVkOwotCi0JICAgIC8qIEFwcGFyZW50bHkgImxvbmduYX4xIiBpc24ndCBleHBhbmRlZCBieSBnZXRjd2QoKSwgYXQgbGVhc3Qgbm90Ci0JICAgICAqIGZvciBESkdQUC4gIEV4cGFuZCBpdCBoZXJlLiAgSGF2ZSB0byBkbyBlYWNoIGRpcm5hbWUKLQkgICAgICogc2VwYXJhdGVseS4gKi8KLQkgICAgc2xhc2hfYWRqdXN0KGJ1Zik7Ci0JICAgIGhlYWQgPSBidWY7Ci0JICAgIGlmIChpc2FscGhhKCpoZWFkKSAmJiBoZWFkWzFdID09ICc6JykKLQkJaGVhZCArPSAyOwkvKiBza2lwICJjOiIgKi8KLQkgICAgd2hpbGUgKCpoZWFkICE9IE5VTCkKLQkgICAgewotCQkvKiBBZHZhbmNlICJoZWFkIiB0byB0aGUgc3RhcnQgb2YgYSBkaXJuYW1lIGFuZCAidGFpbCIgdG8ganVzdAotCQkgKiBhZnRlciBpdC4gKi8KLQkJd2hpbGUgKCpoZWFkID09ICcvJyB8fCAqaGVhZCA9PSAnXFwnKQotCQkgICAgKytoZWFkOwotCQlmb3IgKHRhaWwgPSBoZWFkOyAqdGFpbCAhPSBOVUw7ICsrdGFpbCkKLQkJICAgIGlmICgqdGFpbCA9PSAnLycgfHwgKnRhaWwgPT0gJ1xcJykKLQkJCWJyZWFrOwotCQljID0gKnRhaWw7Ci0JCSp0YWlsID0gTlVMOwotCi0JCWlmIChmaW5kZmlyc3QoYnVmLCAmZmIsIEZBX0RJUkVDKSA9PSAwKQotCQl7Ci0JCSAgICBhZGRlZCA9IFNUUkxFTihmYi5mZl9uYW1lKTsKLQkJICAgIGlmICgoaGVhZCAtIGJ1ZikgKyBhZGRlZCArIFNUUkxFTih0YWlsICsgMSkgKyAyIDwgbGVuKQotCQkgICAgewotCQkJYWRkZWQgLT0gKHRhaWwgLSBoZWFkKTsKLQkJCWlmIChhZGRlZCAhPSAwKQotCQkJICAgIFNUUk1PVkUodGFpbCArIDEgKyBhZGRlZCwgdGFpbCArIDEpOwotCQkJU1RSQ1BZKGhlYWQsIGZiLmZmX25hbWUpOwotCQkJdGFpbCArPSBhZGRlZDsKLQkJICAgIH0KLQkJfQotCQkqdGFpbCA9IGM7Ci0JCWhlYWQgPSB0YWlsOwotCSAgICB9Ci0JfQotIyAgZW5kaWYKLQlpZiAocCAhPSBOVUxMKQotCSAgICBtY2hfY2hkaXIob2xkZGlyKTsKLQkvKgotCSAqIENvbmNhdGVuYXRlIHRoZSBmaWxlIG5hbWUgdG8gdGhlIHBhdGguCi0JICovCi0JaWYgKCpmbmFtZSAhPSBOVUwpCi0JewotCSAgICBsID0gU1RSTEVOKGJ1Zik7Ci0JICAgIGlmIChsID4gMCAmJiBidWZbbCAtIDFdICE9ICcvJyAmJiBidWZbbCAtIDFdICE9ICdcXCcpCi0JCXN0cmNhdChidWYsIHBzZXBzKTsKLQkgICAgc3RyY2F0KGJ1ZiwgZm5hbWUpOwotCX0KLQlyZXR1cm4gcmV0dmFsOwotIyBlbmRpZgotICAgIH0KLSNlbmRpZgotfQotCi0vKgotICogUmVwbGFjZSBhbGwgc2xhc2hlcyBieSBiYWNrc2xhc2hlcy4KLSAqIFRoaXMgdXNlZCB0byBiZSB0aGUgb3RoZXIgd2F5IGFyb3VuZCwgYnV0IE1TLURPUyBzb21ldGltZXMgaGFzIHByb2JsZW1zCi0gKiB3aXRoIHNsYXNoZXMgKGUuZy4gaW4gYSBjb21tYW5kIG5hbWUpLiAgV2UgY2FuJ3QgaGF2ZSBtaXhlZCBzbGFzaGVzIGFuZAotICogYmFja3NsYXNoZXMsIGJlY2F1c2UgY29tcGFyaW5nIGZpbGUgbmFtZXMgd2lsbCBub3Qgd29yayBjb3JyZWN0bHkuICBUaGUKLSAqIGNvbW1hbmRzIHRoYXQgdXNlIGEgZmlsZSBuYW1lIHNob3VsZCB0cnkgdG8gYXZvaWQgdGhlIG5lZWQgdG8gdHlwZSBhCi0gKiBiYWNrc2xhc2ggdHdpY2UuCi0gKiBXaGVuICdzaGVsbHNsYXNoJyBzZXQgZG8gaXQgdGhlIG90aGVyIHdheSBhcm91bmQuCi0gKi8KLSAgICB2b2lkCi1zbGFzaF9hZGp1c3QoY2hhcl91ICpwKQotewotI2lmZGVmIE9MRF9ESkdQUCAgICAvKiB0aGlzIHNlZW1zIHRvIGhhdmUgYmVlbiBmaXhlZCBpbiBESkdQUCAyLjAxICovCi0gICAgLyogREpHUFAgY2FuJ3QgaGFuZGxlIGEgZmlsZSBuYW1lIHRoYXQgc3RhcnRzIHdpdGggYSBiYWNrc2xhc2gsIGFuZCB3aGVuIGl0Ci0gICAgICogc3RhcnRzIHdpdGggYSBzbGFzaCB0aGVyZSBzaG91bGQgYmUgbm8gYmFja3NsYXNoZXMgKi8KLSAgICBpZiAoKnAgPT0gJ1xcJyB8fCAqcCA9PSAnLycpCi0Jd2hpbGUgKCpwKQotCXsKLQkgICAgaWYgKCpwID09ICdcXCcpCi0JCSpwID0gJy8nOwotCSAgICBtYl9wdHJfYWR2KHApOwotCX0KLSAgICBlbHNlCi0jZW5kaWYKLSAgICB3aGlsZSAoKnApCi0gICAgewotCWlmICgqcCA9PSBwc2VwY04pCi0JICAgICpwID0gcHNlcGM7Ci0JbWJfcHRyX2FkdihwKTsKLSAgICB9Ci19Ci0KLS8qCi0gKiBSZXR1cm4gVFJVRSBpZiAiZm5hbWUiIGRvZXMgbm90IGRlcGVuZCBvbiB0aGUgY3VycmVudCBkaXJlY3RvcnkuCi0gKi8KLSAgICBpbnQKLW1jaF9pc0Z1bGxOYW1lKGNoYXJfdSAqZm5hbWUpCi17Ci0gICAgLyogQSBuYW1lIGxpa2UgImQ6L2ZvbyIgYW5kICIvL3NlcnZlci9zaGFyZSIgaXMgYWJzb2x1dGUgKi8KLSAgICByZXR1cm4gKGZuYW1lWzBdICE9IE5VTCAmJiBmbmFtZVsxXSA9PSAnOicKLQkJCQkgICAgICYmIChmbmFtZVsyXSA9PSAnLycgfHwgZm5hbWVbMl0gPT0gJ1xcJykpCi0JfHwgKGZuYW1lWzBdID09IGZuYW1lWzFdICYmIChmbmFtZVswXSA9PSAnLycgfHwgZm5hbWVbMF0gPT0gJ1xcJykpOwotfQotCi0KLSAgICB2b2lkCi1tY2hfZWFybHlfaW5pdCh2b2lkKQotewotfQotCi0vKgotICogQ2FyZWZ1bDogbWNoX2V4aXQoKSBtYXkgYmUgY2FsbGVkIGJlZm9yZSBtY2hfaW5pdCgpIQotICovCi0gICAgdm9pZAotbWNoX2V4aXQoaW50IHIpCi17Ci0gICAgc2V0dG1vZGUoVE1PREVfQ09PSyk7Ci0gICAgc3RvcHRlcm1jYXAoKTsKLSAgICBzZXRfaW50ZXJydXB0cyhGQUxTRSk7CSAgICAvKiByZXN0b3JlIGludGVycnVwdHMgKi8KLSNpZmRlZiBESkdQUAotICAgIHNldF9zeXNfY3Vyc29yKCk7Ci0jZW5kaWYKLSAgICAvKiBTb21laG93IG91dHB1dHRpbmcgQ1ItTkwgY2F1c2VzIHRoZSBvcmlnaW5hbCBjb2xvcnMgdG8gYmUgcmVzdG9yZWQgKi8KLSAgICBvdXRfY2hhcignXHInKTsKLSAgICBvdXRfY2hhcignXG4nKTsKLSAgICBvdXRfZmx1c2goKTsKLSAgICBtbF9jbG9zZV9hbGwoVFJVRSk7CQkgICAgLyogcmVtb3ZlIGFsbCBtZW1maWxlcyAqLwotI2lmZGVmIE1DSF9DVVJTT1JfU0hBUEUKLSAgICBtY2hfcmVzdG9yZV9jdXJzb3Jfc2hhcGUoVFJVRSk7Ci0jZW5kaWYKLSAgICBleGl0KHIpOwotfQotCi0vKgotICogc2V0IHRoZSB0dHkgaW4gKHJhdykgPyAicmF3IiA6ICJjb29rZWQiIG1vZGUKLSAqIERvZXMgbm90IGNoYW5nZSB0aGUgdHR5LCBhcyBiaW9za2V5KCkgYW5kIGtiaGl0KCkgd29yayByYXcgYWxsIHRoZSB0aW1lLgotICovCi0gICAgdm9pZAotbWNoX3NldHRtb2RlKGludCB0bW9kZSkKLXsKLX0KLQotI2lmZGVmIEZFQVRfTU9VU0UKLSAgICB2b2lkCi1tY2hfc2V0bW91c2UoaW50IG9uKQotewotICAgIG1vdXNlX2FjdGl2ZSA9IG9uOwotICAgIG1vdXNlX2hpZGRlbiA9IFRSVUU7CS8qIGRvbid0IHNob3cgaXQgdW50aWwgbW92ZWQgKi8KLX0KLSNlbmRpZgotCi0vKgotICogc2V0IHNjcmVlbiBtb2RlCi0gKiByZXR1cm4gRkFJTCBmb3IgZmFpbHVyZSwgT0sgb3RoZXJ3aXNlCi0gKi8KLSAgICBpbnQKLW1jaF9zY3JlZW5tb2RlKGNoYXJfdSAqYXJnKQotewotICAgIGludAkJICAgIG1vZGU7Ci0gICAgaW50CQkgICAgaTsKLSAgICBzdGF0aWMgY2hhcgkgICAqKG5hbWVzW10pID0geyJCVzQwIiwgIkM0MCIsICJCVzgwIiwgIkM4MCIsICJNT05PIiwgIkM0MzUwIn07Ci0gICAgc3RhdGljIGludAkgICAgbW9kZXNbXSAgID0geyBCVzQwLAkgIEM0MCwJIEJXODAsCSBDODAsCU1PTk8sCUM0MzUwfTsKLQotICAgIG1vZGUgPSAtMTsKLSAgICBpZiAoVklNX0lTRElHSVQoKmFyZykpCQkgICAgLyogbW9kZSBudW1iZXIgZ2l2ZW4gKi8KLQltb2RlID0gYXRvaSgoY2hhciAqKWFyZyk7Ci0gICAgZWxzZQotICAgIHsKLQlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKG5hbWVzKSAvIHNpemVvZihjaGFyX3UgKik7ICsraSkKLQkgICAgaWYgKHN0cmljbXAobmFtZXNbaV0sIChjaGFyICopYXJnKSA9PSAwKQotCSAgICB7Ci0JCW1vZGUgPSBtb2Rlc1tpXTsKLQkJYnJlYWs7Ci0JICAgIH0KLSAgICB9Ci0gICAgaWYgKG1vZGUgPT0gLTEpCi0gICAgewotCUVNU0coIkUzNjI6IFVuc3VwcG9ydGVkIHNjcmVlbiBtb2RlIik7Ci0JcmV0dXJuIEZBSUw7Ci0gICAgfQotICAgIHRleHRtb2RlKG1vZGUpOwkJICAgIC8qIHVzZSBCb3JsYW5kIGZ1bmN0aW9uICovCi0jaWZkZWYgREpHUFAKLSAgICAvKiBiYXNlIGFkZHJlc3MgbWF5IGhhdmUgY2hhbmdlZCAqLwotICAgIGdldF9zY3JlZW5iYXNlKCk7Ci0jZW5kaWYKLQotICAgIC8qIFNjcmVlbiBjb2xvcnMgbWF5IGhhdmUgY2hhbmdlZC4gKi8KLSAgICBvdXRfc3RyKFRfTUUpOwotCi0jaWZkZWYgRkVBVF9NT1VTRQotICAgIGlmIChtb2RlIDw9IDEgfHwgbW9kZSA9PSA0IHx8IG1vZGUgPT0gNSB8fCBtb2RlID09IDEzIHx8IG1vZGUgPT0gMHgxMykKLQltb3VzZV94X2RpdiA9IDE2OwotICAgIGVsc2UKLQltb3VzZV94X2RpdiA9IDg7Ci0gICAgaWYgKG1vZGUgPT0gMHgxMSB8fCBtb2RlID09IDB4MTIpCi0JbW91c2VfeV9kaXYgPSAxNjsKLSAgICBlbHNlIGlmIChtb2RlID09IDB4MTApCi0JbW91c2VfeV9kaXYgPSAxNDsKLSAgICBlbHNlCi0JbW91c2VfeV9kaXYgPSA4OwotICAgIHNoZWxsX3Jlc2l6ZWQoKTsKLSNlbmRpZgotICAgIHJldHVybiBPSzsKLX0KLQotLyoKLSAqIFN0cnVjdHVyZSB1c2VkIGJ5IFR1cmJvLUMvQm9ybGFuZC1DIHRvIHN0b3JlIHZpZGVvIHBhcmFtZXRlcnMuCi0gKi8KLSNpZm5kZWYgREpHUFAKLWV4dGVybiBzdHJ1Y3QgdGV4dF9pbmZvIF92aWRlbzsKLSNlbmRpZgotCi0vKgotICogdHJ5IHRvIGdldCB0aGUgcmVhbCB3aW5kb3cgc2l6ZQotICogcmV0dXJuIEZBSUwgZm9yIGZhaWx1cmUsIE9LIG90aGVyd2lzZQotICovCi0gICAgaW50Ci1tY2hfZ2V0X3NoZWxsc2l6ZSh2b2lkKQotewotICAgIHN0cnVjdCB0ZXh0X2luZm8gdGV4dGluZm87Ci0KLSAgICAvKgotICAgICAqIFRoZSBzY3JlZW53aWR0aCBpcyByZXR1cm5lZCBieSB0aGUgQklPUyBPSy4KLSAgICAgKiBUaGUgc2NyZWVuaGVpZ2h0IGlzIGluIGEgbG9jYXRpb24gaW4gdGhlIGJpb3MgUkFNLCBpZiB0aGUgZGlzcGxheSBpcwotICAgICAqIEVHQSBvciBWR0EuCi0gICAgICovCi0gICAgaWYgKCF0ZXJtX2NvbnNvbGUpCi0JcmV0dXJuIEZBSUw7Ci0gICAgZ2V0dGV4dGluZm8oJnRleHRpbmZvKTsKLSAgICBDb2x1bW5zID0gdGV4dGluZm8uc2NyZWVud2lkdGg7Ci0gICAgUm93cyA9IHRleHRpbmZvLnNjcmVlbmhlaWdodDsKLSNpZm5kZWYgREpHUFAKLSAgICBpZiAodGV4dGluZm8uY3Vycm1vZGUgPiAxMCkKLQlSb3dzID0gKihjaGFyIGZhciAqKU1LX0ZQKDB4NDAsIDB4ODQpICsgMTsKLSNlbmRpZgotCi0gICAgaWYgKENvbHVtbnMgPCBNSU5fQ09MVU1OUyB8fCBSb3dzIDwgTUlOX0xJTkVTKQotICAgIHsKLQkvKiB0aGVzZSB2YWx1ZXMgYXJlIG92ZXJ3cml0dGVuIGJ5IHRlcm1jYXAgc2l6ZSBvciBkZWZhdWx0ICovCi0JQ29sdW1ucyA9IDgwOwotCVJvd3MgPSAyNTsKLQlyZXR1cm4gRkFJTDsKLSAgICB9Ci0jaWZkZWYgREpHUFAKLSAgICBteXRleHRpbml0KCZ0ZXh0aW5mbyk7ICAgLyogQWRkZWQgYnkgSk1MLCAxLzE1Lzk4ICovCi0jZW5kaWYKLQotICAgIHJldHVybiBPSzsKLX0KLQotLyoKLSAqIFNldCB0aGUgYWN0aXZlIHdpbmRvdyBmb3IgZGVsbGluZS9pbnNsaW5lLgotICovCi0gICAgc3RhdGljIHZvaWQKLXNldF93aW5kb3codm9pZCkKLXsKLSAgICBpZiAodGVybV9jb25zb2xlKQotICAgIHsKLSNpZm5kZWYgREpHUFAKLQlfdmlkZW8uc2NyZWVuaGVpZ2h0ID0gUm93czsKLSNlbmRpZgotCW15d2luZG93KDEsIDEsIENvbHVtbnMsIFJvd3MpOwotICAgIH0KLSAgICBzY3JlZW5fc3RhcnQoKTsKLX0KLQotICAgIHZvaWQKLW1jaF9zZXRfc2hlbGxzaXplKHZvaWQpCi17Ci0gICAgLyogU2hvdWxkIHRyeSB0byBzZXQgdGhlIHdpbmRvdyBzaXplIHRvIFJvd3MgYW5kIENvbHVtbnMuCi0gICAgICogTWF5IGludm9sdmUgc3dpdGNoaW5nIGRpc3BsYXkgbW9kZS4uLi4KLSAgICAgKiBXZSBhc3N1bWUgdGhlIHVzZXIga25vd3MgdGhlIHNpemUgYW5kIGp1c3QgdXNlIGl0LiAqLwotfQotCi0vKgotICogUm93cyBhbmQvb3IgQ29sdW1ucyBoYXMgY2hhbmdlZC4KLSAqLwotICAgIHZvaWQKLW1jaF9uZXdfc2hlbGxzaXplKHZvaWQpCi17Ci0jaWZkZWYgRkVBVF9NT1VTRQotICAgIC8qIGJlc3QgZ3Vlc3MgZm9yIG1vdXNlIGNvb3JkaW5hdGUgY29tcHV0YXRpb25zICovCi0gICAgaWYgKENvbHVtbnMgPD0gNDApCi0JbW91c2VfeF9kaXYgPSAxNjsKLSAgICBpZiAoUm93cyA9PSAzMCkKLQltb3VzZV95X2RpdiA9IDE2OwotI2VuZGlmCi0gICAgc2V0X3dpbmRvdygpOwotI2lmZGVmIEZFQVRfTU9VU0UKLSAgICBtb3VzZV9hcmVhKCk7CS8qIHNldCBhcmVhIHdoZXJlIG1vdXNlIGNhbiBnbyAqLwotI2VuZGlmCi19Ci0KLSNpZiBkZWZpbmVkKERKR1BQKSB8fCBkZWZpbmVkKFBST1RPKQotLyoKLSAqIENoZWNrIHRoZSBudW1iZXIgb2YgQ29sdW1ucyB3aXRoIGEgQklPUyBjYWxsLiAgVGhpcyBhdm9pZHMgYSBjcmFzaCBvZiB0aGUKLSAqIERPUyBjb25zb2xlIHdoZW4gJ2NvbHVtbnMnIGlzIHNldCB0byBhIHRvbyBsYXJnZSB2YWx1ZS4KLSAqLwotICAgIHZvaWQKLW1jaF9jaGVja19jb2x1bW5zKHZvaWQpCi17Ci0gICAgc3RhdGljIHVuaW9uIFJFR1MJcmVnczsKLQotICAgIHJlZ3MuaC5haCA9IDB4MGY7Ci0gICAgKHZvaWQpaW50ODYoMHgxMCwgJnJlZ3MsICZyZWdzKTsKLSAgICBpZiAoKHVuc2lnbmVkKUNvbHVtbnMgPiAodW5zaWduZWQpcmVncy5oLmFoKQotCUNvbHVtbnMgPSAodW5zaWduZWQpcmVncy5oLmFoOwotfQotI2VuZGlmCi0KLS8qCi0gKiBjYWxsIHNoZWxsLCByZXR1cm4gRkFJTCBmb3IgZmFpbHVyZSwgT0sgb3RoZXJ3aXNlCi0gKiBvcHRpb25zOiBTSEVMTF8qLCBzZWUgdmltLmguCi0gKi8KLSAgICBpbnQKLW1jaF9jYWxsX3NoZWxsKAotICAgIGNoYXJfdQkqY21kLAotICAgIGludAkJb3B0aW9ucykKLXsKLSAgICBpbnQJCXg7Ci0gICAgaW50CQl0bW9kZSA9IGN1cl90bW9kZTsKLSNpZm5kZWYgREpHUFAKLSAgICBjaGFyX3UJKm5ld2NtZDsKLSNlbmRpZgotCi0gICAgb3V0X2ZsdXNoKCk7Ci0jaWZkZWYgREpHUFAKLSAgICBzZXRfc3lzX2N1cnNvcigpOwotI2VuZGlmCi0KLSAgICBpZiAob3B0aW9ucyAmIFNIRUxMX0NPT0tFRCkKLQlzZXR0bW9kZShUTU9ERV9DT09LKTsJLyogc2V0IHRvIG5vcm1hbCBtb2RlICovCi0gICAgc2V0X2ludGVycnVwdHMoRkFMU0UpOwkvKiByZXN0b3JlIGludGVycnVwdHMgKi8KLQotI2lmZGVmIERKR1BQCi0gICAgLyogaWdub3JlIHNpZ25hbHMgd2hpbGUgZXh0ZXJuYWwgY29tbWFuZCBpcyBydW5uaW5nICovCi0gICAgc2lnbmFsKFNJR0lOVCwgU0lHX0lHTik7Ci0gICAgc2lnbmFsKFNJR0hVUCwgU0lHX0lHTik7Ci0gICAgc2lnbmFsKFNJR1FVSVQsIFNJR19JR04pOwotICAgIHNpZ25hbChTSUdURVJNLCBTSUdfSUdOKTsKLSNlbmRpZgotICAgIGlmIChjbWQgPT0gTlVMTCkKLQl4ID0gc3lzdGVtKChjaGFyICopcF9zaCk7Ci0gICAgZWxzZQotICAgIHsKLSNpZmRlZiBESkdQUAotCS8qCi0JICogVXNlICdzaGVsbCcgZm9yIHN5c3RlbSgpLgotCSAqLwotCXNldGVudigiU0hFTEwiLCAoY2hhciAqKXBfc2gsIDEpOwotCXggPSBzeXN0ZW0oY21kKTsKLSNlbHNlCi0JLyogd2UgdXNlICJjb21tYW5kIiB0byBzdGFydCB0aGUgc2hlbGwsIHNsb3cgYnV0IGVhc3kgKi8KLQluZXdjbWQgPSBhbGxvYyhTVFJMRU4ocF9zaCkgKyBTVFJMRU4ocF9zaGNmKSArIFNUUkxFTihjbWQpICsgMyk7Ci0JaWYgKG5ld2NtZCA9PSBOVUxMKQotCSAgICB4ID0gLTE7Ci0JZWxzZQotCXsKLQkgICAgc3ByaW50ZigoY2hhciAqKW5ld2NtZCwgIiVzICVzICVzIiwgcF9zaCwgcF9zaGNmLCBjbWQpOwotCSAgICB4ID0gc3lzdGVtKChjaGFyICopbmV3Y21kKTsKLQkgICAgdmltX2ZyZWUobmV3Y21kKTsKLQl9Ci0jZW5kaWYKLSAgICB9Ci0jaWZkZWYgREpHUFAKLSAgICBzaWduYWwoU0lHSU5ULCBTSUdfREZMKTsKLSAgICBzaWduYWwoU0lHSFVQLCBTSUdfREZMKTsKLSAgICBzaWduYWwoU0lHUVVJVCwgU0lHX0RGTCk7Ci0gICAgc2lnbmFsKFNJR1RFUk0sIFNJR19ERkwpOwotI2VuZGlmCi0gICAgaWYgKHRtb2RlID09IFRNT0RFX1JBVykKLQlzZXR0bW9kZShUTU9ERV9SQVcpOwkvKiBzZXQgdG8gcmF3IG1vZGUgKi8KLSAgICBzZXRfaW50ZXJydXB0cyhUUlVFKTsJLyogY2F0Y2ggaW50ZXJydXB0cyAqLwotCi0gICAgaWYgKHggJiYgIShvcHRpb25zICYgU0hFTExfU0lMRU5UKSAmJiAhZW1zZ19zaWxlbnQpCi0gICAgewotCU1TR19QVVRTKCJcbnNoZWxsIHJldHVybmVkICIpOwotCW1zZ19vdXRudW0oKGxvbmcpeCk7Ci0JbXNnX3B1dGNoYXIoJ1xuJyk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHg7Ci19Ci0KLS8qCi0gKiBjaGVjayBmb3IgYW4gImludGVycnVwdCBzaWduYWwiOiBDVFJMLWJyZWFrIG9yIENUUkwtQwotICovCi0gICAgdm9pZAotbWNoX2JyZWFrY2hlY2sodm9pZCkKLXsKLSAgICBpZiAoY3RybGNfcHJlc3NlZCkKLSAgICB7Ci0JY3RybGNfcHJlc3NlZCA9IEZBTFNFOwotCWdvdF9pbnQgPSBUUlVFOwotICAgIH0KLX0KLQotLyoKLSAqIFJldHVybiBUUlVFIGlmICJwIiBjb250YWluIGEgd2lsZGNhcmQgdGhhdCBjYW4gYmUgZXhwYW5kZWQgYnkKLSAqIGRvc19leHBhbmRwYXRoKCkuCi0gKi8KLSAgICBpbnQKLW1jaF9oYXNfZXhwX3dpbGRjYXJkKGNoYXJfdSAqcCkKLXsKLSAgICBmb3IgKCA7ICpwOyBtYl9wdHJfYWR2KHApKQotICAgIHsKLQlpZiAodmltX3N0cmNocigoY2hhcl91ICopIj8qWyIsICpwKSAhPSBOVUxMCi0JCXx8ICgqcCA9PSAnficgJiYgcFsxXSAhPSBOVUwpKQotCSAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgcmV0dXJuIEZBTFNFOwotfQotCi0vKgotICogUmV0dXJuIFRSVUUgaWYgInAiIGNvbnRhaW4gYSB3aWxkY2FyZCBvciBhICJ+MSIga2luZCBvZiB0aGluZyAoY291bGQgYmUgYQotICogc2hvcnRlbmVkIGZpbGUgbmFtZSkuCi0gKi8KLSAgICBpbnQKLW1jaF9oYXNfd2lsZGNhcmQoY2hhcl91ICpwKQotewotICAgIGZvciAoIDsgKnA7IG1iX3B0cl9hZHYocCkpCi0gICAgewotCWlmICh2aW1fc3RyY2hyKChjaGFyX3UgKikKLSMgIGlmZGVmIFZJTV9CQUNLVElDSwotCQkJCSAgICAiPyokW2AiCi0jICBlbHNlCi0JCQkJICAgICI/KiRbIgotIyAgZW5kaWYKLQkJCQkJCSwgKnApICE9IE5VTEwKLQkJfHwgKCpwID09ICd+JyAmJiBwWzFdICE9IE5VTCkpCi0JICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICByZXR1cm4gRkFMU0U7Ci19Ci0KLS8qCi0gKiBDaGFuZ2UgZGlyZWN0b3J5IHRvICJwYXRoIi4KLSAqIFRoZSBub3JtYWwgY2hkaXIoKSBkb2VzIG5vdCBjaGFuZ2UgdGhlIGRlZmF1bHQgZHJpdmUuICBUaGlzIG9uZSBkb2VzLgotICogUmV0dXJuIDAgZm9yIHN1Y2Nlc3MsIC0xIGZvciBmYWlsdXJlLgotICovCi0gICAgaW50Ci1tY2hfY2hkaXIoY2hhciAqcGF0aCkKLXsKLSAgICBpZiAocGF0aFswXSA9PSBOVUwpCQkgICAgLyoganVzdCBjaGVja2luZy4uLiAqLwotCXJldHVybiAwOwotICAgIGlmIChwX3ZlcmJvc2UgPj0gNSkKLSAgICB7Ci0JdmVyYm9zZV9lbnRlcigpOwotCXNtc2coKGNoYXJfdSAqKSJjaGRpciglcykiLCBwYXRoKTsKLQl2ZXJib3NlX2xlYXZlKCk7Ci0gICAgfQotICAgIGlmIChwYXRoWzFdID09ICc6JykJCSAgICAvKiBoYXMgYSBkcml2ZSBuYW1lICovCi0gICAgewotCWlmIChjaGFuZ2VfZHJpdmUoVE9MT1dFUl9BU0MocGF0aFswXSkgLSAnYScgKyAxKSkKLQkgICAgcmV0dXJuIC0xOwkJICAgIC8qIGludmFsaWQgZHJpdmUgbmFtZSAqLwotCXBhdGggKz0gMjsKLSAgICB9Ci0gICAgaWYgKCpwYXRoID09IE5VTCkJCSAgICAvKiBkcml2ZSBuYW1lIG9ubHkgKi8KLQlyZXR1cm4gMDsKLSAgICByZXR1cm4gY2hkaXIocGF0aCk7CQkgICAgLyogbGV0IHRoZSBub3JtYWwgY2hkaXIoKSBkbyB0aGUgcmVzdCAqLwotfQotCi0jaWZkZWYgREpHUFAKLS8qCi0gKiBtY2hfcmVuYW1lKCkgd29ya3MgYXJvdW5kIGEgYnVnIGluIHJlbmFtZSAoYWthIE1vdmVGaWxlKSBpbgotICogV2luZG93cyA5NTogcmVuYW1lKCJmb28uYmFyIiwgImZvby5iYXJ+Iikgd2lsbCBnZW5lcmF0ZSBhCi0gKiBmaWxlIHdob3NlIHNob3J0IGZpbGUgbmFtZSBpcyAiRk9PLkJBUiIgKGl0cyBsb25nIGZpbGUgbmFtZSB3aWxsCi0gKiBiZSBjb3JyZWN0OiAiZm9vLmJhcn4iKS4gIEJlY2F1c2UgYSBmaWxlIGNhbiBiZSBhY2Nlc3NlZCBieQotICogZWl0aGVyIGl0cyBTRk4gb3IgaXRzIExGTiwgImZvby5iYXIiIGhhcyBlZmZlY3RpdmVseSBiZWVuCi0gKiByZW5hbWVkIHRvICJmb28uYmFyIiwgd2hpY2ggaXMgbm90IGF0IGFsbCB3aGF0IHdhcyB3YW50ZWQuICBUaGlzCi0gKiBzZWVtcyB0byBoYXBwZW4gb25seSB3aGVuIHJlbmFtaW5nIGZpbGVzIHdpdGggdGhyZWUtY2hhcmFjdGVyCi0gKiBleHRlbnNpb25zIGJ5IGFwcGVuZGluZyBhIHN1ZmZpeCB0aGF0IGRvZXMgbm90IGluY2x1ZGUgIi4iLgotICogV2luZG93cyBOVCBnZXRzIGl0IHJpZ2h0LCBob3dldmVyLCB3aXRoIGFuIFNGTiBvZiAiRk9PfjEuQkFSIi4KLSAqIFRoaXMgd29ya3MgbGlrZSBtY2hfcmVuYW1lIGluIG9zX3dpbjMyLmMsIGJ1dCBpcyBhIGJpdCBzaW1wbGVyLgotICoKLSAqIExpa2UgcmVuYW1lKCksIHJldHVybnMgMCB1cG9uIHN1Y2Nlc3MsIG5vbi16ZXJvIHVwb24gZmFpbHVyZS4KLSAqIFNob3VsZCBwcm9iYWJseSBzZXQgZXJybm8gYXBwcm9wcmlhdGVseSB3aGVuIGVycm9ycyBvY2N1ci4KLSAqLwotCi0gICAgaW50Ci1tY2hfcmVuYW1lKGNvbnN0IGNoYXIgKk9sZEZpbGUsIGNvbnN0IGNoYXIgKk5ld0ZpbGUpCi17Ci0gICAgY2hhcl91ICAqVGVtcEZpbGU7Ci0gICAgaW50CSAgICByZXR2YWw7Ci0gICAgaW50CSAgICBmZDsKLQotICAgIC8qIHJlbmFtZSgpIHdvcmtzIGNvcnJlY3RseSB3aXRob3V0IGxvbmcgZmlsZSBuYW1lcywgc28gdXNlIHRoYXQgKi8KLSAgICBpZiAoIV9VU0VfTEZOKQotCXJldHVybiByZW5hbWUoT2xkRmlsZSwgTmV3RmlsZSk7Ci0KLSAgICBpZiAoKFRlbXBGaWxlID0gYWxsb2MoKHVuc2lnbmVkKShTVFJMRU4oT2xkRmlsZSkgKyAxMykpKSA9PSBOVUxMKQotCXJldHVybiAtMTsKLQotICAgIFNUUkNQWShUZW1wRmlsZSwgT2xkRmlsZSk7Ci0gICAgU1RSQ1BZKGdldHRhaWwoVGVtcEZpbGUpLCAiYXhscXdxaHkuYmF+Iik7Ci0gICAgaWYgKHJlbmFtZShPbGRGaWxlLCBUZW1wRmlsZSkpCi0JcmV0dmFsID0gLTE7Ci0gICAgZWxzZQotICAgIHsKLQkvKiBub3cgY3JlYXRlIGFuIGVtcHR5IGZpbGUgY2FsbGVkIE9sZEZpbGU7IHRoaXMgcHJldmVudHMKLQkgKiB0aGUgb3BlcmF0aW5nIHN5c3RlbSB1c2luZyBPbGRGaWxlIGFzIGFuIGFsaWFzIChTRk4pCi0JICogaWYgd2UncmUgcmVuYW1pbmcgd2l0aGluIHRoZSBzYW1lIGRpcmVjdG9yeS4gIEZvciBleGFtcGxlLAotCSAqIHdlJ3JlIGVkaXRpbmcgYSBmaWxlIGNhbGxlZCBmaWxlbmFtZS5hc2MudHh0IGJ5IGl0cyBTRk4sCi0JICogZmlsZW5hfjEudHh0LiAgSWYgd2UgcmVuYW1lIGZpbGVuYX4xLnR4dCB0byBmaWxlbmF+MS50eHR+Ci0JICogKGkuZS4sIHdlJ3JlIG1ha2luZyBhIGJhY2t1cCB3aGlsZSB3cml0aW5nIGl0KSwgdGhlIFNGTgotCSAqIGZvciBmaWxlbmF+MS50eHR+IHdpbGwgYmUgZmlsZW5hfjEudHh0LCBieSBkZWZhdWx0LCB3aGljaAotCSAqIHdpbGwgY2F1c2UgYWxsIHNvcnRzIG9mIHByb2JsZW1zIGxhdGVyIGluIGJ1Zl93cml0ZSgpLiAgU28sIHdlCi0JICogY3JlYXRlIGFuIGVtcHR5IGZpbGUgY2FsbGVkIGZpbGVuYX4xLnR4dCBhbmQgdGhlIHN5c3RlbSB3aWxsIGhhdmUKLQkgKiB0byBmaW5kIHNvbWUgb3RoZXIgU0ZOIGZvciBmaWxlbmF+MS50eHR+LCBzdWNoIGFzIGZpbGVuYX4yLnR4dAotCSAqLwotCWlmICgoZmQgPSBvcGVuKE9sZEZpbGUsIE9fUkRXUnxPX0NSRUFUfE9fRVhDTCwgMDQ0NCkpIDwgMCkKLQkgICAgcmV0dXJuIC0xOwotCXJldHZhbCA9IHJlbmFtZShUZW1wRmlsZSwgTmV3RmlsZSk7Ci0JY2xvc2UoZmQpOwotCW1jaF9yZW1vdmUoKGNoYXJfdSAqKU9sZEZpbGUpOwotCi0JLyogSWYgcmVuYW1pbmcgdG8gTmV3RmlsZSBmYWlsZWQsIHJlbmFtZSBUZW1wRmlsZSBiYWNrIHRvIE9sZEZpbGUsIHNvCi0JICogdGhhdCBpdCBsb29rcyBsaWtlIG5vdGhpbmcgaGFwcGVuZWQuICovCi0JaWYgKHJldHZhbCkKLQkgICAgcmVuYW1lKFRlbXBGaWxlLCBPbGRGaWxlKTsKLSAgICB9Ci0gICAgdmltX2ZyZWUoVGVtcEZpbGUpOwotCi0gICAgcmV0dXJuIHJldHZhbDsgIC8qIHN1Y2Nlc3MgKi8KLX0KLSNlbmRpZgotCi0jaWYgZGVmaW5lZChESkdQUCkgfHwgZGVmaW5lZChQUk9UTykKLS8qCi0gKiBzZXRsb2NhbGUoKSBmb3IgREpHUFAgd2l0aCBNUy1ET1MgY29kZXBhZ2Ugc3VwcG9ydAotICogQXV0aG9yOiBDeXJpbCBTbG9iaW4gPHNsb2JpbkBmZS5tc2sucnU+Ci0gKgotICogU2NhbGVkIGRvd24gYSBsb3QgZm9yIHVzZSBieSBWaW06IE9ubHkgc3VwcG9ydCBzZXRsb2NhbGUoTENfQUxMLCAiIikuCi0gKi8KLQotI3VuZGVmIHNldGxvY2FsZQotCi0jaWZuZGVmIFBST1RPCi0jIGluY2x1ZGUgPGdvMzIuaD4KLSMgaW5jbHVkZSA8aW5saW5lcy9jdHlwZS5oYT4KLSNlbmRpZgotI2luY2x1ZGUgPGxvY2FsZS5oPgotCi0jZGVmaW5lIFVQQ0FTRSAoX19kal9JU0FMTlVNIHwgX19kal9JU0FMUEhBIHwgX19kal9JU0dSQVBIIHwgX19kal9JU1BSSU5UIHwgX19kal9JU1VQUEVSKQotI2RlZmluZSBMT0NBU0UgKF9fZGpfSVNBTE5VTSB8IF9fZGpfSVNBTFBIQSB8IF9fZGpfSVNHUkFQSCB8IF9fZGpfSVNQUklOVCB8IF9fZGpfSVNMT1dFUikKLQotICAgIGNoYXIgKgotZGpncHBfc2V0bG9jYWxlKHZvaWQpCi17Ci0gICAgX19kcG1pX3JlZ3MgcmVnczsKLSAgICBzdHJ1Y3QgeyBjaGFyIGlkOyB1bnNpZ25lZCBzaG9ydCBvZmYsIHNlZzsgfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgaW5mbzsKLSAgICB1bnNpZ25lZCBjaGFyIGJ1ZmZlclsweDgyXSwgbG93ZXIsIHVwcGVyOwotICAgIGludCBpOwotCi0gICAgcmVncy54LmF4ID0gMHg2NTAyOwotICAgIHJlZ3MueC5ieCA9IDB4ZmZmZjsKLSAgICByZWdzLnguZHggPSAweGZmZmY7Ci0gICAgcmVncy54LmN4ID0gNTsKLSAgICByZWdzLnguZXMgPSBfX3RiID4+IDQ7Ci0gICAgcmVncy54LmRpID0gX190YiAmIDB4ZjsKLQotICAgIF9fZHBtaV9pbnQoMHgyMSwgJnJlZ3MpOwotCi0gICAgaWYgKHJlZ3MueC5mbGFncyAmIDEpCi0JcmV0dXJuIE5VTEw7Ci0KLSAgICBkb3NtZW1nZXQoX190YiwgNSwgJmluZm8pOwotICAgIGRvc21lbWdldCgoaW5mby5zZWcgPDwgNCkgKyBpbmZvLm9mZiwgMHg4MiwgYnVmZmVyKTsKLQotICAgIGlmICgqKHNob3J0ICopYnVmZmVyICE9IDB4ODApCi0JcmV0dXJuIE5VTEw7Ci0KLSAgICAvKiBGaXggcHJvYmxlbSBvZiB1bmRlcnNjb3JlcyBiZWluZyByZXBsYWNlZCB3aXRoIHktdW1sYXV0LiAoTGV2aW4pICovCi0gICAgaWYgKGJ1ZmZlclsyNl0gPT0gMHg1ZikKLQlidWZmZXJbMjZdID0gMHg5ODsKLQotICAgIGZvciAoaSA9IDA7IGkgPCAweDgwOyBpKyspCi0gICAgewotCWxvd2VyID0gaSArIDB4ODA7Ci0JdXBwZXIgPSAoYnVmZmVyKzIpW2ldOwotCWlmIChsb3dlciAhPSB1cHBlcikKLQl7Ci0JICAgIF9fZGpfY3R5cGVfZmxhZ3NbbG93ZXIrMV0gPSBMT0NBU0U7Ci0JICAgIF9fZGpfY3R5cGVfdG91cHBlcltsb3dlcisxXSA9IHVwcGVyOwotCSAgICBpZiAoX19kal9jdHlwZV9mbGFnc1t1cHBlcisxXSA9PSAwKQotCQlfX2RqX2N0eXBlX2ZsYWdzW3VwcGVyKzFdID0gVVBDQVNFOwotCSAgICBpZiAoX19kal9jdHlwZV90b2xvd2VyW3VwcGVyKzFdID09IHVwcGVyKQotCQlfX2RqX2N0eXBlX3RvbG93ZXJbdXBwZXIrMV0gPSBsb3dlcjsKLQl9Ci0gICAgfQotCi0gICAgcmV0dXJuICJDIjsKLX0KLQotI2lmIGRlZmluZWQoRkVBVF9DTElQQk9BUkQpIHx8IGRlZmluZWQoUFJPVE8pCi0KLS8qCi0gKiBDbGlwYm9hcmQgc3R1ZmYsIGZvciBjdXR0aW5nIGFuZCBwYXN0aW5nIHRleHQgdG8gb3RoZXIgd2luZG93cy4KLSAqCi0gKiBJbXBsZW1lbnRhdGlvbiBvZiBET1MvV2luZG93cyBjbGlwYm9hcmQgZGF0YSB0cmFuc2ZlcgotICogYnkgRGF2aWQgS290Y2hhbiAoZGtvdGNoYW5Ac3ltcGF0aWNvLmNhKQotICovCi0KLSNkZWZpbmUgQ0ZfVEVYVAkgICAgMHgwMSAgICAvKiBXaW5kb3dzIGNsaXBib2FyZCBmb3JtYXQ6IFdpbmRvd3MgKEFOU0kpIHRleHQgKi8KLSNkZWZpbmUgQ0ZfT0VNVEVYVCAgMHgwNyAgICAvKiBXaW5kb3dzIGNsaXBib2FyZCBmb3JtYXQ6IE9FTSAoRE9TKSB0ZXh0ICovCi0jZGVmaW5lIENGX1ZJTUNMSVAgIDB4MDQgICAgLyogdHJpY2s6IFNZTEsgY2xpcGJvYXJkIGZvcm1hdCBmb3IgVmltQ2xpcGJvYXJkICovCi0KLXN0YXRpYyBpbnQgV2luMTZPcGVuQ2xpcGJvYXJkKHZvaWQpOwotc3RhdGljIGludCBXaW4xNkNsb3NlQ2xpcGJvYXJkKHZvaWQpOwotc3RhdGljIGludCBXaW4xNkVtcHR5Q2xpcGJvYXJkKHZvaWQpOwotc3RhdGljIGNoYXJfdSAqV2luMTZHZXRDbGlwYm9hcmREYXRhKGludCBjbGlwX2RhdGFfZm9ybWF0KTsKLXN0YXRpYyBpbnQgV2luMTZTZXRDbGlwYm9hcmREYXRhKGludCBjbGlwX2RhdGFfZm9ybWF0LCBjaGFyX3UgKmNsaXBfZGF0YSwgaW50IGNsaXBfZGF0YV9zaXplLCBpbnQgY2xpcF9kYXRhX3R5cGUpOwotCi0vKgotICogTWFrZSB2aW0gdGhlIG93bmVyIG9mIHRoZSBjdXJyZW50IHNlbGVjdGlvbi4gIFJldHVybiBPSyB1cG9uIHN1Y2Nlc3MuCi0gKi8KLSAgICBpbnQKLWNsaXBfbWNoX293bl9zZWxlY3Rpb24oVmltQ2xpcGJvYXJkICpjYmQpCi17Ci0gICAgLyoKLSAgICAgKiBOZXZlciBhY3R1YWxseSBvd24gdGhlIGNsaXBib2FyZC4gIElmIGFub3RoZXIgYXBwbGljYXRpb24gc2V0cyB0aGUKLSAgICAgKiBjbGlwYm9hcmQsIHdlIGRvbid0IHdhbnQgdG8gdGhpbmsgdGhhdCB3ZSBzdGlsbCBvd24gaXQuCi0gICAgICovCi0gICAgcmV0dXJuIEZBSUw7Ci19Ci0KLS8qCi0gKiBNYWtlIHZpbSBOT1QgdGhlIG93bmVyIG9mIHRoZSBjdXJyZW50IHNlbGVjdGlvbi4KLSAqLwotICAgIHZvaWQKLWNsaXBfbWNoX2xvc2Vfc2VsZWN0aW9uKFZpbUNsaXBib2FyZCAqY2JkKQotewotICAgIC8qIE5vdGhpbmcgbmVlZHMgdG8gYmUgZG9uZSBoZXJlICovCi19Ci0KLS8qCi0gKiBSZWFkIHRoZSBXaW5kb3dzIGNsaXBib2FyZCB0ZXh0IGFuZCBwdXQgaXQgaW4gVmltJ3MgY2xpcGJvYXJkIHJlZ2lzdGVyLgotICovCi0gICAgdm9pZAotY2xpcF9tY2hfcmVxdWVzdF9zZWxlY3Rpb24oVmltQ2xpcGJvYXJkICpjYmQpCi17Ci0gICAgaW50CQl0eXBlID0gTUFVVE87Ci0gICAgY2hhcl91CSpwQWxsb2NhdGVkID0gTlVMTDsKLSAgICBjaGFyX3UJKnBDbGlwVGV4dCA9IE5VTEw7Ci0gICAgaW50CQljbGlwX2RhdGFfZm9ybWF0ID0gMDsKLQotICAgIGlmIChXaW4xNk9wZW5DbGlwYm9hcmQoKSkKLSAgICB7Ci0JLyogQ2hlY2sgZm9yIFZpbSdzIG93biBjbGlwYm9hcmQgZm9ybWF0IGZpcnN0LiAgVGhlIENGX1ZJTUNMSVAgZm9ybWF0Ci0JICogaXMganVzdCBvcmRpbmFyeSB0ZXh0IChsaWtlIENGX1RFWFQpIGV4Y2VwdCBwcmVwZW5kZWQgYnkgdGhlCi0JICogc2VsZWN0aW9uIHR5cGUgKGFzIGEgc2luZ2xlIGNoYXJhY3RlcikuICBOb3RlIHRoYXQgdW5kZXIgRE9TIHdlCi0JICogYWN0dWFsbHkgY2Fubm90IGRlZmluZSBhIGN1c3RvbSBDRl9WSU1DTElQIGNsaXBib2FyZCBmb3JtYXQ7IHdlCi0JICogdXNlIGluc3RlYWQgb25lIG9mIHRoZSBleGlzdGluZyBXaW5kb3dzLWRlZmluZWQgZm9ybWF0cywgdXN1YWxseQotCSAqICJESUYiIG9yICJTWUxLIi4gIFNlZSBXaW4xNkdldENsaXBib2FyZERhdGEoKSBmb3IgZGV0YWlscy4KLQkgKgotCSAqIE5vdGUgdGhhdCBXaW4xNkdldENsaXBib2FyZERhdGEoKSByZXR1cm5zIHRoZSBhZGRyZXNzIG9mIHRoZSBtZW1vcnkKLQkgKiBibG9jayBpdCBhbGxvY2F0ZWQuICBUaGlzIGlzIG5vdCBuZWNlc3NhcnkgdGhlIHN0YXJ0IG9mIHRoZQotCSAqIGNsaXBib2FyZCB0ZXh0IGRhdGE6IHRoZXJlIG1heSBiZSBvdGhlciBieXRlcyBhaGVhZCBvZiB0aGUKLQkgKiB0ZXh0IChwYXJ0aWN1bGFybHkgZm9yIENGX1ZJTUNMSVApIHdoaWNoIGFyZSB1c2VkIGZvciBkYXRhCi0JICogbWFuYWdlbWVudC4gIFNvIHBDbGlwVGV4dCBpcyBub3QgbmVjZXNzYXJpbHkgPT0gcEFsbG9jYXRlZC4KLQkgKi8KLQotCWlmICgocEFsbG9jYXRlZCA9IFdpbjE2R2V0Q2xpcGJvYXJkRGF0YShDRl9WSU1DTElQKSkgIT0gTlVMTCkKLQl7Ci0JICAgIGNsaXBfZGF0YV9mb3JtYXQgPSBDRl9WSU1DTElQOwotCSAgICBwQ2xpcFRleHQgPSBwQWxsb2NhdGVkOwotCi0JICAgIHN3aXRjaCAoKnBDbGlwVGV4dCsrKQkvKiBhZnRlciArKywgcENsaXBUZXh0IHBvaW50cyB0byB0ZXh0ICovCi0JICAgIHsKLQkJZGVmYXVsdDoKLQkJY2FzZSAnTCc6CXR5cGUgPSBNTElORTsJYnJlYWs7Ci0JCWNhc2UgJ0MnOgl0eXBlID0gTUNIQVI7CWJyZWFrOwotCQljYXNlICdCJzoJdHlwZSA9IE1CTE9DSzsJYnJlYWs7Ci0JICAgIH0KLQl9Ci0KLQkvKiBPdGhlcndpc2UsIGNoZWNrIGZvciB0aGUgbm9ybWFsIFdpbmRvd3MgdGV4dCBmb3JtYXRzLiAgVGhlcmUgYXJlCi0JICogdHdvIG9mIHRoZXNlOiBDRl9URVhUIChjb21tb24pIGFuZCBDRl9PRU1URVhUICh1c2VkIGZvciBET1MKLQkgKiBjb21wYXRpYmlsaXR5KS4gIEV4cGVyaW1lbnRzIHNob3cgdGhhdCwgdW5kZXIgdGhlIERPUy9XaW5kb3dzCi0JICogY2xpcGJvYXJkIGludGVyZmFjZSwgd3JpdGluZyBDRl9URVhUIGRhdGEgdG8gdGhlIGNsaXBib2FyZAotCSAqIGF1dG9tYXRpY2FsbHkgY3JlYXRlcyBhIENGX09FTVRFWFQgZm9ybWF0IGFzIHdlbGwuCi0JICovCi0KLQllbHNlIGlmICgocEFsbG9jYXRlZCA9IFdpbjE2R2V0Q2xpcGJvYXJkRGF0YShDRl9URVhUKSkgIT0gTlVMTCkKLQl7Ci0JICAgIGNsaXBfZGF0YV9mb3JtYXQgPSBDRl9URVhUOwotCSAgICBwQ2xpcFRleHQgPSBwQWxsb2NhdGVkOwotCX0KLQotCWVsc2UgaWYgKChwQWxsb2NhdGVkID0gV2luMTZHZXRDbGlwYm9hcmREYXRhKENGX09FTVRFWFQpKSAhPSBOVUxMKQotCXsKLQkgICAgY2xpcF9kYXRhX2Zvcm1hdCA9IENGX09FTVRFWFQ7Ci0JICAgIHBDbGlwVGV4dCA9IHBBbGxvY2F0ZWQ7Ci0JfQotCi0JLyogRGlkIHdlIGdldCBhbnl0aGluZz8gKi8KLQotCWlmIChwQ2xpcFRleHQgIT0gTlVMTCkKLQl7Ci0JICAgIGNoYXJfdSAqcERlc3Q7Ci0JICAgIGNoYXJfdSAqcFN0YXJ0OwotCSAgICBjaGFyX3UgKnBFbmQ7Ci0KLQkgICAgbG9uZ191IGNsaXBfZGF0YV9zaXplID0gMDsKLQotCSAgICAvKiBUaGUgV2luZG93cyBjbGlwYm9hcmQgbm9ybWFsbHkgc3RvcmVzIGl0cyB0ZXh0IGxpbmVzIHRlcm1pbmF0ZWQKLQkgICAgICogYnkgPENSPjxOTD4uICBCdXQgVmltIHVzZXMgb25seSA8Tkw+LCBzbyB0cmFuc2xhdGUgdGhlIDxDUj48Tkw+Ci0JICAgICAqIGludG8gPE5MPi4gIEFsc28sIHdhdGNoIGZvciBwb3NzaWJsZSBudWxsIGJ5dGVzIGF0IHRoZSBlbmQgb2YKLQkgICAgICogcENsaXBUZXh0LiAgVGhlc2UgYXJlIHBhZGRpbmcgYWRkZWQgYnkgImdldF9jbGlwYm9hcmRfZGF0YSIKLQkgICAgICogKGludCAweDJmLCBBWD0gMHgxNzA1KSBpbiBvcmRlciB0byByb3VuZCB0aGUgZGF0YSBzaXplIHVwIHRvIHRoZQotCSAgICAgKiBuZXh0IG11bHRpcGxlIG9mIDMyIGJ5dGVzLiAgU2VlIFdpbjE2R2V0Q2xpcGJvYXJkRGF0YSgpIGZvcgotCSAgICAgKiBkZXRhaWxzLgotCSAgICAgKi8KLQotCSAgICBwRGVzdCA9IHN0cnN0ciggcENsaXBUZXh0LCAiXHJcbiIgKTsgICAgLyogZmluZCBmaXJzdCA8Q1I+PE5MPiAqLwotCi0JICAgIGlmIChwRGVzdCAhPSBOVUxMKQkJCS8qIGZvdW5kIG9uZT8gKi8KLQkgICAgewotCQlwU3RhcnQgPSBwRGVzdCArIDE7CQkvKiBwb2ludHMgdG8gPE5MPiBhZnRlciA8Q1I+ICovCi0JCXBFbmQgPSBzdHJzdHIoIHBTdGFydCwgIlxyXG4iICk7LyogZmluZCBuZXh0IDxDUj48Tkw+ICovCi0KLQkJd2hpbGUgKHBFbmQgIT0gTlVMTCkJCS8qIGZvdW5kIG9uZT8gKi8KLQkJewotCQkgICAgbWVtbW92ZShwRGVzdCwgcFN0YXJ0LCAobG9uZykocEVuZCAtIHBTdGFydCkpOwotCQkJCQkJCS8qIGV4Y2x1ZGUgPENSPiAqLwotCQkgICAgcERlc3QgKz0gKGxvbmcpKHBFbmQgLSBwU3RhcnQpOwkvKiBuZXcgZGVzdGluYXRpb24gKi8KLQkJICAgIHBTdGFydCA9IHBFbmQgKyAxOwkJCS8qIG5ldyBzdGFydGluZyBwb2ludCAqLwotCQkgICAgcEVuZCA9IHN0cnN0cihwU3RhcnQsICJcclxuIik7CS8qIGZpbmQgbmV4dCA8Q1I+PE5MPiAqLwotCQl9Ci0KLQkJLyogRmVsbCBvdXQgb2Ygd2hpbGUoKSBsb29wOiBubyBtb3JlIDxDUj48Tkw+IHBhaXJzLiAgSnVzdCBjb3B5Ci0JCSAqIHRoZSByZXN0IG9mIHRoZSBkYXRhLCB1cCB0byB0aGUgZmlyc3QgbnVsbCBieXRlLiAgKi8KLQkJcEVuZCA9IHN0cmNocihwU3RhcnQsICdcMCcpOwkJLyogZmluZCBmaXJzdCBudWxsICovCi0KLQkJbWVtbW92ZShwRGVzdCwgcFN0YXJ0LCAobG9uZykocEVuZCAtIHBTdGFydCkpOyAvKiBleGNsdWRlIG51bCAqLwotCQlwRGVzdCArPSAobG9uZykocEVuZCAtIHBTdGFydCk7Ci0JCSpwRGVzdCA9ICdcMCc7CQkJCSAgICAvKiB0ZXJtaW5hdGUgKi8KLQotCQkvKiBOb3cgdGhhdCBhbGwgPENSPjxOTD4gcGFpcnMgaGF2ZSBiZWVuICJjb21wcmVzc2VkIiBpbnRvIGp1c3QKLQkJICogPE5MPidzLCBkZXRlcm1pbmUgdGhlIHRydWUgdGV4dCBsZW5ndGguICAqLwotCQljbGlwX2RhdGFfc2l6ZSA9IChsb25nX3UpKHBEZXN0IC0gcENsaXBUZXh0KTsKLQkgICAgfQotCSAgICBlbHNlCi0JICAgIHsKLQkJLyogbm8gPENSPjxOTD4gcGFpcnMgYXQgYWxsICovCi0JCS8qIFNpbmNlIHRoZSBkYXRhIG1heSBoYXZlIGJlZW4gcGFkZGVkIHdpdGggdHJhaWxpbmcgbnVsbHMsCi0JCSAqIGRldGVybWluZSB0aGUgdHJ1ZSBzdHJpbmcgbGVuZ3RoLiAqLwotCQljbGlwX2RhdGFfc2l6ZSA9IFNUUkxFTihwQ2xpcFRleHQpOwkvKiB0cnVlIGRhdGEgbGVuZ3RoICovCi0JICAgIH0KLQotCSAgICAvKiBDb3B5IHRoZSBjbGVhbmVkLXVwIGRhdGEgb3ZlciB0byBWaW0ncyBjbGlwYm9hcmQgIioiIHJlZ2lzdGVyLiAqLwotCSAgICBjbGlwX3lhbmtfc2VsZWN0aW9uKHR5cGUsIHBDbGlwVGV4dCwgY2xpcF9kYXRhX3NpemUsIGNiZCk7Ci0KLQkgICAgLyogRnJlZSB0aGUgbWVtb3J5IHRoYXQgV2luMTZHZXRDbGlwYm9hcmREYXRhKCkgYWxsb2NhdGVkLiAqLwotCSAgICB2aW1fZnJlZShwQWxsb2NhdGVkKTsKLQl9Ci0KLQlXaW4xNkNsb3NlQ2xpcGJvYXJkKCk7Ci0KLSAgICB9ICAvLyBlbmQgaWYgKFdpbjE2T3BlbkNsaXBib2FyZCgpKQotfQotCi0vKgotICogU2VuZCB0aGUgY3VycmVudGx5IHNlbGVjdGVkIFZpbSB0ZXh0IHRvIHRoZSBXaW5kb3dzIGNsaXBib2FyZC4KLSAqLwotICAgIHZvaWQKLWNsaXBfbWNoX3NldF9zZWxlY3Rpb24oIFZpbUNsaXBib2FyZCAqY2JkICkKLXsKLSAgICBjaGFyX3UJKnBDbGlwRGF0YSA9IE5VTEw7Ci0gICAgbG9uZ191CWNsaXBfZGF0YV9zaXplOwotICAgIGludAkJY2xpcF9kYXRhX3R5cGU7Ci0KLSAgICAvKiBJZiB0aGUgJyonIHJlZ2lzdGVyIGlzbid0IGFscmVhZHkgZmlsbGVkIGluLCBmaWxsIGl0IGluIG5vdy4gKi8KLSAgICBjYmQtPm93bmVkID0gVFJVRTsKLSAgICBjbGlwX2dldF9zZWxlY3Rpb24oY2JkKTsKLSAgICBjYmQtPm93bmVkID0gRkFMU0U7Ci0KLSAgICAvKgotICAgICAqIGNsaXBfY29udmVydF9zZWxlY3Rpb24oKSByZXR1cm5zIGEgcG9pbnRlciB0byBhIGJ1ZmZlciBjb250YWluaW5nCi0gICAgICogdGhlIHRleHQgdG8gc2VuZCB0byB0aGUgV2luZG93cyBjbGlwYm9hcmQsIHRvZ2V0aGVyIHdpdGggYSBjb3VudAotICAgICAqIG9mIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyAoYnl0ZXMpIGluIHRoZSBidWZmZXIuICBUaGUgZnVuY3Rpb24ncwotICAgICAqIHJldHVybiB2YWx1ZSBpcyB0aGUgJ3R5cGUnIG9mIHNlbGVjdGlvbjogTUxJTkUsIE1DSEFSLCBvciBNQkxPQ0s7Ci0gICAgICogb3IgLTEgZm9yIGZhaWx1cmUuCi0gICAgICovCi0gICAgY2xpcF9kYXRhX3R5cGUgPSBjbGlwX2NvbnZlcnRfc2VsZWN0aW9uKCZwQ2xpcERhdGEsICZjbGlwX2RhdGFfc2l6ZSwgY2JkKTsKLQotICAgIGlmIChjbGlwX2RhdGFfdHlwZSA8IDApCSAgICAvKiBjb3VsZCBub3QgY29udmVydD8gKi8KLQlyZXR1cm47CQkJICAgIC8qIGVhcmx5IGV4aXQgKi8KLQotICAgIGlmIChXaW4xNk9wZW5DbGlwYm9hcmQoKSkKLSAgICB7Ci0JaWYgKFdpbjE2RW1wdHlDbGlwYm9hcmQoKSkKLQl7Ci0JICAgIGludCBzZW50T0s7Ci0KLQkgICAgc2VudE9LID0gV2luMTZTZXRDbGlwYm9hcmREYXRhKENGX1RFWFQsIHBDbGlwRGF0YSwKLQkJCQkJICAgICAgY2xpcF9kYXRhX3NpemUsIGNsaXBfZGF0YV90eXBlKTsKLQkgICAgc2VudE9LID0gV2luMTZTZXRDbGlwYm9hcmREYXRhKENGX1ZJTUNMSVAsCi0JCQkgcENsaXBEYXRhLCBjbGlwX2RhdGFfc2l6ZSwgY2xpcF9kYXRhX3R5cGUpICYmIHNlbnRPSzsKLQotCSAgICBpZiAoIXNlbnRPSykKLQkgICAgewotCQkvKiBvbmUgb3IgYm90aCBvZiBXaW4xNlNldENsaXBib2FyZERhdGEoKSBmYWlsZWQuICovCi0JCS8qIFRlY2huaWNhbGx5IHdlIGRvbid0IGtub3cgd2h5IFdpbjE2U2V0Q2xpcGJvYXJkRGF0YSgpCi0JCSAqIGZhaWxlZCwgYnV0IGFsbW9zdCBhbHdheXMgaXQgd2lsbCBiZSBiZWNhdXNlIHRoZXJlIHdhc24ndAotCQkgKiBlbm91Z2ggRE9TIG1lbW9yeSB0byBidWZmZXIgdGhlIGRhdGEsIHNvIHJlcG9ydCB0aGF0IGFzIHRoZQotCQkgKiBwcm9ibGVtLgotCQkgKgotCQkgKiBXZSByZXBvcnQgdGhlIGVycm9yIGhlcmUgKGluc3RlYWQgb2YgaW4KLQkJICogV2luMTZTZXRDbGlwYm9hcmREYXRhKCkpIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0aGUgZXJyb3IKLQkJICogcmVwb3J0ZWQgdHdpY2UuCi0JCSAqLwotCQlFTVNHKCJFNDUwOiBTZWxlY3Rpb24gdG9vIGxhcmdlLCBjYW5ub3QgYWxsb2NhdGUgRE9TIGJ1ZmZlciIpOwotCSAgICB9Ci0JfQotCi0JV2luMTZDbG9zZUNsaXBib2FyZCgpOwotICAgIH0KLQotICAgIC8qIHJlbGVhc2UgbWVtb3J5IGFsbG9jYXRlZCBieSBjbGlwX2NvbnZlcnRfc2VsZWN0aW9uKCkgKi8KLSAgICB2aW1fZnJlZShwQ2xpcERhdGEpOwotCi0gICAgcmV0dXJuOwotfQotCi0vKgotICogV2luMTZPcGVuQ2xpcGJvYXJkOiBvcGVuIHRoZSBXaW5kb3dzIGNsaXBib2FyZC4gIFRoZSBjbGlwYm9hcmQgbXVzdCBiZSBvcGVuCi0gKiBiZWZvcmUgaXQgY2FuIGJlIGNvbW11bmljYXRlZCB3aXRoIGF0IGFsbC4gIFJldHVybiBUUlVFIG9uIHN1Y2Nlc3MsCi0gKiBGQUxTRSBvbiBmYWlsdXJlLgotICovCi0gICAgc3RhdGljIGludAotV2luMTZPcGVuQ2xpcGJvYXJkKHZvaWQpCi17Ci0gICAgX19kcG1pX3JlZ3MgIGRwbWlfcmVnczsKLQotICAgIGxvbmcgICAgc3RhcnRfdGltZTsKLSAgICBpbnQJICAgIHRpY2tfY291bnQ7Ci0KLSAgICAvKiBpbnQgMHgyZiwgQVggPSAweDE3MDEgYXR0ZW1wdHMgdG8gb3BlbiB0aGUgV2luZG93cyBjbGlwYm9hcmQuICBVcG9uCi0gICAgICogcmV0dXJuIGZyb20gdGhlIGludGVycnVwdCwgaWYgQVggaXMgbm9uLXplcm8sIHRoZSBjbGlwYm9hcmQgd2FzCi0gICAgICogc3VjY2Vzc2Z1bGx5IG9wZW5lZC4gIElmIEFYIGlzIHplcm8sIHRoZSBjbGlwYm9hcmQgY291bGQgbm90IGJlIG9wZW5lZAotICAgICAqIGJlY2F1c2UgaXQgaXMgY3VycmVudGx5IGluIHVzZSBieSBhbm90aGVyIHByb2Nlc3MuCi0gICAgICoKLSAgICAgKiBSZW1hcms6IG90aGVyIERPUyBwcm9ncmFtcyBJIChkaykgaGF2ZSB3cml0dGVuIHRoYXQgdXNlIHRoZSBXaW5kb3dzCi0gICAgICogY2xpcGJvYXJkIHNvbWV0aW1lcyBlbmNvdW50ZXIgdGhlIHByb2JsZW0gdGhhdCB0aGUgY2xpcGJvYXJkIGNhbm5vdAotICAgICAqIGJlIG9wZW5lZCBldmVuIHRob3VnaCBpdCBpcyBkZW1vbnN0cmFibHkgbm90IGluIHVzZSBieSBhbnkgb3RoZXIKLSAgICAgKiBwcm9jZXNzLiAgSW4gYWxsIGNhc2VzLCByZXBlYXRlZCBhdHRlbXB0cyB0byBvcGVuIHRoZSBjbGlwYm9hcmQKLSAgICAgKiBldmVudHVhbGx5IHN1Y2NlZWQsIGJ1dCB0aGUgaW5pdGlhbCBhdHRlbXB0IG9jY2FzaW9uYWxseSBmYWlscy4KLSAgICAgKgotICAgICAqIFRoZSBwcm9ibGVtIGlzIGludGVybWl0dGVudCBhbmQgYXBwZWFycyB0byBiZSByZWxhdGVkIHRvIERPUyBiZWluZwotICAgICAqICJidXN5IiBhdCBjZXJ0YWluIHVucHJlZGljdGFibGUgdGltZXMuICBET1MgbWFpbnRhaW5zIHR3byBpbnRlcm5hbAotICAgICAqIGZsYWdzIHRoYXQgaW5kaWNhdGUgd2hldGhlciBpdCdzIGJ1c3k6IEluRE9TIGFuZCBDcml0RXJyLiAgVGhlCi0gICAgICogbG9jYXRpb24gb2YgSW5ET1MgY2FuIGJlIGZvdW5kIGJ5IGNhbGxpbmcgaW50IDB4MjEsIEFIID0gMHgzNC4gIFRoZQotICAgICAqIGxvY2F0aW9uIG9mIENyaXRFcnIgY2FuIGJlIGZvdW5kIGJ5IGNhbGxpbmcgaW50IDB4MjEsIEFYID0gMHg1ZDA2LgotICAgICAqIElmIGVpdGhlciBvZiB0aGVzZSBmbGFncyBpcyBzZXQsIERPUyBpcyAiYnVzeSIgYW5kIGNhbm5vdCBiZQotICAgICAqIGludGVycnVwdGVkLiAgU2VlICJVbmRvY3VtZW50ZWQgRE9TIiBieSBTY2h1bG1hbiBldCBhbCBmb3IgZGV0YWlscy4KLSAgICAgKgotICAgICAqIEhvd2V2ZXIgaGVyZSBJIHRha2UgdGhlIGVhc2llciBhcHByb2FjaCB0aGF0IGlmIHRoZSBmaXJzdCBjYWxsIHRvIG9wZW4KLSAgICAgKiB0aGUgY2xpcGJvYXJkIGRvZXMgbm90IHN1Y2NlZWQsIGp1c3QgdHJ5IGFnYWluLiAgSW4gZmFjdCwgdHJ5IG9uY2UgcGVyCi0gICAgICogYmlvc3RpbWUoKSBjbG9jayB0aWNrLCB1cCB0byAxOCB0aW1lcyAoYWJvdXQgb25lIHNlY29uZCkuCi0gICAgICovCi0KLSAgICB0aWNrX2NvdW50ID0gMDsKLQotICAgIGRwbWlfcmVncy54LmF4ID0gMHgxNzAxOwkvKiBvcGVuIFdpbmRvd3MgY2xpcGJvYXJkICovCi0gICAgaWYgKF9fZHBtaV9pbnQoMHgyZiwgJmRwbWlfcmVncykgPT0gLTEpCi0gICAgewotCS8qIHJlYWwtbW9kZSBpbnRlcnJ1cHQgZmFpbGVkPyAqLwotCXJldHVybiBGQUxTRTsJCS8qIEZBTFNFIC0tPiBjbGlwYm9hcmQgbm90IG9wZW4gKi8KLSAgICB9Ci0KLSAgICAvKiB3YWl0IHVwIHRvIG9uZSBzZWNvbmQgKi8KLSAgICB3aGlsZSAoZHBtaV9yZWdzLnguYXggPT0gMCAmJiB0aWNrX2NvdW50KysgPCAxOCkKLSAgICB7Ci0JLyogV2FpdCBvbmUgY2xvY2sgdGljayAoMTguMiB0aWNrcy9zZWMgPSA1NSBtc2VjIHBlciB0aWNrKS4KLQkgKgotCSAqIFdlIGJ1c3ktd2FpdCBoZXJlLiAgVW5mb3J0dW5hdGVseSwgZGVsYXkoKSBhbmQgdXNsZWVwKCkgaGF2ZSBiZWVuCi0JICogcmVwb3J0ZWQgdG8gZ2l2ZSBwcm9ibGVtcyB3aXRoIHRoZSBvcmlnaW5hbCBXaW5kb3dzIDk1LiAgVGhpcyBpcwotCSAqIGZpeGVkIGluIHNlcnZpY2UgcGFjayAxLCBidXQgbm90IGV2ZXJ5Ym9keSBpbnN0YWxsZWQgdGhhdC4KLQkgKi8KLQlzdGFydF90aW1lID0gYmlvc3RpbWUoMCwgMEwpOwotCXdoaWxlIChiaW9zdGltZSgwLCAwTCkgPT0gc3RhcnRfdGltZSkKLQkgICAgOwotCi0JZHBtaV9yZWdzLnguYXggPSAweDE3MDE7ICAgIC8qIG9wZW4gV2luZG93cyBjbGlwYm9hcmQgKi8KLQlpZiAoX19kcG1pX2ludCgweDJmLCAmZHBtaV9yZWdzKSA9PSAtMSkKLQl7Ci0JICAgIC8qIHJlYWwtbW9kZSBpbnRlcnJ1cHQgZmFpbGVkPyAqLwotCSAgICByZXR1cm4gRkFMU0U7CQkvKiBGQUxTRSAtLT4gY2xpcGJvYXJkIG5vdCBvcGVuICovCi0JfQotICAgIH0KLQotICAgIC8qIENvdWxkbid0IG9wZW4gdGhlIGNsaXBib2FyZCwgZXZlbiBhZnRlciAxOCBhdHRlbXB0cz8gKi8KLQotICAgIGlmICh0aWNrX2NvdW50ID49IDE4ICYmIGRwbWlfcmVncy54LmF4ID09IDApCi0JcmV0dXJuIEZBTFNFOwkJLyogRkFMU0UgLS0+IGNsaXBib2FyZCBub3Qgb3BlbiAqLwotCi0gICAgcmV0dXJuIFRSVUU7CS8qIFRSVUUgLS0+IGNsaXBib2FyZCBvcGVuZWQgc3VjY2Vzc2Z1bGx5LCBPSyAqLwotfQotCi0vKgotICogV2luMTZDbG9zZUNsaXBib2FyZDogY2xvc2UgdGhlIFdpbmRvd3MgY2xpcGJvYXJkLiAgUmV0dXJuIFRSVUUgb24KLSAqIHN1Y2Nlc3MsIEZBTFNFIG9uIGZhaWx1cmUuICBUaGlzIGZ1bmN0aW9uIGNhbiBhbHdheXMgYmUgY2FsbGVkLAotICogd2hldGhlciB0aGUgY2xpcGJvYXJkIGlzIG9wZW4gb3Igbm90LgotICovCi0gICAgc3RhdGljIGludAotV2luMTZDbG9zZUNsaXBib2FyZCh2b2lkKQotewotICAgIF9fZHBtaV9yZWdzICBkcG1pX3JlZ3M7Ci0KLSAgICAvKiBDbG9zZSB0aGUgY2xpcGJvYXJkLiAgVGhpcyBpbnRlcnJ1cHQgY2FuIGFsd2F5cyBiZSBjYWxsZWQsIGV2ZW4KLSAgICAgKiBpZiB0aGUgY2xpcGJvYXJkIGlzIGFscmVhZHkgY2xvc2VkLgotICAgICAqLwotCi0gICAgZHBtaV9yZWdzLnguYXggPSAweDE3MDg7CSAgICAvKiBjbG9zZSB0aGUgY2xpcGJvYXJkICovCi0gICAgaWYgKF9fZHBtaV9pbnQoMHgyZiwgJmRwbWlfcmVncykgPT0gLTEpCi0gICAgewotCS8qIHJlYWwtbW9kZSBpbnRlcnJ1cHQgZmFpbGVkPyAqLwotCXJldHVybiBGQUxTRTsJCS8qIEZBTFNFIC0tPiBjbGlwYm9hcmQgY291bGQgbm90IGJlIGNsb3NlZCAqLwotICAgIH0KLQotICAgIHJldHVybiBUUlVFOwkvKiBUUlVFIC0tPiBjbGlwYm9hcmQgY2xvc2VkIHN1Y2Nlc3NmdWxseSwgT0sgKi8KLX0KLQotLyoKLSAqIFdpbjE2RW1wdHlDbGlwYm9hcmQ6IGVtcHR5IHRoZSAocHJldmlvdXNseSBvcGVuZWQpIFdpbmRvd3MgY2xpcGJvYXJkLgotICogUmV0dXJuIFRSVUUgb24gc3VjY2VzcywgRkFMU0Ugb24gZmFpbHVyZS4KLSAqLwotICAgIHN0YXRpYyBpbnQKLVdpbjE2RW1wdHlDbGlwYm9hcmQodm9pZCkKLXsKLSAgICBfX2RwbWlfcmVncyAgZHBtaV9yZWdzOwotCi0gICAgLyogaW50IDB4MmYsIEFYID0gMHgxNzAyIGF0dGVtcHRzIHRvIGVtcHR5IHRoZSBXaW5kb3dzIGNsaXBib2FyZC4gIFVwb24KLSAgICAgKiByZXR1cm4gZnJvbSB0aGUgaW50ZXJydXB0LCBpZiBBWCA9PSAwLCB0aGUgY2xpcGJvYXJkIGNvdWxkIG5vdCBiZQotICAgICAqIGVtcHRpZWQgKGZvciBzb21lIHJlYXNvbikuCi0gICAgICovCi0gICAgZHBtaV9yZWdzLnguYXggPSAweDE3MDI7ICAgIC8qICBlbXB0eSB0aGUgV2luZG93cyBjbGlwYm9hcmQgKi8KLSAgICBpZiAoX19kcG1pX2ludCgweDJmLCAmZHBtaV9yZWdzKSA9PSAtMSkKLSAgICB7Ci0JLyogcmVhbC1tb2RlIGludGVycnVwdCBmYWlsZWQ/ICovCi0JcmV0dXJuIEZBTFNFOwkJLyogRkFMU0UgLS0+IGNsaXBib2FyZCBjb3VsZCBub3QgYmUgZW1wdGllZCAqLwotICAgIH0KLQotICAgIC8qIERpZCB3ZSBzdWNjZWVkIGluIGNsZWFyaW5nIHRoZSBjbGlwYm9hcmQ/ICovCi0gICAgaWYgKGRwbWlfcmVncy54LmF4ID09IDApCi0JcmV0dXJuIEZBTFNFOwkJLyogRkFMU0UgLS0+IGNsaXBib2FyZCBjb3VsZCBub3QgYmUgZW1wdGllZCAqLwotCi0gICAgcmV0dXJuIFRSVUU7CQkvKiBUUlVFIC0tPiBjbGlwYm9hcmQgd2FzIGVtcHRpZWQsIE9LICovCi19Ci0KLS8qCi0gKiBGcmVlRE9TTWVtb3J5OiBhIGhlbHBlciBmdW5jdGlvbiB0byBmcmVlIG1lbW9yeSBwcmV2aW91c2x5Ci0gKiBhbGxvY2F0ZWQgYnkgYSBjYWxsIHRvIF9fZHBtaV9hbGxvY2F0ZV9kb3NfbWVtb3J5KCkuCi0gKi8KLSAgICBzdGF0aWMgdm9pZAotRnJlZURPU01lbW9yeShpbnQgcHJvdGVjdGVkX21vZGVfc2VsZWN0b3IpCi17Ci0gICAgLyogRnJlZSB0aGUgRE9TIGJ1ZmZlciBhbmQgcmVsZWFzZSB0aGUgRFBNSSBwcm90LW1vZGUgc2VsZWN0b3IuCi0gICAgICoKLSAgICAgKiBJdCdzIGltcG9ydGFudCB0aGF0IERPUyBtZW1vcnkgYmUgcHJvcGVybHkgcmVsZWFzZWQgYmVjYXVzZQotICAgICAqIHRoZXJlJ3Mgb25seSBhIGxpbWl0ZWQgYW1vdW50IG9mIGl0LiAgVGhlcmVmb3JlLCBpZiB0aGUgY2FsbAotICAgICAqIHRvIF9fZHBtaV9mcmVlX2Rvc19tZW1vcnkoKSBmYWlscywgZW1pdCBhbiBlcnJvciBtZXNzYWdlCi0gICAgICogdW5jb25kaXRpb25hbGx5LgotICAgICAqLwotICAgIGlmIChfX2RwbWlfZnJlZV9kb3NfbWVtb3J5KHByb3RlY3RlZF9tb2RlX3NlbGVjdG9yKSA9PSAtMSkKLQlFTVNHKCJFNDUxOiBjb3VsZCBub3QgZnJlZSBET1MgbWVtb3J5IGJ1ZmZlciAoREpHUFApIik7Ci19Ci0KLS8qCi0gKiBXaW4xNkdldENsaXBib2FyZERhdGE6IHF1ZXJ5IHRoZSBXaW5kb3dzIGNsaXBib2FyZCBhcyB0byB3aGV0aGVyIGRhdGEKLSAqIGlzIGF2YWlsYWJsZSBpbiBhIHBhcnRpY3VsYXIgY2xpcGJvYXJkIGZvcm1hdC4gIElmIGRhdGEgaXMKLSAqIGF2YWlsYWJsZSwgYWxsb2NhdGUgYSBidWZmZXIgZm9yIGl0IGFuZCByZWFkIHRoZSBkYXRhIGZyb20gdGhlCi0gKiBjbGlwYm9hcmQgaW50byB0aGUgYnVmZmVyLiAgUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgYnVmZmVyLiAgSWYKLSAqIG5vIGRhdGEgaXMgYXZhaWxhYmxlIGluIHRoZSByZXF1ZXN0ZWQgZm9ybWF0LCByZXR1cm4gTlVMTC4KLSAqCi0gKiBUaGlzIHJvdXRpbmUgYWxsb2NhdGVzIG1lbW9yeSB0byBob2xkIHRoZSByZXRyaWV2ZWQgY2xpcGJvYXJkCi0gKiBkYXRhLiAgSXQncyB0aGUgY2FsbGVyJ3MgcmVzcG9uc2liaWxpdHkgdG8gZnJlZSB0aGlzIG1lbW9yeQotICogb25jZSBpdCdzIGZpbmlzaGVkIHVzaW5nIGl0LiAgVGhlIG1lbW9yeSBzaG91bGQgYmUgZnJlZWQgYnkKLSAqIGNhbGxpbmcgdmltX2ZyZWUoKS4KLSAqLwotICAgIHN0YXRpYyBjaGFyX3UgKgotV2luMTZHZXRDbGlwYm9hcmREYXRhKGludCBjbGlwX2RhdGFfZm9ybWF0KQotewotICAgIF9fZHBtaV9yZWdzICBkcG1pX3JlZ3M7Ci0KLSAgICBpbnQJCXJlYWxfbW9kZV9zZWdtZW50X2FkZHJlc3M7Ci0gICAgaW50CQlwcm90ZWN0ZWRfbW9kZV9zZWxlY3RvcjsKLQotICAgIGNoYXJfdQkqY2xpcF9kYXRhX2J1ZmZlcjsKLSAgICBsb25nX3UJY2xpcF9kYXRhX3NpemU7Ci0KLSAgICAvKiBXZSBvbmx5IGhhbmRsZSBjbGlwYm9hcmQgZm9ybWF0cyB3ZSByZWNvZ25pemUsIG90aGVycyBhcmUgaWdub3JlZC4KLSAgICAgKgotICAgICAqIEl0J3Mgbm90IHBvc3NpYmxlIHRvIGNyZWF0ZSBhIGN1c3RvbSBjbGlwYm9hcmQgZm9ybWF0IGZvciBWaW1DbGlwYm9hcmQKLSAgICAgKiBkYXRhIHVuZGVyIERPUywgc28gb25lIG9mIHRoZSBwcmVkZWZpbmVkIFdpbmRvd3MgZm9ybWF0cyBoYWQgdG8gYmUKLSAgICAgKiB1c2VkIGZvciBDRl9WSU1DTElQLiAgVHdvIG9ic2N1cmUgZm9ybWF0cywgcG9wdWxhciB3aGVuIFdpbmRvd3MgMy4wCi0gICAgICogY2FtZSBvdXQgYnV0IG5vIGxvbmdlciBpbiBtdWNoIHVzZSB0b2RheSwgYXJlIHRoZSBESUYgYW5kIFNZTEsgZm9ybWF0cy4KLSAgICAgKiBESUYgaXMgdGhlIERhdGEgSW50ZXJjaGFuZ2UgRm9ybWF0LCBTWUxLIGlzIHRoZSBTeW1ib2xpYyBMaW5rIGZvcm1hdC4KLSAgICAgKiBUaGV5IGFyZSBib3RoIHRleHQgZm9ybWF0cyBhbmQgZWl0aGVyIG9uZSBjYW4gYmUgaGlqYWNrZWQgZm9yIHVzZSBhcwotICAgICAqICJ0aGUgVmltQ2xpcGJvYXJkIGZvcm1hdCIuICBPZiBjb3Vyc2UsIHRoaXMgY29uZmxpY3RzIHdpdGggYW55b25lIHdobwotICAgICAqIHN0aWxsICppcyogdXNpbmcgRElGIG9yIFNZTEsgZGF0YSBmb3JtYXRzLCBidXQgdGhhdCB3aWxsIGJlIHZlcnkgZmV3Ci0gICAgICogcGVvcGxlLgotICAgICAqCi0gICAgICogSSAoZGspIGNob3NlIFNZTEsgYXMgdGhlIG1vcmUgb2JzY3VyZSBmb3JtYXQgYmVjYXVzZSBpdCB3YXMgdXNlZAotICAgICAqIG1vc3RseSBmb3IgTWljcm9zb2Z0IE11bHRpcGxhbiAodGhlIHByZS1jdXJzb3IgdG8gRXhjZWwpIGFuZCBpdCdzIG5vdAotICAgICAqIGxpa2VseSBNdWx0aXBsYW4gaXMgdXNlZCBhbnl3aGVyZSBtdWNoIGFueW1vcmUuICBNaW5kIHlvdSwgRXhjZWwgY2FuCi0gICAgICogc3RpbGwgZXhwb3J0IHRvIGJvdGggRElGIGFuZCBTWUxLIGZvcm1hdHMuCi0gICAgICovCi0KLSAgICBzd2l0Y2ggKGNsaXBfZGF0YV9mb3JtYXQpCi0gICAgewotICAgIGNhc2UgQ0ZfVklNQ0xJUDoJCSAgICAvKiBWaW0ncyBvd24gc3BlY2lhbCBjbGlwYm9hcmQgZm9ybWF0ICovCi0gICAgY2FzZSBDRl9URVhUOgkJICAgIC8qIFdpbmRvd3MgdGV4dCAqLwotICAgIGNhc2UgQ0ZfT0VNVEVYVDoJCSAgICAvKiBET1MgKE9FTSkgdGV4dCAqLwotCi0JLyogaW50IDB4MmYsIEFYID0gMHgxNzA0IHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBvZiBkYXRhIGN1cnJlbnRseQotCSAqIG9uIHRoZSBXaW5kb3dzIGNsaXBib2FyZCwgZm9yIHRoZSBzcGVjaWZpZWQgZm9ybWF0LiAgVXBvbiByZXR1cm4KLQkgKiBmcm9tIHRoZSBpbnRlcnJ1cHQsIERYOkFYID0gdGhlIG51bWJlciBvZiBieXRlcywgcm91bmRlZCB1cCB0byB0aGUKLQkgKiBuZWFyZXN0IG11bHRpcGxlIG9mIDMyLgotCSAqLwotCi0JZHBtaV9yZWdzLnguYXggPSAweDE3MDQ7ICAgIC8qIGdldCBzaXplIG9mIGNsaXBiZCBkYXRhICovCi0JZHBtaV9yZWdzLnguZHggPSBjbGlwX2RhdGFfZm9ybWF0OwotCWlmIChfX2RwbWlfaW50KDB4MmYsICZkcG1pX3JlZ3MpID09IC0xKQotCXsKLQkgICAgLyogcmVhbC1tb2RlIGludGVycnVwdCBmYWlsZWQ/ICovCi0JICAgIHJldHVybiBOVUxMOwkJCQkgICAgLyogZWFybHkgZXhpdCAqLwotCX0KLQotCS8qIERpZCB3ZSBnZXQgYW55dGhpbmc/ICBJZiBub3QsIHRoaXMgaXMgbm90IGFuIGVycm9yLiAqLwotCWlmIChkcG1pX3JlZ3MueC5keCA9PSAwICYmIGRwbWlfcmVncy54LmF4ID09IDApCi0JewotCSAgICAvKiBubyBDRl9WSU1DTElQIGRhdGE/ICovCi0JICAgIHJldHVybiBOVUxMOwkJCQkgICAgLyogZWFybHkgZXhpdCAqLwotCX0KLQotCS8qIFRoZXJlIGlzIGRhdGEgYXZhaWxhYmxlIGluIHRoZSByZXF1ZXN0ZWQgY2xpcGJvYXJkIGZvcm1hdC4KLQkgKgotCSAqIENhbGN1bGF0ZSBkYXRhIHNpemUuICBSZW1lbWJlciB0aGlzIGlzIHJvdW5kZWQgdXAgdG8gdGhlIG5lYXJlc3QKLQkgKiBtdWx0aXBsZSBvZiAzMiwgc28gY2xpcF9kYXRhX3NpemUgaXMgYWN0dWFsbHkgYW4gdXBwZXIgbGltaXQuCi0JICogVGhlIGV4dHJhIGJ5dGVzLCBpZiBhbnksIGFyZSBzZXQgdG8gbnVsbCAoMHgwMCkgd2hlbiB0aGUgZGF0YSBpcwotCSAqIHJlYWQgZnJvbSB0aGUgY2xpcGJvYXJkLiAgKExhdGVyOikgYWN0dWFsbHkgSSdtIG5vIGxvbmdlciBzdXJlCi0JICogdGhpcyBpcyBzdHJpY3RseSB0cnVlOiB0aGUgZW5kLW9mLWRhdGEgaXMgbWFya2VkIGJ5IGEgbnVsbCwgYnV0Ci0JICogdGhlIGV4dHJhIGJ5dGVzIGFwcGVhciB0byBzb21ldGltZXMgYmUgbnVsbCwgc29tZXRpbWVzIG5vdC4KLQkgKiBUaGV5IG1heSBqdXN0IGJlIGdhcmJhZ2UuCi0JICovCi0JY2xpcF9kYXRhX3NpemUgPSBkcG1pX3JlZ3MueC5heCArIChkcG1pX3JlZ3MueC5keCA8PCAxNik7Ci0KLQkvKiBBbGxvY2F0ZSBtZW1vcnkgdG8gcmV0cmlldmUgdGhlIGRhdGEuICBUaGUgYnVmZmVyIGhhcyB0byBsaWUgaW4gdGhlCi0JICogRE9TIG1lbW9yeSByZWdpb24gKGluIHRoZSBmaXJzdCAxIE1CeXRlIG9mIGFkZHJlc3Mgc3BhY2UpIGJlY2F1c2UKLQkgKiB0aGUgV2luZG93cyBjbGlwYm9hcmQgaW50ZXJmYWNlIGV4cGVjdHMgYSAxNi1iaXQgc2VnbWVudDpvZmZzZXQKLQkgKiBwb2ludGVyIHRvIGEgYnVmZmVyIGFkZHJlc3Mgd2l0aGluIHRoZSBET1MgcmVnaW9uLiAgTXVzdCB0aGVyZWZvcmUKLQkgKiB1c2UgX19kcG1pX2FsbG9jYXRlX2Rvc19tZW1vcnkoKSBpbnN0ZWFkIG9mIGxhbGxvYygpIG9yIGFsbG9jKCkuCi0JICovCi0JcmVhbF9tb2RlX3NlZ21lbnRfYWRkcmVzcyA9IF9fZHBtaV9hbGxvY2F0ZV9kb3NfbWVtb3J5KAotCQkoY2xpcF9kYXRhX3NpemUgKyAxNSkgPj4gNCwJLyogYnVmZmVyIHNpemUsIGluIDE2LWJ5dGUgcGFyYWdyYXBocyAqLwotCQkmcHJvdGVjdGVkX21vZGVfc2VsZWN0b3IpOwkvKiBwcm90LW1vZGUgc2VsZWN0b3IgZm9yIHRoZSBhZGRyZXNzICovCi0KLQlpZiAocmVhbF9tb2RlX3NlZ21lbnRfYWRkcmVzcyA9PSAtMSkKLQl7Ci0JICAgIC8qIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZC4gKi8KLQotCSAgICAvKiBUZWNobmljYWxseSB3ZSBkb24ndCBrbm93IHdoeSB0aGUgYWxsb2NhdGlvbiBmYWlsZWQsIGJ1dAotCSAgICAgKiBhbG1vc3QgYWx3YXlzIGl0IHdpbGwgYmUgYmVjYXVzZSB0aGVyZSB3YXNuJ3QgZW5vdWdoIERPUwotCSAgICAgKiBtZW1vcnkgdG8gc2F0aXNmeSB0aGUgcmVxdWVzdCwgc28gcmVwb3J0IHRoYXQgYXMgdGhlIHByb2JsZW0uCi0JICAgICAqIE9uIG15IHN5c3RlbSwgREpHUFAgaXMgYWJsZSB0byBzYXRpc2Z5IGEgRE9TIGFsbG9jYXRpb24gcmVxdWVzdAotCSAgICAgKiB1cCB0byBhYm91dCA2MDBLIGluIHNpemUuICBUaGlzIGRlcGVuZHMgb24geW91ciBISU1FTS5TWVMgYW5kCi0JICAgICAqIEVNTTM4Ni5FWEUgc2V0dGluZ3MgaG93ZXZlci4KLQkgICAgICovCi0JICAgIEVNU0coIkU0NTI6IENsaXBib2FyZCBkYXRhIHRvbyBsYXJnZSwgY2Fubm90IGFsbG9jYXRlIERPUyBidWZmZXIiKTsKLQkgICAgcmV0dXJuIE5VTEw7CQkJCSAgICAvKiBlYXJseSBleGl0ICovCi0JfQotCi0JLyogQ29weSBkYXRhIGZyb20gdGhlIGNsaXBib2FyZCBpbnRvIHRoZSBidWZmZXIuICBFeHBlcmltZW50cyBzaG93IHRoYXQKLQkgKiB0aGUgV2luZG93cyBjbGlwYm9hcmQgaXMgc21hcnQgZW5vdWdoIHRvIGhhbmRsZSBkYXRhIHRyYW5zZmVycwotCSAqIGxhcmdlciB0aGFuIDY0SyBwcm9wZXJseSwgZXZlbiB0aG91Z2ggdGhlIGJ1ZmZlciBhZGRyZXNzIGlzIGEgMTYtYml0Ci0JICogc2VnbWVudDpvZmZzZXQgKHdoaWNoIHdvdWxkIG5vcm1hbGx5IGxpbWl0IHRoZSBibG9jayBzaXplIHRvIDY0SwotCSAqIHVubGVzcyBFUyBnZXRzIGluY3JlbWVudGVkKS4KLQkgKi8KLQlkcG1pX3JlZ3MueC5heCA9IDB4MTcwNTsJLyogZ2V0IGNsaXBib2FyZCBkYXRhICovCi0JZHBtaV9yZWdzLnguZHggPSBjbGlwX2RhdGFfZm9ybWF0OwkJLyogQ0ZfVklNQ0xJUCAqLwotCWRwbWlfcmVncy54LmVzID0gcmVhbF9tb2RlX3NlZ21lbnRfYWRkcmVzczsJLyogYnVmZmVyIGFkOiBzZWdtZW50ICovCi0JZHBtaV9yZWdzLnguYnggPSAwOwkJCQkvKiBidWZmZXIgYWQ6IG9mZnNldCAqLwotCWlmIChfX2RwbWlfaW50KCAweDJmLCAmZHBtaV9yZWdzKSA9PSAtMSkKLQl7Ci0JICAgIC8qIHJlYWwtbW9kZSBpbnRlcnJ1cHQgZmFpbGVkPyAqLwotCSAgICBFTVNHKCJFNDUzOiBjb3VsZCBub3QgY29weSBjbGlwYm9hcmQgZGF0YSB0byBET1MgYnVmZmVyIik7Ci0JICAgIEZyZWVET1NNZW1vcnkocHJvdGVjdGVkX21vZGVfc2VsZWN0b3IpOwkvKiBjbGVhbiB1cCBET1MgbWVtICovCi0JICAgIHJldHVybiBOVUxMOwkJCQkvKiBlYXJseSBleGl0ICovCi0JfQotCi0JLyogQ2xpcGJvYXJkIGRhdGEgaXMgbm93IGluIERPUyBtZW1vcnkgaW4gdGhlIGJ1ZmZlciBwb2ludGVkIHRvIGJ5Ci0JICogRVM6QlguICBDb3B5IHRoaXMgaW50byBvcmRpbmFyeSBtZW1vcnkgdGhhdCBWaW0gY2FuIGFjY2VzcyAoaWUuCi0JICogcHJvdC1tb2RlIG1lbW9yeSkuICBBbGxvY2F0ZSBvbmUgZXh0cmEgYnl0ZSB0byBlbnN1cmUgdGhlIHRleHQKLQkgKiBpcyB0ZXJtaW5hdGVkIHByb3Blcmx5IChpbiBjYXNlIGl0IHdhcyBzb21laG93IGNvcnJ1cHRlZCkuCi0JICovCi0JY2xpcF9kYXRhX2J1ZmZlciA9IChjaGFyX3UgKilsYWxsb2MoY2xpcF9kYXRhX3NpemUgKyAxLCBUUlVFKTsKLQotCWlmIChjbGlwX2RhdGFfYnVmZmVyID09IE5VTEwpCi0JewotCSAgICAvKiBhbGxvY2F0aW9uIGZhaWxlZD8gKi8KLQkgICAgRU1TRygiRTQ1NDogY291bGQgbm90IGFsbG9jYXRlIGNsaXBib2FyZCBtZW1vcnkgYnVmZmVyIik7Ci0JICAgIEZyZWVET1NNZW1vcnkocHJvdGVjdGVkX21vZGVfc2VsZWN0b3IpOwkvKiBjbGVhbiB1cCBET1MgbWVtICovCi0JICAgIHJldHVybiBOVUxMOwkJCQkvKiBlYXJseSBleGl0ICovCi0JfQotCi0JKihjbGlwX2RhdGFfYnVmZmVyICsgY2xpcF9kYXRhX3NpemUpID0gJ1wwJzsJLyogZW5zdXJlIHRlcm1pbmF0ZWQgKi8KLQotCS8qIENvcHkgdGhlIGRhdGEgZnJvbSBET1MgbWVtb3J5IHRvIFZpbS1hY2Nlc3NpYmxlIG1lbW9yeS4gKi8KLQltb3ZlZGF0YSgJCQkJLyogREpHUFAgdmVyc2lvbiBvZiBtZW1jcHkoKSAqLwotCQlwcm90ZWN0ZWRfbW9kZV9zZWxlY3RvciwgMCwgLyogc291cmNlOiBET1MgYWQgKHZpYSBzZWxlY3RvcikgKi8KLQkJX215X2RzKCksICh1bnNpZ25lZCljbGlwX2RhdGFfYnVmZmVyLAotCQkJCQkJLyogdGFyZ2V0OiBub3JtYWwgbWVtIGFkZHJlc3MgKi8KLQkJY2xpcF9kYXRhX3NpemUpOwkJLyogaG93IG1hbnkgYnl0ZXMgKi8KLQotCS8qIEZyZWUgdGhlIERPUyBidWZmZXIgYW5kIHJlbGVhc2UgdGhlIERQTUkgcHJvdC1tb2RlIHNlbGVjdG9yLiAqLwotCUZyZWVET1NNZW1vcnkocHJvdGVjdGVkX21vZGVfc2VsZWN0b3IpOwkgLyogY2xlYW4gdXAgRE9TIG1lbW9yeSAqLwotCi0JcmV0dXJuIGNsaXBfZGF0YV9idWZmZXI7ICAgIC8qIHJldHVybiBwb2ludGVyIHRvIGFsbG9jYXRlZCBidWZmZXIgKi8KLQotICAgIGRlZmF1bHQ6CQkvKiB1bmtub3duIGNsaXBib2FyZCBmb3JtYXQgKi8KLQlyZXR1cm4gTlVMTDsKLSAgICB9Ci19Ci0KLS8qCi0gKiBXaW4xNlNldENsaXBib2FyZERhdGE6IHNlbmQgJ2NsaXBfZGF0YV9zaXplJyBieXRlcyBvZiBkYXRhIGZyb20gdGhlIGJ1ZmZlcgotICogcG9pbnRlZCB0byBieSAnY2xpcF9kYXRhJywgdG8gdGhlIFdpbmRvd3MgY2xpcGJvYXJkLiAgVGhlIGRhdGEgaXMKLSAqIHJlZ2lzdGVyZWQgd2l0aCB0aGUgY2xpcGJvYXJkIGFzIGJlaW5nIGluIHRoZSAnY2xpcF9kYXRhX2Zvcm1hdCcKLSAqIGZvcm1hdC4KLSAqLwotICAgIHN0YXRpYyBpbnQKLVdpbjE2U2V0Q2xpcGJvYXJkRGF0YSgKLQlpbnQJY2xpcF9kYXRhX2Zvcm1hdCwKLQljaGFyX3UJKmNsaXBfZGF0YSwKLQlpbnQJY2xpcF9kYXRhX3NpemUsCi0JaW50CWNsaXBfZGF0YV90eXBlKQotewotICAgIF9fZHBtaV9yZWdzICBkcG1pX3JlZ3M7Ci0KLSAgICBpbnQJCXJlYWxfbW9kZV9zZWdtZW50X2FkZHJlc3M7Ci0gICAgaW50CQlwcm90ZWN0ZWRfbW9kZV9zZWxlY3RvcjsKLSAgICBsb25nX3UJcHJvdGVjdGVkX21vZGVfb2Zmc2V0ID0gMEw7Ci0gICAgaW50CQl0b3RhbF9zaXplID0gY2xpcF9kYXRhX3NpemU7Ci0KLSAgICBjaGFyX3UJKmNsaXBfc2VsX3R5cGU7Ci0KLSAgICAvKiBJZiB3ZSdyZSB1c2luZyB0aGUgQ0ZfVklNQ0xJUCBjdXN0b20gZm9ybWF0LCBhbGxvY2F0ZSBhbiBleHRyYQotICAgICAqIGJ5dGUgZm9yIGNsaXBfc2VsX3R5cGUsIHdoaWNoIGlzIGEgY2hhcmFjdGVyIGluZGljYXRpbmcgdGhlIHR5cGUKLSAgICAgKiBvZiB0ZXh0IHNlbGVjdGlvbjogTUxJTkUsIE1DSEFSLCBvciBNQkxPQ0suCi0gICAgICovCi0gICAgaWYgKGNsaXBfZGF0YV9mb3JtYXQgPT0gQ0ZfVklNQ0xJUCkKLQl0b3RhbF9zaXplKys7CQkJLyogZXh0cmEgYnl0ZSBmb3IgbWFya2VyICovCi0KLSAgICAvKiBEYXRhIGNhbm5vdCBiZSBzZW50IGRpcmVjdGx5IGZyb20gYSBWaW0gc3RyaW5nIChwQ2xpcERhdGEpIHRvCi0gICAgICogdGhlIFdpbmRvd3MgY2xpcGJvYXJkLCBiZWNhdXNlIHRoZSBXaW5kb3dzIGNsaXBib2FyZCBpbnRlcmZhY2UKLSAgICAgKiBleHBlY3RzIGEgMTYtYml0IChET1MpIHNlZ21lbnQ6b2Zmc2V0IGFkZHJlc3MgZm9yIHRoZSBzb3VyY2UKLSAgICAgKiBidWZmZXIuICBUaGVyZWZvcmUgd2UgbXVzdCBjcmVhdGUgYSAidHJhbnNmZXIgYnVmZmVyIiBpbiB0aGUgRE9TCi0gICAgICogbWVtb3J5IHJlZ2lvbiAoaW4gdGhlIGZpcnN0IDEgTUJ5dGUgb2YgYWRkcmVzcyBzcGFjZSkgYW5kIGNvcHkKLSAgICAgKiB0aGUgVmltIHN0cmluZyBpbnRvIHRoYXQuICBGcm9tIHRoZXJlLCB0aGUgZGF0YSBjYW4gdGhlbiBiZSBzZW50Ci0gICAgICogdG8gdGhlIFdpbmRvd3MgY2xpcGJvYXJkLgotICAgICAqCi0gICAgICogVG8gYWxsb2NhdGUgRE9TIG1lbW9yeSwgd2UgbXVzdCB1c2UgX19kcG1pX2FsbG9jYXRlX2Rvc19tZW1vcnkoKQotICAgICAqIGluc3RlYWQgb2YgbGFsbG9jKCkgb3IgYWxsb2MoKS4gIElmIHRoZSBhbGxvY2F0aW9uIGZhaWxzLCBpdCB3aWxsCi0gICAgICogYWxtb3N0IGludmFyaWFibHkgYmUgYmVjYXVzZSB0aGVyZSBpcyBub3QgZW5vdWdoIERPUyBtZW1vcnkKLSAgICAgKiBhdmFpbGFibGUgdG8gYWNjb21tb2RhdGUgdGhlIHNpemUgb2YgY2xpcF9kYXRhLiAgVGhlcmUgaXMgbm90aGluZwotICAgICAqIHdlIGNhbiBkbyBhYm91dCB0aGlzLCB3ZSBzaW1wbHkgaGF2ZSB0byBmYWlsLgotICAgICAqLwotICAgIHJlYWxfbW9kZV9zZWdtZW50X2FkZHJlc3MgPSBfX2RwbWlfYWxsb2NhdGVfZG9zX21lbW9yeSgKLQkgICAgKHRvdGFsX3NpemUgKyAxNSkgPj4gNCwJLyogYnVmZmVyIHNpemUsIGluIDE2LWJ5dGUgcGFyYWdyYXBocyAqLwotCSAgICAmcHJvdGVjdGVkX21vZGVfc2VsZWN0b3IpOwkvKiBwcm90LW1vZGUgc2VsZWN0b3IgZm9yIHRoZSBhZGRyZXNzICovCi0KLSAgICBpZiAocmVhbF9tb2RlX3NlZ21lbnRfYWRkcmVzcyA9PSAtMSkKLSAgICB7Ci0JLyogbWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkLiAqLwotCS8qIFRlY2huaWNhbGx5IHdlIGRvbid0IGtub3cgd2h5IHRoZSBhbGxvY2F0aW9uIGZhaWxlZCwgYnV0Ci0JICogYWxtb3N0IGFsd2F5cyBpdCB3aWxsIGJlIGJlY2F1c2UgdGhlcmUgd2Fzbid0IGVub3VnaCBET1MKLQkgKiBtZW1vcnkgdG8gc2F0aXNmeSB0aGUgcmVxdWVzdC4gIE9uIG15IHN5c3RlbSwgREpHUFAgaXMgYWJsZQotCSAqIHRvIHNhdGlzZnkgYSBET1MgYWxsb2NhdGlvbiByZXF1ZXN0IHVwIHRvIGFib3V0IDYwMEsgaW4gc2l6ZS4KLQkgKiBUaGlzIGRlcGVuZHMgaG93ZXZlciBvbiBISU1FTS5TWVMgYW5kIEVNTTM4Ni5FWEUgc2V0dGluZ3MuCi0JICovCi0JcmV0dXJuIEZBTFNFOwkJCQkvKiBlYXJseSBleGl0ICovCi0gICAgfQotCi0gICAgLyogQ29weSBkYXRhIGZyb20gVmltJ3MgYnVmZmVyIChjbGlwX2RhdGEpIGludG8gdGhlIERPUyB0cmFuc2ZlciBidWZmZXIuCi0gICAgICogVGhpcyBjYW4gYmUgbGFyZ2VyIHRoYW4gNjRLOyBtb3ZlZGF0YSgpIHRha2VzIGNhcmUgb2YgY3Jvc3NpbmcgYW55Ci0gICAgICogMTYtYml0IHNlZ21lbnQgYm91bmRhcmllcy4KLSAgICAgKgotICAgICAqIElmIHdlJ3JlIHVzaW5nIFZpbSdzIGN1c3RvbSBjbGlwYm9hcmQgZm9ybWF0LCB3ZSBtdXN0IGNvcHkgb25lIGV4dHJhCi0gICAgICogYnl0ZSB0byBpbmRpY2F0ZSB0aGUgdHlwZSBvZiBzZWxlY3Rpb246IGxpbmUsIGNoYXJhY3Rlciwgb3IgYmxvY2suCi0gICAgICovCi0gICAgaWYgKGNsaXBfZGF0YV9mb3JtYXQgPT0gQ0ZfVklNQ0xJUCkKLSAgICB7Ci0Jc3dpdGNoIChjbGlwX2RhdGFfdHlwZSkKLQl7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgIGNhc2UgTUxJTkU6CSAgICBjbGlwX3NlbF90eXBlID0gIkwiOwlicmVhazsKLQkgICAgY2FzZSBNQ0hBUjoJICAgIGNsaXBfc2VsX3R5cGUgPSAiQyI7CWJyZWFrOwotCSAgICBjYXNlIE1CTE9DSzogICAgY2xpcF9zZWxfdHlwZSA9ICJCIjsJYnJlYWs7Ci0JfQotCi0JbW92ZWRhdGEoCi0JCV9teV9kcygpLCAodW5zaWduZWQpY2xpcF9zZWxfdHlwZSwKLQkJCQkJICAgIC8qIHNvdXJjZTogbm9ybWFsIG1lbW9yeSBhZGRyZXNzICovCi0JCXByb3RlY3RlZF9tb2RlX3NlbGVjdG9yLCAwLCAvKiB0YXJnZXQ6IERPUyBhZCAodmlhIHNlbGVjdG9yKSAqLwotCQkxKTsJCQkgICAgLyogaG93IG1hbnkgYnl0ZXMgdG8gY29weSAqLwotCi0JcHJvdGVjdGVkX21vZGVfb2Zmc2V0ICs9IFNUUkxFTihjbGlwX3NlbF90eXBlKTsJLyogYWxsb3cgZm9yIG1hcmtlciAqLwotICAgIH0KLQotICAgIG1vdmVkYXRhKAotCV9teV9kcygpLCAodW5zaWduZWQpY2xpcF9kYXRhLAkvKiBzb3VyY2U6IG5vcm1hbCBtZW1vcnkgYWRkcmVzcyAqLwotCXByb3RlY3RlZF9tb2RlX3NlbGVjdG9yLAkvKiB0YXJnZXQ6IERPUyBhZGRyZXNzICh2aWEgc2VsZWN0b3IpICovCi0JcHJvdGVjdGVkX21vZGVfb2Zmc2V0LAkJLyogbm9uLXplcm8sIGlmIHVzaW5nIGNsaXBfc2VsX3R5cGUgKi8KLQljbGlwX2RhdGFfc2l6ZSk7CQkvKiBob3cgbWFueSBieXRlcyB0byBjb3B5ICovCi0KLSAgICAvKiBTZW5kIGRhdGEgZnJvbSB0aGUgRE9TIHRyYW5zZmVyIGJ1ZmZlciB0byB0aGUgV2luZG93cyBjbGlwYm9hcmQuCi0gICAgICogaW50IDB4MmYsIEFYID0gMHgxNzAzIHNlbmRzIFNJOkNYIGJ5dGVzIG9mIGRhdGEgZnJvbSB0aGUgYnVmZmVyCi0gICAgICogYXQgRVM6QlgsIHRvIHRoZSBjbGlwYm9hcmQuCi0gICAgICovCi0gICAgZHBtaV9yZWdzLnguYXggPSAweDE3MDM7CQkJLyogc2VuZCBjbGlwYm9hcmQgZGF0YSAqLwotICAgIGRwbWlfcmVncy54LmR4ID0gY2xpcF9kYXRhX2Zvcm1hdDsJCS8qIGZsYWc6IGZvcm1hdCBvZiB0aGUgZGF0YSAqLwotICAgIGRwbWlfcmVncy54LnNpID0gKCh0b3RhbF9zaXplID4+IDE2KQotCSAgICAmIDB4MDAwMGZmZmZMKTsJCQkvKiBoaSB3b3JkIG9mIGRhdGEgc2l6ZSAqLwotICAgIGRwbWlfcmVncy54LmN4ID0gKHRvdGFsX3NpemUgJiAweDAwMDBmZmZmTCk7Ci0JCQkJCQkvKiBsbyB3b3JkIG9mIGRhdGEgc2l6ZSAqLwotICAgIGRwbWlfcmVncy54LmVzID0gcmVhbF9tb2RlX3NlZ21lbnRfYWRkcmVzczsJLyogYnVmZmVyIGFkZHJlc3M6IHNlZ21lbnQgKi8KLSAgICBkcG1pX3JlZ3MueC5ieCA9IDA7CQkJCS8qIGJ1ZmZlciBhZGRyZXNzOiBvZmZzZXQgKi8KLSAgICBpZiAoX19kcG1pX2ludCgweDJmLCAmZHBtaV9yZWdzKSA9PSAtMSkKLSAgICB7Ci0JLyogcmVhbC1tb2RlIGludGVycnVwdCBmYWlsZWQuICovCi0JRnJlZURPU01lbW9yeShwcm90ZWN0ZWRfbW9kZV9zZWxlY3Rvcik7ICAgLyogY2xlYW4gdXAgRE9TIG1lbW9yeSAqLwotCXJldHVybiBGQUxTRTsJCQkJICAvKiBlYXJseSBleGl0ICovCi0gICAgfQotCi0gICAgLyogRnJlZSB0aGUgRE9TIGJ1ZmZlciBhbmQgcmVsZWFzZSB0aGUgRFBNSSBwcm90LW1vZGUgc2VsZWN0b3IuICovCi0gICAgRnJlZURPU01lbW9yeShwcm90ZWN0ZWRfbW9kZV9zZWxlY3Rvcik7CSAgLyogY2xlYW4gdXAgRE9TIG1lbW9yeSAqLwotCi0gICAgcmV0dXJuIFRSVUU7CS8qIFRSVUUgLS0+IGRhdGEgc3VjY2Vzc2Z1bGx5IHNlbnQgdG8gY2xpcGJvYXJkICovCi19Ci0KLSNlbmRpZgkvKiBGRUFUX0NMSVBCT0FSRCAqLwotI2VuZGlmIC8qIERKR1BQICovCi0KLS8qIGNvbW1vbiBNUy1ET1MgYW5kIFdpbjE2IGNvZGUgZm9sbG93cyAqLwotCi0gICAgc3RhdGljIGludAotdmltX2NobW9kKGNoYXJfdSAqbmFtZSkKLXsKLSAgICBjaGFyX3UJKnA7Ci0gICAgaW50CQlmOwotICAgIGludAkJYyA9IDA7Ci0KLSAgICAvKiBjaG1vZCgpIGNhbid0IGhhbmRsZSBhIGZpbGUgbmFtZSB3aXRoIGEgdHJhaWxpbmcgc2xhc2gsIHJlbW92ZSBpdC4KLSAgICAgKiBCdXQgZG9uJ3QgcmVtb3ZlIGl0IGZvciAiLyIgb3IgImM6LyIuICovCi0gICAgcCA9IG5hbWUgKyBTVFJMRU4obmFtZSk7Ci0gICAgaWYgKHAgPiBuYW1lKQotCS0tcDsKLSAgICBpZiAocCA+IG5hbWUgJiYgKCpwID09ICdcXCcgfHwgKnAgPT0gJy8nKSAmJiBwWy0xXSAhPSAnOicpCi0gICAgewotCWMgPSAqcDsJCQkJLyogcmVtb3ZlIHRyYWlsaW5nIChiYWNrKXNsYXNoICovCi0JKnAgPSBOVUw7Ci0gICAgfQotICAgIGVsc2UKLQlwID0gTlVMTDsKLSNpZiBkZWZpbmVkKF9fQk9STEFORENfXykgJiYgKF9fQk9STEFORENfXyA+IDB4NDEwKQotICAgIC8qIHRoaXMgYWxzbyBzZXRzIHRoZSBhcmNoaXZlIGJpdCwgc3VwcG9ydGVkIGJ5IEJvcmxhbmQgQyA0LjAgYW5kIGxhdGVyLAotICAgICAqIHdoZXJlIF9fQk9STEFORENfXyBpcyAweDQ1MCAoMy4xIGlzIDB4NDEwKSAqLwotICAgIGYgPSBfcnRsX2NobW9kKChjaGFyICopbmFtZSwgMCwgMCk7Ci0jZWxzZQotICAgIGYgPSBfY2htb2QoKGNoYXIgKiluYW1lLCAwLCAwKTsKLSNlbmRpZgotICAgIGlmIChwICE9IE5VTEwpCi0JKnAgPSBjOwkJCQkvKiBwdXQgYmFjayAoYmFjaylzbGFzaCAqLwotICAgIHJldHVybiBmOwotfQotCi0vKgotICogZ2V0IGZpbGUgcGVybWlzc2lvbnMgZm9yICduYW1lJwotICogUmV0dXJucyAtMSBmb3IgZXJyb3IuCi0gKiBSZXR1cm5zIEZBX2F0dHJpYnV0ZXMgZGVmaW5lZCBpbiBkb3MuaAotICovCi0gICAgbG9uZwotbWNoX2dldHBlcm0oY2hhcl91ICpuYW1lKQotewotICAgIHJldHVybiAobG9uZyl2aW1fY2htb2QobmFtZSk7CS8qIGdldCBmaWxlIG1vZGUgKi8KLX0KLQotLyoKLSAqIHNldCBmaWxlIHBlcm1pc3Npb24gZm9yICduYW1lJyB0byAncGVybScKLSAqCi0gKiByZXR1cm4gRkFJTCBmb3IgZmFpbHVyZSwgT0sgb3RoZXJ3aXNlCi0gKi8KLSAgICBpbnQKLW1jaF9zZXRwZXJtKAotICAgIGNoYXJfdQkqbmFtZSwKLSAgICBsb25nCXBlcm0pCi17Ci0gICAgcGVybSB8PSBGQV9BUkNIOwkgICAgLyogZmlsZSBoYXMgY2hhbmdlZCwgc2V0IGFyY2hpdmUgYml0ICovCi0jaWYgZGVmaW5lZChfX0JPUkxBTkRDX18pICYmIChfX0JPUkxBTkRDX18gPiAweDQxMCkKLSAgICByZXR1cm4gKF9ydGxfY2htb2QoKGNoYXIgKiluYW1lLCAxLCAoaW50KXBlcm0pID09IC0xID8gRkFJTCA6IE9LKTsKLSNlbHNlCi0gICAgcmV0dXJuIChfY2htb2QoKGNoYXIgKiluYW1lLCAxLCAoaW50KXBlcm0pID09IC0xID8gRkFJTCA6IE9LKTsKLSNlbmRpZgotfQotCi0vKgotICogU2V0IGhpZGRlbiBmbGFnIGZvciAibmFtZSIuCi0gKi8KLSAgICB2b2lkCi1tY2hfaGlkZShjaGFyX3UgKm5hbWUpCi17Ci0gICAgLyogRE9TIDYuMiBzaGFyZS5leGUgY2F1c2VzICJzZWVrIGVycm9yIG9uIGZpbGUgd3JpdGUiIGVycm9ycyB3aGVuIG1ha2luZwotICAgICAqIHRoZSBzd2FwIGZpbGUgaGlkZGVuLiAgVGh1cyBkb24ndCBkbyBpdC4gKi8KLX0KLQotLyoKLSAqIHJldHVybiBUUlVFIGlmICJuYW1lIiBpcyBhIGRpcmVjdG9yeQotICogcmV0dXJuIEZBTFNFIGlmICJuYW1lIiBpcyBub3QgYSBkaXJlY3RvcnkKLSAqIHJldHVybiBGQUxTRSBmb3IgZXJyb3IKLSAqCi0gKiBiZXdhcmUgb2YgYSB0cmFpbGluZyAoYmFjaylzbGFzaAotICovCi0gICAgaW50Ci1tY2hfaXNkaXIoY2hhcl91ICpuYW1lKQotewotICAgIGludAkJZjsKLQotICAgIGYgPSB2aW1fY2htb2QobmFtZSk7Ci0gICAgaWYgKGYgPT0gLTEpCi0JcmV0dXJuIEZBTFNFOwkJICAgIC8qIGZpbGUgZG9lcyBub3QgZXhpc3QgYXQgYWxsICovCi0gICAgaWYgKChmICYgRkFfRElSRUMpID09IDApCi0JcmV0dXJuIEZBTFNFOwkJICAgIC8qIG5vdCBhIGRpcmVjdG9yeSAqLwotICAgIHJldHVybiBUUlVFOwotfQotCi0vKgotICogUmV0dXJuIDEgaWYgIm5hbWUiIGNhbiBiZSBleGVjdXRlZCwgMCBpZiBub3QuCi0gKiBJZiAidXNlX3BhdGgiIGlzIEZBTFNFIG9ubHkgY2hlY2sgaWYgIm5hbWUiIGlzIGV4ZWN1dGFibGUuCi0gKiBSZXR1cm4gLTEgaWYgdW5rbm93bi4KLSAqLwotICAgIGludAotbWNoX2Nhbl9leGUoCi0gICAgY2hhcl91CSpuYW1lLAotICAgIGNoYXJfdQkqKnBhdGgsCi0gICAgaW50CQl1c2VfcGF0aCkKLXsKLSAgICBjaGFyCSpwOwotICAgIGludAkJbW9kZTsKLQotICAgIGlmICghdXNlX3BhdGgpCi0gICAgewotCS8qIFRPRE86IHByb3BlciBjaGVjayBpZiBmaWxlIGlzIGV4ZWN1dGFibGUuICovCi0JbW9kZSA9IHZpbV9jaG1vZChuYW1lKTsKLQlyZXR1cm4gbW9kZSAhPSAtMSAmJiAobW9kZSAmIEZBX0RJUkVDKSA9PSAwOwotICAgIH0KLSAgICBwID0gc2VhcmNocGF0aChuYW1lKTsKLSAgICBpZiAocCA9PSBOVUxMIHx8IG1jaF9pc2RpcihwKSkKLQlyZXR1cm4gRkFMU0U7Ci0gICAgaWYgKHBhdGggIT0gTlVMTCkKLQkqcGF0aCA9IHZpbV9zdHJzYXZlKHApOwotICAgIHJldHVybiBUUlVFOwotfQotCi0vKgotICogQ2hlY2sgd2hhdCAibmFtZSIgaXM6Ci0gKiBOT0RFX05PUk1BTDogZmlsZSBvciBkaXJlY3RvcnkgKG9yIGRvZXNuJ3QgZXhpc3QpCi0gKiBOT0RFX1dSSVRBQkxFOiB3cml0YWJsZSBkZXZpY2UsIHNvY2tldCwgZmlmbywgZXRjLgotICogTk9ERV9PVEhFUjogbm9uLXdyaXRhYmxlIHRoaW5ncwotICovCi0gICAgaW50Ci1tY2hfbm9kZXR5cGUoY2hhcl91ICpuYW1lKQotewotICAgIGlmIChTVFJJQ01QKG5hbWUsICJBVVgiKSA9PSAwCi0JICAgIHx8IFNUUklDTVAobmFtZSwgIkNPTiIpID09IDAKLQkgICAgfHwgU1RSSUNNUChuYW1lLCAiQ0xPQ0skIikgPT0gMAotCSAgICB8fCBTVFJJQ01QKG5hbWUsICJOVUwiKSA9PSAwCi0JICAgIHx8IFNUUklDTVAobmFtZSwgIlBSTiIpID09IDAKLQkgICAgfHwgKChTVFJOSUNNUChuYW1lLCAiQ09NIiwgMykgPT0gMAotCQkgICAgfHwgU1RSTklDTVAobmFtZSwgIkxQVCIsIDMpID09IDApCi0JCSYmIFZJTV9JU0RJR0lUKG5hbWVbM10pCi0JCSYmIG5hbWVbNF0gPT0gTlVMKSkKLQlyZXR1cm4gTk9ERV9XUklUQUJMRTsKLSAgICAvKiBUT0RPOiBOT0RFX09USEVSPyAqLwotICAgIHJldHVybiBOT0RFX05PUk1BTDsKLX0KLQotLyoKLSAqIEdldCBuYW1lIG9mIGN1cnJlbnQgZGlyZWN0b3J5IGludG8gYnVmZmVyICdidWYnIG9mIGxlbmd0aCAnbGVuJyBieXRlcy4KLSAqIFJldHVybiBPSyBmb3Igc3VjY2VzcywgRkFJTCBmb3IgZmFpbHVyZS4KLSAqLwotICAgIGludAotbWNoX2Rpcm5hbWUoCi0gICAgY2hhcl91CSpidWYsCi0gICAgaW50CQlsZW4pCi17Ci0jaWZkZWYgREpHUFAKLSAgICBpZiAoZ2V0Y3dkKChjaGFyICopYnVmLCBsZW4pID09IE5VTEwpCi0JcmV0dXJuIEZBSUw7Ci0gICAgLyogdHVybiB0aGUgJy8ncyByZXR1cm5lZCBieSBESkdQUCBpbnRvICdcJ3MgKi8KLSAgICBzbGFzaF9hZGp1c3QoYnVmKTsKLSAgICByZXR1cm4gT0s7Ci0jZWxzZQotICAgIHJldHVybiAoZ2V0Y3dkKChjaGFyICopYnVmLCBsZW4pICE9IE5VTEwgPyBPSyA6IEZBSUwpOwotI2VuZGlmCi19Ci0KLS8qCi0gKiB0aGlzIHZlcnNpb24gb2YgcmVtb3ZlIGlzIG5vdCBzY2FyZWQgYnkgYSByZWFkb25seSAoYmFja3VwKSBmaWxlCi0gKgotICogcmV0dXJucyAtMSBvbiBlcnJvciwgMCBvdGhlcndpc2UgKGp1c3QgbGlrZSByZW1vdmUoKSkKLSAqLwotICAgIGludAotbWNoX3JlbW92ZShjaGFyX3UgKm5hbWUpCi17Ci0gICAgKHZvaWQpbWNoX3NldHBlcm0obmFtZSwgMCk7ICAgIC8qIGRlZmF1bHQgcGVybWlzc2lvbnMgKi8KLSAgICByZXR1cm4gdW5saW5rKChjaGFyICopbmFtZSk7Ci19Ci0KLS8qCi0gKiBTcGVjaWFsIHZlcnNpb24gb2YgZ2V0ZW52KCk6IFVzZSB1cHBlcmNhc2UgbmFtZS4KLSAqLwotICAgIGNoYXJfdSAqCi1tY2hfZ2V0ZW52KGNoYXJfdSAqbmFtZSkKLXsKLSAgICBpbnQJCWk7Ci0jZGVmaW5lIE1BWEVOVkxFTiA1MAotICAgIGNoYXJfdQl2YXJfY29weVtNQVhFTlZMRU4gKyAxXTsKLSAgICBjaGFyX3UJKnA7Ci0gICAgY2hhcl91CSpyZXM7Ci0KLSAgICAvKgotICAgICAqIFRha2UgYSBjb3B5IG9mIHRoZSBhcmd1bWVudCwgYW5kIGZvcmNlIGl0IHRvIHVwcGVyIGNhc2UgYmVmb3JlIHBhc3NpbmcKLSAgICAgKiB0byBnZXRlbnYoKS4gIE9uIERPUyBzeXN0ZW1zLCBnZXRlbnYoKSBkb2Vzbid0IGxpa2UgbG93ZXItY2FzZSBhcmd1bWVudAotICAgICAqICh1bmxpa2UgV2luMzIgZXQgYWwuKSAgSWYgdGhlIG5hbWUgaXMgdG9vIGxvbmcgdG8gZml0IGluIHZhcl9jb3B5W10KLSAgICAgKiBhbGxvY2F0ZSBtZW1vcnkuCi0gICAgICovCi0gICAgaWYgKChpID0gU1RSTEVOKG5hbWUpKSA+IE1BWEVOVkxFTikKLQlwID0gYWxsb2MoaSArIDEpOwotICAgIGVsc2UKLQlwID0gdmFyX2NvcHk7Ci0gICAgaWYgKHAgPT0gTlVMTCkKLQlwID0gbmFtZTsgICAvKiBvdXQgb2YgbWVtb3J5LCBmYWxsIGJhY2sgdG8gdW5tb2RpZmllZCBuYW1lICovCi0gICAgZWxzZQotICAgIHsKLQlmb3IgKGkgPSAwOyBuYW1lW2ldICE9IE5VTDsgKytpKQotCSAgICBwW2ldID0gdG91cHBlcihuYW1lW2ldKTsKLQlwW2ldID0gTlVMOwotICAgIH0KLQotICAgIHJlcyA9IChjaGFyX3UgKilnZXRlbnYoKGNoYXIgKilwKTsKLQotICAgIGlmIChwICE9IHZhcl9jb3B5ICYmIHAgIT0gbmFtZSkKLQl2aW1fZnJlZShwKTsKLQotICAgIHJldHVybiByZXM7Ci19Ci0KLS8qCi0gKiBJbnNlcnQgdXNlciBuYW1lIGluIHNbbGVuXS4KLSAqLwotICAgIGludAotbWNoX2dldF91c2VyX25hbWUoCi0gICAgY2hhcl91CSpzLAotICAgIGludAkJbGVuKQotewotICAgICpzID0gTlVMOwotICAgIHJldHVybiBGQUlMOwotfQotCi0vKgotICogSW5zZXJ0IGhvc3QgbmFtZSBpcyBzW2xlbl0uCi0gKi8KLSAgICB2b2lkCi1tY2hfZ2V0X2hvc3RfbmFtZSgKLSAgICBjaGFyX3UJKnMsCi0gICAgaW50CQlsZW4pCi17Ci0jaWZkZWYgREpHUFAKLSAgICB2aW1fc3RybmNweShzLCAiUEMgKDMyIGJpdHMgVmltKSIsIGxlbiAtIDEpOwotI2Vsc2UKLSAgICB2aW1fc3RybmNweShzLCAiUEMgKDE2IGJpdHMgVmltKSIsIGxlbiAtIDEpOwotI2VuZGlmCi19CmRpZmYgLS1naXQgYS9zcmMvb3NfbXNkb3MuaCBiL3NyYy9vc19tc2Rvcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDVmNDc4Li4wMDAwMDAwCi0tLSBhL3NyYy9vc19tc2Rvcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qIHZpOnNldCB0cz04IHN0cz00IHN3PTQ6Ci0gKgotICogVklNIC0gVmkgSU1wcm92ZWQJYnkgQnJhbSBNb29sZW5hYXIKLSAqCi0gKiBEbyAiOmhlbHAgdWdhbmRhIiAgaW4gVmltIHRvIHJlYWQgY29weWluZyBhbmQgdXNhZ2UgY29uZGl0aW9ucy4KLSAqIERvICI6aGVscCBjcmVkaXRzIiBpbiBWaW0gdG8gc2VlIGEgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkLgotICovCi0KLS8qCi0gKiBNU0RPUyBNYWNoaW5lLWRlcGVuZGVudCB0aGluZ3MuCi0gKi8KLQotI2luY2x1ZGUgIm9zX2Rvcy5oIgkJLyogY29tbW9uIE1TLURPUyBhbmQgV2luMzIgc3R1ZmYgKi8KLQotI2RlZmluZSBCSU5BUllfRklMRV9JTwotI2RlZmluZSBVU0VfRVhFX05BTUUJCS8qIHVzZSBhcmd2WzBdIGZvciAkVklNICovCi0jZGVmaW5lIFNZTkNfRFVQX0NMT1NFCQkvKiBzeW5jKCkgYSBmaWxlIHdpdGggZHVwKCkgYW5kIGNsb3NlKCkgKi8KLSNkZWZpbmUgVVNFX1RFUk1fQ09OU09MRQotI2lmZGVmIERKR1BQCi0jIGluY2x1ZGUgPGZjbnRsLmg+CQkvKiBkZWZpbmVzIF9VU0VfTEZOICovCi0jIGRlZmluZSBVU0VfTE9OR19GTkFNRSBfVVNFX0xGTiAgICAvKiBkZWNpZGUgYXQgcnVuIHRpbWUgKi8KLSMgZGVmaW5lIFVTRV9GTkFNRV9DQVNFCi0jIGRlZmluZSBIQVZFX1BVVEVOVgotI2Vsc2UKLSMgZGVmaW5lIFNIT1JUX0ZOQU1FCQkvKiBhbHdheXMgOC4zIGZpbGUgbmFtZSAqLwotI2VuZGlmCi0jZGVmaW5lIEhBVkVfU1RETElCX0gKLSNkZWZpbmUgSEFWRV9TVFJJTkdfSAotI2RlZmluZSBIQVZFX0ZDTlRMX0gKLSNkZWZpbmUgSEFWRV9TVFJDU1BOCi0jZGVmaW5lIEhBVkVfU1RSSUNNUAotI2RlZmluZSBIQVZFX1NUUkZUSU1FCQkvKiBndWVzc2VkICovCi0jZGVmaW5lIEhBVkVfU1RSTklDTVAKLSNkZWZpbmUgSEFWRV9NRU1TRVQKLSNkZWZpbmUgSEFWRV9RU09SVAotI2RlZmluZSBIQVZFX1NUX01PREUJCS8qIGhhdmUgc3RhdC5zdF9tb2RlICovCi0jZGVmaW5lIEhBVkVfTUFUSF9ICi0jaWYgZGVmaW5lZChfX0RBVEVfXykgJiYgZGVmaW5lZChfX1RJTUVfXykKLSMgZGVmaW5lIEhBVkVfREFURV9USU1FCi0jZW5kaWYKLSNkZWZpbmUgQlJFQUtDSEVDS19TS0lQCSAgICAxCS8qIGNhbGwgbWNoX2JyZWFrY2hlY2soKSBlYWNoIHRpbWUsIGl0J3MgZmFzdCAqLwotI2RlZmluZSBIQVZFX0FWQUlMX01FTQotCi0vKgotICogQm9ybGFuZCBDKysgMy4xIGRvZXNuJ3QgaGF2ZSBfUlRMRU5UUllGCi0gKi8KLSNpZmRlZiBfX0JPUkxBTkRDX18KLSMgaWYgX19CT1JMQU5EQ19fIDwgMHg0NTAKLSMgIGRlZmluZSBfUlRMRU5UUllGCi0jIGVuZGlmCi0jZW5kaWYKLQotI2RlZmluZSBGTkFNRV9JTExFR0FMICJcIio/Pjx8IiAvKiBpbGxlZ2FsIGNoYXJhY3RlcnMgaW4gYSBmaWxlIG5hbWUgKi8KLQotLyogY3Byb3RvIGZhaWxzIG9uIG1pc3NpbmcgaW5jbHVkZSBmaWxlcyAqLwotI2lmbmRlZiBQUk9UTwotIyBpbmNsdWRlIDxkb3MuaD4KLSMgaW5jbHVkZSA8ZGlyLmg+Ci0jIGluY2x1ZGUgPHRpbWUuaD4KLSNlbmRpZgotCi0jaWZkZWYgREpHUFAKLSMgaW5jbHVkZSA8dW5pc3RkLmg+Ci0jIGRlZmluZSBIQVZFX0xPQ0FMRV9ICi0jIGRlZmluZSBzZXRsb2NhbGUoYywgcCkgICAgZGpncHBfc2V0bG9jYWxlKCkKLSNlbmRpZgotCi0jaWZuZGVmIERKR1BQCi10eXBlZGVmIGxvbmcgb2ZmX3Q7Ci0jZW5kaWYKLQotLyoKLSAqIFRyeSBzZXZlcmFsIGRpcmVjdG9yaWVzIHRvIHB1dCB0aGUgdGVtcCBmaWxlcy4KLSAqLwotI2RlZmluZSBURU1QRElSTkFNRVMJIiRUTVAiLCAiJFRFTVAiLCAiYzpcXFRNUCIsICJjOlxcVEVNUCIsICIiCi0jZGVmaW5lIFRFTVBOQU1FTEVOCTEyOAotCi0jaWZuZGVmIERGTFRfTUFYTUVNCi0jIGRlZmluZSBERkxUX01BWE1FTQkyNTYJCS8qIHVzZSB1cCB0byAyNTZLYnl0ZSBmb3IgYnVmZmVyICovCi0jZW5kaWYKLSNpZm5kZWYgREZMVF9NQVhNRU1UT1QKLSMgZGVmaW5lIERGTFRfTUFYTUVNVE9UCTAJCS8qIGRlY2lkZSBpbiBzZXRfaW5pdCAqLwotI2VuZGlmCi0KLSNpZmRlZiBESkdQUAotIyBkZWZpbmUgQkFTRU5BTUVMRU4gIChfVVNFX0xGTj8yNTA6OCkJLyogbGVuZ3RoIG9mIGJhc2Ugb2YgZmlsZSBuYW1lICovCi0jZWxzZQotIyBkZWZpbmUgQkFTRU5BTUVMRU4JICAgIDgJCS8qIGxlbmd0aCBvZiBiYXNlIG9mIGZpbGUgbmFtZSAqLwotI2VuZGlmCi0KLS8qIGNvZGVzIGZvciBtc2RvcyBtb3VzZSBldmVudCAqLwotI2RlZmluZSBNU0RPU19NT1VTRV9MRUZUCTB4MDEKLSNkZWZpbmUgTVNET1NfTU9VU0VfUklHSFQJMHgwMgotI2RlZmluZSBNU0RPU19NT1VTRV9NSURETEUJMHgwNAotCi0jaWZkZWYgREpHUFAKLWludCBtY2hfcmVuYW1lKGNvbnN0IGNoYXIgKk9sZEZpbGUsIGNvbnN0IGNoYXIgKk5ld0ZpbGUpOwotI2Vsc2UKLSMgZGVmaW5lIG1jaF9yZW5hbWUoc3JjLCBkc3QpIHJlbmFtZShzcmMsIGRzdCkKLSNlbmRpZgotCi0jaWZkZWYgREpHUFAKLSMgZGVmaW5lIHZpbV9ta2Rpcih4LCB5KSBta2RpcigoY2hhciAqKSh4KSwgeSkKLSNlbHNlCi0jIGRlZmluZSB2aW1fbWtkaXIoeCwgeSkgbWtkaXIoKGNoYXIgKikoeCkpCi0jZW5kaWYKLSNkZWZpbmUgbWNoX3JtZGlyKHgpIHJtZGlyKChjaGFyICopKHgpKQotCi0jZGVmaW5lIG1jaF9zZXRlbnYobmFtZSwgdmFsLCB4KSBzZXRlbnYobmFtZSwgdmFsLCB4KQpkaWZmIC0tZ2l0IGEvc3JjL3Byb3RvLmggYi9zcmMvcHJvdG8uaAppbmRleCA4NDNkNDIyLi43ZTQxODBiIDEwMDY0NAotLS0gYS9zcmMvcHJvdG8uaAorKysgYi9zcmMvcHJvdG8uaApAQCAtMzgsOSArMzgsNiBAQAogIyBpZiBkZWZpbmVkKFVOSVgpIHx8IGRlZmluZWQoX19FTVhfXykgfHwgZGVmaW5lZChWTVMpCiAjICBpbmNsdWRlICJvc191bml4LnBybyIKICMgZW5kaWYKLSMgaWYgZGVmaW5lZChNU0RPUykKLSMgIGluY2x1ZGUgIm9zX21zZG9zLnBybyIKLSMgZW5kaWYKICMgaWZkZWYgV0lOMzI2NAogIyAgaW5jbHVkZSAib3Nfd2luMzIucHJvIgogIyAgaW5jbHVkZSAib3NfbXN3aW4ucHJvIgpkaWZmIC0tZ2l0IGEvc3JjL3Byb3RvL29zX21zZG9zLnBybyBiL3NyYy9wcm90by9vc19tc2Rvcy5wcm8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkM2EzYzcuLjAwMDAwMDAKLS0tIGEvc3JjL3Byb3RvL29zX21zZG9zLnBybworKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qIG9zX21zZG9zLmMgKi8KLXZvaWQgbWNoX3NldF9ub3JtYWxfY29sb3JzKHZvaWQpOwotdm9pZCBtY2hfdXBkYXRlX2N1cnNvcih2b2lkKTsKLWxvbmdfdSBtY2hfYXZhaWxfbWVtKGludCBzcGVjaWFsKTsKLXZvaWQgbWNoX2RlbGF5KGxvbmcgbXNlYywgaW50IGlnbm9yZWlucHV0KTsKLXZvaWQgbWNoX3dyaXRlKGNoYXJfdSAqcywgaW50IGxlbik7Ci1pbnQgbWNoX2luY2hhcihjaGFyX3UgKmJ1ZiwgaW50IG1heGxlbiwgbG9uZyB0aW1lLCBpbnQgdGJfY2hhbmdlX2NudCk7Ci1pbnQgbWNoX2NoYXJfYXZhaWwodm9pZCk7Ci12b2lkIG1jaF9zdXNwZW5kKHZvaWQpOwotdm9pZCBtY2hfaW5pdCh2b2lkKTsKLWludCBtY2hfY2hlY2tfd2luKGludCBhcmdjLCBjaGFyICoqYXJndik7Ci1pbnQgbWNoX2lucHV0X2lzYXR0eSh2b2lkKTsKLXZvaWQgZm5hbWVfY2FzZShjaGFyX3UgKm5hbWUsIGludCBsZW4pOwotbG9uZyBtY2hfZ2V0X3BpZCh2b2lkKTsKLWludCBtY2hfRnVsbE5hbWUoY2hhcl91ICpmbmFtZSwgY2hhcl91ICpidWYsIGludCBsZW4sIGludCBmb3JjZSk7Ci12b2lkIHNsYXNoX2FkanVzdChjaGFyX3UgKnApOwotaW50IG1jaF9pc0Z1bGxOYW1lKGNoYXJfdSAqZm5hbWUpOwotdm9pZCBtY2hfZWFybHlfaW5pdCh2b2lkKTsKLXZvaWQgbWNoX2V4aXQoaW50IHIpOwotdm9pZCBtY2hfc2V0dG1vZGUoaW50IHRtb2RlKTsKLXZvaWQgbWNoX3NldG1vdXNlKGludCBvbik7Ci1pbnQgbWNoX3NjcmVlbm1vZGUoY2hhcl91ICphcmcpOwotaW50IG1jaF9nZXRfc2hlbGxzaXplKHZvaWQpOwotdm9pZCBtY2hfc2V0X3NoZWxsc2l6ZSh2b2lkKTsKLXZvaWQgbWNoX25ld19zaGVsbHNpemUodm9pZCk7Ci12b2lkIG1jaF9jaGVja19jb2x1bW5zKHZvaWQpOwotaW50IG1jaF9jYWxsX3NoZWxsKGNoYXJfdSAqY21kLCBpbnQgb3B0aW9ucyk7Ci12b2lkIG1jaF9icmVha2NoZWNrKHZvaWQpOwotaW50IG1jaF9oYXNfZXhwX3dpbGRjYXJkKGNoYXJfdSAqcCk7Ci1pbnQgbWNoX2hhc193aWxkY2FyZChjaGFyX3UgKnApOwotaW50IG1jaF9jaGRpcihjaGFyICpwYXRoKTsKLWNoYXIgKmRqZ3BwX3NldGxvY2FsZSh2b2lkKTsKLWludCBjbGlwX21jaF9vd25fc2VsZWN0aW9uKFZpbUNsaXBib2FyZCAqY2JkKTsKLXZvaWQgY2xpcF9tY2hfbG9zZV9zZWxlY3Rpb24oVmltQ2xpcGJvYXJkICpjYmQpOwotdm9pZCBjbGlwX21jaF9yZXF1ZXN0X3NlbGVjdGlvbihWaW1DbGlwYm9hcmQgKmNiZCk7Ci12b2lkIGNsaXBfbWNoX3NldF9zZWxlY3Rpb24oVmltQ2xpcGJvYXJkICpjYmQpOwotbG9uZyBtY2hfZ2V0cGVybShjaGFyX3UgKm5hbWUpOwotaW50IG1jaF9zZXRwZXJtKGNoYXJfdSAqbmFtZSwgbG9uZyBwZXJtKTsKLXZvaWQgbWNoX2hpZGUoY2hhcl91ICpuYW1lKTsKLWludCBtY2hfaXNkaXIoY2hhcl91ICpuYW1lKTsKLWludCBtY2hfY2FuX2V4ZShjaGFyX3UgKm5hbWUsIGNoYXJfdSAqKnBhdGgsIGludCB1c2VfcGF0aCk7Ci1pbnQgbWNoX25vZGV0eXBlKGNoYXJfdSAqbmFtZSk7Ci1pbnQgbWNoX2Rpcm5hbWUoY2hhcl91ICpidWYsIGludCBsZW4pOwotaW50IG1jaF9yZW1vdmUoY2hhcl91ICpuYW1lKTsKLWNoYXJfdSAqbWNoX2dldGVudihjaGFyX3UgKm5hbWUpOwotaW50IG1jaF9nZXRfdXNlcl9uYW1lKGNoYXJfdSAqcywgaW50IGxlbik7Ci12b2lkIG1jaF9nZXRfaG9zdF9uYW1lKGNoYXJfdSAqcywgaW50IGxlbik7Ci0vKiB2aW06IHNldCBmdD1jIDogKi8KZGlmZiAtLWdpdCBhL3NyYy9yZWdleHAuYyBiL3NyYy9yZWdleHAuYwppbmRleCA5ZWQ1Yzc1Li5jZDdkYzNmIDEwMDY0NAotLS0gYS9zcmMvcmVnZXhwLmMKKysrIGIvc3JjL3JlZ2V4cC5jCkBAIC0xMzM4LDEyICsxMzM4LDYgQEAKICAgICBpZiAocmVnKFJFR19OT1BBUkVOLCAmZmxhZ3MpID09IE5VTEwpCiAJcmV0dXJuIE5VTEw7CiAKLSAgICAvKiBTbWFsbCBlbm91Z2ggZm9yIHBvaW50ZXItc3RvcmFnZSBjb252ZW50aW9uPyAqLwotI2lmZGVmIFNNQUxMX01BTExPQwkJLyogMTYgYml0IHN0b3JhZ2UgYWxsb2NhdGlvbiAqLwotICAgIGlmIChyZWdzaXplID49IDY1NTM2TCAtIDI1NkwpCi0JRU1TR19SRVRfTlVMTChfKCJFMzM5OiBQYXR0ZXJuIHRvbyBsb25nIikpOwotI2VuZGlmCi0KICAgICAvKiBBbGxvY2F0ZSBzcGFjZS4gKi8KICAgICByID0gKGJ0X3JlZ3Byb2dfVCAqKWxhbGxvYyhzaXplb2YoYnRfcmVncHJvZ19UKSArIHJlZ3NpemUsIFRSVUUpOwogICAgIGlmIChyID09IE5VTEwpCmRpZmYgLS1naXQgYS9zcmMvc2NyZWVuLmMgYi9zcmMvc2NyZWVuLmMKaW5kZXggYzdiNDZlZS4uYjI5Mzg2OSAxMDA2NDQKLS0tIGEvc3JjL3NjcmVlbi5jCisrKyBiL3NyYy9zY3JlZW4uYwpAQCAtMzE5MSwxNSArMzE5MSwxMyBAQAogCSAgICB9CiAJfQogCi0jaWZuZGVmIE1TRE9TCiAJLyogQ2hlY2sgaWYgdGhlIGNoYXJhY3RlciB1bmRlciB0aGUgY3Vyc29yIHNob3VsZCBub3QgYmUgaW52ZXJ0ZWQgKi8KIAlpZiAoIWhpZ2hsaWdodF9tYXRjaCAmJiBsbnVtID09IGN1cndpbi0+d19jdXJzb3IubG51bSAmJiB3cCA9PSBjdXJ3aW4KLSMgaWZkZWYgRkVBVF9HVUkKKyNpZmRlZiBGRUFUX0dVSQogCQkmJiAhZ3VpLmluX3VzZQotIyBlbmRpZgorI2VuZGlmCiAJCSkKIAkgICAgbm9pbnZjdXIgPSBUUlVFOwotI2VuZGlmCiAKIAkvKiBpZiBpbnZlcnRpbmcgaW4gdGhpcyBsaW5lIHNldCBhcmVhX2hpZ2hsaWdodGluZyAqLwogCWlmIChmcm9tY29sID49IDApCkBAIC05Mzc5LDggKzkzNzcsOCBAQAogICAgICAqIFNjcmVlbkxpbmVzW10gd2hlbiB0X0NWIGlzbid0IGRlZmluZWQuICBUaGF0J3MgZmFzdGVyIHRoYW4gdXNpbmcKICAgICAgKiB3aW5fbGluZSgpLgogICAgICAqIERvbid0IHVzZSBhIHNjcm9sbCByZWdpb24gd2hlbiB3ZSBhcmUgZ29pbmcgdG8gcmVkcmF3IHRoZSB0ZXh0LCB3cml0aW5nCi0gICAgICogYSBjaGFyYWN0ZXIgaW4gdGhlIGxvd2VyIHJpZ2h0IGNvcm5lciBvZiB0aGUgc2Nyb2xsIHJlZ2lvbiBjYXVzZXMgYQotICAgICAqIHNjcm9sbC11cCBpbiB0aGUgREpHUFAgdmVyc2lvbi4KKyAgICAgKiBhIGNoYXJhY3RlciBpbiB0aGUgbG93ZXIgcmlnaHQgY29ybmVyIG9mIHRoZSBzY3JvbGwgcmVnaW9uIG1heSBjYXVzZSBhCisgICAgICogc2Nyb2xsLXVwIC4KICAgICAgKi8KICAgICBpZiAoc2Nyb2xsX3JlZ2lvbgogI2lmZGVmIEZFQVRfVkVSVFNQTElUCmRpZmYgLS1naXQgYS9zcmMvc3RydWN0cy5oIGIvc3JjL3N0cnVjdHMuaAppbmRleCBjZjVhZTJiLi5jNDdlZWYzIDEwMDY0NAotLS0gYS9zcmMvc3RydWN0cy5oCisrKyBiL3NyYy9zdHJ1Y3RzLmgKQEAgLTE4NDUsOSArMTg0NSw3IEBACiAjZW5kaWYKICAgICBpbnQJCWJfcF9ybzsJCS8qICdyZWFkb25seScgKi8KICAgICBsb25nCWJfcF9zdzsJCS8qICdzaGlmdHdpZHRoJyAqLwotI2lmbmRlZiBTSE9SVF9GTkFNRQogICAgIGludAkJYl9wX3NuOwkJLyogJ3Nob3J0bmFtZScgKi8KLSNlbmRpZgogI2lmZGVmIEZFQVRfU01BUlRJTkRFTlQKICAgICBpbnQJCWJfcF9zaTsJCS8qICdzbWFydGluZGVudCcgKi8KICNlbmRpZgpAQCAtMTk4Myw5ICsxOTgxLDcgQEAKIAkJCQkgICBhY2Nlc3MgYl9zcGVsbCB3aXRob3V0ICNpZmRlZi4gKi8KICNlbmRpZgogCi0jaWZuZGVmIFNIT1JUX0ZOQU1FCiAgICAgaW50CQliX3Nob3J0bmFtZTsJLyogdGhpcyBmaWxlIGhhcyBhbiA4LjMgZmlsZSBuYW1lICovCi0jZW5kaWYKIAogI2lmZGVmIEZFQVRfTVpTQ0hFTUUKICAgICB2b2lkCSpiX216c2NoZW1lX3JlZjsgLyogVGhlIE16U2NoZW1lIHJlZmVyZW5jZSB0byB0aGlzIGJ1ZmZlciAqLwpkaWZmIC0tZ2l0IGEvc3JjL3N5bnRheC5jIGIvc3JjL3N5bnRheC5jCmluZGV4IDJkZDU0NjUuLmIzODVkMWEgMTAwNjQ0Ci0tLSBhL3NyYy9zeW50YXguYworKysgYi9zcmMvc3ludGF4LmMKQEAgLTgwNTUsNyArODA1NSw3IEBACiAgICAgdm9pZAogcmVzdG9yZV9jdGVybV9jb2xvcnModm9pZCkKIHsKLSNpZiBkZWZpbmVkKE1TRE9TKSB8fCAoZGVmaW5lZChXSU4zMjY0KSAmJiAhZGVmaW5lZChGRUFUX0dVSV9XMzIpKQorI2lmIGRlZmluZWQoV0lOMzI2NCkgJiYgIWRlZmluZWQoRkVBVF9HVUlfVzMyKQogICAgIC8qIFNpbmNlIHRfbWUgaGFzIGJlZW4gc2V0LCB0aGlzIHByb2JhYmx5IG1lYW5zIHRoYXQgdGhlIHVzZXIKICAgICAgKiB3YW50cyB0byB1c2UgdGhpcyBhcyBkZWZhdWx0IGNvbG9ycy4gIE5lZWQgdG8gcmVzZXQgZGVmYXVsdAogICAgICAqIGJhY2tncm91bmQvZm9yZWdyb3VuZCBjb2xvcnMuICovCmRpZmYgLS1naXQgYS9zcmMvdGVybS5jIGIvc3JjL3Rlcm0uYwppbmRleCBiMzhhNDM2Li5hOTdmZTU0IDEwMDY0NAotLS0gYS9zcmMvdGVybS5jCisrKyBiL3NyYy90ZXJtLmMKQEAgLTEwLDcgKzEwLDcgQEAKICAqCiAgKiB0ZXJtLmM6IGZ1bmN0aW9ucyBmb3IgY29udHJvbGxpbmcgdGhlIHRlcm1pbmFsCiAgKgotICogcHJpbWl0aXZlIHRlcm1jYXAgc3VwcG9ydCBmb3IgQW1pZ2EsIE1TRE9TLCBhbmQgV2luMzIgaW5jbHVkZWQKKyAqIHByaW1pdGl2ZSB0ZXJtY2FwIHN1cHBvcnQgZm9yIEFtaWdhIGFuZCBXaW4zMiBpbmNsdWRlZAogICoKICAqIE5PVEU6IHBhZGRpbmcgYW5kIHZhcmlhYmxlIHN1YnN0aXR1dGlvbiBpcyBub3QgcGVyZm9ybWVkLAogICogd2hlbiBjb21waWxpbmcgd2l0aG91dCBIQVZFX1RHRVRFTlQsIHdlIHVzZSB0cHV0cygpIGFuZCB0Z290bygpIGR1bW1pZXMuCkBAIC00MjgsNyArNDI4LDcgQEAKICMgIGVuZGlmCiAjIGVuZGlmCiAKLSMgaWYgZGVmaW5lZChNU0RPUykgfHwgZGVmaW5lZChBTExfQlVJTFRJTl9UQ0FQUykgfHwgZGVmaW5lZChfX0VNWF9fKQorIyBpZiBkZWZpbmVkKEFMTF9CVUlMVElOX1RDQVBTKSB8fCBkZWZpbmVkKF9fRU1YX18pCiAvKgogICogVGhlc2UgY29kZXMgYXJlIHZhbGlkIHdoZW4gbmFuc2kuc3lzIG9yIGVxdWl2YWxlbnQgaGFzIGJlZW4gaW5zdGFsbGVkLgogICogRnVuY3Rpb24ga2V5cyBvbiBhIFBDIGFyZSBwcmVjZWRlZCB3aXRoIGEgTlVMLiBUaGVzZSBhcmUgY29udmVydGVkIGludG8KQEAgLTUxMywxMDcgKzUxMyw2IEBACiAgICAge0tfUEFHRVVQLAkJIlwzMTZJIn0sCiAjIGVuZGlmCiAKLSMgaWYgZGVmaW5lZChNU0RPUykKLS8qCi0gKiBUaGVzZSBjb2RlcyBhcmUgdmFsaWQgZm9yIHRoZSBwYyB2aWRlby4gIFRoZSBlbnRyaWVzIHRoYXQgc3RhcnQgd2l0aCBFU0MgfAotICogYXJlIHRyYW5zbGF0ZWQgaW50byBjb25pbyBjYWxscyBpbiBvc19tc2Rvcy5jLiBEZWZhdWx0IGZvciBNU0RPUy4KLSAqLwotICAgIHsoaW50KUtTX05BTUUsCSJwY3Rlcm0ifSwKLSAgICB7KGludClLU19DRSwJIlwwMzN8SyJ9LAotICAgIHsoaW50KUtTX0FMLAkiXDAzM3xMIn0sCi0gICAgeyhpbnQpS1NfREwsCSJcMDMzfE0ifSwKLSMgIGlmZGVmIFRFUk1JTkZPCi0gICAgeyhpbnQpS1NfQ1MsCSJcMDMzfCVpJXAxJWQ7JXAyJWRyIn0sCi0jICAgaWZkZWYgRkVBVF9WRVJUU1BMSVQKLSAgICB7KGludClLU19DU1YsCSJcMDMzfCVpJXAxJWQ7JXAyJWRWIn0sCi0jICAgZW5kaWYKLSMgIGVsc2UKLSAgICB7KGludClLU19DUywJIlwwMzN8JWklZDslZHIifSwKLSMgICBpZmRlZiBGRUFUX1ZFUlRTUExJVAotICAgIHsoaW50KUtTX0NTViwJIlwwMzN8JWklZDslZFYifSwKLSMgICBlbmRpZgotIyAgZW5kaWYKLSAgICB7KGludClLU19DTCwJIlwwMzN8SiJ9LAotICAgIHsoaW50KUtTX01FLAkiXDAzM3wwbSJ9LAkvKiBub3JtYWwgKi8KLSAgICB7KGludClLU19NUiwJIlwwMzN8MTEybSJ9LAkvKiByZXZlcnNlOiBibGFjayBvbiBsaWdodGdyZXkgKi8KLSAgICB7KGludClLU19NRCwJIlwwMzN8MTVtIn0sCS8qIGJvbGQ6IHdoaXRlIHRleHQgKi8KLSAgICB7KGludClLU19TRSwJIlwwMzN8MG0ifSwJLyogc3RhbmRvdXQgZW5kICovCi0gICAgeyhpbnQpS1NfU08sCSJcMDMzfDMxbSJ9LAkvKiBzdGFuZG91dDogd2hpdGUgb24gYmx1ZSAqLwotICAgIHsoaW50KUtTX0NaSCwJIlwwMzN8MjI1bSJ9LAkvKiBpdGFsaWMgbW9kZTogYmx1ZSB0ZXh0IG9uIHllbGxvdyAqLwotICAgIHsoaW50KUtTX0NaUiwJIlwwMzN8MG0ifSwJLyogaXRhbGljIG1vZGUgZW5kICovCi0gICAgeyhpbnQpS1NfVVMsCSJcMDMzfDY3bSJ9LAkvKiB1bmRlcnNjb3JlIG1vZGU6IGN5YW4gdGV4dCBvbiByZWQgKi8KLSAgICB7KGludClLU19VRSwJIlwwMzN8MG0ifSwJLyogdW5kZXJzY29yZSBtb2RlIGVuZCAqLwotICAgIHsoaW50KUtTX0NDTywJIjE2In0sCQkvKiBhbGxvdyAxNiBjb2xvcnMgKi8KLSMgIGlmZGVmIFRFUk1JTkZPCi0gICAgeyhpbnQpS1NfQ0FCLAkiXDAzM3wlcDElZGIifSwJLyogc2V0IGJhY2tncm91bmQgY29sb3IgKi8KLSAgICB7KGludClLU19DQUYsCSJcMDMzfCVwMSVkZiJ9LAkvKiBzZXQgZm9yZWdyb3VuZCBjb2xvciAqLwotIyAgZWxzZQotICAgIHsoaW50KUtTX0NBQiwJIlwwMzN8JWRiIn0sCS8qIHNldCBiYWNrZ3JvdW5kIGNvbG9yICovCi0gICAgeyhpbnQpS1NfQ0FGLAkiXDAzM3wlZGYifSwJLyogc2V0IGZvcmVncm91bmQgY29sb3IgKi8KLSMgIGVuZGlmCi0gICAgeyhpbnQpS1NfTVMsCSJ5In0sCi0gICAgeyhpbnQpS1NfVVQsCSJ5In0sCi0gICAgeyhpbnQpS1NfTEUsCSJcYiJ9LAotIyAgaWZkZWYgVEVSTUlORk8KLSAgICB7KGludClLU19DTSwJIlwwMzN8JWklcDElZDslcDIlZEgifSwKLSMgIGVsc2UKLSAgICB7KGludClLU19DTSwJIlwwMzN8JWklZDslZEgifSwKLSMgIGVuZGlmCi0jaWZkZWYgREpHUFAKLSAgICB7KGludClLU19WQiwJIlwwMzN8QiJ9LAkvKiB2aXN1YWwgYmVsbCAqLwotI2VuZGlmCi0gICAge0tfVVAsCQkiXDMxNkgifSwKLSAgICB7S19ET1dOLAkJIlwzMTZQIn0sCi0gICAge0tfTEVGVCwJCSJcMzE2SyJ9LAotICAgIHtLX1JJR0hULAkJIlwzMTZNIn0sCi0gICAge0tfU19MRUZULAkJIlwzMTZzIn0sCi0gICAge0tfU19SSUdIVCwJCSJcMzE2dCJ9LAotICAgIHtLX1NfVEFCLAkJIlwzMTZcMDE3In0sCi0gICAge0tfRjEsCQkiXDMxNjsifSwKLSAgICB7S19GMiwJCSJcMzE2PCJ9LAotICAgIHtLX0YzLAkJIlwzMTY9In0sCi0gICAge0tfRjQsCQkiXDMxNj4ifSwKLSAgICB7S19GNSwJCSJcMzE2PyJ9LAotICAgIHtLX0Y2LAkJIlwzMTZAIn0sCi0gICAge0tfRjcsCQkiXDMxNkEifSwKLSAgICB7S19GOCwJCSJcMzE2QiJ9LAotICAgIHtLX0Y5LAkJIlwzMTZDIn0sCi0gICAge0tfRjEwLAkJIlwzMTZEIn0sCi0gICAge0tfRjExLAkJIlwzMTZcMjA1In0sCi0gICAge0tfRjEyLAkJIlwzMTZcMjA2In0sCi0gICAge0tfU19GMSwJCSJcMzE2VCJ9LAotICAgIHtLX1NfRjIsCQkiXDMxNlUifSwKLSAgICB7S19TX0YzLAkJIlwzMTZWIn0sCi0gICAge0tfU19GNCwJCSJcMzE2VyJ9LAotICAgIHtLX1NfRjUsCQkiXDMxNlgifSwKLSAgICB7S19TX0Y2LAkJIlwzMTZZIn0sCi0gICAge0tfU19GNywJCSJcMzE2WiJ9LAotICAgIHtLX1NfRjgsCQkiXDMxNlsifSwKLSAgICB7S19TX0Y5LAkJIlwzMTZcXCJ9LAotICAgIHtLX1NfRjEwLAkJIlwzMTZdIn0sCi0gICAge0tfU19GMTEsCQkiXDMxNlwyMDcifSwKLSAgICB7S19TX0YxMiwJCSJcMzE2XDIxMCJ9LAotICAgIHtLX0lOUywJCSJcMzE2UiJ9LAotICAgIHtLX0RFTCwJCSJcMzE2UyJ9LAotICAgIHtLX0hPTUUsCQkiXDMxNkcifSwKLSAgICB7S19FTkQsCQkiXDMxNk8ifSwKLSAgICB7S19QQUdFRE9XTiwJIlwzMTZRIn0sCi0gICAge0tfUEFHRVVQLAkJIlwzMTZJIn0sCi0gICAge0tfS1BMVVMsCQkiXDMxNk4ifSwKLSAgICB7S19LTUlOVVMsCQkiXDMxNkoifSwKLSAgICB7S19LTVVMVElQTFksCSJcMzE2NyJ9LAotICAgIHtLX0swLAkJIlwzMTZcMzMyIn0sCi0gICAge0tfSzEsCQkiXDMxNlwzMzYifSwKLSAgICB7S19LMiwJCSJcMzE2XDM0MiJ9LAotICAgIHtLX0szLAkJIlwzMTZcMzQ2In0sCi0gICAge0tfSzQsCQkiXDMxNlwzNTIifSwKLSAgICB7S19LNSwJCSJcMzE2XDM1NiJ9LAotICAgIHtLX0s2LAkJIlwzMTZcMzYyIn0sCi0gICAge0tfSzcsCQkiXDMxNlwzNjYifSwKLSAgICB7S19LOCwJCSJcMzE2XDM3MiJ9LAotICAgIHtLX0s5LAkJIlwzMTZcMzc2In0sCi0jIGVuZGlmCi0KICMgaWYgZGVmaW5lZChXSU4zMjY0KSB8fCBkZWZpbmVkKEFMTF9CVUlMVElOX1RDQVBTKSB8fCBkZWZpbmVkKF9fRU1YX18pCiAvKgogICogVGhlc2UgY29kZXMgYXJlIHZhbGlkIGZvciB0aGUgV2luMzIgQ29uc29sZSAuICBUaGUgZW50cmllcyB0aGF0IHN0YXJ0IHdpdGgKQEAgLTEzNjksMTAgKzEyNjgsNiBAQAogIyBkZWZpbmUgREVGQVVMVF9URVJNCShjaGFyX3UgKikid2luMzIiCiAjZW5kaWYKIAotI2lmZGVmIE1TRE9TCi0jIGRlZmluZSBERUZBVUxUX1RFUk0JKGNoYXJfdSAqKSJwY3Rlcm0iCi0jZW5kaWYKLQogI2lmIGRlZmluZWQoVU5JWCkgJiYgIWRlZmluZWQoX19NSU5UX18pCiAjIGRlZmluZSBERUZBVUxUX1RFUk0JKGNoYXJfdSAqKSJhbnNpIgogI2VuZGlmCkBAIC0xOTcxLDcgKzE4NjYsNyBAQAogCS8qIHRlcm1jYXAgZmFpbGVkIHRvIHJlcG9ydCBzaXplICovCiAJLyogc2V0IGRlZmF1bHRzLCBpbiBjYXNlIHVpX2dldF9zaGVsbHNpemUoKSBhbHNvIGZhaWxzICovCiAJd2lkdGggPSA4MDsKLSNpZiBkZWZpbmVkKE1TRE9TKSB8fCBkZWZpbmVkKFdJTjMyNjQpCisjaWYgZGVmaW5lZChXSU4zMjY0KQogCWhlaWdodCA9IDI1OwkgICAgLyogY29uc29sZSBpcyBvZnRlbiAyNSBsaW5lcyAqLwogI2Vsc2UKIAloZWlnaHQgPSAyNDsJICAgIC8qIG1vc3QgdGVybWluYWxzIGFyZSAyNCBsaW5lcyAqLwpAQCAtNDQ4Miw3ICs0Mzc3LDcgQEAKIAkgICAgaWYgKGtleV9uYW1lWzBdID09IChpbnQpS1NfTU9VU0UpCiAJICAgIHsKIAkJLyoKLQkJICogRm9yIHh0ZXJtIGFuZCBNU0RPUyB3ZSBnZXQgIjx0X21vdXNlPnNjciIsIHdoZXJlCisJCSAqIEZvciB4dGVybSB3ZSBnZXQgIjx0X21vdXNlPnNjciIsIHdoZXJlCiAJCSAqICBzID09IGVuY29kZWQgYnV0dG9uIHN0YXRlOgogCQkgKgkgICAweDIwID0gbGVmdCBidXR0b24gZG93bgogCQkgKgkgICAweDIxID0gbWlkZGxlIGJ1dHRvbiBkb3duCkBAIC00NjQ2LDcgKzQ1NDEsNyBAQAogI2VuZGlmCiAJICAgICkKIAl7Ci0jICBpZiAhZGVmaW5lZChNU1dJTikgJiYgIWRlZmluZWQoTVNET1MpCisjICBpZiAhZGVmaW5lZChNU1dJTikKIAkJLyoKIAkJICogSGFuZGxlIG1vdXNlIGV2ZW50cy4KIAkJICogUmVjb2duaXplIHRoZSB4dGVybSBtb3VzZSB3aGVlbCwgYnV0IG5vdCBpbiB0aGUgR1VJLCB0aGUKZGlmZiAtLWdpdCBhL3NyYy91bmRvLmMgYi9zcmMvdW5kby5jCmluZGV4IDI3ZTIyMTguLjJiZjgxNWIgMTAwNjQ0Ci0tLSBhL3NyYy91bmRvLmMKKysrIGIvc3JjL3VuZG8uYwpAQCAtNjQxLDkgKzY0MSw5IEBACiAJdV9nZXRib3QoKTsKICAgICB9CiAKLSNpZiAhZGVmaW5lZChVTklYKSAmJiAhZGVmaW5lZChESkdQUCkgJiYgIWRlZmluZWQoV0lOMzIpICYmICFkZWZpbmVkKF9fRU1YX18pCisjaWYgIWRlZmluZWQoVU5JWCkgJiYgIWRlZmluZWQoV0lOMzIpICYmICFkZWZpbmVkKF9fRU1YX18pCiAJLyoKLQkgKiBXaXRoIEFtaWdhIGFuZCBNU0RPUyAxNiBiaXQgd2UgY2FuJ3QgaGFuZGxlIGJpZyB1bmRvJ3MsIGJlY2F1c2UKKwkgKiBXaXRoIEFtaWdhIHdlIGNhbid0IGhhbmRsZSBiaWcgdW5kbydzLCBiZWNhdXNlCiAJICogdGhlbiB1X2FsbG9jX2xpbmUgd291bGQgaGF2ZSB0byBhbGxvY2F0ZSBhIGJsb2NrIGxhcmdlciB0aGFuIDMySwogCSAqLwogICAgIGlmIChzaXplID49IDgwMDApCmRpZmYgLS1naXQgYS9zcmMvdW5pbnN0YWwuYyBiL3NyYy91bmluc3RhbC5jCmluZGV4IDA1MzJlYjkuLjc5ZjZlZjYgMTAwNjQ0Ci0tLSBhL3NyYy91bmluc3RhbC5jCisrKyBiL3NyYy91bmluc3RhbC5jCkBAIC0yODksNDEgKzI4OSw3IEBACiAgICAgc3RhdGljIHZvaWQKIGRlbGV0ZV91bmluc3RhbGxfa2V5KHZvaWQpCiB7Ci0jaWZkZWYgV0lOMzI2NAogICAgIHJlZ19kZWxldGVfa2V5KEhLRVlfTE9DQUxfTUFDSElORSwgIlNvZnR3YXJlXFxNaWNyb3NvZnRcXFdpbmRvd3NcXEN1cnJlbnRWZXJzaW9uXFxVbmluc3RhbGxcXFZpbSAiIFZJTV9WRVJTSU9OX1NIT1JUKTsKLSNlbHNlCi0gICAgRklMRQkqZmQ7Ci0gICAgY2hhcglidWZbQlVGU0laRV07Ci0KLSAgICAvKgotICAgICAqIE9uIERKR1BQIHdlIGRlbGV0ZSByZWdpc3RyeSBlbnRyaWVzIGJ5IGNyZWF0aW5nIGEgLmluZiBmaWxlIGFuZAotICAgICAqIGluc3RhbGxpbmcgaXQuCi0gICAgICovCi0gICAgZmQgPSBmb3BlbigidmltLmluZiIsICJ3Iik7Ci0gICAgaWYgKGZkICE9IE5VTEwpCi0gICAgewotCWZwcmludGYoZmQsICJbdmVyc2lvbl1cbiIpOwotCWZwcmludGYoZmQsICJzaWduYXR1cmU9XCIkQ0hJQ0FHTyRcIlxuXG4iKTsKLQlmcHJpbnRmKGZkLCAiW0RlZmF1bHRJbnN0YWxsXVxuIik7Ci0JZnByaW50ZihmZCwgIkRlbFJlZz1EZWxldGVNZVxuXG4iKTsKLQlmcHJpbnRmKGZkLCAiW0RlbGV0ZU1lXVxuIik7Ci0JZnByaW50ZihmZCwgIkhLTE0sXCJTb2Z0d2FyZVxcTWljcm9zb2Z0XFxXaW5kb3dzXFxDdXJyZW50VmVyc2lvblxcVW5pbnN0YWxsXFxWaW0gIiBWSU1fVkVSU0lPTl9TSE9SVCAiXCJcbiIpOwotCWZjbG9zZShmZCk7Ci0KLQkvKiBEb24ndCBrbm93IGhvdyB0byBkZXRlY3QgV2luIE5UIHdpdGggREpHUFAuICBIYWNrOiBKdXN0IHRyeSB0aGUgV2luCi0JICogOTUvOTgvTUUgbWV0aG9kLCBzaW5jZSB0aGUgREpHUFAgdmVyc2lvbiBjYW4ndCB1c2UgbG9uZyBmaWxlbmFtZXMKLQkgKiBvbiBXaW4gTlQgYW55d2F5LiAqLwotCXNwcmludGYoYnVmLCAicnVuZGxsIHNldHVweC5kbGwsSW5zdGFsbEhpbmZTZWN0aW9uIERlZmF1bHRJbnN0YWxsIDEzMiAlc1xcdmltLmluZiIsIGluc3RhbGxkaXIpOwotCXJ1bl9jb21tYW5kKGJ1Zik7Ci0jaWYgMAotCS8qIFdpbmRvd3MgTlQgbWV0aG9kICh1bnRlc3RlZCkuICovCi0Jc3ByaW50ZihidWYsICJydW5kbGwzMiBzeXNzZXR1cCxTZXR1cEluZk9iamVjdEluc3RhbGxBY3Rpb24gRGVmYXVsdEluc3RhbGwgMTI4ICVzXFx2aW0uaW5mIiwgaW5zdGFsbGRpcik7Ci0JcnVuX2NvbW1hbmQoYnVmKTsKLSNlbmRpZgotCi0JcmVtb3ZlKCJ2aW0uaW5mIik7Ci0gICAgfQotI2VuZGlmCiB9CiAKICAgICBpbnQKZGlmZiAtLWdpdCBhL3NyYy92ZXJzaW9uLmMgYi9zcmMvdmVyc2lvbi5jCmluZGV4IGMyM2RiODIuLmU4MjI2MTkgMTAwNjQ0Ci0tLSBhL3NyYy92ZXJzaW9uLmMKKysrIGIvc3JjL3ZlcnNpb24uYwpAQCAtNzQ5LDYgKzc0OSw4IEBACiBzdGF0aWMgaW50IGluY2x1ZGVkX3BhdGNoZXNbXSA9CiB7ICAgLyogQWRkIG5ldyBwYXRjaCBudW1iZXIgYmVsb3cgdGhpcyBsaW5lICovCiAvKiovCisgICAgMTM5OSwKKy8qKi8KICAgICAxMzk4LAogLyoqLwogICAgIDEzOTcsCkBAIC0zNzA5LDEzICszNzExLDYgQEAKICMgIGVuZGlmCiAjIGVuZGlmCiAjZW5kaWYKLSNpZmRlZiBNU0RPUwotIyBpZmRlZiBESkdQUAotICAgIE1TR19QVVRTKF8oIlxuMzItYml0IE1TLURPUyB2ZXJzaW9uIikpOwotIyBlbHNlCi0gICAgTVNHX1BVVFMoXygiXG4xNi1iaXQgTVMtRE9TIHZlcnNpb24iKSk7Ci0jIGVuZGlmCi0jZW5kaWYKICNpZmRlZiBNQUNPUwogIyBpZmRlZiBNQUNPU19YCiAjICBpZmRlZiBNQUNPU19YX1VOSVgKZGlmZiAtLWdpdCBhL3NyYy92aW0uaCBiL3NyYy92aW0uaAppbmRleCA3YTdhNzU4Li40MTU2NjcxIDEwMDY0NAotLS0gYS9zcmMvdmltLmgKKysrIGIvc3JjL3ZpbS5oCkBAIC0yNyw4ICsyNyw3IEBACiAjIGVuZGlmCiAjZW5kaWYKIAotI2lmIGRlZmluZWQoTVNET1MpIHx8IGRlZmluZWQoV0lOMzIpIHx8IGRlZmluZWQoX1dJTjY0KSBcCi0JfHwgZGVmaW5lZChfX0VNWF9fKQorI2lmIGRlZmluZWQoV0lOMzIpIHx8IGRlZmluZWQoX1dJTjY0KSB8fCBkZWZpbmVkKF9fRU1YX18pCiAjIGluY2x1ZGUgInZpbWlvLmgiCiAjZW5kaWYKIApAQCAtMTY0LDIxICsxNjMsNiBAQAogI2lmZGVmIFdJTjMyNjQKICMgZGVmaW5lIFZJTV9TSVpFT0ZfSU5UIDQKICNlbmRpZgotI2lmZGVmIE1TRE9TCi0jIGlmZGVmIERKR1BQCi0jICBpZm5kZWYgRkVBVF9HVUlfR1RLCQkvKiBhdm9pZCBwcm9ibGVtcyB3aGVuIGdlbmVyYXRpbmcgcHJvdG90eXBlcyAqLwotIyAgIGRlZmluZSBWSU1fU0laRU9GX0lOVCA0CS8qIDMyIGJpdCBpbnRzICovCi0jICBlbmRpZgotIyAgZGVmaW5lIERPUzMyCi0jICBkZWZpbmUgRkVBVF9DTElQQk9BUkQKLSMgZWxzZQotIyAgaWZuZGVmIEZFQVRfR1VJX0dUSwkJLyogYXZvaWQgcHJvYmxlbXMgd2hlbiBnZW5lcmF0aW5nIHByb3RvdHlwZXMgKi8KLSMgICBkZWZpbmUgVklNX1NJWkVPRl9JTlQgMgkvKiAxNiBiaXQgaW50cyAqLwotIyAgZW5kaWYKLSMgIGRlZmluZSBTTUFMTF9NQUxMT0MJCS8qIDE2IGJpdCBzdG9yYWdlIGFsbG9jYXRpb24gKi8KLSMgIGRlZmluZSBET1MxNgotIyBlbmRpZgotI2VuZGlmCiAKICNpZmRlZiBBTUlHQQogICAvKiBCZSBjb25zZXJ2YXRpdmUgYWJvdXQgc2l6ZW9mKGludCkuIEl0IGNvdWxkIGJlIDQgdG9vLiAqLwpAQCAtMzAzLDEwICsyODcsNiBAQAogIyBpbmNsdWRlICJvc19hbWlnYS5oIgogI2VuZGlmCiAKLSNpZmRlZiBNU0RPUwotIyBpbmNsdWRlICJvc19tc2Rvcy5oIgotI2VuZGlmCi0KICNpZmRlZiBXSU4zMjY0CiAjIGluY2x1ZGUgIm9zX3dpbjMyLmgiCiAjZW5kaWYKQEAgLTQ2MiwxMSArNDQyLDExIEBACiAjaWZkZWYgX0RDQwogIyBpbmNsdWRlIDxzeXMvc3RhdC5oPgogI2VuZGlmCi0jaWYgZGVmaW5lZChNU0RPUykgfHwgZGVmaW5lZChNU1dJTikKKyNpZiBkZWZpbmVkKE1TV0lOKQogIyBpbmNsdWRlIDxzeXMvc3RhdC5oPgogI2VuZGlmCiAKLSNpZiBkZWZpbmVkKEhBVkVfRVJSTk9fSCkgfHwgZGVmaW5lZChESkdQUCkgXAorI2lmIGRlZmluZWQoSEFWRV9FUlJOT19IKSBcCiAJfHwgZGVmaW5lZChXSU4zMikgfHwgZGVmaW5lZChfV0lONjQpIHx8IGRlZmluZWQoX19FTVhfXykKICMgaW5jbHVkZSA8ZXJybm8uaD4KICNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3dpbmRvdy5jIGIvc3JjL3dpbmRvdy5jCmluZGV4IGFlMTc2NjAuLmVlNjk5MjEgMTAwNjQ0Ci0tLSBhL3NyYy93aW5kb3cuYworKysgYi9zcmMvd2luZG93LmMKQEAgLTY0MzgsNyArNjQzOCw3IEBACiAJLyogc29tZXRoaW5nIGZhaWxlZDsgdXNlIHRoZSBmaWxlIG5hbWUgKHRydW5jYXRlIHdoZW4gdG9vIGxvbmcpICovCiAJdmltX3N0cm5jcHkoYnVmLCBmbmFtZSwgbGVuIC0gMSk7CiAgICAgfQotI2lmIGRlZmluZWQoTUFDT1NfQ0xBU1NJQykgfHwgZGVmaW5lZChNU0RPUykgfHwgZGVmaW5lZChNU1dJTikKKyNpZiBkZWZpbmVkKE1BQ09TX0NMQVNTSUMpIHx8IGRlZmluZWQoTVNXSU4pCiAgICAgc2xhc2hfYWRqdXN0KGJ1Zik7CiAjZW5kaWYKICAgICByZXR1cm4gcmV0dmFsOwpkaWZmIC0tZ2l0IGEvc3JjL3h4ZC9NYWtlX2JjMy5tYWsgYi9zcmMveHhkL01ha2VfYmMzLm1hawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGVlMjUyMS4uMDAwMDAwMAotLS0gYS9zcmMveHhkL01ha2VfYmMzLm1haworKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLSMgU2ltcGxlIG1ha2VmaWxlIGZvciBCb3JsYW5kIEMrKyA0LjAKLSMgMy4xIGNhbiBOT1QgYmUgdXNlZCwgaXQgaGFzIHByb2JsZW1zIHdpdGggdGhlIGZpbGVubygpIGRlZmluZS4KLQotIyBDb21tYW5kIGxpbmUgdmFyaWFibGVzOgotIyBCT1IJCXBhdGggdG8gcm9vdCBvZiBCb3JsYW5kIEMgKEU6XEJPUkxBTkRDKQotIyBERUJVRwkJc2V0IHRvICJ5ZXMiIGZvciBkZWJ1Z2dpbmcgKG5vKQotCi0haWZuZGVmIEJPUgotQk9SCT0gZTpcYmM0Ci0hZW5kaWYKLQotIWlmICgiJChERUJVRykiID09ICJ5ZXMiKQotREVCVUdfRkxBRyA9IC12IC1EREVCVUcKLSFlbHNlCi1ERUJVR19GTEFHID0KLSFlbmRpZgotCi1DQwk9ICQoQk9SKVxiaW5cYmNjCi1JTkMJPSAtSSQoQk9SKVxpbmNsdWRlCi1MSUIJPSAtTCQoQk9SKVxsaWIKLQotIyBUaGUgZm9sbG93aW5nIGNvbXBpbGUgb3B0aW9ucyBjYW4gYmUgY2hhbmdlZCBmb3IgYmV0dGVyIG1hY2hpbmVzLgotIwlyZXBsYWNlIC0xLSB3aXRoIC0yIHRvIHByb2R1Y2UgY29kZSBmb3IgYSA4MDI4NiBvciBoaWdoZXIKLSMJcmVwbGFjZSAtMS0gd2l0aCAtMyB0byBwcm9kdWNlIGNvZGUgZm9yIGEgODAzODYgb3IgaGlnaGVyCi0jCWFkZCAtdiBmb3Igc291cmNlIGRlYnVnZ2luZwotT1BUSU1JWkU9IC0xLSAtT3gKLQotQ0ZMQUdTCT0gLUEgLW1jIC1ETVNET1MgJChERUJVR19GTEFHKSAkKE9QVElNSVpFKSAkKElOQykgJChMSUIpCi0KLXh4ZC5leGU6IHh4ZC5jCi0JJChDQykgJChDRkxBR1MpIHh4ZC5jCmRpZmYgLS1naXQgYS9zcmMveHhkL01ha2VfZGpnLm1hayBiL3NyYy94eGQvTWFrZV9kamcubWFrCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNmVlZDMxLi4wMDAwMDAwCi0tLSBhL3NyYy94eGQvTWFrZV9kamcubWFrCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi0jIFRoZSBtb3N0IHNpbXBsaXN0aWMgTWFrZWZpbGUsIGZvciBESkdQUCBvbiBNUy1ET1MKLQotQ0ZMQUdTID0gLU8yIC1XYWxsCi0KLXh4ZC5leGU6IHh4ZC5jCi0JZ2NjICQoQ0ZMQUdTKSAtcyAtbyB4eGQuZXhlIHh4ZC5jIC1scGMKLQotY2xlYW46Ci0JZGVsIHh4ZC5leGUK