LyoKICogcGFyc2UuYwogKgogKi8KLyogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29weXJpZ2h0cy4gIFNlZQogKiB0aGUgTmV0LVNOTVAncyBDT1BZSU5HIGZpbGUgZm9yIG1vcmUgZGV0YWlscyBhbmQgb3RoZXIgY29weXJpZ2h0cwogKiB0aGF0IG1heSBhcHBseToKICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICAgICBDb3B5cmlnaHQgMTk4OSwgMTk5MSwgMTk5MiBieSBDYXJuZWdpZSBNZWxsb24gVW5pdmVyc2l0eQoKICAgICAgICAgICAgICAgICAgICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKClBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kIGl0cwpkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsCnByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCnN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgQ01VIG5vdCBiZQp1c2VkIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUKc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLgoKQ01VIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLCBJTkNMVURJTkcKQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PIEVWRU5UIFNIQUxMCkNNVSBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IKQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLApXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sCkFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMKU09GVFdBUkUuCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoKICogQ29weXJpZ2h0IKkgMjAwMyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqIFVzZSBpcyBzdWJqZWN0IHRvIGxpY2Vuc2UgdGVybXMgc3BlY2lmaWVkIGluIHRoZSBDT1BZSU5HIGZpbGUKICogZGlzdHJpYnV0ZWQgd2l0aCB0aGUgTmV0LVNOTVAgcGFja2FnZS4KICovCiNpbmNsdWRlIDxuZXQtc25tcC9uZXQtc25tcC1jb25maWcuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL25ldC1zbm1wLWZlYXR1cmVzLmg+CgojaWZuZGVmIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORwoKI2lmIEhBVkVfTElNSVRTX0gKI2luY2x1ZGUgPGxpbWl0cy5oPgojZW5kaWYKI2luY2x1ZGUgPHN0ZGlvLmg+CiNpZiBIQVZFX1NURExJQl9ICiNpbmNsdWRlIDxzdGRsaWIuaD4KI2VuZGlmCiNpZiBIQVZFX1NUUklOR19ICiNpbmNsdWRlIDxzdHJpbmcuaD4KI2Vsc2UKI2luY2x1ZGUgPHN0cmluZ3MuaD4KI2VuZGlmCiNpbmNsdWRlIDxjdHlwZS5oPgojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNpZiBIQVZFX1NZU19TVEFUX0gKI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiNlbmRpZgoKLyoKICogV293LiAgVGhpcyBpcyB1Z2x5LiAgLS0gV2VzIAogKi8KI2lmIEhBVkVfRElSRU5UX0gKIyBpbmNsdWRlIDxkaXJlbnQuaD4KIyBkZWZpbmUgTkFNTEVOKGRpcmVudCkgc3RybGVuKChkaXJlbnQpLT5kX25hbWUpCiNlbHNlCiMgZGVmaW5lIGRpcmVudCBkaXJlY3QKIyBkZWZpbmUgTkFNTEVOKGRpcmVudCkgKGRpcmVudCktPmRfbmFtbGVuCiMgaWYgSEFWRV9TWVNfTkRJUl9ICiMgIGluY2x1ZGUgPHN5cy9uZGlyLmg+CiMgZW5kaWYKIyBpZiBIQVZFX1NZU19ESVJfSAojICBpbmNsdWRlIDxzeXMvZGlyLmg+CiMgZW5kaWYKIyBpZiBIQVZFX05ESVJfSAojICBpbmNsdWRlIDxuZGlyLmg+CiMgZW5kaWYKI2VuZGlmCiNpZiBUSU1FX1dJVEhfU1lTX1RJTUUKIyBpbmNsdWRlIDxzeXMvdGltZS5oPgojIGluY2x1ZGUgPHRpbWUuaD4KI2Vsc2UKIyBpZiBIQVZFX1NZU19USU1FX0gKIyAgaW5jbHVkZSA8c3lzL3RpbWUuaD4KIyBlbHNlCiMgIGluY2x1ZGUgPHRpbWUuaD4KIyBlbmRpZgojZW5kaWYKI2lmIEhBVkVfTkVUSU5FVF9JTl9ICiNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CiNlbmRpZgojaWYgZGVmaW5lZChIQVZFX1JFR0VYX0gpICYmIGRlZmluZWQoSEFWRV9SRUdDT01QKQojaW5jbHVkZSA8cmVnZXguaD4KI2VuZGlmCiNpZiBIQVZFX1VOSVNURF9ICiNpbmNsdWRlIDx1bmlzdGQuaD4KI2VuZGlmCiNpZiBIQVZFX0RNQUxMT0NfSAojaW5jbHVkZSA8ZG1hbGxvYy5oPgojZW5kaWYKCiNpbmNsdWRlIDxlcnJuby5oPgoKI2luY2x1ZGUgPG5ldC1zbm1wL3R5cGVzLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9vdXRwdXRfYXBpLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9jb25maWdfYXBpLmg+CiNpbmNsdWRlIDxuZXQtc25tcC91dGlsaXRpZXMuaD4KCiNpbmNsdWRlIDxuZXQtc25tcC9saWJyYXJ5L3BhcnNlLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9saWJyYXJ5L21pYi5oPgojaW5jbHVkZSA8bmV0LXNubXAvbGlicmFyeS9zbm1wX2FwaS5oPgojaW5jbHVkZSA8bmV0LXNubXAvbGlicmFyeS90b29scy5oPgoKbmV0c25tcF9mZWF0dXJlX2NoaWxkX29mKGZpbmRfbW9kdWxlLCBtaWJfYXBpKQpuZXRzbm1wX2ZlYXR1cmVfY2hpbGRfb2YoZ2V0X3RjX2Rlc2NyaXB0aW9uLCBtaWJfYXBpKQoKLyoKICogQSBsaW5rZWQgbGlzdCBvZiBub2Rlcy4KICovCnN0cnVjdCBub2RlIHsKICAgIHN0cnVjdCBub2RlICAgICpuZXh0OwogICAgY2hhciAgICAgICAgICAgKmxhYmVsOyAgLyogVGhpcyBub2RlJ3MgKHVuaXF1ZSkgdGV4dHVhbCBuYW1lICovCiAgICB1X2xvbmcgICAgICAgICAgc3ViaWQ7ICAvKiBUaGlzIG5vZGUncyBpbnRlZ2VyIHN1YmlkZW50aWZpZXIgKi8KICAgIGludCAgICAgICAgICAgICBtb2RpZDsgIC8qIFRoZSBtb2R1bGUgY29udGFpbmluZyB0aGlzIG5vZGUgKi8KICAgIGNoYXIgICAgICAgICAgICpwYXJlbnQ7IC8qIFRoZSBwYXJlbnQncyB0ZXh0dWFsIG5hbWUgKi8KICAgIGludCAgICAgICAgICAgICB0Y19pbmRleDsgLyogaW5kZXggaW50byB0Y2xpc3QgKC0xIGlmIE5BKSAqLwogICAgaW50ICAgICAgICAgICAgIHR5cGU7ICAgLyogVGhlIHR5cGUgb2Ygb2JqZWN0IHRoaXMgcmVwcmVzZW50cyAqLwogICAgaW50ICAgICAgICAgICAgIGFjY2VzczsKICAgIGludCAgICAgICAgICAgICBzdGF0dXM7CiAgICBzdHJ1Y3QgZW51bV9saXN0ICplbnVtczsgLyogKG9wdGlvbmFsKSBsaXN0IG9mIGVudW1lcmF0ZWQgaW50ZWdlcnMgKi8KICAgIHN0cnVjdCByYW5nZV9saXN0ICpyYW5nZXM7CiAgICBzdHJ1Y3QgaW5kZXhfbGlzdCAqaW5kZXhlczsKICAgIGNoYXIgICAgICAgICAgICphdWdtZW50czsKICAgIHN0cnVjdCB2YXJiaW5kX2xpc3QgKnZhcmJpbmRzOwogICAgY2hhciAgICAgICAgICAgKmhpbnQ7CiAgICBjaGFyICAgICAgICAgICAqdW5pdHM7CiAgICBjaGFyICAgICAgICAgICAqZGVzY3JpcHRpb247IC8qIGRlc2NyaXB0aW9uIChhIHF1b3RlZCBzdHJpbmcpICovCiAgICBjaGFyICAgICAgICAgICAqcmVmZXJlbmNlOyAvKiByZWZlcmVuY2VzIChhIHF1b3RlZCBzdHJpbmcpICovCiAgICBjaGFyICAgICAgICAgICAqZGVmYXVsdFZhbHVlOwogICAgY2hhciAgICAgICAgICAgKmZpbGVuYW1lOwogICAgaW50ICAgICAgICAgICAgIGxpbmVubzsKfTsKCi8qCiAqIFRoaXMgaXMgb25lIGVsZW1lbnQgb2YgYW4gb2JqZWN0IGlkZW50aWZpZXIgd2l0aCBlaXRoZXIgYW4gaW50ZWdlcgogKiBzdWJpZGVudGlmaWVyLCBvciBhIHRleHR1YWwgc3RyaW5nIGxhYmVsLCBvciBib3RoLgogKiBUaGUgc3ViaWQgaXMgLTEgaWYgbm90IHByZXNlbnQsIGFuZCBsYWJlbCBpcyBOVUxMIGlmIG5vdCBwcmVzZW50LgogKi8Kc3RydWN0IHN1YmlkX3MgewogICAgaW50ICAgICAgICAgICAgIHN1YmlkOwogICAgaW50ICAgICAgICAgICAgIG1vZGlkOwogICAgY2hhciAgICAgICAgICAgKmxhYmVsOwp9OwoKI2RlZmluZSBNQVhUQyAgIDQwOTYKc3RydWN0IHRjIHsgICAgICAgICAgICAgICAgICAgICAvKiB0ZXh0dWFsIGNvbnZlbnRpb25zICovCiAgICBpbnQgICAgICAgICAgICAgdHlwZTsKICAgIGludCAgICAgICAgICAgICBtb2RpZDsKICAgIGNoYXIgICAgICAgICAgICpkZXNjcmlwdG9yOwogICAgY2hhciAgICAgICAgICAgKmhpbnQ7CiAgICBzdHJ1Y3QgZW51bV9saXN0ICplbnVtczsKICAgIHN0cnVjdCByYW5nZV9saXN0ICpyYW5nZXM7CiAgICBjaGFyICAgICAgICAgICAqZGVzY3JpcHRpb247Cn0gdGNsaXN0W01BWFRDXTsKCmludCAgICAgICAgICAgICBtaWJMaW5lID0gMDsKY29uc3QgY2hhciAgICAgKkZpbGUgPSAiKG5vbmUpIjsKc3RhdGljIGludCAgICAgIGFub255bW91cyA9IDA7CgpzdHJ1Y3Qgb2JqZ3JvdXAgewogICAgY2hhciAgICAgICAgICAgKm5hbWU7CiAgICBpbnQgICAgICAgICAgICAgbGluZTsKICAgIHN0cnVjdCBvYmpncm91cCAqbmV4dDsKfSAgICAgICAgICAgICAgKm9iamdyb3VwcyA9IE5VTEwsICpvYmplY3RzID0gTlVMTCwgKm5vdGlmcyA9IE5VTEw7CgojZGVmaW5lIFNZTlRBWF9NQVNLICAgICAweDgwCi8qCiAqIHR5cGVzIG9mIHRva2VucwogKiBUb2tlbnMgd2lodCB0aGUgU1lOVEFYX01BU0sgYml0IHNldCBhcmUgc3ludGF4IHRva2VucyAKICovCiNkZWZpbmUgQ09OVElOVUUgICAgLTEKI2RlZmluZSBFTkRPRkZJTEUgICAwCiNkZWZpbmUgTEFCRUwgICAgICAgMQojZGVmaW5lIFNVQlRSRUUgICAgIDIKI2RlZmluZSBTWU5UQVggICAgICAzCiNkZWZpbmUgT0JKSUQgICAgICAgKDQgfCBTWU5UQVhfTUFTSykKI2RlZmluZSBPQ1RFVFNUUiAgICAoNSB8IFNZTlRBWF9NQVNLKQojZGVmaW5lIElOVEVHRVIgICAgICg2IHwgU1lOVEFYX01BU0spCiNkZWZpbmUgTkVUQUREUiAgICAgKDcgfCBTWU5UQVhfTUFTSykKI2RlZmluZSBJUEFERFIgICAgICAoOCB8IFNZTlRBWF9NQVNLKQojZGVmaW5lIENPVU5URVIgICAgICg5IHwgU1lOVEFYX01BU0spCiNkZWZpbmUgR0FVR0UgICAgICAgKDEwIHwgU1lOVEFYX01BU0spCiNkZWZpbmUgVElNRVRJQ0tTICAgKDExIHwgU1lOVEFYX01BU0spCiNkZWZpbmUgS1dfT1BBUVVFICAgKDEyIHwgU1lOVEFYX01BU0spCiNkZWZpbmUgTlVMICAgICAgICAgKDEzIHwgU1lOVEFYX01BU0spCiNkZWZpbmUgU0VRVUVOQ0UgICAgMTQKI2RlZmluZSBPRiAgICAgICAgICAxNSAgICAgICAgICAvKiBTRVFVRU5DRSBPRiAqLwojZGVmaW5lIE9CSlRZUEUgICAgIDE2CiNkZWZpbmUgQUNDRVNTICAgICAgMTcKI2RlZmluZSBSRUFET05MWSAgICAxOAojZGVmaW5lIFJFQURXUklURSAgIDE5CiNkZWZpbmUgV1JJVEVPTkxZICAgMjAKI2lmZGVmIE5PQUNDRVNTCiN1bmRlZiBOT0FDQ0VTUyAgICAgICAgICAgICAgICAgLyogYWdlbnQgJ05PQUNDRVNTJyB0b2tlbiAqLwojZW5kaWYKI2RlZmluZSBOT0FDQ0VTUyAgICAyMQojZGVmaW5lIFNUQVRVUyAgICAgIDIyCiNkZWZpbmUgTUFOREFUT1JZICAgMjMKI2RlZmluZSBLV19PUFRJT05BTCAgICAyNAojZGVmaW5lIE9CU09MRVRFICAgIDI1Ci8qCiAqICNkZWZpbmUgUkVDT01NRU5ERUQgMjYgCiAqLwojZGVmaW5lIFBVTkNUICAgICAgIDI3CiNkZWZpbmUgRVFVQUxTICAgICAgMjgKI2RlZmluZSBOVU1CRVIgICAgICAyOQojZGVmaW5lIExFRlRCUkFDS0VUIDMwCiNkZWZpbmUgUklHSFRCUkFDS0VUIDMxCiNkZWZpbmUgTEVGVFBBUkVOICAgMzIKI2RlZmluZSBSSUdIVFBBUkVOICAzMwojZGVmaW5lIENPTU1BICAgICAgIDM0CiNkZWZpbmUgREVTQ1JJUFRJT04gMzUKI2RlZmluZSBRVU9URVNUUklORyAzNgojZGVmaW5lIElOREVYICAgICAgIDM3CiNkZWZpbmUgREVGVkFMICAgICAgMzgKI2RlZmluZSBERVBSRUNBVEVEICAzOQojZGVmaW5lIFNJWkUgICAgICAgIDQwCiNkZWZpbmUgQklUU1RSSU5HICAgKDQxIHwgU1lOVEFYX01BU0spCiNkZWZpbmUgTlNBUEFERFJFU1MgKDQyIHwgU1lOVEFYX01BU0spCiNkZWZpbmUgQ09VTlRFUjY0ICAgKDQzIHwgU1lOVEFYX01BU0spCiNkZWZpbmUgT0JKR1JPVVAgICAgNDQKI2RlZmluZSBOT1RJRlRZUEUgICA0NQojZGVmaW5lIEFVR01FTlRTICAgIDQ2CiNkZWZpbmUgQ09NUExJQU5DRSAgNDcKI2RlZmluZSBSRUFEQ1JFQVRFICA0OAojZGVmaW5lIFVOSVRTICAgICAgIDQ5CiNkZWZpbmUgUkVGRVJFTkNFICAgNTAKI2RlZmluZSBOVU1fRU5UUklFUyA1MQojZGVmaW5lIE1PRFVMRUlERU5USVRZIDUyCiNkZWZpbmUgTEFTVFVQREFURUQgNTMKI2RlZmluZSBPUkdBTklaQVRJT04gNTQKI2RlZmluZSBDT05UQUNUSU5GTyA1NQojZGVmaW5lIFVJTlRFR0VSMzIgKDU2IHwgU1lOVEFYX01BU0spCiNkZWZpbmUgQ1VSUkVOVCAgICAgNTcKI2RlZmluZSBERUZJTklUSU9OUyA1OAojZGVmaW5lIEVORCAgICAgICAgIDU5CiNkZWZpbmUgU0VNSSAgICAgICAgNjAKI2RlZmluZSBUUkFQVFlQRSAgICA2MQojZGVmaW5lIEVOVEVSUFJJU0UgIDYyCi8qCiAqICNkZWZpbmUgRElTUExBWVNUUiAoNjMgfCBTWU5UQVhfTUFTSykgCiAqLwojZGVmaW5lIEJFR0lOICAgICAgIDY0CiNkZWZpbmUgSU1QT1JUUyAgICAgNjUKI2RlZmluZSBFWFBPUlRTICAgICA2NgojZGVmaW5lIEFDQ05PVElGWSAgIDY3CiNkZWZpbmUgQkFSICAgICAgICAgNjgKI2RlZmluZSBSQU5HRSAgICAgICA2OQojZGVmaW5lIENPTlZFTlRJT04gIDcwCiNkZWZpbmUgRElTUExBWUhJTlQgNzEKI2RlZmluZSBGUk9NICAgICAgICA3MgojZGVmaW5lIEFHRU5UQ0FQICAgIDczCiNkZWZpbmUgTUFDUk8gICAgICAgNzQKI2RlZmluZSBJTVBMSUVEICAgICA3NQojZGVmaW5lIFNVUFBPUlRTICAgIDc2CiNkZWZpbmUgSU5DTFVERVMgICAgNzcKI2RlZmluZSBWQVJJQVRJT04gICA3OAojZGVmaW5lIFJFVklTSU9OICAgIDc5CiNkZWZpbmUgTk9USU1QTAkgICAgODAKI2RlZmluZSBPQkpFQ1RTCSAgICA4MQojZGVmaW5lIE5PVElGSUNBVElPTlMJODIKI2RlZmluZSBNT0RVTEUJICAgIDgzCiNkZWZpbmUgTUlOQUNDRVNTICAgODQKI2RlZmluZSBQUk9EUkVMCSAgICA4NQojZGVmaW5lIFdSU1lOVEFYICAgIDg2CiNkZWZpbmUgQ1JFQVRFUkVRICAgODcKI2RlZmluZSBOT1RJRkdST1VQICA4OAojZGVmaW5lIE1BTkRBVE9SWUdST1VQUwk4OQojZGVmaW5lIEdST1VQCSAgICA5MAojZGVmaW5lIE9CSkVDVAkgICAgOTEKI2RlZmluZSBJREVOVElGSUVSICA5MgojZGVmaW5lIENIT0lDRQkgICAgOTMKI2RlZmluZSBMRUZUU1FCUkFDSwk5NQojZGVmaW5lIFJJR0hUU1FCUkFDSwk5NgojZGVmaW5lIElNUExJQ0lUICAgIDk3CiNkZWZpbmUgQVBQU1lOVEFYCSg5OCB8IFNZTlRBWF9NQVNLKQojZGVmaW5lIE9CSlNZTlRBWAkoOTkgfCBTWU5UQVhfTUFTSykKI2RlZmluZSBTSU1QTEVTWU5UQVgJKDEwMCB8IFNZTlRBWF9NQVNLKQojZGVmaW5lIE9CSk5BTUUJCSgxMDEgfCBTWU5UQVhfTUFTSykKI2RlZmluZSBOT1RJRk5BTUUJKDEwMiB8IFNZTlRBWF9NQVNLKQojZGVmaW5lIFZBUklBQkxFUwkxMDMKI2RlZmluZSBVTlNJR05FRDMyCSgxMDQgfCBTWU5UQVhfTUFTSykKI2RlZmluZSBJTlRFR0VSMzIJKDEwNSB8IFNZTlRBWF9NQVNLKQojZGVmaW5lIE9CSklERU5USVRZCTEwNgovKgogKiBCZXdhcmUgb2YgcmVhY2hpbmcgU1lOVEFYX01BU0sgKDB4ODApIAogKi8KCnN0cnVjdCB0b2sgewogICAgY29uc3QgY2hhciAgICAgKm5hbWU7ICAgICAgIC8qIHRva2VuIG5hbWUgKi8KICAgIGludCAgICAgICAgICAgICBsZW47ICAgICAgICAvKiBsZW5ndGggbm90IGNvdW50aW5nIG51bCAqLwogICAgaW50ICAgICAgICAgICAgIHRva2VuOyAgICAgIC8qIHZhbHVlICovCiAgICBpbnQgICAgICAgICAgICAgaGFzaDsgICAgICAgLyogaGFzaCBvZiBuYW1lICovCiAgICBzdHJ1Y3QgdG9rICAgICAqbmV4dDsgICAgICAgLyogcG9pbnRlciB0byBuZXh0IGluIGhhc2ggdGFibGUgKi8KfTsKCgpzdGF0aWMgc3RydWN0IHRvayB0b2tlbnNbXSA9IHsKICAgIHsib2Jzb2xldGUiLCBzaXplb2YoIm9ic29sZXRlIikgLSAxLCBPQlNPTEVURX0KICAgICwKICAgIHsiT3BhcXVlIiwgc2l6ZW9mKCJPcGFxdWUiKSAtIDEsIEtXX09QQVFVRX0KICAgICwKICAgIHsib3B0aW9uYWwiLCBzaXplb2YoIm9wdGlvbmFsIikgLSAxLCBLV19PUFRJT05BTH0KICAgICwKICAgIHsiTEFTVC1VUERBVEVEIiwgc2l6ZW9mKCJMQVNULVVQREFURUQiKSAtIDEsIExBU1RVUERBVEVEfQogICAgLAogICAgeyJPUkdBTklaQVRJT04iLCBzaXplb2YoIk9SR0FOSVpBVElPTiIpIC0gMSwgT1JHQU5JWkFUSU9OfQogICAgLAogICAgeyJDT05UQUNULUlORk8iLCBzaXplb2YoIkNPTlRBQ1QtSU5GTyIpIC0gMSwgQ09OVEFDVElORk99CiAgICAsCiAgICB7Ik1PRFVMRS1JREVOVElUWSIsIHNpemVvZigiTU9EVUxFLUlERU5USVRZIikgLSAxLCBNT0RVTEVJREVOVElUWX0KICAgICwKICAgIHsiTU9EVUxFLUNPTVBMSUFOQ0UiLCBzaXplb2YoIk1PRFVMRS1DT01QTElBTkNFIikgLSAxLCBDT01QTElBTkNFfQogICAgLAogICAgeyJERUZJTklUSU9OUyIsIHNpemVvZigiREVGSU5JVElPTlMiKSAtIDEsIERFRklOSVRJT05TfQogICAgLAogICAgeyJFTkQiLCBzaXplb2YoIkVORCIpIC0gMSwgRU5EfQogICAgLAogICAgeyJBVUdNRU5UUyIsIHNpemVvZigiQVVHTUVOVFMiKSAtIDEsIEFVR01FTlRTfQogICAgLAogICAgeyJub3QtYWNjZXNzaWJsZSIsIHNpemVvZigibm90LWFjY2Vzc2libGUiKSAtIDEsIE5PQUNDRVNTfQogICAgLAogICAgeyJ3cml0ZS1vbmx5Iiwgc2l6ZW9mKCJ3cml0ZS1vbmx5IikgLSAxLCBXUklURU9OTFl9CiAgICAsCiAgICB7Ik5zYXBBZGRyZXNzIiwgc2l6ZW9mKCJOc2FwQWRkcmVzcyIpIC0gMSwgTlNBUEFERFJFU1N9CiAgICAsCiAgICB7IlVOSVRTIiwgc2l6ZW9mKCJVbml0cyIpIC0gMSwgVU5JVFN9CiAgICAsCiAgICB7IlJFRkVSRU5DRSIsIHNpemVvZigiUkVGRVJFTkNFIikgLSAxLCBSRUZFUkVOQ0V9CiAgICAsCiAgICB7Ik5VTS1FTlRSSUVTIiwgc2l6ZW9mKCJOVU0tRU5UUklFUyIpIC0gMSwgTlVNX0VOVFJJRVN9CiAgICAsCiAgICB7IkJJVFNUUklORyIsIHNpemVvZigiQklUU1RSSU5HIikgLSAxLCBCSVRTVFJJTkd9CiAgICAsCiAgICB7IkJJVCIsIHNpemVvZigiQklUIikgLSAxLCBDT05USU5VRX0KICAgICwKICAgIHsiQklUUyIsIHNpemVvZigiQklUUyIpIC0gMSwgQklUU1RSSU5HfQogICAgLAogICAgeyJDb3VudGVyNjQiLCBzaXplb2YoIkNvdW50ZXI2NCIpIC0gMSwgQ09VTlRFUjY0fQogICAgLAogICAgeyJUaW1lVGlja3MiLCBzaXplb2YoIlRpbWVUaWNrcyIpIC0gMSwgVElNRVRJQ0tTfQogICAgLAogICAgeyJOT1RJRklDQVRJT04tVFlQRSIsIHNpemVvZigiTk9USUZJQ0FUSU9OLVRZUEUiKSAtIDEsIE5PVElGVFlQRX0KICAgICwKICAgIHsiT0JKRUNULUdST1VQIiwgc2l6ZW9mKCJPQkpFQ1QtR1JPVVAiKSAtIDEsIE9CSkdST1VQfQogICAgLAogICAgeyJPQkpFQ1QtSURFTlRJVFkiLCBzaXplb2YoIk9CSkVDVC1JREVOVElUWSIpIC0gMSwgT0JKSURFTlRJVFl9CiAgICAsCiAgICB7IklERU5USUZJRVIiLCBzaXplb2YoIklERU5USUZJRVIiKSAtIDEsIElERU5USUZJRVJ9CiAgICAsCiAgICB7Ik9CSkVDVCIsIHNpemVvZigiT0JKRUNUIikgLSAxLCBPQkpFQ1R9CiAgICAsCiAgICB7Ik5ldHdvcmtBZGRyZXNzIiwgc2l6ZW9mKCJOZXR3b3JrQWRkcmVzcyIpIC0gMSwgTkVUQUREUn0KICAgICwKICAgIHsiR2F1Z2UiLCBzaXplb2YoIkdhdWdlIikgLSAxLCBHQVVHRX0KICAgICwKICAgIHsiR2F1Z2UzMiIsIHNpemVvZigiR2F1Z2UzMiIpIC0gMSwgR0FVR0V9CiAgICAsCiAgICB7IlVuc2lnbmVkMzIiLCBzaXplb2YoIlVuc2lnbmVkMzIiKSAtIDEsIFVOU0lHTkVEMzJ9CiAgICAsCiAgICB7InJlYWQtd3JpdGUiLCBzaXplb2YoInJlYWQtd3JpdGUiKSAtIDEsIFJFQURXUklURX0KICAgICwKICAgIHsicmVhZC1jcmVhdGUiLCBzaXplb2YoInJlYWQtY3JlYXRlIikgLSAxLCBSRUFEQ1JFQVRFfQogICAgLAogICAgeyJPQ1RFVFNUUklORyIsIHNpemVvZigiT0NURVRTVFJJTkciKSAtIDEsIE9DVEVUU1RSfQogICAgLAogICAgeyJPQ1RFVCIsIHNpemVvZigiT0NURVQiKSAtIDEsIENPTlRJTlVFfQogICAgLAogICAgeyJPRiIsIHNpemVvZigiT0YiKSAtIDEsIE9GfQogICAgLAogICAgeyJTRVFVRU5DRSIsIHNpemVvZigiU0VRVUVOQ0UiKSAtIDEsIFNFUVVFTkNFfQogICAgLAogICAgeyJOVUxMIiwgc2l6ZW9mKCJOVUxMIikgLSAxLCBOVUx9CiAgICAsCiAgICB7IklwQWRkcmVzcyIsIHNpemVvZigiSXBBZGRyZXNzIikgLSAxLCBJUEFERFJ9CiAgICAsCiAgICB7IlVJbnRlZ2VyMzIiLCBzaXplb2YoIlVJbnRlZ2VyMzIiKSAtIDEsIFVJTlRFR0VSMzJ9CiAgICAsCiAgICB7IklOVEVHRVIiLCBzaXplb2YoIklOVEVHRVIiKSAtIDEsIElOVEVHRVJ9CiAgICAsCiAgICB7IkludGVnZXIzMiIsIHNpemVvZigiSW50ZWdlcjMyIikgLSAxLCBJTlRFR0VSMzJ9CiAgICAsCiAgICB7IkNvdW50ZXIiLCBzaXplb2YoIkNvdW50ZXIiKSAtIDEsIENPVU5URVJ9CiAgICAsCiAgICB7IkNvdW50ZXIzMiIsIHNpemVvZigiQ291bnRlcjMyIikgLSAxLCBDT1VOVEVSfQogICAgLAogICAgeyJyZWFkLW9ubHkiLCBzaXplb2YoInJlYWQtb25seSIpIC0gMSwgUkVBRE9OTFl9CiAgICAsCiAgICB7IkRFU0NSSVBUSU9OIiwgc2l6ZW9mKCJERVNDUklQVElPTiIpIC0gMSwgREVTQ1JJUFRJT059CiAgICAsCiAgICB7IklOREVYIiwgc2l6ZW9mKCJJTkRFWCIpIC0gMSwgSU5ERVh9CiAgICAsCiAgICB7IkRFRlZBTCIsIHNpemVvZigiREVGVkFMIikgLSAxLCBERUZWQUx9CiAgICAsCiAgICB7ImRlcHJlY2F0ZWQiLCBzaXplb2YoImRlcHJlY2F0ZWQiKSAtIDEsIERFUFJFQ0FURUR9CiAgICAsCiAgICB7IlNJWkUiLCBzaXplb2YoIlNJWkUiKSAtIDEsIFNJWkV9CiAgICAsCiAgICB7Ik1BWC1BQ0NFU1MiLCBzaXplb2YoIk1BWC1BQ0NFU1MiKSAtIDEsIEFDQ0VTU30KICAgICwKICAgIHsiQUNDRVNTIiwgc2l6ZW9mKCJBQ0NFU1MiKSAtIDEsIEFDQ0VTU30KICAgICwKICAgIHsibWFuZGF0b3J5Iiwgc2l6ZW9mKCJtYW5kYXRvcnkiKSAtIDEsIE1BTkRBVE9SWX0KICAgICwKICAgIHsiY3VycmVudCIsIHNpemVvZigiY3VycmVudCIpIC0gMSwgQ1VSUkVOVH0KICAgICwKICAgIHsiU1RBVFVTIiwgc2l6ZW9mKCJTVEFUVVMiKSAtIDEsIFNUQVRVU30KICAgICwKICAgIHsiU1lOVEFYIiwgc2l6ZW9mKCJTWU5UQVgiKSAtIDEsIFNZTlRBWH0KICAgICwKICAgIHsiT0JKRUNULVRZUEUiLCBzaXplb2YoIk9CSkVDVC1UWVBFIikgLSAxLCBPQkpUWVBFfQogICAgLAogICAgeyJUUkFQLVRZUEUiLCBzaXplb2YoIlRSQVAtVFlQRSIpIC0gMSwgVFJBUFRZUEV9CiAgICAsCiAgICB7IkVOVEVSUFJJU0UiLCBzaXplb2YoIkVOVEVSUFJJU0UiKSAtIDEsIEVOVEVSUFJJU0V9CiAgICAsCiAgICB7IkJFR0lOIiwgc2l6ZW9mKCJCRUdJTiIpIC0gMSwgQkVHSU59CiAgICAsCiAgICB7IklNUE9SVFMiLCBzaXplb2YoIklNUE9SVFMiKSAtIDEsIElNUE9SVFN9CiAgICAsCiAgICB7IkVYUE9SVFMiLCBzaXplb2YoIkVYUE9SVFMiKSAtIDEsIEVYUE9SVFN9CiAgICAsCiAgICB7ImFjY2Vzc2libGUtZm9yLW5vdGlmeSIsIHNpemVvZigiYWNjZXNzaWJsZS1mb3Itbm90aWZ5IikgLSAxLAogICAgIEFDQ05PVElGWX0KICAgICwKICAgIHsiVEVYVFVBTC1DT05WRU5USU9OIiwgc2l6ZW9mKCJURVhUVUFMLUNPTlZFTlRJT04iKSAtIDEsIENPTlZFTlRJT059CiAgICAsCiAgICB7Ik5PVElGSUNBVElPTi1HUk9VUCIsIHNpemVvZigiTk9USUZJQ0FUSU9OLUdST1VQIikgLSAxLCBOT1RJRkdST1VQfQogICAgLAogICAgeyJESVNQTEFZLUhJTlQiLCBzaXplb2YoIkRJU1BMQVktSElOVCIpIC0gMSwgRElTUExBWUhJTlR9CiAgICAsCiAgICB7IkZST00iLCBzaXplb2YoIkZST00iKSAtIDEsIEZST019CiAgICAsCiAgICB7IkFHRU5ULUNBUEFCSUxJVElFUyIsIHNpemVvZigiQUdFTlQtQ0FQQUJJTElUSUVTIikgLSAxLCBBR0VOVENBUH0KICAgICwKICAgIHsiTUFDUk8iLCBzaXplb2YoIk1BQ1JPIikgLSAxLCBNQUNST30KICAgICwKICAgIHsiSU1QTElFRCIsIHNpemVvZigiSU1QTElFRCIpIC0gMSwgSU1QTElFRH0KICAgICwKICAgIHsiU1VQUE9SVFMiLCBzaXplb2YoIlNVUFBPUlRTIikgLSAxLCBTVVBQT1JUU30KICAgICwKICAgIHsiSU5DTFVERVMiLCBzaXplb2YoIklOQ0xVREVTIikgLSAxLCBJTkNMVURFU30KICAgICwKICAgIHsiVkFSSUFUSU9OIiwgc2l6ZW9mKCJWQVJJQVRJT04iKSAtIDEsIFZBUklBVElPTn0KICAgICwKICAgIHsiUkVWSVNJT04iLCBzaXplb2YoIlJFVklTSU9OIikgLSAxLCBSRVZJU0lPTn0KICAgICwKICAgIHsibm90LWltcGxlbWVudGVkIiwgc2l6ZW9mKCJub3QtaW1wbGVtZW50ZWQiKSAtIDEsIE5PVElNUEx9CiAgICAsCiAgICB7Ik9CSkVDVFMiLCBzaXplb2YoIk9CSkVDVFMiKSAtIDEsIE9CSkVDVFN9CiAgICAsCiAgICB7Ik5PVElGSUNBVElPTlMiLCBzaXplb2YoIk5PVElGSUNBVElPTlMiKSAtIDEsIE5PVElGSUNBVElPTlN9CiAgICAsCiAgICB7Ik1PRFVMRSIsIHNpemVvZigiTU9EVUxFIikgLSAxLCBNT0RVTEV9CiAgICAsCiAgICB7Ik1JTi1BQ0NFU1MiLCBzaXplb2YoIk1JTi1BQ0NFU1MiKSAtIDEsIE1JTkFDQ0VTU30KICAgICwKICAgIHsiUFJPRFVDVC1SRUxFQVNFIiwgc2l6ZW9mKCJQUk9EVUNULVJFTEVBU0UiKSAtIDEsIFBST0RSRUx9CiAgICAsCiAgICB7IldSSVRFLVNZTlRBWCIsIHNpemVvZigiV1JJVEUtU1lOVEFYIikgLSAxLCBXUlNZTlRBWH0KICAgICwKICAgIHsiQ1JFQVRJT04tUkVRVUlSRVMiLCBzaXplb2YoIkNSRUFUSU9OLVJFUVVJUkVTIikgLSAxLCBDUkVBVEVSRVF9CiAgICAsCiAgICB7Ik1BTkRBVE9SWS1HUk9VUFMiLCBzaXplb2YoIk1BTkRBVE9SWS1HUk9VUFMiKSAtIDEsIE1BTkRBVE9SWUdST1VQU30KICAgICwKICAgIHsiR1JPVVAiLCBzaXplb2YoIkdST1VQIikgLSAxLCBHUk9VUH0KICAgICwKICAgIHsiQ0hPSUNFIiwgc2l6ZW9mKCJDSE9JQ0UiKSAtIDEsIENIT0lDRX0KICAgICwKICAgIHsiSU1QTElDSVQiLCBzaXplb2YoIklNUExJQ0lUIikgLSAxLCBJTVBMSUNJVH0KICAgICwKICAgIHsiT2JqZWN0U3ludGF4Iiwgc2l6ZW9mKCJPYmplY3RTeW50YXgiKSAtIDEsIE9CSlNZTlRBWH0KICAgICwKICAgIHsiU2ltcGxlU3ludGF4Iiwgc2l6ZW9mKCJTaW1wbGVTeW50YXgiKSAtIDEsIFNJTVBMRVNZTlRBWH0KICAgICwKICAgIHsiQXBwbGljYXRpb25TeW50YXgiLCBzaXplb2YoIkFwcGxpY2F0aW9uU3ludGF4IikgLSAxLCBBUFBTWU5UQVh9CiAgICAsCiAgICB7Ik9iamVjdE5hbWUiLCBzaXplb2YoIk9iamVjdE5hbWUiKSAtIDEsIE9CSk5BTUV9CiAgICAsCiAgICB7Ik5vdGlmaWNhdGlvbk5hbWUiLCBzaXplb2YoIk5vdGlmaWNhdGlvbk5hbWUiKSAtIDEsIE5PVElGTkFNRX0KICAgICwKICAgIHsiVkFSSUFCTEVTIiwgc2l6ZW9mKCJWQVJJQUJMRVMiKSAtIDEsIFZBUklBQkxFU30KICAgICwKICAgIHtOVUxMfQp9OwoKc3RhdGljIHN0cnVjdCBtb2R1bGVfY29tcGF0YWJpbGl0eSAqbW9kdWxlX21hcF9oZWFkOwpzdGF0aWMgc3RydWN0IG1vZHVsZV9jb21wYXRhYmlsaXR5IG1vZHVsZV9tYXBbXSA9IHsKICAgIHsiUkZDMTA2NS1TTUkiLCAiUkZDMTE1NS1TTUkiLCBOVUxMLCAwfSwKICAgIHsiUkZDMTA2Ni1NSUIiLCAiUkZDMTE1Ni1NSUIiLCBOVUxMLCAwfSwKICAgIC8qCiAgICAgKiAnbWliJyAtPiAnbWliLTInIAogICAgICovCiAgICB7IlJGQzExNTYtTUlCIiwgIlJGQzExNTgtTUlCIiwgTlVMTCwgMH0sCiAgICAvKgogICAgICogJ3NubXBFbmFibGVBdXRoVHJhcHMnIC0+ICdzbm1wRW5hYmxlQXV0aGVuVHJhcHMnIAogICAgICovCiAgICB7IlJGQzExNTgtTUlCIiwgIlJGQzEyMTMtTUlCIiwgTlVMTCwgMH0sCiAgICAvKgogICAgICogJ251bGxPSUQnIC0+ICd6ZXJvRG90WmVybycgCiAgICAgKi8KICAgIHsiUkZDMTE1NS1TTUkiLCAiU05NUHYyLVNNSSIsIE5VTEwsIDB9LAogICAgeyJSRkMxMjEzLU1JQiIsICJTTk1QdjItU01JIiwgIm1pYi0yIiwgMH0sCiAgICB7IlJGQzEyMTMtTUlCIiwgIlNOTVB2Mi1NSUIiLCAic3lzIiwgM30sCiAgICB7IlJGQzEyMTMtTUlCIiwgIklGLU1JQiIsICJpZiIsIDJ9LAogICAgeyJSRkMxMjEzLU1JQiIsICJJUC1NSUIiLCAiaXAiLCAyfSwKICAgIHsiUkZDMTIxMy1NSUIiLCAiSVAtTUlCIiwgImljbXAiLCA0fSwKICAgIHsiUkZDMTIxMy1NSUIiLCAiVENQLU1JQiIsICJ0Y3AiLCAzfSwKICAgIHsiUkZDMTIxMy1NSUIiLCAiVURQLU1JQiIsICJ1ZHAiLCAzfSwKICAgIHsiUkZDMTIxMy1NSUIiLCAiU05NUHYyLVNNSSIsICJ0cmFuc21pc3Npb24iLCAwfSwKICAgIHsiUkZDMTIxMy1NSUIiLCAiU05NUHYyLU1JQiIsICJzbm1wIiwgNH0sCiAgICB7IlJGQzEyMzEtTUlCIiwgIlRPS0VOUklORy1NSUIiLCBOVUxMLCAwfSwKICAgIHsiUkZDMTI3MS1NSUIiLCAiUk1PTi1NSUIiLCBOVUxMLCAwfSwKICAgIHsiUkZDMTI4Ni1NSUIiLCAiU09VUkNFLVJPVVRJTkctTUlCIiwgImRvdDFkU3IiLCA3fSwKICAgIHsiUkZDMTI4Ni1NSUIiLCAiQlJJREdFLU1JQiIsIE5VTEwsIDB9LAogICAgeyJSRkMxMzE1LU1JQiIsICJGUkFNRS1SRUxBWS1EVEUtTUlCIiwgTlVMTCwgMH0sCiAgICB7IlJGQzEzMTYtTUlCIiwgIkNIQVJBQ1RFUi1NSUIiLCBOVUxMLCAwfSwKICAgIHsiUkZDMTQwNi1NSUIiLCAiRFMxLU1JQiIsIE5VTEwsIDB9LAogICAgeyJSRkMtMTIxMyIsICJSRkMxMjEzLU1JQiIsIE5VTEwsIDB9LAp9OwoKI2RlZmluZSBNT0RVTEVfTk9UX0ZPVU5ECTAKI2RlZmluZSBNT0RVTEVfTE9BREVEX09LCTEKI2RlZmluZSBNT0RVTEVfQUxSRUFEWV9MT0FERUQJMgovKgogKiAjZGVmaW5lIE1PRFVMRV9MT0FEX0ZBSUxFRCAgIDMgICAgICAgCiAqLwojZGVmaW5lIE1PRFVMRV9MT0FEX0ZBSUxFRAlNT0RVTEVfTk9UX0ZPVU5ECiNkZWZpbmUgTU9EVUxFX1NZTlRBWF9FUlJPUiAgICAgNAoKaW50IGdNaWJFcnJvciA9IDAsZ0xvb3AgPSAwOwpjaGFyICpncE1pYkVycm9yU3RyaW5nID0gTlVMTDsKY2hhciBnTWliTmFtZXNbU1RSSU5HTUFYXTsKCiNkZWZpbmUgSEFTSFNJWkUgICAgICAgIDMyCiNkZWZpbmUgQlVDS0VUKHgpICAgICAgICh4ICYgKEhBU0hTSVpFLTEpKQoKI2RlZmluZSBOSEFTSFNJWkUgICAgMTI4CiNkZWZpbmUgTkJVQ0tFVCh4KSAgICh4ICYgKE5IQVNIU0laRS0xKSkKCnN0YXRpYyBzdHJ1Y3QgdG9rICpidWNrZXRzW0hBU0hTSVpFXTsKCnN0YXRpYyBzdHJ1Y3Qgbm9kZSAqbmJ1Y2tldHNbTkhBU0hTSVpFXTsKc3RhdGljIHN0cnVjdCB0cmVlICp0YnVja2V0c1tOSEFTSFNJWkVdOwpzdGF0aWMgc3RydWN0IG1vZHVsZSAqbW9kdWxlX2hlYWQgPSBOVUxMOwoKc3RhdGljIHN0cnVjdCBub2RlICpvcnBoYW5fbm9kZXMgPSBOVUxMOwpORVRTTk1QX0lNUE9SVCBzdHJ1Y3QgdHJlZSAqdHJlZV9oZWFkOwpzdHJ1Y3QgdHJlZSAgICAgICAgKnRyZWVfaGVhZCA9IE5VTEw7CgojZGVmaW5lCU5VTUJFUl9PRl9ST09UX05PREVTCTMKc3RhdGljIHN0cnVjdCBtb2R1bGVfaW1wb3J0IHJvb3RfaW1wb3J0c1tOVU1CRVJfT0ZfUk9PVF9OT0RFU107CgpzdGF0aWMgaW50ICAgICAgY3VycmVudF9tb2R1bGUgPSAwOwpzdGF0aWMgaW50ICAgICAgbWF4X21vZHVsZSA9IDA7CnN0YXRpYyBpbnQgICAgICBmaXJzdF9lcnJfbW9kdWxlID0gMTsKc3RhdGljIGNoYXIgICAgKmxhc3RfZXJyX21vZHVsZSA9IE5VTEw7IC8qIG5vIHJlcGVhdHMgb24gIkNhbm5vdCBmaW5kIG1vZHVsZS4uLiIgKi8KCnN0YXRpYyB2b2lkICAgICB0cmVlX2Zyb21fbm9kZShzdHJ1Y3QgdHJlZSAqdHAsIHN0cnVjdCBub2RlICpucCk7CnN0YXRpYyB2b2lkICAgICBkb19zdWJ0cmVlKHN0cnVjdCB0cmVlICosIHN0cnVjdCBub2RlICoqKTsKc3RhdGljIHZvaWQgICAgIGRvX2xpbmt1cChzdHJ1Y3QgbW9kdWxlICosIHN0cnVjdCBub2RlICopOwpzdGF0aWMgdm9pZCAgICAgZHVtcF9tb2R1bGVfbGlzdCh2b2lkKTsKc3RhdGljIGludCAgICAgIGdldF90b2tlbihGSUxFICosIGNoYXIgKiwgaW50KTsKc3RhdGljIGludCAgICAgIHBhcnNlUXVvdGVTdHJpbmcoRklMRSAqLCBjaGFyICosIGludCk7CnN0YXRpYyBpbnQgICAgICB0b3NzT2JqZWN0SWRlbnRpZmllcihGSUxFICopOwpzdGF0aWMgaW50ICAgICAgbmFtZV9oYXNoKGNvbnN0IGNoYXIgKik7CnN0YXRpYyB2b2lkICAgICBpbml0X25vZGVfaGFzaChzdHJ1Y3Qgbm9kZSAqKTsKc3RhdGljIHZvaWQgICAgIHByaW50X2Vycm9yKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBpbnQpOwpzdGF0aWMgdm9pZCAgICAgZnJlZV90cmVlKHN0cnVjdCB0cmVlICopOwpzdGF0aWMgdm9pZCAgICAgZnJlZV9wYXJ0aWFsX3RyZWUoc3RydWN0IHRyZWUgKiwgaW50KTsKc3RhdGljIHZvaWQgICAgIGZyZWVfbm9kZShzdHJ1Y3Qgbm9kZSAqKTsKc3RhdGljIHZvaWQgICAgIGJ1aWxkX3RyYW5zbGF0aW9uX3RhYmxlKHZvaWQpOwpzdGF0aWMgdm9pZCAgICAgaW5pdF90cmVlX3Jvb3RzKHZvaWQpOwpzdGF0aWMgdm9pZCAgICAgbWVyZ2VfYW5vbl9jaGlsZHJlbihzdHJ1Y3QgdHJlZSAqLCBzdHJ1Y3QgdHJlZSAqKTsKc3RhdGljIHZvaWQgICAgIHVubGlua190YnVja2V0KHN0cnVjdCB0cmVlICopOwpzdGF0aWMgdm9pZCAgICAgdW5saW5rX3RyZWUoc3RydWN0IHRyZWUgKik7CnN0YXRpYyBpbnQgICAgICBnZXRvaWQoRklMRSAqLCBzdHJ1Y3Qgc3ViaWRfcyAqLCBpbnQpOwpzdGF0aWMgc3RydWN0IG5vZGUgKnBhcnNlX29iamVjdGlkKEZJTEUgKiwgY2hhciAqKTsKc3RhdGljIGludCAgICAgIGdldF90Yyhjb25zdCBjaGFyICosIGludCwgaW50ICosIHN0cnVjdCBlbnVtX2xpc3QgKiosCiAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHJhbmdlX2xpc3QgKiosIGNoYXIgKiopOwpzdGF0aWMgaW50ICAgICAgZ2V0X3RjX2luZGV4KGNvbnN0IGNoYXIgKiwgaW50KTsKc3RhdGljIHN0cnVjdCBlbnVtX2xpc3QgKnBhcnNlX2VudW1saXN0KEZJTEUgKiwgc3RydWN0IGVudW1fbGlzdCAqKik7CnN0YXRpYyBzdHJ1Y3QgcmFuZ2VfbGlzdCAqcGFyc2VfcmFuZ2VzKEZJTEUgKiBmcCwgc3RydWN0IHJhbmdlX2xpc3QgKiopOwpzdGF0aWMgc3RydWN0IG5vZGUgKnBhcnNlX2FzbnR5cGUoRklMRSAqLCBjaGFyICosIGludCAqLCBjaGFyICopOwpzdGF0aWMgc3RydWN0IG5vZGUgKnBhcnNlX29iamVjdHR5cGUoRklMRSAqLCBjaGFyICopOwpzdGF0aWMgc3RydWN0IG5vZGUgKnBhcnNlX29iamVjdGdyb3VwKEZJTEUgKiwgY2hhciAqLCBpbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG9iamdyb3VwICoqKTsKc3RhdGljIHN0cnVjdCBub2RlICpwYXJzZV9ub3RpZmljYXRpb25EZWZpbml0aW9uKEZJTEUgKiwgY2hhciAqKTsKc3RhdGljIHN0cnVjdCBub2RlICpwYXJzZV90cmFwRGVmaW5pdGlvbihGSUxFICosIGNoYXIgKik7CnN0YXRpYyBzdHJ1Y3Qgbm9kZSAqcGFyc2VfY29tcGxpYW5jZShGSUxFICosIGNoYXIgKik7CnN0YXRpYyBzdHJ1Y3Qgbm9kZSAqcGFyc2VfY2FwYWJpbGl0aWVzKEZJTEUgKiwgY2hhciAqKTsKc3RhdGljIHN0cnVjdCBub2RlICpwYXJzZV9tb2R1bGVJZGVudGl0eShGSUxFICosIGNoYXIgKik7CnN0YXRpYyBzdHJ1Y3Qgbm9kZSAqcGFyc2VfbWFjcm8oRklMRSAqLCBjaGFyICopOwpzdGF0aWMgdm9pZCAgICAgcGFyc2VfaW1wb3J0cyhGSUxFICopOwpzdGF0aWMgc3RydWN0IG5vZGUgKnBhcnNlKEZJTEUgKiwgc3RydWN0IG5vZGUgKik7CgpzdGF0aWMgaW50ICAgICByZWFkX21vZHVsZV9pbnRlcm5hbChjb25zdCBjaGFyICopOwpzdGF0aWMgaW50ICAgICByZWFkX21vZHVsZV9yZXBsYWNlbWVudHMoY29uc3QgY2hhciAqKTsKc3RhdGljIGludCAgICAgcmVhZF9pbXBvcnRfcmVwbGFjZW1lbnRzKGNvbnN0IGNoYXIgKiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgbW9kdWxlX2ltcG9ydCAqKTsKCnN0YXRpYyB2b2lkICAgICBuZXdfbW9kdWxlKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKCnN0YXRpYyBzdHJ1Y3Qgbm9kZSAqbWVyZ2VfcGFyc2Vfb2JqZWN0aWQoc3RydWN0IG5vZGUgKiwgRklMRSAqLCBjaGFyICopOwpzdGF0aWMgc3RydWN0IGluZGV4X2xpc3QgKmdldEluZGV4ZXMoRklMRSAqIGZwLCBzdHJ1Y3QgaW5kZXhfbGlzdCAqKik7CnN0YXRpYyBzdHJ1Y3QgdmFyYmluZF9saXN0ICpnZXRWYXJiaW5kcyhGSUxFICogZnAsIHN0cnVjdCB2YXJiaW5kX2xpc3QgKiopOwpzdGF0aWMgdm9pZCAgICAgZnJlZV9pbmRleGVzKHN0cnVjdCBpbmRleF9saXN0ICoqKTsKc3RhdGljIHZvaWQgICAgIGZyZWVfdmFyYmluZHMoc3RydWN0IHZhcmJpbmRfbGlzdCAqKik7CnN0YXRpYyB2b2lkICAgICBmcmVlX3JhbmdlcyhzdHJ1Y3QgcmFuZ2VfbGlzdCAqKik7CnN0YXRpYyB2b2lkICAgICBmcmVlX2VudW1zKHN0cnVjdCBlbnVtX2xpc3QgKiopOwpzdGF0aWMgc3RydWN0IHJhbmdlX2xpc3QgKmNvcHlfcmFuZ2VzKHN0cnVjdCByYW5nZV9saXN0ICopOwpzdGF0aWMgc3RydWN0IGVudW1fbGlzdCAqY29weV9lbnVtcyhzdHJ1Y3QgZW51bV9saXN0ICopOwoKc3RhdGljIHVfaW50ICAgIGNvbXB1dGVfbWF0Y2goY29uc3QgY2hhciAqc2VhcmNoX2Jhc2UsIGNvbnN0IGNoYXIgKmtleSk7Cgp2b2lkCnNubXBfbWliX3RvZ2dsZV9vcHRpb25zX3VzYWdlKGNvbnN0IGNoYXIgKmxlYWQsIEZJTEUgKiBvdXRmKQp7CiAgICBmcHJpbnRmKG91dGYsICIlc3U6ICAlc2FsbG93IHRoZSB1c2Ugb2YgdW5kZXJsaW5lcyBpbiBNSUIgc3ltYm9sc1xuIiwKICAgICAgICAgICAgbGVhZCwgKChuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwKCQkJCQkgICBORVRTTk1QX0RTX0xJQl9NSUJfUEFSU0VfTEFCRUwpKSA/CgkJICAgImRpcyIgOiAiIikpOwogICAgZnByaW50ZihvdXRmLCAiJXNjOiAgJXNhbGxvdyB0aGUgdXNlIG9mIFwiLS1cIiB0byB0ZXJtaW5hdGUgY29tbWVudHNcbiIsCiAgICAgICAgICAgIGxlYWQsICgobmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsCgkJCQkJICAgTkVUU05NUF9EU19MSUJfTUlCX0NPTU1FTlRfVEVSTSkpID8KCQkgICAiIiA6ICJkaXMiKSk7CgogICAgZnByaW50ZihvdXRmLCAiJXNkOiAgJXNzYXZlIHRoZSBERVNDUklQVElPTnMgb2YgdGhlIE1JQiBvYmplY3RzXG4iLAogICAgICAgICAgICBsZWFkLCAoKG5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCAKCQkJCQkgICBORVRTTk1QX0RTX0xJQl9TQVZFX01JQl9ERVNDUlMpKSA/CgkJICAgImRvIG5vdCAiIDogIiIpKTsKCiAgICBmcHJpbnRmKG91dGYsICIlc2U6ICBkaXNhYmxlIGVycm9ycyB3aGVuIE1JQiBzeW1ib2xzIGNvbmZsaWN0XG4iLCBsZWFkKTsKCiAgICBmcHJpbnRmKG91dGYsICIlc3c6ICBlbmFibGUgd2FybmluZ3Mgd2hlbiBNSUIgc3ltYm9scyBjb25mbGljdFxuIiwgbGVhZCk7CgogICAgZnByaW50ZihvdXRmLCAiJXNXOiAgZW5hYmxlIGRldGFpbGVkIHdhcm5pbmdzIHdoZW4gTUlCIHN5bWJvbHMgY29uZmxpY3RcbiIsCiAgICAgICAgICAgIGxlYWQpOwoKICAgIGZwcmludGYob3V0ZiwgIiVzUjogIHJlcGxhY2UgTUlCIHN5bWJvbHMgZnJvbSBsYXRlc3QgbW9kdWxlXG4iLCBsZWFkKTsKfQoKY2hhciAgICAgICAgICAgKgpzbm1wX21pYl90b2dnbGVfb3B0aW9ucyhjaGFyICpvcHRpb25zKQp7CiAgICBpZiAob3B0aW9ucykgewogICAgICAgIHdoaWxlICgqb3B0aW9ucykgewogICAgICAgICAgICBzd2l0Y2ggKCpvcHRpb25zKSB7CiAgICAgICAgICAgIGNhc2UgJ3UnOgogICAgICAgICAgICAgICAgbmV0c25tcF9kc19zZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIE5FVFNOTVBfRFNfTElCX01JQl9QQVJTRV9MQUJFTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQl9NSUJfUEFSU0VfTEFCRUwpKTsKICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSAnYyc6CiAgICAgICAgICAgICAgICBuZXRzbm1wX2RzX3RvZ2dsZV9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwKCQkJCQkgIE5FVFNOTVBfRFNfTElCX01JQl9DT01NRU5UX1RFUk0pOwogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlICdlJzoKICAgICAgICAgICAgICAgIG5ldHNubXBfZHNfdG9nZ2xlX2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELAoJCQkJCSAgTkVUU05NUF9EU19MSUJfTUlCX0VSUk9SUyk7CiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgJ3cnOgogICAgICAgICAgICAgICAgbmV0c25tcF9kc19zZXRfaW50KE5FVFNOTVBfRFNfTElCUkFSWV9JRCwKCQkJCSAgIE5FVFNOTVBfRFNfTElCX01JQl9XQVJOSU5HUywgMSk7CiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgJ1cnOgogICAgICAgICAgICAgICAgbmV0c25tcF9kc19zZXRfaW50KE5FVFNOTVBfRFNfTElCUkFSWV9JRCwKCQkJCSAgIE5FVFNOTVBfRFNfTElCX01JQl9XQVJOSU5HUywgMik7CiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgJ2QnOgogICAgICAgICAgICAgICAgbmV0c25tcF9kc190b2dnbGVfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIAoJCQkJCSAgTkVUU05NUF9EU19MSUJfU0FWRV9NSUJfREVTQ1JTKTsKICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSAnUic6CiAgICAgICAgICAgICAgICBuZXRzbm1wX2RzX3RvZ2dsZV9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgCgkJCQkJICBORVRTTk1QX0RTX0xJQl9NSUJfUkVQTEFDRSk7CiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogcmV0dXJuIGF0IHRoZSB1bmtub3duIG9wdGlvbiAKICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgb3B0aW9ucysrOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBOVUxMOwp9CgpzdGF0aWMgaW50Cm5hbWVfaGFzaChjb25zdCBjaGFyICpuYW1lKQp7CiAgICBpbnQgICAgICAgICAgICAgaGFzaCA9IDA7CiAgICBjb25zdCBjaGFyICAgICAqY3A7CgogICAgaWYgKCFuYW1lKQogICAgICAgIHJldHVybiAwOwogICAgZm9yIChjcCA9IG5hbWU7ICpjcDsgY3ArKykKICAgICAgICBoYXNoICs9IHRvbG93ZXIoKHVuc2lnbmVkIGNoYXIpKCpjcCkpOwogICAgcmV0dXJuIChoYXNoKTsKfQoKdm9pZApuZXRzbm1wX2luaXRfbWliX2ludGVybmFscyh2b2lkKQp7CiAgICByZWdpc3RlciBzdHJ1Y3QgdG9rICp0cDsKICAgIHJlZ2lzdGVyIGludCAgICBiLCBpOwogICAgaW50ICAgICAgICAgICAgIG1heF9tb2RjOwoKICAgIGlmICh0cmVlX2hlYWQpCiAgICAgICAgcmV0dXJuOwoKICAgIC8qCiAgICAgKiBTZXQgdXAgaGFzaCBsaXN0IG9mIHByZS1kZWZpbmVkIHRva2VucwogICAgICovCiAgICBtZW1zZXQoYnVja2V0cywgMCwgc2l6ZW9mKGJ1Y2tldHMpKTsKICAgIGZvciAodHAgPSB0b2tlbnM7IHRwLT5uYW1lOyB0cCsrKSB7CiAgICAgICAgdHAtPmhhc2ggPSBuYW1lX2hhc2godHAtPm5hbWUpOwogICAgICAgIGIgPSBCVUNLRVQodHAtPmhhc2gpOwogICAgICAgIGlmIChidWNrZXRzW2JdKQogICAgICAgICAgICB0cC0+bmV4dCA9IGJ1Y2tldHNbYl07ICAgICAgLyogQlVHID8/PyAqLwogICAgICAgIGJ1Y2tldHNbYl0gPSB0cDsKICAgIH0KCiAgICAvKgogICAgICogSW5pdGlhbGlzZSBvdGhlciBpbnRlcm5hbCBzdHJ1Y3R1cmVzCiAgICAgKi8KCiAgICBtYXhfbW9kYyA9IHNpemVvZihtb2R1bGVfbWFwKSAvIHNpemVvZihtb2R1bGVfbWFwWzBdKSAtIDE7CiAgICBmb3IgKGkgPSAwOyBpIDwgbWF4X21vZGM7ICsraSkKICAgICAgICBtb2R1bGVfbWFwW2ldLm5leHQgPSAmKG1vZHVsZV9tYXBbaSArIDFdKTsKICAgIG1vZHVsZV9tYXBbbWF4X21vZGNdLm5leHQgPSBOVUxMOwogICAgbW9kdWxlX21hcF9oZWFkID0gbW9kdWxlX21hcDsKCiAgICBtZW1zZXQobmJ1Y2tldHMsIDAsIHNpemVvZihuYnVja2V0cykpOwogICAgbWVtc2V0KHRidWNrZXRzLCAwLCBzaXplb2YodGJ1Y2tldHMpKTsKICAgIG1lbXNldCh0Y2xpc3QsIDAsIE1BWFRDICogc2l6ZW9mKHN0cnVjdCB0YykpOwogICAgYnVpbGRfdHJhbnNsYXRpb25fdGFibGUoKTsKICAgIGluaXRfdHJlZV9yb290cygpOyAgICAgICAgICAvKiBTZXQgdXAgaW5pdGlhbCByb290cyAqLwogICAgLyoKICAgICAqIFJlbGllcyBvbiAnYWRkX21pYmRpcicgaGF2aW5nIHNldCB1cCB0aGUgbW9kdWxlcyAKICAgICAqLwp9CgojaWZuZGVmIE5FVFNOTVBfTk9fTEVHQUNZX0RFRklOSVRJT05TCnZvaWQKaW5pdF9taWJfaW50ZXJuYWxzKHZvaWQpCnsKICAgIG5ldHNubXBfaW5pdF9taWJfaW50ZXJuYWxzKCk7Cn0KI2VuZGlmCgpzdGF0aWMgdm9pZAppbml0X25vZGVfaGFzaChzdHJ1Y3Qgbm9kZSAqbm9kZXMpCnsKICAgIHN0cnVjdCBub2RlICAgICpucCwgKm5leHRwOwogICAgaW50ICAgICAgICAgICAgIGhhc2g7CgogICAgbWVtc2V0KG5idWNrZXRzLCAwLCBzaXplb2YobmJ1Y2tldHMpKTsKICAgIGZvciAobnAgPSBub2RlczsgbnA7KSB7CiAgICAgICAgbmV4dHAgPSBucC0+bmV4dDsKICAgICAgICBoYXNoID0gTkJVQ0tFVChuYW1lX2hhc2gobnAtPnBhcmVudCkpOwogICAgICAgIG5wLT5uZXh0ID0gbmJ1Y2tldHNbaGFzaF07CiAgICAgICAgbmJ1Y2tldHNbaGFzaF0gPSBucDsKICAgICAgICBucCA9IG5leHRwOwogICAgfQp9CgpzdGF0aWMgaW50ICAgICAgZXJyb25lb3VzTWlicyA9IDA7CgpuZXRzbm1wX2ZlYXR1cmVfY2hpbGRfb2YocGFyc2VfZ2V0X2Vycm9yX2NvdW50LCBuZXRzbm1wX3VudXNlZCkKI2lmbmRlZiBORVRTTk1QX0ZFQVRVUkVfUkVNT1ZFX1BBUlNFX0dFVF9FUlJPUl9DT1VOVAppbnQKZ2V0X21pYl9wYXJzZV9lcnJvcl9jb3VudCh2b2lkKQp7CiAgICByZXR1cm4gZXJyb25lb3VzTWliczsKfQojZW5kaWYgLyogTkVUU05NUF9GRUFUVVJFX1JFTU9WRV9QQVJTRV9HRVRfRVJST1JfQ09VTlQgKi8KCgpzdGF0aWMgdm9pZApwcmludF9lcnJvcihjb25zdCBjaGFyICpzdHIsIGNvbnN0IGNoYXIgKnRva2VuLCBpbnQgdHlwZSkKewogICAgZXJyb25lb3VzTWlicysrOwogICAgREVCVUdNU0dUTCgoInBhcnNlLW1pYnMiLCAiXG4iKSk7CiAgICBpZiAodHlwZSA9PSBFTkRPRkZJTEUpCiAgICAgICAgc25tcF9sb2coTE9HX0VSUiwgIiVzIChFT0YpOiBBdCBsaW5lICVkIGluICVzXG4iLCBzdHIsIG1pYkxpbmUsCiAgICAgICAgICAgICAgICAgRmlsZSk7CiAgICBlbHNlIGlmICh0b2tlbiAmJiAqdG9rZW4pCiAgICAgICAgc25tcF9sb2coTE9HX0VSUiwgIiVzICglcyk6IEF0IGxpbmUgJWQgaW4gJXNcbiIsIHN0ciwgdG9rZW4sCiAgICAgICAgICAgICAgICAgbWliTGluZSwgRmlsZSk7CiAgICBlbHNlCiAgICAgICAgc25tcF9sb2coTE9HX0VSUiwgIiVzOiBBdCBsaW5lICVkIGluICVzXG4iLCBzdHIsIG1pYkxpbmUsIEZpbGUpOwp9CgpzdGF0aWMgdm9pZApwcmludF9tb2R1bGVfbm90X2ZvdW5kKGNvbnN0IGNoYXIgKmNwKQp7CiAgICBpZiAoZmlyc3RfZXJyX21vZHVsZSkgewogICAgICAgIHNubXBfbG9nKExPR19FUlIsICJNSUIgc2VhcmNoIHBhdGg6ICVzXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX2dldF9taWJfZGlyZWN0b3J5KCkpOwogICAgICAgIGZpcnN0X2Vycl9tb2R1bGUgPSAwOwogICAgfQogICAgaWYgKCFsYXN0X2Vycl9tb2R1bGUgfHwgc3RyY21wKGNwLCBsYXN0X2Vycl9tb2R1bGUpKQogICAgICAgIHByaW50X2Vycm9yKCJDYW5ub3QgZmluZCBtb2R1bGUiLCBjcCwgQ09OVElOVUUpOwogICAgaWYgKGxhc3RfZXJyX21vZHVsZSkKICAgICAgICBmcmVlKGxhc3RfZXJyX21vZHVsZSk7CiAgICBsYXN0X2Vycl9tb2R1bGUgPSBzdHJkdXAoY3ApOwp9CgpzdGF0aWMgc3RydWN0IG5vZGUgKgphbGxvY19ub2RlKGludCBtb2RpZCkKewogICAgc3RydWN0IG5vZGUgICAgKm5wOwogICAgbnAgPSAoc3RydWN0IG5vZGUgKikgY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3Qgbm9kZSkpOwogICAgaWYgKG5wKSB7CiAgICAgICAgbnAtPnRjX2luZGV4ID0gLTE7CiAgICAgICAgbnAtPm1vZGlkID0gbW9kaWQ7CglucC0+ZmlsZW5hbWUgPSBzdHJkdXAoRmlsZSk7CglucC0+bGluZW5vID0gbWliTGluZTsKICAgIH0KICAgIHJldHVybiBucDsKfQoKc3RhdGljIHZvaWQKdW5saW5rX3RidWNrZXQoc3RydWN0IHRyZWUgKnRwKQp7CiAgICBpbnQgICAgICAgICAgICAgaGFzaCA9IE5CVUNLRVQobmFtZV9oYXNoKHRwLT5sYWJlbCkpOwogICAgc3RydWN0IHRyZWUgICAgKm90cCA9IE5VTEwsICpudHAgPSB0YnVja2V0c1toYXNoXTsKCiAgICB3aGlsZSAobnRwICYmIG50cCAhPSB0cCkgewogICAgICAgIG90cCA9IG50cDsKICAgICAgICBudHAgPSBudHAtPm5leHQ7CiAgICB9CiAgICBpZiAoIW50cCkKICAgICAgICBzbm1wX2xvZyhMT0dfRU1FUkcsICJDYW4ndCBmaW5kICVzIGluIHRidWNrZXRzXG4iLCB0cC0+bGFiZWwpOwogICAgZWxzZSBpZiAob3RwKQogICAgICAgIG90cC0+bmV4dCA9IG50cC0+bmV4dDsKICAgIGVsc2UKICAgICAgICB0YnVja2V0c1toYXNoXSA9IHRwLT5uZXh0Owp9CgpzdGF0aWMgdm9pZAp1bmxpbmtfdHJlZShzdHJ1Y3QgdHJlZSAqdHApCnsKICAgIHN0cnVjdCB0cmVlICAgICpvdHAgPSBOVUxMLCAqbnRwID0gdHAtPnBhcmVudDsKCiAgICBpZiAoIW50cCkgeyAgICAgICAgICAgICAgICAgLyogdGhpcyB0cmVlIGhhcyBubyBwYXJlbnQgKi8KICAgICAgICBERUJVR01TR1RMKCgidW5saW5rX3RyZWUiLCAiVHJlZSBub2RlICVzIGhhcyBubyBwYXJlbnRcbiIsCiAgICAgICAgICAgICAgICAgICAgdHAtPmxhYmVsKSk7CiAgICB9IGVsc2UgewogICAgICAgIG50cCA9IG50cC0+Y2hpbGRfbGlzdDsKCiAgICAgICAgd2hpbGUgKG50cCAmJiBudHAgIT0gdHApIHsKICAgICAgICAgICAgb3RwID0gbnRwOwogICAgICAgICAgICBudHAgPSBudHAtPm5leHRfcGVlcjsKICAgICAgICB9CiAgICAgICAgaWYgKCFudHApCiAgICAgICAgICAgIHNubXBfbG9nKExPR19FTUVSRywgIkNhbid0IGZpbmQgJXMgaW4gJXMncyBjaGlsZHJlblxuIiwKICAgICAgICAgICAgICAgICAgICAgdHAtPmxhYmVsLCB0cC0+cGFyZW50LT5sYWJlbCk7CiAgICAgICAgZWxzZSBpZiAob3RwKQogICAgICAgICAgICBvdHAtPm5leHRfcGVlciA9IG50cC0+bmV4dF9wZWVyOwogICAgICAgIGVsc2UKICAgICAgICAgICAgdHAtPnBhcmVudC0+Y2hpbGRfbGlzdCA9IHRwLT5uZXh0X3BlZXI7CiAgICB9CgogICAgaWYgKHRyZWVfaGVhZCA9PSB0cCkKICAgICAgICB0cmVlX2hlYWQgPSB0cC0+bmV4dF9wZWVyOwp9CgpzdGF0aWMgdm9pZApmcmVlX3BhcnRpYWxfdHJlZShzdHJ1Y3QgdHJlZSAqdHAsIGludCBrZWVwX2xhYmVsKQp7CiAgICBpZiAoIXRwKQogICAgICAgIHJldHVybjsKCiAgICAvKgogICAgICogcmVtb3ZlIHRoZSBkYXRhIGZyb20gdGhpcyB0cmVlIG5vZGUgCiAgICAgKi8KICAgIGZyZWVfZW51bXMoJnRwLT5lbnVtcyk7CiAgICBmcmVlX3JhbmdlcygmdHAtPnJhbmdlcyk7CiAgICBmcmVlX2luZGV4ZXMoJnRwLT5pbmRleGVzKTsKICAgIGZyZWVfdmFyYmluZHMoJnRwLT52YXJiaW5kcyk7CiAgICBpZiAoIWtlZXBfbGFiZWwpCiAgICAgICAgU05NUF9GUkVFKHRwLT5sYWJlbCk7CiAgICBTTk1QX0ZSRUUodHAtPmhpbnQpOwogICAgU05NUF9GUkVFKHRwLT51bml0cyk7CiAgICBTTk1QX0ZSRUUodHAtPmRlc2NyaXB0aW9uKTsKICAgIFNOTVBfRlJFRSh0cC0+cmVmZXJlbmNlKTsKICAgIFNOTVBfRlJFRSh0cC0+YXVnbWVudHMpOwogICAgU05NUF9GUkVFKHRwLT5kZWZhdWx0VmFsdWUpOwp9CgovKgogKiBmcmVlIGEgdHJlZSBub2RlLiBOb3RlOiB0aGUgbm9kZSBtdXN0IGFscmVhZHkgaGF2ZSBiZWVuIHVubGlua2VkCiAqIGZyb20gdGhlIHRyZWUgd2hlbiBjYWxsaW5nIHRoaXMgcm91dGluZQogKi8Kc3RhdGljIHZvaWQKZnJlZV90cmVlKHN0cnVjdCB0cmVlICpUcmVlKQp7CiAgICBpZiAoIVRyZWUpCiAgICAgICAgcmV0dXJuOwoKICAgIHVubGlua190YnVja2V0KFRyZWUpOwogICAgZnJlZV9wYXJ0aWFsX3RyZWUoVHJlZSwgRkFMU0UpOwogICAgaWYgKFRyZWUtPm1vZHVsZV9saXN0ICE9ICZUcmVlLT5tb2RpZCkKICAgICAgICBmcmVlKFRyZWUtPm1vZHVsZV9saXN0KTsKICAgIGZyZWUoVHJlZSk7Cn0KCnN0YXRpYyB2b2lkCmZyZWVfbm9kZShzdHJ1Y3Qgbm9kZSAqbnApCnsKICAgIGlmICghbnApCiAgICAgICAgcmV0dXJuOwoKICAgIGZyZWVfZW51bXMoJm5wLT5lbnVtcyk7CiAgICBmcmVlX3JhbmdlcygmbnAtPnJhbmdlcyk7CiAgICBmcmVlX2luZGV4ZXMoJm5wLT5pbmRleGVzKTsKICAgIGZyZWVfdmFyYmluZHMoJm5wLT52YXJiaW5kcyk7CiAgICBpZiAobnAtPmxhYmVsKQogICAgICAgIGZyZWUobnAtPmxhYmVsKTsKICAgIGlmIChucC0+aGludCkKICAgICAgICBmcmVlKG5wLT5oaW50KTsKICAgIGlmIChucC0+dW5pdHMpCiAgICAgICAgZnJlZShucC0+dW5pdHMpOwogICAgaWYgKG5wLT5kZXNjcmlwdGlvbikKICAgICAgICBmcmVlKG5wLT5kZXNjcmlwdGlvbik7CiAgICBpZiAobnAtPnJlZmVyZW5jZSkKICAgICAgICBmcmVlKG5wLT5yZWZlcmVuY2UpOwogICAgaWYgKG5wLT5kZWZhdWx0VmFsdWUpCiAgICAgICAgZnJlZShucC0+ZGVmYXVsdFZhbHVlKTsKICAgIGlmIChucC0+cGFyZW50KQogICAgICAgIGZyZWUobnAtPnBhcmVudCk7CiAgICBpZiAobnAtPmF1Z21lbnRzKQogICAgICAgIGZyZWUobnAtPmF1Z21lbnRzKTsKICAgIGlmIChucC0+ZmlsZW5hbWUpCglmcmVlKG5wLT5maWxlbmFtZSk7CiAgICBmcmVlKChjaGFyICopIG5wKTsKfQoKc3RhdGljIHZvaWQKcHJpbnRfcmFuZ2VfdmFsdWUoRklMRSAqIGZwLCBpbnQgdHlwZSwgc3RydWN0IHJhbmdlX2xpc3QgKiBycCkKewogICAgc3dpdGNoICh0eXBlKSB7CiAgICBjYXNlIFRZUEVfSU5URUdFUjoKICAgIGNhc2UgVFlQRV9JTlRFR0VSMzI6CiAgICAgICAgaWYgKHJwLT5sb3cgPT0gcnAtPmhpZ2gpCiAgICAgICAgICAgIGZwcmludGYoZnAsICIlZCIsIHJwLT5sb3cpOwogICAgICAgIGVsc2UKICAgICAgICAgICAgZnByaW50ZihmcCwgIiVkLi4lZCIsIHJwLT5sb3csIHJwLT5oaWdoKTsKICAgICAgICBicmVhazsKICAgIGNhc2UgVFlQRV9VTlNJR05FRDMyOgogICAgY2FzZSBUWVBFX09DVEVUU1RSOgogICAgY2FzZSBUWVBFX0dBVUdFOgogICAgY2FzZSBUWVBFX1VJTlRFR0VSOgogICAgICAgIGlmIChycC0+bG93ID09IHJwLT5oaWdoKQogICAgICAgICAgICBmcHJpbnRmKGZwLCAiJXUiLCAodW5zaWduZWQpcnAtPmxvdyk7CiAgICAgICAgZWxzZQogICAgICAgICAgICBmcHJpbnRmKGZwLCAiJXUuLiV1IiwgKHVuc2lnbmVkKXJwLT5sb3csICh1bnNpZ25lZClycC0+aGlnaCk7CiAgICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICAgIC8qIE5vIG90aGVyIHJhbmdlIHR5cGVzIGFsbG93ZWQgKi8KICAgICAgICBicmVhazsKICAgIH0KfQoKI2lmZGVmIFRFU1QKc3RhdGljIHZvaWQKcHJpbnRfbm9kZXMoRklMRSAqIGZwLCBzdHJ1Y3Qgbm9kZSAqcm9vdCkKewogICAgc3RydWN0IGVudW1fbGlzdCAqZXA7CiAgICBzdHJ1Y3QgaW5kZXhfbGlzdCAqaXA7CiAgICBzdHJ1Y3QgdmFyYmluZF9saXN0ICp2cDsKICAgIHN0cnVjdCBub2RlICAgICpucDsKCiAgICBmb3IgKG5wID0gcm9vdDsgbnA7IG5wID0gbnAtPm5leHQpIHsKICAgICAgICBmcHJpbnRmKGZwLCAiJXMgOjo9IHsgJXMgJWxkIH0gKCVkKVxuIiwgbnAtPmxhYmVsLCBucC0+cGFyZW50LAogICAgICAgICAgICAgICAgbnAtPnN1YmlkLCBucC0+dHlwZSk7CiAgICAgICAgaWYgKG5wLT50Y19pbmRleCA+PSAwKQogICAgICAgICAgICBmcHJpbnRmKGZwLCAiICBUQyA9ICVzXG4iLCB0Y2xpc3RbbnAtPnRjX2luZGV4XS5kZXNjcmlwdG9yKTsKICAgICAgICBpZiAobnAtPmVudW1zKSB7CiAgICAgICAgICAgIGZwcmludGYoZnAsICIgIEVudW1zOiBcbiIpOwogICAgICAgICAgICBmb3IgKGVwID0gbnAtPmVudW1zOyBlcDsgZXAgPSBlcC0+bmV4dCkgewogICAgICAgICAgICAgICAgZnByaW50ZihmcCwgIiAgICAlcyglZClcbiIsIGVwLT5sYWJlbCwgZXAtPnZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAobnAtPnJhbmdlcykgewogICAgICAgICAgICBzdHJ1Y3QgcmFuZ2VfbGlzdCAqcnA7CiAgICAgICAgICAgIGZwcmludGYoZnAsICIgIFJhbmdlczogIik7CiAgICAgICAgICAgIGZvciAocnAgPSBucC0+cmFuZ2VzOyBycDsgcnAgPSBycC0+bmV4dCkgewogICAgICAgICAgICAgICAgZnByaW50ZihmcCwgIlxuICAgICIpOwogICAgICAgICAgICAgICAgcHJpbnRfcmFuZ2VfdmFsdWUoZnAsIG5wLT50eXBlLCBycCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnByaW50ZihmcCwgIlxuIik7CiAgICAgICAgfQogICAgICAgIGlmIChucC0+aW5kZXhlcykgewogICAgICAgICAgICBmcHJpbnRmKGZwLCAiICBJbmRleGVzOiBcbiIpOwogICAgICAgICAgICBmb3IgKGlwID0gbnAtPmluZGV4ZXM7IGlwOyBpcCA9IGlwLT5uZXh0KSB7CiAgICAgICAgICAgICAgICBmcHJpbnRmKGZwLCAiICAgICVzXG4iLCBpcC0+aWxhYmVsKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAobnAtPmF1Z21lbnRzKQogICAgICAgICAgICBmcHJpbnRmKGZwLCAiICBBdWdtZW50czogJXNcbiIsIG5wLT5hdWdtZW50cyk7CiAgICAgICAgaWYgKG5wLT52YXJiaW5kcykgewogICAgICAgICAgICBmcHJpbnRmKGZwLCAiICBWYXJiaW5kczogXG4iKTsKICAgICAgICAgICAgZm9yICh2cCA9IG5wLT52YXJiaW5kczsgdnA7IHZwID0gdnAtPm5leHQpIHsKICAgICAgICAgICAgICAgIGZwcmludGYoZnAsICIgICAgJXNcbiIsIHZwLT52YmxhYmVsKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAobnAtPmhpbnQpCiAgICAgICAgICAgIGZwcmludGYoZnAsICIgIEhpbnQ6ICVzXG4iLCBucC0+aGludCk7CiAgICAgICAgaWYgKG5wLT51bml0cykKICAgICAgICAgICAgZnByaW50ZihmcCwgIiAgVW5pdHM6ICVzXG4iLCBucC0+dW5pdHMpOwogICAgICAgIGlmIChucC0+ZGVmYXVsdFZhbHVlKQogICAgICAgICAgICBmcHJpbnRmKGZwLCAiICBEZWZhdWx0VmFsdWU6ICVzXG4iLCBucC0+ZGVmYXVsdFZhbHVlKTsKICAgIH0KfQojZW5kaWYKCnZvaWQKcHJpbnRfc3VidHJlZShGSUxFICogZiwgc3RydWN0IHRyZWUgKnRyZWUsIGludCBjb3VudCkKewogICAgc3RydWN0IHRyZWUgICAgKnRwOwogICAgaW50ICAgICAgICAgICAgIGk7CiAgICBjaGFyICAgICAgICAgICAgbW9kYnVmWzI1Nl07CgogICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCiAgICAgICAgZnByaW50ZihmLCAiICAiKTsKICAgIGZwcmludGYoZiwgIkNoaWxkcmVuIG9mICVzKCVsZCk6XG4iLCB0cmVlLT5sYWJlbCwgdHJlZS0+c3ViaWQpOwogICAgY291bnQrKzsKICAgIGZvciAodHAgPSB0cmVlLT5jaGlsZF9saXN0OyB0cDsgdHAgPSB0cC0+bmV4dF9wZWVyKSB7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCiAgICAgICAgICAgIGZwcmludGYoZiwgIiAgIik7CiAgICAgICAgZnByaW50ZihmLCAiJXM6JXMoJWxkKSB0eXBlPSVkIiwKICAgICAgICAgICAgICAgIG1vZHVsZV9uYW1lKHRwLT5tb2R1bGVfbGlzdFswXSwgbW9kYnVmKSwKICAgICAgICAgICAgICAgIHRwLT5sYWJlbCwgdHAtPnN1YmlkLCB0cC0+dHlwZSk7CiAgICAgICAgaWYgKHRwLT50Y19pbmRleCAhPSAtMSkKICAgICAgICAgICAgZnByaW50ZihmLCAiIHRjPSVkIiwgdHAtPnRjX2luZGV4KTsKICAgICAgICBpZiAodHAtPmhpbnQpCiAgICAgICAgICAgIGZwcmludGYoZiwgIiBoaW50PSVzIiwgdHAtPmhpbnQpOwogICAgICAgIGlmICh0cC0+dW5pdHMpCiAgICAgICAgICAgIGZwcmludGYoZiwgIiB1bml0cz0lcyIsIHRwLT51bml0cyk7CiAgICAgICAgaWYgKHRwLT5udW1iZXJfbW9kdWxlcyA+IDEpIHsKICAgICAgICAgICAgZnByaW50ZihmLCAiIG1vZHVsZXM6Iik7CiAgICAgICAgICAgIGZvciAoaSA9IDE7IGkgPCB0cC0+bnVtYmVyX21vZHVsZXM7IGkrKykKICAgICAgICAgICAgICAgIGZwcmludGYoZiwgIiAlcyIsIG1vZHVsZV9uYW1lKHRwLT5tb2R1bGVfbGlzdFtpXSwgbW9kYnVmKSk7CiAgICAgICAgfQogICAgICAgIGZwcmludGYoZiwgIlxuIik7CiAgICB9CiAgICBmb3IgKHRwID0gdHJlZS0+Y2hpbGRfbGlzdDsgdHA7IHRwID0gdHAtPm5leHRfcGVlcikgewogICAgICAgIGlmICh0cC0+Y2hpbGRfbGlzdCkKICAgICAgICAgICAgcHJpbnRfc3VidHJlZShmLCB0cCwgY291bnQpOwogICAgfQp9Cgp2b2lkCnByaW50X2FzY2lpX2R1bXBfdHJlZShGSUxFICogZiwgc3RydWN0IHRyZWUgKnRyZWUsIGludCBjb3VudCkKewogICAgc3RydWN0IHRyZWUgICAgKnRwOwoKICAgIGNvdW50Kys7CiAgICBmb3IgKHRwID0gdHJlZS0+Y2hpbGRfbGlzdDsgdHA7IHRwID0gdHAtPm5leHRfcGVlcikgewogICAgICAgIGZwcmludGYoZiwgIiVzIE9CSkVDVCBJREVOVElGSUVSIDo6PSB7ICVzICVsZCB9XG4iLCB0cC0+bGFiZWwsCiAgICAgICAgICAgICAgICB0cmVlLT5sYWJlbCwgdHAtPnN1YmlkKTsKICAgIH0KICAgIGZvciAodHAgPSB0cmVlLT5jaGlsZF9saXN0OyB0cDsgdHAgPSB0cC0+bmV4dF9wZWVyKSB7CiAgICAgICAgaWYgKHRwLT5jaGlsZF9saXN0KQogICAgICAgICAgICBwcmludF9hc2NpaV9kdW1wX3RyZWUoZiwgdHAsIGNvdW50KTsKICAgIH0KfQoKc3RhdGljIGludCAgICAgIHRyYW5zbGF0aW9uX3RhYmxlWzI1Nl07CgpzdGF0aWMgdm9pZApidWlsZF90cmFuc2xhdGlvbl90YWJsZSh2b2lkKQp7CiAgICBpbnQgICAgICAgICAgICAgY291bnQ7CgogICAgZm9yIChjb3VudCA9IDA7IGNvdW50IDwgMjU2OyBjb3VudCsrKSB7CiAgICAgICAgc3dpdGNoIChjb3VudCkgewogICAgICAgIGNhc2UgT0JKSUQ6CiAgICAgICAgICAgIHRyYW5zbGF0aW9uX3RhYmxlW2NvdW50XSA9IFRZUEVfT0JKSUQ7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgT0NURVRTVFI6CiAgICAgICAgICAgIHRyYW5zbGF0aW9uX3RhYmxlW2NvdW50XSA9IFRZUEVfT0NURVRTVFI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgSU5URUdFUjoKICAgICAgICAgICAgdHJhbnNsYXRpb25fdGFibGVbY291bnRdID0gVFlQRV9JTlRFR0VSOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIE5FVEFERFI6CiAgICAgICAgICAgIHRyYW5zbGF0aW9uX3RhYmxlW2NvdW50XSA9IFRZUEVfTkVUQUREUjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBJUEFERFI6CiAgICAgICAgICAgIHRyYW5zbGF0aW9uX3RhYmxlW2NvdW50XSA9IFRZUEVfSVBBRERSOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIENPVU5URVI6CiAgICAgICAgICAgIHRyYW5zbGF0aW9uX3RhYmxlW2NvdW50XSA9IFRZUEVfQ09VTlRFUjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBHQVVHRToKICAgICAgICAgICAgdHJhbnNsYXRpb25fdGFibGVbY291bnRdID0gVFlQRV9HQVVHRTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBUSU1FVElDS1M6CiAgICAgICAgICAgIHRyYW5zbGF0aW9uX3RhYmxlW2NvdW50XSA9IFRZUEVfVElNRVRJQ0tTOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIEtXX09QQVFVRToKICAgICAgICAgICAgdHJhbnNsYXRpb25fdGFibGVbY291bnRdID0gVFlQRV9PUEFRVUU7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgTlVMOgogICAgICAgICAgICB0cmFuc2xhdGlvbl90YWJsZVtjb3VudF0gPSBUWVBFX05VTEw7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgQ09VTlRFUjY0OgogICAgICAgICAgICB0cmFuc2xhdGlvbl90YWJsZVtjb3VudF0gPSBUWVBFX0NPVU5URVI2NDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBCSVRTVFJJTkc6CiAgICAgICAgICAgIHRyYW5zbGF0aW9uX3RhYmxlW2NvdW50XSA9IFRZUEVfQklUU1RSSU5HOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIE5TQVBBRERSRVNTOgogICAgICAgICAgICB0cmFuc2xhdGlvbl90YWJsZVtjb3VudF0gPSBUWVBFX05TQVBBRERSRVNTOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIElOVEVHRVIzMjoKICAgICAgICAgICAgdHJhbnNsYXRpb25fdGFibGVbY291bnRdID0gVFlQRV9JTlRFR0VSMzI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVUlOVEVHRVIzMjoKICAgICAgICAgICAgdHJhbnNsYXRpb25fdGFibGVbY291bnRdID0gVFlQRV9VSU5URUdFUjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBVTlNJR05FRDMyOgogICAgICAgICAgICB0cmFuc2xhdGlvbl90YWJsZVtjb3VudF0gPSBUWVBFX1VOU0lHTkVEMzI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVFJBUFRZUEU6CiAgICAgICAgICAgIHRyYW5zbGF0aW9uX3RhYmxlW2NvdW50XSA9IFRZUEVfVFJBUFRZUEU7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgTk9USUZUWVBFOgogICAgICAgICAgICB0cmFuc2xhdGlvbl90YWJsZVtjb3VudF0gPSBUWVBFX05PVElGVFlQRTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBOT1RJRkdST1VQOgogICAgICAgICAgICB0cmFuc2xhdGlvbl90YWJsZVtjb3VudF0gPSBUWVBFX05PVElGR1JPVVA7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgT0JKR1JPVVA6CiAgICAgICAgICAgIHRyYW5zbGF0aW9uX3RhYmxlW2NvdW50XSA9IFRZUEVfT0JKR1JPVVA7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgTU9EVUxFSURFTlRJVFk6CiAgICAgICAgICAgIHRyYW5zbGF0aW9uX3RhYmxlW2NvdW50XSA9IFRZUEVfTU9ESUQ7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgT0JKSURFTlRJVFk6CiAgICAgICAgICAgIHRyYW5zbGF0aW9uX3RhYmxlW2NvdW50XSA9IFRZUEVfT0JKSURFTlRJVFk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgQUdFTlRDQVA6CiAgICAgICAgICAgIHRyYW5zbGF0aW9uX3RhYmxlW2NvdW50XSA9IFRZUEVfQUdFTlRDQVA7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgQ09NUExJQU5DRToKICAgICAgICAgICAgdHJhbnNsYXRpb25fdGFibGVbY291bnRdID0gVFlQRV9NT0RDT01QOwogICAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICB0cmFuc2xhdGlvbl90YWJsZVtjb3VudF0gPSBUWVBFX09USEVSOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICB9Cn0KCnN0YXRpYyB2b2lkCmluaXRfdHJlZV9yb290cyh2b2lkKQp7CiAgICBzdHJ1Y3QgdHJlZSAgICAqdHAsICpsYXN0dHA7CiAgICBpbnQgICAgICAgICAgICAgYmFzZV9tb2RpZDsKICAgIGludCAgICAgICAgICAgICBoYXNoOwoKICAgIGJhc2VfbW9kaWQgPSB3aGljaF9tb2R1bGUoIlNOTVB2Mi1TTUkiKTsKICAgIGlmIChiYXNlX21vZGlkID09IC0xKQogICAgICAgIGJhc2VfbW9kaWQgPSB3aGljaF9tb2R1bGUoIlJGQzExNTUtU01JIik7CiAgICBpZiAoYmFzZV9tb2RpZCA9PSAtMSkKICAgICAgICBiYXNlX21vZGlkID0gd2hpY2hfbW9kdWxlKCJSRkMxMjEzLU1JQiIpOwoKICAgIC8qCiAgICAgKiBidWlsZCByb290IG5vZGUgCiAgICAgKi8KICAgIHRwID0gKHN0cnVjdCB0cmVlICopIGNhbGxvYygxLCBzaXplb2Yoc3RydWN0IHRyZWUpKTsKICAgIGlmICh0cCA9PSBOVUxMKQogICAgICAgIHJldHVybjsKICAgIHRwLT5sYWJlbCA9IHN0cmR1cCgiam9pbnQtaXNvLWNjaXR0Iik7CiAgICB0cC0+bW9kaWQgPSBiYXNlX21vZGlkOwogICAgdHAtPm51bWJlcl9tb2R1bGVzID0gMTsKICAgIHRwLT5tb2R1bGVfbGlzdCA9ICYodHAtPm1vZGlkKTsKICAgIHRwLT5zdWJpZCA9IDI7CiAgICB0cC0+dGNfaW5kZXggPSAtMTsKICAgIHNldF9mdW5jdGlvbih0cCk7ICAgICAgICAgICAvKiBmcm9tIG1pYi5jICovCiAgICBoYXNoID0gTkJVQ0tFVChuYW1lX2hhc2godHAtPmxhYmVsKSk7CiAgICB0cC0+bmV4dCA9IHRidWNrZXRzW2hhc2hdOwogICAgdGJ1Y2tldHNbaGFzaF0gPSB0cDsKICAgIGxhc3R0cCA9IHRwOwogICAgcm9vdF9pbXBvcnRzWzBdLmxhYmVsID0gc3RyZHVwKHRwLT5sYWJlbCk7CiAgICByb290X2ltcG9ydHNbMF0ubW9kaWQgPSBiYXNlX21vZGlkOwoKICAgIC8qCiAgICAgKiBidWlsZCByb290IG5vZGUgCiAgICAgKi8KICAgIHRwID0gKHN0cnVjdCB0cmVlICopIGNhbGxvYygxLCBzaXplb2Yoc3RydWN0IHRyZWUpKTsKICAgIGlmICh0cCA9PSBOVUxMKQogICAgICAgIHJldHVybjsKICAgIHRwLT5uZXh0X3BlZXIgPSBsYXN0dHA7CiAgICB0cC0+bGFiZWwgPSBzdHJkdXAoImNjaXR0Iik7CiAgICB0cC0+bW9kaWQgPSBiYXNlX21vZGlkOwogICAgdHAtPm51bWJlcl9tb2R1bGVzID0gMTsKICAgIHRwLT5tb2R1bGVfbGlzdCA9ICYodHAtPm1vZGlkKTsKICAgIHRwLT5zdWJpZCA9IDA7CiAgICB0cC0+dGNfaW5kZXggPSAtMTsKICAgIHNldF9mdW5jdGlvbih0cCk7ICAgICAgICAgICAvKiBmcm9tIG1pYi5jICovCiAgICBoYXNoID0gTkJVQ0tFVChuYW1lX2hhc2godHAtPmxhYmVsKSk7CiAgICB0cC0+bmV4dCA9IHRidWNrZXRzW2hhc2hdOwogICAgdGJ1Y2tldHNbaGFzaF0gPSB0cDsKICAgIGxhc3R0cCA9IHRwOwogICAgcm9vdF9pbXBvcnRzWzFdLmxhYmVsID0gc3RyZHVwKHRwLT5sYWJlbCk7CiAgICByb290X2ltcG9ydHNbMV0ubW9kaWQgPSBiYXNlX21vZGlkOwoKICAgIC8qCiAgICAgKiBidWlsZCByb290IG5vZGUgCiAgICAgKi8KICAgIHRwID0gKHN0cnVjdCB0cmVlICopIGNhbGxvYygxLCBzaXplb2Yoc3RydWN0IHRyZWUpKTsKICAgIGlmICh0cCA9PSBOVUxMKQogICAgICAgIHJldHVybjsKICAgIHRwLT5uZXh0X3BlZXIgPSBsYXN0dHA7CiAgICB0cC0+bGFiZWwgPSBzdHJkdXAoImlzbyIpOwogICAgdHAtPm1vZGlkID0gYmFzZV9tb2RpZDsKICAgIHRwLT5udW1iZXJfbW9kdWxlcyA9IDE7CiAgICB0cC0+bW9kdWxlX2xpc3QgPSAmKHRwLT5tb2RpZCk7CiAgICB0cC0+c3ViaWQgPSAxOwogICAgdHAtPnRjX2luZGV4ID0gLTE7CiAgICBzZXRfZnVuY3Rpb24odHApOyAgICAgICAgICAgLyogZnJvbSBtaWIuYyAqLwogICAgaGFzaCA9IE5CVUNLRVQobmFtZV9oYXNoKHRwLT5sYWJlbCkpOwogICAgdHAtPm5leHQgPSB0YnVja2V0c1toYXNoXTsKICAgIHRidWNrZXRzW2hhc2hdID0gdHA7CiAgICBsYXN0dHAgPSB0cDsKICAgIHJvb3RfaW1wb3J0c1syXS5sYWJlbCA9IHN0cmR1cCh0cC0+bGFiZWwpOwogICAgcm9vdF9pbXBvcnRzWzJdLm1vZGlkID0gYmFzZV9tb2RpZDsKCiAgICB0cmVlX2hlYWQgPSB0cDsKfQoKI2lmZGVmIFNUUklDVF9NSUJfUEFSU0VJTkcKI2RlZmluZQlsYWJlbF9jb21wYXJlCXN0cmNhc2VjbXAKI2Vsc2UKI2RlZmluZQlsYWJlbF9jb21wYXJlCXN0cmNtcAojZW5kaWYKCgpzdHJ1Y3QgdHJlZSAgICAqCmZpbmRfdHJlZV9ub2RlKGNvbnN0IGNoYXIgKm5hbWUsIGludCBtb2RpZCkKewogICAgc3RydWN0IHRyZWUgICAgKnRwLCAqaGVhZHRwOwogICAgaW50ICAgICAgICAgICAgIGNvdW50LCAqaW50X3A7CgogICAgaWYgKCFuYW1lIHx8ICEqbmFtZSkKICAgICAgICByZXR1cm4gKE5VTEwpOwoKICAgIGhlYWR0cCA9IHRidWNrZXRzW05CVUNLRVQobmFtZV9oYXNoKG5hbWUpKV07CiAgICBmb3IgKHRwID0gaGVhZHRwOyB0cDsgdHAgPSB0cC0+bmV4dCkgewogICAgICAgIGlmICh0cC0+bGFiZWwgJiYgIWxhYmVsX2NvbXBhcmUodHAtPmxhYmVsLCBuYW1lKSkgewoKICAgICAgICAgICAgaWYgKG1vZGlkID09IC0xKSAgICAvKiBBbnkgbW9kdWxlICovCiAgICAgICAgICAgICAgICByZXR1cm4gKHRwKTsKCiAgICAgICAgICAgIGZvciAoaW50X3AgPSB0cC0+bW9kdWxlX2xpc3QsIGNvdW50ID0gMDsKICAgICAgICAgICAgICAgICBjb3VudCA8IHRwLT5udW1iZXJfbW9kdWxlczsgKytjb3VudCwgKytpbnRfcCkKICAgICAgICAgICAgICAgIGlmICgqaW50X3AgPT0gbW9kaWQpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh0cCk7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAoTlVMTCk7Cn0KCi8qCiAqIGNvbXB1dGVzIGEgdmFsdWUgd2hpY2ggcmVwcmVzZW50cyBob3cgY2xvc2UgbmFtZTEgaXMgdG8gbmFtZTIuCiAqICogaGlnaCBzY29yZXMgbWVhbiBhIHdvcnNlIG1hdGNoLgogKiAqICh5ZXMsIHRoZSBhbGdvcml0aG0gc3Vja3MhKQogKi8KI2RlZmluZSBNQVhfQkFEIDB4ZmZmZmZmCgpzdGF0aWMgICAgICAgICAgdV9pbnQKY29tcHV0ZV9tYXRjaChjb25zdCBjaGFyICpzZWFyY2hfYmFzZSwgY29uc3QgY2hhciAqa2V5KQp7CiNpZiBkZWZpbmVkKEhBVkVfUkVHRVhfSCkgJiYgZGVmaW5lZChIQVZFX1JFR0NPTVApCiAgICBpbnQgICAgICAgICAgICAgcmM7CiAgICByZWdleF90ICAgICAgICAgcGFyc2V0cmVlOwogICAgcmVnbWF0Y2hfdCAgICAgIHBtYXRjaDsKICAgIHJjID0gcmVnY29tcCgmcGFyc2V0cmVlLCBrZXksIFJFR19JQ0FTRSB8IFJFR19FWFRFTkRFRCk7CiAgICBpZiAocmMgPT0gMCkKICAgICAgICByYyA9IHJlZ2V4ZWMoJnBhcnNldHJlZSwgc2VhcmNoX2Jhc2UsIDEsICZwbWF0Y2gsIDApOwogICAgcmVnZnJlZSgmcGFyc2V0cmVlKTsKICAgIGlmIChyYyA9PSAwKSB7CiAgICAgICAgLyoKICAgICAgICAgKiBmb3VuZCAKICAgICAgICAgKi8KICAgICAgICByZXR1cm4gcG1hdGNoLnJtX3NvOwogICAgfQojZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHVzZSBvdXIgb3duIHdpbGRjYXJkIG1hdGNoZXIgKi8KICAgIC8qCiAgICAgKiBmaXJzdCBmaW5kIHRoZSBsb25nZXN0IG1hdGNoaW5nIHN1YnN0cmluZyAoaWNrKSAKICAgICAqLwogICAgY2hhciAgICAgICAgICAgKmZpcnN0ID0gTlVMTCwgKnJlc3VsdCA9IE5VTEwsICplbnRyeTsKICAgIGNvbnN0IGNoYXIgICAgICpwb3NpdGlvbjsKICAgIGNoYXIgICAgICAgICAgICpuZXdrZXkgPSBzdHJkdXAoa2V5KTsKICAgIGNoYXIgICAgICAgICAgICpzdDsKCgogICAgZW50cnkgPSBzdHJ0b2tfcihuZXdrZXksICIqIiwgJnN0KTsKICAgIHBvc2l0aW9uID0gc2VhcmNoX2Jhc2U7CiAgICB3aGlsZSAoZW50cnkpIHsKICAgICAgICByZXN1bHQgPSBzdHJjYXNlc3RyKHBvc2l0aW9uLCBlbnRyeSk7CgogICAgICAgIGlmIChyZXN1bHQgPT0gTlVMTCkgewogICAgICAgICAgICBmcmVlKG5ld2tleSk7CiAgICAgICAgICAgIHJldHVybiBNQVhfQkFEOwogICAgICAgIH0KCiAgICAgICAgaWYgKGZpcnN0ID09IE5VTEwpCiAgICAgICAgICAgIGZpcnN0ID0gcmVzdWx0OwoKICAgICAgICBwb3NpdGlvbiA9IHJlc3VsdCArIHN0cmxlbihlbnRyeSk7CiAgICAgICAgZW50cnkgPSBzdHJ0b2tfcihOVUxMLCAiKiIsICZzdCk7CiAgICB9CiAgICBmcmVlKG5ld2tleSk7CiAgICBpZiAocmVzdWx0KQogICAgICAgIHJldHVybiAoZmlyc3QgLSBzZWFyY2hfYmFzZSk7CiNlbmRpZgoKICAgIC8qCiAgICAgKiBub3QgZm91bmQgCiAgICAgKi8KICAgIHJldHVybiBNQVhfQkFEOwp9CgovKgogKiBGaW5kIHRoZSB0cmVlIG5vZGUgdGhhdCBiZXN0IG1hdGNoZXMgdGhlIHBhdHRlcm4gc3RyaW5nLgogKiBVc2UgdGhlICJyZXBvcnRlZCIgZmxhZyBzdWNoIHRoYXQgb25seSBvbmUgbWF0Y2gKICogaXMgYXR0ZW1wdGVkIGZvciBldmVyeSBub2RlLgogKgogKiBXYXJuaW5nISBUaGlzIGZ1bmN0aW9uIG1heSByZWN1cnNlLgogKgogKiBDYWxsZXIgX211c3RfIGludm9rZSBjbGVhcl90cmVlX2ZsYWdzIGJlZm9yZSBmaXJzdCBjYWxsCiAqIHRvIHRoaXMgZnVuY3Rpb24uICBUaGlzIGZ1bmN0aW9uIG1heSBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMKICogdG8gZW5zdXJlIHRoYXQgdGhlIGVudGlyZSB0cmVlIGlzIHRyYXZlcnNlZC4KICovCgpzdHJ1Y3QgdHJlZSAgICAqCmZpbmRfYmVzdF90cmVlX25vZGUoY29uc3QgY2hhciAqcGF0dHJuLCBzdHJ1Y3QgdHJlZSAqdHJlZV90b3AsCiAgICAgICAgICAgICAgICAgICAgdV9pbnQgKiBtYXRjaCkKewogICAgc3RydWN0IHRyZWUgICAgKnRwLCAqYmVzdF9zb19mYXIgPSBOVUxMLCAqcmV0cHRyOwogICAgdV9pbnQgICAgICAgICAgIG9sZF9tYXRjaCA9IE1BWF9CQUQsIG5ld19tYXRjaCA9IE1BWF9CQUQ7CgogICAgaWYgKCFwYXR0cm4gfHwgISpwYXR0cm4pCiAgICAgICAgcmV0dXJuIChOVUxMKTsKCiAgICBpZiAoIXRyZWVfdG9wKQogICAgICAgIHRyZWVfdG9wID0gZ2V0X3RyZWVfaGVhZCgpOwoKICAgIGZvciAodHAgPSB0cmVlX3RvcDsgdHA7IHRwID0gdHAtPm5leHRfcGVlcikgewogICAgICAgIGlmICghdHAtPnJlcG9ydGVkICYmIHRwLT5sYWJlbCkKICAgICAgICAgICAgbmV3X21hdGNoID0gY29tcHV0ZV9tYXRjaCh0cC0+bGFiZWwsIHBhdHRybik7CiAgICAgICAgdHAtPnJlcG9ydGVkID0gMTsKCiAgICAgICAgaWYgKG5ld19tYXRjaCA8IG9sZF9tYXRjaCkgewogICAgICAgICAgICBiZXN0X3NvX2ZhciA9IHRwOwogICAgICAgICAgICBvbGRfbWF0Y2ggPSBuZXdfbWF0Y2g7CiAgICAgICAgfQogICAgICAgIGlmIChuZXdfbWF0Y2ggPT0gMCkKICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAvKiB0aGlzIGlzIHRoZSBiZXN0IHJlc3VsdCB3ZSBjYW4gZ2V0ICovCiAgICAgICAgaWYgKHRwLT5jaGlsZF9saXN0KSB7CiAgICAgICAgICAgIHJldHB0ciA9CiAgICAgICAgICAgICAgICBmaW5kX2Jlc3RfdHJlZV9ub2RlKHBhdHRybiwgdHAtPmNoaWxkX2xpc3QsICZuZXdfbWF0Y2gpOwogICAgICAgICAgICBpZiAobmV3X21hdGNoIDwgb2xkX21hdGNoKSB7CiAgICAgICAgICAgICAgICBiZXN0X3NvX2ZhciA9IHJldHB0cjsKICAgICAgICAgICAgICAgIG9sZF9tYXRjaCA9IG5ld19tYXRjaDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAobmV3X21hdGNoID09IDApCiAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgLyogdGhpcyBpcyB0aGUgYmVzdCByZXN1bHQgd2UgY2FuIGdldCAqLwogICAgICAgIH0KICAgIH0KICAgIGlmIChtYXRjaCkKICAgICAgICAqbWF0Y2ggPSBvbGRfbWF0Y2g7CiAgICByZXR1cm4gKGJlc3Rfc29fZmFyKTsKfQoKCnN0YXRpYyB2b2lkCm1lcmdlX2Fub25fY2hpbGRyZW4oc3RydWN0IHRyZWUgKnRwMSwgc3RydWN0IHRyZWUgKnRwMikKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiBOQjogdHAxIGlzIHRoZSAnYW5vbnltb3VzJyBub2RlIAogICAgICAgICAgICAgICAgICovCnsKICAgIHN0cnVjdCB0cmVlICAgICpjaGlsZDEsICpjaGlsZDIsICpwcmV2aW91czsKCiAgICBmb3IgKGNoaWxkMSA9IHRwMS0+Y2hpbGRfbGlzdDsgY2hpbGQxOykgewoKICAgICAgICBmb3IgKGNoaWxkMiA9IHRwMi0+Y2hpbGRfbGlzdCwgcHJldmlvdXMgPSBOVUxMOwogICAgICAgICAgICAgY2hpbGQyOyBwcmV2aW91cyA9IGNoaWxkMiwgY2hpbGQyID0gY2hpbGQyLT5uZXh0X3BlZXIpIHsKCiAgICAgICAgICAgIGlmIChjaGlsZDEtPnN1YmlkID09IGNoaWxkMi0+c3ViaWQpIHsKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiBGb3VuZCAnbWF0Y2hpbmcnIGNoaWxkcmVuLAogICAgICAgICAgICAgICAgICogIHNvIG1lcmdlIHRoZW0KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgaWYgKCFzdHJuY21wKGNoaWxkMS0+bGFiZWwsIEFOT04sIEFOT05fTEVOKSkgewogICAgICAgICAgICAgICAgICAgIG1lcmdlX2Fub25fY2hpbGRyZW4oY2hpbGQxLCBjaGlsZDIpOwoKICAgICAgICAgICAgICAgICAgICBjaGlsZDEtPmNoaWxkX2xpc3QgPSBOVUxMOwogICAgICAgICAgICAgICAgICAgIHByZXZpb3VzID0gY2hpbGQxOyAgLyogRmluaXNoZWQgd2l0aCAnY2hpbGQxJyAqLwogICAgICAgICAgICAgICAgICAgIGNoaWxkMSA9IGNoaWxkMS0+bmV4dF9wZWVyOwogICAgICAgICAgICAgICAgICAgIGZyZWVfdHJlZShwcmV2aW91cyk7CiAgICAgICAgICAgICAgICAgICAgZ290byBuZXh0OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFzdHJuY21wKGNoaWxkMi0+bGFiZWwsIEFOT04sIEFOT05fTEVOKSkgewogICAgICAgICAgICAgICAgICAgIG1lcmdlX2Fub25fY2hpbGRyZW4oY2hpbGQyLCBjaGlsZDEpOwoKICAgICAgICAgICAgICAgICAgICBpZiAocHJldmlvdXMpCiAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzLT5uZXh0X3BlZXIgPSBjaGlsZDItPm5leHRfcGVlcjsKICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHRwMi0+Y2hpbGRfbGlzdCA9IGNoaWxkMi0+bmV4dF9wZWVyOwogICAgICAgICAgICAgICAgICAgIGZyZWVfdHJlZShjaGlsZDIpOwoKICAgICAgICAgICAgICAgICAgICBwcmV2aW91cyA9IGNoaWxkMTsgIC8qIE1vdmUgJ2NoaWxkMScgdG8gJ3RwMicgKi8KICAgICAgICAgICAgICAgICAgICBjaGlsZDEgPSBjaGlsZDEtPm5leHRfcGVlcjsKICAgICAgICAgICAgICAgICAgICBwcmV2aW91cy0+bmV4dF9wZWVyID0gdHAyLT5jaGlsZF9saXN0OwogICAgICAgICAgICAgICAgICAgIHRwMi0+Y2hpbGRfbGlzdCA9IHByZXZpb3VzOwogICAgICAgICAgICAgICAgICAgIGZvciAocHJldmlvdXMgPSB0cDItPmNoaWxkX2xpc3Q7CiAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91czsgcHJldmlvdXMgPSBwcmV2aW91cy0+bmV4dF9wZWVyKQogICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91cy0+cGFyZW50ID0gdHAyOwogICAgICAgICAgICAgICAgICAgIGdvdG8gbmV4dDsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWxhYmVsX2NvbXBhcmUoY2hpbGQxLT5sYWJlbCwgY2hpbGQyLT5sYWJlbCkpIHsKICAgICAgICAgICAgICAgICAgICBpZiAobmV0c25tcF9kc19nZXRfaW50KE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgCgkJCQkJICAgTkVUU05NUF9EU19MSUJfTUlCX1dBUk5JTkdTKSkgewogICAgICAgICAgICAgICAgICAgICAgICBzbm1wX2xvZyhMT0dfV0FSTklORywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIldhcm5pbmc6ICVzLiVsZCBpcyBib3RoICVzIGFuZCAlcyAoJXMpXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cDItPmxhYmVsLCBjaGlsZDEtPnN1YmlkLCBjaGlsZDEtPmxhYmVsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZDItPmxhYmVsLCBGaWxlKTsKCQkgICAgfQogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAgICAqIFR3byBjb3BpZXMgb2YgdGhlIHNhbWUgbm9kZS4KICAgICAgICAgICAgICAgICAgICAgKiAnY2hpbGQyJyBhZG9wdHMgdGhlIGNoaWxkcmVuIG9mICdjaGlsZDEnCiAgICAgICAgICAgICAgICAgICAgICovCgogICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZDItPmNoaWxkX2xpc3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChwcmV2aW91cyA9IGNoaWxkMi0+Y2hpbGRfbGlzdDsgcHJldmlvdXMtPm5leHRfcGVlcjsgcHJldmlvdXMgPSBwcmV2aW91cy0+bmV4dF9wZWVyKTsgICAgICAgLyogRmluZCB0aGUgZW5kIG9mIHRoZSBsaXN0ICovCiAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzLT5uZXh0X3BlZXIgPSBjaGlsZDEtPmNoaWxkX2xpc3Q7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkMi0+Y2hpbGRfbGlzdCA9IGNoaWxkMS0+Y2hpbGRfbGlzdDsKICAgICAgICAgICAgICAgICAgICBmb3IgKHByZXZpb3VzID0gY2hpbGQxLT5jaGlsZF9saXN0OwogICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXM7IHByZXZpb3VzID0gcHJldmlvdXMtPm5leHRfcGVlcikKICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXMtPnBhcmVudCA9IGNoaWxkMjsKICAgICAgICAgICAgICAgICAgICBjaGlsZDEtPmNoaWxkX2xpc3QgPSBOVUxMOwoKICAgICAgICAgICAgICAgICAgICBwcmV2aW91cyA9IGNoaWxkMTsgIC8qIEZpbmlzaGVkIHdpdGggJ2NoaWxkMScgKi8KICAgICAgICAgICAgICAgICAgICBjaGlsZDEgPSBjaGlsZDEtPm5leHRfcGVlcjsKICAgICAgICAgICAgICAgICAgICBmcmVlX3RyZWUocHJldmlvdXMpOwogICAgICAgICAgICAgICAgICAgIGdvdG8gbmV4dDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKgogICAgICAgICAqIElmIG5vIG1hdGNoLCBtb3ZlICdjaGlsZDEnIHRvICd0cDInIGNoaWxkX2xpc3QKICAgICAgICAgKi8KICAgICAgICBpZiAoY2hpbGQxKSB7CiAgICAgICAgICAgIHByZXZpb3VzID0gY2hpbGQxOwogICAgICAgICAgICBjaGlsZDEgPSBjaGlsZDEtPm5leHRfcGVlcjsKICAgICAgICAgICAgcHJldmlvdXMtPnBhcmVudCA9IHRwMjsKICAgICAgICAgICAgcHJldmlvdXMtPm5leHRfcGVlciA9IHRwMi0+Y2hpbGRfbGlzdDsKICAgICAgICAgICAgdHAyLT5jaGlsZF9saXN0ID0gcHJldmlvdXM7CiAgICAgICAgfQogICAgICBuZXh0OjsKICAgIH0KfQoKCi8qCiAqIEZpbmQgYWxsIHRoZSBjaGlsZHJlbiBvZiByb290IGluIHRoZSBsaXN0IG9mIG5vZGVzLiAgTGluayB0aGVtIGludG8gdGhlCiAqIHRyZWUgYW5kIG91dCBvZiB0aGUgbm9kZXMgbGlzdC4KICovCnN0YXRpYyB2b2lkCmRvX3N1YnRyZWUoc3RydWN0IHRyZWUgKnJvb3QsIHN0cnVjdCBub2RlICoqbm9kZXMpCnsKICAgIHN0cnVjdCB0cmVlICAgICp0cCwgKmFub25fdHAgPSBOVUxMOwogICAgc3RydWN0IHRyZWUgICAgKnhyb290ID0gcm9vdDsKICAgIHN0cnVjdCBub2RlICAgICpucCwgKipoZWFkcDsKICAgIHN0cnVjdCBub2RlICAgICpvbGRucCA9IE5VTEwsICpjaGlsZF9saXN0ID0gTlVMTCwgKmNoaWxkcCA9IE5VTEw7CiAgICBpbnQgICAgICAgICAgICAgaGFzaDsKICAgIGludCAgICAgICAgICAgICppbnRfcDsKCiAgICB3aGlsZSAoeHJvb3QtPm5leHRfcGVlciAmJiB4cm9vdC0+bmV4dF9wZWVyLT5zdWJpZCA9PSByb290LT5zdWJpZCkgewojaWYgMAogICAgICAgIHByaW50ZigieHJvb3Q6ICVzLiVzID0+ICVzXG4iLCB4cm9vdC0+cGFyZW50LT5sYWJlbCwgeHJvb3QtPmxhYmVsLAogICAgICAgICAgICAgICB4cm9vdC0+bmV4dF9wZWVyLT5sYWJlbCk7CiNlbmRpZgogICAgICAgIHhyb290ID0geHJvb3QtPm5leHRfcGVlcjsKICAgIH0KCiAgICB0cCA9IHJvb3Q7CiAgICBoZWFkcCA9ICZuYnVja2V0c1tOQlVDS0VUKG5hbWVfaGFzaCh0cC0+bGFiZWwpKV07CiAgICAvKgogICAgICogU2VhcmNoIGVhY2ggb2YgdGhlIG5vZGVzIGZvciBvbmUgd2hvc2UgcGFyZW50IGlzIHJvb3QsIGFuZAogICAgICogbW92ZSBlYWNoIGludG8gYSBzZXBhcmF0ZSBsaXN0LgogICAgICovCiAgICBmb3IgKG5wID0gKmhlYWRwOyBucDsgbnAgPSBucC0+bmV4dCkgewogICAgICAgIGlmICghbGFiZWxfY29tcGFyZSh0cC0+bGFiZWwsIG5wLT5wYXJlbnQpKSB7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIHRha2UgdGhpcyBub2RlIG91dCBvZiB0aGUgbm9kZSBsaXN0IAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgaWYgKG9sZG5wID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICpoZWFkcCA9IG5wLT5uZXh0OyAgICAgIC8qIGZpeCByb290IG9mIG5vZGUgbGlzdCAqLwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgb2xkbnAtPm5leHQgPSBucC0+bmV4dDsgLyogbGluayBhcm91bmQgdGhpcyBub2RlICovCiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGNoaWxkX2xpc3QpCiAgICAgICAgICAgICAgICBjaGlsZHAtPm5leHQgPSBucDsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgY2hpbGRfbGlzdCA9IG5wOwogICAgICAgICAgICBjaGlsZHAgPSBucDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBvbGRucCA9IG5wOwogICAgICAgIH0KCiAgICB9CiAgICBpZiAoY2hpbGRwKQogICAgICAgIGNoaWxkcC0+bmV4dCA9IE5VTEw7CiAgICAvKgogICAgICogVGFrZSBlYWNoIGVsZW1lbnQgaW4gdGhlIGNoaWxkIGxpc3QgYW5kIHBsYWNlIGl0IGludG8gdGhlIHRyZWUuCiAgICAgKi8KICAgIGZvciAobnAgPSBjaGlsZF9saXN0OyBucDsgbnAgPSBucC0+bmV4dCkgewogICAgICAgIHN0cnVjdCB0cmVlICAgICpvdHAgPSBOVUxMOwogICAgICAgIHN0cnVjdCB0cmVlICAgICp4eHJvb3QgPSB4cm9vdDsKICAgICAgICBhbm9uX3RwID0gTlVMTDsKICAgICAgICB0cCA9IHhyb290LT5jaGlsZF9saXN0OwoKICAgICAgICBpZiAobnAtPnN1YmlkID09IC0xKSB7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIG5hbWUgOjo9IHsgcGFyZW50IH0gCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBucC0+c3ViaWQgPSB4cm9vdC0+c3ViaWQ7CiAgICAgICAgICAgIHRwID0geHJvb3Q7CiAgICAgICAgICAgIHh4cm9vdCA9IHhyb290LT5wYXJlbnQ7CiAgICAgICAgfQoKICAgICAgICB3aGlsZSAodHApIHsKICAgICAgICAgICAgaWYgKHRwLT5zdWJpZCA9PSBucC0+c3ViaWQpCiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBvdHAgPSB0cDsKICAgICAgICAgICAgICAgIHRwID0gdHAtPm5leHRfcGVlcjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAodHApIHsKICAgICAgICAgICAgaWYgKCFsYWJlbF9jb21wYXJlKHRwLT5sYWJlbCwgbnAtPmxhYmVsKSkgewogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIFVwZGF0ZSBsaXN0IG9mIG1vZHVsZXMgCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGludF9wID0gbWFsbG9jKCh0cC0+bnVtYmVyX21vZHVsZXMgKyAxKSAqIHNpemVvZihpbnQpKTsKICAgICAgICAgICAgICAgIGlmIChpbnRfcCA9PSBOVUxMKQogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIG1lbWNweShpbnRfcCwgdHAtPm1vZHVsZV9saXN0LAogICAgICAgICAgICAgICAgICAgICAgIHRwLT5udW1iZXJfbW9kdWxlcyAqIHNpemVvZihpbnQpKTsKICAgICAgICAgICAgICAgIGludF9wW3RwLT5udW1iZXJfbW9kdWxlc10gPSBucC0+bW9kaWQ7CiAgICAgICAgICAgICAgICBpZiAodHAtPm1vZHVsZV9saXN0ICE9ICZ0cC0+bW9kaWQpCiAgICAgICAgICAgICAgICAgICAgZnJlZSh0cC0+bW9kdWxlX2xpc3QpOwogICAgICAgICAgICAgICAgKyt0cC0+bnVtYmVyX21vZHVsZXM7CiAgICAgICAgICAgICAgICB0cC0+bW9kdWxlX2xpc3QgPSBpbnRfcDsKCiAgICAgICAgICAgICAgICBpZiAobmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIAoJCQkJCSAgIE5FVFNOTVBfRFNfTElCX01JQl9SRVBMQUNFKSkgewogICAgICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICAgICogUmVwbGFjZSBmcm9tIG5vZGUgCiAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgdHJlZV9mcm9tX25vZGUodHAsIG5wKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiBIYW5kbGUgY2hpbGRyZW4gCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGRvX3N1YnRyZWUodHAsIG5vZGVzKTsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghc3RybmNtcChucC0+bGFiZWwsIEFOT04sIEFOT05fTEVOKSB8fAogICAgICAgICAgICAgICAgIXN0cm5jbXAodHAtPmxhYmVsLCBBTk9OLCBBTk9OX0xFTikpIHsKICAgICAgICAgICAgICAgIGFub25fdHAgPSB0cDsgICAvKiBOZWVkIHRvIG1lcmdlIHRoZXNlIHR3byB0cmVlcyBsYXRlciAqLwogICAgICAgICAgICB9IGVsc2UgaWYgKG5ldHNubXBfZHNfZ2V0X2ludChORVRTTk1QX0RTX0xJQlJBUllfSUQsIAoJCQkJCSAgTkVUU05NUF9EU19MSUJfTUlCX1dBUk5JTkdTKSkgewogICAgICAgICAgICAgICAgc25tcF9sb2coTE9HX1dBUk5JTkcsCiAgICAgICAgICAgICAgICAgICAgICAgICAiV2FybmluZzogJXMuJWxkIGlzIGJvdGggJXMgYW5kICVzICglcylcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICByb290LT5sYWJlbCwgbnAtPnN1YmlkLCB0cC0+bGFiZWwsIG5wLT5sYWJlbCwKICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUpOwoJICAgIH0KICAgICAgICB9CgogICAgICAgIHRwID0gKHN0cnVjdCB0cmVlICopIGNhbGxvYygxLCBzaXplb2Yoc3RydWN0IHRyZWUpKTsKICAgICAgICBpZiAodHAgPT0gTlVMTCkKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIHRwLT5wYXJlbnQgPSB4eHJvb3Q7CiAgICAgICAgdHAtPm1vZGlkID0gbnAtPm1vZGlkOwogICAgICAgIHRwLT5udW1iZXJfbW9kdWxlcyA9IDE7CiAgICAgICAgdHAtPm1vZHVsZV9saXN0ID0gJih0cC0+bW9kaWQpOwogICAgICAgIHRyZWVfZnJvbV9ub2RlKHRwLCBucCk7CiAgICAgICAgdHAtPm5leHRfcGVlciA9IG90cCA/IG90cC0+bmV4dF9wZWVyIDogeHhyb290LT5jaGlsZF9saXN0OwogICAgICAgIGlmIChvdHApCiAgICAgICAgICAgIG90cC0+bmV4dF9wZWVyID0gdHA7CiAgICAgICAgZWxzZQogICAgICAgICAgICB4eHJvb3QtPmNoaWxkX2xpc3QgPSB0cDsKICAgICAgICBoYXNoID0gTkJVQ0tFVChuYW1lX2hhc2godHAtPmxhYmVsKSk7CiAgICAgICAgdHAtPm5leHQgPSB0YnVja2V0c1toYXNoXTsKICAgICAgICB0YnVja2V0c1toYXNoXSA9IHRwOwogICAgICAgIGRvX3N1YnRyZWUodHAsIG5vZGVzKTsKCiAgICAgICAgaWYgKGFub25fdHApIHsKICAgICAgICAgICAgaWYgKCFzdHJuY21wKHRwLT5sYWJlbCwgQU5PTiwgQU5PTl9MRU4pKSB7CiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogVGhlIG5ldyBub2RlIGlzIGFub255bW91cywKICAgICAgICAgICAgICAgICAqICBzbyBtZXJnZSBpdCB3aXRoIHRoZSBleGlzdGluZyBvbmUuCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIG1lcmdlX2Fub25fY2hpbGRyZW4odHAsIGFub25fdHApOwoKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiB1bmxpbmsgYW5kIGRlc3Ryb3kgdHAgCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIHVubGlua190cmVlKHRwKTsKICAgICAgICAgICAgICAgIGZyZWVfdHJlZSh0cCk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoYW5vbl90cC0+bGFiZWwsIEFOT04sIEFOT05fTEVOKSkgewogICAgICAgICAgICAgICAgc3RydWN0IHRyZWUgICAgKm50cDsKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiBUaGUgb2xkIG5vZGUgd2FzIGFub255bW91cywKICAgICAgICAgICAgICAgICAqICBzbyBtZXJnZSBpdCB3aXRoIHRoZSBleGlzdGluZyBvbmUsCiAgICAgICAgICAgICAgICAgKiAgYW5kIGZpbGwgaW4gdGhlIGZ1bGwgaW5mb3JtYXRpb24uCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIG1lcmdlX2Fub25fY2hpbGRyZW4oYW5vbl90cCwgdHApOwoKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiB1bmxpbmsgYW5vbl90cCBmcm9tIHRoZSBoYXNoIAogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICB1bmxpbmtfdGJ1Y2tldChhbm9uX3RwKTsKCiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogZ2V0IHJpZCBvZiBvbGQgY29udGVudHMgb2YgYW5vbl90cCAKICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgZnJlZV9wYXJ0aWFsX3RyZWUoYW5vbl90cCwgRkFMU0UpOwoKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiBwdXQgaW4gdGhlIGN1cnJlbnQgaW5mb3JtYXRpb24gCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGFub25fdHAtPmxhYmVsID0gdHAtPmxhYmVsOwogICAgICAgICAgICAgICAgYW5vbl90cC0+Y2hpbGRfbGlzdCA9IHRwLT5jaGlsZF9saXN0OwogICAgICAgICAgICAgICAgYW5vbl90cC0+bW9kaWQgPSB0cC0+bW9kaWQ7CiAgICAgICAgICAgICAgICBhbm9uX3RwLT50Y19pbmRleCA9IHRwLT50Y19pbmRleDsKICAgICAgICAgICAgICAgIGFub25fdHAtPnR5cGUgPSB0cC0+dHlwZTsKICAgICAgICAgICAgICAgIGFub25fdHAtPmVudW1zID0gdHAtPmVudW1zOwogICAgICAgICAgICAgICAgYW5vbl90cC0+aW5kZXhlcyA9IHRwLT5pbmRleGVzOwogICAgICAgICAgICAgICAgYW5vbl90cC0+YXVnbWVudHMgPSB0cC0+YXVnbWVudHM7CiAgICAgICAgICAgICAgICBhbm9uX3RwLT52YXJiaW5kcyA9IHRwLT52YXJiaW5kczsKICAgICAgICAgICAgICAgIGFub25fdHAtPnJhbmdlcyA9IHRwLT5yYW5nZXM7CiAgICAgICAgICAgICAgICBhbm9uX3RwLT5oaW50ID0gdHAtPmhpbnQ7CiAgICAgICAgICAgICAgICBhbm9uX3RwLT51bml0cyA9IHRwLT51bml0czsKICAgICAgICAgICAgICAgIGFub25fdHAtPmRlc2NyaXB0aW9uID0gdHAtPmRlc2NyaXB0aW9uOwogICAgICAgICAgICAgICAgYW5vbl90cC0+cmVmZXJlbmNlID0gdHAtPnJlZmVyZW5jZTsKICAgICAgICAgICAgICAgIGFub25fdHAtPmRlZmF1bHRWYWx1ZSA9IHRwLT5kZWZhdWx0VmFsdWU7CiAgICAgICAgICAgICAgICBhbm9uX3RwLT5wYXJlbnQgPSB0cC0+cGFyZW50OwoKICAgICAgICAgICAgICAgIHNldF9mdW5jdGlvbihhbm9uX3RwKTsKCiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogdXBkYXRlIHBhcmVudCBwb2ludGVyIGluIG1vdmVkIGNoaWxkcmVuIAogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBudHAgPSBhbm9uX3RwLT5jaGlsZF9saXN0OwogICAgICAgICAgICAgICAgd2hpbGUgKG50cCkgewogICAgICAgICAgICAgICAgICAgIG50cC0+cGFyZW50ID0gYW5vbl90cDsKICAgICAgICAgICAgICAgICAgICBudHAgPSBudHAtPm5leHRfcGVlcjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogaGFzaCBpbiBhbm9uX3RwIGluIGl0cyBuZXcgcGxhY2UgCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGhhc2ggPSBOQlVDS0VUKG5hbWVfaGFzaChhbm9uX3RwLT5sYWJlbCkpOwogICAgICAgICAgICAgICAgYW5vbl90cC0+bmV4dCA9IHRidWNrZXRzW2hhc2hdOwogICAgICAgICAgICAgICAgdGJ1Y2tldHNbaGFzaF0gPSBhbm9uX3RwOwoKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiB1bmxpbmsgYW5kIGRlc3Ryb3kgdHAgCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIHVubGlua190YnVja2V0KHRwKTsKICAgICAgICAgICAgICAgIHVubGlua190cmVlKHRwKTsKICAgICAgICAgICAgICAgIGZyZWUodHApOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIFVoPyAgT25lIG9mIHRoZXNlIHR3byBzaG91bGQgaGF2ZSBiZWVuIGFub255bW91cyEgCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGlmIChuZXRzbm1wX2RzX2dldF9pbnQoTkVUU05NUF9EU19MSUJSQVJZX0lELCAKCQkJCSAgICAgICBORVRTTk1QX0RTX0xJQl9NSUJfV0FSTklOR1MpKSB7CiAgICAgICAgICAgICAgICAgICAgc25tcF9sb2coTE9HX1dBUk5JTkcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIldhcm5pbmc6IGV4cGVjdGVkIGFub255bW91cyBub2RlIChlaXRoZXIgJXMgb3IgJXMpIGluICVzXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwLT5sYWJlbCwgYW5vbl90cC0+bGFiZWwsIEZpbGUpOwoJCX0KICAgICAgICAgICAgfQogICAgICAgICAgICBhbm9uX3RwID0gTlVMTDsKICAgICAgICB9CiAgICB9CiAgICAvKgogICAgICogZnJlZSBhbGwgbm9kZXMgdGhhdCB3ZXJlIGNvcGllZCBpbnRvIHRyZWUgCiAgICAgKi8KICAgIG9sZG5wID0gTlVMTDsKICAgIGZvciAobnAgPSBjaGlsZF9saXN0OyBucDsgbnAgPSBucC0+bmV4dCkgewogICAgICAgIGlmIChvbGRucCkKICAgICAgICAgICAgZnJlZV9ub2RlKG9sZG5wKTsKICAgICAgICBvbGRucCA9IG5wOwogICAgfQogICAgaWYgKG9sZG5wKQogICAgICAgIGZyZWVfbm9kZShvbGRucCk7Cn0KCnN0YXRpYyB2b2lkCmRvX2xpbmt1cChzdHJ1Y3QgbW9kdWxlICptcCwgc3RydWN0IG5vZGUgKm5wKQp7CiAgICBzdHJ1Y3QgbW9kdWxlX2ltcG9ydCAqbWlwOwogICAgc3RydWN0IG5vZGUgICAgKm9ucCwgKm9sZHAsICpuZXdwOwogICAgc3RydWN0IHRyZWUgICAgKnRwOwogICAgaW50ICAgICAgICAgICAgIGksIG1vcmU7CiAgICAvKgogICAgICogQWxsIG1vZHVsZXMgaW1wbGljaXRseSBpbXBvcnQKICAgICAqICAgdGhlIHJvb3RzIG9mIHRoZSB0cmVlCiAgICAgKi8KICAgIGlmIChzbm1wX2dldF9kb19kZWJ1Z2dpbmcoKSA+IDEpCiAgICAgICAgZHVtcF9tb2R1bGVfbGlzdCgpOwogICAgREVCVUdNU0dUTCgoInBhcnNlLW1pYnMiLCAiUHJvY2Vzc2luZyBJTVBPUlRTIGZvciBtb2R1bGUgJWQgJXNcbiIsCiAgICAgICAgICAgICAgICBtcC0+bW9kaWQsIG1wLT5uYW1lKSk7CiAgICBpZiAobXAtPm5vX2ltcG9ydHMgPT0gMCkgewogICAgICAgIG1wLT5ub19pbXBvcnRzID0gTlVNQkVSX09GX1JPT1RfTk9ERVM7CiAgICAgICAgbXAtPmltcG9ydHMgPSByb290X2ltcG9ydHM7CiAgICB9CgogICAgLyoKICAgICAqIEJ1aWxkIHRoZSB0cmVlCiAgICAgKi8KICAgIGluaXRfbm9kZV9oYXNoKG5wKTsKICAgIGZvciAoaSA9IDAsIG1pcCA9IG1wLT5pbXBvcnRzOyBpIDwgbXAtPm5vX2ltcG9ydHM7ICsraSwgKyttaXApIHsKICAgICAgICBjaGFyICAgICAgICAgICAgbW9kYnVmWzI1Nl07CiAgICAgICAgREVCVUdNU0dUTCgoInBhcnNlLW1pYnMiLCAiICBQcm9jZXNzaW5nIGltcG9ydDogJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgbWlwLT5sYWJlbCkpOwogICAgICAgIGlmIChnZXRfdGNfaW5kZXgobWlwLT5sYWJlbCwgbWlwLT5tb2RpZCkgIT0gLTEpCiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIHRwID0gZmluZF90cmVlX25vZGUobWlwLT5sYWJlbCwgbWlwLT5tb2RpZCk7CiAgICAgICAgaWYgKCF0cCkgewogICAgICAgICAgICAgICAgc25tcF9sb2coTE9HX1dBUk5JTkcsCiAgICAgICAgICAgICAgICAgICAgICAgICAiRGlkIG5vdCBmaW5kICclcycgaW4gbW9kdWxlICVzICglcylcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICBtaXAtPmxhYmVsLCBtb2R1bGVfbmFtZShtaXAtPm1vZGlkLCBtb2RidWYpLAogICAgICAgICAgICAgICAgICAgICAgICAgRmlsZSk7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBkb19zdWJ0cmVlKHRwLCAmbnApOwogICAgfQoKICAgIC8qCiAgICAgKiBJZiBhbnkgbm9kZXMgbGVmdCBvdmVyLAogICAgICogICBjaGVjayB0aGF0IHRoZXkncmUgbm90IHRoZSByZXN1bHQgb2YgYSAiZnVsbHkgcXVhbGlmaWVkIgogICAgICogICBuYW1lLCBhbmQgdGhlbiBhZGQgdGhlbSB0byB0aGUgbGlzdCBvZiBvcnBoYW5zCiAgICAgKi8KCiAgICBpZiAoIW5wKQogICAgICAgIHJldHVybjsKICAgIGZvciAodHAgPSB0cmVlX2hlYWQ7IHRwOyB0cCA9IHRwLT5uZXh0X3BlZXIpCiAgICAgICAgZG9fc3VidHJlZSh0cCwgJm5wKTsKICAgIGlmICghbnApCiAgICAgICAgcmV0dXJuOwoKICAgIC8qCiAgICAgKiBxdWlldGx5IG1vdmUgYWxsIGludGVybmFsIHJlZmVyZW5jZXMgdG8gdGhlIG9ycGhhbiBsaXN0IAogICAgICovCiAgICBvbGRwID0gb3JwaGFuX25vZGVzOwogICAgZG8gewogICAgICAgIGZvciAoaSA9IDA7IGkgPCBOSEFTSFNJWkU7IGkrKykKICAgICAgICAgICAgZm9yIChvbnAgPSBuYnVja2V0c1tpXTsgb25wOyBvbnAgPSBvbnAtPm5leHQpIHsKICAgICAgICAgICAgICAgIHN0cnVjdCBub2RlICAgICpvcCA9IE5VTEw7CiAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgaGFzaCA9IE5CVUNLRVQobmFtZV9oYXNoKG9ucC0+bGFiZWwpKTsKICAgICAgICAgICAgICAgIG5wID0gbmJ1Y2tldHNbaGFzaF07CiAgICAgICAgICAgICAgICB3aGlsZSAobnApIHsKICAgICAgICAgICAgICAgICAgICBpZiAobGFiZWxfY29tcGFyZShvbnAtPmxhYmVsLCBucC0+cGFyZW50KSkgewogICAgICAgICAgICAgICAgICAgICAgICBvcCA9IG5wOwogICAgICAgICAgICAgICAgICAgICAgICBucCA9IG5wLT5uZXh0OwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wLT5uZXh0ID0gbnAtPm5leHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5idWNrZXRzW2hhc2hdID0gbnAtPm5leHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIG5wLT5uZXh0ID0gb3JwaGFuX25vZGVzOwogICAgICAgICAgICAgICAgICAgICAgICBvcnBoYW5fbm9kZXMgPSBucDsKICAgICAgICAgICAgICAgICAgICAgICAgb3AgPSBOVUxMOwogICAgICAgICAgICAgICAgICAgICAgICBucCA9IG5idWNrZXRzW2hhc2hdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIG5ld3AgPSBvcnBoYW5fbm9kZXM7CiAgICAgICAgbW9yZSA9IDA7CiAgICAgICAgZm9yIChvbnAgPSBvcnBoYW5fbm9kZXM7IG9ucCAhPSBvbGRwOyBvbnAgPSBvbnAtPm5leHQpIHsKICAgICAgICAgICAgc3RydWN0IG5vZGUgICAgKm9wID0gTlVMTDsKICAgICAgICAgICAgaW50ICAgICAgICAgICAgIGhhc2ggPSBOQlVDS0VUKG5hbWVfaGFzaChvbnAtPmxhYmVsKSk7CiAgICAgICAgICAgIG5wID0gbmJ1Y2tldHNbaGFzaF07CiAgICAgICAgICAgIHdoaWxlIChucCkgewogICAgICAgICAgICAgICAgaWYgKGxhYmVsX2NvbXBhcmUob25wLT5sYWJlbCwgbnAtPnBhcmVudCkpIHsKICAgICAgICAgICAgICAgICAgICBvcCA9IG5wOwogICAgICAgICAgICAgICAgICAgIG5wID0gbnAtPm5leHQ7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGlmIChvcCkKICAgICAgICAgICAgICAgICAgICAgICAgb3AtPm5leHQgPSBucC0+bmV4dDsKICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIG5idWNrZXRzW2hhc2hdID0gbnAtPm5leHQ7CiAgICAgICAgICAgICAgICAgICAgbnAtPm5leHQgPSBvcnBoYW5fbm9kZXM7CiAgICAgICAgICAgICAgICAgICAgb3JwaGFuX25vZGVzID0gbnA7CiAgICAgICAgICAgICAgICAgICAgb3AgPSBOVUxMOwogICAgICAgICAgICAgICAgICAgIG5wID0gbmJ1Y2tldHNbaGFzaF07CiAgICAgICAgICAgICAgICAgICAgbW9yZSA9IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgb2xkcCA9IG5ld3A7CiAgICB9IHdoaWxlIChtb3JlKTsKCiAgICAvKgogICAgICogY29tcGxhaW4gYWJvdXQgbGVmdCBvdmVyIG5vZGVzIAogICAgICovCiAgICBmb3IgKG5wID0gb3JwaGFuX25vZGVzOyBucCAmJiBucC0+bmV4dDsgbnAgPSBucC0+bmV4dCk7ICAgICAvKiBmaW5kIHRoZSBlbmQgb2YgdGhlIG9ycGhhbiBsaXN0ICovCiAgICBmb3IgKGkgPSAwOyBpIDwgTkhBU0hTSVpFOyBpKyspCiAgICAgICAgaWYgKG5idWNrZXRzW2ldKSB7CiAgICAgICAgICAgIGlmIChvcnBoYW5fbm9kZXMpCiAgICAgICAgICAgICAgICBvbnAgPSBucC0+bmV4dCA9IG5idWNrZXRzW2ldOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBvbnAgPSBvcnBoYW5fbm9kZXMgPSBuYnVja2V0c1tpXTsKICAgICAgICAgICAgbmJ1Y2tldHNbaV0gPSBOVUxMOwogICAgICAgICAgICB3aGlsZSAob25wKSB7CiAgICAgICAgICAgICAgICBzbm1wX2xvZyhMT0dfV0FSTklORywKICAgICAgICAgICAgICAgICAgICAgICAgICJVbmxpbmtlZCBPSUQgaW4gJXM6ICVzIDo6PSB7ICVzICVsZCB9XG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgKG1wLT5uYW1lID8gbXAtPm5hbWUgOiAiPG5vIG1vZHVsZT4iKSwKICAgICAgICAgICAgICAgICAgICAgICAgIChvbnAtPmxhYmVsID8gb25wLT5sYWJlbCA6ICI8bm8gbGFiZWw+IiksCiAgICAgICAgICAgICAgICAgICAgICAgICAob25wLT5wYXJlbnQgPyBvbnAtPnBhcmVudCA6ICI8bm8gcGFyZW50PiIpLAogICAgICAgICAgICAgICAgICAgICAgICAgb25wLT5zdWJpZCk7CgkJIHNubXBfbG9nKExPR19XQVJOSU5HLAoJCQkgICJVbmRlZmluZWQgaWRlbnRpZmllcjogJXMgbmVhciBsaW5lICVkIG9mICVzXG4iLAoJCQkgIChvbnAtPnBhcmVudCA/IG9ucC0+cGFyZW50IDogIjxubyBwYXJlbnQ+IiksCgkJCSAgb25wLT5saW5lbm8sIG9ucC0+ZmlsZW5hbWUpOwogICAgICAgICAgICAgICAgbnAgPSBvbnA7CiAgICAgICAgICAgICAgICBvbnAgPSBvbnAtPm5leHQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICByZXR1cm47Cn0KCgovKgogKiBUYWtlcyBhIGxpc3Qgb2YgdGhlIGZvcm06CiAqIHsgaXNvIG9yZygzKSBkb2QoNikgMSB9CiAqIGFuZCBjcmVhdGVzIHNldmVyYWwgbm9kZXMsIG9uZSBmb3IgZWFjaCBwYXJlbnQtY2hpbGQgcGFpci4KICogUmV0dXJucyAwIG9uIGVycm9yLgogKi8Kc3RhdGljIGludApnZXRvaWQoRklMRSAqIGZwLCBzdHJ1Y3Qgc3ViaWRfcyAqaWQsICAgLyogYW4gYXJyYXkgb2Ygc3ViaWRzICovCiAgICAgICBpbnQgbGVuZ3RoKQp7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoZSBsZW5ndGggb2YgdGhlIGFycmF5ICovCiAgICByZWdpc3RlciBpbnQgICAgY291bnQ7CiAgICBpbnQgICAgICAgICAgICAgdHlwZTsKICAgIGNoYXIgICAgICAgICAgICB0b2tlbltNQVhUT0tFTl07CgogICAgaWYgKCh0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pKSAhPSBMRUZUQlJBQ0tFVCkgewogICAgICAgIHByaW50X2Vycm9yKCJFeHBlY3RlZCBcIntcIiIsIHRva2VuLCB0eXBlKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICBmb3IgKGNvdW50ID0gMDsgY291bnQgPCBsZW5ndGg7IGNvdW50KyssIGlkKyspIHsKICAgICAgICBpZC0+bGFiZWwgPSBOVUxMOwogICAgICAgIGlkLT5tb2RpZCA9IGN1cnJlbnRfbW9kdWxlOwogICAgICAgIGlkLT5zdWJpZCA9IC0xOwogICAgICAgIGlmICh0eXBlID09IFJJR0hUQlJBQ0tFVCkKICAgICAgICAgICAgcmV0dXJuIGNvdW50OwogICAgICAgIGlmICh0eXBlID09IExBQkVMKSB7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIHRoaXMgZW50cnkgaGFzIGEgbGFiZWwgCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBpZC0+bGFiZWwgPSBzdHJkdXAodG9rZW4pOwogICAgICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgICAgICBpZiAodHlwZSA9PSBMRUZUUEFSRU4pIHsKICAgICAgICAgICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSBOVU1CRVIpIHsKICAgICAgICAgICAgICAgICAgICBpZC0+c3ViaWQgPSBzdHJ0b3VsKHRva2VuLCBOVUxMLCAxMCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCh0eXBlID0KICAgICAgICAgICAgICAgICAgICAgICAgIGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKSkgIT0gUklHSFRQQVJFTikgewogICAgICAgICAgICAgICAgICAgICAgICBwcmludF9lcnJvcigiRXhwZWN0ZWQgYSBjbG9zaW5nIHBhcmVudGhlc2lzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4sIHR5cGUpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHByaW50X2Vycm9yKCJFeHBlY3RlZCBhIG51bWJlciIsIHRva2VuLCB0eXBlKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IE5VTUJFUikgewogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiB0aGlzIGVudHJ5ICBoYXMganVzdCBhbiBpbnRlZ2VyIHN1Yi1pZGVudGlmaWVyIAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgaWQtPnN1YmlkID0gc3RydG91bCh0b2tlbiwgTlVMTCwgMTApOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHByaW50X2Vycm9yKCJFeHBlY3RlZCBsYWJlbCBvciBudW1iZXIiLCB0b2tlbiwgdHlwZSk7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgfQogICAgcHJpbnRfZXJyb3IoIlRvbyBsb25nIE9JRCIsIHRva2VuLCB0eXBlKTsKICAgIHJldHVybiAwOwp9CgovKgogKiBQYXJzZSBhIHNlcXVlbmNlIG9mIG9iamVjdCBzdWJpZGVudGlmaWVycyBmb3IgdGhlIGdpdmVuIG5hbWUuCiAqIFRoZSAibGFiZWwgT0JKRUNUIElERU5USUZJRVIgOjo9IiBwb3J0aW9uIGhhcyBhbHJlYWR5IGJlZW4gcGFyc2VkLgogKgogKiBUaGUgbWFqb3JpdHkgb2YgY2FzZXMgdGFrZSB0aGlzIGZvcm0gOgogKiBsYWJlbCBPQkpFQ1QgSURFTlRJRklFUiA6Oj0geyBwYXJlbnQgMiB9CiAqIHdoZXJlIGEgcGFyZW50IGxhYmVsIGFuZCBhIGNoaWxkIHN1YmlkZW50aWZpZXIgbnVtYmVyIGFyZSBzcGVjaWZpZWQuCiAqCiAqIFZhcmlhdGlvbnMgb24gdGhlIHRoZW1lIGluY2x1ZGUgY2FzZXMgd2hlcmUgYSBudW1iZXIgYXBwZWFycyB3aXRoCiAqIHRoZSBwYXJlbnQsIG9yIGludGVybWVkaWF0ZSBzdWJpZGVudGlmaWVycyBhcmUgc3BlY2lmaWVkIGJ5IGxhYmVsLAogKiBieSBudW1iZXIsIG9yIGJvdGguCiAqCiAqIEhlcmUgYXJlIHNvbWUgcmVwcmVzZW50YXRpdmUgc2FtcGxlcyA6CiAqIGludGVybmV0ICAgICAgICBPQkpFQ1QgSURFTlRJRklFUiA6Oj0geyBpc28gb3JnKDMpIGRvZCg2KSAxIH0KICogbWdtdCAgICAgICAgICAgIE9CSkVDVCBJREVOVElGSUVSIDo6PSB7IGludGVybmV0IDIgfQogKiBycHRySW5mb0hlYWx0aCAgT0JKRUNUIElERU5USUZJRVIgOjo9IHsgc25tcERvdDNScHRyTWd0IDAgNCB9CiAqCiAqIEhlcmUgaXMgYSB2ZXJ5IHJhcmUgZm9ybSA6CiAqIGlzbyAgICAgICAgICAgICBPQkpFQ1QgSURFTlRJRklFUiA6Oj0geyAxIH0KICoKICogUmV0dXJucyBOVUxMIG9uIGVycm9yLiAgV2hlbiB0aGlzIGhhcHBlbnMsIG1lbW9yeSBtYXkgYmUgbGVha2VkLgogKi8Kc3RhdGljIHN0cnVjdCBub2RlICoKcGFyc2Vfb2JqZWN0aWQoRklMRSAqIGZwLCBjaGFyICpuYW1lKQp7CiAgICByZWdpc3RlciBpbnQgICAgY291bnQ7CiAgICByZWdpc3RlciBzdHJ1Y3Qgc3ViaWRfcyAqb3AsICpub3A7CiAgICBpbnQgICAgICAgICAgICAgbGVuZ3RoOwogICAgc3RydWN0IHN1YmlkX3MgIGxvaWRbMzJdOwogICAgc3RydWN0IG5vZGUgICAgKm5wLCAqcm9vdCA9IE5VTEwsICpvbGRucCA9IE5VTEw7CiAgICBzdHJ1Y3QgdHJlZSAgICAqdHA7CgogICAgaWYgKChsZW5ndGggPSBnZXRvaWQoZnAsIGxvaWQsIDMyKSkgPT0gMCkgewogICAgICAgIHByaW50X2Vycm9yKCJCYWQgb2JqZWN0IGlkZW50aWZpZXIiLCBOVUxMLCBDT05USU5VRSk7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CgogICAgLyoKICAgICAqIEhhbmRsZSBudW1lcmljLW9ubHkgb2JqZWN0IGlkZW50aWZpZXJzLAogICAgICogIGJ5IGxhYmVsbGluZyB0aGUgZmlyc3Qgc3ViLWlkZW50aWZpZXIKICAgICAqLwogICAgb3AgPSBsb2lkOwogICAgaWYgKCFvcC0+bGFiZWwpIHsKICAgICAgICBpZiAobGVuZ3RoID09IDEpIHsKICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkF0dGVtcHQgdG8gZGVmaW5lIGEgcm9vdCBvaWQiLCBuYW1lLCBPQkpFQ1QpOwogICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICB9CiAgICAgICAgZm9yICh0cCA9IHRyZWVfaGVhZDsgdHA7IHRwID0gdHAtPm5leHRfcGVlcikKICAgICAgICAgICAgaWYgKChpbnQpIHRwLT5zdWJpZCA9PSBvcC0+c3ViaWQpIHsKICAgICAgICAgICAgICAgIG9wLT5sYWJlbCA9IHN0cmR1cCh0cC0+bGFiZWwpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgIH0KCiAgICAvKgogICAgICogSGFuZGxlICAibGFiZWwgT0JKRUNULUlERU5USUZJRVIgOjo9IHsgc3ViaWQgfSIKICAgICAqLwogICAgaWYgKGxlbmd0aCA9PSAxKSB7CiAgICAgICAgb3AgPSBsb2lkOwogICAgICAgIG5wID0gYWxsb2Nfbm9kZShvcC0+bW9kaWQpOwogICAgICAgIGlmIChucCA9PSBOVUxMKQogICAgICAgICAgICByZXR1cm4gKE5VTEwpOwogICAgICAgIG5wLT5zdWJpZCA9IG9wLT5zdWJpZDsKICAgICAgICBucC0+bGFiZWwgPSBzdHJkdXAobmFtZSk7CiAgICAgICAgbnAtPnBhcmVudCA9IG9wLT5sYWJlbDsKICAgICAgICByZXR1cm4gbnA7CiAgICB9CgogICAgLyoKICAgICAqIEZvciBlYWNoIHBhcmVudC1jaGlsZCBzdWJpZCBwYWlyIGluIHRoZSBzdWJpZCBhcnJheSwKICAgICAqIGNyZWF0ZSBhIG5vZGUgYW5kIGxpbmsgaXQgaW50byB0aGUgbm9kZSBsaXN0LgogICAgICovCiAgICBmb3IgKGNvdW50ID0gMCwgb3AgPSBsb2lkLCBub3AgPSBsb2lkICsgMTsgY291bnQgPCAobGVuZ3RoIC0gMSk7CiAgICAgICAgIGNvdW50KyssIG9wKyssIG5vcCsrKSB7CiAgICAgICAgLyoKICAgICAgICAgKiBldmVyeSBub2RlIG11c3QgaGF2ZSBwYXJlbnQncyBuYW1lIGFuZCBjaGlsZCdzIG5hbWUgb3IgbnVtYmVyIAogICAgICAgICAqLwogICAgICAgIC8qCiAgICAgICAgICogWFggdGhlIG5leHQgc3RhdGVtZW50IGlzIGFsd2F5cyB0cnVlIC0tIGRvZXMgaXQgbWF0dGVyID8/IAogICAgICAgICAqLwogICAgICAgIGlmIChvcC0+bGFiZWwgJiYgKG5vcC0+bGFiZWwgfHwgKG5vcC0+c3ViaWQgIT0gLTEpKSkgewogICAgICAgICAgICBucCA9IGFsbG9jX25vZGUobm9wLT5tb2RpZCk7CiAgICAgICAgICAgIGlmIChucCA9PSBOVUxMKQogICAgICAgICAgICAgICAgcmV0dXJuIChOVUxMKTsKICAgICAgICAgICAgaWYgKHJvb3QgPT0gTlVMTCkKICAgICAgICAgICAgICAgIHJvb3QgPSBucDsKCiAgICAgICAgICAgIG5wLT5wYXJlbnQgPSBzdHJkdXAob3AtPmxhYmVsKTsKICAgICAgICAgICAgaWYgKGNvdW50ID09IChsZW5ndGggLSAyKSkgewogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIFRoZSBuYW1lIGZvciB0aGlzIG5vZGUgaXMgdGhlIGxhYmVsIGZvciB0aGlzIGVudHJ5IAogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBucC0+bGFiZWwgPSBzdHJkdXAobmFtZSk7CiAgICAgICAgICAgICAgICBpZiAobnAtPmxhYmVsID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICBTTk1QX0ZSRUUobnAtPnBhcmVudCk7CiAgICAgICAgICAgICAgICAgICAgU05NUF9GUkVFKG5wKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKE5VTEwpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgaWYgKCFub3AtPmxhYmVsKSB7CiAgICAgICAgICAgICAgICAgICAgbm9wLT5sYWJlbCA9IChjaGFyICopIG1hbGxvYygyMCArIEFOT05fTEVOKTsKICAgICAgICAgICAgICAgICAgICBpZiAobm9wLT5sYWJlbCA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIFNOTVBfRlJFRShucC0+cGFyZW50KTsKICAgICAgICAgICAgICAgICAgICAgICAgU05NUF9GUkVFKG5wKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChOVUxMKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc3ByaW50Zihub3AtPmxhYmVsLCAiJXMlZCIsIEFOT04sIGFub255bW91cysrKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG5wLT5sYWJlbCA9IHN0cmR1cChub3AtPmxhYmVsKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAobm9wLT5zdWJpZCAhPSAtMSkKICAgICAgICAgICAgICAgIG5wLT5zdWJpZCA9IG5vcC0+c3ViaWQ7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHByaW50X2Vycm9yKCJXYXJuaW5nOiBUaGlzIGVudHJ5IGlzIHByZXR0eSBzaWxseSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBucC0+bGFiZWwsIENPTlRJTlVFKTsKCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIHNldCB1cCBuZXh0IGVudHJ5IAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgaWYgKG9sZG5wKQogICAgICAgICAgICAgICAgb2xkbnAtPm5leHQgPSBucDsKICAgICAgICAgICAgb2xkbnAgPSBucDsKICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAvKiBlbmQgaWYob3AtPmxhYmVsLi4uICovCiAgICB9CgogICAgLyoKICAgICAqIGZyZWUgdGhlIGxvaWQgYXJyYXkgCiAgICAgKi8KICAgIGZvciAoY291bnQgPSAwLCBvcCA9IGxvaWQ7IGNvdW50IDwgbGVuZ3RoOyBjb3VudCsrLCBvcCsrKSB7CiAgICAgICAgaWYgKG9wLT5sYWJlbCkKICAgICAgICAgICAgZnJlZShvcC0+bGFiZWwpOwogICAgfQoKICAgIHJldHVybiByb290Owp9CgpzdGF0aWMgaW50CmdldF90Yyhjb25zdCBjaGFyICpkZXNjcmlwdG9yLAogICAgICAgaW50IG1vZGlkLAogICAgICAgaW50ICp0Y19pbmRleCwKICAgICAgIHN0cnVjdCBlbnVtX2xpc3QgKiplcCwgc3RydWN0IHJhbmdlX2xpc3QgKipycCwgY2hhciAqKmhpbnQpCnsKICAgIGludCAgICAgICAgICAgICBpOwogICAgc3RydWN0IHRjICAgICAgKnRjcDsKCiAgICBpID0gZ2V0X3RjX2luZGV4KGRlc2NyaXB0b3IsIG1vZGlkKTsKICAgIGlmICh0Y19pbmRleCkKICAgICAgICAqdGNfaW5kZXggPSBpOwogICAgaWYgKGkgIT0gLTEpIHsKICAgICAgICB0Y3AgPSAmdGNsaXN0W2ldOwogICAgICAgIGlmIChlcCkgewogICAgICAgICAgICBmcmVlX2VudW1zKGVwKTsKICAgICAgICAgICAgKmVwID0gY29weV9lbnVtcyh0Y3AtPmVudW1zKTsKICAgICAgICB9CiAgICAgICAgaWYgKHJwKSB7CiAgICAgICAgICAgIGZyZWVfcmFuZ2VzKHJwKTsKICAgICAgICAgICAgKnJwID0gY29weV9yYW5nZXModGNwLT5yYW5nZXMpOwogICAgICAgIH0KICAgICAgICBpZiAoaGludCkgewogICAgICAgICAgICBpZiAoKmhpbnQpCiAgICAgICAgICAgICAgICBmcmVlKCpoaW50KTsKICAgICAgICAgICAgKmhpbnQgPSAodGNwLT5oaW50ID8gc3RyZHVwKHRjcC0+aGludCkgOiBOVUxMKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRjcC0+dHlwZTsKICAgIH0KICAgIHJldHVybiBMQUJFTDsKfQoKLyoKICogcmV0dXJuIGluZGV4IGludG8gdGNsaXN0IG9mIGdpdmVuIFRDIGRlc2NyaXB0b3IKICogcmV0dXJuIC0xIGlmIG5vdCBmb3VuZAogKi8Kc3RhdGljIGludApnZXRfdGNfaW5kZXgoY29uc3QgY2hhciAqZGVzY3JpcHRvciwgaW50IG1vZGlkKQp7CiAgICBpbnQgICAgICAgICAgICAgaTsKICAgIHN0cnVjdCB0YyAgICAgICp0Y3A7CiAgICBzdHJ1Y3QgbW9kdWxlICAqbXA7CiAgICBzdHJ1Y3QgbW9kdWxlX2ltcG9ydCAqbWlwOwoKICAgIC8qCiAgICAgKiBDaGVjayB0aGF0IHRoZSBkZXNjcmlwdG9yIGlzbid0IGltcG9ydGVkCiAgICAgKiAgYnkgc2VhcmNoaW5nIHRoZSBpbXBvcnQgbGlzdAogICAgICovCgogICAgZm9yIChtcCA9IG1vZHVsZV9oZWFkOyBtcDsgbXAgPSBtcC0+bmV4dCkKICAgICAgICBpZiAobXAtPm1vZGlkID09IG1vZGlkKQogICAgICAgICAgICBicmVhazsKICAgIGlmIChtcCkKICAgICAgICBmb3IgKGkgPSAwLCBtaXAgPSBtcC0+aW1wb3J0czsgaSA8IG1wLT5ub19pbXBvcnRzOyArK2ksICsrbWlwKSB7CiAgICAgICAgICAgIGlmICghbGFiZWxfY29tcGFyZShtaXAtPmxhYmVsLCBkZXNjcmlwdG9yKSkgewogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIEZvdW5kIGl0IC0gc28gYW1lbmQgdGhlIG1vZHVsZSBJRCAKICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgbW9kaWQgPSBtaXAtPm1vZGlkOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9CgoKICAgIGZvciAoaSA9IDAsIHRjcCA9IHRjbGlzdDsgaSA8IE1BWFRDOyBpKyssIHRjcCsrKSB7CiAgICAgICAgaWYgKHRjcC0+dHlwZSA9PSAwKQogICAgICAgICAgICBicmVhazsKICAgICAgICBpZiAoIWxhYmVsX2NvbXBhcmUoZGVzY3JpcHRvciwgdGNwLT5kZXNjcmlwdG9yKSAmJgogICAgICAgICAgICAoKG1vZGlkID09IHRjcC0+bW9kaWQpIHx8IChtb2RpZCA9PSAtMSkpKSB7CiAgICAgICAgICAgIHJldHVybiBpOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAtMTsKfQoKLyoKICogdHJhbnNsYXRlIGludGVnZXIgdGNfaW5kZXggdG8gc3RyaW5nIGlkZW50aWZpZXIgZnJvbSB0Y2xpc3QKICogKgogKiAqIFJldHVybnMgcG9pbnRlciB0byBzdHJpbmcgaW4gdGFibGUgKHNob3VsZCBub3QgYmUgbW9kaWZpZWQpIG9yIE5VTEwKICovCmNvbnN0IGNoYXIgICAgICoKZ2V0X3RjX2Rlc2NyaXB0b3IoaW50IHRjX2luZGV4KQp7CiAgICBpZiAodGNfaW5kZXggPCAwIHx8IHRjX2luZGV4ID49IE1BWFRDKQogICAgICAgIHJldHVybiBOVUxMOwogICAgcmV0dXJuICh0Y2xpc3RbdGNfaW5kZXhdLmRlc2NyaXB0b3IpOwp9CgojaWZuZGVmIE5FVFNOTVBfRkVBVFVSRV9SRU1PVkVfR0VUX1RDX0RFU0NSSVBUSU9OCi8qIHVzZWQgaW4gdGhlIHBlcmwgbW9kdWxlICovCmNvbnN0IGNoYXIgICAgICoKZ2V0X3RjX2Rlc2NyaXB0aW9uKGludCB0Y19pbmRleCkKewogICAgaWYgKHRjX2luZGV4IDwgMCB8fCB0Y19pbmRleCA+PSBNQVhUQykKICAgICAgICByZXR1cm4gTlVMTDsKICAgIHJldHVybiAodGNsaXN0W3RjX2luZGV4XS5kZXNjcmlwdGlvbik7Cn0KI2VuZGlmIC8qIE5FVFNOTVBfRkVBVFVSRV9SRU1PVkVfR0VUX1RDX0RFU0NSSVBUSU9OICovCgoKLyoKICogUGFyc2VzIGFuIGVudW1lcmF0aW9uIGxpc3Qgb2YgdGhlIGZvcm06CiAqICAgICAgICB7IGxhYmVsKHZhbHVlKSBsYWJlbCh2YWx1ZSkgLi4uIH0KICogVGhlIGluaXRpYWwgeyBoYXMgYWxyZWFkeSBiZWVuIHBhcnNlZC4KICogUmV0dXJucyBOVUxMIG9uIGVycm9yLgogKi8KCnN0YXRpYyBzdHJ1Y3QgZW51bV9saXN0ICoKcGFyc2VfZW51bWxpc3QoRklMRSAqIGZwLCBzdHJ1Y3QgZW51bV9saXN0ICoqcmV0cCkKewogICAgcmVnaXN0ZXIgaW50ICAgIHR5cGU7CiAgICBjaGFyICAgICAgICAgICAgdG9rZW5bTUFYVE9LRU5dOwogICAgc3RydWN0IGVudW1fbGlzdCAqZXAgPSBOVUxMLCAqKmVwcCA9ICZlcDsKCiAgICBmcmVlX2VudW1zKHJldHApOwoKICAgIHdoaWxlICgodHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKSkgIT0gRU5ET0ZGSUxFKSB7CiAgICAgICAgaWYgKHR5cGUgPT0gUklHSFRCUkFDS0VUKQogICAgICAgICAgICBicmVhazsKICAgICAgICAvKiBzb21lIGVudW1zIHVzZSAiZGVwcmVjYXRlZCIgdG8gaW5kaWNhdGUgYSBubyBsb25nZXIgdmFsdWUgbGFiZWwgKi8KICAgICAgICAvKiAoRUc6IElQLU1JQidzIElwQWRkcmVzc1N0YXR1c1RDKSAqLwogICAgICAgIGlmICh0eXBlID09IExBQkVMIHx8IHR5cGUgPT0gREVQUkVDQVRFRCkgewogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiB0aGlzIGlzIGFuIGVudW1lcmF0ZWQgbGFiZWwgCiAgICAgICAgICAgICAqLwogICAgICAgICAgICAqZXBwID0KICAgICAgICAgICAgICAgIChzdHJ1Y3QgZW51bV9saXN0ICopIGNhbGxvYygxLCBzaXplb2Yoc3RydWN0IGVudW1fbGlzdCkpOwogICAgICAgICAgICBpZiAoKmVwcCA9PSBOVUxMKQogICAgICAgICAgICAgICAgcmV0dXJuIChOVUxMKTsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogYSByZWFzb25hYmxlIGFwcHJveGltYXRpb24gZm9yIHRoZSBsZW5ndGggCiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKmVwcCktPmxhYmVsID0gc3RyZHVwKHRva2VuKTsKICAgICAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICAgICAgaWYgKHR5cGUgIT0gTEVGVFBBUkVOKSB7CiAgICAgICAgICAgICAgICBwcmludF9lcnJvcigiRXhwZWN0ZWQgXCIoXCIiLCB0b2tlbiwgdHlwZSk7CiAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgfQogICAgICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgICAgICBpZiAodHlwZSAhPSBOVU1CRVIpIHsKICAgICAgICAgICAgICAgIHByaW50X2Vycm9yKCJFeHBlY3RlZCBpbnRlZ2VyIiwgdG9rZW4sIHR5cGUpOwogICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgKCplcHApLT52YWx1ZSA9IHN0cnRvbCh0b2tlbiwgTlVMTCwgMTApOwogICAgICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgICAgICBpZiAodHlwZSAhPSBSSUdIVFBBUkVOKSB7CiAgICAgICAgICAgICAgICBwcmludF9lcnJvcigiRXhwZWN0ZWQgXCIpXCIiLCB0b2tlbiwgdHlwZSk7CiAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlcHAgPSAmKCplcHApLT5uZXh0OwogICAgICAgIH0KICAgIH0KICAgIGlmICh0eXBlID09IEVORE9GRklMRSkgewogICAgICAgIHByaW50X2Vycm9yKCJFeHBlY3RlZCBcIn1cIiIsIHRva2VuLCB0eXBlKTsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KICAgICpyZXRwID0gZXA7CiAgICByZXR1cm4gZXA7Cn0KCnN0YXRpYyBzdHJ1Y3QgcmFuZ2VfbGlzdCAqCnBhcnNlX3JhbmdlcyhGSUxFICogZnAsIHN0cnVjdCByYW5nZV9saXN0ICoqcmV0cCkKewogICAgaW50ICAgICAgICAgICAgIGxvdywgaGlnaDsKICAgIGNoYXIgICAgICAgICAgICBuZXh0dG9rZW5bTUFYVE9LRU5dOwogICAgaW50ICAgICAgICAgICAgIG5leHR0eXBlOwogICAgc3RydWN0IHJhbmdlX2xpc3QgKnJwID0gTlVMTCwgKipycHAgPSAmcnA7CiAgICBpbnQgICAgICAgICAgICAgc2l6ZSA9IDAsIHRha2VuID0gMTsKCiAgICBmcmVlX3JhbmdlcyhyZXRwKTsKCiAgICBuZXh0dHlwZSA9IGdldF90b2tlbihmcCwgbmV4dHRva2VuLCBNQVhUT0tFTik7CiAgICBpZiAobmV4dHR5cGUgPT0gU0laRSkgewogICAgICAgIHNpemUgPSAxOwogICAgICAgIHRha2VuID0gMDsKICAgICAgICBuZXh0dHlwZSA9IGdldF90b2tlbihmcCwgbmV4dHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgaWYgKG5leHR0eXBlICE9IExFRlRQQVJFTikKICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkV4cGVjdGVkIFwiKFwiIGFmdGVyIFNJWkUiLCBuZXh0dG9rZW4sIG5leHR0eXBlKTsKICAgIH0KCiAgICBkbyB7CiAgICAgICAgaWYgKCF0YWtlbikKICAgICAgICAgICAgbmV4dHR5cGUgPSBnZXRfdG9rZW4oZnAsIG5leHR0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgIGVsc2UKICAgICAgICAgICAgdGFrZW4gPSAwOwogICAgICAgIGhpZ2ggPSBsb3cgPSBzdHJ0b3VsKG5leHR0b2tlbiwgTlVMTCwgMTApOwogICAgICAgIG5leHR0eXBlID0gZ2V0X3Rva2VuKGZwLCBuZXh0dG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICBpZiAobmV4dHR5cGUgPT0gUkFOR0UpIHsKICAgICAgICAgICAgbmV4dHR5cGUgPSBnZXRfdG9rZW4oZnAsIG5leHR0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgICAgICBlcnJubyA9IDA7CiAgICAgICAgICAgIGhpZ2ggPSBzdHJ0b3VsKG5leHR0b2tlbiwgTlVMTCwgMTApOwogICAgICAgICAgICBpZiAoIGVycm5vID09IEVSQU5HRSApIHsKICAgICAgICAgICAgICAgIGlmIChuZXRzbm1wX2RzX2dldF9pbnQoTkVUU05NUF9EU19MSUJSQVJZX0lELCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJfTUlCX1dBUk5JTkdTKSkKICAgICAgICAgICAgICAgICAgICBzbm1wX2xvZyhMT0dfV0FSTklORywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiV2FybmluZzogVXBwZXIgYm91bmQgbm90IGhhbmRsZWQgY29ycmVjdGx5ICglcyAhPSAlZCk6IEF0IGxpbmUgJWQgaW4gJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHR0b2tlbiwgaGlnaCwgbWliTGluZSwgRmlsZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbmV4dHR5cGUgPSBnZXRfdG9rZW4oZnAsIG5leHR0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgIH0KICAgICAgICAqcnBwID0gKHN0cnVjdCByYW5nZV9saXN0ICopIGNhbGxvYygxLCBzaXplb2Yoc3RydWN0IHJhbmdlX2xpc3QpKTsKICAgICAgICBpZiAoKnJwcCA9PSBOVUxMKQogICAgICAgICAgICBicmVhazsKICAgICAgICAoKnJwcCktPmxvdyA9IGxvdzsKICAgICAgICAoKnJwcCktPmhpZ2ggPSBoaWdoOwogICAgICAgIHJwcCA9ICYoKnJwcCktPm5leHQ7CgogICAgfSB3aGlsZSAobmV4dHR5cGUgPT0gQkFSKTsKICAgIGlmIChzaXplKSB7CiAgICAgICAgaWYgKG5leHR0eXBlICE9IFJJR0hUUEFSRU4pCiAgICAgICAgICAgIHByaW50X2Vycm9yKCJFeHBlY3RlZCBcIilcIiBhZnRlciBTSVpFIiwgbmV4dHRva2VuLCBuZXh0dHlwZSk7CiAgICAgICAgbmV4dHR5cGUgPSBnZXRfdG9rZW4oZnAsIG5leHR0b2tlbiwgbmV4dHR5cGUpOwogICAgfQogICAgaWYgKG5leHR0eXBlICE9IFJJR0hUUEFSRU4pCiAgICAgICAgcHJpbnRfZXJyb3IoIkV4cGVjdGVkIFwiKVwiIiwgbmV4dHRva2VuLCBuZXh0dHlwZSk7CgogICAgKnJldHAgPSBycDsKICAgIHJldHVybiBycDsKfQoKLyoKICogUGFyc2VzIGFuIGFzbiB0eXBlLiAgU3RydWN0dXJlcyBhcmUgaWdub3JlZCBieSB0aGlzIHBhcnNlci4KICogUmV0dXJucyBOVUxMIG9uIGVycm9yLgogKi8Kc3RhdGljIHN0cnVjdCBub2RlICoKcGFyc2VfYXNudHlwZShGSUxFICogZnAsIGNoYXIgKm5hbWUsIGludCAqbnR5cGUsIGNoYXIgKm50b2tlbikKewogICAgaW50ICAgICAgICAgICAgIHR5cGUsIGk7CiAgICBjaGFyICAgICAgICAgICAgdG9rZW5bTUFYVE9LRU5dOwogICAgY2hhciAgICAgICAgICAgIHF1b3RlZF9zdHJpbmdfYnVmZmVyW01BWFFVT1RFU1RSXTsKICAgIGNoYXIgICAgICAgICAgICpoaW50ID0gTlVMTDsKICAgIGNoYXIgICAgICAgICAgICpkZXNjciA9IE5VTEw7CiAgICBzdHJ1Y3QgdGMgICAgICAqdGNwOwogICAgaW50ICAgICAgICAgICAgIGxldmVsOwoKICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICBpZiAodHlwZSA9PSBTRVFVRU5DRSB8fCB0eXBlID09IENIT0lDRSkgewogICAgICAgIGxldmVsID0gMDsKICAgICAgICB3aGlsZSAoKHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTikpICE9IEVORE9GRklMRSkgewogICAgICAgICAgICBpZiAodHlwZSA9PSBMRUZUQlJBQ0tFVCkgewogICAgICAgICAgICAgICAgbGV2ZWwrKzsKICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IFJJR0hUQlJBQ0tFVCAmJiAtLWxldmVsID09IDApIHsKICAgICAgICAgICAgICAgICpudHlwZSA9IGdldF90b2tlbihmcCwgbnRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBwcmludF9lcnJvcigiRXhwZWN0ZWQgXCJ9XCIiLCB0b2tlbiwgdHlwZSk7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9IGVsc2UgaWYgKHR5cGUgPT0gTEVGVEJSQUNLRVQpIHsKICAgICAgICBzdHJ1Y3Qgbm9kZSAgICAqbnA7CiAgICAgICAgaW50ICAgICAgICAgICAgIGNoX25leHQgPSAneyc7CiAgICAgICAgdW5nZXRjKGNoX25leHQsIGZwKTsKICAgICAgICBucCA9IHBhcnNlX29iamVjdGlkKGZwLCBuYW1lKTsKICAgICAgICBpZiAobnAgIT0gTlVMTCkgewogICAgICAgICAgICAqbnR5cGUgPSBnZXRfdG9rZW4oZnAsIG50b2tlbiwgTUFYVE9LRU4pOwogICAgICAgICAgICByZXR1cm4gbnA7CiAgICAgICAgfQogICAgICAgIHJldHVybiBOVUxMOwogICAgfSBlbHNlIGlmICh0eXBlID09IExFRlRTUUJSQUNLKSB7CiAgICAgICAgaW50ICAgICAgICAgICAgIHNpemUgPSAwOwogICAgICAgIGRvIHsKICAgICAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICB9IHdoaWxlICh0eXBlICE9IEVORE9GRklMRSAmJiB0eXBlICE9IFJJR0hUU1FCUkFDSyk7CiAgICAgICAgaWYgKHR5cGUgIT0gUklHSFRTUUJSQUNLKSB7CiAgICAgICAgICAgIHByaW50X2Vycm9yKCJFeHBlY3RlZCBcIl1cIiIsIHRva2VuLCB0eXBlKTsKICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgfQogICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgaWYgKHR5cGUgPT0gSU1QTElDSVQpCiAgICAgICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgKm50eXBlID0gZ2V0X3Rva2VuKGZwLCBudG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICBpZiAoKm50eXBlID09IExFRlRQQVJFTikgewogICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKICAgICAgICAgICAgY2FzZSBPQ1RFVFNUUjoKICAgICAgICAgICAgICAgICpudHlwZSA9IGdldF90b2tlbihmcCwgbnRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgICAgICAgICBpZiAoKm50eXBlICE9IFNJWkUpIHsKICAgICAgICAgICAgICAgICAgICBwcmludF9lcnJvcigiRXhwZWN0ZWQgU0laRSIsIG50b2tlbiwgKm50eXBlKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHNpemUgPSAxOwogICAgICAgICAgICAgICAgKm50eXBlID0gZ2V0X3Rva2VuKGZwLCBudG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICAgICAgICAgIGlmICgqbnR5cGUgIT0gTEVGVFBBUkVOKSB7CiAgICAgICAgICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkV4cGVjdGVkIFwiKFwiIGFmdGVyIFNJWkUiLCBudG9rZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm50eXBlKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiBmYWxsIHRocm91Z2ggCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgY2FzZSBJTlRFR0VSOgogICAgICAgICAgICAgICAgKm50eXBlID0gZ2V0X3Rva2VuKGZwLCBudG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgICAgICBpZiAoKm50eXBlICE9IE5VTUJFUikKICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkV4cGVjdGVkIE5VTUJFUiIsIG50b2tlbiwgKm50eXBlKTsKICAgICAgICAgICAgICAgICAgICAqbnR5cGUgPSBnZXRfdG9rZW4oZnAsIG50b2tlbiwgTUFYVE9LRU4pOwogICAgICAgICAgICAgICAgICAgIGlmICgqbnR5cGUgPT0gUkFOR0UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgKm50eXBlID0gZ2V0X3Rva2VuKGZwLCBudG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCpudHlwZSAhPSBOVU1CRVIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludF9lcnJvcigiRXhwZWN0ZWQgTlVNQkVSIiwgbnRva2VuLCAqbnR5cGUpOwogICAgICAgICAgICAgICAgICAgICAgICAqbnR5cGUgPSBnZXRfdG9rZW4oZnAsIG50b2tlbiwgTUFYVE9LRU4pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gd2hpbGUgKCpudHlwZSA9PSBCQVIpOwogICAgICAgICAgICAgICAgaWYgKCpudHlwZSAhPSBSSUdIVFBBUkVOKSB7CiAgICAgICAgICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkV4cGVjdGVkIFwiKVwiIiwgbnRva2VuLCAqbnR5cGUpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKm50eXBlID0gZ2V0X3Rva2VuKGZwLCBudG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICAgICAgICAgIGlmIChzaXplKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCpudHlwZSAhPSBSSUdIVFBBUkVOKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHByaW50X2Vycm9yKCJFeHBlY3RlZCBcIilcIiB0byB0ZXJtaW5hdGUgU0laRSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG50b2tlbiwgKm50eXBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICpudHlwZSA9IGdldF90b2tlbihmcCwgbnRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9IGVsc2UgewogICAgICAgIGlmICh0eXBlID09IENPTlZFTlRJT04pIHsKICAgICAgICAgICAgd2hpbGUgKHR5cGUgIT0gU1lOVEFYICYmIHR5cGUgIT0gRU5ET0ZGSUxFKSB7CiAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSBESVNQTEFZSElOVCkgewogICAgICAgICAgICAgICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgIT0gUVVPVEVTVFJJTkcpCiAgICAgICAgICAgICAgICAgICAgICAgIHByaW50X2Vycm9yKCJESVNQTEFZLUhJTlQgbXVzdCBiZSBzdHJpbmciLCB0b2tlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSk7CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICBoaW50ID0gc3RyZHVwKHRva2VuKTsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBERVNDUklQVElPTiAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJfU0FWRV9NSUJfREVTQ1JTKSkgewogICAgICAgICAgICAgICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHF1b3RlZF9zdHJpbmdfYnVmZmVyLCBNQVhRVU9URVNUUik7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgIT0gUVVPVEVTVFJJTkcpCiAgICAgICAgICAgICAgICAgICAgICAgIHByaW50X2Vycm9yKCJERVNDUklQVElPTiBtdXN0IGJlIHN0cmluZyIsIHRva2VuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlKTsKICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyID0gc3RyZHVwKHF1b3RlZF9zdHJpbmdfYnVmZmVyKTsKICAgICAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgICAgIHR5cGUgPQogICAgICAgICAgICAgICAgICAgICAgICBnZXRfdG9rZW4oZnAsIHF1b3RlZF9zdHJpbmdfYnVmZmVyLCBNQVhRVU9URVNUUik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICAgICAgaWYgKHR5cGUgPT0gT0JKRUNUKSB7CiAgICAgICAgICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgICAgICAgICAgaWYgKHR5cGUgIT0gSURFTlRJRklFUikgewogICAgICAgICAgICAgICAgICAgIHByaW50X2Vycm9yKCJFeHBlY3RlZCBJREVOVElGSUVSIiwgdG9rZW4sIHR5cGUpOwogICAgICAgICAgICAgICAgICAgIFNOTVBfRlJFRShoaW50KTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHR5cGUgPSBPQkpJRDsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBPQkpFQ1QpIHsKICAgICAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICAgICAgaWYgKHR5cGUgIT0gSURFTlRJRklFUikgewogICAgICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkV4cGVjdGVkIElERU5USUZJRVIiLCB0b2tlbiwgdHlwZSk7CiAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgfQogICAgICAgICAgICB0eXBlID0gT0JKSUQ7CiAgICAgICAgfQoKICAgICAgICBpZiAodHlwZSA9PSBMQUJFTCkgewogICAgICAgICAgICB0eXBlID0gZ2V0X3RjKHRva2VuLCBjdXJyZW50X21vZHVsZSwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7CiAgICAgICAgfQoKICAgICAgICAvKgogICAgICAgICAqIHRleHR1YWwgY29udmVudGlvbiAKICAgICAgICAgKi8KICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTUFYVEM7IGkrKykgewogICAgICAgICAgICBpZiAodGNsaXN0W2ldLnR5cGUgPT0gMCkKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCiAgICAgICAgaWYgKGkgPT0gTUFYVEMpIHsKICAgICAgICAgICAgcHJpbnRfZXJyb3IoIlRvbyBtYW55IHRleHR1YWwgY29udmVudGlvbnMiLCB0b2tlbiwgdHlwZSk7CiAgICAgICAgICAgIFNOTVBfRlJFRShoaW50KTsKICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgfQogICAgICAgIGlmICghKHR5cGUgJiBTWU5UQVhfTUFTSykpIHsKICAgICAgICAgICAgcHJpbnRfZXJyb3IoIlRleHR1YWwgY29udmVudGlvbiBkb2Vzbid0IG1hcCB0byByZWFsIHR5cGUiLAogICAgICAgICAgICAgICAgICAgICAgICB0b2tlbiwgdHlwZSk7CiAgICAgICAgICAgIFNOTVBfRlJFRShoaW50KTsKICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgfQogICAgICAgIHRjcCA9ICZ0Y2xpc3RbaV07CiAgICAgICAgdGNwLT5tb2RpZCA9IGN1cnJlbnRfbW9kdWxlOwogICAgICAgIHRjcC0+ZGVzY3JpcHRvciA9IHN0cmR1cChuYW1lKTsKICAgICAgICB0Y3AtPmhpbnQgPSBoaW50OwogICAgICAgIHRjcC0+ZGVzY3JpcHRpb24gPSBkZXNjcjsKICAgICAgICB0Y3AtPnR5cGUgPSB0eXBlOwogICAgICAgICpudHlwZSA9IGdldF90b2tlbihmcCwgbnRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgaWYgKCpudHlwZSA9PSBMRUZUUEFSRU4pIHsKICAgICAgICAgICAgdGNwLT5yYW5nZXMgPSBwYXJzZV9yYW5nZXMoZnAsICZ0Y3AtPnJhbmdlcyk7CiAgICAgICAgICAgICpudHlwZSA9IGdldF90b2tlbihmcCwgbnRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgfSBlbHNlIGlmICgqbnR5cGUgPT0gTEVGVEJSQUNLRVQpIHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogaWYgdGhlcmUgaXMgYW4gZW51bWVyYXRpb24gbGlzdCwgcGFyc2UgaXQgCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0Y3AtPmVudW1zID0gcGFyc2VfZW51bWxpc3QoZnAsICZ0Y3AtPmVudW1zKTsKICAgICAgICAgICAgKm50eXBlID0gZ2V0X3Rva2VuKGZwLCBudG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9Cn0KCgovKgogKiBQYXJzZXMgYW4gT0JKRUNUIFRZUEUgbWFjcm8uCiAqIFJldHVybnMgMCBvbiBlcnJvci4KICovCnN0YXRpYyBzdHJ1Y3Qgbm9kZSAqCnBhcnNlX29iamVjdHR5cGUoRklMRSAqIGZwLCBjaGFyICpuYW1lKQp7CiAgICByZWdpc3RlciBpbnQgICAgdHlwZTsKICAgIGNoYXIgICAgICAgICAgICB0b2tlbltNQVhUT0tFTl07CiAgICBjaGFyICAgICAgICAgICAgbmV4dHRva2VuW01BWFRPS0VOXTsKICAgIGNoYXIgICAgICAgICAgICBxdW90ZWRfc3RyaW5nX2J1ZmZlcltNQVhRVU9URVNUUl07CiAgICBpbnQgICAgICAgICAgICAgbmV4dHR5cGUsIHRjdHlwZTsKICAgIHJlZ2lzdGVyIHN0cnVjdCBub2RlICpucDsKCiAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgaWYgKHR5cGUgIT0gU1lOVEFYKSB7CiAgICAgICAgcHJpbnRfZXJyb3IoIkJhZCBmb3JtYXQgZm9yIE9CSkVDVC1UWVBFIiwgdG9rZW4sIHR5cGUpOwogICAgICAgIHJldHVybiBOVUxMOwogICAgfQogICAgbnAgPSBhbGxvY19ub2RlKGN1cnJlbnRfbW9kdWxlKTsKICAgIGlmIChucCA9PSBOVUxMKQogICAgICAgIHJldHVybiAoTlVMTCk7CiAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgaWYgKHR5cGUgPT0gT0JKRUNUKSB7CiAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICBpZiAodHlwZSAhPSBJREVOVElGSUVSKSB7CiAgICAgICAgICAgIHByaW50X2Vycm9yKCJFeHBlY3RlZCBJREVOVElGSUVSIiwgdG9rZW4sIHR5cGUpOwogICAgICAgICAgICBmcmVlX25vZGUobnApOwogICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICB9CiAgICAgICAgdHlwZSA9IE9CSklEOwogICAgfQogICAgaWYgKHR5cGUgPT0gTEFCRUwpIHsKICAgICAgICBpbnQgICAgICAgICAgICAgdG1wX2luZGV4OwogICAgICAgIHRjdHlwZSA9IGdldF90Yyh0b2tlbiwgY3VycmVudF9tb2R1bGUsICZ0bXBfaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICZucC0+ZW51bXMsICZucC0+cmFuZ2VzLCAmbnAtPmhpbnQpOwogICAgICAgIGlmICh0Y3R5cGUgPT0gTEFCRUwgJiYKICAgICAgICAgICAgbmV0c25tcF9kc19nZXRfaW50KE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgCgkJCSAgICAgICBORVRTTk1QX0RTX0xJQl9NSUJfV0FSTklOR1MpID4gMSkgewogICAgICAgICAgICBwcmludF9lcnJvcigiV2FybmluZzogTm8ga25vd24gdHJhbnNsYXRpb24gZm9yIHR5cGUiLCB0b2tlbiwKICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSk7CiAgICAgICAgfQogICAgICAgIHR5cGUgPSB0Y3R5cGU7CiAgICAgICAgbnAtPnRjX2luZGV4ID0gdG1wX2luZGV4OyAgICAgICAvKiBzdG9yZSBUQyBmb3IgbGF0ZXIgcmVmZXJlbmNlICovCiAgICB9CiAgICBucC0+dHlwZSA9IHR5cGU7CiAgICBuZXh0dHlwZSA9IGdldF90b2tlbihmcCwgbmV4dHRva2VuLCBNQVhUT0tFTik7CiAgICBzd2l0Y2ggKHR5cGUpIHsKICAgIGNhc2UgU0VRVUVOQ0U6CiAgICAgICAgaWYgKG5leHR0eXBlID09IE9GKSB7CiAgICAgICAgICAgIG5leHR0eXBlID0gZ2V0X3Rva2VuKGZwLCBuZXh0dG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICAgICAgbmV4dHR5cGUgPSBnZXRfdG9rZW4oZnAsIG5leHR0b2tlbiwgTUFYVE9LRU4pOwoKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIElOVEVHRVI6CiAgICBjYXNlIElOVEVHRVIzMjoKICAgIGNhc2UgVUlOVEVHRVIzMjoKICAgIGNhc2UgVU5TSUdORUQzMjoKICAgIGNhc2UgQ09VTlRFUjoKICAgIGNhc2UgR0FVR0U6CiAgICBjYXNlIEJJVFNUUklORzoKICAgIGNhc2UgTEFCRUw6CiAgICAgICAgaWYgKG5leHR0eXBlID09IExFRlRCUkFDS0VUKSB7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIGlmIHRoZXJlIGlzIGFuIGVudW1lcmF0aW9uIGxpc3QsIHBhcnNlIGl0IAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgbnAtPmVudW1zID0gcGFyc2VfZW51bWxpc3QoZnAsICZucC0+ZW51bXMpOwogICAgICAgICAgICBuZXh0dHlwZSA9IGdldF90b2tlbihmcCwgbmV4dHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgfSBlbHNlIGlmIChuZXh0dHlwZSA9PSBMRUZUUEFSRU4pIHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogaWYgdGhlcmUgaXMgYSByYW5nZSBsaXN0LCBwYXJzZSBpdCAKICAgICAgICAgICAgICovCiAgICAgICAgICAgIG5wLT5yYW5nZXMgPSBwYXJzZV9yYW5nZXMoZnAsICZucC0+cmFuZ2VzKTsKICAgICAgICAgICAgbmV4dHR5cGUgPSBnZXRfdG9rZW4oZnAsIG5leHR0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgIGNhc2UgT0NURVRTVFI6CiAgICBjYXNlIEtXX09QQVFVRToKICAgICAgICAvKgogICAgICAgICAqIHBhcnNlIGFueSBTSVpFIHNwZWNpZmljYXRpb24gCiAgICAgICAgICovCiAgICAgICAgaWYgKG5leHR0eXBlID09IExFRlRQQVJFTikgewogICAgICAgICAgICBuZXh0dHlwZSA9IGdldF90b2tlbihmcCwgbmV4dHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgICAgIGlmIChuZXh0dHlwZSA9PSBTSVpFKSB7CiAgICAgICAgICAgICAgICBuZXh0dHlwZSA9IGdldF90b2tlbihmcCwgbmV4dHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgICAgICAgICBpZiAobmV4dHR5cGUgPT0gTEVGVFBBUkVOKSB7CiAgICAgICAgICAgICAgICAgICAgbnAtPnJhbmdlcyA9IHBhcnNlX3JhbmdlcyhmcCwgJm5wLT5yYW5nZXMpOwogICAgICAgICAgICAgICAgICAgIG5leHR0eXBlID0gZ2V0X3Rva2VuKGZwLCBuZXh0dG9rZW4sIE1BWFRPS0VOKTsgICAgICAvKiApICovCiAgICAgICAgICAgICAgICAgICAgaWYgKG5leHR0eXBlID09IFJJR0hUUEFSRU4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dHR5cGUgPSBnZXRfdG9rZW4oZnAsIG5leHR0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkJhZCBTSVpFIHN5bnRheCIsIHRva2VuLCB0eXBlKTsKICAgICAgICAgICAgZnJlZV9ub2RlKG5wKTsKICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgY2FzZSBPQkpJRDoKICAgIGNhc2UgTkVUQUREUjoKICAgIGNhc2UgSVBBRERSOgogICAgY2FzZSBUSU1FVElDS1M6CiAgICBjYXNlIE5VTDoKICAgIGNhc2UgTlNBUEFERFJFU1M6CiAgICBjYXNlIENPVU5URVI2NDoKICAgICAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgICAgcHJpbnRfZXJyb3IoIkJhZCBzeW50YXgiLCB0b2tlbiwgdHlwZSk7CiAgICAgICAgZnJlZV9ub2RlKG5wKTsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KICAgIGlmIChuZXh0dHlwZSA9PSBVTklUUykgewogICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHF1b3RlZF9zdHJpbmdfYnVmZmVyLCBNQVhRVU9URVNUUik7CiAgICAgICAgaWYgKHR5cGUgIT0gUVVPVEVTVFJJTkcpIHsKICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkJhZCBVTklUUyIsIHF1b3RlZF9zdHJpbmdfYnVmZmVyLCB0eXBlKTsKICAgICAgICAgICAgZnJlZV9ub2RlKG5wKTsKICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgfQogICAgICAgIG5wLT51bml0cyA9IHN0cmR1cChxdW90ZWRfc3RyaW5nX2J1ZmZlcik7CiAgICAgICAgbmV4dHR5cGUgPSBnZXRfdG9rZW4oZnAsIG5leHR0b2tlbiwgTUFYVE9LRU4pOwogICAgfQogICAgaWYgKG5leHR0eXBlICE9IEFDQ0VTUykgewogICAgICAgIHByaW50X2Vycm9yKCJTaG91bGQgYmUgQUNDRVNTIiwgbmV4dHRva2VuLCBuZXh0dHlwZSk7CiAgICAgICAgZnJlZV9ub2RlKG5wKTsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICBpZiAodHlwZSAhPSBSRUFET05MWSAmJiB0eXBlICE9IFJFQURXUklURSAmJiB0eXBlICE9IFdSSVRFT05MWQogICAgICAgICYmIHR5cGUgIT0gTk9BQ0NFU1MgJiYgdHlwZSAhPSBSRUFEQ1JFQVRFICYmIHR5cGUgIT0gQUNDTk9USUZZKSB7CiAgICAgICAgcHJpbnRfZXJyb3IoIkJhZCBBQ0NFU1MgdHlwZSIsIHRva2VuLCB0eXBlKTsKICAgICAgICBmcmVlX25vZGUobnApOwogICAgICAgIHJldHVybiBOVUxMOwogICAgfQogICAgbnAtPmFjY2VzcyA9IHR5cGU7CiAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgaWYgKHR5cGUgIT0gU1RBVFVTKSB7CiAgICAgICAgcHJpbnRfZXJyb3IoIlNob3VsZCBiZSBTVEFUVVMiLCB0b2tlbiwgdHlwZSk7CiAgICAgICAgZnJlZV9ub2RlKG5wKTsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICBpZiAodHlwZSAhPSBNQU5EQVRPUlkgJiYgdHlwZSAhPSBDVVJSRU5UICYmIHR5cGUgIT0gS1dfT1BUSU9OQUwgJiYKICAgICAgICB0eXBlICE9IE9CU09MRVRFICYmIHR5cGUgIT0gREVQUkVDQVRFRCkgewogICAgICAgIHByaW50X2Vycm9yKCJCYWQgU1RBVFVTIiwgdG9rZW4sIHR5cGUpOwogICAgICAgIGZyZWVfbm9kZShucCk7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CiAgICBucC0+c3RhdHVzID0gdHlwZTsKICAgIC8qCiAgICAgKiBPcHRpb25hbCBwYXJ0cyBvZiB0aGUgT0JKRUNULVRZUEUgbWFjcm8KICAgICAqLwogICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgIHdoaWxlICh0eXBlICE9IEVRVUFMUyAmJiB0eXBlICE9IEVORE9GRklMRSkgewogICAgICAgIHN3aXRjaCAodHlwZSkgewogICAgICAgIGNhc2UgREVTQ1JJUFRJT046CiAgICAgICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHF1b3RlZF9zdHJpbmdfYnVmZmVyLCBNQVhRVU9URVNUUik7CgogICAgICAgICAgICBpZiAodHlwZSAhPSBRVU9URVNUUklORykgewogICAgICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkJhZCBERVNDUklQVElPTiIsIHF1b3RlZF9zdHJpbmdfYnVmZmVyLCB0eXBlKTsKICAgICAgICAgICAgICAgIGZyZWVfbm9kZShucCk7CiAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAobmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIAoJCQkJICAgICAgIE5FVFNOTVBfRFNfTElCX1NBVkVfTUlCX0RFU0NSUykpIHsKICAgICAgICAgICAgICAgIG5wLT5kZXNjcmlwdGlvbiA9IHN0cmR1cChxdW90ZWRfc3RyaW5nX2J1ZmZlcik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgUkVGRVJFTkNFOgogICAgICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCBxdW90ZWRfc3RyaW5nX2J1ZmZlciwgTUFYUVVPVEVTVFIpOwogICAgICAgICAgICBpZiAodHlwZSAhPSBRVU9URVNUUklORykgewogICAgICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkJhZCBSRUZFUkVOQ0UiLCBxdW90ZWRfc3RyaW5nX2J1ZmZlciwgdHlwZSk7CiAgICAgICAgICAgICAgICBmcmVlX25vZGUobnApOwogICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbnAtPnJlZmVyZW5jZSA9IHN0cmR1cChxdW90ZWRfc3RyaW5nX2J1ZmZlcik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgSU5ERVg6CiAgICAgICAgICAgIGlmIChucC0+YXVnbWVudHMpIHsKICAgICAgICAgICAgICAgIHByaW50X2Vycm9yKCJDYW5ub3QgaGF2ZSBib3RoIElOREVYIGFuZCBBVUdNRU5UUyIsIHRva2VuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSk7CiAgICAgICAgICAgICAgICBmcmVlX25vZGUobnApOwogICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbnAtPmluZGV4ZXMgPSBnZXRJbmRleGVzKGZwLCAmbnAtPmluZGV4ZXMpOwogICAgICAgICAgICBpZiAobnAtPmluZGV4ZXMgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkJhZCBJTkRFWCBsaXN0IiwgdG9rZW4sIHR5cGUpOwogICAgICAgICAgICAgICAgZnJlZV9ub2RlKG5wKTsKICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgQVVHTUVOVFM6CiAgICAgICAgICAgIGlmIChucC0+aW5kZXhlcykgewogICAgICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkNhbm5vdCBoYXZlIGJvdGggSU5ERVggYW5kIEFVR01FTlRTIiwgdG9rZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlKTsKICAgICAgICAgICAgICAgIGZyZWVfbm9kZShucCk7CiAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgfQogICAgICAgICAgICBucC0+aW5kZXhlcyA9IGdldEluZGV4ZXMoZnAsICZucC0+aW5kZXhlcyk7CiAgICAgICAgICAgIGlmIChucC0+aW5kZXhlcyA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICBwcmludF9lcnJvcigiQmFkIEFVR01FTlRTIGxpc3QiLCB0b2tlbiwgdHlwZSk7CiAgICAgICAgICAgICAgICBmcmVlX25vZGUobnApOwogICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbnAtPmF1Z21lbnRzID0gc3RyZHVwKG5wLT5pbmRleGVzLT5pbGFiZWwpOwogICAgICAgICAgICBmcmVlX2luZGV4ZXMoJm5wLT5pbmRleGVzKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBERUZWQUw6CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIE1hcmsncyBkZWZWYWwgc2VjdGlvbiAKICAgICAgICAgICAgICovCiAgICAgICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHF1b3RlZF9zdHJpbmdfYnVmZmVyLCBNQVhUT0tFTik7CiAgICAgICAgICAgIGlmICh0eXBlICE9IExFRlRCUkFDS0VUKSB7CiAgICAgICAgICAgICAgICBwcmludF9lcnJvcigiQmFkIERFRkFVTFRWQUxVRSIsIHF1b3RlZF9zdHJpbmdfYnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSk7CiAgICAgICAgICAgICAgICBmcmVlX25vZGUobnApOwogICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBsZXZlbCA9IDE7CiAgICAgICAgICAgICAgICBjaGFyICAgICAgICAgICAgZGVmYnVmWzUxMl07CgogICAgICAgICAgICAgICAgZGVmYnVmWzBdID0gMDsKICAgICAgICAgICAgICAgIHdoaWxlICgxKSB7CiAgICAgICAgICAgICAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgcXVvdGVkX3N0cmluZ19idWZmZXIsIE1BWFRPS0VOKTsKICAgICAgICAgICAgICAgICAgICBpZiAoKHR5cGUgPT0gUklHSFRCUkFDS0VUICYmIC0tbGV2ZWwgPT0gMCkKICAgICAgICAgICAgICAgICAgICAgICAgfHwgdHlwZSA9PSBFTkRPRkZJTEUpCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gTEVGVEJSQUNLRVQpCiAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsKys7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT0gUVVPVEVTVFJJTkcpCiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmxjYXQoZGVmYnVmLCAiXFxcIiIsIHNpemVvZihkZWZidWYpKTsKICAgICAgICAgICAgICAgICAgICBzdHJsY2F0KGRlZmJ1ZiwgcXVvdGVkX3N0cmluZ19idWZmZXIsIHNpemVvZihkZWZidWYpKTsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSBRVU9URVNUUklORykKICAgICAgICAgICAgICAgICAgICAgICAgc3RybGNhdChkZWZidWYsICJcXFwiIiwgc2l6ZW9mKGRlZmJ1ZikpOwogICAgICAgICAgICAgICAgICAgIHN0cmxjYXQoZGVmYnVmLCAiICIsIHNpemVvZihkZWZidWYpKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAodHlwZSAhPSBSSUdIVEJSQUNLRVQpIHsKICAgICAgICAgICAgICAgICAgICBwcmludF9lcnJvcigiQmFkIERFRkFVTFRWQUxVRSIsIHF1b3RlZF9zdHJpbmdfYnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUpOwogICAgICAgICAgICAgICAgICAgIGZyZWVfbm9kZShucCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgZGVmYnVmW3N0cmxlbihkZWZidWYpIC0gMV0gPSAwOwogICAgICAgICAgICAgICAgbnAtPmRlZmF1bHRWYWx1ZSA9IHN0cmR1cChkZWZidWYpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSBOVU1fRU5UUklFUzoKICAgICAgICAgICAgaWYgKHRvc3NPYmplY3RJZGVudGlmaWVyKGZwKSAhPSBPQkpJRCkgewogICAgICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkJhZCBPYmplY3QgSWRlbnRpZmllciIsIHRva2VuLCB0eXBlKTsKICAgICAgICAgICAgICAgIGZyZWVfbm9kZShucCk7CiAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKCiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkJhZCBmb3JtYXQgb2Ygb3B0aW9uYWwgY2xhdXNlcyIsIHRva2VuLCB0eXBlKTsKICAgICAgICAgICAgZnJlZV9ub2RlKG5wKTsKICAgICAgICAgICAgcmV0dXJuIE5VTEw7CgogICAgICAgIH0KICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgfQogICAgaWYgKHR5cGUgIT0gRVFVQUxTKSB7CiAgICAgICAgcHJpbnRfZXJyb3IoIkJhZCBmb3JtYXQiLCB0b2tlbiwgdHlwZSk7CiAgICAgICAgZnJlZV9ub2RlKG5wKTsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KICAgIHJldHVybiBtZXJnZV9wYXJzZV9vYmplY3RpZChucCwgZnAsIG5hbWUpOwp9CgovKgogKiBQYXJzZXMgYW4gT0JKRUNUIEdST1VQIG1hY3JvLgogKiBSZXR1cm5zIDAgb24gZXJyb3IuCiAqCiAqIEFsc28gcGFyc2VzIG9iamVjdC1pZGVudGl0eSwgc2luY2UgdGhleSBhcmUgc2ltaWxhciAoaWdub3JlIFNUQVRVUykuCiAqICAgLSBXSkggMTAvOTYKICovCnN0YXRpYyBzdHJ1Y3Qgbm9kZSAqCnBhcnNlX29iamVjdGdyb3VwKEZJTEUgKiBmcCwgY2hhciAqbmFtZSwgaW50IHdoYXQsIHN0cnVjdCBvYmpncm91cCAqKm9sKQp7CiAgICBpbnQgICAgICAgICAgICAgdHlwZTsKICAgIGNoYXIgICAgICAgICAgICB0b2tlbltNQVhUT0tFTl07CiAgICBjaGFyICAgICAgICAgICAgcXVvdGVkX3N0cmluZ19idWZmZXJbTUFYUVVPVEVTVFJdOwogICAgc3RydWN0IG5vZGUgICAgKm5wOwoKICAgIG5wID0gYWxsb2Nfbm9kZShjdXJyZW50X21vZHVsZSk7CiAgICBpZiAobnAgPT0gTlVMTCkKICAgICAgICByZXR1cm4gKE5VTEwpOwogICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgIGlmICh0eXBlID09IHdoYXQpIHsKICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgIGlmICh0eXBlICE9IExFRlRCUkFDS0VUKSB7CiAgICAgICAgICAgIHByaW50X2Vycm9yKCJFeHBlY3RlZCBcIntcIiIsIHRva2VuLCB0eXBlKTsKICAgICAgICAgICAgZ290byBza2lwOwogICAgICAgIH0KICAgICAgICBkbyB7CiAgICAgICAgICAgIHN0cnVjdCBvYmpncm91cCAqbzsKICAgICAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICAgICAgaWYgKHR5cGUgIT0gTEFCRUwpIHsKICAgICAgICAgICAgICAgIHByaW50X2Vycm9yKCJCYWQgaWRlbnRpZmllciIsIHRva2VuLCB0eXBlKTsKICAgICAgICAgICAgICAgIGdvdG8gc2tpcDsKICAgICAgICAgICAgfQogICAgICAgICAgICBvID0gKHN0cnVjdCBvYmpncm91cCAqKSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBvYmpncm91cCkpOwogICAgICAgICAgICBpZiAoIW8pIHsKICAgICAgICAgICAgICAgIHByaW50X2Vycm9yKCJSZXNvdXJjZSBmYWlsdXJlIiwgdG9rZW4sIHR5cGUpOwogICAgICAgICAgICAgICAgZ290byBza2lwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG8tPmxpbmUgPSBtaWJMaW5lOwogICAgICAgICAgICBvLT5uYW1lID0gc3RyZHVwKHRva2VuKTsKICAgICAgICAgICAgby0+bmV4dCA9ICpvbDsKICAgICAgICAgICAgKm9sID0gbzsKICAgICAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICB9IHdoaWxlICh0eXBlID09IENPTU1BKTsKICAgICAgICBpZiAodHlwZSAhPSBSSUdIVEJSQUNLRVQpIHsKICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkV4cGVjdGVkIFwifVwiIGFmdGVyIGxpc3QiLCB0b2tlbiwgdHlwZSk7CiAgICAgICAgICAgIGdvdG8gc2tpcDsKICAgICAgICB9CiAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIHR5cGUpOwogICAgfQogICAgaWYgKHR5cGUgIT0gU1RBVFVTKSB7CiAgICAgICAgcHJpbnRfZXJyb3IoIkV4cGVjdGVkIFNUQVRVUyIsIHRva2VuLCB0eXBlKTsKICAgICAgICBnb3RvIHNraXA7CiAgICB9CiAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgaWYgKHR5cGUgIT0gQ1VSUkVOVCAmJiB0eXBlICE9IERFUFJFQ0FURUQgJiYgdHlwZSAhPSBPQlNPTEVURSkgewogICAgICAgIHByaW50X2Vycm9yKCJCYWQgU1RBVFVTIHZhbHVlIiwgdG9rZW4sIHR5cGUpOwogICAgICAgIGdvdG8gc2tpcDsKICAgIH0KICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICBpZiAodHlwZSAhPSBERVNDUklQVElPTikgewogICAgICAgIHByaW50X2Vycm9yKCJFeHBlY3RlZCBERVNDUklQVElPTiIsIHRva2VuLCB0eXBlKTsKICAgICAgICBnb3RvIHNraXA7CiAgICB9CiAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCBxdW90ZWRfc3RyaW5nX2J1ZmZlciwgTUFYUVVPVEVTVFIpOwogICAgaWYgKHR5cGUgIT0gUVVPVEVTVFJJTkcpIHsKICAgICAgICBwcmludF9lcnJvcigiQmFkIERFU0NSSVBUSU9OIiwgcXVvdGVkX3N0cmluZ19idWZmZXIsIHR5cGUpOwogICAgICAgIGZyZWVfbm9kZShucCk7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CiAgICBpZiAobmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIAoJCQkgICAgICAgTkVUU05NUF9EU19MSUJfU0FWRV9NSUJfREVTQ1JTKSkgewogICAgICAgIG5wLT5kZXNjcmlwdGlvbiA9IHN0cmR1cChxdW90ZWRfc3RyaW5nX2J1ZmZlcik7CiAgICB9CiAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgaWYgKHR5cGUgPT0gUkVGRVJFTkNFKSB7CiAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgcXVvdGVkX3N0cmluZ19idWZmZXIsIE1BWFFVT1RFU1RSKTsKICAgICAgICBpZiAodHlwZSAhPSBRVU9URVNUUklORykgewogICAgICAgICAgICBwcmludF9lcnJvcigiQmFkIFJFRkVSRU5DRSIsIHF1b3RlZF9zdHJpbmdfYnVmZmVyLCB0eXBlKTsKICAgICAgICAgICAgZnJlZV9ub2RlKG5wKTsKICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgfQogICAgICAgIG5wLT5yZWZlcmVuY2UgPSBzdHJkdXAocXVvdGVkX3N0cmluZ19idWZmZXIpOwogICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICB9CiAgICBpZiAodHlwZSAhPSBFUVVBTFMpCiAgICAgICAgcHJpbnRfZXJyb3IoIkV4cGVjdGVkIFwiOjo9XCIiLCB0b2tlbiwgdHlwZSk7CiAgc2tpcDoKICAgIHdoaWxlICh0eXBlICE9IEVRVUFMUyAmJiB0eXBlICE9IEVORE9GRklMRSkKICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwoKICAgIHJldHVybiBtZXJnZV9wYXJzZV9vYmplY3RpZChucCwgZnAsIG5hbWUpOwp9CgovKgogKiBQYXJzZXMgYSBOT1RJRklDQVRJT04tVFlQRSBtYWNyby4KICogUmV0dXJucyAwIG9uIGVycm9yLgogKi8Kc3RhdGljIHN0cnVjdCBub2RlICoKcGFyc2Vfbm90aWZpY2F0aW9uRGVmaW5pdGlvbihGSUxFICogZnAsIGNoYXIgKm5hbWUpCnsKICAgIHJlZ2lzdGVyIGludCAgICB0eXBlOwogICAgY2hhciAgICAgICAgICAgIHRva2VuW01BWFRPS0VOXTsKICAgIGNoYXIgICAgICAgICAgICBxdW90ZWRfc3RyaW5nX2J1ZmZlcltNQVhRVU9URVNUUl07CiAgICByZWdpc3RlciBzdHJ1Y3Qgbm9kZSAqbnA7CgogICAgbnAgPSBhbGxvY19ub2RlKGN1cnJlbnRfbW9kdWxlKTsKICAgIGlmIChucCA9PSBOVUxMKQogICAgICAgIHJldHVybiAoTlVMTCk7CiAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgd2hpbGUgKHR5cGUgIT0gRVFVQUxTICYmIHR5cGUgIT0gRU5ET0ZGSUxFKSB7CiAgICAgICAgc3dpdGNoICh0eXBlKSB7CiAgICAgICAgY2FzZSBERVNDUklQVElPTjoKICAgICAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgcXVvdGVkX3N0cmluZ19idWZmZXIsIE1BWFFVT1RFU1RSKTsKICAgICAgICAgICAgaWYgKHR5cGUgIT0gUVVPVEVTVFJJTkcpIHsKICAgICAgICAgICAgICAgIHByaW50X2Vycm9yKCJCYWQgREVTQ1JJUFRJT04iLCBxdW90ZWRfc3RyaW5nX2J1ZmZlciwgdHlwZSk7CiAgICAgICAgICAgICAgICBmcmVlX25vZGUobnApOwogICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKG5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCAKCQkJCSAgICAgICBORVRTTk1QX0RTX0xJQl9TQVZFX01JQl9ERVNDUlMpKSB7CiAgICAgICAgICAgICAgICBucC0+ZGVzY3JpcHRpb24gPSBzdHJkdXAocXVvdGVkX3N0cmluZ19idWZmZXIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgUkVGRVJFTkNFOgogICAgICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCBxdW90ZWRfc3RyaW5nX2J1ZmZlciwgTUFYUVVPVEVTVFIpOwogICAgICAgICAgICBpZiAodHlwZSAhPSBRVU9URVNUUklORykgewogICAgICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkJhZCBSRUZFUkVOQ0UiLCBxdW90ZWRfc3RyaW5nX2J1ZmZlciwgdHlwZSk7CiAgICAgICAgICAgICAgICBmcmVlX25vZGUobnApOwogICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbnAtPnJlZmVyZW5jZSA9IHN0cmR1cChxdW90ZWRfc3RyaW5nX2J1ZmZlcik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgT0JKRUNUUzoKICAgICAgICAgICAgbnAtPnZhcmJpbmRzID0gZ2V0VmFyYmluZHMoZnAsICZucC0+dmFyYmluZHMpOwogICAgICAgICAgICBpZiAoIW5wLT52YXJiaW5kcykgewogICAgICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkJhZCBPQkpFQ1RTIGxpc3QiLCB0b2tlbiwgdHlwZSk7CiAgICAgICAgICAgICAgICBmcmVlX25vZGUobnApOwogICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogTk9USElORyAKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgfQogICAgcmV0dXJuIG1lcmdlX3BhcnNlX29iamVjdGlkKG5wLCBmcCwgbmFtZSk7Cn0KCi8qCiAqIFBhcnNlcyBhIFRSQVAtVFlQRSBtYWNyby4KICogUmV0dXJucyAwIG9uIGVycm9yLgogKi8Kc3RhdGljIHN0cnVjdCBub2RlICoKcGFyc2VfdHJhcERlZmluaXRpb24oRklMRSAqIGZwLCBjaGFyICpuYW1lKQp7CiAgICByZWdpc3RlciBpbnQgICAgdHlwZTsKICAgIGNoYXIgICAgICAgICAgICB0b2tlbltNQVhUT0tFTl07CiAgICBjaGFyICAgICAgICAgICAgcXVvdGVkX3N0cmluZ19idWZmZXJbTUFYUVVPVEVTVFJdOwogICAgcmVnaXN0ZXIgc3RydWN0IG5vZGUgKm5wOwoKICAgIG5wID0gYWxsb2Nfbm9kZShjdXJyZW50X21vZHVsZSk7CiAgICBpZiAobnAgPT0gTlVMTCkKICAgICAgICByZXR1cm4gKE5VTEwpOwogICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgIHdoaWxlICh0eXBlICE9IEVRVUFMUyAmJiB0eXBlICE9IEVORE9GRklMRSkgewogICAgICAgIHN3aXRjaCAodHlwZSkgewogICAgICAgIGNhc2UgREVTQ1JJUFRJT046CiAgICAgICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHF1b3RlZF9zdHJpbmdfYnVmZmVyLCBNQVhRVU9URVNUUik7CiAgICAgICAgICAgIGlmICh0eXBlICE9IFFVT1RFU1RSSU5HKSB7CiAgICAgICAgICAgICAgICBwcmludF9lcnJvcigiQmFkIERFU0NSSVBUSU9OIiwgcXVvdGVkX3N0cmluZ19idWZmZXIsIHR5cGUpOwogICAgICAgICAgICAgICAgZnJlZV9ub2RlKG5wKTsKICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgCgkJCQkgICAgICAgTkVUU05NUF9EU19MSUJfU0FWRV9NSUJfREVTQ1JTKSkgewogICAgICAgICAgICAgICAgbnAtPmRlc2NyaXB0aW9uID0gc3RyZHVwKHF1b3RlZF9zdHJpbmdfYnVmZmVyKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFJFRkVSRU5DRToKICAgICAgICAgICAgLyogSSdtIG5vdCBzdXJlIFJFRkVSRU5DRXMgYXJlIGxlZ2FsIGluIHNtaXYxIHRyYXBzPz8/ICovCiAgICAgICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHF1b3RlZF9zdHJpbmdfYnVmZmVyLCBNQVhRVU9URVNUUik7CiAgICAgICAgICAgIGlmICh0eXBlICE9IFFVT1RFU1RSSU5HKSB7CiAgICAgICAgICAgICAgICBwcmludF9lcnJvcigiQmFkIFJFRkVSRU5DRSIsIHF1b3RlZF9zdHJpbmdfYnVmZmVyLCB0eXBlKTsKICAgICAgICAgICAgICAgIGZyZWVfbm9kZShucCk7CiAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgfQogICAgICAgICAgICBucC0+cmVmZXJlbmNlID0gc3RyZHVwKHF1b3RlZF9zdHJpbmdfYnVmZmVyKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBFTlRFUlBSSVNFOgogICAgICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgICAgICBpZiAodHlwZSA9PSBMRUZUQlJBQ0tFVCkgewogICAgICAgICAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICAgICAgICAgIGlmICh0eXBlICE9IExBQkVMKSB7CiAgICAgICAgICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkJhZCBUcmFwIEZvcm1hdCIsIHRva2VuLCB0eXBlKTsKICAgICAgICAgICAgICAgICAgICBmcmVlX25vZGUobnApOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbnAtPnBhcmVudCA9IHN0cmR1cCh0b2tlbik7CiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogR2V0IHJpZ2h0IGJyYWNrZXQgCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBMQUJFTCkgewogICAgICAgICAgICAgICAgbnAtPnBhcmVudCA9IHN0cmR1cCh0b2tlbik7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBmcmVlX25vZGUobnApOwogICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBWQVJJQUJMRVM6CiAgICAgICAgICAgIG5wLT52YXJiaW5kcyA9IGdldFZhcmJpbmRzKGZwLCAmbnAtPnZhcmJpbmRzKTsKICAgICAgICAgICAgaWYgKCFucC0+dmFyYmluZHMpIHsKICAgICAgICAgICAgICAgIHByaW50X2Vycm9yKCJCYWQgVkFSSUFCTEVTIGxpc3QiLCB0b2tlbiwgdHlwZSk7CiAgICAgICAgICAgICAgICBmcmVlX25vZGUobnApOwogICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogTk9USElORyAKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgfQogICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKCiAgICBucC0+bGFiZWwgPSBzdHJkdXAobmFtZSk7CgogICAgaWYgKHR5cGUgIT0gTlVNQkVSKSB7CiAgICAgICAgcHJpbnRfZXJyb3IoIkV4cGVjdGVkIGEgTnVtYmVyIiwgdG9rZW4sIHR5cGUpOwogICAgICAgIGZyZWVfbm9kZShucCk7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CiAgICBucC0+c3ViaWQgPSBzdHJ0b3VsKHRva2VuLCBOVUxMLCAxMCk7CiAgICBucC0+bmV4dCA9IGFsbG9jX25vZGUoY3VycmVudF9tb2R1bGUpOwogICAgaWYgKG5wLT5uZXh0ID09IE5VTEwpIHsKICAgICAgICBmcmVlX25vZGUobnApOwogICAgICAgIHJldHVybiAoTlVMTCk7CiAgICB9CgogICAgLyogQ2F0Y2ggdGhlIHN5bnRheCBlcnJvciAqLwogICAgaWYgKG5wLT5wYXJlbnQgPT0gTlVMTCkgewogICAgICAgIGZyZWVfbm9kZShucC0+bmV4dCk7CiAgICAgICAgZnJlZV9ub2RlKG5wKTsKICAgICAgICBnTWliRXJyb3IgPSBNT0RVTEVfU1lOVEFYX0VSUk9SOwogICAgICAgIHJldHVybiAoTlVMTCk7CiAgICB9CgogICAgbnAtPm5leHQtPnBhcmVudCA9IG5wLT5wYXJlbnQ7CiAgICBucC0+cGFyZW50ID0gKGNoYXIgKikgbWFsbG9jKHN0cmxlbihucC0+cGFyZW50KSArIDIpOwogICAgaWYgKG5wLT5wYXJlbnQgPT0gTlVMTCkgewogICAgICAgIGZyZWVfbm9kZShucC0+bmV4dCk7CiAgICAgICAgZnJlZV9ub2RlKG5wKTsKICAgICAgICByZXR1cm4gKE5VTEwpOwogICAgfQogICAgc3RyY3B5KG5wLT5wYXJlbnQsIG5wLT5uZXh0LT5wYXJlbnQpOwogICAgc3RyY2F0KG5wLT5wYXJlbnQsICIjIik7CiAgICBucC0+bmV4dC0+bGFiZWwgPSBzdHJkdXAobnAtPnBhcmVudCk7CiAgICByZXR1cm4gbnA7Cn0KCgovKgogKiBQYXJzZXMgYSBjb21wbGlhbmNlIG1hY3JvCiAqIFJldHVybnMgMCBvbiBlcnJvci4KICovCnN0YXRpYyBpbnQKZWF0X3N5bnRheChGSUxFICogZnAsIGNoYXIgKnRva2VuLCBpbnQgbWF4dG9rZW4pCnsKICAgIGludCAgICAgICAgICAgICB0eXBlLCBuZXh0dHlwZTsKICAgIHN0cnVjdCBub2RlICAgICpucCA9IGFsbG9jX25vZGUoY3VycmVudF9tb2R1bGUpOwogICAgY2hhciAgICAgICAgICAgIG5leHR0b2tlbltNQVhUT0tFTl07CgogICAgaWYgKCFucCkKCXJldHVybiAwOwoKICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBtYXh0b2tlbik7CiAgICBuZXh0dHlwZSA9IGdldF90b2tlbihmcCwgbmV4dHRva2VuLCBNQVhUT0tFTik7CiAgICBzd2l0Y2ggKHR5cGUpIHsKICAgIGNhc2UgSU5URUdFUjoKICAgIGNhc2UgSU5URUdFUjMyOgogICAgY2FzZSBVSU5URUdFUjMyOgogICAgY2FzZSBVTlNJR05FRDMyOgogICAgY2FzZSBDT1VOVEVSOgogICAgY2FzZSBHQVVHRToKICAgIGNhc2UgQklUU1RSSU5HOgogICAgY2FzZSBMQUJFTDoKICAgICAgICBpZiAobmV4dHR5cGUgPT0gTEVGVEJSQUNLRVQpIHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogaWYgdGhlcmUgaXMgYW4gZW51bWVyYXRpb24gbGlzdCwgcGFyc2UgaXQgCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBucC0+ZW51bXMgPSBwYXJzZV9lbnVtbGlzdChmcCwgJm5wLT5lbnVtcyk7CiAgICAgICAgICAgIG5leHR0eXBlID0gZ2V0X3Rva2VuKGZwLCBuZXh0dG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICB9IGVsc2UgaWYgKG5leHR0eXBlID09IExFRlRQQVJFTikgewogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBpZiB0aGVyZSBpcyBhIHJhbmdlIGxpc3QsIHBhcnNlIGl0IAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgbnAtPnJhbmdlcyA9IHBhcnNlX3JhbmdlcyhmcCwgJm5wLT5yYW5nZXMpOwogICAgICAgICAgICBuZXh0dHlwZSA9IGdldF90b2tlbihmcCwgbmV4dHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgY2FzZSBPQ1RFVFNUUjoKICAgIGNhc2UgS1dfT1BBUVVFOgogICAgICAgIC8qCiAgICAgICAgICogcGFyc2UgYW55IFNJWkUgc3BlY2lmaWNhdGlvbiAKICAgICAgICAgKi8KICAgICAgICBpZiAobmV4dHR5cGUgPT0gTEVGVFBBUkVOKSB7CiAgICAgICAgICAgIG5leHR0eXBlID0gZ2V0X3Rva2VuKGZwLCBuZXh0dG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICAgICAgaWYgKG5leHR0eXBlID09IFNJWkUpIHsKICAgICAgICAgICAgICAgIG5leHR0eXBlID0gZ2V0X3Rva2VuKGZwLCBuZXh0dG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICAgICAgICAgIGlmIChuZXh0dHlwZSA9PSBMRUZUUEFSRU4pIHsKICAgICAgICAgICAgICAgICAgICBucC0+cmFuZ2VzID0gcGFyc2VfcmFuZ2VzKGZwLCAmbnAtPnJhbmdlcyk7CiAgICAgICAgICAgICAgICAgICAgbmV4dHR5cGUgPSBnZXRfdG9rZW4oZnAsIG5leHR0b2tlbiwgTUFYVE9LRU4pOyAgICAgIC8qICkgKi8KICAgICAgICAgICAgICAgICAgICBpZiAobmV4dHR5cGUgPT0gUklHSFRQQVJFTikgewogICAgICAgICAgICAgICAgICAgICAgICBuZXh0dHlwZSA9IGdldF90b2tlbihmcCwgbmV4dHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBwcmludF9lcnJvcigiQmFkIFNJWkUgc3ludGF4IiwgdG9rZW4sIHR5cGUpOwogICAgICAgICAgICBmcmVlX25vZGUobnApOwogICAgICAgICAgICByZXR1cm4gbmV4dHR5cGU7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgY2FzZSBPQkpJRDoKICAgIGNhc2UgTkVUQUREUjoKICAgIGNhc2UgSVBBRERSOgogICAgY2FzZSBUSU1FVElDS1M6CiAgICBjYXNlIE5VTDoKICAgIGNhc2UgTlNBUEFERFJFU1M6CiAgICBjYXNlIENPVU5URVI2NDoKICAgICAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgICAgcHJpbnRfZXJyb3IoIkJhZCBzeW50YXgiLCB0b2tlbiwgdHlwZSk7CiAgICAgICAgZnJlZV9ub2RlKG5wKTsKICAgICAgICByZXR1cm4gbmV4dHR5cGU7CiAgICB9CiAgICBmcmVlX25vZGUobnApOwogICAgcmV0dXJuIG5leHR0eXBlOwp9CgpzdGF0aWMgaW50CmNvbXBsaWFuY2VfbG9va3VwKGNvbnN0IGNoYXIgKm5hbWUsIGludCBtb2RpZCkKewogICAgaWYgKG1vZGlkID09IC0xKSB7CiAgICAgICAgc3RydWN0IG9iamdyb3VwICpvcCA9CiAgICAgICAgICAgIChzdHJ1Y3Qgb2JqZ3JvdXAgKikgbWFsbG9jKHNpemVvZihzdHJ1Y3Qgb2JqZ3JvdXApKTsKICAgICAgICBpZiAoIW9wKQogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICBvcC0+bmV4dCA9IG9iamdyb3VwczsKICAgICAgICBvcC0+bmFtZSA9IHN0cmR1cChuYW1lKTsKICAgICAgICBvcC0+bGluZSA9IG1pYkxpbmU7CiAgICAgICAgb2JqZ3JvdXBzID0gb3A7CiAgICAgICAgcmV0dXJuIDE7CiAgICB9IGVsc2UKICAgICAgICByZXR1cm4gZmluZF90cmVlX25vZGUobmFtZSwgbW9kaWQpICE9IE5VTEw7Cn0KCnN0YXRpYyBzdHJ1Y3Qgbm9kZSAqCnBhcnNlX2NvbXBsaWFuY2UoRklMRSAqIGZwLCBjaGFyICpuYW1lKQp7CiAgICBpbnQgICAgICAgICAgICAgdHlwZTsKICAgIGNoYXIgICAgICAgICAgICB0b2tlbltNQVhUT0tFTl07CiAgICBjaGFyICAgICAgICAgICAgcXVvdGVkX3N0cmluZ19idWZmZXJbTUFYUVVPVEVTVFJdOwogICAgc3RydWN0IG5vZGUgICAgKm5wOwoKICAgIG5wID0gYWxsb2Nfbm9kZShjdXJyZW50X21vZHVsZSk7CiAgICBpZiAobnAgPT0gTlVMTCkKICAgICAgICByZXR1cm4gKE5VTEwpOwogICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgIGlmICh0eXBlICE9IFNUQVRVUykgewogICAgICAgIHByaW50X2Vycm9yKCJFeHBlY3RlZCBTVEFUVVMiLCB0b2tlbiwgdHlwZSk7CiAgICAgICAgZ290byBza2lwOwogICAgfQogICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgIGlmICh0eXBlICE9IENVUlJFTlQgJiYgdHlwZSAhPSBERVBSRUNBVEVEICYmIHR5cGUgIT0gT0JTT0xFVEUpIHsKICAgICAgICBwcmludF9lcnJvcigiQmFkIFNUQVRVUyIsIHRva2VuLCB0eXBlKTsKICAgICAgICBnb3RvIHNraXA7CiAgICB9CiAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgaWYgKHR5cGUgIT0gREVTQ1JJUFRJT04pIHsKICAgICAgICBwcmludF9lcnJvcigiRXhwZWN0ZWQgREVTQ1JJUFRJT04iLCB0b2tlbiwgdHlwZSk7CiAgICAgICAgZ290byBza2lwOwogICAgfQogICAgdHlwZSA9IGdldF90b2tlbihmcCwgcXVvdGVkX3N0cmluZ19idWZmZXIsIE1BWFFVT1RFU1RSKTsKICAgIGlmICh0eXBlICE9IFFVT1RFU1RSSU5HKSB7CiAgICAgICAgcHJpbnRfZXJyb3IoIkJhZCBERVNDUklQVElPTiIsIHF1b3RlZF9zdHJpbmdfYnVmZmVyLCB0eXBlKTsKICAgICAgICBnb3RvIHNraXA7CiAgICB9CiAgICBpZiAobmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIAoJCQkgICAgICAgTkVUU05NUF9EU19MSUJfU0FWRV9NSUJfREVTQ1JTKSkKICAgICAgICBucC0+ZGVzY3JpcHRpb24gPSBzdHJkdXAocXVvdGVkX3N0cmluZ19idWZmZXIpOwogICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgIGlmICh0eXBlID09IFJFRkVSRU5DRSkgewogICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHF1b3RlZF9zdHJpbmdfYnVmZmVyLCBNQVhUT0tFTik7CiAgICAgICAgaWYgKHR5cGUgIT0gUVVPVEVTVFJJTkcpIHsKICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkJhZCBSRUZFUkVOQ0UiLCBxdW90ZWRfc3RyaW5nX2J1ZmZlciwgdHlwZSk7CiAgICAgICAgICAgIGdvdG8gc2tpcDsKICAgICAgICB9CiAgICAgICAgbnAtPnJlZmVyZW5jZSA9IHN0cmR1cChxdW90ZWRfc3RyaW5nX2J1ZmZlcik7CiAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgIH0KICAgIGlmICh0eXBlICE9IE1PRFVMRSkgewogICAgICAgIHByaW50X2Vycm9yKCJFeHBlY3RlZCBNT0RVTEUiLCB0b2tlbiwgdHlwZSk7CiAgICAgICAgZ290byBza2lwOwogICAgfQogICAgd2hpbGUgKHR5cGUgPT0gTU9EVUxFKSB7CiAgICAgICAgaW50ICAgICAgICAgICAgIG1vZGlkID0gLTE7CiAgICAgICAgY2hhciAgICAgICAgICAgIG1vZG5hbWVbTUFYVE9LRU5dOwogICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgaWYgKHR5cGUgPT0gTEFCRUwKICAgICAgICAgICAgJiYgc3RyY21wKHRva2VuLCBtb2R1bGVfbmFtZShjdXJyZW50X21vZHVsZSwgbW9kbmFtZSkpKSB7CiAgICAgICAgICAgIG1vZGlkID0gcmVhZF9tb2R1bGVfaW50ZXJuYWwodG9rZW4pOwogICAgICAgICAgICBpZiAobW9kaWQgIT0gTU9EVUxFX0xPQURFRF9PSwogICAgICAgICAgICAgICAgJiYgbW9kaWQgIT0gTU9EVUxFX0FMUkVBRFlfTE9BREVEKSB7CiAgICAgICAgICAgICAgICBwcmludF9lcnJvcigiVW5rbm93biBtb2R1bGUiLCB0b2tlbiwgdHlwZSk7CiAgICAgICAgICAgICAgICBnb3RvIHNraXA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbW9kaWQgPSB3aGljaF9tb2R1bGUodG9rZW4pOwogICAgICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgIH0KICAgICAgICBpZiAodHlwZSA9PSBNQU5EQVRPUllHUk9VUFMpIHsKICAgICAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICAgICAgaWYgKHR5cGUgIT0gTEVGVEJSQUNLRVQpIHsKICAgICAgICAgICAgICAgIHByaW50X2Vycm9yKCJFeHBlY3RlZCBcIntcIiIsIHRva2VuLCB0eXBlKTsKICAgICAgICAgICAgICAgIGdvdG8gc2tpcDsKICAgICAgICAgICAgfQogICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgICAgICAgICAgaWYgKHR5cGUgIT0gTEFCRUwpIHsKICAgICAgICAgICAgICAgICAgICBwcmludF9lcnJvcigiQmFkIGdyb3VwIG5hbWUiLCB0b2tlbiwgdHlwZSk7CiAgICAgICAgICAgICAgICAgICAgZ290byBza2lwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCFjb21wbGlhbmNlX2xvb2t1cCh0b2tlbiwgbW9kaWQpKQogICAgICAgICAgICAgICAgICAgIHByaW50X2Vycm9yKCJVbmtub3duIGdyb3VwIiwgdG9rZW4sIHR5cGUpOwogICAgICAgICAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICAgICAgfSB3aGlsZSAodHlwZSA9PSBDT01NQSk7CiAgICAgICAgICAgIGlmICh0eXBlICE9IFJJR0hUQlJBQ0tFVCkgewogICAgICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkV4cGVjdGVkIFwifVwiIiwgdG9rZW4sIHR5cGUpOwogICAgICAgICAgICAgICAgZ290byBza2lwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgfQogICAgICAgIHdoaWxlICh0eXBlID09IEdST1VQIHx8IHR5cGUgPT0gT0JKRUNUKSB7CiAgICAgICAgICAgIGlmICh0eXBlID09IEdST1VQKSB7CiAgICAgICAgICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgICAgICAgICAgaWYgKHR5cGUgIT0gTEFCRUwpIHsKICAgICAgICAgICAgICAgICAgICBwcmludF9lcnJvcigiQmFkIGdyb3VwIG5hbWUiLCB0b2tlbiwgdHlwZSk7CiAgICAgICAgICAgICAgICAgICAgZ290byBza2lwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCFjb21wbGlhbmNlX2xvb2t1cCh0b2tlbiwgbW9kaWQpKQogICAgICAgICAgICAgICAgICAgIHByaW50X2Vycm9yKCJVbmtub3duIGdyb3VwIiwgdG9rZW4sIHR5cGUpOwogICAgICAgICAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgICAgICAgICBpZiAodHlwZSAhPSBMQUJFTCkgewogICAgICAgICAgICAgICAgICAgIHByaW50X2Vycm9yKCJCYWQgb2JqZWN0IG5hbWUiLCB0b2tlbiwgdHlwZSk7CiAgICAgICAgICAgICAgICAgICAgZ290byBza2lwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCFjb21wbGlhbmNlX2xvb2t1cCh0b2tlbiwgbW9kaWQpKQogICAgICAgICAgICAgICAgICAgIHByaW50X2Vycm9yKCJVbmtub3duIGdyb3VwIiwgdG9rZW4sIHR5cGUpOwogICAgICAgICAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICAgICAgICAgIGlmICh0eXBlID09IFNZTlRBWCkKICAgICAgICAgICAgICAgICAgICB0eXBlID0gZWF0X3N5bnRheChmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICAgICAgICAgIGlmICh0eXBlID09IFdSU1lOVEFYKQogICAgICAgICAgICAgICAgICAgIHR5cGUgPSBlYXRfc3ludGF4KGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgICAgICAgICAgaWYgKHR5cGUgPT0gTUlOQUNDRVNTKSB7CiAgICAgICAgICAgICAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSAhPSBOT0FDQ0VTUyAmJiB0eXBlICE9IEFDQ05PVElGWQogICAgICAgICAgICAgICAgICAgICAgICAmJiB0eXBlICE9IFJFQURPTkxZICYmIHR5cGUgIT0gV1JJVEVPTkxZCiAgICAgICAgICAgICAgICAgICAgICAgICYmIHR5cGUgIT0gUkVBRENSRUFURSAmJiB0eXBlICE9IFJFQURXUklURSkgewogICAgICAgICAgICAgICAgICAgICAgICBwcmludF9lcnJvcigiQmFkIE1JTi1BQ0NFU1Mgc3BlYyIsIHRva2VuLCB0eXBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgZ290byBza2lwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0eXBlICE9IERFU0NSSVBUSU9OKSB7CiAgICAgICAgICAgICAgICBwcmludF9lcnJvcigiRXhwZWN0ZWQgREVTQ1JJUFRJT04iLCB0b2tlbiwgdHlwZSk7CiAgICAgICAgICAgICAgICBnb3RvIHNraXA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICAgICAgaWYgKHR5cGUgIT0gUVVPVEVTVFJJTkcpIHsKICAgICAgICAgICAgICAgIHByaW50X2Vycm9yKCJCYWQgREVTQ1JJUFRJT04iLCB0b2tlbiwgdHlwZSk7CiAgICAgICAgICAgICAgICBnb3RvIHNraXA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICB9CiAgICB9CiAgc2tpcDoKICAgIHdoaWxlICh0eXBlICE9IEVRVUFMUyAmJiB0eXBlICE9IEVORE9GRklMRSkKICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCBxdW90ZWRfc3RyaW5nX2J1ZmZlciwgTUFYUVVPVEVTVFIpOwoKICAgIHJldHVybiBtZXJnZV9wYXJzZV9vYmplY3RpZChucCwgZnAsIG5hbWUpOwp9CgoKLyoKICogUGFyc2VzIGEgY2FwYWJpbGl0aWVzIG1hY3JvCiAqIFJldHVybnMgMCBvbiBlcnJvci4KICovCnN0YXRpYyBzdHJ1Y3Qgbm9kZSAqCnBhcnNlX2NhcGFiaWxpdGllcyhGSUxFICogZnAsIGNoYXIgKm5hbWUpCnsKICAgIGludCAgICAgICAgICAgICB0eXBlOwogICAgY2hhciAgICAgICAgICAgIHRva2VuW01BWFRPS0VOXTsKICAgIGNoYXIgICAgICAgICAgICBxdW90ZWRfc3RyaW5nX2J1ZmZlcltNQVhRVU9URVNUUl07CiAgICBzdHJ1Y3Qgbm9kZSAgICAqbnA7CgogICAgbnAgPSBhbGxvY19ub2RlKGN1cnJlbnRfbW9kdWxlKTsKICAgIGlmIChucCA9PSBOVUxMKQogICAgICAgIHJldHVybiAoTlVMTCk7CiAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgaWYgKHR5cGUgIT0gUFJPRFJFTCkgewogICAgICAgIHByaW50X2Vycm9yKCJFeHBlY3RlZCBQUk9EVUNULVJFTEVBU0UiLCB0b2tlbiwgdHlwZSk7CiAgICAgICAgZ290byBza2lwOwogICAgfQogICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgIGlmICh0eXBlICE9IFFVT1RFU1RSSU5HKSB7CiAgICAgICAgcHJpbnRfZXJyb3IoIkV4cGVjdGVkIFNUUklORyBhZnRlciBQUk9EVUNULVJFTEVBU0UiLCB0b2tlbiwgdHlwZSk7CiAgICAgICAgZ290byBza2lwOwogICAgfQogICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgIGlmICh0eXBlICE9IFNUQVRVUykgewogICAgICAgIHByaW50X2Vycm9yKCJFeHBlY3RlZCBTVEFUVVMiLCB0b2tlbiwgdHlwZSk7CiAgICAgICAgZ290byBza2lwOwogICAgfQogICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgIGlmICh0eXBlICE9IENVUlJFTlQgJiYgdHlwZSAhPSBPQlNPTEVURSkgewogICAgICAgIHByaW50X2Vycm9yKCJTVEFUVVMgc2hvdWxkIGJlIGN1cnJlbnQgb3Igb2Jzb2xldGUiLCB0b2tlbiwgdHlwZSk7CiAgICAgICAgZ290byBza2lwOwogICAgfQogICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgIGlmICh0eXBlICE9IERFU0NSSVBUSU9OKSB7CiAgICAgICAgcHJpbnRfZXJyb3IoIkV4cGVjdGVkIERFU0NSSVBUSU9OIiwgdG9rZW4sIHR5cGUpOwogICAgICAgIGdvdG8gc2tpcDsKICAgIH0KICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHF1b3RlZF9zdHJpbmdfYnVmZmVyLCBNQVhUT0tFTik7CiAgICBpZiAodHlwZSAhPSBRVU9URVNUUklORykgewogICAgICAgIHByaW50X2Vycm9yKCJCYWQgREVTQ1JJUFRJT04iLCBxdW90ZWRfc3RyaW5nX2J1ZmZlciwgdHlwZSk7CiAgICAgICAgZ290byBza2lwOwogICAgfQogICAgaWYgKG5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCAKCQkJICAgICAgIE5FVFNOTVBfRFNfTElCX1NBVkVfTUlCX0RFU0NSUykpIHsKICAgICAgICBucC0+ZGVzY3JpcHRpb24gPSBzdHJkdXAocXVvdGVkX3N0cmluZ19idWZmZXIpOwogICAgfQogICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgIGlmICh0eXBlID09IFJFRkVSRU5DRSkgewogICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHF1b3RlZF9zdHJpbmdfYnVmZmVyLCBNQVhUT0tFTik7CiAgICAgICAgaWYgKHR5cGUgIT0gUVVPVEVTVFJJTkcpIHsKICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkJhZCBSRUZFUkVOQ0UiLCBxdW90ZWRfc3RyaW5nX2J1ZmZlciwgdHlwZSk7CiAgICAgICAgICAgIGdvdG8gc2tpcDsKICAgICAgICB9CiAgICAgICAgbnAtPnJlZmVyZW5jZSA9IHN0cmR1cChxdW90ZWRfc3RyaW5nX2J1ZmZlcik7CiAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIHR5cGUpOwogICAgfQogICAgd2hpbGUgKHR5cGUgPT0gU1VQUE9SVFMpIHsKICAgICAgICBpbnQgICAgICAgICAgICAgbW9kaWQ7CiAgICAgICAgc3RydWN0IHRyZWUgICAgKnRwOwoKICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgIGlmICh0eXBlICE9IExBQkVMKSB7CiAgICAgICAgICAgIHByaW50X2Vycm9yKCJCYWQgbW9kdWxlIG5hbWUiLCB0b2tlbiwgdHlwZSk7CiAgICAgICAgICAgIGdvdG8gc2tpcDsKICAgICAgICB9CiAgICAgICAgbW9kaWQgPSByZWFkX21vZHVsZV9pbnRlcm5hbCh0b2tlbik7CiAgICAgICAgaWYgKG1vZGlkICE9IE1PRFVMRV9MT0FERURfT0sgJiYgbW9kaWQgIT0gTU9EVUxFX0FMUkVBRFlfTE9BREVEKSB7CiAgICAgICAgICAgIHByaW50X2Vycm9yKCJNb2R1bGUgbm90IGZvdW5kIiwgdG9rZW4sIHR5cGUpOwogICAgICAgICAgICBnb3RvIHNraXA7CiAgICAgICAgfQogICAgICAgIG1vZGlkID0gd2hpY2hfbW9kdWxlKHRva2VuKTsKICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgIGlmICh0eXBlICE9IElOQ0xVREVTKSB7CiAgICAgICAgICAgIHByaW50X2Vycm9yKCJFeHBlY3RlZCBJTkNMVURFUyIsIHRva2VuLCB0eXBlKTsKICAgICAgICAgICAgZ290byBza2lwOwogICAgICAgIH0KICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgIGlmICh0eXBlICE9IExFRlRCUkFDS0VUKSB7CiAgICAgICAgICAgIHByaW50X2Vycm9yKCJFeHBlY3RlZCBcIntcIiIsIHRva2VuLCB0eXBlKTsKICAgICAgICAgICAgZ290byBza2lwOwogICAgICAgIH0KICAgICAgICBkbyB7CiAgICAgICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgICAgIGlmICh0eXBlICE9IExBQkVMKSB7CiAgICAgICAgICAgICAgICBwcmludF9lcnJvcigiRXhwZWN0ZWQgZ3JvdXAgbmFtZSIsIHRva2VuLCB0eXBlKTsKICAgICAgICAgICAgICAgIGdvdG8gc2tpcDsKICAgICAgICAgICAgfQogICAgICAgICAgICB0cCA9IGZpbmRfdHJlZV9ub2RlKHRva2VuLCBtb2RpZCk7CiAgICAgICAgICAgIGlmICghdHApCiAgICAgICAgICAgICAgICBwcmludF9lcnJvcigiR3JvdXAgbm90IGZvdW5kIGluIG1vZHVsZSIsIHRva2VuLCB0eXBlKTsKICAgICAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICB9IHdoaWxlICh0eXBlID09IENPTU1BKTsKICAgICAgICBpZiAodHlwZSAhPSBSSUdIVEJSQUNLRVQpIHsKICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkV4cGVjdGVkIFwifVwiIGFmdGVyIGdyb3VwIGxpc3QiLCB0b2tlbiwgdHlwZSk7CiAgICAgICAgICAgIGdvdG8gc2tpcDsKICAgICAgICB9CiAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICB3aGlsZSAodHlwZSA9PSBWQVJJQVRJT04pIHsKICAgICAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICAgICAgaWYgKHR5cGUgIT0gTEFCRUwpIHsKICAgICAgICAgICAgICAgIHByaW50X2Vycm9yKCJCYWQgb2JqZWN0IG5hbWUiLCB0b2tlbiwgdHlwZSk7CiAgICAgICAgICAgICAgICBnb3RvIHNraXA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdHAgPSBmaW5kX3RyZWVfbm9kZSh0b2tlbiwgbW9kaWQpOwogICAgICAgICAgICBpZiAoIXRwKQogICAgICAgICAgICAgICAgcHJpbnRfZXJyb3IoIk9iamVjdCBub3QgZm91bmQgaW4gbW9kdWxlIiwgdG9rZW4sIHR5cGUpOwogICAgICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgICAgICBpZiAodHlwZSA9PSBTWU5UQVgpIHsKICAgICAgICAgICAgICAgIHR5cGUgPSBlYXRfc3ludGF4KGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0eXBlID09IFdSU1lOVEFYKSB7CiAgICAgICAgICAgICAgICB0eXBlID0gZWF0X3N5bnRheChmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodHlwZSA9PSBBQ0NFU1MpIHsKICAgICAgICAgICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgICAgICAgICBpZiAodHlwZSAhPSBBQ0NOT1RJRlkgJiYgdHlwZSAhPSBSRUFET05MWQogICAgICAgICAgICAgICAgICAgICYmIHR5cGUgIT0gUkVBRFdSSVRFICYmIHR5cGUgIT0gUkVBRENSRUFURQogICAgICAgICAgICAgICAgICAgICYmIHR5cGUgIT0gV1JJVEVPTkxZICYmIHR5cGUgIT0gTk9USU1QTCkgewogICAgICAgICAgICAgICAgICAgIHByaW50X2Vycm9yKCJCYWQgQUNDRVNTIiwgdG9rZW4sIHR5cGUpOwogICAgICAgICAgICAgICAgICAgIGdvdG8gc2tpcDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHR5cGUgPT0gQ1JFQVRFUkVRKSB7CiAgICAgICAgICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgICAgICAgICAgaWYgKHR5cGUgIT0gTEVGVEJSQUNLRVQpIHsKICAgICAgICAgICAgICAgICAgICBwcmludF9lcnJvcigiRXhwZWN0ZWQgXCJ7XCIiLCB0b2tlbiwgdHlwZSk7CiAgICAgICAgICAgICAgICAgICAgZ290byBza2lwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgIT0gTEFCRUwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkJhZCBvYmplY3QgbmFtZSBpbiBsaXN0IiwgdG9rZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUpOwogICAgICAgICAgICAgICAgICAgICAgICBnb3RvIHNraXA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgICAgICAgICB9IHdoaWxlICh0eXBlID09IENPTU1BKTsKICAgICAgICAgICAgICAgIGlmICh0eXBlICE9IFJJR0hUQlJBQ0tFVCkgewogICAgICAgICAgICAgICAgICAgIHByaW50X2Vycm9yKCJFeHBlY3RlZCBcIn1cIiBhZnRlciBsaXN0IiwgdG9rZW4sIHR5cGUpOwogICAgICAgICAgICAgICAgICAgIGdvdG8gc2tpcDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHR5cGUgPT0gREVGVkFMKSB7CiAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgbGV2ZWwgPSAxOwogICAgICAgICAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICAgICAgICAgIGlmICh0eXBlICE9IExFRlRCUkFDS0VUKSB7CiAgICAgICAgICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkV4cGVjdGVkIFwie1wiIGFmdGVyIERFRlZBTCIsIHRva2VuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUpOwogICAgICAgICAgICAgICAgICAgIGdvdG8gc2tpcDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlID09IExFRlRCUkFDS0VUKQogICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCsrOwogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gUklHSFRCUkFDS0VUKQogICAgICAgICAgICAgICAgICAgICAgICBsZXZlbC0tOwogICAgICAgICAgICAgICAgfSB3aGlsZSAoKHR5cGUgIT0gUklHSFRCUkFDS0VUIHx8IGxldmVsICE9IDApCiAgICAgICAgICAgICAgICAgICAgICAgICAmJiB0eXBlICE9IEVORE9GRklMRSk7CiAgICAgICAgICAgICAgICBpZiAodHlwZSAhPSBSSUdIVEJSQUNLRVQpIHsKICAgICAgICAgICAgICAgICAgICBwcmludF9lcnJvcigiTWlzc2luZyBcIn1cIiBhZnRlciBERUZWQUwiLCB0b2tlbiwgdHlwZSk7CiAgICAgICAgICAgICAgICAgICAgZ290byBza2lwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodHlwZSAhPSBERVNDUklQVElPTikgewogICAgICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkV4cGVjdGVkIERFU0NSSVBUSU9OIiwgdG9rZW4sIHR5cGUpOwogICAgICAgICAgICAgICAgZ290byBza2lwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHF1b3RlZF9zdHJpbmdfYnVmZmVyLCBNQVhUT0tFTik7CiAgICAgICAgICAgIGlmICh0eXBlICE9IFFVT1RFU1RSSU5HKSB7CiAgICAgICAgICAgICAgICBwcmludF9lcnJvcigiQmFkIERFU0NSSVBUSU9OIiwgcXVvdGVkX3N0cmluZ19idWZmZXIsIHR5cGUpOwogICAgICAgICAgICAgICAgZ290byBza2lwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgfQogICAgfQogICAgaWYgKHR5cGUgIT0gRVFVQUxTKQogICAgICAgIHByaW50X2Vycm9yKCJFeHBlY3RlZCBcIjo6PVwiIiwgdG9rZW4sIHR5cGUpOwogIHNraXA6CiAgICB3aGlsZSAodHlwZSAhPSBFUVVBTFMgJiYgdHlwZSAhPSBFTkRPRkZJTEUpIHsKICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCBxdW90ZWRfc3RyaW5nX2J1ZmZlciwgTUFYUVVPVEVTVFIpOwogICAgfQogICAgcmV0dXJuIG1lcmdlX3BhcnNlX29iamVjdGlkKG5wLCBmcCwgbmFtZSk7Cn0KCi8qCiAqIFBhcnNlcyBhIG1vZHVsZSBpZGVudGl0eSBtYWNybwogKiBSZXR1cm5zIDAgb24gZXJyb3IuCiAqLwpzdGF0aWMgdm9pZApjaGVja191dGMoY29uc3QgY2hhciAqdXRjKQp7CiAgICBpbnQgICAgICAgICAgICAgbGVuLCB5ZWFyLCBtb250aCwgZGF5LCBob3VyLCBtaW51dGU7CgogICAgbGVuID0gc3RybGVuKHV0Yyk7CiAgICBpZiAodXRjW2xlbiAtIDFdICE9ICdaJyAmJiB1dGNbbGVuIC0gMV0gIT0gJ3onKSB7CiAgICAgICAgcHJpbnRfZXJyb3IoIlRpbWVzdGFtcCBzaG91bGQgZW5kIHdpdGggWiIsIHV0YywgUVVPVEVTVFJJTkcpOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIGlmIChsZW4gPT0gMTEpIHsKICAgICAgICBsZW4gPQogICAgICAgICAgICBzc2NhbmYodXRjLCAiJTJkJTJkJTJkJTJkJTJkWiIsICZ5ZWFyLCAmbW9udGgsICZkYXksICZob3VyLAogICAgICAgICAgICAgICAgICAgJm1pbnV0ZSk7CiAgICAgICAgeWVhciArPSAxOTAwOwogICAgfSBlbHNlIGlmIChsZW4gPT0gMTMpCiAgICAgICAgbGVuID0KICAgICAgICAgICAgc3NjYW5mKHV0YywgIiU0ZCUyZCUyZCUyZCUyZFoiLCAmeWVhciwgJm1vbnRoLCAmZGF5LCAmaG91ciwKICAgICAgICAgICAgICAgICAgICZtaW51dGUpOwogICAgZWxzZSB7CiAgICAgICAgcHJpbnRfZXJyb3IoIkJhZCB0aW1lc3RhbXAgZm9ybWF0ICgxMSBvciAxMyBjaGFyYWN0ZXJzKSIsCiAgICAgICAgICAgICAgICAgICAgdXRjLCBRVU9URVNUUklORyk7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKGxlbiAhPSA1KSB7CiAgICAgICAgcHJpbnRfZXJyb3IoIkJhZCB0aW1lc3RhbXAgZm9ybWF0IiwgdXRjLCBRVU9URVNUUklORyk7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKG1vbnRoIDwgMSB8fCBtb250aCA+IDEyKQogICAgICAgIHByaW50X2Vycm9yKCJCYWQgbW9udGggaW4gdGltZXN0YW1wIiwgdXRjLCBRVU9URVNUUklORyk7CiAgICBpZiAoZGF5IDwgMSB8fCBkYXkgPiAzMSkKICAgICAgICBwcmludF9lcnJvcigiQmFkIGRheSBpbiB0aW1lc3RhbXAiLCB1dGMsIFFVT1RFU1RSSU5HKTsKICAgIGlmIChob3VyIDwgMCB8fCBob3VyID4gMjMpCiAgICAgICAgcHJpbnRfZXJyb3IoIkJhZCBob3VyIGluIHRpbWVzdGFtcCIsIHV0YywgUVVPVEVTVFJJTkcpOwogICAgaWYgKG1pbnV0ZSA8IDAgfHwgbWludXRlID4gNTkpCiAgICAgICAgcHJpbnRfZXJyb3IoIkJhZCBtaW51dGUgaW4gdGltZXN0YW1wIiwgdXRjLCBRVU9URVNUUklORyk7Cn0KCnN0YXRpYyBzdHJ1Y3Qgbm9kZSAqCnBhcnNlX21vZHVsZUlkZW50aXR5KEZJTEUgKiBmcCwgY2hhciAqbmFtZSkKewogICAgcmVnaXN0ZXIgaW50ICAgIHR5cGU7CiAgICBjaGFyICAgICAgICAgICAgdG9rZW5bTUFYVE9LRU5dOwogICAgY2hhciAgICAgICAgICAgIHF1b3RlZF9zdHJpbmdfYnVmZmVyW01BWFFVT1RFU1RSXTsKICAgIHJlZ2lzdGVyIHN0cnVjdCBub2RlICpucDsKCiAgICBucCA9IGFsbG9jX25vZGUoY3VycmVudF9tb2R1bGUpOwogICAgaWYgKG5wID09IE5VTEwpCiAgICAgICAgcmV0dXJuIChOVUxMKTsKICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICBpZiAodHlwZSAhPSBMQVNUVVBEQVRFRCkgewogICAgICAgIHByaW50X2Vycm9yKCJFeHBlY3RlZCBMQVNULVVQREFURUQiLCB0b2tlbiwgdHlwZSk7CiAgICAgICAgZ290byBza2lwOwogICAgfQogICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgIGlmICh0eXBlICE9IFFVT1RFU1RSSU5HKSB7CiAgICAgICAgcHJpbnRfZXJyb3IoIk5lZWQgU1RSSU5HIGZvciBMQVNULVVQREFURUQiLCB0b2tlbiwgdHlwZSk7CiAgICAgICAgZ290byBza2lwOwogICAgfQogICAgY2hlY2tfdXRjKHRva2VuKTsKICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICBpZiAodHlwZSAhPSBPUkdBTklaQVRJT04pIHsKICAgICAgICBwcmludF9lcnJvcigiRXhwZWN0ZWQgT1JHQU5JWkFUSU9OIiwgdG9rZW4sIHR5cGUpOwogICAgICAgIGdvdG8gc2tpcDsKICAgIH0KICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICBpZiAodHlwZSAhPSBRVU9URVNUUklORykgewogICAgICAgIHByaW50X2Vycm9yKCJCYWQgT1JHQU5JWkFUSU9OIiwgdG9rZW4sIHR5cGUpOwogICAgICAgIGdvdG8gc2tpcDsKICAgIH0KICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICBpZiAodHlwZSAhPSBDT05UQUNUSU5GTykgewogICAgICAgIHByaW50X2Vycm9yKCJFeHBlY3RlZCBDT05UQUNULUlORk8iLCB0b2tlbiwgdHlwZSk7CiAgICAgICAgZ290byBza2lwOwogICAgfQogICAgdHlwZSA9IGdldF90b2tlbihmcCwgcXVvdGVkX3N0cmluZ19idWZmZXIsIE1BWFFVT1RFU1RSKTsKICAgIGlmICh0eXBlICE9IFFVT1RFU1RSSU5HKSB7CiAgICAgICAgcHJpbnRfZXJyb3IoIkJhZCBDT05UQUNULUlORk8iLCBxdW90ZWRfc3RyaW5nX2J1ZmZlciwgdHlwZSk7CiAgICAgICAgZ290byBza2lwOwogICAgfQogICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgIGlmICh0eXBlICE9IERFU0NSSVBUSU9OKSB7CiAgICAgICAgcHJpbnRfZXJyb3IoIkV4cGVjdGVkIERFU0NSSVBUSU9OIiwgdG9rZW4sIHR5cGUpOwogICAgICAgIGdvdG8gc2tpcDsKICAgIH0KICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHF1b3RlZF9zdHJpbmdfYnVmZmVyLCBNQVhRVU9URVNUUik7CiAgICBpZiAodHlwZSAhPSBRVU9URVNUUklORykgewogICAgICAgIHByaW50X2Vycm9yKCJCYWQgREVTQ1JJUFRJT04iLCBxdW90ZWRfc3RyaW5nX2J1ZmZlciwgdHlwZSk7CiAgICAgICAgZ290byBza2lwOwogICAgfQogICAgaWYgKG5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELCAKCQkJICAgICAgIE5FVFNOTVBfRFNfTElCX1NBVkVfTUlCX0RFU0NSUykpIHsKICAgICAgICBucC0+ZGVzY3JpcHRpb24gPSBzdHJkdXAocXVvdGVkX3N0cmluZ19idWZmZXIpOwogICAgfQogICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgIHdoaWxlICh0eXBlID09IFJFVklTSU9OKSB7CiAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICBpZiAodHlwZSAhPSBRVU9URVNUUklORykgewogICAgICAgICAgICBwcmludF9lcnJvcigiQmFkIFJFVklTSU9OIiwgdG9rZW4sIHR5cGUpOwogICAgICAgICAgICBnb3RvIHNraXA7CiAgICAgICAgfQogICAgICAgIGNoZWNrX3V0Yyh0b2tlbik7CiAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICBpZiAodHlwZSAhPSBERVNDUklQVElPTikgewogICAgICAgICAgICBwcmludF9lcnJvcigiRXhwZWN0ZWQgREVTQ1JJUFRJT04iLCB0b2tlbiwgdHlwZSk7CiAgICAgICAgICAgIGdvdG8gc2tpcDsKICAgICAgICB9CiAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgcXVvdGVkX3N0cmluZ19idWZmZXIsIE1BWFFVT1RFU1RSKTsKICAgICAgICBpZiAodHlwZSAhPSBRVU9URVNUUklORykgewogICAgICAgICAgICBwcmludF9lcnJvcigiQmFkIERFU0NSSVBUSU9OIiwgcXVvdGVkX3N0cmluZ19idWZmZXIsIHR5cGUpOwogICAgICAgICAgICBnb3RvIHNraXA7CiAgICAgICAgfQogICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICB9CiAgICBpZiAodHlwZSAhPSBFUVVBTFMpCiAgICAgICAgcHJpbnRfZXJyb3IoIkV4cGVjdGVkIFwiOjo9XCIiLCB0b2tlbiwgdHlwZSk7CiAgc2tpcDoKICAgIHdoaWxlICh0eXBlICE9IEVRVUFMUyAmJiB0eXBlICE9IEVORE9GRklMRSkgewogICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHF1b3RlZF9zdHJpbmdfYnVmZmVyLCBNQVhRVU9URVNUUik7CiAgICB9CiAgICByZXR1cm4gbWVyZ2VfcGFyc2Vfb2JqZWN0aWQobnAsIGZwLCBuYW1lKTsKfQoKCi8qCiAqIFBhcnNlcyBhIE1BQ1JPIGRlZmluaXRpb24KICogRXhwZWN0IEJFR0lOLCBkaXNjYXJkIGV2ZXJ5dGhpbmcgdG8gZW5kLgogKiBSZXR1cm5zIDAgb24gZXJyb3IuCiAqLwpzdGF0aWMgc3RydWN0IG5vZGUgKgpwYXJzZV9tYWNybyhGSUxFICogZnAsIGNoYXIgKm5hbWUpCnsKICAgIHJlZ2lzdGVyIGludCAgICB0eXBlOwogICAgY2hhciAgICAgICAgICAgIHRva2VuW01BWFRPS0VOXTsKICAgIHN0cnVjdCBub2RlICAgICpucDsKICAgIGludCAgICAgICAgICAgICBpTGluZSA9IG1pYkxpbmU7CgogICAgbnAgPSBhbGxvY19ub2RlKGN1cnJlbnRfbW9kdWxlKTsKICAgIGlmIChucCA9PSBOVUxMKQogICAgICAgIHJldHVybiAoTlVMTCk7CiAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgc2l6ZW9mKHRva2VuKSk7CiAgICB3aGlsZSAodHlwZSAhPSBFUVVBTFMgJiYgdHlwZSAhPSBFTkRPRkZJTEUpIHsKICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgc2l6ZW9mKHRva2VuKSk7CiAgICB9CiAgICBpZiAodHlwZSAhPSBFUVVBTFMpIHsKICAgICAgICBpZiAobnApCiAgICAgICAgICAgIGZyZWVfbm9kZShucCk7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CiAgICB3aGlsZSAodHlwZSAhPSBCRUdJTiAmJiB0eXBlICE9IEVORE9GRklMRSkgewogICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBzaXplb2YodG9rZW4pKTsKICAgIH0KICAgIGlmICh0eXBlICE9IEJFR0lOKSB7CiAgICAgICAgaWYgKG5wKQogICAgICAgICAgICBmcmVlX25vZGUobnApOwogICAgICAgIHJldHVybiBOVUxMOwogICAgfQogICAgd2hpbGUgKHR5cGUgIT0gRU5EICYmIHR5cGUgIT0gRU5ET0ZGSUxFKSB7CiAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIHNpemVvZih0b2tlbikpOwogICAgfQogICAgaWYgKHR5cGUgIT0gRU5EKSB7CiAgICAgICAgaWYgKG5wKQogICAgICAgICAgICBmcmVlX25vZGUobnApOwogICAgICAgIHJldHVybiBOVUxMOwogICAgfQoKICAgIGlmIChuZXRzbm1wX2RzX2dldF9pbnQoTkVUU05NUF9EU19MSUJSQVJZX0lELCAKCQkJICAgTkVUU05NUF9EU19MSUJfTUlCX1dBUk5JTkdTKSkgewogICAgICAgIHNubXBfbG9nKExPR19XQVJOSU5HLAogICAgICAgICAgICAgICAgICIlcyBNQUNSTyAobGluZXMgJWQuLiVkIHBhcnNlZCBhbmQgaWdub3JlZCkuXG4iLCBuYW1lLAogICAgICAgICAgICAgICAgIGlMaW5lLCBtaWJMaW5lKTsKICAgIH0KCiAgICByZXR1cm4gbnA7Cn0KCi8qCiAqIFBhcnNlcyBhIG1vZHVsZSBpbXBvcnQgY2xhdXNlCiAqICAgbG9hZGluZyBhbnkgbW9kdWxlcyByZWZlcmVuY2VkCiAqLwpzdGF0aWMgdm9pZApwYXJzZV9pbXBvcnRzKEZJTEUgKiBmcCkKewogICAgcmVnaXN0ZXIgaW50ICAgIHR5cGU7CiAgICBjaGFyICAgICAgICAgICAgdG9rZW5bTUFYVE9LRU5dOwogICAgY2hhciAgICAgICAgICAgIG1vZGJ1ZlsyNTZdOwojZGVmaW5lIE1BWF9JTVBPUlRTCTI1NgogICAgc3RydWN0IG1vZHVsZV9pbXBvcnQgaW1wb3J0X2xpc3RbTUFYX0lNUE9SVFNdOwogICAgaW50ICAgICAgICAgICAgIHRoaXNfbW9kdWxlOwogICAgc3RydWN0IG1vZHVsZSAgKm1wOwoKICAgIGludCAgICAgICAgICAgICBpbXBvcnRfY291bnQgPSAwOyAgIC8qIFRvdGFsIG51bWJlciBvZiBpbXBvcnRlZCBkZXNjcmlwdG9ycyAqLwogICAgaW50ICAgICAgICAgICAgIGkgPSAwLCBvbGRfaTsgICAgICAgLyogaW5kZXggb2YgZmlyc3QgaW1wb3J0IGZyb20gZWFjaCBtb2R1bGUgKi8KCiAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwoKICAgIC8qCiAgICAgKiBQYXJzZSB0aGUgSU1QT1JUUyBjbGF1c2UKICAgICAqLwogICAgd2hpbGUgKHR5cGUgIT0gU0VNSSAmJiB0eXBlICE9IEVORE9GRklMRSkgewogICAgICAgIGlmICh0eXBlID09IExBQkVMKSB7CiAgICAgICAgICAgIGlmIChpbXBvcnRfY291bnQgPT0gTUFYX0lNUE9SVFMpIHsKICAgICAgICAgICAgICAgIHByaW50X2Vycm9yKCJUb28gbWFueSBpbXBvcnRlZCBzeW1ib2xzIiwgdG9rZW4sIHR5cGUpOwogICAgICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgICAgICAgICB9IHdoaWxlICh0eXBlICE9IFNFTUkgJiYgdHlwZSAhPSBFTkRPRkZJTEUpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGltcG9ydF9saXN0W2ltcG9ydF9jb3VudCsrXS5sYWJlbCA9IHN0cmR1cCh0b2tlbik7CiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IEZST00pIHsKICAgICAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgICAgICAgICAgaWYgKGltcG9ydF9jb3VudCA9PSBpKSB7ICAgIC8qIEFsbCBpbXBvcnRzIGFyZSBoYW5kbGVkIGludGVybmFsbHkgKi8KICAgICAgICAgICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzX21vZHVsZSA9IHdoaWNoX21vZHVsZSh0b2tlbik7CgogICAgICAgICAgICBmb3IgKG9sZF9pID0gaTsgaSA8IGltcG9ydF9jb3VudDsgKytpKQogICAgICAgICAgICAgICAgaW1wb3J0X2xpc3RbaV0ubW9kaWQgPSB0aGlzX21vZHVsZTsKCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIFJlY3Vyc2l2ZWx5IHJlYWQgYW55IHByZS1yZXF1aXNpdGUgbW9kdWxlcwogICAgICAgICAgICAgKi8KICAgICAgICAgICAgaWYgKHJlYWRfbW9kdWxlX2ludGVybmFsKHRva2VuKSA9PSBNT0RVTEVfTk9UX0ZPVU5EKSB7CgkJaW50IGZvdW5kID0gMDsKICAgICAgICAgICAgICAgIGZvciAoOyBvbGRfaSA8IGltcG9ydF9jb3VudDsgKytvbGRfaSkgewogICAgICAgICAgICAgICAgICAgIGZvdW5kICs9IHJlYWRfaW1wb3J0X3JlcGxhY2VtZW50cyh0b2tlbiwgJmltcG9ydF9saXN0W29sZF9pXSk7CiAgICAgICAgICAgICAgICB9CgkJaWYgKCFmb3VuZCkKCQkgICAgcHJpbnRfbW9kdWxlX25vdF9mb3VuZCh0b2tlbik7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgIH0KCiAgICAvKgogICAgICogU2F2ZSB0aGUgaW1wb3J0IGluZm9ybWF0aW9uCiAgICAgKiAgIGluIHRoZSBnbG9iYWwgbW9kdWxlIHRhYmxlCiAgICAgKi8KICAgIGZvciAobXAgPSBtb2R1bGVfaGVhZDsgbXA7IG1wID0gbXAtPm5leHQpCiAgICAgICAgaWYgKG1wLT5tb2RpZCA9PSBjdXJyZW50X21vZHVsZSkgewogICAgICAgICAgICBpZiAoaW1wb3J0X2NvdW50ID09IDApCiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIGlmIChtcC0+aW1wb3J0cyAmJiAobXAtPmltcG9ydHMgIT0gcm9vdF9pbXBvcnRzKSkgewogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIHRoaXMgY2FuIGhhcHBlbiBpZiBhbGwgbW9kdWxlcyBhcmUgaW4gb25lIHNvdXJjZSBmaWxlLiAKICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG1wLT5ub19pbXBvcnRzOyArK2kpIHsKICAgICAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgicGFyc2UtbWlicyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiMjIyMgZnJlZWluZyBNb2R1bGUgJWQgJyVzJyAlZFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcC0+bW9kaWQsIG1wLT5pbXBvcnRzW2ldLmxhYmVsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wLT5pbXBvcnRzW2ldLm1vZGlkKSk7CiAgICAgICAgICAgICAgICAgICAgZnJlZSgoY2hhciAqKSBtcC0+aW1wb3J0c1tpXS5sYWJlbCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmcmVlKChjaGFyICopIG1wLT5pbXBvcnRzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBtcC0+aW1wb3J0cyA9IChzdHJ1Y3QgbW9kdWxlX2ltcG9ydCAqKQogICAgICAgICAgICAgICAgY2FsbG9jKGltcG9ydF9jb3VudCwgc2l6ZW9mKHN0cnVjdCBtb2R1bGVfaW1wb3J0KSk7CiAgICAgICAgICAgIGlmIChtcC0+aW1wb3J0cyA9PSBOVUxMKQogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaW1wb3J0X2NvdW50OyArK2kpIHsKICAgICAgICAgICAgICAgIG1wLT5pbXBvcnRzW2ldLmxhYmVsID0gaW1wb3J0X2xpc3RbaV0ubGFiZWw7CiAgICAgICAgICAgICAgICBtcC0+aW1wb3J0c1tpXS5tb2RpZCA9IGltcG9ydF9saXN0W2ldLm1vZGlkOwogICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoInBhcnNlLW1pYnMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIiMjIyMgYWRkaW5nIE1vZHVsZSAlZCAnJXMnICVkXG4iLCBtcC0+bW9kaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcC0+aW1wb3J0c1tpXS5sYWJlbCwgbXAtPmltcG9ydHNbaV0ubW9kaWQpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBtcC0+bm9faW1wb3J0cyA9IGltcG9ydF9jb3VudDsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAvKgogICAgICogU2hvdWxkbid0IGdldCB0aGlzIGZhcgogICAgICovCiAgICBwcmludF9tb2R1bGVfbm90X2ZvdW5kKG1vZHVsZV9uYW1lKGN1cnJlbnRfbW9kdWxlLCBtb2RidWYpKTsKICAgIHJldHVybjsKfQoKCgovKgogKiBNSUIgbW9kdWxlIGhhbmRsaW5nIHJvdXRpbmVzCiAqLwoKc3RhdGljIHZvaWQKZHVtcF9tb2R1bGVfbGlzdCh2b2lkKQp7CiAgICBzdHJ1Y3QgbW9kdWxlICAqbXAgPSBtb2R1bGVfaGVhZDsKCiAgICBERUJVR01TR1RMKCgicGFyc2UtbWlicyIsICJNb2R1bGUgbGlzdDpcbiIpKTsKICAgIHdoaWxlIChtcCkgewogICAgICAgIERFQlVHTVNHVEwoKCJwYXJzZS1taWJzIiwgIiAgJXMgJWQgJXMgJWRcbiIsIG1wLT5uYW1lLCBtcC0+bW9kaWQsCiAgICAgICAgICAgICAgICAgICAgbXAtPmZpbGUsIG1wLT5ub19pbXBvcnRzKSk7CiAgICAgICAgbXAgPSBtcC0+bmV4dDsKICAgIH0KfQoKaW50CndoaWNoX21vZHVsZShjb25zdCBjaGFyICpuYW1lKQp7CiAgICBzdHJ1Y3QgbW9kdWxlICAqbXA7CgogICAgZm9yIChtcCA9IG1vZHVsZV9oZWFkOyBtcDsgbXAgPSBtcC0+bmV4dCkKICAgICAgICBpZiAoIWxhYmVsX2NvbXBhcmUobXAtPm5hbWUsIG5hbWUpKQogICAgICAgICAgICByZXR1cm4gKG1wLT5tb2RpZCk7CgogICAgREVCVUdNU0dUTCgoInBhcnNlLW1pYnMiLCAiTW9kdWxlICVzIG5vdCBmb3VuZFxuIiwgbmFtZSkpOwogICAgcmV0dXJuICgtMSk7Cn0KCi8qCiAqIG1vZHVsZV9uYW1lIC0gY29weSBtb2R1bGUgbmFtZSB0byB1c2VyIGJ1ZmZlciwgcmV0dXJuIHB0ciB0byBzYW1lLgogKi8KY2hhciAgICAgICAgICAgKgptb2R1bGVfbmFtZShpbnQgbW9kaWQsIGNoYXIgKmNwKQp7CiAgICBzdHJ1Y3QgbW9kdWxlICAqbXA7CgogICAgZm9yIChtcCA9IG1vZHVsZV9oZWFkOyBtcDsgbXAgPSBtcC0+bmV4dCkKICAgICAgICBpZiAobXAtPm1vZGlkID09IG1vZGlkKSB7CiAgICAgICAgICAgIHN0cmNweShjcCwgbXAtPm5hbWUpOwogICAgICAgICAgICByZXR1cm4gKGNwKTsKICAgICAgICB9CgogICAgaWYgKG1vZGlkICE9IC0xKSBERUJVR01TR1RMKCgicGFyc2UtbWlicyIsICJNb2R1bGUgJWQgbm90IGZvdW5kXG4iLCBtb2RpZCkpOwogICAgc3ByaW50ZihjcCwgIiMlZCIsIG1vZGlkKTsKICAgIHJldHVybiAoY3ApOwp9CgovKgogKiAgQmFja3dhcmRzIGNvbXBhdGFiaWxpdHkKICogIFJlYWQgbmV3ZXIgbW9kdWxlcyB0aGF0IHJlcGxhY2UgdGhlIG9uZSBzcGVjaWZpZWQ6LQogKiAgICAgIGVpdGhlciBhbGwgb2YgdGhlbSAocmVhZF9tb2R1bGVfcmVwbGFjZW1lbnRzKSwKICogICAgICBvciB0aG9zZSByZWxhdGluZyB0byBhIHNwZWNpZmllZCBpZGVudGlmaWVyIChyZWFkX2ltcG9ydF9yZXBsYWNlbWVudHMpCiAqICAgICAgcGx1cyBhbiBpbnRlcmZhY2UgdG8gYWRkIG5ldyByZXBsYWNlbWVudCByZXF1aXJlbWVudHMKICovCm5ldHNubXBfZmVhdHVyZV9jaGlsZF9vZihwYXJzZV9hZGRfbW9kdWxlX3JlcGxhY2VtZW50LCBuZXRzbm1wX3VudXNlZCkKI2lmbmRlZiBORVRTTk1QX0ZFQVRVUkVfUkVNT1ZFX1BBUlNFX0FERF9NT0RVTEVfUkVQTEFDRU1FTlQKdm9pZAphZGRfbW9kdWxlX3JlcGxhY2VtZW50KGNvbnN0IGNoYXIgKm9sZF9tb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmV3X21vZHVsZV9uYW1lLAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnRhZywgaW50IGxlbikKewogICAgc3RydWN0IG1vZHVsZV9jb21wYXRhYmlsaXR5ICptY3A7CgogICAgbWNwID0gKHN0cnVjdCBtb2R1bGVfY29tcGF0YWJpbGl0eSAqKQogICAgICAgIGNhbGxvYygxLCBzaXplb2Yoc3RydWN0IG1vZHVsZV9jb21wYXRhYmlsaXR5KSk7CiAgICBpZiAobWNwID09IE5VTEwpCiAgICAgICAgcmV0dXJuOwoKICAgIG1jcC0+b2xkX21vZHVsZSA9IHN0cmR1cChvbGRfbW9kdWxlKTsKICAgIG1jcC0+bmV3X21vZHVsZSA9IHN0cmR1cChuZXdfbW9kdWxlX25hbWUpOwogICAgaWYgKHRhZykKICAgICAgICBtY3AtPnRhZyA9IHN0cmR1cCh0YWcpOwogICAgbWNwLT50YWdfbGVuID0gbGVuOwoKICAgIG1jcC0+bmV4dCA9IG1vZHVsZV9tYXBfaGVhZDsKICAgIG1vZHVsZV9tYXBfaGVhZCA9IG1jcDsKfQojZW5kaWYgLyogTkVUU05NUF9GRUFUVVJFX1JFTU9WRV9QQVJTRV9BRERfTU9EVUxFX1JFUExBQ0VNRU5UICovCgpzdGF0aWMgaW50CnJlYWRfbW9kdWxlX3JlcGxhY2VtZW50cyhjb25zdCBjaGFyICpuYW1lKQp7CiAgICBzdHJ1Y3QgbW9kdWxlX2NvbXBhdGFiaWxpdHkgKm1jcDsKCiAgICBmb3IgKG1jcCA9IG1vZHVsZV9tYXBfaGVhZDsgbWNwOyBtY3AgPSBtY3AtPm5leHQpIHsKICAgICAgICBpZiAoIWxhYmVsX2NvbXBhcmUobWNwLT5vbGRfbW9kdWxlLCBuYW1lKSkgewogICAgICAgICAgICBpZiAobmV0c25tcF9kc19nZXRfaW50KE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgCgkJCQkgICBORVRTTk1QX0RTX0xJQl9NSUJfV0FSTklOR1MpKSB7CiAgICAgICAgICAgICAgICBzbm1wX2xvZyhMT0dfV0FSTklORywKICAgICAgICAgICAgICAgICAgICAgICAgICJMb2FkaW5nIHJlcGxhY2VtZW50IG1vZHVsZSAlcyBmb3IgJXMgKCVzKVxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgIG1jcC0+bmV3X21vZHVsZSwgbmFtZSwgRmlsZSk7CgkgICAgfQogICAgICAgICAgICAodm9pZCkgbmV0c25tcF9yZWFkX21vZHVsZShtY3AtPm5ld19tb2R1bGUpOwogICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gMDsKfQoKc3RhdGljIGludApyZWFkX2ltcG9ydF9yZXBsYWNlbWVudHMoY29uc3QgY2hhciAqb2xkX21vZHVsZV9uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG1vZHVsZV9pbXBvcnQgKmlkZW50aWZpZXIpCnsKICAgIHN0cnVjdCBtb2R1bGVfY29tcGF0YWJpbGl0eSAqbWNwOwoKICAgIC8qCiAgICAgKiBMb29rIGZvciBtYXRjaGVzIGZpcnN0CiAgICAgKi8KICAgIGZvciAobWNwID0gbW9kdWxlX21hcF9oZWFkOyBtY3A7IG1jcCA9IG1jcC0+bmV4dCkgewogICAgICAgIGlmICghbGFiZWxfY29tcGFyZShtY3AtPm9sZF9tb2R1bGUsIG9sZF9tb2R1bGVfbmFtZSkpIHsKCiAgICAgICAgICAgIGlmICggICAgICAgICAgICAgICAgLyogZXhhY3QgbWF0Y2ggKi8KICAgICAgICAgICAgICAgICAgIChtY3AtPnRhZ19sZW4gPT0gMCAmJgogICAgICAgICAgICAgICAgICAgIChtY3AtPnRhZyA9PSBOVUxMIHx8CiAgICAgICAgICAgICAgICAgICAgICFsYWJlbF9jb21wYXJlKG1jcC0+dGFnLCBpZGVudGlmaWVyLT5sYWJlbCkpKSB8fAogICAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgICAqIHByZWZpeCBtYXRjaCAKICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgKG1jcC0+dGFnX2xlbiAhPSAwICYmCiAgICAgICAgICAgICAgICAgICAgIXN0cm5jbXAobWNwLT50YWcsIGlkZW50aWZpZXItPmxhYmVsLCBtY3AtPnRhZ19sZW4pKQogICAgICAgICAgICAgICAgKSB7CgogICAgICAgICAgICAgICAgaWYgKG5ldHNubXBfZHNfZ2V0X2ludChORVRTTk1QX0RTX0xJQlJBUllfSUQsIAoJCQkJICAgICAgIE5FVFNOTVBfRFNfTElCX01JQl9XQVJOSU5HUykpIHsKICAgICAgICAgICAgICAgICAgICBzbm1wX2xvZyhMT0dfV0FSTklORywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW1wb3J0aW5nICVzIGZyb20gcmVwbGFjZW1lbnQgbW9kdWxlICVzIGluc3RlYWQgb2YgJXMgKCVzKVxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudGlmaWVyLT5sYWJlbCwgbWNwLT5uZXdfbW9kdWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZF9tb2R1bGVfbmFtZSwgRmlsZSk7CgkJfQogICAgICAgICAgICAgICAgKHZvaWQpIG5ldHNubXBfcmVhZF9tb2R1bGUobWNwLT5uZXdfbW9kdWxlKTsKICAgICAgICAgICAgICAgIGlkZW50aWZpZXItPm1vZGlkID0gd2hpY2hfbW9kdWxlKG1jcC0+bmV3X21vZHVsZSk7CiAgICAgICAgICAgICAgICByZXR1cm4gMTsgICAgICAgICAvKiBmaW5pc2hlZCEgKi8KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAvKgogICAgICogSWYgbm8gZXhhY3QgbWF0Y2gsIGxvYWQgZXZlcnl0aGluZyByZWxldmFudAogICAgICovCiAgICByZXR1cm4gcmVhZF9tb2R1bGVfcmVwbGFjZW1lbnRzKG9sZF9tb2R1bGVfbmFtZSk7Cn0KCgovKgogKiAgUmVhZCBpbiB0aGUgbmFtZWQgbW9kdWxlCiAqICAgICAgUmV0dXJucyB0aGUgcm9vdCBvZiB0aGUgd2hvbGUgdHJlZQogKiAgICAgIChieSBhbmFsb2d5IHdpdGggJ3JlYWRfbWliJykKICovCnN0YXRpYyBpbnQKcmVhZF9tb2R1bGVfaW50ZXJuYWwoY29uc3QgY2hhciAqbmFtZSkKewogICAgc3RydWN0IG1vZHVsZSAgKm1wOwogICAgRklMRSAgICAgICAgICAgKmZwOwogICAgc3RydWN0IG5vZGUgICAgKm5wOwoKICAgIG5ldHNubXBfaW5pdF9taWJfaW50ZXJuYWxzKCk7CgogICAgZm9yIChtcCA9IG1vZHVsZV9oZWFkOyBtcDsgbXAgPSBtcC0+bmV4dCkKICAgICAgICBpZiAoIWxhYmVsX2NvbXBhcmUobXAtPm5hbWUsIG5hbWUpKSB7CiAgICAgICAgICAgIGNvbnN0IGNoYXIgICAgICpvbGRGaWxlID0gRmlsZTsKICAgICAgICAgICAgaW50ICAgICAgICAgICAgIG9sZExpbmUgPSBtaWJMaW5lOwogICAgICAgICAgICBpbnQgICAgICAgICAgICAgb2xkTW9kdWxlID0gY3VycmVudF9tb2R1bGU7CgogICAgICAgICAgICBpZiAobXAtPm5vX2ltcG9ydHMgIT0gLTEpIHsKICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJwYXJzZS1taWJzIiwgIk1vZHVsZSAlcyBhbHJlYWR5IGxvYWRlZFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUpKTsKICAgICAgICAgICAgICAgIHJldHVybiBNT0RVTEVfQUxSRUFEWV9MT0FERUQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKChmcCA9IGZvcGVuKG1wLT5maWxlLCAiciIpKSA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICBpbnQgcnZhbDsKICAgICAgICAgICAgICAgIGlmIChlcnJubyA9PSBFTk9URElSIHx8IGVycm5vID09IEVOT0VOVCkKICAgICAgICAgICAgICAgICAgICBydmFsID0gTU9EVUxFX05PVF9GT1VORDsKICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICBydmFsID0gTU9EVUxFX0xPQURfRkFJTEVEOwogICAgICAgICAgICAgICAgc25tcF9sb2dfcGVycm9yKG1wLT5maWxlKTsKICAgICAgICAgICAgICAgIHJldHVybiBydmFsOwogICAgICAgICAgICB9CiNpZmRlZiBIQVZFX0ZMT0NLRklMRQogICAgICAgICAgICBmbG9ja2ZpbGUoZnApOwojZW5kaWYKICAgICAgICAgICAgbXAtPm5vX2ltcG9ydHMgPSAwOyAvKiBOb3RlIHRoYXQgd2UndmUgcmVhZCB0aGUgZmlsZSAqLwogICAgICAgICAgICBGaWxlID0gbXAtPmZpbGU7CiAgICAgICAgICAgIG1pYkxpbmUgPSAxOwogICAgICAgICAgICBjdXJyZW50X21vZHVsZSA9IG1wLT5tb2RpZDsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogUGFyc2UgdGhlIGZpbGUKICAgICAgICAgICAgICovCiAgICAgICAgICAgIG5wID0gcGFyc2UoZnAsIE5VTEwpOwojaWZkZWYgSEFWRV9GVU5MT0NLRklMRQogICAgICAgICAgICBmdW5sb2NrZmlsZShmcCk7CiNlbmRpZgogICAgICAgICAgICBmY2xvc2UoZnApOwogICAgICAgICAgICBGaWxlID0gb2xkRmlsZTsKICAgICAgICAgICAgbWliTGluZSA9IG9sZExpbmU7CiAgICAgICAgICAgIGN1cnJlbnRfbW9kdWxlID0gb2xkTW9kdWxlOwogICAgICAgICAgICBpZiAoKG5wID09IE5VTEwpICYmIChnTWliRXJyb3IgPT0gTU9EVUxFX1NZTlRBWF9FUlJPUikgKQogICAgICAgICAgICAgICAgcmV0dXJuIE1PRFVMRV9TWU5UQVhfRVJST1I7CiAgICAgICAgICAgIHJldHVybiBNT0RVTEVfTE9BREVEX09LOwogICAgICAgIH0KCiAgICByZXR1cm4gTU9EVUxFX05PVF9GT1VORDsKfQoKdm9pZAphZG9wdF9vcnBoYW5zKHZvaWQpCnsKICAgIHN0cnVjdCBub2RlICAgICpucCwgKm9ucDsKICAgIHN0cnVjdCB0cmVlICAgICp0cDsKICAgIGludCAgICAgICAgICAgICBpLCBhZG9wdGVkID0gMTsKCiAgICBpZiAoIW9ycGhhbl9ub2RlcykKICAgICAgICByZXR1cm47CiAgICBpbml0X25vZGVfaGFzaChvcnBoYW5fbm9kZXMpOwogICAgb3JwaGFuX25vZGVzID0gTlVMTDsKCiAgICB3aGlsZSAoYWRvcHRlZCkgewogICAgICAgIGFkb3B0ZWQgPSAwOwogICAgICAgIGZvciAoaSA9IDA7IGkgPCBOSEFTSFNJWkU7IGkrKykKICAgICAgICAgICAgaWYgKG5idWNrZXRzW2ldKSB7CiAgICAgICAgICAgICAgICBmb3IgKG5wID0gbmJ1Y2tldHNbaV07IG5wICE9IE5VTEw7IG5wID0gbnAtPm5leHQpIHsKICAgICAgICAgICAgICAgICAgICB0cCA9IGZpbmRfdHJlZV9ub2RlKG5wLT5wYXJlbnQsIC0xKTsKCQkgICAgaWYgKHRwKSB7CgkJCWRvX3N1YnRyZWUodHAsICZucCk7CgkJCWFkb3B0ZWQgPSAxOwogICAgICAgICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAgICAgICAgKiBpZiBkb19zdWJ0cmVlIGFkb3B0ZWQgdGhlIGVudGlyZSBidWNrZXQsIHN0b3AKICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKE5VTEwgPT0gbmJ1Y2tldHNbaV0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICAgICAgICAqIGRvX3N1YnRyZWUgbWF5IG1vZGlmeSBuYnVja2V0cywgYW5kIGlmIG5wCiAgICAgICAgICAgICAgICAgICAgICAgICAqIHdhcyBhZG9wdGVkLCBucC0+bmV4dCBwcm9iYWJseSBpc24ndCBhbiBvcnBoYW4KICAgICAgICAgICAgICAgICAgICAgICAgICogYW55bW9yZS4gaWYgbnAgaXMgc3RpbGwgaW4gdGhlIGJ1Y2tldCAoZG9fc3VidHJlZQogICAgICAgICAgICAgICAgICAgICAgICAgKiBkaWRuJ3QgYWRvcHQgaXQpIGtlZXAgb24gcGx1Z2dpbmcuIG90aGVyd2lzZQogICAgICAgICAgICAgICAgICAgICAgICAgKiBzdGFydCBvdmVyLCBhdCB0aGUgdG9wIG9mIHRoZSBidWNrZXQuCiAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgICBmb3Iob25wID0gbmJ1Y2tldHNbaV07IG9ucDsgb25wID0gb25wLT5uZXh0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYob25wID09IG5wKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBpZihOVUxMID09IG9ucCkgeyAvKiBub3QgaW4gdGhlIGxpc3QgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5wID0gbmJ1Y2tldHNbaV07IC8qIHN0YXJ0IG92ZXIgKi8KICAgICAgICAgICAgICAgICAgICAgICAgfQoJCSAgICB9CgkJfQogICAgICAgICAgICB9CiAgICB9CgogICAgLyoKICAgICAqIFJlcG9ydCBvbiBvdXRzdGFuZGluZyBvcnBoYW5zCiAgICAgKiAgICBhbmQgbGluayB0aGVtIGJhY2sgaW50byB0aGUgb3JwaGFuIGxpc3QKICAgICAqLwogICAgZm9yIChpID0gMDsgaSA8IE5IQVNIU0laRTsgaSsrKQogICAgICAgIGlmIChuYnVja2V0c1tpXSkgewogICAgICAgICAgICBpZiAob3JwaGFuX25vZGVzKQogICAgICAgICAgICAgICAgb25wID0gbnAtPm5leHQgPSBuYnVja2V0c1tpXTsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgb25wID0gb3JwaGFuX25vZGVzID0gbmJ1Y2tldHNbaV07CiAgICAgICAgICAgIG5idWNrZXRzW2ldID0gTlVMTDsKICAgICAgICAgICAgd2hpbGUgKG9ucCkgewogICAgICAgICAgICAgICAgY2hhciAgICAgICAgICAgIG1vZGJ1ZlsyNTZdOwogICAgICAgICAgICAgICAgc25tcF9sb2coTE9HX1dBUk5JTkcsCiAgICAgICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IGFkb3B0IE9JRCBpbiAlczogJXMgOjo9IHsgJXMgJWxkIH1cbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVfbmFtZShvbnAtPm1vZGlkLCBtb2RidWYpLAogICAgICAgICAgICAgICAgICAgICAgICAgKG9ucC0+bGFiZWwgPyBvbnAtPmxhYmVsIDogIjxubyBsYWJlbD4iKSwKICAgICAgICAgICAgICAgICAgICAgICAgIChvbnAtPnBhcmVudCA/IG9ucC0+cGFyZW50IDogIjxubyBwYXJlbnQ+IiksCiAgICAgICAgICAgICAgICAgICAgICAgICBvbnAtPnN1YmlkKTsKCiAgICAgICAgICAgICAgICBucCA9IG9ucDsKICAgICAgICAgICAgICAgIG9ucCA9IG9ucC0+bmV4dDsKICAgICAgICAgICAgfQogICAgICAgIH0KfQoKI2lmbmRlZiBORVRTTk1QX05PX0xFR0FDWV9ERUZJTklUSU9OUwpzdHJ1Y3QgdHJlZSAgICAqCnJlYWRfbW9kdWxlKGNvbnN0IGNoYXIgKm5hbWUpCnsKICAgIHJldHVybiBuZXRzbm1wX3JlYWRfbW9kdWxlKG5hbWUpOwp9CiNlbmRpZgoKc3RydWN0IHRyZWUgICAgKgpuZXRzbm1wX3JlYWRfbW9kdWxlKGNvbnN0IGNoYXIgKm5hbWUpCnsKICAgIGludCBzdGF0dXMgPSAwOwogICAgc3RhdHVzID0gcmVhZF9tb2R1bGVfaW50ZXJuYWwobmFtZSk7CgogICAgaWYgKHN0YXR1cyA9PSBNT0RVTEVfTk9UX0ZPVU5EKSB7CiAgICAgICAgaWYgKCFyZWFkX21vZHVsZV9yZXBsYWNlbWVudHMobmFtZSkpCiAgICAgICAgICAgIHByaW50X21vZHVsZV9ub3RfZm91bmQobmFtZSk7CiAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PSBNT0RVTEVfU1lOVEFYX0VSUk9SKSB7CiAgICAgICAgZ01pYkVycm9yID0gMDsKICAgICAgICBnTG9vcCA9IDE7CgogICAgICAgIHN0cm5jYXQoZ01pYk5hbWVzLCAiICIsIHNpemVvZihnTWliTmFtZXMpIC0gc3RybGVuKGdNaWJOYW1lcykgLSAxKTsKICAgICAgICBzdHJuY2F0KGdNaWJOYW1lcywgbmFtZSwgc2l6ZW9mKGdNaWJOYW1lcykgLSBzdHJsZW4oZ01pYk5hbWVzKSAtIDEpOwogICAgfQoKICAgIHJldHVybiB0cmVlX2hlYWQ7Cn0KCi8qCiAqIFByb3RvdHlwZSBkZWZpbml0aW9uIAogKi8Kdm9pZCAgICAgICAgICAgIHVubG9hZF9tb2R1bGVfYnlfSUQoaW50IG1vZElELCBzdHJ1Y3QgdHJlZSAqdHJlZV90b3ApOwoKdm9pZAp1bmxvYWRfbW9kdWxlX2J5X0lEKGludCBtb2RJRCwgc3RydWN0IHRyZWUgKnRyZWVfdG9wKQp7CiAgICBzdHJ1Y3QgdHJlZSAgICAqdHAsICpuZXh0OwogICAgaW50ICAgICAgICAgICAgIGk7CgogICAgZm9yICh0cCA9IHRyZWVfdG9wOyB0cDsgdHAgPSBuZXh0KSB7CiAgICAgICAgLyoKICAgICAgICAgKiBFc3NlbnRpYWxseSwgdGhpcyBpcyBlcXVpdmFsZW50IHRvIHRoZSBjb2RlIGZyYWdtZW50OgogICAgICAgICAqICAgICAgaWYgKHRwLT5tb2RJRCA9PSBtb2RJRCkKICAgICAgICAgKiAgICAgICAgdHAtPm51bWJlcl9tb2R1bGVzLS07CiAgICAgICAgICogYnV0IGhhbmRsZXMgb25lIHRyZWUgbm9kZSBiZWluZyBwYXJ0IG9mIHNldmVyYWwgbW9kdWxlcywKICAgICAgICAgKiBhbmQgcG9zc2libGUgbXVsdGlwbGUgY29waWVzIG9mIHRoZSBzYW1lIG1vZHVsZSBJRC4KICAgICAgICAgKi8KICAgICAgICBpbnQgICAgICAgICAgICAgbm1vZCA9IHRwLT5udW1iZXJfbW9kdWxlczsKICAgICAgICBpZiAobm1vZCA+IDApIHsgICAgICAgICAvKiBpbiBzb21lIG1vZHVsZSAqLwogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBSZW1vdmUgYWxsIGNvcGllcyBvZiB0aGlzIG1vZHVsZSBJRAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgaW50ICAgICAgICAgICAgIGNudCA9IDAsICpwaTEsICpwaTIgPSB0cC0+bW9kdWxlX2xpc3Q7CiAgICAgICAgICAgIGZvciAoaSA9IDAsIHBpMSA9IHBpMjsgaSA8IG5tb2Q7IGkrKywgcGkyKyspIHsKICAgICAgICAgICAgICAgIGlmICgqcGkyID09IG1vZElEKQogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgY250Kys7CiAgICAgICAgICAgICAgICAqcGkxKysgPSAqcGkyOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChubW9kICE9IGNudCkgeyAgLyogaW4gdGhpcyBtb2R1bGUgKi8KICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiBpZiAoIChubW9kIC0gY250KSA+IDEpCiAgICAgICAgICAgICAgICAgKiBwcmludGYoIkR1cCBtb2RpZCAlZCwgICVkIHRpbWVzLCAnJXMnXG4iLCB0cC0+bW9kaWQsIChubW9kLWNudCksIHRwLT5sYWJlbCk7IGZmbHVzaChzdGRvdXQpOyA/KiBYWERFQlVHIAogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICB0cC0+bnVtYmVyX21vZHVsZXMgPSBjbnQ7CiAgICAgICAgICAgICAgICBzd2l0Y2ggKGNudCkgewogICAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgICAgIHRwLT5tb2R1bGVfbGlzdFswXSA9IC0xOyAgICAvKiBNYXJrIHVudXNlZCwgYW5kIEZBTEwgVEhST1VHSCAqLwoKICAgICAgICAgICAgICAgIGNhc2UgMTogICAgICAgIC8qIHNhdmUgdGhlIHJlbWFpbmluZyBtb2R1bGUgKi8KICAgICAgICAgICAgICAgICAgICBpZiAoJih0cC0+bW9kaWQpICE9IHRwLT5tb2R1bGVfbGlzdCkgewogICAgICAgICAgICAgICAgICAgICAgICB0cC0+bW9kaWQgPSB0cC0+bW9kdWxlX2xpc3RbMF07CiAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUodHAtPm1vZHVsZV9saXN0KTsKICAgICAgICAgICAgICAgICAgICAgICAgdHAtPm1vZHVsZV9saXN0ID0gJih0cC0+bW9kaWQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgIC8qIGlmIHRyZWUgbm9kZSBpcyBpbiB0aGlzIG1vZHVsZSAqLwogICAgICAgIH0KICAgICAgICAvKgogICAgICAgICAqIGlmIHRyZWUgbm9kZSBpcyBpbiBzb21lIG1vZHVsZSAKICAgICAgICAgKi8KICAgICAgICBuZXh0ID0gdHAtPm5leHRfcGVlcjsKCgogICAgICAgIC8qCiAgICAgICAgICogIE9LIC0gdGhhdCdzIGRlYWx0IHdpdGggKnRoaXMqIG5vZGUuCiAgICAgICAgICogICAgTm93IGxldCdzIGxvb2sgYXQgdGhlIGNoaWxkcmVuLgogICAgICAgICAqICAgIChJc24ndCByZWN1cnNpb24gd29uZGVyZnVsISkKICAgICAgICAgKi8KICAgICAgICBpZiAodHAtPmNoaWxkX2xpc3QpCiAgICAgICAgICAgIHVubG9hZF9tb2R1bGVfYnlfSUQobW9kSUQsIHRwLT5jaGlsZF9saXN0KTsKCgogICAgICAgIGlmICh0cC0+bnVtYmVyX21vZHVsZXMgPT0gMCkgewogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBUaGlzIG5vZGUgaXNuJ3QgbmVlZGVkIGFueSBtb3JlIChleGNlcHQgcGVyaGFwcwogICAgICAgICAgICAgKiBmb3IgdGhlIHNha2Ugb2YgdGhlIGNoaWxkcmVuKSAKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGlmICh0cC0+Y2hpbGRfbGlzdCA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICB1bmxpbmtfdHJlZSh0cCk7CiAgICAgICAgICAgICAgICBmcmVlX3RyZWUodHApOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZnJlZV9wYXJ0aWFsX3RyZWUodHAsIFRSVUUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9CgojaWZuZGVmIE5FVFNOTVBfTk9fTEVHQUNZX0RFRklOSVRJT05TCmludAp1bmxvYWRfbW9kdWxlKGNvbnN0IGNoYXIgKm5hbWUpCnsKICAgIHJldHVybiBuZXRzbm1wX3VubG9hZF9tb2R1bGUobmFtZSk7Cn0KI2VuZGlmCgppbnQKbmV0c25tcF91bmxvYWRfbW9kdWxlKGNvbnN0IGNoYXIgKm5hbWUpCnsKICAgIHN0cnVjdCBtb2R1bGUgICptcDsKICAgIGludCAgICAgICAgICAgICBtb2RJRCA9IC0xOwoKICAgIGZvciAobXAgPSBtb2R1bGVfaGVhZDsgbXA7IG1wID0gbXAtPm5leHQpCiAgICAgICAgaWYgKCFsYWJlbF9jb21wYXJlKG1wLT5uYW1lLCBuYW1lKSkgewogICAgICAgICAgICBtb2RJRCA9IG1wLT5tb2RpZDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQoKICAgIGlmIChtb2RJRCA9PSAtMSkgewogICAgICAgIERFQlVHTVNHVEwoKCJ1bmxvYWQtbWliIiwgIk1vZHVsZSAlcyBub3QgZm91bmQgdG8gdW5sb2FkXG4iLAogICAgICAgICAgICAgICAgICAgIG5hbWUpKTsKICAgICAgICByZXR1cm4gTU9EVUxFX05PVF9GT1VORDsKICAgIH0KICAgIHVubG9hZF9tb2R1bGVfYnlfSUQobW9kSUQsIHRyZWVfaGVhZCk7CiAgICBtcC0+bm9faW1wb3J0cyA9IC0xOyAgICAgICAgLyogbWFyayBhcyB1bmxvYWRlZCAqLwogICAgcmV0dXJuIE1PRFVMRV9MT0FERURfT0s7ICAgIC8qIFdlbGwsIHlvdSBrbm93IHdoYXQgSSBtZWFuISAqLwp9CgovKgogKiBDbGVhciBtb2R1bGUgbWFwLCB0cmVlIG5vZGVzLCB0ZXh0dWFsIGNvbnZlbnRpb24gdGFibGUuCiAqLwp2b2lkCnVubG9hZF9hbGxfbWlicyh2b2lkKQp7CiAgICBzdHJ1Y3QgbW9kdWxlICAqbXA7CiAgICBzdHJ1Y3QgbW9kdWxlX2NvbXBhdGFiaWxpdHkgKm1jcDsKICAgIHN0cnVjdCB0YyAgICAgICpwdGM7CiAgICB1bnNpZ25lZCBpbnQgICAgaTsKCiAgICBmb3IgKG1jcCA9IG1vZHVsZV9tYXBfaGVhZDsgbWNwOyBtY3AgPSBtb2R1bGVfbWFwX2hlYWQpIHsKICAgICAgICBpZiAobWNwID09IG1vZHVsZV9tYXApCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIG1vZHVsZV9tYXBfaGVhZCA9IG1jcC0+bmV4dDsKICAgICAgICBpZiAobWNwLT50YWcpIGZyZWUoTkVUU05NUF9SRU1PVkVfQ09OU1QoY2hhciAqLCBtY3AtPnRhZykpOwogICAgICAgIGZyZWUoTkVUU05NUF9SRU1PVkVfQ09OU1QoY2hhciAqLCBtY3AtPm9sZF9tb2R1bGUpKTsKICAgICAgICBmcmVlKE5FVFNOTVBfUkVNT1ZFX0NPTlNUKGNoYXIgKiwgbWNwLT5uZXdfbW9kdWxlKSk7CiAgICAgICAgZnJlZShtY3ApOwogICAgfQoKICAgIGZvciAobXAgPSBtb2R1bGVfaGVhZDsgbXA7IG1wID0gbW9kdWxlX2hlYWQpIHsKICAgICAgICBzdHJ1Y3QgbW9kdWxlX2ltcG9ydCAqbWkgPSBtcC0+aW1wb3J0czsKICAgICAgICBpZiAobWkpIHsKICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8ICh1bnNpZ25lZCBpbnQpbXAtPm5vX2ltcG9ydHM7ICsraSkgewogICAgICAgICAgICAgICAgU05NUF9GUkVFKChtaSArIGkpLT5sYWJlbCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbXAtPm5vX2ltcG9ydHMgPSAwOwogICAgICAgICAgICBpZiAobWkgPT0gcm9vdF9pbXBvcnRzKQogICAgICAgICAgICAgICAgbWVtc2V0KG1pLCAwLCBzaXplb2YoKm1pKSk7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIGZyZWUobWkpOwogICAgICAgIH0KCiAgICAgICAgdW5sb2FkX21vZHVsZV9ieV9JRChtcC0+bW9kaWQsIHRyZWVfaGVhZCk7CiAgICAgICAgbW9kdWxlX2hlYWQgPSBtcC0+bmV4dDsKICAgICAgICBmcmVlKG1wLT5uYW1lKTsKICAgICAgICBmcmVlKG1wLT5maWxlKTsKICAgICAgICBmcmVlKG1wKTsKICAgIH0KICAgIHVubG9hZF9tb2R1bGVfYnlfSUQoLTEsIHRyZWVfaGVhZCk7CiAgICAvKgogICAgICogdHJlZSBub2RlcyBhcmUgY2xlYXJlZCAKICAgICAqLwoKICAgIGZvciAoaSA9IDAsIHB0YyA9IHRjbGlzdDsgaSA8IE1BWFRDOyBpKyssIHB0YysrKSB7CiAgICAgICAgaWYgKHB0Yy0+dHlwZSA9PSAwKQogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICBmcmVlX2VudW1zKCZwdGMtPmVudW1zKTsKICAgICAgICBmcmVlX3JhbmdlcygmcHRjLT5yYW5nZXMpOwogICAgICAgIGZyZWUocHRjLT5kZXNjcmlwdG9yKTsKICAgICAgICBpZiAocHRjLT5oaW50KQogICAgICAgICAgICBmcmVlKHB0Yy0+aGludCk7CiAgICAgICAgaWYgKHB0Yy0+ZGVzY3JpcHRpb24pCiAgICAgICAgICAgIGZyZWUocHRjLT5kZXNjcmlwdGlvbik7CiAgICB9CiAgICBtZW1zZXQodGNsaXN0LCAwLCBNQVhUQyAqIHNpemVvZihzdHJ1Y3QgdGMpKTsKCiAgICBtZW1zZXQoYnVja2V0cywgMCwgc2l6ZW9mKGJ1Y2tldHMpKTsKICAgIG1lbXNldChuYnVja2V0cywgMCwgc2l6ZW9mKG5idWNrZXRzKSk7CiAgICBtZW1zZXQodGJ1Y2tldHMsIDAsIHNpemVvZih0YnVja2V0cykpOwoKICAgIGZvciAoaSA9IDA7IGkgPCBzaXplb2Yocm9vdF9pbXBvcnRzKSAvIHNpemVvZihyb290X2ltcG9ydHNbMF0pOyBpKyspIHsKICAgICAgICBTTk1QX0ZSRUUocm9vdF9pbXBvcnRzW2ldLmxhYmVsKTsKICAgIH0KCiAgICBtYXhfbW9kdWxlID0gMDsKICAgIGN1cnJlbnRfbW9kdWxlID0gMDsKICAgIG1vZHVsZV9tYXBfaGVhZCA9IE5VTEw7CiAgICBTTk1QX0ZSRUUobGFzdF9lcnJfbW9kdWxlKTsKfQoKc3RhdGljIHZvaWQKbmV3X21vZHVsZShjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpmaWxlKQp7CiAgICBzdHJ1Y3QgbW9kdWxlICAqbXA7CgogICAgZm9yIChtcCA9IG1vZHVsZV9oZWFkOyBtcDsgbXAgPSBtcC0+bmV4dCkKICAgICAgICBpZiAoIWxhYmVsX2NvbXBhcmUobXAtPm5hbWUsIG5hbWUpKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJwYXJzZS1taWJzIiwgIiAgTW9kdWxlICVzIGFscmVhZHkgbm90ZWRcbiIsIG5hbWUpKTsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogTm90IHRoZSBzYW1lIGZpbGUgCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBpZiAobGFiZWxfY29tcGFyZShtcC0+ZmlsZSwgZmlsZSkpIHsKICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJwYXJzZS1taWJzIiwgIiAgICAlcyBpcyBub3cgaW4gJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBmaWxlKSk7CiAgICAgICAgICAgICAgICBpZiAobmV0c25tcF9kc19nZXRfaW50KE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgCgkJCQkgICAgICAgTkVUU05NUF9EU19MSUJfTUlCX1dBUk5JTkdTKSkgewogICAgICAgICAgICAgICAgICAgIHNubXBfbG9nKExPR19XQVJOSU5HLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJXYXJuaW5nOiBNb2R1bGUgJXMgd2FzIGluICVzIG5vdyBpcyAlc1xuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBtcC0+ZmlsZSwgZmlsZSk7CgkJfQoKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiBVc2UgdGhlIG5ldyBvbmUgaW4gcHJlZmVyZW5jZSAKICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgZnJlZShtcC0+ZmlsZSk7CiAgICAgICAgICAgICAgICBtcC0+ZmlsZSA9IHN0cmR1cChmaWxlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgIC8qCiAgICAgKiBBZGQgdGhpcyBtb2R1bGUgdG8gdGhlIGxpc3QgCiAgICAgKi8KICAgIERFQlVHTVNHVEwoKCJwYXJzZS1taWJzIiwgIiAgTW9kdWxlICVkICVzIGlzIGluICVzXG4iLCBtYXhfbW9kdWxlLAogICAgICAgICAgICAgICAgbmFtZSwgZmlsZSkpOwogICAgbXAgPSAoc3RydWN0IG1vZHVsZSAqKSBjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBtb2R1bGUpKTsKICAgIGlmIChtcCA9PSBOVUxMKQogICAgICAgIHJldHVybjsKICAgIG1wLT5uYW1lID0gc3RyZHVwKG5hbWUpOwogICAgbXAtPmZpbGUgPSBzdHJkdXAoZmlsZSk7CiAgICBtcC0+aW1wb3J0cyA9IE5VTEw7CiAgICBtcC0+bm9faW1wb3J0cyA9IC0xOyAgICAgICAgLyogTm90IHlldCBsb2FkZWQgKi8KICAgIG1wLT5tb2RpZCA9IG1heF9tb2R1bGU7CiAgICArK21heF9tb2R1bGU7CgogICAgbXAtPm5leHQgPSBtb2R1bGVfaGVhZDsgICAgIC8qIE9yIGFkZCB0byB0aGUgKmVuZCogb2YgdGhlIGxpc3Q/ICovCiAgICBtb2R1bGVfaGVhZCA9IG1wOwp9CgoKc3RhdGljIHZvaWQKc2Nhbl9vYmpsaXN0KHN0cnVjdCBub2RlICpyb290LCBzdHJ1Y3QgbW9kdWxlICptcCwgc3RydWN0IG9iamdyb3VwICpsaXN0LCBjb25zdCBjaGFyICplcnJvcikKewogICAgaW50ICAgICAgICAgICAgIG9MaW5lID0gbWliTGluZTsKCiAgICB3aGlsZSAobGlzdCkgewogICAgICAgIHN0cnVjdCBvYmpncm91cCAqZ3AgPSBsaXN0OwogICAgICAgIHN0cnVjdCBub2RlICAgICpucDsKICAgICAgICBsaXN0ID0gbGlzdC0+bmV4dDsKICAgICAgICBucCA9IHJvb3Q7CiAgICAgICAgd2hpbGUgKG5wKQogICAgICAgICAgICBpZiAobGFiZWxfY29tcGFyZShucC0+bGFiZWwsIGdwLT5uYW1lKSkKICAgICAgICAgICAgICAgIG5wID0gbnAtPm5leHQ7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGlmICghbnApIHsKCSAgICBpbnQgaTsKCSAgICBzdHJ1Y3QgbW9kdWxlX2ltcG9ydCAqbWlwOwoJICAgIC8qIGlmIG5vdCBsb2NhbCwgY2hlY2sgaWYgaXQgd2FzIElNUE9SVGVkICovCgkgICAgZm9yIChpID0gMCwgbWlwID0gbXAtPmltcG9ydHM7IGkgPCBtcC0+bm9faW1wb3J0czsgaSsrLCBtaXArKykKCQlpZiAoc3RyY21wKG1pcC0+bGFiZWwsIGdwLT5uYW1lKSA9PSAwKQoJCSAgICBicmVhazsKCSAgICBpZiAoaSA9PSBtcC0+bm9faW1wb3J0cykgewoJCW1pYkxpbmUgPSBncC0+bGluZTsKCQlwcmludF9lcnJvcihlcnJvciwgZ3AtPm5hbWUsIFFVT1RFU1RSSU5HKTsKCSAgICB9CiAgICAgICAgfQogICAgICAgIGZyZWUoZ3AtPm5hbWUpOwogICAgICAgIGZyZWUoZ3ApOwogICAgfQogICAgbWliTGluZSA9IG9MaW5lOwp9CgovKgogKiBQYXJzZXMgYSBtaWIgZmlsZSBhbmQgcmV0dXJucyBhIGxpbmtlZCBsaXN0IG9mIG5vZGVzIGZvdW5kIGluIHRoZSBmaWxlLgogKiBSZXR1cm5zIE5VTEwgb24gZXJyb3IuCiAqLwpzdGF0aWMgc3RydWN0IG5vZGUgKgpwYXJzZShGSUxFICogZnAsIHN0cnVjdCBub2RlICpyb290KQp7CiNpZmRlZiBURVNUCiAgICBleHRlcm4gdm9pZCAgICAgeG1hbGxvY19zdGF0cyhGSUxFICopOwojZW5kaWYKICAgIGNoYXIgICAgICAgICAgICB0b2tlbltNQVhUT0tFTl07CiAgICBjaGFyICAgICAgICAgICAgbmFtZVtNQVhUT0tFTisxXTsKICAgIGludCAgICAgICAgICAgICB0eXBlID0gTEFCRUw7CiAgICBpbnQgICAgICAgICAgICAgbGFzdHR5cGUgPSBMQUJFTDsKCiNkZWZpbmUgQkVUV0VFTl9NSUJTICAgICAgICAgIDEKI2RlZmluZSBJTl9NSUIgICAgICAgICAgICAgICAgMgogICAgaW50ICAgICAgICAgICAgIHN0YXRlID0gQkVUV0VFTl9NSUJTOwogICAgc3RydWN0IG5vZGUgICAgKm5wLCAqbm5wOwogICAgc3RydWN0IG9iamdyb3VwICpvbGRncm91cHMgPSBOVUxMLCAqb2xkb2JqZWN0cyA9IE5VTEwsICpvbGRub3RpZnMgPQogICAgICAgIE5VTEw7CgogICAgREVCVUdNU0dUTCgoInBhcnNlLWZpbGUiLCAiUGFyc2luZyBmaWxlOiAgJXMuLi5cbiIsIEZpbGUpKTsKCiAgICBpZiAobGFzdF9lcnJfbW9kdWxlKQogICAgICAgIGZyZWUobGFzdF9lcnJfbW9kdWxlKTsKICAgIGxhc3RfZXJyX21vZHVsZSA9IE5VTEw7CgogICAgbnAgPSByb290OwogICAgaWYgKG5wICE9IE5VTEwpIHsKICAgICAgICAvKgogICAgICAgICAqIG5vdyBmaW5kIGVuZCBvZiBjaGFpbiAKICAgICAgICAgKi8KICAgICAgICB3aGlsZSAobnAtPm5leHQpCiAgICAgICAgICAgIG5wID0gbnAtPm5leHQ7CiAgICB9CgogICAgd2hpbGUgKHR5cGUgIT0gRU5ET0ZGSUxFKSB7CiAgICAgICAgaWYgKGxhc3R0eXBlID09IENPTlRJTlVFKQogICAgICAgICAgICBsYXN0dHlwZSA9IHR5cGU7CiAgICAgICAgZWxzZQogICAgICAgICAgICB0eXBlID0gbGFzdHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CgogICAgICAgIHN3aXRjaCAodHlwZSkgewogICAgICAgIGNhc2UgRU5EOgogICAgICAgICAgICBpZiAoc3RhdGUgIT0gSU5fTUlCKSB7CiAgICAgICAgICAgICAgICBwcmludF9lcnJvcigiRXJyb3IsIEVORCBiZWZvcmUgc3RhcnQgb2YgTUlCIiwgTlVMTCwgdHlwZSk7CiAgICAgICAgICAgICAgICBnTWliRXJyb3IgPSBNT0RVTEVfU1lOVEFYX0VSUk9SOwogICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBzdHJ1Y3QgbW9kdWxlICAqbXA7CiNpZmRlZiBURVNUCiAgICAgICAgICAgICAgICBwcmludGYoIlxuTm9kZXMgZm9yIE1vZHVsZSAlczpcbiIsIG5hbWUpOwogICAgICAgICAgICAgICAgcHJpbnRfbm9kZXMoc3Rkb3V0LCByb290KTsKI2VuZGlmCiAgICAgICAgICAgICAgICBmb3IgKG1wID0gbW9kdWxlX2hlYWQ7IG1wOyBtcCA9IG1wLT5uZXh0KQogICAgICAgICAgICAgICAgICAgIGlmIChtcC0+bW9kaWQgPT0gY3VycmVudF9tb2R1bGUpCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgc2Nhbl9vYmpsaXN0KHJvb3QsIG1wLCBvYmpncm91cHMsICJVbmRlZmluZWQgT0JKRUNULUdST1VQIik7CiAgICAgICAgICAgICAgICBzY2FuX29iamxpc3Qocm9vdCwgbXAsIG9iamVjdHMsICJVbmRlZmluZWQgT0JKRUNUIik7CiAgICAgICAgICAgICAgICBzY2FuX29iamxpc3Qocm9vdCwgbXAsIG5vdGlmcywgIlVuZGVmaW5lZCBOT1RJRklDQVRJT04iKTsKICAgICAgICAgICAgICAgIG9iamdyb3VwcyA9IG9sZGdyb3VwczsKICAgICAgICAgICAgICAgIG9iamVjdHMgPSBvbGRvYmplY3RzOwogICAgICAgICAgICAgICAgbm90aWZzID0gb2xkbm90aWZzOwogICAgICAgICAgICAgICAgZG9fbGlua3VwKG1wLCByb290KTsKICAgICAgICAgICAgICAgIG5wID0gcm9vdCA9IE5VTEw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3RhdGUgPSBCRVRXRUVOX01JQlM7CiNpZmRlZiBURVNUCiAgICAgICAgICAgIGlmIChuZXRzbm1wX2RzX2dldF9pbnQoTkVUU05NUF9EU19MSUJSQVJZX0lELCAKCQkJCSAgIE5FVFNOTVBfRFNfTElCX01JQl9XQVJOSU5HUykpIHsKICAgICAgICAgICAgICAgIC8qIHhtYWxsb2Nfc3RhdHMoc3RkZXJyKTsgKi8KCSAgICB9CiNlbmRpZgogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICBjYXNlIElNUE9SVFM6CiAgICAgICAgICAgIHBhcnNlX2ltcG9ydHMoZnApOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICBjYXNlIEVYUE9SVFM6CiAgICAgICAgICAgIHdoaWxlICh0eXBlICE9IFNFTUkgJiYgdHlwZSAhPSBFTkRPRkZJTEUpCiAgICAgICAgICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICBjYXNlIExBQkVMOgogICAgICAgIGNhc2UgSU5URUdFUjoKICAgICAgICBjYXNlIElOVEVHRVIzMjoKICAgICAgICBjYXNlIFVJTlRFR0VSMzI6CiAgICAgICAgY2FzZSBVTlNJR05FRDMyOgogICAgICAgIGNhc2UgQ09VTlRFUjoKICAgICAgICBjYXNlIENPVU5URVI2NDoKICAgICAgICBjYXNlIEdBVUdFOgogICAgICAgIGNhc2UgSVBBRERSOgogICAgICAgIGNhc2UgTkVUQUREUjoKICAgICAgICBjYXNlIE5TQVBBRERSRVNTOgogICAgICAgIGNhc2UgT0JKU1lOVEFYOgogICAgICAgIGNhc2UgQVBQU1lOVEFYOgogICAgICAgIGNhc2UgU0lNUExFU1lOVEFYOgogICAgICAgIGNhc2UgT0JKTkFNRToKICAgICAgICBjYXNlIE5PVElGTkFNRToKICAgICAgICBjYXNlIEtXX09QQVFVRToKICAgICAgICBjYXNlIFRJTUVUSUNLUzoKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBFTkRPRkZJTEU6CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHN0cmxjcHkobmFtZSwgdG9rZW4sIHNpemVvZihuYW1lKSk7CiAgICAgICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgICAgIG5ucCA9IE5VTEw7CiAgICAgICAgICAgIGlmICh0eXBlID09IE1BQ1JPKSB7CiAgICAgICAgICAgICAgICBubnAgPSBwYXJzZV9tYWNybyhmcCwgbmFtZSk7CiAgICAgICAgICAgICAgICBpZiAobm5wID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICBwcmludF9lcnJvcigiQmFkIHBhcnNlIG9mIE1BQ1JPIiwgTlVMTCwgdHlwZSk7CiAgICAgICAgICAgICAgICAgICAgZ01pYkVycm9yID0gTU9EVUxFX1NZTlRBWF9FUlJPUjsKICAgICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAgICAqIHJldHVybiBOVUxMOwogICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnJlZV9ub2RlKG5ucCk7IC8qIElHTk9SRSAqLwogICAgICAgICAgICAgICAgbm5wID0gTlVMTDsKICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICBwcmludF9lcnJvcihuYW1lLCAiaXMgYSByZXNlcnZlZCB3b3JkIiwgbGFzdHR5cGUpOwogICAgICAgICAgICBjb250aW51ZTsgICAgICAgICAgIC8qIHNlZSBpZiB3ZSBjYW4gcGFyc2UgdGhlIHJlc3Qgb2YgdGhlIGZpbGUgKi8KICAgICAgICB9CiAgICAgICAgc3RybGNweShuYW1lLCB0b2tlbiwgc2l6ZW9mKG5hbWUpKTsKICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgIG5ucCA9IE5VTEw7CgogICAgICAgIC8qCiAgICAgICAgICogSGFuZGxlIG9ic29sZXRlIG1ldGhvZCB0byBhc3NpZ24gYW4gb2JqZWN0IGlkZW50aWZpZXIgdG8gYQogICAgICAgICAqIG1vZHVsZQogICAgICAgICAqLwogICAgICAgIGlmIChsYXN0dHlwZSA9PSBMQUJFTCAmJiB0eXBlID09IExFRlRCUkFDS0VUKSB7CiAgICAgICAgICAgIHdoaWxlICh0eXBlICE9IFJJR0hUQlJBQ0tFVCAmJiB0eXBlICE9IEVORE9GRklMRSkKICAgICAgICAgICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgICAgIGlmICh0eXBlID09IEVORE9GRklMRSkgewogICAgICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkV4cGVjdGVkIFwifVwiIiwgdG9rZW4sIHR5cGUpOwogICAgICAgICAgICAgICAgZ01pYkVycm9yID0gTU9EVUxFX1NZTlRBWF9FUlJPUjsKICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CiAgICAgICAgfQoKICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKICAgICAgICBjYXNlIERFRklOSVRJT05TOgogICAgICAgICAgICBpZiAoc3RhdGUgIT0gQkVUV0VFTl9NSUJTKSB7CiAgICAgICAgICAgICAgICBwcmludF9lcnJvcigiRXJyb3IsIG5lc3RlZCBNSUJTIiwgTlVMTCwgdHlwZSk7CiAgICAgICAgICAgICAgICBnTWliRXJyb3IgPSBNT0RVTEVfU1lOVEFYX0VSUk9SOwogICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3RhdGUgPSBJTl9NSUI7CiAgICAgICAgICAgIGN1cnJlbnRfbW9kdWxlID0gd2hpY2hfbW9kdWxlKG5hbWUpOwogICAgICAgICAgICBvbGRncm91cHMgPSBvYmpncm91cHM7CiAgICAgICAgICAgIG9iamdyb3VwcyA9IE5VTEw7CiAgICAgICAgICAgIG9sZG9iamVjdHMgPSBvYmplY3RzOwogICAgICAgICAgICBvYmplY3RzID0gTlVMTDsKICAgICAgICAgICAgb2xkbm90aWZzID0gbm90aWZzOwogICAgICAgICAgICBub3RpZnMgPSBOVUxMOwogICAgICAgICAgICBpZiAoY3VycmVudF9tb2R1bGUgPT0gLTEpIHsKICAgICAgICAgICAgICAgIG5ld19tb2R1bGUobmFtZSwgRmlsZSk7CiAgICAgICAgICAgICAgICBjdXJyZW50X21vZHVsZSA9IHdoaWNoX21vZHVsZShuYW1lKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBERUJVR01TR1RMKCgicGFyc2UtbWlicyIsICJQYXJzaW5nIE1JQjogJWQgJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfbW9kdWxlLCBuYW1lKSk7CiAgICAgICAgICAgIHdoaWxlICgodHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKSkgIT0gRU5ET0ZGSUxFKQogICAgICAgICAgICAgICAgaWYgKHR5cGUgPT0gQkVHSU4pCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgT0JKVFlQRToKICAgICAgICAgICAgbm5wID0gcGFyc2Vfb2JqZWN0dHlwZShmcCwgbmFtZSk7CiAgICAgICAgICAgIGlmIChubnAgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkJhZCBwYXJzZSBvZiBPQkpFQ1QtVFlQRSIsIE5VTEwsIHR5cGUpOwogICAgICAgICAgICAgICAgZ01pYkVycm9yID0gTU9EVUxFX1NZTlRBWF9FUlJPUjsKICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgT0JKR1JPVVA6CiAgICAgICAgICAgIG5ucCA9IHBhcnNlX29iamVjdGdyb3VwKGZwLCBuYW1lLCBPQkpFQ1RTLCAmb2JqZWN0cyk7CiAgICAgICAgICAgIGlmIChubnAgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgcHJpbnRfZXJyb3IoIkJhZCBwYXJzZSBvZiBPQkpFQ1QtR1JPVVAiLCBOVUxMLCB0eXBlKTsKICAgICAgICAgICAgICAgIGdNaWJFcnJvciA9IE1PRFVMRV9TWU5UQVhfRVJST1I7CiAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIE5PVElGR1JPVVA6CiAgICAgICAgICAgIG5ucCA9IHBhcnNlX29iamVjdGdyb3VwKGZwLCBuYW1lLCBOT1RJRklDQVRJT05TLCAmbm90aWZzKTsKICAgICAgICAgICAgaWYgKG5ucCA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICBwcmludF9lcnJvcigiQmFkIHBhcnNlIG9mIE5PVElGSUNBVElPTi1HUk9VUCIsIE5VTEwsIHR5cGUpOwogICAgICAgICAgICAgICAgZ01pYkVycm9yID0gTU9EVUxFX1NZTlRBWF9FUlJPUjsKICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVFJBUFRZUEU6CiAgICAgICAgICAgIG5ucCA9IHBhcnNlX3RyYXBEZWZpbml0aW9uKGZwLCBuYW1lKTsKICAgICAgICAgICAgaWYgKG5ucCA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICBwcmludF9lcnJvcigiQmFkIHBhcnNlIG9mIFRSQVAtVFlQRSIsIE5VTEwsIHR5cGUpOwogICAgICAgICAgICAgICAgZ01pYkVycm9yID0gTU9EVUxFX1NZTlRBWF9FUlJPUjsKICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgTk9USUZUWVBFOgogICAgICAgICAgICBubnAgPSBwYXJzZV9ub3RpZmljYXRpb25EZWZpbml0aW9uKGZwLCBuYW1lKTsKICAgICAgICAgICAgaWYgKG5ucCA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICBwcmludF9lcnJvcigiQmFkIHBhcnNlIG9mIE5PVElGSUNBVElPTi1UWVBFIiwgTlVMTCwgdHlwZSk7CiAgICAgICAgICAgICAgICBnTWliRXJyb3IgPSBNT0RVTEVfU1lOVEFYX0VSUk9SOwogICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBDT01QTElBTkNFOgogICAgICAgICAgICBubnAgPSBwYXJzZV9jb21wbGlhbmNlKGZwLCBuYW1lKTsKICAgICAgICAgICAgaWYgKG5ucCA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICBwcmludF9lcnJvcigiQmFkIHBhcnNlIG9mIE1PRFVMRS1DT01QTElBTkNFIiwgTlVMTCwgdHlwZSk7CiAgICAgICAgICAgICAgICBnTWliRXJyb3IgPSBNT0RVTEVfU1lOVEFYX0VSUk9SOwogICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBBR0VOVENBUDoKICAgICAgICAgICAgbm5wID0gcGFyc2VfY2FwYWJpbGl0aWVzKGZwLCBuYW1lKTsKICAgICAgICAgICAgaWYgKG5ucCA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICBwcmludF9lcnJvcigiQmFkIHBhcnNlIG9mIEFHRU5ULUNBUEFCSUxJVElFUyIsIE5VTEwsIHR5cGUpOwogICAgICAgICAgICAgICAgZ01pYkVycm9yID0gTU9EVUxFX1NZTlRBWF9FUlJPUjsKICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgTUFDUk86CiAgICAgICAgICAgIG5ucCA9IHBhcnNlX21hY3JvKGZwLCBuYW1lKTsKICAgICAgICAgICAgaWYgKG5ucCA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICBwcmludF9lcnJvcigiQmFkIHBhcnNlIG9mIE1BQ1JPIiwgTlVMTCwgdHlwZSk7CiAgICAgICAgICAgICAgICBnTWliRXJyb3IgPSBNT0RVTEVfU1lOVEFYX0VSUk9SOwogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIHJldHVybiBOVUxMOwogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnJlZV9ub2RlKG5ucCk7ICAgICAvKiBJR05PUkUgKi8KICAgICAgICAgICAgbm5wID0gTlVMTDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBNT0RVTEVJREVOVElUWToKICAgICAgICAgICAgbm5wID0gcGFyc2VfbW9kdWxlSWRlbnRpdHkoZnAsIG5hbWUpOwogICAgICAgICAgICBpZiAobm5wID09IE5VTEwpIHsKICAgICAgICAgICAgICAgIHByaW50X2Vycm9yKCJCYWQgcGFyc2Ugb2YgTU9EVUxFLUlERU5USVRZIiwgTlVMTCwgdHlwZSk7CiAgICAgICAgICAgICAgICBnTWliRXJyb3IgPSBNT0RVTEVfU1lOVEFYX0VSUk9SOwogICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBPQkpJREVOVElUWToKICAgICAgICAgICAgbm5wID0gcGFyc2Vfb2JqZWN0Z3JvdXAoZnAsIG5hbWUsIE9CSkVDVFMsICZvYmplY3RzKTsKICAgICAgICAgICAgaWYgKG5ucCA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICBwcmludF9lcnJvcigiQmFkIHBhcnNlIG9mIE9CSkVDVC1JREVOVElUWSIsIE5VTEwsIHR5cGUpOwogICAgICAgICAgICAgICAgZ01pYkVycm9yID0gTU9EVUxFX1NZTlRBWF9FUlJPUjsKICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgT0JKRUNUOgogICAgICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgICAgICBpZiAodHlwZSAhPSBJREVOVElGSUVSKSB7CiAgICAgICAgICAgICAgICBwcmludF9lcnJvcigiRXhwZWN0ZWQgSURFTlRJRklFUiIsIHRva2VuLCB0eXBlKTsKICAgICAgICAgICAgICAgIGdNaWJFcnJvciA9IE1PRFVMRV9TWU5UQVhfRVJST1I7CiAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgfQogICAgICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgICAgICBpZiAodHlwZSAhPSBFUVVBTFMpIHsKICAgICAgICAgICAgICAgIHByaW50X2Vycm9yKCJFeHBlY3RlZCBcIjo6PVwiIiwgdG9rZW4sIHR5cGUpOwogICAgICAgICAgICAgICAgZ01pYkVycm9yID0gTU9EVUxFX1NZTlRBWF9FUlJPUjsKICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG5ucCA9IHBhcnNlX29iamVjdGlkKGZwLCBuYW1lKTsKICAgICAgICAgICAgaWYgKG5ucCA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICBwcmludF9lcnJvcigiQmFkIHBhcnNlIG9mIE9CSkVDVCBJREVOVElGSUVSIiwgTlVMTCwgdHlwZSk7CiAgICAgICAgICAgICAgICBnTWliRXJyb3IgPSBNT0RVTEVfU1lOVEFYX0VSUk9SOwogICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBFUVVBTFM6CiAgICAgICAgICAgIG5ucCA9IHBhcnNlX2FzbnR5cGUoZnAsIG5hbWUsICZ0eXBlLCB0b2tlbik7CiAgICAgICAgICAgIGxhc3R0eXBlID0gQ09OVElOVUU7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgRU5ET0ZGSUxFOgogICAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBwcmludF9lcnJvcigiQmFkIG9wZXJhdG9yIiwgdG9rZW4sIHR5cGUpOwogICAgICAgICAgICBnTWliRXJyb3IgPSBNT0RVTEVfU1lOVEFYX0VSUk9SOwogICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICB9CiAgICAgICAgaWYgKG5ucCkgewogICAgICAgICAgICBpZiAobnApCiAgICAgICAgICAgICAgICBucC0+bmV4dCA9IG5ucDsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgbnAgPSByb290ID0gbm5wOwogICAgICAgICAgICB3aGlsZSAobnAtPm5leHQpCiAgICAgICAgICAgICAgICBucCA9IG5wLT5uZXh0OwogICAgICAgICAgICBpZiAobnAtPnR5cGUgPT0gVFlQRV9PVEhFUikKICAgICAgICAgICAgICAgIG5wLT50eXBlID0gdHlwZTsKICAgICAgICB9CiAgICB9CiAgICBERUJVR01TR1RMKCgicGFyc2UtZmlsZSIsICJFbmQgb2YgZmlsZSAoJXMpXG4iLCBGaWxlKSk7CiAgICByZXR1cm4gcm9vdDsKfQoKLyoKICogcmV0dXJuIHplcm8gaWYgY2hhcmFjdGVyIGlzIG5vdCBhIGxhYmVsIGNoYXJhY3Rlci4gCiAqLwpzdGF0aWMgaW50CmlzX2xhYmVsY2hhcihpbnQgaWNoKQp7CiAgICBpZiAoKGlzYWxudW0oaWNoKSkgfHwgKGljaCA9PSAnLScpKQogICAgICAgIHJldHVybiAxOwogICAgaWYgKGljaCA9PSAnXycgJiYgbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIAoJCQkJCSAgICAgTkVUU05NUF9EU19MSUJfTUlCX1BBUlNFX0xBQkVMKSkgewogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgIHJldHVybiAwOwp9CgovKioKICogUmVhZCBhIHNpbmdsZSBjaGFyYWN0ZXIgZnJvbSBhIGZpbGUuIEFzc3VtZXMgdGhhdCB0aGUgY2FsbGVyIGhhcyBpbnZva2VkCiAqIGZsb2NrZmlsZSgpLiBVc2VzIGZnZXRjX3VubG9ja2VkKCkgaW5zdGVhZCBvZiBnZXRjKCkgc2luY2UgdGhlIGZvcm1lciBpcwogKiBpbXBsZW1lbnRlZCBhcyBhbiBpbmxpbmUgZnVuY3Rpb24gaW4gZ2xpYmMuIFNlZSBhbHNvIGJ1ZyAzNDQ3MTk2CiAqIChodHRwOi8vc291cmNlZm9yZ2UubmV0L3RyYWNrZXIvP2Z1bmM9ZGV0YWlsJmFpZD0zNDQ3MTk2Jmdyb3VwX2lkPTEyNjk0JmF0aWQ9MTEyNjk0KS4KICovCnN0YXRpYyBpbnQgbmV0c25tcF9nZXRjKEZJTEUgKnN0cmVhbSkKewojaWZkZWYgSEFWRV9GR0VUQ19VTkxPQ0tFRAogICAgcmV0dXJuIGZnZXRjX3VubG9ja2VkKHN0cmVhbSk7CiNlbHNlCiAgICByZXR1cm4gZ2V0YyhzdHJlYW0pOwojZW5kaWYKfQoKLyoKICogUGFyc2VzIGEgdG9rZW4gZnJvbSB0aGUgZmlsZS4gIFRoZSB0eXBlIG9mIHRoZSB0b2tlbiBwYXJzZWQgaXMgcmV0dXJuZWQsCiAqIGFuZCB0aGUgdGV4dCBpcyBwbGFjZWQgaW4gdGhlIHN0cmluZyBwb2ludGVkIHRvIGJ5IHRva2VuLgogKiBXYXJuaW5nOiB0aGlzIG1ldGhvZCBtYXkgcmVjdXJzZS4KICovCnN0YXRpYyBpbnQKZ2V0X3Rva2VuKEZJTEUgKiBmcCwgY2hhciAqdG9rZW4sIGludCBtYXh0bGVuKQp7CiAgICByZWdpc3RlciBpbnQgICAgY2gsIGNoX25leHQ7CiAgICByZWdpc3RlciBjaGFyICAqY3AgPSB0b2tlbjsKICAgIHJlZ2lzdGVyIGludCAgICBoYXNoID0gMDsKICAgIHJlZ2lzdGVyIHN0cnVjdCB0b2sgKnRwOwogICAgaW50ICAgICAgICAgICAgIHRvb19sb25nID0gMDsKICAgIGVudW0geyBiZGlnaXRzLCB4ZGlnaXRzLCBvdGhlciB9IHNlZW5TeW1ib2xzOwoKICAgIC8qCiAgICAgKiBza2lwIGFsbCB3aGl0ZSBzcGFjZSAKICAgICAqLwogICAgZG8gewogICAgICAgIGNoID0gbmV0c25tcF9nZXRjKGZwKTsKICAgICAgICBpZiAoY2ggPT0gJ1xuJykKICAgICAgICAgICAgbWliTGluZSsrOwogICAgfQogICAgd2hpbGUgKGlzc3BhY2UoY2gpICYmIGNoICE9IEVPRik7CiAgICAqY3ArKyA9IGNoOwogICAgKmNwID0gJ1wwJzsKICAgIHN3aXRjaCAoY2gpIHsKICAgIGNhc2UgRU9GOgogICAgICAgIHJldHVybiBFTkRPRkZJTEU7CiAgICBjYXNlICciJzoKICAgICAgICByZXR1cm4gcGFyc2VRdW90ZVN0cmluZyhmcCwgdG9rZW4sIG1heHRsZW4pOwogICAgY2FzZSAnXCcnOiAgICAgICAgICAgICAgICAgLyogYmluYXJ5IG9yIGhleCBjb25zdGFudCAqLwogICAgICAgIHNlZW5TeW1ib2xzID0gYmRpZ2l0czsKICAgICAgICB3aGlsZSAoKGNoID0gbmV0c25tcF9nZXRjKGZwKSkgIT0gRU9GICYmIGNoICE9ICdcJycpIHsKICAgICAgICAgICAgc3dpdGNoIChzZWVuU3ltYm9scykgewogICAgICAgICAgICBjYXNlIGJkaWdpdHM6CiAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJzAnIHx8IGNoID09ICcxJykKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIHNlZW5TeW1ib2xzID0geGRpZ2l0czsKICAgICAgICAgICAgY2FzZSB4ZGlnaXRzOgogICAgICAgICAgICAgICAgaWYgKGlzeGRpZ2l0KGNoKSkKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIHNlZW5TeW1ib2xzID0gb3RoZXI7CiAgICAgICAgICAgIGNhc2Ugb3RoZXI6CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoY3AgLSB0b2tlbiA8IG1heHRsZW4gLSAyKQogICAgICAgICAgICAgICAgKmNwKysgPSBjaDsKICAgICAgICB9CiAgICAgICAgaWYgKGNoID09ICdcJycpIHsKICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAgIHZhbCA9IDA7CiAgICAgICAgICAgIGNoYXIgICAgICAgICAgICpydW4gPSB0b2tlbiArIDE7CiAgICAgICAgICAgIGNoID0gbmV0c25tcF9nZXRjKGZwKTsKICAgICAgICAgICAgc3dpdGNoIChjaCkgewogICAgICAgICAgICBjYXNlIEVPRjoKICAgICAgICAgICAgICAgIHJldHVybiBFTkRPRkZJTEU7CiAgICAgICAgICAgIGNhc2UgJ2InOgogICAgICAgICAgICBjYXNlICdCJzoKICAgICAgICAgICAgICAgIGlmIChzZWVuU3ltYm9scyA+IGJkaWdpdHMpIHsKICAgICAgICAgICAgICAgICAgICAqY3ArKyA9ICdcJyc7CiAgICAgICAgICAgICAgICAgICAgKmNwID0gMDsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gTEFCRUw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB3aGlsZSAocnVuICE9IGNwKQogICAgICAgICAgICAgICAgICAgIHZhbCA9IHZhbCAqIDIgKyAqcnVuKysgLSAnMCc7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnaCc6CiAgICAgICAgICAgIGNhc2UgJ0gnOgogICAgICAgICAgICAgICAgaWYgKHNlZW5TeW1ib2xzID4geGRpZ2l0cykgewogICAgICAgICAgICAgICAgICAgICpjcCsrID0gJ1wnJzsKICAgICAgICAgICAgICAgICAgICAqY3AgPSAwOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBMQUJFTDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHdoaWxlIChydW4gIT0gY3ApIHsKICAgICAgICAgICAgICAgICAgICBjaCA9ICpydW4rKzsKICAgICAgICAgICAgICAgICAgICBpZiAoJzAnIDw9IGNoICYmIGNoIDw9ICc5JykKICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gdmFsICogMTYgKyBjaCAtICcwJzsKICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgnYScgPD0gY2ggJiYgY2ggPD0gJ2YnKQogICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSB2YWwgKiAxNiArIGNoIC0gJ2EnICsgMTA7CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoJ0EnIDw9IGNoICYmIGNoIDw9ICdGJykKICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gdmFsICogMTYgKyBjaCAtICdBJyArIDEwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAqY3ArKyA9ICdcJyc7CiAgICAgICAgICAgICAgICAqY3AgPSAwOwogICAgICAgICAgICAgICAgcmV0dXJuIExBQkVMOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHNwcmludGYodG9rZW4sICIlbGQiLCB2YWwpOwogICAgICAgICAgICByZXR1cm4gTlVNQkVSOwogICAgICAgIH0gZWxzZQogICAgICAgICAgICByZXR1cm4gTEFCRUw7CiAgICBjYXNlICcoJzoKICAgICAgICByZXR1cm4gTEVGVFBBUkVOOwogICAgY2FzZSAnKSc6CiAgICAgICAgcmV0dXJuIFJJR0hUUEFSRU47CiAgICBjYXNlICd7JzoKICAgICAgICByZXR1cm4gTEVGVEJSQUNLRVQ7CiAgICBjYXNlICd9JzoKICAgICAgICByZXR1cm4gUklHSFRCUkFDS0VUOwogICAgY2FzZSAnWyc6CiAgICAgICAgcmV0dXJuIExFRlRTUUJSQUNLOwogICAgY2FzZSAnXSc6CiAgICAgICAgcmV0dXJuIFJJR0hUU1FCUkFDSzsKICAgIGNhc2UgJzsnOgogICAgICAgIHJldHVybiBTRU1JOwogICAgY2FzZSAnLCc6CiAgICAgICAgcmV0dXJuIENPTU1BOwogICAgY2FzZSAnfCc6CiAgICAgICAgcmV0dXJuIEJBUjsKICAgIGNhc2UgJy4nOgogICAgICAgIGNoX25leHQgPSBuZXRzbm1wX2dldGMoZnApOwogICAgICAgIGlmIChjaF9uZXh0ID09ICcuJykKICAgICAgICAgICAgcmV0dXJuIFJBTkdFOwogICAgICAgIHVuZ2V0YyhjaF9uZXh0LCBmcCk7CiAgICAgICAgcmV0dXJuIExBQkVMOwogICAgY2FzZSAnOic6CiAgICAgICAgY2hfbmV4dCA9IG5ldHNubXBfZ2V0YyhmcCk7CiAgICAgICAgaWYgKGNoX25leHQgIT0gJzonKSB7CiAgICAgICAgICAgIHVuZ2V0YyhjaF9uZXh0LCBmcCk7CiAgICAgICAgICAgIHJldHVybiBMQUJFTDsKICAgICAgICB9CiAgICAgICAgY2hfbmV4dCA9IG5ldHNubXBfZ2V0YyhmcCk7CiAgICAgICAgaWYgKGNoX25leHQgIT0gJz0nKSB7CiAgICAgICAgICAgIHVuZ2V0YyhjaF9uZXh0LCBmcCk7CiAgICAgICAgICAgIHJldHVybiBMQUJFTDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIEVRVUFMUzsKICAgIGNhc2UgJy0nOgogICAgICAgIGNoX25leHQgPSBuZXRzbm1wX2dldGMoZnApOwogICAgICAgIGlmIChjaF9uZXh0ID09ICctJykgewogICAgICAgICAgICBpZiAobmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIAoJCQkJICAgICAgIE5FVFNOTVBfRFNfTElCX01JQl9DT01NRU5UX1RFUk0pKSB7CiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogVHJlYXQgdGhlIHJlc3Qgb2YgdGhpcyBsaW5lIGFzIGEgY29tbWVudC4gCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIHdoaWxlICgoY2hfbmV4dCAhPSBFT0YpICYmIChjaF9uZXh0ICE9ICdcbicpKQogICAgICAgICAgICAgICAgICAgIGNoX25leHQgPSBuZXRzbm1wX2dldGMoZnApOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIFRyZWF0IHRoZSByZXN0IG9mIHRoZSBsaW5lIG9yIHVudGlsIGFub3RoZXIgJy0tJyBhcyBhIGNvbW1lbnQgCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiAodGhpcyBpcyB0aGUgInRlY2huaWNhbGx5IiBjb3JyZWN0IHdheSB0byBwYXJzZSBjb21tZW50cykgCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGNoID0gJyAnOwogICAgICAgICAgICAgICAgY2hfbmV4dCA9IG5ldHNubXBfZ2V0YyhmcCk7CiAgICAgICAgICAgICAgICB3aGlsZSAoY2hfbmV4dCAhPSBFT0YgJiYgY2hfbmV4dCAhPSAnXG4nICYmCiAgICAgICAgICAgICAgICAgICAgICAgKGNoICE9ICctJyB8fCBjaF9uZXh0ICE9ICctJykpIHsKICAgICAgICAgICAgICAgICAgICBjaCA9IGNoX25leHQ7CiAgICAgICAgICAgICAgICAgICAgY2hfbmV4dCA9IG5ldHNubXBfZ2V0YyhmcCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGNoX25leHQgPT0gRU9GKQogICAgICAgICAgICAgICAgcmV0dXJuIEVORE9GRklMRTsKICAgICAgICAgICAgaWYgKGNoX25leHQgPT0gJ1xuJykKICAgICAgICAgICAgICAgIG1pYkxpbmUrKzsKICAgICAgICAgICAgcmV0dXJuIGdldF90b2tlbihmcCwgdG9rZW4sIG1heHRsZW4pOwogICAgICAgIH0KICAgICAgICB1bmdldGMoY2hfbmV4dCwgZnApOwoJLyogZmFsbHRocm91Z2ggKi8KICAgIGRlZmF1bHQ6CiAgICAgICAgLyoKICAgICAgICAgKiBBY2N1bXVsYXRlIGNoYXJhY3RlcnMgdW50aWwgZW5kIG9mIHRva2VuIGlzIGZvdW5kLiAgVGhlbiBhdHRlbXB0IHRvCiAgICAgICAgICogbWF0Y2ggdGhpcyB0b2tlbiBhcyBhIHJlc2VydmVkIHdvcmQuICBJZiBhIG1hdGNoIGlzIGZvdW5kLCByZXR1cm4gdGhlCiAgICAgICAgICogdHlwZS4gIEVsc2UgaXQgaXMgYSBsYWJlbC4KICAgICAgICAgKi8KICAgICAgICBpZiAoIWlzX2xhYmVsY2hhcihjaCkpCiAgICAgICAgICAgIHJldHVybiBMQUJFTDsKICAgICAgICBoYXNoICs9IHRvbG93ZXIoY2gpOwogICAgICBtb3JlOgogICAgICAgIHdoaWxlIChpc19sYWJlbGNoYXIoY2hfbmV4dCA9IG5ldHNubXBfZ2V0YyhmcCkpKSB7CiAgICAgICAgICAgIGhhc2ggKz0gdG9sb3dlcihjaF9uZXh0KTsKICAgICAgICAgICAgaWYgKGNwIC0gdG9rZW4gPCBtYXh0bGVuIC0gMSkKICAgICAgICAgICAgICAgICpjcCsrID0gY2hfbmV4dDsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgdG9vX2xvbmcgPSAxOwogICAgICAgIH0KICAgICAgICB1bmdldGMoY2hfbmV4dCwgZnApOwogICAgICAgICpjcCA9ICdcMCc7CgogICAgICAgIGlmICh0b29fbG9uZykKICAgICAgICAgICAgcHJpbnRfZXJyb3IoIldhcm5pbmc6IHRva2VuIHRvbyBsb25nIiwgdG9rZW4sIENPTlRJTlVFKTsKICAgICAgICBmb3IgKHRwID0gYnVja2V0c1tCVUNLRVQoaGFzaCldOyB0cDsgdHAgPSB0cC0+bmV4dCkgewogICAgICAgICAgICBpZiAoKHRwLT5oYXNoID09IGhhc2gpICYmICghbGFiZWxfY29tcGFyZSh0cC0+bmFtZSwgdG9rZW4pKSkKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBpZiAodHApIHsKICAgICAgICAgICAgaWYgKHRwLT50b2tlbiAhPSBDT05USU5VRSkKICAgICAgICAgICAgICAgIHJldHVybiAodHAtPnRva2VuKTsKICAgICAgICAgICAgd2hpbGUgKGlzc3BhY2UoKGNoX25leHQgPSBuZXRzbm1wX2dldGMoZnApKSkpCiAgICAgICAgICAgICAgICBpZiAoY2hfbmV4dCA9PSAnXG4nKQogICAgICAgICAgICAgICAgICAgIG1pYkxpbmUrKzsKICAgICAgICAgICAgaWYgKGNoX25leHQgPT0gRU9GKQogICAgICAgICAgICAgICAgcmV0dXJuIEVORE9GRklMRTsKICAgICAgICAgICAgaWYgKGlzYWxudW0oY2hfbmV4dCkpIHsKICAgICAgICAgICAgICAgICpjcCsrID0gY2hfbmV4dDsKICAgICAgICAgICAgICAgIGhhc2ggKz0gdG9sb3dlcihjaF9uZXh0KTsKICAgICAgICAgICAgICAgIGdvdG8gbW9yZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAodG9rZW5bMF0gPT0gJy0nIHx8IGlzZGlnaXQoKHVuc2lnbmVkIGNoYXIpKHRva2VuWzBdKSkpIHsKICAgICAgICAgICAgZm9yIChjcCA9IHRva2VuICsgMTsgKmNwOyBjcCsrKQogICAgICAgICAgICAgICAgaWYgKCFpc2RpZ2l0KCh1bnNpZ25lZCBjaGFyKSgqY3ApKSkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gTEFCRUw7CiAgICAgICAgICAgIHJldHVybiBOVU1CRVI7CiAgICAgICAgfQogICAgICAgIHJldHVybiBMQUJFTDsKICAgIH0KfQoKbmV0c25tcF9mZWF0dXJlX2NoaWxkX29mKHBhcnNlX2dldF90b2tlbiwgbmV0c25tcF91bnVzZWQpCiNpZm5kZWYgTkVUU05NUF9GRUFUVVJFX1JFTU9WRV9QQVJTRV9HRVRfVE9LRU4KaW50CnNubXBfZ2V0X3Rva2VuKEZJTEUgKiBmcCwgY2hhciAqdG9rZW4sIGludCBtYXh0bGVuKQp7CiAgICByZXR1cm4gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgbWF4dGxlbik7Cn0KI2VuZGlmIC8qIE5FVFNOTVBfRkVBVFVSRV9SRU1PVkVfUEFSU0VfR0VUX1RPS0VOICovCgppbnQKYWRkX21pYmZpbGUoY29uc3QgY2hhciogdG1wc3RyLCBjb25zdCBjaGFyKiBkX25hbWUsIEZJTEUgKmlwICkKewogICAgRklMRSAgICAgICAgICAgKmZwOwogICAgY2hhciAgICAgICAgICAgIHRva2VuW01BWFRPS0VOXSwgdG9rZW4yW01BWFRPS0VOXTsKCiAgICAvKgogICAgICogd2hpY2ggbW9kdWxlIGlzIHRoaXMgCiAgICAgKi8KICAgIGlmICgoZnAgPSBmb3Blbih0bXBzdHIsICJyIikpID09IE5VTEwpIHsKICAgICAgICBzbm1wX2xvZ19wZXJyb3IodG1wc3RyKTsKICAgICAgICByZXR1cm4gMTsKICAgIH0KICAgIERFQlVHTVNHVEwoKCJwYXJzZS1taWJzIiwgIkNoZWNraW5nIGZpbGU6ICVzLi4uXG4iLAogICAgICAgICAgICAgICAgdG1wc3RyKSk7CiAgICBtaWJMaW5lID0gMTsKICAgIEZpbGUgPSB0bXBzdHI7CiAgICBpZiAoZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pICE9IExBQkVMKSB7CgkgICAgZmNsb3NlKGZwKTsKCSAgICByZXR1cm4gMTsKICAgIH0KICAgIC8qCiAgICAgKiBzaW1wbGUgdGVzdCBmb3IgdGhpcyBiZWluZyBhIE1JQiAKICAgICAqLwogICAgaWYgKGdldF90b2tlbihmcCwgdG9rZW4yLCBNQVhUT0tFTikgPT0gREVGSU5JVElPTlMpIHsKICAgICAgICBuZXdfbW9kdWxlKHRva2VuLCB0bXBzdHIpOwogICAgICAgIGlmIChpcCkKICAgICAgICAgICAgZnByaW50ZihpcCwgIiVzICVzXG4iLCB0b2tlbiwgZF9uYW1lKTsKICAgICAgICBmY2xvc2UoZnApOwogICAgICAgIHJldHVybiAwOwogICAgfSBlbHNlIHsKICAgICAgICBmY2xvc2UoZnApOwogICAgICAgIHJldHVybiAxOwogICAgfQp9CgovKiBGb3IgV2luMzIgcGxhdGZvcm1zLCB0aGUgZGlyZWN0b3J5IGRvZXMgbm90IG1haW50YWluIGEgbGFzdCBtb2RpZmljYXRpb24KICogZGF0ZSB0aGF0IHdlIGNhbiBjb21wYXJlIHdpdGggdGhlIG1vZGlmaWNhdGlvbiBkYXRlIG9mIHRoZSAuaW5kZXggZmlsZS4KICogVGhlcmVmb3JlIHRoZXJlIGlzIG5vIHdheSB0byBrbm93IHdoZXRoZXIgYW55IC5pbmRleCBmaWxlIGlzIHZhbGlkLgogKiBUaGlzIGlzIHRoZSByZWFzb24gZm9yIHRoZSAjaWYgIShkZWZpbmVkKFdJTjMyKSB8fCBkZWZpbmVkKGN5Z3dpbikpCiAqIGluIHRoZSBhZGRfbWliZGlyIGZ1bmN0aW9uCiAqLwppbnQKYWRkX21pYmRpcihjb25zdCBjaGFyICpkaXJuYW1lKQp7CiAgICBGSUxFICAgICAgICAgICAqaXA7CiAgICBESVIgICAgICAgICAgICAqZGlyLCAqZGlyMjsKICAgIGNvbnN0IGNoYXIgICAgICpvbGRGaWxlID0gRmlsZTsKICAgIHN0cnVjdCBkaXJlbnQgICpmaWxlOwogICAgY2hhciAgICAgICAgICAgIHRtcHN0clszMDBdOwogICAgaW50ICAgICAgICAgICAgIGNvdW50ID0gMDsKICAgIGludCAgICAgICAgICAgICBmbmFtZV9sZW4gPSAwOwojaWYgIShkZWZpbmVkKFdJTjMyKSB8fCBkZWZpbmVkKGN5Z3dpbikpCiAgICBjaGFyICAgICAgICAgICAqdG9rZW47CiAgICBjaGFyIHNwYWNlOwogICAgY2hhciBuZXdsaW5lOwogICAgc3RydWN0IHN0YXQgICAgIGRpcl9zdGF0LCBpZHhfc3RhdDsKICAgIGNoYXIgICAgICAgICAgICB0bXBzdHIxWzMwMF07CiNlbmRpZgoKICAgIERFQlVHTVNHVEwoKCJwYXJzZS1taWJzIiwgIlNjYW5uaW5nIGRpcmVjdG9yeSAlc1xuIiwgZGlybmFtZSkpOwojaWYgIShkZWZpbmVkKFdJTjMyKSB8fCBkZWZpbmVkKGN5Z3dpbikpCiAgICB0b2tlbiA9IG5ldHNubXBfbWliaW5kZXhfbG9va3VwKCBkaXJuYW1lICk7CiAgICBpZiAodG9rZW4gJiYgc3RhdCh0b2tlbiwgJmlkeF9zdGF0KSA9PSAwICYmIHN0YXQoZGlybmFtZSwgJmRpcl9zdGF0KSA9PSAwKSB7CiAgICAgICAgaWYgKGRpcl9zdGF0LnN0X210aW1lIDwgaWR4X3N0YXQuc3RfbXRpbWUpIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoInBhcnNlLW1pYnMiLCAiVGhlIGluZGV4IGlzIGdvb2RcbiIpKTsKICAgICAgICAgICAgaWYgKChpcCA9IGZvcGVuKHRva2VuLCAiciIpKSAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICBmZ2V0cyh0bXBzdHIsIHNpemVvZih0bXBzdHIpLCBpcCk7IC8qIFNraXAgZGlyIGxpbmUgKi8KICAgICAgICAgICAgICAgIHdoaWxlIChmc2NhbmYoaXAsICIlMTI3cyVjJTI5OXMlYyIsIHRva2VuLCAmc3BhY2UsIHRtcHN0ciwKCQkgICAgJm5ld2xpbmUpID09IDQpIHsKCgkJICAgIC8qCgkJICAgICAqIElmIGFuIG92ZXJmbG93IG9mIHRoZSB0b2tlbiBvciB0bXBzdHIgYnVmZmVycyBoYXMgYmVlbgoJCSAgICAgKiBmb3VuZCBsb2cgYSBtZXNzYWdlIGFuZCBicmVhayBvdXQgb2YgdGhlIHdoaWxlIGxvb3AsCgkJICAgICAqIHRodXMgdGhlIHJlc3Qgb2YgdGhlIGZpbGUgdG9rZW5zIHdpbGwgYmUgaWdub3JlZC4KCQkgICAgICovCgkJICAgIGlmIChzcGFjZSAhPSAnICcgfHwgbmV3bGluZSAhPSAnXG4nKSB7CgkJCXNubXBfbG9nKExPR19FUlIsCgkJCSAgICAiYWRkX21pYmRpcjogc3RyaW5ncyBzY2FubmVkIGluIGZyb20gJXMvJXMgIiBcCgkJCSAgICAiYXJlIHRvbyBsYXJnZS4gIGNvdW50ID0gJWRcbiAiLCBkaXJuYW1lLAoJCQkgICAgIi5pbmRleCIsIGNvdW50KTsKCQkJICAgIGJyZWFrOwoJCSAgICB9CgkJICAgCgkJICAgIHNucHJpbnRmKHRtcHN0cjEsIHNpemVvZih0bXBzdHIxKSwgIiVzLyVzIiwgZGlybmFtZSwgdG1wc3RyKTsKICAgICAgICAgICAgICAgICAgICB0bXBzdHIxWyBzaXplb2YodG1wc3RyMSktMSBdID0gMDsKICAgICAgICAgICAgICAgICAgICBuZXdfbW9kdWxlKHRva2VuLCB0bXBzdHIxKTsKICAgICAgICAgICAgICAgICAgICBjb3VudCsrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZmNsb3NlKGlwKTsKICAgICAgICAgICAgICAgIHJldHVybiBjb3VudDsKICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgicGFyc2UtbWlicyIsICJDYW4ndCByZWFkIGluZGV4XG4iKSk7CiAgICAgICAgfSBlbHNlCiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJwYXJzZS1taWJzIiwgIkluZGV4IG91dGRhdGVkXG4iKSk7CiAgICB9IGVsc2UKICAgICAgICBERUJVR01TR1RMKCgicGFyc2UtbWlicyIsICJObyBpbmRleFxuIikpOwojZW5kaWYKCiAgICBpZiAoKGRpciA9IG9wZW5kaXIoZGlybmFtZSkpKSB7CiAgICAgICAgaXAgPSBuZXRzbm1wX21pYmluZGV4X25ldyggZGlybmFtZSApOwogICAgICAgIHdoaWxlICgoZmlsZSA9IHJlYWRkaXIoZGlyKSkpIHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogT25seSBwYXJzZSBmaWxlIG5hbWVzIHRoYXQgZG9uJ3QgYmVnaW4gd2l0aCBhICcuJyAKICAgICAgICAgICAgICogQWxzbyBza2lwIGZpbGVzIGVuZGluZyBpbiAnficsIG9yIHN0YXJ0aW5nL2VuZGluZwogICAgICAgICAgICAgKiB3aXRoICcjJyB3aGljaCBhcmUgdHlwaWNhbGx5IGVkaXRvciBiYWNrdXAgZmlsZXMuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBpZiAoZmlsZS0+ZF9uYW1lICE9IE5VTEwpIHsKICAgICAgICAgICAgICBmbmFtZV9sZW4gPSBzdHJsZW4oIGZpbGUtPmRfbmFtZSApOwogICAgICAgICAgICAgIGlmIChmbmFtZV9sZW4gPiAwICYmIGZpbGUtPmRfbmFtZVswXSAhPSAnLicgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgZmlsZS0+ZF9uYW1lWzBdICE9ICcjJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGZpbGUtPmRfbmFtZVtmbmFtZV9sZW4tMV0gIT0gJyMnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgZmlsZS0+ZF9uYW1lW2ZuYW1lX2xlbi0xXSAhPSAnficpIHsKICAgICAgICAgICAgICAgIHNucHJpbnRmKHRtcHN0ciwgc2l6ZW9mKHRtcHN0ciksICIlcy8lcyIsIGRpcm5hbWUsIGZpbGUtPmRfbmFtZSk7CiAgICAgICAgICAgICAgICB0bXBzdHJbIHNpemVvZih0bXBzdHIpLTEgXSA9IDA7CiAgICAgICAgICAgICAgICBpZiAoKGRpcjIgPSBvcGVuZGlyKHRtcHN0cikpKSB7CiAgICAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgICAgKiBmaWxlIGlzIGEgZGlyZWN0b3J5LCBkb24ndCByZWFkIGl0IAogICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgIGNsb3NlZGlyKGRpcjIpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBpZiAoICFhZGRfbWliZmlsZSggdG1wc3RyLCBmaWxlLT5kX25hbWUsIGlwICkpCiAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50Kys7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIEZpbGUgPSBvbGRGaWxlOwogICAgICAgIGNsb3NlZGlyKGRpcik7CiAgICAgICAgaWYgKGlwKQogICAgICAgICAgICBmY2xvc2UoaXApOwogICAgICAgIHJldHVybiAoY291bnQpOwogICAgfQogICAgZWxzZQogICAgICAgIERFQlVHTVNHVEwoKCJwYXJzZS1taWJzIiwiY2Fubm90IG9wZW4gTUlCIGRpcmVjdG9yeSAlc1xuIiwgZGlybmFtZSkpOwoKICAgIHJldHVybiAoLTEpOwp9CgoKLyoKICogUmV0dXJucyB0aGUgcm9vdCBvZiB0aGUgd2hvbGUgdHJlZQogKiAgIChmb3IgYmFja3dhcmRzIGNvbXBhdGFiaWxpdHkpCiAqLwpzdHJ1Y3QgdHJlZSAgICAqCnJlYWRfbWliKGNvbnN0IGNoYXIgKmZpbGVuYW1lKQp7CiAgICBGSUxFICAgICAgICAgICAqZnA7CiAgICBjaGFyICAgICAgICAgICAgdG9rZW5bTUFYVE9LRU5dOwoKICAgIGZwID0gZm9wZW4oZmlsZW5hbWUsICJyIik7CiAgICBpZiAoZnAgPT0gTlVMTCkgewogICAgICAgIHNubXBfbG9nX3BlcnJvcihmaWxlbmFtZSk7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CiAgICBtaWJMaW5lID0gMTsKICAgIEZpbGUgPSBmaWxlbmFtZTsKICAgIERFQlVHTVNHVEwoKCJwYXJzZS1taWJzIiwgIlBhcnNpbmcgZmlsZTogJXMuLi5cbiIsIGZpbGVuYW1lKSk7CiAgICBpZiAoZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pICE9IExBQkVMKSB7CgkgICAgc25tcF9sb2coTE9HX0VSUiwgIkZhaWxlZCB0byBwYXJzZSBNSUIgZmlsZSAlc1xuIiwgZmlsZW5hbWUpOwoJICAgIGZjbG9zZShmcCk7CgkgICAgcmV0dXJuIE5VTEw7CiAgICB9CiAgICBmY2xvc2UoZnApOwogICAgbmV3X21vZHVsZSh0b2tlbiwgZmlsZW5hbWUpOwogICAgKHZvaWQpIG5ldHNubXBfcmVhZF9tb2R1bGUodG9rZW4pOwoKICAgIHJldHVybiB0cmVlX2hlYWQ7Cn0KCgpzdHJ1Y3QgdHJlZSAgICAqCnJlYWRfYWxsX21pYnModm9pZCkKewogICAgc3RydWN0IG1vZHVsZSAgKm1wOwoKICAgIGZvciAobXAgPSBtb2R1bGVfaGVhZDsgbXA7IG1wID0gbXAtPm5leHQpCiAgICAgICAgaWYgKG1wLT5ub19pbXBvcnRzID09IC0xKQogICAgICAgICAgICBuZXRzbm1wX3JlYWRfbW9kdWxlKG1wLT5uYW1lKTsKICAgIGFkb3B0X29ycGhhbnMoKTsKCiAgICAvKiBJZiBlbnRlcmVkIHRoZSBzeW50YXggZXJyb3IgbG9vcCBpbiAicmVhZF9tb2R1bGUoKSIgKi8KICAgIGlmIChnTG9vcCA9PSAxKSB7CiAgICAgICAgZ0xvb3AgPSAwOwogICAgICAgIGlmIChncE1pYkVycm9yU3RyaW5nICE9IE5VTEwpIHsKICAgICAgICAgICAgU05NUF9GUkVFKGdwTWliRXJyb3JTdHJpbmcpOwogICAgICAgIH0KICAgICAgICBncE1pYkVycm9yU3RyaW5nID0gKGNoYXIgKikgY2FsbG9jKDEsIE1BWFFVT1RFU1RSKTsKICAgICAgICBpZiAoZ3BNaWJFcnJvclN0cmluZyA9PSBOVUxMKSB7CiAgICAgICAgICAgIHNubXBfbG9nKExPR19DUklULCAiZmFpbGVkIHRvIGFsbG9jYXRlZCBtZW1vcnkgZm9yIGdwTWliRXJyb3JTdHJpbmdcbiIpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHNucHJpbnRmKGdwTWliRXJyb3JTdHJpbmcsIHNpemVvZihncE1pYkVycm9yU3RyaW5nKS0xLCAiRXJyb3IgaW4gcGFyc2luZyBNSUIgbW9kdWxlKHMpOiAlcyAhIFVuYWJsZSB0byBsb2FkIGNvcnJlc3BvbmRpbmcgTUlCKHMpIiwgZ01pYk5hbWVzKTsKICAgICAgICB9CiAgICB9CgogICAgLyogQ2FsbGVyJ3MgcmVzcG9uc2liaWxpdHkgdG8gZnJlZSB0aGlzIG1lbW9yeSAqLwogICAgdHJlZV9oZWFkLT5wYXJzZUVycm9yU3RyaW5nID0gZ3BNaWJFcnJvclN0cmluZzsKCQogICAgcmV0dXJuIHRyZWVfaGVhZDsKfQoKCiNpZmRlZiBURVNUCmludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCnsKICAgIGludCAgICAgICAgICAgICBpOwogICAgc3RydWN0IHRyZWUgICAgKnRwOwogICAgbmV0c25tcF9kc19zZXRfaW50KE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgTkVUU05NUF9EU19MSUJfTUlCX1dBUk5JTkdTLCAyKTsKCiAgICBuZXRzbm1wX2luaXRfbWliKCk7CgogICAgaWYgKGFyZ2MgPT0gMSkKICAgICAgICAodm9pZCkgcmVhZF9hbGxfbWlicygpOwogICAgZWxzZQogICAgICAgIGZvciAoaSA9IDE7IGkgPCBhcmdjOyBpKyspCiAgICAgICAgICAgIHJlYWRfbWliKGFyZ3ZbaV0pOwoKICAgIGZvciAodHAgPSB0cmVlX2hlYWQ7IHRwOyB0cCA9IHRwLT5uZXh0X3BlZXIpCiAgICAgICAgcHJpbnRfc3VidHJlZShzdGRvdXQsIHRwLCAwKTsKICAgIGZyZWVfdHJlZSh0cmVlX2hlYWQpOwoKICAgIHJldHVybiAwOwp9CiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVEVTVCAqLwoKc3RhdGljIGludApwYXJzZVF1b3RlU3RyaW5nKEZJTEUgKiBmcCwgY2hhciAqdG9rZW4sIGludCBtYXh0bGVuKQp7CiAgICByZWdpc3RlciBpbnQgICAgY2g7CiAgICBpbnQgICAgICAgICAgICAgY291bnQgPSAwOwogICAgaW50ICAgICAgICAgICAgIHRvb19sb25nID0gMDsKICAgIGNoYXIgICAgICAgICAgICp0b2tlbl9zdGFydCA9IHRva2VuOwoKICAgIGZvciAoY2ggPSBuZXRzbm1wX2dldGMoZnApOyBjaCAhPSBFT0Y7IGNoID0gbmV0c25tcF9nZXRjKGZwKSkgewogICAgICAgIGlmIChjaCA9PSAnXHInKQogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICBpZiAoY2ggPT0gJ1xuJykgewogICAgICAgICAgICBtaWJMaW5lKys7CiAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnIicpIHsKICAgICAgICAgICAgKnRva2VuID0gJ1wwJzsKICAgICAgICAgICAgaWYgKHRvb19sb25nICYmIG5ldHNubXBfZHNfZ2V0X2ludChORVRTTk1QX0RTX0xJQlJBUllfSUQsIAoJCQkJCSAgIE5FVFNOTVBfRFNfTElCX01JQl9XQVJOSU5HUykgPiAxKSB7CiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogc2hvdyBzaG9ydCBmb3JtIGZvciBicmV2aXR5IHNha2UgCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGNoYXIgICAgICAgICAgICBjaF9zYXZlID0gKih0b2tlbl9zdGFydCArIDUwKTsKICAgICAgICAgICAgICAgICoodG9rZW5fc3RhcnQgKyA1MCkgPSAnXDAnOwogICAgICAgICAgICAgICAgcHJpbnRfZXJyb3IoIldhcm5pbmc6IHN0cmluZyB0b28gbG9uZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbl9zdGFydCwgUVVPVEVTVFJJTkcpOwogICAgICAgICAgICAgICAgKih0b2tlbl9zdGFydCArIDUwKSA9IGNoX3NhdmU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIFFVT1RFU1RSSU5HOwogICAgICAgIH0KICAgICAgICAvKgogICAgICAgICAqIG1heGltdW0gZGVzY3JpcHRpb24gbGVuZ3RoIGNoZWNrLiAgSWYgZ3JlYXRlciwga2VlcCBwYXJzaW5nCiAgICAgICAgICogYnV0IHRydW5jYXRlIHRoZSBzdHJpbmcgCiAgICAgICAgICovCiAgICAgICAgaWYgKCsrY291bnQgPCBtYXh0bGVuKQogICAgICAgICAgICAqdG9rZW4rKyA9IGNoOwogICAgICAgIGVsc2UKICAgICAgICAgICAgdG9vX2xvbmcgPSAxOwogICAgfQoKICAgIHJldHVybiAwOwp9CgovKgogKiBzdHJ1Y3QgaW5kZXhfbGlzdCAqCiAqIGdldEluZGV4ZXMoRklMRSAqZnApOgogKiAgIFRoaXMgcm91dGluZSBwYXJzZXMgYSBzdHJpbmcgbGlrZSAgeyBibGFoIGJsYWggYmxhaCB9IGFuZCByZXR1cm5zIGEKICogICBsaXN0IG9mIHRoZSBzdHJpbmdzIGVuY2xvc2VkIHdpdGhpbiBpdC4KICoKICovCnN0YXRpYyBzdHJ1Y3QgaW5kZXhfbGlzdCAqCmdldEluZGV4ZXMoRklMRSAqIGZwLCBzdHJ1Y3QgaW5kZXhfbGlzdCAqKnJldHApCnsKICAgIGludCAgICAgICAgICAgICB0eXBlOwogICAgY2hhciAgICAgICAgICAgIHRva2VuW01BWFRPS0VOXTsKICAgIGNoYXIgICAgICAgICAgICBuZXh0SXNJbXBsaWVkID0gMDsKCiAgICBzdHJ1Y3QgaW5kZXhfbGlzdCAqbXlsaXN0ID0gTlVMTDsKICAgIHN0cnVjdCBpbmRleF9saXN0ICoqbXlwcCA9ICZteWxpc3Q7CgogICAgZnJlZV9pbmRleGVzKHJldHApOwoKICAgIHR5cGUgPSBnZXRfdG9rZW4oZnAsIHRva2VuLCBNQVhUT0tFTik7CgogICAgaWYgKHR5cGUgIT0gTEVGVEJSQUNLRVQpIHsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KCiAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgd2hpbGUgKHR5cGUgIT0gUklHSFRCUkFDS0VUICYmIHR5cGUgIT0gRU5ET0ZGSUxFKSB7CiAgICAgICAgaWYgKCh0eXBlID09IExBQkVMKSB8fCAodHlwZSAmIFNZTlRBWF9NQVNLKSkgewogICAgICAgICAgICAqbXlwcCA9CiAgICAgICAgICAgICAgICAoc3RydWN0IGluZGV4X2xpc3QgKikgY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgaW5kZXhfbGlzdCkpOwogICAgICAgICAgICBpZiAoKm15cHApIHsKICAgICAgICAgICAgICAgICgqbXlwcCktPmlsYWJlbCA9IHN0cmR1cCh0b2tlbik7CiAgICAgICAgICAgICAgICAoKm15cHApLT5pc2ltcGxpZWQgPSBuZXh0SXNJbXBsaWVkOwogICAgICAgICAgICAgICAgbXlwcCA9ICYoKm15cHApLT5uZXh0OwogICAgICAgICAgICAgICAgbmV4dElzSW1wbGllZCA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gSU1QTElFRCkgewogICAgICAgICAgICBuZXh0SXNJbXBsaWVkID0gMTsKICAgICAgICB9CiAgICAgICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgIH0KCiAgICAqcmV0cCA9IG15bGlzdDsKICAgIHJldHVybiBteWxpc3Q7Cn0KCnN0YXRpYyBzdHJ1Y3QgdmFyYmluZF9saXN0ICoKZ2V0VmFyYmluZHMoRklMRSAqIGZwLCBzdHJ1Y3QgdmFyYmluZF9saXN0ICoqcmV0cCkKewogICAgaW50ICAgICAgICAgICAgIHR5cGU7CiAgICBjaGFyICAgICAgICAgICAgdG9rZW5bTUFYVE9LRU5dOwoKICAgIHN0cnVjdCB2YXJiaW5kX2xpc3QgKm15bGlzdCA9IE5VTEw7CiAgICBzdHJ1Y3QgdmFyYmluZF9saXN0ICoqbXlwcCA9ICZteWxpc3Q7CgogICAgZnJlZV92YXJiaW5kcyhyZXRwKTsKCiAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwoKICAgIGlmICh0eXBlICE9IExFRlRCUkFDS0VUKSB7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CgogICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKICAgIHdoaWxlICh0eXBlICE9IFJJR0hUQlJBQ0tFVCAmJiB0eXBlICE9IEVORE9GRklMRSkgewogICAgICAgIGlmICgodHlwZSA9PSBMQUJFTCkgfHwgKHR5cGUgJiBTWU5UQVhfTUFTSykpIHsKICAgICAgICAgICAgKm15cHAgPQogICAgICAgICAgICAgICAgKHN0cnVjdCB2YXJiaW5kX2xpc3QgKikgY2FsbG9jKDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJiaW5kX2xpc3QpKTsKICAgICAgICAgICAgaWYgKCpteXBwKSB7CiAgICAgICAgICAgICAgICAoKm15cHApLT52YmxhYmVsID0gc3RyZHVwKHRva2VuKTsKICAgICAgICAgICAgICAgIG15cHAgPSAmKCpteXBwKS0+bmV4dDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgfQoKICAgICpyZXRwID0gbXlsaXN0OwogICAgcmV0dXJuIG15bGlzdDsKfQoKc3RhdGljIHZvaWQKZnJlZV9pbmRleGVzKHN0cnVjdCBpbmRleF9saXN0ICoqc3BwKQp7CiAgICBpZiAoc3BwICYmICpzcHApIHsKICAgICAgICBzdHJ1Y3QgaW5kZXhfbGlzdCAqcHAsICpucHA7CgogICAgICAgIHBwID0gKnNwcDsKICAgICAgICAqc3BwID0gTlVMTDsKCiAgICAgICAgd2hpbGUgKHBwKSB7CiAgICAgICAgICAgIG5wcCA9IHBwLT5uZXh0OwogICAgICAgICAgICBpZiAocHAtPmlsYWJlbCkKICAgICAgICAgICAgICAgIGZyZWUocHAtPmlsYWJlbCk7CiAgICAgICAgICAgIGZyZWUocHApOwogICAgICAgICAgICBwcCA9IG5wcDsKICAgICAgICB9CiAgICB9Cn0KCnN0YXRpYyB2b2lkCmZyZWVfdmFyYmluZHMoc3RydWN0IHZhcmJpbmRfbGlzdCAqKnNwcCkKewogICAgaWYgKHNwcCAmJiAqc3BwKSB7CiAgICAgICAgc3RydWN0IHZhcmJpbmRfbGlzdCAqcHAsICpucHA7CgogICAgICAgIHBwID0gKnNwcDsKICAgICAgICAqc3BwID0gTlVMTDsKCiAgICAgICAgd2hpbGUgKHBwKSB7CiAgICAgICAgICAgIG5wcCA9IHBwLT5uZXh0OwogICAgICAgICAgICBpZiAocHAtPnZibGFiZWwpCiAgICAgICAgICAgICAgICBmcmVlKHBwLT52YmxhYmVsKTsKICAgICAgICAgICAgZnJlZShwcCk7CiAgICAgICAgICAgIHBwID0gbnBwOwogICAgICAgIH0KICAgIH0KfQoKc3RhdGljIHZvaWQKZnJlZV9yYW5nZXMoc3RydWN0IHJhbmdlX2xpc3QgKipzcHApCnsKICAgIGlmIChzcHAgJiYgKnNwcCkgewogICAgICAgIHN0cnVjdCByYW5nZV9saXN0ICpwcCwgKm5wcDsKCiAgICAgICAgcHAgPSAqc3BwOwogICAgICAgICpzcHAgPSBOVUxMOwoKICAgICAgICB3aGlsZSAocHApIHsKICAgICAgICAgICAgbnBwID0gcHAtPm5leHQ7CiAgICAgICAgICAgIGZyZWUocHApOwogICAgICAgICAgICBwcCA9IG5wcDsKICAgICAgICB9CiAgICB9Cn0KCnN0YXRpYyB2b2lkCmZyZWVfZW51bXMoc3RydWN0IGVudW1fbGlzdCAqKnNwcCkKewogICAgaWYgKHNwcCAmJiAqc3BwKSB7CiAgICAgICAgc3RydWN0IGVudW1fbGlzdCAqcHAsICpucHA7CgogICAgICAgIHBwID0gKnNwcDsKICAgICAgICAqc3BwID0gTlVMTDsKCiAgICAgICAgd2hpbGUgKHBwKSB7CiAgICAgICAgICAgIG5wcCA9IHBwLT5uZXh0OwogICAgICAgICAgICBpZiAocHAtPmxhYmVsKQogICAgICAgICAgICAgICAgZnJlZShwcC0+bGFiZWwpOwogICAgICAgICAgICBmcmVlKHBwKTsKICAgICAgICAgICAgcHAgPSBucHA7CiAgICAgICAgfQogICAgfQp9CgpzdGF0aWMgc3RydWN0IGVudW1fbGlzdCAqCmNvcHlfZW51bXMoc3RydWN0IGVudW1fbGlzdCAqc3ApCnsKICAgIHN0cnVjdCBlbnVtX2xpc3QgKnhwID0gTlVMTCwgKipzcHAgPSAmeHA7CgogICAgd2hpbGUgKHNwKSB7CiAgICAgICAgKnNwcCA9IChzdHJ1Y3QgZW51bV9saXN0ICopIGNhbGxvYygxLCBzaXplb2Yoc3RydWN0IGVudW1fbGlzdCkpOwogICAgICAgIGlmICghKnNwcCkKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgKCpzcHApLT5sYWJlbCA9IHN0cmR1cChzcC0+bGFiZWwpOwogICAgICAgICgqc3BwKS0+dmFsdWUgPSBzcC0+dmFsdWU7CiAgICAgICAgc3BwID0gJigqc3BwKS0+bmV4dDsKICAgICAgICBzcCA9IHNwLT5uZXh0OwogICAgfQogICAgcmV0dXJuICh4cCk7Cn0KCnN0YXRpYyBzdHJ1Y3QgcmFuZ2VfbGlzdCAqCmNvcHlfcmFuZ2VzKHN0cnVjdCByYW5nZV9saXN0ICpzcCkKewogICAgc3RydWN0IHJhbmdlX2xpc3QgKnhwID0gTlVMTCwgKipzcHAgPSAmeHA7CgogICAgd2hpbGUgKHNwKSB7CiAgICAgICAgKnNwcCA9IChzdHJ1Y3QgcmFuZ2VfbGlzdCAqKSBjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCByYW5nZV9saXN0KSk7CiAgICAgICAgaWYgKCEqc3BwKQogICAgICAgICAgICBicmVhazsKICAgICAgICAoKnNwcCktPmxvdyA9IHNwLT5sb3c7CiAgICAgICAgKCpzcHApLT5oaWdoID0gc3AtPmhpZ2g7CiAgICAgICAgc3BwID0gJigqc3BwKS0+bmV4dDsKICAgICAgICBzcCA9IHNwLT5uZXh0OwogICAgfQogICAgcmV0dXJuICh4cCk7Cn0KCi8qCiAqIFRoaXMgcm91dGluZSBwYXJzZXMgYSBzdHJpbmcgbGlrZSAgeyBibGFoIGJsYWggYmxhaCB9IGFuZCByZXR1cm5zIE9CSklEIGlmCiAqIGl0IGlzIHdlbGwgZm9ybWVkLCBhbmQgTlVMTCBpZiBub3QuCiAqLwpzdGF0aWMgaW50CnRvc3NPYmplY3RJZGVudGlmaWVyKEZJTEUgKiBmcCkKewogICAgaW50ICAgICAgICAgICAgIHR5cGU7CiAgICBjaGFyICAgICAgICAgICAgdG9rZW5bTUFYVE9LRU5dOwogICAgaW50ICAgICAgICAgICAgIGJyYWNrZXRjb3VudCA9IDE7CgogICAgdHlwZSA9IGdldF90b2tlbihmcCwgdG9rZW4sIE1BWFRPS0VOKTsKCiAgICBpZiAodHlwZSAhPSBMRUZUQlJBQ0tFVCkKICAgICAgICByZXR1cm4gMDsKICAgIHdoaWxlICgodHlwZSAhPSBSSUdIVEJSQUNLRVQgfHwgYnJhY2tldGNvdW50ID4gMCkgJiYgdHlwZSAhPSBFTkRPRkZJTEUpIHsKICAgICAgICB0eXBlID0gZ2V0X3Rva2VuKGZwLCB0b2tlbiwgTUFYVE9LRU4pOwogICAgICAgIGlmICh0eXBlID09IExFRlRCUkFDS0VUKQogICAgICAgICAgICBicmFja2V0Y291bnQrKzsKICAgICAgICBlbHNlIGlmICh0eXBlID09IFJJR0hUQlJBQ0tFVCkKICAgICAgICAgICAgYnJhY2tldGNvdW50LS07CiAgICB9CgogICAgaWYgKHR5cGUgPT0gUklHSFRCUkFDS0VUKQogICAgICAgIHJldHVybiBPQkpJRDsKICAgIGVsc2UKICAgICAgICByZXR1cm4gMDsKfQoKLyogRmluZCBub2RlIGluIGFueSBNSUIgbW9kdWxlCiAgIFVzZWQgYnkgUGVybCBtb2R1bGVzCQkqLwpzdHJ1Y3QgdHJlZSAgICAqCmZpbmRfbm9kZShjb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3QgdHJlZSAqc3VidHJlZSkKeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVbnVzZWQgKi8KICAgIHJldHVybiAoZmluZF90cmVlX25vZGUobmFtZSwgLTEpKTsKfQoKbmV0c25tcF9mZWF0dXJlX2NoaWxkX29mKHBhcnNlX2ZpbmRfbm9kZTIsIG5ldHNubXBfdW51c2VkKQojaWZuZGVmIE5FVFNOTVBfRkVBVFVSRV9SRU1PVkVfUEFSU0VfRklORF9OT0RFMgpzdHJ1Y3QgdHJlZSAgICAqCmZpbmRfbm9kZTIoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqbW9kdWxlKQp7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogIGludCBtb2RpZCA9IC0xOwogIGlmIChtb2R1bGUpIHsKICAgIG1vZGlkID0gd2hpY2hfbW9kdWxlKG1vZHVsZSk7CiAgfQogIGlmIChtb2RpZCA9PSAtMSkKICB7CiAgICByZXR1cm4gKE5VTEwpOwogIH0KICByZXR1cm4gKGZpbmRfdHJlZV9ub2RlKG5hbWUsIG1vZGlkKSk7Cn0KI2VuZGlmIC8qIE5FVFNOTVBfRkVBVFVSRV9SRU1PVkVfUEFSU0VfRklORF9OT0RFMiAqLwoKI2lmbmRlZiBORVRTTk1QX0ZFQVRVUkVfUkVNT1ZFX0ZJTkRfTU9EVUxFCi8qIFVzZWQgaW4gdGhlIHBlcmwgbW9kdWxlICovCnN0cnVjdCBtb2R1bGUgICoKZmluZF9tb2R1bGUoaW50IG1pZCkKewogICAgc3RydWN0IG1vZHVsZSAgKm1wOwoKICAgIGZvciAobXAgPSBtb2R1bGVfaGVhZDsgbXAgIT0gTlVMTDsgbXAgPSBtcC0+bmV4dCkgewogICAgICAgIGlmIChtcC0+bW9kaWQgPT0gbWlkKQogICAgICAgICAgICBicmVhazsKICAgIH0KICAgIHJldHVybiBtcDsKfQojZW5kaWYgLyogTkVUU05NUF9GRUFUVVJFX1JFTU9WRV9GSU5EX01PRFVMRSAqLwoKCnN0YXRpYyBjaGFyICAgICBsZWF2ZV9pbmRlbnRbMjU2XTsKc3RhdGljIGludCAgICAgIGxlYXZlX3dhc19zaW1wbGU7CgpzdGF0aWMgdm9pZApwcmludF9taWJfbGVhdmVzKEZJTEUgKiBmLCBzdHJ1Y3QgdHJlZSAqdHAsIGludCB3aWR0aCkKewogICAgc3RydWN0IHRyZWUgICAgKm50cDsKICAgIGNoYXIgICAgICAgICAgICppcCA9IGxlYXZlX2luZGVudCArIHN0cmxlbihsZWF2ZV9pbmRlbnQpIC0gMTsKICAgIGNoYXIgICAgICAgICAgICBsYXN0X2lwY2ggPSAqaXA7CgogICAgKmlwID0gJysnOwogICAgaWYgKHRwLT50eXBlID09IFRZUEVfT1RIRVIgfHwgdHAtPnR5cGUgPiBUWVBFX1NJTVBMRV9MQVNUKSB7CiAgICAgICAgZnByaW50ZihmLCAiJXMtLSVzKCVsZClcbiIsIGxlYXZlX2luZGVudCwgdHAtPmxhYmVsLCB0cC0+c3ViaWQpOwogICAgICAgIGlmICh0cC0+aW5kZXhlcykgewogICAgICAgICAgICBzdHJ1Y3QgaW5kZXhfbGlzdCAqeHAgPSB0cC0+aW5kZXhlczsKICAgICAgICAgICAgaW50ICAgICAgICAgICAgIGZpcnN0ID0gMSwgY3BvcyA9IDAsIGxlbiwgY21heCA9CiAgICAgICAgICAgICAgICB3aWR0aCAtIHN0cmxlbihsZWF2ZV9pbmRlbnQpIC0gMTI7CiAgICAgICAgICAgICppcCA9IGxhc3RfaXBjaDsKICAgICAgICAgICAgZnByaW50ZihmLCAiJXMgIHwgIEluZGV4OiAiLCBsZWF2ZV9pbmRlbnQpOwogICAgICAgICAgICB3aGlsZSAoeHApIHsKICAgICAgICAgICAgICAgIGlmIChmaXJzdCkKICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IDA7CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgZnByaW50ZihmLCAiLCAiKTsKICAgICAgICAgICAgICAgIGNwb3MgKz0gKGxlbiA9IHN0cmxlbih4cC0+aWxhYmVsKSArIDIpOwogICAgICAgICAgICAgICAgaWYgKGNwb3MgPiBjbWF4KSB7CiAgICAgICAgICAgICAgICAgICAgZnByaW50ZihmLCAiXG4iKTsKICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGYsICIlcyAgfCAgICAgICAgICIsIGxlYXZlX2luZGVudCk7CiAgICAgICAgICAgICAgICAgICAgY3BvcyA9IGxlbjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZwcmludGYoZiwgIiVzIiwgeHAtPmlsYWJlbCk7CiAgICAgICAgICAgICAgICB4cCA9IHhwLT5uZXh0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZwcmludGYoZiwgIlxuIik7CiAgICAgICAgICAgICppcCA9ICcrJzsKICAgICAgICB9CiAgICB9IGVsc2UgewogICAgICAgIGNvbnN0IGNoYXIgICAgICphY2MsICp0eXA7CiAgICAgICAgaW50ICAgICAgICAgICAgIHNpemUgPSAwOwogICAgICAgIHN3aXRjaCAodHAtPmFjY2VzcykgewogICAgICAgIGNhc2UgTUlCX0FDQ0VTU19OT0FDQ0VTUzoKICAgICAgICAgICAgYWNjID0gIi0tLS0iOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIE1JQl9BQ0NFU1NfUkVBRE9OTFk6CiAgICAgICAgICAgIGFjYyA9ICItUi0tIjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBNSUJfQUNDRVNTX1dSSVRFT05MWToKICAgICAgICAgICAgYWNjID0gIi0tVy0iOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIE1JQl9BQ0NFU1NfUkVBRFdSSVRFOgogICAgICAgICAgICBhY2MgPSAiLVJXLSI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgTUlCX0FDQ0VTU19OT1RJRlk6CiAgICAgICAgICAgIGFjYyA9ICItLS1OIjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBNSUJfQUNDRVNTX0NSRUFURToKICAgICAgICAgICAgYWNjID0gIkNSLS0iOwogICAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBhY2MgPSAiICAgICI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBzd2l0Y2ggKHRwLT50eXBlKSB7CiAgICAgICAgY2FzZSBUWVBFX09CSklEOgogICAgICAgICAgICB0eXAgPSAiT2JqSUQgICAgIjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBUWVBFX09DVEVUU1RSOgogICAgICAgICAgICB0eXAgPSAiU3RyaW5nICAgIjsKICAgICAgICAgICAgc2l6ZSA9IDE7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVFlQRV9JTlRFR0VSOgogICAgICAgICAgICBpZiAodHAtPmVudW1zKQogICAgICAgICAgICAgICAgdHlwID0gIkVudW1WYWwgICI7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHR5cCA9ICJJTlRFR0VSICAiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFRZUEVfTkVUQUREUjoKICAgICAgICAgICAgdHlwID0gIk5ldEFkZHIgICI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVFlQRV9JUEFERFI6CiAgICAgICAgICAgIHR5cCA9ICJJcEFkZHIgICAiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFRZUEVfQ09VTlRFUjoKICAgICAgICAgICAgdHlwID0gIkNvdW50ZXIgICI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVFlQRV9HQVVHRToKICAgICAgICAgICAgdHlwID0gIkdhdWdlICAgICI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVFlQRV9USU1FVElDS1M6CiAgICAgICAgICAgIHR5cCA9ICJUaW1lVGlja3MiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFRZUEVfT1BBUVVFOgogICAgICAgICAgICB0eXAgPSAiT3BhcXVlICAgIjsKICAgICAgICAgICAgc2l6ZSA9IDE7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVFlQRV9OVUxMOgogICAgICAgICAgICB0eXAgPSAiTnVsbCAgICAgIjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBUWVBFX0NPVU5URVI2NDoKICAgICAgICAgICAgdHlwID0gIkNvdW50ZXI2NCI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVFlQRV9CSVRTVFJJTkc6CiAgICAgICAgICAgIHR5cCA9ICJCaXRTdHJpbmciOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFRZUEVfTlNBUEFERFJFU1M6CiAgICAgICAgICAgIHR5cCA9ICJOc2FwQWRkciAiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFRZUEVfVU5TSUdORUQzMjoKICAgICAgICAgICAgdHlwID0gIlVuc2lnbmVkICI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVFlQRV9VSU5URUdFUjoKICAgICAgICAgICAgdHlwID0gIlVJbnRlZ2VyICI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVFlQRV9JTlRFR0VSMzI6CiAgICAgICAgICAgIHR5cCA9ICJJbnRlZ2VyMzIiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICB0eXAgPSAiICAgICAgICAgIjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGZwcmludGYoZiwgIiVzLS0gJXMgJXMgJXMoJWxkKVxuIiwgbGVhdmVfaW5kZW50LCBhY2MsIHR5cCwKICAgICAgICAgICAgICAgIHRwLT5sYWJlbCwgdHAtPnN1YmlkKTsKICAgICAgICAqaXAgPSBsYXN0X2lwY2g7CiAgICAgICAgaWYgKHRwLT50Y19pbmRleCA+PSAwKQogICAgICAgICAgICBmcHJpbnRmKGYsICIlcyAgICAgICAgVGV4dHVhbCBDb252ZW50aW9uOiAlc1xuIiwgbGVhdmVfaW5kZW50LAogICAgICAgICAgICAgICAgICAgIHRjbGlzdFt0cC0+dGNfaW5kZXhdLmRlc2NyaXB0b3IpOwogICAgICAgIGlmICh0cC0+ZW51bXMpIHsKICAgICAgICAgICAgc3RydWN0IGVudW1fbGlzdCAqZXAgPSB0cC0+ZW51bXM7CiAgICAgICAgICAgIGludCAgICAgICAgICAgICBjcG9zID0gMCwgY21heCA9CiAgICAgICAgICAgICAgICB3aWR0aCAtIHN0cmxlbihsZWF2ZV9pbmRlbnQpIC0gMTY7CiAgICAgICAgICAgIGZwcmludGYoZiwgIiVzICAgICAgICBWYWx1ZXM6ICIsIGxlYXZlX2luZGVudCk7CiAgICAgICAgICAgIHdoaWxlIChlcCkgewogICAgICAgICAgICAgICAgY2hhciAgICAgICAgICAgIGJ1Zls4MF07CiAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgYnVmdzsKICAgICAgICAgICAgICAgIGlmIChlcCAhPSB0cC0+ZW51bXMpCiAgICAgICAgICAgICAgICAgICAgZnByaW50ZihmLCAiLCAiKTsKICAgICAgICAgICAgICAgIHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlcyglZCkiLCBlcC0+bGFiZWwsIGVwLT52YWx1ZSk7CiAgICAgICAgICAgICAgICBidWZbIHNpemVvZihidWYpLTEgXSA9IDA7CiAgICAgICAgICAgICAgICBjcG9zICs9IChidWZ3ID0gc3RybGVuKGJ1ZikgKyAyKTsKICAgICAgICAgICAgICAgIGlmIChjcG9zID49IGNtYXgpIHsKICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGYsICJcbiVzICAgICAgICAgICAgICAgICIsIGxlYXZlX2luZGVudCk7CiAgICAgICAgICAgICAgICAgICAgY3BvcyA9IGJ1Znc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmcHJpbnRmKGYsICIlcyIsIGJ1Zik7CiAgICAgICAgICAgICAgICBlcCA9IGVwLT5uZXh0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZwcmludGYoZiwgIlxuIik7CiAgICAgICAgfQogICAgICAgIGlmICh0cC0+cmFuZ2VzKSB7CiAgICAgICAgICAgIHN0cnVjdCByYW5nZV9saXN0ICpycCA9IHRwLT5yYW5nZXM7CiAgICAgICAgICAgIGlmIChzaXplKQogICAgICAgICAgICAgICAgZnByaW50ZihmLCAiJXMgICAgICAgIFNpemU6ICIsIGxlYXZlX2luZGVudCk7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIGZwcmludGYoZiwgIiVzICAgICAgICBSYW5nZTogIiwgbGVhdmVfaW5kZW50KTsKICAgICAgICAgICAgd2hpbGUgKHJwKSB7CiAgICAgICAgICAgICAgICBpZiAocnAgIT0gdHAtPnJhbmdlcykKICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGYsICIgfCAiKTsKICAgICAgICAgICAgICAgIHByaW50X3JhbmdlX3ZhbHVlKGYsIHRwLT50eXBlLCBycCk7CiAgICAgICAgICAgICAgICBycCA9IHJwLT5uZXh0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZwcmludGYoZiwgIlxuIik7CiAgICAgICAgfQogICAgfQogICAgKmlwID0gbGFzdF9pcGNoOwogICAgc3RyY2F0KGxlYXZlX2luZGVudCwgIiAgfCIpOwogICAgbGVhdmVfd2FzX3NpbXBsZSA9IHRwLT50eXBlICE9IFRZUEVfT1RIRVI7CgogICAgewogICAgICAgIGludCAgICAgICAgICAgICBpLCBqLCBjb3VudCA9IDA7CiAgICAgICAgc3RydWN0IGxlYXZlIHsKICAgICAgICAgICAgb2lkICAgICAgICAgICAgIGlkOwogICAgICAgICAgICBzdHJ1Y3QgdHJlZSAgICAqdHA7CiAgICAgICAgfSAgICAgICAgICAgICAgKmxlYXZlcywgKmxwOwoKICAgICAgICBmb3IgKG50cCA9IHRwLT5jaGlsZF9saXN0OyBudHA7IG50cCA9IG50cC0+bmV4dF9wZWVyKQogICAgICAgICAgICBjb3VudCsrOwogICAgICAgIGlmIChjb3VudCkgewogICAgICAgICAgICBsZWF2ZXMgPSAoc3RydWN0IGxlYXZlICopIGNhbGxvYyhjb3VudCwgc2l6ZW9mKHN0cnVjdCBsZWF2ZSkpOwogICAgICAgICAgICBpZiAoIWxlYXZlcykKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgZm9yIChudHAgPSB0cC0+Y2hpbGRfbGlzdCwgY291bnQgPSAwOyBudHA7CiAgICAgICAgICAgICAgICAgbnRwID0gbnRwLT5uZXh0X3BlZXIpIHsKICAgICAgICAgICAgICAgIGZvciAoaSA9IDAsIGxwID0gbGVhdmVzOyBpIDwgY291bnQ7IGkrKywgbHArKykKICAgICAgICAgICAgICAgICAgICBpZiAobHAtPmlkID49IG50cC0+c3ViaWQpCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgZm9yIChqID0gY291bnQ7IGogPiBpOyBqLS0pCiAgICAgICAgICAgICAgICAgICAgbGVhdmVzW2pdID0gbGVhdmVzW2ogLSAxXTsKICAgICAgICAgICAgICAgIGxwLT5pZCA9IG50cC0+c3ViaWQ7CiAgICAgICAgICAgICAgICBscC0+dHAgPSBudHA7CiAgICAgICAgICAgICAgICBjb3VudCsrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvciAoaSA9IDEsIGxwID0gbGVhdmVzOyBpIDw9IGNvdW50OyBpKyssIGxwKyspIHsKICAgICAgICAgICAgICAgIGlmICghbGVhdmVfd2FzX3NpbXBsZSB8fCBscC0+dHAtPnR5cGUgPT0gMCkKICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGYsICIlc1xuIiwgbGVhdmVfaW5kZW50KTsKICAgICAgICAgICAgICAgIGlmIChpID09IGNvdW50KQogICAgICAgICAgICAgICAgICAgIGlwWzNdID0gJyAnOwogICAgICAgICAgICAgICAgcHJpbnRfbWliX2xlYXZlcyhmLCBscC0+dHAsIHdpZHRoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmcmVlKGxlYXZlcyk7CiAgICAgICAgICAgIGxlYXZlX3dhc19zaW1wbGUgPSAwOwogICAgICAgIH0KICAgIH0KICAgIGlwWzFdID0gMDsKfQoKdm9pZApwcmludF9taWJfdHJlZShGSUxFICogZiwgc3RydWN0IHRyZWUgKnRwLCBpbnQgd2lkdGgpCnsKICAgIGxlYXZlX2luZGVudFswXSA9ICcgJzsKICAgIGxlYXZlX2luZGVudFsxXSA9IDA7CiAgICBsZWF2ZV93YXNfc2ltcGxlID0gMTsKICAgIHByaW50X21pYl9sZWF2ZXMoZiwgdHAsIHdpZHRoKTsKfQoKCi8qCiAqIE1lcmdlIHRoZSBwYXJzZWQgb2JqZWN0IGlkZW50aWZpZXIgd2l0aCB0aGUgZXhpc3Rpbmcgbm9kZS4KICogSWYgdGhlcmUgaXMgYSBwcm9ibGVtIHdpdGggdGhlIGlkZW50aWZpZXIsIHJlbGVhc2UgdGhlIGV4aXN0aW5nIG5vZGUuCiAqLwpzdGF0aWMgc3RydWN0IG5vZGUgKgptZXJnZV9wYXJzZV9vYmplY3RpZChzdHJ1Y3Qgbm9kZSAqbnAsIEZJTEUgKiBmcCwgY2hhciAqbmFtZSkKewogICAgc3RydWN0IG5vZGUgICAgKm5ucDsKICAgIC8qCiAgICAgKiBwcmludGYoIm1lcmdlIGRlZnZhbCAtLT4gJXNcbiIsbnAtPmRlZmF1bHRWYWx1ZSk7IAogICAgICovCiAgICBubnAgPSBwYXJzZV9vYmplY3RpZChmcCwgbmFtZSk7CiAgICBpZiAobm5wKSB7CgogICAgICAgIC8qCiAgICAgICAgICogYXBwbHkgbGFzdCBPSUQgc3ViLWlkZW50aWZpZXIgZGF0YSB0byB0aGUgaW5mb3JtYXRpb24gCiAgICAgICAgICovCiAgICAgICAgLyoKICAgICAgICAgKiBhbHJlYWR5IGNvbGxlY3RlZCBmb3IgdGhpcyBub2RlLiAKICAgICAgICAgKi8KICAgICAgICBzdHJ1Y3Qgbm9kZSAgICAqaGVhZHAsICpuZXh0cDsKICAgICAgICBpbnQgICAgICAgICAgICAgbmNvdW50ID0gMDsKICAgICAgICBuZXh0cCA9IGhlYWRwID0gbm5wOwogICAgICAgIHdoaWxlIChubnAtPm5leHQpIHsKICAgICAgICAgICAgbmV4dHAgPSBubnA7CiAgICAgICAgICAgIG5jb3VudCsrOwogICAgICAgICAgICBubnAgPSBubnAtPm5leHQ7CiAgICAgICAgfQoKICAgICAgICBucC0+bGFiZWwgPSBubnAtPmxhYmVsOwogICAgICAgIG5wLT5zdWJpZCA9IG5ucC0+c3ViaWQ7CiAgICAgICAgbnAtPm1vZGlkID0gbm5wLT5tb2RpZDsKICAgICAgICBucC0+cGFyZW50ID0gbm5wLT5wYXJlbnQ7CglpZiAobm5wLT5maWxlbmFtZSAhPSBOVUxMKSB7CgkgIGZyZWUobm5wLT5maWxlbmFtZSk7Cgl9CiAgICAgICAgZnJlZShubnApOwoKICAgICAgICBpZiAobmNvdW50KSB7CiAgICAgICAgICAgIG5leHRwLT5uZXh0ID0gbnA7CiAgICAgICAgICAgIG5wID0gaGVhZHA7CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICBmcmVlX25vZGUobnApOwogICAgICAgIG5wID0gTlVMTDsKICAgIH0KCiAgICByZXR1cm4gbnA7Cn0KCi8qCiAqIHRyYW5zZmVyIGRhdGEgdG8gdHJlZSBmcm9tIG5vZGUKICoKICogbW92ZSBwb2ludGVycyBmb3IgYWxsb2MnZCBkYXRhIGZyb20gbnAgdG8gdHAuCiAqIHRoaXMgcHJldmVudHMgdGhlbSBmcm9tIGJlaW5nIGZyZWVkIHdoZW4gbnAgaXMgcmVsZWFzZWQuCiAqIHBhcmVudCBtZW1iZXIgaXMgbm90IG1vdmVkLgogKgogKiBDQVVUSU9OOiBub2RlcyBtYXkgYmUgcmVwZWF0cyBvZiBleGlzdGluZyB0cmVlIG5vZGVzLgogKiBUaGlzIGNhbiBoYXBwZW4gZXNwZWNpYWxseSB3aGVuIHJlc29sdmluZyBJTVBPUlQgY2xhdXNlcy4KICoKICovCnN0YXRpYyB2b2lkCnRyZWVfZnJvbV9ub2RlKHN0cnVjdCB0cmVlICp0cCwgc3RydWN0IG5vZGUgKm5wKQp7CiAgICBmcmVlX3BhcnRpYWxfdHJlZSh0cCwgRkFMU0UpOwoKICAgIHRwLT5sYWJlbCA9IG5wLT5sYWJlbDsKICAgIG5wLT5sYWJlbCA9IE5VTEw7CiAgICB0cC0+ZW51bXMgPSBucC0+ZW51bXM7CiAgICBucC0+ZW51bXMgPSBOVUxMOwogICAgdHAtPnJhbmdlcyA9IG5wLT5yYW5nZXM7CiAgICBucC0+cmFuZ2VzID0gTlVMTDsKICAgIHRwLT5pbmRleGVzID0gbnAtPmluZGV4ZXM7CiAgICBucC0+aW5kZXhlcyA9IE5VTEw7CiAgICB0cC0+YXVnbWVudHMgPSBucC0+YXVnbWVudHM7CiAgICBucC0+YXVnbWVudHMgPSBOVUxMOwogICAgdHAtPnZhcmJpbmRzID0gbnAtPnZhcmJpbmRzOwogICAgbnAtPnZhcmJpbmRzID0gTlVMTDsKICAgIHRwLT5oaW50ID0gbnAtPmhpbnQ7CiAgICBucC0+aGludCA9IE5VTEw7CiAgICB0cC0+dW5pdHMgPSBucC0+dW5pdHM7CiAgICBucC0+dW5pdHMgPSBOVUxMOwogICAgdHAtPmRlc2NyaXB0aW9uID0gbnAtPmRlc2NyaXB0aW9uOwogICAgbnAtPmRlc2NyaXB0aW9uID0gTlVMTDsKICAgIHRwLT5yZWZlcmVuY2UgPSBucC0+cmVmZXJlbmNlOwogICAgbnAtPnJlZmVyZW5jZSA9IE5VTEw7CiAgICB0cC0+ZGVmYXVsdFZhbHVlID0gbnAtPmRlZmF1bHRWYWx1ZTsKICAgIG5wLT5kZWZhdWx0VmFsdWUgPSBOVUxMOwogICAgdHAtPnN1YmlkID0gbnAtPnN1YmlkOwogICAgdHAtPnRjX2luZGV4ID0gbnAtPnRjX2luZGV4OwogICAgdHAtPnR5cGUgPSB0cmFuc2xhdGlvbl90YWJsZVtucC0+dHlwZV07CiAgICB0cC0+YWNjZXNzID0gbnAtPmFjY2VzczsKICAgIHRwLT5zdGF0dXMgPSBucC0+c3RhdHVzOwoKICAgIHNldF9mdW5jdGlvbih0cCk7Cn0KCiNlbmRpZiAvKiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcgKi8K