ZGlmZiAtLWdpdCBhL2F1dG8vY2MvZ2NjIGIvYXV0by9jYy9nY2MKaW5kZXggZDY2NDdlNS4uYzViNGU3NCAxMDA2NDQKLS0tIGEvYXV0by9jYy9nY2MKKysrIGIvYXV0by9jYy9nY2MKQEAgLTMsNyArMyw3IEBACiAKIAogIyBnY2MgMi43LjIuMywgMi44LjEsIDIuOTUuNCwKLSMgICAgIDMuMC40LCAzLjEuMSwgMy4yLjMsIDMuMy4yLCAzLjMuMywgMy4zLjQsIDMuNCwgMy40LjIKKyMgICAgIDMuMC40LCAzLjEuMSwgMy4yLjMsIDMuMy4yLCAzLjMuMywgMy4zLjQsIDMuNC4wLCAzLjQuMgogCiAKICMgU29sYXJpcyA3J3MgL3Vzci9jY3MvYmluL2FzIGRvZXMgbm90IHN1cHBvcnQgIi1waXBlIgpkaWZmIC0tZ2l0IGEvYXV0by9vcHRpb25zIGIvYXV0by9vcHRpb25zCmluZGV4IGRkNzQwZmUuLjhiOTQxMTMgMTAwNjQ0Ci0tLSBhL2F1dG8vb3B0aW9ucworKysgYi9hdXRvL29wdGlvbnMKQEAgLTQ4LDcgKzQ4LDcgQEAKIEhUVFBfQ0hBUlNFVD1ZRVMKIEhUVFBfR1pJUD1ZRVMKIEhUVFBfU1NMPU5PCi1IVFRQX1NTST1OTworSFRUUF9TU0k9WUVTCiBIVFRQX0FDQ0VTUz1ZRVMKIEhUVFBfVVNFUklEPVlFUwogSFRUUF9BVVRPSU5ERVg9WUVTCmRpZmYgLS1naXQgYS9kb2NzL3htbC9uZ2lueC9jaGFuZ2VzLnhtbCBiL2RvY3MveG1sL25naW54L2NoYW5nZXMueG1sCmluZGV4IGY5MDY4YzguLjMxMzA1OTEgMTAwNjQ0Ci0tLSBhL2RvY3MveG1sL25naW54L2NoYW5nZXMueG1sCisrKyBiL2RvY3MveG1sL25naW54L2NoYW5nZXMueG1sCkBAIC05LDYgKzksODEgQEAKIDx0aXRsZSBsYW5nPSJlbiI+bmdpbnggY2hhbmdlbG9nPC90aXRsZT4KIAogCis8Y2hhbmdlcyB2ZXI9IjAuMS4yMyIgZGF0ZT0iMDEuMDMuMjAwNSI+CisKKzxjaGFuZ2UgdHlwZT0iZmVhdHVyZSI+Cis8cGFyYSBsYW5nPSJydSI+CivNz8TVzNggbmd4X2h0dHBfc3NpX2ZpbHRlcl9tb2R1bGUgyQorxMnSxcvUydfZIHNzaSwgc3NpX3NpbGVudF9lcnJvcnMgySBzc2lfbWluX2ZpbGVfY2h1bmsuCivwz8TExdLWydfBwNTT0SDLz83BzsTZICdlY2hvIHZhcj0iSFRUUF8uLi4iIGRlZmF1bHQ9IiInIMkKKydlY2hvIHZhcj0iUkVNT1RFX0FERFIiJy4KKzwvcGFyYT4KKzxwYXJhIGxhbmc9ImVuIj4KK3RoZSBuZ3hfaHR0cF9zc2lfZmlsdGVyX21vZHVsZSBhbmQKK3RoZSBzc2ksIHNzaV9zaWxlbnRfZXJyb3JzLCBhbmQgc3NpX21pbl9maWxlX2NodW5rIGRpcmVjdGl2ZXMuCitUaGUgJ2VjaG8gdmFyPSJIVFRQXy4uLiIgZGVmYXVsdD0iIicgYW5kICdlY2hvIHZhcj0iUkVNT1RFX0FERFIiJyBjb21tYW5kcworYXJlIHN1cHBvcnRlZC4KKzwvcGFyYT4KKzwvY2hhbmdlPgorCis8Y2hhbmdlIHR5cGU9ImZlYXR1cmUiPgorPHBhcmEgbGFuZz0icnUiPgor0MHSwc3F1NIgzM/HwSAlcmVxdWVzdF90aW1lLgorPC9wYXJhPgorPHBhcmEgbGFuZz0iZW4iPgordGhlICVyZXF1ZXN0X3RpbWUgbG9nIHBhcmFtZXRlci4KKzwvcGFyYT4KKzwvY2hhbmdlPgorCis8Y2hhbmdlIHR5cGU9ImZlYXR1cmUiPgorPHBhcmEgbGFuZz0icnUiPgorxdPMySDawdDSz9Mg0NLJ26PMIMLF2iDT1NLPy8kg2sHHz8zP18vBICJIb3N0Iiwg1M8gxMnSxcvUydfBCitwcm94eV9wcmVzZXJ2ZV9ob3N0INXT1MHOwdfMydfBxdQg1yDLwd7F09TXxSDc1M/HzyDawcfPzM/Xy8Eg0MXS18/FIMnN0Qor08XS18XSwSDJ2iDEydLFy9TJ19kgc2VydmVyX25hbWUuCis8L3BhcmE+Cis8cGFyYSBsYW5nPSJlbiI+CitpZiB0aGUgcmVxdWVzdCBoYXMgbm8gdGhlICJIb3N0IiBoZWFkZXIgbGluZSwgdGhlbiB0aGUgcHJveHlfcHJlc2VydmVfaG9zdAorZGlyZWN0aXZlIHNldCB0aGlzIGhlYWRlciBsaW5lIHRvIHRoZSBmaXJzdCBzZXJ2ZXIgbmFtZSBvZiB0aGUgc2VydmVyX25hbWUKK2RpcmVjdGl2ZS4KKzwvcGFyYT4KKzwvY2hhbmdlPgorCis8Y2hhbmdlIHR5cGU9ImJ1Z2ZpeCI+Cis8cGFyYSBsYW5nPSJydSI+CituZ2lueCDOxSDTz8LJ0sHM09EgzsEg0MzB1MbP0s3ByCwgz9TMyd7O2cggz9QgaTM4NiwgYW1kNjQsIHNwYXJjIMkgcHBjOworz9vJwsvBINDP0dfJzMHT2CDXIDAuMS4yMi4KKzwvcGFyYT4KKzxwYXJhIGxhbmc9ImVuIj4KK25naW54IGNvdWxkIG5vdCBiZSBidWlsdCBvbiBwbGF0Zm9ybXMgZGlmZmVyZW50IGZyb20gaTM4NiwgYW1kNjQsIHNwYXJjIMkgcHBjOworYnVnIGFwcGVhcmVkIGluIDAuMS4yMi4KKzwvcGFyYT4KKzwvY2hhbmdlPgorCis8Y2hhbmdlIHR5cGU9ImJ1Z2ZpeCI+Cis8cGFyYSBsYW5nPSJydSI+CivNz8TVzNggbmd4X2h0dHBfYXV0b2luZGV4X21vZHVsZSDUxdDF0tgg0M/LwdrZ18HF1CDJzsbP0s3Bw8nAIM7FIM8KK9PJzdfPzMnexdPLz80gzMnOy8UsIMEgzyDGwcrMxSDJzMkgy8HUwczPx8UsIM7BIMvP1M/S2cogz84g1cvB2tnXwcXULgorPC9wYXJhPgorPHBhcmEgbGFuZz0iZW4iPgordGhlIG5neF9odHRwX2F1dG9pbmRleF9tb2R1bGUgbm93IHNob3dzIHRoZSBpbmZvcm1hdGlvbiBub3QgYWJvdXQgdGhlIHN5bWxpbmssCitidXQgYWJvdXQgZmlsZSBvciBkaXJlY3RvcnkgaXQgcG9pbnRzIHRvLgorPC9wYXJhPgorPC9jaGFuZ2U+CisKKzxjaGFuZ2UgdHlwZT0iYnVnZml4Ij4KKzxwYXJhIGxhbmc9InJ1Ij4KK8XTzMkgy8zJxc7U1SDOyd7Fx88gzsUg0MXSxcTB18HMz9PYLCDUzyDQwdLBzcXU0iAlYXBhY2hlX2xlbmd0aAor2sHQydPZ18HMINcgzM/HIM/U0snDwdTFzNjO1cAgxMzJztUg2sHHz8zP18vBIM/U18XUwS4KKzwvcGFyYT4KKzxwYXJhIGxhbmc9ImVuIj4KK3RoZSAlYXBhY2hlX2xlbmd0aCBwYXJhbWV0ZXIgbG9nZ2VkIHRoZSBuZWdhdGl2ZSBsZW5ndGgKK29mIHRoZSByZXNwb25zZSBoZWFkZXIgaWYgdGhlIG5vIHJlc3BvbnNlIHdhcyB0cmFuc2ZlcnJlZCB0byBhIGNsaWVudC4KKzwvcGFyYT4KKzwvY2hhbmdlPgorCis8L2NoYW5nZXM+CisKKwogPGNoYW5nZXMgdmVyPSIwLjEuMjIiIGRhdGU9IjIyLjAyLjIwMDUiPgogCiA8Y2hhbmdlIHR5cGU9ImJ1Z2ZpeCI+CkBAIC0xOSw3ICs5NCw3IEBACiA8L3BhcmE+CiA8cGFyYSBsYW5nPSJlbiI+CiB0aGUgbmd4X2h0dHBfc3R1Yl9zdGF0dXNfbW9kdWxlIHNob3dlZCBpbmNvcnJlY3QgaGFuZGxlZCBjb25uZWN0aW9ucwotc3RhdGljdGljcyBpZiB0aGUgcHJveGluZyBvciBGYXN0Q0dJIHNlcnZlciB3ZXJlIHVzZWQuCitzdGF0aXN0aWNzIGlmIHRoZSBwcm94aW5nIG9yIEZhc3RDR0kgc2VydmVyIHdlcmUgdXNlZC4KIDwvcGFyYT4KIDwvY2hhbmdlPgogCkBAIC0yOSw3ICsxMDQsNyBAQAogz9vJwsvBINDP0dfJzMHT2CDXIDAuMS4yMS4KIDwvcGFyYT4KIDxwYXJhIGxhbmc9ImVuIj4KLXRoZSBpbnN0YWxsYXRpb24gcGF0aGVzIHdlcmUgaW5jb3JyZWN0bHkgcXVvdGVkIG9uIExpbnV4IGFuZCBTb2xhcmlzOwordGhlIGluc3RhbGxhdGlvbiBwYXRocyB3ZXJlIGluY29ycmVjdGx5IHF1b3RlZCBvbiBMaW51eCBhbmQgU29sYXJpczsKIGJ1ZyBhcHBlYXJlZCBpbiAwLjEuMjEuCiA8L3BhcmE+CiA8L2NoYW5nZT4KQEAgLTQ2LDcgKzEyMSw3IEBACiDSwcLP3snIINDSz8PF09PP1yDOwSBTTVAgzcHbyc7FLgogPC9wYXJhPgogPHBhcmEgbGFuZz0iZW4iPgotdGhlIG5neF9odHRwX3N0dWJfc3RhdHVzX21vZHVsZSBzaG93ZWQgaW5jb3JyZWN0IHN0YXRpY3RpY3MKK3RoZSBuZ3hfaHR0cF9zdHViX3N0YXR1c19tb2R1bGUgc2hvd2VkIGluY29ycmVjdCBzdGF0aXN0aWNzCiBpZiAicnRzaWciIG1ldGhvZCB3YXMgdXNlZCBvciBpZiBzZXZlcmFsIHdvcmtlciBwcm9jZXNzIHJhbiBvbiBTTVAuCiA8L3BhcmE+CiA8L2NoYW5nZT4KQEAgLTgyLDcgKzE1Nyw3IEBACiA8L3BhcmE+CiA8cGFyYSBsYW5nPSJlbiI+CiB0aGUgbmV3ICJzY3JpcHRfZmlsZW5hbWUiIGFuZCAicmVtb3RlX3BvcnQiIHBhcmFtZXRlcnMKLW9mdGhlIGZhc3RjZ2lfcGFyYW1zIGRpcmVjdGl2ZS4KK29mIHRoZSBmYXN0Y2dpX3BhcmFtcyBkaXJlY3RpdmUuCiA8L3BhcmE+CiA8L2NoYW5nZT4KIApAQCAtOTEsNyArMTY2LDcgQEAKIM7F0NLB18nM2M7PIM/C0sHCwdTZ18HM09Eg0M/Uz8sgc3RkZXJyIM/UIEZhc3RDR0kt08XS18XSwS4KIDwvcGFyYT4KIDxwYXJhIGxhbmc9ImVuIj4KLXRoZSBGYXN0Q0dJIHN0ZGVyciBzdHJlYW0gd2FzIGhhbmRsZWQgaW5jb3JyZdN0bHkuCit0aGUgRmFzdENHSSBzdGRlcnIgc3RyZWFtIHdhcyBoYW5kbGVkIGluY29ycmVjdGx5LgogPC9wYXJhPgogPC9jaGFuZ2U+CiAKQEAgLTQyMCw3ICs0OTUsNyBAQAog19nExczFzs7ZyCDewdPUxcogzsUg08/X0MHEwcXUINMg3snTzM/NINDPxNPUwc7P18/LLgogPC9wYXJhPgogPHBhcmEgbGFuZz0iZW4iPgotdGhlIGNvcnJlY3QgaGFuZGxpbmcgb2YgdGhlIHJlZ3VsYXIgZXhwb3Jlc3Npb24sIHRoYXQKK3RoZSBjb3JyZWN0IGhhbmRsaW5nIG9mIHRoZSByZWd1bGFyIGV4cHJlc3Npb24sIHRoYXQKIGhhcyBkaWZmZXJlbnQgbnVtYmVyIG9mIHRoZSBjYXB0dXJlcyBhbmQgc3Vic3RpdHV0aW9ucy4KIDwvcGFyYT4KIDwvY2hhbmdlPgpAQCAtNDMyLDcgKzUwNyw3IEBACiA8L3BhcmE+CiA8cGFyYSBsYW5nPSJlbiI+CiB0aGUgbG9jYXRpb24sIHRoYXQgaXMgcGFzc2VkIHRvIHRoZSBGYXN0Q0dJIHNlcnZlciwgY2FuIGJlCi1yZWd1YWxhciBleHByZXNzaW9uLgorcmVndWxhciBleHByZXNzaW9uLgogPC9wYXJhPgogPC9jaGFuZ2U+CiAKQEAgLTQ4MCw5ICs1NTUsOSBAQAog1M8g0NLPydPIz8TJzCBzZWdtZW50YXRpb24gZmF1bHQuCiA8L3BhcmE+CiA8cGFyYSBsYW5nPSJlbiI+Ci10aGUgc2FtZSBwYXRoZXMgaW4gYXV0b2NvbmZpZ3VyYXRpb24gcGFyYW10ZXJzCit0aGUgc2FtZSBwYXRocyBpbiBhdXRvY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzCiAtLWh0dHAtY2xpZW50LWJvZHktdGVtcC1wYXRoPVBBVEggYW5kIC0taHR0cC1wcm94eS10ZW1wLXBhdGg9UEFUSCwKLW9yIC0taHR0cC1jbGllbnQtYm9keS10ZW1wLXBhdGg9UEFUSCBuYWQgLS1odHRwLWZhc3RjZ2ktdGVtcC1wYXRoPVBBVEgKK29yIC0taHR0cC1jbGllbnQtYm9keS10ZW1wLXBhdGg9UEFUSCBhbmQgLS1odHRwLWZhc3RjZ2ktdGVtcC1wYXRoPVBBVEgKIGNhdXNlZCBzZWdtZW50YXRpb24gZmF1bHQuCiA8L3BhcmE+CiA8L2NoYW5nZT4KQEAgLTc4Myw3ICs4NTgsNyBAQAogwdfUz83B1MnexdPLz8Ugz9DSxcTFzMXOycUgx9LV0NAgbm9ib2R5IMkgbm9ncm91cC4KIDwvcGFyYT4KIDxwYXJhIGxhbmc9ImVuIj4KLXRoZSBhdXRvZGV0ZWN0aW9uIG9mIHRoZSBub2JvZHkgYW5kIG5vZ3JvdXAgZ3JvdXBzLgordGhlIGF1dG9kZXRlY3Rpb24gb2YgdGhlICJub2JvZHkiIGFuZCAibm9ncm91cCIgZ3JvdXBzLgogPC9wYXJhPgogPC9jaGFuZ2U+CiAKQEAgLTk2MCw3ICsxMDM1LDcgQEAKIMnT0M/M2NrP18HMwdPYIMvPzsbJx9XSwcPJ0SDOxSDJ2iDUz8fPIGxvY2F0aW9uLgogPC9wYXJhPgogPHBhcmEgbGFuZz0iZW4iPgotc29tZSBsb2NhdGlvbiBkaXJlY3RpdmUgY29tYmlhdGlvbnMgd2l0aCB0aGUgcmVndWxhciBleHByZXNzaW9ucyBjYXVzZWQKK3NvbWUgbG9jYXRpb24gZGlyZWN0aXZlIGNvbWJpbmF0aW9ucyB3aXRoIHRoZSByZWd1bGFyIGV4cHJlc3Npb25zIGNhdXNlZAogdGhlIHdyb25nIGNvbmZpZ3VyYXRpb24gY2hvb3NlLgogPC9wYXJhPgogPC9jaGFuZ2U+CmRpZmYgLS1naXQgYS9zcmMvY29yZS9uZ2lueC5oIGIvc3JjL2NvcmUvbmdpbnguaAppbmRleCAwNzNkNjgyLi44ZmJjNzQ4IDEwMDY0NAotLS0gYS9zcmMvY29yZS9uZ2lueC5oCisrKyBiL3NyYy9jb3JlL25naW54LmgKQEAgLTgsNyArOCw3IEBACiAjZGVmaW5lIF9OR0lOWF9IX0lOQ0xVREVEXwogCiAKLSNkZWZpbmUgTkdJTlhfVkVSICAgICAgICAgICJuZ2lueC8wLjEuMjIiCisjZGVmaW5lIE5HSU5YX1ZFUiAgICAgICAgICAibmdpbngvMC4xLjIzIgogCiAjZGVmaW5lIE5HSU5YX1ZBUiAgICAgICAgICAiTkdJTlgiCiAjZGVmaW5lIE5HWF9ORVdQSURfRVhUICAgICAiLm5ld2JpbiIKZGlmZiAtLWdpdCBhL3NyYy9ldmVudC9uZ3hfZXZlbnRfYWNjZXB0ZXguYyBiL3NyYy9ldmVudC9uZ3hfZXZlbnRfYWNjZXB0ZXguYwppbmRleCAzY2ZiYTY4Li5kMDFkYmYxIDEwMDY0NAotLS0gYS9zcmMvZXZlbnQvbmd4X2V2ZW50X2FjY2VwdGV4LmMKKysrIGIvc3JjL2V2ZW50L25neF9ldmVudF9hY2NlcHRleC5jCkBAIC03LDcgKzcsNiBAQAogI2luY2x1ZGUgPG5neF9jb25maWcuaD4KICNpbmNsdWRlIDxuZ3hfY29yZS5oPgogI2luY2x1ZGUgPG5neF9ldmVudC5oPgotI2luY2x1ZGUgPG5naW54Lmg+CiAKIAogdm9pZCBuZ3hfZXZlbnRfYWNjZXB0ZXgobmd4X2V2ZW50X3QgKnJldikKZGlmZiAtLWdpdCBhL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfYXV0b2luZGV4X2hhbmRsZXIuYyBiL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfYXV0b2luZGV4X2hhbmRsZXIuYwppbmRleCAyZTU1NWEwLi5mNzg3OGM5IDEwMDY0NAotLS0gYS9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX2F1dG9pbmRleF9oYW5kbGVyLmMKKysrIGIvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9hdXRvaW5kZXhfaGFuZGxlci5jCkBAIC0yNDEsNyArMjQxLDcgQEAKIAogICAgICAgICBpZiAobGVuID09IDIKICAgICAgICAgICAgICYmIG5neF9kZV9uYW1lKCZkaXIpWzBdID09ICcuJwotICAgICAgICAgICAgJiYgbmd4X2RlX25hbWUoJmRpcilbMF0gPT0gJy4nKQorICAgICAgICAgICAgJiYgbmd4X2RlX25hbWUoJmRpcilbMV0gPT0gJy4nKQogICAgICAgICB7CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQpAQCAtMjYzLDkgKzI2MywyMCBAQAogICAgICAgICAgICAgbmd4X2NweXN0cm4obGFzdCwgbmd4X2RlX25hbWUoJmRpciksIGxlbiArIDEpOwogCiAgICAgICAgICAgICBpZiAobmd4X2RlX2luZm8oZm5hbWUuZGF0YSwgJmRpcikgPT0gTkdYX0ZJTEVfRVJST1IpIHsKLSAgICAgICAgICAgICAgICBuZ3hfbG9nX2Vycm9yKE5HWF9MT0dfQ1JJVCwgci0+Y29ubmVjdGlvbi0+bG9nLCBuZ3hfZXJybm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfZGVfaW5mb19uICIgXCIlc1wiIGZhaWxlZCIsIGZuYW1lLmRhdGEpOwotICAgICAgICAgICAgICAgIHJldHVybiBuZ3hfaHR0cF9hdXRvaW5kZXhfZXJyb3IociwgJmRpciwgZG5hbWUuZGF0YSk7CisgICAgICAgICAgICAgICAgZXJyID0gbmd4X2Vycm5vOworCisgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBOR1hfRU5PRU5UKSB7CisgICAgICAgICAgICAgICAgICAgIG5neF9sb2dfZXJyb3IoTkdYX0xPR19DUklULCByLT5jb25uZWN0aW9uLT5sb2csIGVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfZGVfaW5mb19uICIgXCIlc1wiIGZhaWxlZCIsIGZuYW1lLmRhdGEpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmd4X2h0dHBfYXV0b2luZGV4X2Vycm9yKHIsICZkaXIsIGRuYW1lLmRhdGEpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChuZ3hfZGVfbGlua19pbmZvKGZuYW1lLmRhdGEsICZkaXIpID09IE5HWF9GSUxFX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgICAgIG5neF9sb2dfZXJyb3IoTkdYX0xPR19DUklULCByLT5jb25uZWN0aW9uLT5sb2csIG5neF9lcnJubywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfZGVfbGlua19pbmZvX24gIiBcIiVzXCIgZmFpbGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbmFtZS5kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5neF9odHRwX2F1dG9pbmRleF9lcnJvcihyLCAmZGlyLCBkbmFtZS5kYXRhKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9nemlwX2ZpbHRlci5jIGIvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9nemlwX2ZpbHRlci5jCmluZGV4IGM3YTE2YTcuLmVlYzZhMTMgMTAwNjQ0Ci0tLSBhL3NyYy9odHRwL21vZHVsZXMvbmd4X2h0dHBfZ3ppcF9maWx0ZXIuYworKysgYi9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX2d6aXBfZmlsdGVyLmMKQEAgLTc2LDIzICs3NiwyMyBAQAogCiAKIHN0YXRpYyBuZ3hfaW50X3Qgbmd4X2h0dHBfZ3ppcF9wcm94aWVkKG5neF9odHRwX3JlcXVlc3RfdCAqciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5neF9odHRwX2d6aXBfY29uZl90ICpjb25mKTsKKyAgICBuZ3hfaHR0cF9nemlwX2NvbmZfdCAqY29uZik7CiBzdGF0aWMgdm9pZCAqbmd4X2h0dHBfZ3ppcF9maWx0ZXJfYWxsb2Modm9pZCAqb3BhcXVlLCB1X2ludCBpdGVtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2ludCBzaXplKTsKKyAgICB1X2ludCBzaXplKTsKIHN0YXRpYyB2b2lkIG5neF9odHRwX2d6aXBfZmlsdGVyX2ZyZWUodm9pZCAqb3BhcXVlLCB2b2lkICphZGRyZXNzKTsKIHN0YXRpYyB2b2lkIG5neF9odHRwX2d6aXBfZXJyb3Iobmd4X2h0dHBfZ3ppcF9jdHhfdCAqY3R4KTsKIAogc3RhdGljIHVfY2hhciAqbmd4X2h0dHBfZ3ppcF9sb2dfcmF0aW8obmd4X2h0dHBfcmVxdWVzdF90ICpyLCB1X2NoYXIgKmJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5neF9odHRwX2xvZ19vcF90ICpvcCk7CisgICAgbmd4X2h0dHBfbG9nX29wX3QgKm9wKTsKIAogc3RhdGljIG5neF9pbnRfdCBuZ3hfaHR0cF9nemlwX2FkZF9sb2dfZm9ybWF0cyhuZ3hfY29uZl90ICpjZik7CiAKIHN0YXRpYyBuZ3hfaW50X3Qgbmd4X2h0dHBfZ3ppcF9maWx0ZXJfaW5pdChuZ3hfY3ljbGVfdCAqY3ljbGUpOwogc3RhdGljIHZvaWQgKm5neF9odHRwX2d6aXBfY3JlYXRlX2NvbmYobmd4X2NvbmZfdCAqY2YpOwogc3RhdGljIGNoYXIgKm5neF9odHRwX2d6aXBfbWVyZ2VfY29uZihuZ3hfY29uZl90ICpjZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcGFyZW50LCB2b2lkICpjaGlsZCk7CisgICAgdm9pZCAqcGFyZW50LCB2b2lkICpjaGlsZCk7CiBzdGF0aWMgY2hhciAqbmd4X2h0dHBfZ3ppcF9zZXRfdHlwZXMobmd4X2NvbmZfdCAqY2YsIG5neF9jb21tYW5kX3QgKmNtZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjb25mKTsKKyAgICB2b2lkICpjb25mKTsKIHN0YXRpYyBjaGFyICpuZ3hfaHR0cF9nemlwX3NldF93aW5kb3cobmd4X2NvbmZfdCAqY2YsIHZvaWQgKnBvc3QsIHZvaWQgKmRhdGEpOwogc3RhdGljIGNoYXIgKm5neF9odHRwX2d6aXBfc2V0X2hhc2gobmd4X2NvbmZfdCAqY2YsIHZvaWQgKnBvc3QsIHZvaWQgKmRhdGEpOwogCkBAIC0yNjEsNyArMjYxLDggQEAKIHN0YXRpYyBuZ3hfaHR0cF9vdXRwdXRfYm9keV9maWx0ZXJfcHQgICAgbmd4X2h0dHBfbmV4dF9ib2R5X2ZpbHRlcjsKIAogCi1zdGF0aWMgbmd4X2ludF90IG5neF9odHRwX2d6aXBfaGVhZGVyX2ZpbHRlcihuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIpCitzdGF0aWMgbmd4X2ludF90CituZ3hfaHR0cF9nemlwX2hlYWRlcl9maWx0ZXIobmd4X2h0dHBfcmVxdWVzdF90ICpyKQogewogICAgIG5neF91aW50X3QgICAgICAgICAgICAgaSwgZm91bmQ7CiAgICAgbmd4X2h0dHBfZ3ppcF9jdHhfdCAgICpjdHg7CkBAIC0zNTcsOCArMzU4LDggQEAKIH0KIAogCi1zdGF0aWMgbmd4X2ludF90IG5neF9odHRwX2d6aXBfcHJveGllZChuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfaHR0cF9nemlwX2NvbmZfdCAqY29uZikKK3N0YXRpYyBuZ3hfaW50X3QKK25neF9odHRwX2d6aXBfcHJveGllZChuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIG5neF9odHRwX2d6aXBfY29uZl90ICpjb25mKQogewogICAgIHRpbWVfdCAgZGF0ZSwgZXhwaXJlczsKIApAQCAtNDM3LDggKzQzOCw4IEBACiB9CiAKIAotc3RhdGljIG5neF9pbnRfdCBuZ3hfaHR0cF9nemlwX2JvZHlfZmlsdGVyKG5neF9odHRwX3JlcXVlc3RfdCAqciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfY2hhaW5fdCAqaW4pCitzdGF0aWMgbmd4X2ludF90CituZ3hfaHR0cF9nemlwX2JvZHlfZmlsdGVyKG5neF9odHRwX3JlcXVlc3RfdCAqciwgbmd4X2NoYWluX3QgKmluKQogewogICAgIGludCAgICAgICAgICAgICAgICAgICAgcmMsIHdiaXRzLCBtZW1sZXZlbDsKICAgICBuZ3hfaW50X3QgICAgICAgICAgICAgIGxhc3Q7CkBAIC04MjUsNyArODI2LDggQEAKIH0KIAogCi1zdGF0aWMgdm9pZCAqbmd4X2h0dHBfZ3ppcF9maWx0ZXJfYWxsb2Modm9pZCAqb3BhcXVlLCB1X2ludCBpdGVtcywgdV9pbnQgc2l6ZSkKK3N0YXRpYyB2b2lkICoKK25neF9odHRwX2d6aXBfZmlsdGVyX2FsbG9jKHZvaWQgKm9wYXF1ZSwgdV9pbnQgaXRlbXMsIHVfaW50IHNpemUpCiB7CiAgICAgbmd4X2h0dHBfZ3ppcF9jdHhfdCAqY3R4ID0gb3BhcXVlOwogCkBAIC04NjYsNyArODY4LDggQEAKIH0KIAogCi1zdGF0aWMgdm9pZCBuZ3hfaHR0cF9nemlwX2ZpbHRlcl9mcmVlKHZvaWQgKm9wYXF1ZSwgdm9pZCAqYWRkcmVzcykKK3N0YXRpYyB2b2lkCituZ3hfaHR0cF9nemlwX2ZpbHRlcl9mcmVlKHZvaWQgKm9wYXF1ZSwgdm9pZCAqYWRkcmVzcykKIHsKICNpZiAwCiAgICAgbmd4X2h0dHBfZ3ppcF9jdHhfdCAqY3R4ID0gb3BhcXVlOwpAQCAtODc3LDggKzg4MCw5IEBACiB9CiAKIAotc3RhdGljIHVfY2hhciAqbmd4X2h0dHBfZ3ppcF9sb2dfcmF0aW8obmd4X2h0dHBfcmVxdWVzdF90ICpyLCB1X2NoYXIgKmJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5neF9odHRwX2xvZ19vcF90ICpvcCkKK3N0YXRpYyB1X2NoYXIgKgorbmd4X2h0dHBfZ3ppcF9sb2dfcmF0aW8obmd4X2h0dHBfcmVxdWVzdF90ICpyLCB1X2NoYXIgKmJ1ZiwKKyAgICBuZ3hfaHR0cF9sb2dfb3BfdCAqb3ApCiB7CiAgICAgbmd4X3VpbnRfdCAgICAgICAgICAgIHppbnQsIHpmcmFjOwogICAgIG5neF9odHRwX2d6aXBfY3R4X3QgICpjdHg7CkBAIC05MDksNyArOTEzLDggQEAKIH0KIAogCi1zdGF0aWMgdm9pZCBuZ3hfaHR0cF9nemlwX2Vycm9yKG5neF9odHRwX2d6aXBfY3R4X3QgKmN0eCkKK3N0YXRpYyB2b2lkCituZ3hfaHR0cF9nemlwX2Vycm9yKG5neF9odHRwX2d6aXBfY3R4X3QgKmN0eCkKIHsKICAgICBkZWZsYXRlRW5kKCZjdHgtPnpzdHJlYW0pOwogCkBAIC05MjYsNyArOTMxLDggQEAKIH0KIAogCi1zdGF0aWMgbmd4X2ludF90IG5neF9odHRwX2d6aXBfYWRkX2xvZ19mb3JtYXRzKG5neF9jb25mX3QgKmNmKQorc3RhdGljIG5neF9pbnRfdAorbmd4X2h0dHBfZ3ppcF9hZGRfbG9nX2Zvcm1hdHMobmd4X2NvbmZfdCAqY2YpCiB7CiAgICAgbmd4X2h0dHBfbG9nX29wX25hbWVfdCAgKm9wOwogCkBAIC05NDUsNyArOTUxLDggQEAKIH0KIAogCi1zdGF0aWMgbmd4X2ludF90IG5neF9odHRwX2d6aXBfZmlsdGVyX2luaXQobmd4X2N5Y2xlX3QgKmN5Y2xlKQorc3RhdGljIG5neF9pbnRfdAorbmd4X2h0dHBfZ3ppcF9maWx0ZXJfaW5pdChuZ3hfY3ljbGVfdCAqY3ljbGUpCiB7CiAgICAgbmd4X2h0dHBfbmV4dF9oZWFkZXJfZmlsdGVyID0gbmd4X2h0dHBfdG9wX2hlYWRlcl9maWx0ZXI7CiAgICAgbmd4X2h0dHBfdG9wX2hlYWRlcl9maWx0ZXIgPSBuZ3hfaHR0cF9nemlwX2hlYWRlcl9maWx0ZXI7CkBAIC05NTcsNyArOTY0LDggQEAKIH0KIAogCi1zdGF0aWMgdm9pZCAqbmd4X2h0dHBfZ3ppcF9jcmVhdGVfY29uZihuZ3hfY29uZl90ICpjZikKK3N0YXRpYyB2b2lkICoKK25neF9odHRwX2d6aXBfY3JlYXRlX2NvbmYobmd4X2NvbmZfdCAqY2YpCiB7CiAgICAgbmd4X2h0dHBfZ3ppcF9jb25mX3QgICpjb25mOwogCkBAIC05ODcsOCArOTk1LDggQEAKIH0KIAogCi1zdGF0aWMgY2hhciAqbmd4X2h0dHBfZ3ppcF9tZXJnZV9jb25mKG5neF9jb25mX3QgKmNmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpwYXJlbnQsIHZvaWQgKmNoaWxkKQorc3RhdGljIGNoYXIgKgorbmd4X2h0dHBfZ3ppcF9tZXJnZV9jb25mKG5neF9jb25mX3QgKmNmLCB2b2lkICpwYXJlbnQsIHZvaWQgKmNoaWxkKQogewogICAgIG5neF9odHRwX2d6aXBfY29uZl90ICpwcmV2ID0gcGFyZW50OwogICAgIG5neF9odHRwX2d6aXBfY29uZl90ICpjb25mID0gY2hpbGQ7CkBAIC0xMDAwLDEwICsxMDA4LDkgQEAKICAgICBuZ3hfY29uZl9tZXJnZV9idWZzX3ZhbHVlKGNvbmYtPmJ1ZnMsIHByZXYtPmJ1ZnMsIDQsIG5neF9wYWdlc2l6ZSk7CiAKICAgICBuZ3hfY29uZl9tZXJnZV91bnNpZ25lZF92YWx1ZShjb25mLT5odHRwX3ZlcnNpb24sIHByZXYtPmh0dHBfdmVyc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOR1hfSFRUUF9WRVJTSU9OXzExKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5HWF9IVFRQX1ZFUlNJT05fMTEpOwogICAgIG5neF9jb25mX21lcmdlX2JpdG1hc2tfdmFsdWUoY29uZi0+cHJveGllZCwgcHJldi0+cHJveGllZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChOR1hfQ09ORl9CSVRNQVNLX1NFVAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxOR1hfSFRUUF9HWklQX1BST1hJRURfT0ZGKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTkdYX0NPTkZfQklUTUFTS19TRVR8TkdYX0hUVFBfR1pJUF9QUk9YSUVEX09GRikpOwogCiAgICAgbmd4X2NvbmZfbWVyZ2VfdmFsdWUoY29uZi0+bGV2ZWwsIHByZXYtPmxldmVsLCAxKTsKICAgICBuZ3hfY29uZl9tZXJnZV9zaXplX3ZhbHVlKGNvbmYtPndiaXRzLCBwcmV2LT53Yml0cywgTUFYX1dCSVRTKTsKQEAgLTEwMzcsOCArMTA0NCw4IEBACiB9CiAKIAotc3RhdGljIGNoYXIgKm5neF9odHRwX2d6aXBfc2V0X3R5cGVzKG5neF9jb25mX3QgKmNmLCBuZ3hfY29tbWFuZF90ICpjbWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY29uZikKK3N0YXRpYyBjaGFyICoKK25neF9odHRwX2d6aXBfc2V0X3R5cGVzKG5neF9jb25mX3QgKmNmLCBuZ3hfY29tbWFuZF90ICpjbWQsIHZvaWQgKmNvbmYpCiB7CiAgICAgbmd4X2h0dHBfZ3ppcF9jb25mX3QgKmdjZiA9IGNvbmY7CiAKQEAgLTEwNDcsNyArMTA1NCw3IEBACiAgICAgbmd4X2h0dHBfZ3ppcF90eXBlX3QgICp0eXBlOwogCiAgICAgaWYgKGdjZi0+dHlwZXMgPT0gTlVMTCkgewotICAgICAgICBnY2YtPnR5cGVzID0gbmd4X2FycmF5X2NyZWF0ZShjZi0+cG9vbCwgNSwKKyAgICAgICAgZ2NmLT50eXBlcyA9IG5neF9hcnJheV9jcmVhdGUoY2YtPnBvb2wsIDQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yobmd4X2h0dHBfZ3ppcF90eXBlX3QpKTsKICAgICAgICAgaWYgKGdjZi0+dHlwZXMgPT0gTlVMTCkgewogICAgICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOwpAQCAtMTA4Nyw3ICsxMDk0LDggQEAKIH0KIAogCi1zdGF0aWMgY2hhciAqbmd4X2h0dHBfZ3ppcF9zZXRfd2luZG93KG5neF9jb25mX3QgKmNmLCB2b2lkICpwb3N0LCB2b2lkICpkYXRhKQorc3RhdGljIGNoYXIgKgorbmd4X2h0dHBfZ3ppcF9zZXRfd2luZG93KG5neF9jb25mX3QgKmNmLCB2b2lkICpwb3N0LCB2b2lkICpkYXRhKQogewogICAgIGludCAqbnAgPSBkYXRhOwogCkBAIC0xMTEwLDcgKzExMTgsOCBAQAogfQogCiAKLXN0YXRpYyBjaGFyICpuZ3hfaHR0cF9nemlwX3NldF9oYXNoKG5neF9jb25mX3QgKmNmLCB2b2lkICpwb3N0LCB2b2lkICpkYXRhKQorc3RhdGljIGNoYXIgKgorbmd4X2h0dHBfZ3ppcF9zZXRfaGFzaChuZ3hfY29uZl90ICpjZiwgdm9pZCAqcG9zdCwgdm9pZCAqZGF0YSkKIHsKICAgICBpbnQgKm5wID0gZGF0YTsKIApkaWZmIC0tZ2l0IGEvc3JjL2h0dHAvbW9kdWxlcy9uZ3hfaHR0cF9zc2lfZmlsdGVyLmMgYi9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX3NzaV9maWx0ZXIuYwppbmRleCBlZWI1MTVmLi5mNGI5NzM3IDEwMDY0NAotLS0gYS9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX3NzaV9maWx0ZXIuYworKysgYi9zcmMvaHR0cC9tb2R1bGVzL25neF9odHRwX3NzaV9maWx0ZXIuYwpAQCAtOCw1NiArOCw2OCBAQAogI2luY2x1ZGUgPG5neF9jb3JlLmg+CiAjaW5jbHVkZSA8bmd4X2h0dHAuaD4KIAorI2RlZmluZSBOR1hfSFRUUF9TU0lfTUFYX1BBUkFNUyAgIDE2CiAKLSNkZWZpbmUgTkdYX0hUVFBfU1NJX0NPTU1BTkRfTEVOICAgICAgMzEKLSNkZWZpbmUgTkdYX0hUVFBfU1NJX1BBUkFNX0xFTiAgICAgICAgMzEKKyNkZWZpbmUgTkdYX0hUVFBfU1NJX0NPTU1BTkRfTEVOICAzMQorI2RlZmluZSBOR1hfSFRUUF9TU0lfUEFSQU1fTEVOICAgIDMxCisjZGVmaW5lIE5HWF9IVFRQX1NTSV9QQVJBTVNfTiAgICAgNAogCi0jZGVmaW5lIE5HWF9IVFRQX1NTSV9DT1BZICAgICAgICAgICAgIDEKLSNkZWZpbmUgTkdYX0hUVFBfU1NJX0lOVkFMSURfQ09NTUFORCAgMgotI2RlZmluZSBOR1hfSFRUUF9TU0lfSU5WQUxJRF9QQVJBTSAgICAzCi0jZGVmaW5lIE5HWF9IVFRQX1NTSV9JTlZBTElEX1ZBTFVFICAgIDQKLSNkZWZpbmUgTkdYX0hUVFBfU1NJX0xPTkdfVkFMVUUgICAgICAgNQorI2RlZmluZSBOR1hfSFRUUF9TU0lfRVJST1IgICAgICAgIDEKIAogCiB0eXBlZGVmIHN0cnVjdCB7CiAgICAgbmd4X2ZsYWdfdCAgICAgICAgZW5hYmxlOworICAgIG5neF9mbGFnX3QgICAgICAgIHNpbGVudF9lcnJvcnM7CisKKyAgICBzaXplX3QgICAgICAgICAgICBtaW5fZmlsZV9jaHVuazsKICAgICBzaXplX3QgICAgICAgICAgICB2YWx1ZV9sZW47CiB9IG5neF9odHRwX3NzaV9jb25mX3Q7CiAKIAogdHlwZWRlZiBzdHJ1Y3QgewotICAgIGludCAgICAgICAgICAgICAgIGR1bW15OwotfSBuZ3hfaHR0cF9zc2lfY29tbWFuZF90OworICAgIG5neF9idWZfdCAgICAgICAgICpidWY7CiAKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIG5neF9odW5rX3QgICAgICAgICpidWY7Ci0KLSAgICB1X2NoYXIgICAgICAgICAgICAqc3RhcnQ7Ci0gICAgdV9jaGFyICAgICAgICAgICAgKmxhc3Q7CiAgICAgdV9jaGFyICAgICAgICAgICAgKnBvczsKKyAgICB1X2NoYXIgICAgICAgICAgICAqY29weV9zdGFydDsKKyAgICB1X2NoYXIgICAgICAgICAgICAqY29weV9lbmQ7CiAKICAgICBuZ3hfc3RyX3QgICAgICAgICAgY29tbWFuZDsKICAgICBuZ3hfYXJyYXlfdCAgICAgICAgcGFyYW1zOwogICAgIG5neF90YWJsZV9lbHRfdCAgICpwYXJhbTsKKyAgICBuZ3hfdGFibGVfZWx0X3QgICAgcGFyYW1zX2FycmF5W05HWF9IVFRQX1NTSV9QQVJBTVNfTl07CiAKICAgICBuZ3hfY2hhaW5fdCAgICAgICAqaW47CiAgICAgbmd4X2NoYWluX3QgICAgICAgKm91dDsKICAgICBuZ3hfY2hhaW5fdCAgICAgICoqbGFzdF9vdXQ7Ci0gICAgbmd4X2NoYWluX3QgICAgICAgKmJ1c3k7CiAKICAgICBuZ3hfdWludF90ICAgICAgICAgc3RhdGU7CisgICAgbmd4X3VpbnRfdCAgICAgICAgIHNhdmVkX3N0YXRlOwogICAgIHNpemVfdCAgICAgICAgICAgICBzYXZlZDsKKyAgICBzaXplX3QgICAgICAgICAgICAgbG9va2VkOworCisgICAgc2l6ZV90ICAgICAgICAgICAgIHZhbHVlX2xlbjsKIH0gbmd4X2h0dHBfc3NpX2N0eF90OwogCiAKLXR5cGVkZWYgbmd4X2ludF90ICgqbmd4X2h0dHBfc3NpX29wY29kZV9wdCkgKG5neF9odHRwX3JlcXVlc3RfdCAqciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5neF9odHRwX3NzaV9jdHhfdCAqY3R4KTsKK3R5cGVkZWYgbmd4X2ludF90ICgqbmd4X2h0dHBfc3NpX2NvbW1hbmRfcHQpIChuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsCisgICAgbmd4X2h0dHBfc3NpX2N0eF90ICpjdHgsIG5neF9zdHJfdCAqKik7CisKIAogdHlwZWRlZiBzdHJ1Y3QgewotICAgIG5neF9zdHJfdCAgICAgICAgICAgICAgIG5hbWU7Ci0gICAgbmd4X2h0dHBfc3NpX29wY29kZV9wdCAgb3A7Ci19IG5neF9odHRwX3NzaV9vcF90OworICAgIG5neF9zdHJfdCAgICAgICAgICAgICAgICAgbmFtZTsKKyAgICBuZ3hfdWludF90ICAgICAgICAgICAgICAgIGluZGV4OworCisgICAgbmd4X3VpbnRfdCAgICAgICAgICAgICAgICBtYW5kYXRvcnk7Cit9IG5neF9odHRwX3NzaV9wYXJhbV90OworCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBuZ3hfc3RyX3QgICAgICAgICAgICAgICAgIG5hbWU7CisgICAgbmd4X2h0dHBfc3NpX2NvbW1hbmRfcHQgICBoYW5kbGVyOworICAgIG5neF9odHRwX3NzaV9wYXJhbV90ICAgICAqcGFyYW1zOworCisgICAgbmd4X3VpbnRfdCAgICAgICAgICAgICAgICBmbHVzaDsgICAgLyogdW5zaWduZWQgIGZsdXNoOjE7ICovCit9IG5neF9odHRwX3NzaV9jb21tYW5kX3Q7CiAKIAogdHlwZWRlZiBlbnVtIHsKQEAgLTczLDkgKzg1LDkgQEAKICAgICBzc2lfcHJlZXF1YWxfc3RhdGUsCiAgICAgc3NpX3ByZXZhbHVlX3N0YXRlLAogICAgIHNzaV9kb3VibGVfcXVvdGVkX3ZhbHVlX3N0YXRlLAotICAgIHNzaV9kb3VibGVfcXVvdGVkX3ZhbHVlX3F1b3RlX3N0YXRlLAogICAgIHNzaV9xdW90ZWRfdmFsdWVfc3RhdGUsCi0gICAgc3NpX3F1b3RlZF92YWx1ZV9xdW90ZV9zdGF0ZSwKKyAgICBzc2lfcXVvdGVkX3N5bWJvbF9zdGF0ZSwKKyAgICBzc2lfcG9zdHBhcmFtX3N0YXRlLAogICAgIHNzaV9jb21tZW50X2VuZDBfc3RhdGUsCiAgICAgc3NpX2NvbW1lbnRfZW5kMV9zdGF0ZSwKICAgICBzc2lfZXJyb3Jfc3RhdGUsCkBAIC04NSwyMyArOTcsMTcgQEAKIAogCiBzdGF0aWMgbmd4X2ludF90IG5neF9odHRwX3NzaV9lcnJvcihuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfaHR0cF9zc2lfY3R4X3QgKmN0eCk7CisgICAgbmd4X2h0dHBfc3NpX2N0eF90ICpjdHgpOwogc3RhdGljIG5neF9pbnRfdCBuZ3hfaHR0cF9zc2lfcGFyc2Uobmd4X2h0dHBfcmVxdWVzdF90ICpyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2h0dHBfc3NpX2N0eF90ICpjdHgpOworICAgIG5neF9odHRwX3NzaV9jdHhfdCAqY3R4KTsKIAogc3RhdGljIG5neF9pbnRfdCBuZ3hfaHR0cF9zc2lfZWNobyhuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5neF9odHRwX3NzaV9jdHhfdCAqY3R4KTsKKyAgICBuZ3hfaHR0cF9zc2lfY3R4X3QgKmN0eCwgbmd4X3N0cl90ICoqcGFyYW1zKTsKIAogc3RhdGljIHZvaWQgKm5neF9odHRwX3NzaV9jcmVhdGVfY29uZihuZ3hfY29uZl90ICpjZik7CiBzdGF0aWMgY2hhciAqbmd4X2h0dHBfc3NpX21lcmdlX2NvbmYobmd4X2NvbmZfdCAqY2YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcGFyZW50LCB2b2lkICpjaGlsZCk7Ci1zdGF0aWMgaW50IG5neF9odHRwX3NzaV9maWx0ZXJfaW5pdChuZ3hfY3ljbGVfdCAqY3ljbGUpOwotCi0KLXN0YXRpYyBuZ3hfaHR0cF9zc2lfb3BfdCAgbmd4X2h0dHBfc3NpX2NvbW1hbmRzW10gPSB7Ci0gICAgeyBuZ3hfc3RyaW5nKCJlY2hvIiksIG5neF9odHRwX3NzaV9lY2hvIH0sCi0gICAgeyBuZ3hfbnVsbF9zdHJpbmcsIE5VTEwgfQotfTsKKyAgICB2b2lkICpwYXJlbnQsIHZvaWQgKmNoaWxkKTsKK3N0YXRpYyBuZ3hfaW50X3Qgbmd4X2h0dHBfc3NpX2ZpbHRlcl9pbml0KG5neF9jeWNsZV90ICpjeWNsZSk7CiAKIAogc3RhdGljIG5neF9jb21tYW5kX3QgIG5neF9odHRwX3NzaV9maWx0ZXJfY29tbWFuZHNbXSA9IHsKQEAgLTExMyw3ICsxMTksMjEgQEAKICAgICAgIG9mZnNldG9mKG5neF9odHRwX3NzaV9jb25mX3QsIGVuYWJsZSksCiAgICAgICBOVUxMIH0sCiAKLSAgICAgbmd4X251bGxfY29tbWFuZAorICAgIHsgbmd4X3N0cmluZygic3NpX3NpbGVudF9lcnJvcnMiKSwKKyAgICAgIE5HWF9IVFRQX01BSU5fQ09ORnxOR1hfSFRUUF9TUlZfQ09ORnxOR1hfSFRUUF9MT0NfQ09ORnxOR1hfQ09ORl9GTEFHLAorICAgICAgbmd4X2NvbmZfc2V0X2ZsYWdfc2xvdCwKKyAgICAgIE5HWF9IVFRQX0xPQ19DT05GX09GRlNFVCwKKyAgICAgIG9mZnNldG9mKG5neF9odHRwX3NzaV9jb25mX3QsIHNpbGVudF9lcnJvcnMpLAorICAgICAgTlVMTCB9LAorCisgICAgeyBuZ3hfc3RyaW5nKCJzc2lfbWluX2ZpbGVfY2h1bmsiKSwKKyAgICAgIE5HWF9IVFRQX01BSU5fQ09ORnxOR1hfSFRUUF9TUlZfQ09ORnxOR1hfSFRUUF9MT0NfQ09ORnxOR1hfQ09ORl9GTEFHLAorICAgICAgbmd4X2NvbmZfc2V0X3NpemVfc2xvdCwKKyAgICAgIE5HWF9IVFRQX0xPQ19DT05GX09GRlNFVCwKKyAgICAgIG9mZnNldG9mKG5neF9odHRwX3NzaV9jb25mX3QsIG1pbl9maWxlX2NodW5rKSwKKyAgICAgIE5VTEwgfSwKKworICAgICAgbmd4X251bGxfY29tbWFuZAogfTsKIAogCkBAIC0xNDIsMTggKzE2MiwzNiBAQAogfTsKIAogCi1zdGF0aWMgaW50ICgqbmd4X2h0dHBfbmV4dF9oZWFkZXJfZmlsdGVyKSAobmd4X2h0dHBfcmVxdWVzdF90ICpyKTsKLXN0YXRpYyBpbnQgKCpuZ3hfaHR0cF9uZXh0X2JvZHlfZmlsdGVyKSAobmd4X2h0dHBfcmVxdWVzdF90ICpyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfY2hhaW5fdCAqaW4pOworc3RhdGljIG5neF9pbnRfdCAoKm5neF9odHRwX25leHRfaGVhZGVyX2ZpbHRlcikgKG5neF9odHRwX3JlcXVlc3RfdCAqcik7CitzdGF0aWMgbmd4X2ludF90ICgqbmd4X2h0dHBfbmV4dF9ib2R5X2ZpbHRlcikgKG5neF9odHRwX3JlcXVlc3RfdCAqciwKKyAgICBuZ3hfY2hhaW5fdCAqaW4pOwogCiAKLXN0YXRpYyBjaGFyIHNzaV9zdHJpbmdbXSA9ICI8IS0tIyI7Ci1zdGF0aWMgY2hhciBlcnJvcl9zdHJpbmdbXSA9ICJbYW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgcHJvY2Vzc2luZyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGUgZGlyZWN0aXZlXSI7Ci1zdGF0aWMgY2hhciBzdHViX3N0cmluZ1tdID0gIlthIHN0dWIgc3NpIHN0cmluZ10iOworc3RhdGljIHVfY2hhciBuZ3hfaHR0cF9zc2lfc3RyaW5nW10gPSAiPCEtLSI7CitzdGF0aWMgdV9jaGFyIG5neF9odHRwX3NzaV9lcnJvcl9zdHJpbmdbXSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICJbYW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgcHJvY2Vzc2luZyB0aGUgZGlyZWN0aXZlXSI7CisKK3N0YXRpYyBuZ3hfc3RyX3Qgbmd4X2h0dHBfc3NpX25vbmUgPSBuZ3hfc3RyaW5nKCIobm9uZSkiKTsKIAogCi1zdGF0aWMgaW50IG5neF9odHRwX3NzaV9oZWFkZXJfZmlsdGVyKG5neF9odHRwX3JlcXVlc3RfdCAqcikKKyNkZWZpbmUgIE5HWF9IVFRQX1NTSV9FQ0hPX1ZBUiAgICAgIDAKKyNkZWZpbmUgIE5HWF9IVFRQX1NTSV9FQ0hPX0RFRkFVTFQgIDEKKworc3RhdGljIG5neF9odHRwX3NzaV9wYXJhbV90ICBuZ3hfaHR0cF9zc2lfZWNob19wYXJhbXNbXSA9IHsKKyAgICB7IG5neF9zdHJpbmcoInZhciIpLCBOR1hfSFRUUF9TU0lfRUNIT19WQVIsIDEgfSwKKyAgICB7IG5neF9zdHJpbmcoImRlZmF1bHQiKSwgTkdYX0hUVFBfU1NJX0VDSE9fREVGQVVMVCwgMCB9LAorICAgIHsgbmd4X251bGxfc3RyaW5nLCAwLCAwIH0KK307CisKKworc3RhdGljIG5neF9odHRwX3NzaV9jb21tYW5kX3QgIG5neF9odHRwX3NzaV9jb21tYW5kc1tdID0geworICAgIHsgbmd4X3N0cmluZygiZWNobyIpLCBuZ3hfaHR0cF9zc2lfZWNobywgbmd4X2h0dHBfc3NpX2VjaG9fcGFyYW1zLCAwIH0sCisgICAgeyBuZ3hfbnVsbF9zdHJpbmcsIE5VTEwsIE5VTEwsIDAgfQorfTsKKworCitzdGF0aWMgbmd4X2ludF90CituZ3hfaHR0cF9zc2lfaGVhZGVyX2ZpbHRlcihuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIpCiB7CiAgICAgbmd4X2h0dHBfc3NpX2N0eF90ICAgKmN0eDsKICAgICBuZ3hfaHR0cF9zc2lfY29uZl90ICAqY29uZjsKQEAgLTE3MywxMSArMjExLDIyIEBACiAgICAgICAgIHJldHVybiBuZ3hfaHR0cF9uZXh0X2hlYWRlcl9maWx0ZXIocik7CiAgICAgfQogCi0gICAgbmd4X2h0dHBfY3JlYXRlX2N0eChyLCBjdHgsIG5neF9odHRwX3NzaV9maWx0ZXJfbW9kdWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG5neF9odHRwX3NzaV9jdHhfdCksIE5HWF9FUlJPUik7CiAKKyAgICBpZiAoIShjdHggPSBuZ3hfcGNhbGxvYyhyLT5wb29sLCBzaXplb2Yobmd4X2h0dHBfc3NpX2N0eF90KSkpKSB7CisgICAgICAgIHJldHVybiBOR1hfRVJST1I7CisgICAgfQorCisgICAgbmd4X2h0dHBfc2V0X2N0eChyLCBjdHgsIG5neF9odHRwX3NzaV9maWx0ZXJfbW9kdWxlKTsKKworCisgICAgY3R4LT52YWx1ZV9sZW4gPSBjb25mLT52YWx1ZV9sZW47CiAgICAgY3R4LT5sYXN0X291dCA9ICZjdHgtPm91dDsKIAorICAgIGN0eC0+cGFyYW1zLmVsdHMgPSBjdHgtPnBhcmFtc19hcnJheTsKKyAgICBjdHgtPnBhcmFtcy5zaXplID0gc2l6ZW9mKG5neF90YWJsZV9lbHRfdCk7CisgICAgY3R4LT5wYXJhbXMubmFsbG9jID0gTkdYX0hUVFBfU1NJX1BBUkFNU19OOworICAgIGN0eC0+cGFyYW1zLnBvb2wgPSByLT5wb29sOworCiAgICAgci0+aGVhZGVyc19vdXQuY29udGVudF9sZW5ndGhfbiA9IC0xOwogICAgIGlmIChyLT5oZWFkZXJzX291dC5jb250ZW50X2xlbmd0aCkgewogICAgICAgICByLT5oZWFkZXJzX291dC5jb250ZW50X2xlbmd0aC0+a2V5LmxlbiA9IDA7CkBAIC0xOTAsMjAgKzIzOSwyNiBAQAogICAgICAgICByLT5oZWFkZXJzX291dC5sYXN0X21vZGlmaWVkID0gTlVMTDsKICAgICB9CiAKLSAgICByLT5maWx0ZXIgfD0gTkdYX0hUVFBfRklMVEVSX05FRURfSU5fTUVNT1JZOworICAgIHItPmZpbHRlcl9uZWVkX2luX21lbW9yeSA9IDE7CisgICAgci0+ZmlsdGVyX3NzaV9uZWVkX2luX21lbW9yeSA9IDE7CiAKICAgICByZXR1cm4gbmd4X2h0dHBfbmV4dF9oZWFkZXJfZmlsdGVyKHIpOwogfQogCiAKLXN0YXRpYyBpbnQgbmd4X2h0dHBfc3NpX2JvZHlfZmlsdGVyKG5neF9odHRwX3JlcXVlc3RfdCAqciwgbmd4X2NoYWluX3QgKmluKQorc3RhdGljIG5neF9pbnRfdAorbmd4X2h0dHBfc3NpX2JvZHlfZmlsdGVyKG5neF9odHRwX3JlcXVlc3RfdCAqciwgbmd4X2NoYWluX3QgKmluKQogewotICAgIHNpemVfdCAgICAgICAgICAgICAgIGxlbjsKLSAgICBuZ3hfaW50X3QgICAgICAgICAgICByYywgZm91bmQ7Ci0gICAgbmd4X2h1bmtfdCAgICAgICAgICAqaHVuazsKLSAgICBuZ3hfY2hhaW5fdCAgICAgICAgICpjbCwgKnRsOwotICAgIG5neF9odHRwX3NzaV9vcF90ICAgKmNtZDsKLSAgICBuZ3hfaHR0cF9zc2lfY3R4X3QgICpjdHg7CisgICAgbmd4X2ludF90ICAgICAgICAgICAgICAgIHJjOworICAgIG5neF91aW50X3QgICAgICAgICAgICAgICBpOworICAgIG5neF9idWZfdCAgICAgICAgICAgICAgICpiOworICAgIG5neF9jaGFpbl90ICAgICAgICAgICAgICpjbDsKKyAgICBuZ3hfdGFibGVfZWx0X3QgICAgICAgICAqcGFyYW07CisgICAgbmd4X2h0dHBfc3NpX2N0eF90ICAgICAgKmN0eDsKKyAgICBuZ3hfaHR0cF9zc2lfY29uZl90ICAgICAqY29uZjsKKyAgICBuZ3hfaHR0cF9zc2lfcGFyYW1fdCAgICAqcHJtOworICAgIG5neF9odHRwX3NzaV9jb21tYW5kX3QgICpjbWQ7CisgICAgbmd4X3N0cl90ICAgICAgICAgICAgICAgKnBhcmFtc1tOR1hfSFRUUF9TU0lfTUFYX1BBUkFNU107CiAKICAgICBjdHggPSBuZ3hfaHR0cF9nZXRfbW9kdWxlX2N0eChyLCBuZ3hfaHR0cF9zc2lfZmlsdGVyX21vZHVsZSk7CiAKQEAgLTIxMSw3ICsyNjYsNyBAQAogICAgICAgICByZXR1cm4gbmd4X2h0dHBfbmV4dF9ib2R5X2ZpbHRlcihyLCBpbik7CiAgICAgfQogCi0gICAgLyogYWRkIHRoZSBpbmNvbWluZyBodW5rIHRvIHRoZSBjaGFpbiBjdHgtPmluICovCisgICAgLyogYWRkIHRoZSBpbmNvbWluZyBjaGFpbiB0byB0aGUgY2hhaW4gY3R4LT5pbiAqLwogCiAgICAgaWYgKGluKSB7CiAgICAgICAgIGlmIChuZ3hfY2hhaW5fYWRkX2NvcHkoci0+cG9vbCwgJmN0eC0+aW4sIGluKSA9PSBOR1hfRVJST1IpIHsKQEAgLTIxOSwzNSArMjc0LDIyIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBjb25mID0gbmd4X2h0dHBfZ2V0X21vZHVsZV9sb2NfY29uZihyLCBuZ3hfaHR0cF9zc2lfZmlsdGVyX21vZHVsZSk7CisKKyAgICBuZ3hfbG9nX2RlYnVnMChOR1hfTE9HX0RFQlVHX0hUVFAsIHItPmNvbm5lY3Rpb24tPmxvZywgMCwKKyAgICAgICAgICAgICAgICAgICAiaHR0cCBzc2kgZmlsdGVyIik7CisKKyAgICBiID0gTlVMTDsKKwogICAgIHdoaWxlIChjdHgtPmluKSB7Ci0gICAgICAgIGlmIChjdHgtPmJ1ZiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBjdHgtPmJ1ZiA9IGN0eC0+aW4tPmh1bms7Ci0gICAgICAgICAgICBjdHgtPmluID0gY3R4LT5pbi0+bmV4dDsKIAotICAgICAgICAgICAgY3R4LT5zdGFydCA9IGN0eC0+YnVmLT5wb3M7Ci0gICAgICAgICAgICBjdHgtPnBvcyA9IGN0eC0+YnVmLT5wb3M7Ci0gICAgICAgICAgICBjdHgtPmxhc3QgPSBjdHgtPmJ1Zi0+cG9zOworICAgICAgICBjdHgtPmJ1ZiA9IGN0eC0+aW4tPmJ1ZjsKKyAgICAgICAgY3R4LT5pbiA9IGN0eC0+aW4tPm5leHQ7CisgICAgICAgIGN0eC0+cG9zID0gY3R4LT5idWYtPnBvczsKIAotICAgICAgICAgICAgaWYgKGN0eC0+c2F2ZWQpIHsKLSAgICAgICAgICAgICAgICBsZW4gPSBjdHgtPmJ1Zi0+bGFzdCAtIGN0eC0+YnVmLT5wb3M7Ci0gICAgICAgICAgICAgICAgaWYgKGxlbiA+IDUgLSBjdHgtPnNhdmVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxlbiA9IDUgLSBjdHgtPnNhdmVkOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChuZ3hfc3RybmNtcChjdHgtPmJ1Zi0+cG9zLCAmc3NpX3N0cmluZ1tjdHgtPnNhdmVkXSwgbGVuKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxlbiA8IDUgLSBjdHgtPnNhdmVkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjdHgtPmJ1ZiA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5zYXZlZCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjdHgtPnBvcyArPSBsZW47Ci0gICAgICAgICAgICAgICAgICAgICAgICBjdHgtPnN0YXRlID0gc3NpX3ByZWNvbW1hbmRfc3RhdGU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9CisgICAgICAgIGlmIChjdHgtPnN0YXRlID09IHNzaV9zdGFydF9zdGF0ZSkgeworICAgICAgICAgICAgY3R4LT5jb3B5X3N0YXJ0ID0gY3R4LT5wb3M7CisgICAgICAgICAgICBjdHgtPmNvcHlfZW5kID0gY3R4LT5wb3M7CiAgICAgICAgIH0KIAogICAgICAgICB3aGlsZSAoY3R4LT5wb3MgPCBjdHgtPmJ1Zi0+bGFzdCkgewpAQCAtMjU3LDI4MSArMjk5LDIzMCBAQAogCiAgICAgICAgICAgICByYyA9IG5neF9odHRwX3NzaV9wYXJzZShyLCBjdHgpOwogCi0gICAgICAgICAgICBuZ3hfbG9nX2RlYnVnMShOR1hfTE9HX0RFQlVHX0hUVFAsIHItPmNvbm5lY3Rpb24tPmxvZywgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYXJzZTogJWQiLCByYyk7CisgICAgICAgICAgICBuZ3hfbG9nX2RlYnVnNChOR1hfTE9HX0RFQlVHX0hUVFAsIHItPmNvbm5lY3Rpb24tPmxvZywgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYXJzZTogJWQsIGxvb2tlZDogJWQgJXAtJXAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcmMsIGN0eC0+bG9va2VkLCBjdHgtPmNvcHlfc3RhcnQsIGN0eC0+Y29weV9lbmQpOwogCi0gICAgICAgICAgICBpZiAocmMgPT0gTkdYX0FHQUlOKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAocmMgPT0gTkdYX0VSUk9SKSB7CisgICAgICAgICAgICBpZiAocmMgPT0gTkdYX0VSUk9SKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHJjOworICAgICAgICAgICAgfQogCi0gICAgICAgICAgICB9IGVsc2UgaWYgKHJjID09IE5HWF9IVFRQX1NTSV9DT1BZKSB7CisgICAgICAgICAgICBpZiAoY3R4LT5jb3B5X3N0YXJ0ICE9IGN0eC0+Y29weV9lbmQpIHsKIAotICAgICAgICAgICAgICAgIG5neF9sb2dfZGVidWcyKE5HWF9MT0dfREVCVUdfSFRUUCwgci0+Y29ubmVjdGlvbi0+bG9nLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzYXZlZDogJWQgY29weTogJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+c2F2ZWQsIGN0eC0+bGFzdCAtIGN0eC0+c3RhcnQpOworICAgICAgICAgICAgICAgIG5neF9sb2dfZGVidWcxKE5HWF9MT0dfREVCVUdfSFRUUCwgci0+Y29ubmVjdGlvbi0+bG9nLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzYXZlZDogJWQiLCBjdHgtPnNhdmVkKTsKIAogICAgICAgICAgICAgICAgIGlmIChjdHgtPnNhdmVkKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCEoaHVuayA9IG5neF9jYWxsb2NfaHVuayhyLT5wb29sKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCEoYiA9IG5neF9jYWxsb2NfYnVmKHItPnBvb2wpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKICAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgIGh1bmstPnR5cGUgPSBOR1hfSFVOS19JTl9NRU1PUll8TkdYX0hVTktfVEVNUDsKLSAgICAgICAgICAgICAgICAgICAgaHVuay0+cG9zID0gc3NpX3N0cmluZzsKLSAgICAgICAgICAgICAgICAgICAgaHVuay0+bGFzdCA9IHNzaV9zdHJpbmcgKyBjdHgtPnNhdmVkOworICAgICAgICAgICAgICAgICAgICBiLT5tZW1vcnkgPSAxOworICAgICAgICAgICAgICAgICAgICBiLT5wb3MgPSBuZ3hfaHR0cF9zc2lfc3RyaW5nOworICAgICAgICAgICAgICAgICAgICBiLT5sYXN0ID0gbmd4X2h0dHBfc3NpX3N0cmluZyArIGN0eC0+c2F2ZWQ7CiAKLSAgICAgICAgICAgICAgICAgICAgbmd4X2FsbG9jX2xpbmtfYW5kX3NldF9odW5rKGNsLCBodW5rLCByLT5wb29sLCBOR1hfRVJST1IpOworICAgICAgICAgICAgICAgICAgICBpZiAoIShjbCA9IG5neF9hbGxvY19jaGFpbl9saW5rKHItPnBvb2wpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKKyAgICAgICAgICAgICAgICAgICAgfQogCisgICAgICAgICAgICAgICAgICAgIGNsLT5idWYgPSBiOwogICAgICAgICAgICAgICAgICAgICAqY3R4LT5sYXN0X291dCA9IGNsOwogICAgICAgICAgICAgICAgICAgICBjdHgtPmxhc3Rfb3V0ID0gJmNsLT5uZXh0OwogCiAgICAgICAgICAgICAgICAgICAgIGN0eC0+c2F2ZWQgPSAwOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGlmICghKGh1bmsgPSBuZ3hfY2FsbG9jX2h1bmsoci0+cG9vbCkpKSB7CisgICAgICAgICAgICAgICAgaWYgKCEoYiA9IG5neF9jYWxsb2NfYnVmKHItPnBvb2wpKSkgewogICAgICAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGh1bmstPnR5cGUgPSBOR1hfSFVOS19JTl9NRU1PUll8TkdYX0hVTktfVEVNUHxOR1hfSFVOS19SRUNZQ0xFRDsKLSAgICAgICAgICAgICAgICBodW5rLT5wb3MgPSBjdHgtPnN0YXJ0OwotICAgICAgICAgICAgICAgIGh1bmstPmxhc3QgPSBjdHgtPmxhc3Q7Ci0gICAgICAgICAgICAgICAgaHVuay0+c2hhZG93ID0gY3R4LT5idWY7CisgICAgICAgICAgICAgICAgbmd4X21lbWNweShiLCBjdHgtPmJ1Ziwgc2l6ZW9mKG5neF9idWZfdCkpOwogCi0gICAgICAgICAgICAgICAgbmd4X2FsbG9jX2xpbmtfYW5kX3NldF9odW5rKGNsLCBodW5rLCByLT5wb29sLCBOR1hfRVJST1IpOworICAgICAgICAgICAgICAgIGItPmxhc3RfYnVmID0gMDsKKyAgICAgICAgICAgICAgICBiLT5wb3MgPSBjdHgtPmNvcHlfc3RhcnQ7CisgICAgICAgICAgICAgICAgYi0+bGFzdCA9IGN0eC0+Y29weV9lbmQ7CiAKLSAgICAgICAgICAgICAgICAqY3R4LT5sYXN0X291dCA9IGNsOwotICAgICAgICAgICAgICAgIGN0eC0+bGFzdF9vdXQgPSAmY2wtPm5leHQ7CisgICAgICAgICAgICAgICAgaWYgKGItPmluX2ZpbGUpIHsKIAotICAgICAgICAgICAgICAgIGlmIChjdHgtPnBvcyA9PSBjdHgtPmJ1Zi0+bGFzdCkgewotICAgICAgICAgICAgICAgICAgICBjdHgtPnNhdmVkID0gY3R4LT5wb3MgLSBjdHgtPmxhc3Q7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoY29uZi0+bWluX2ZpbGVfY2h1bmsgPCAoc2l6ZV90KSAoYi0+bGFzdCAtIGItPnBvcykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGItPmZpbGVfbGFzdCA9IGItPmZpbGVfcG9zICsgKGItPmxhc3QgLSBiLT5zdGFydCk7CisgICAgICAgICAgICAgICAgICAgICAgICBiLT5maWxlX3BvcyArPSBiLT5wb3MgLSBiLT5zdGFydDsKIAotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgICB9IGVsc2UgaWYgKHJjID49IE5HWF9IVFRQX1NTSV9JTlZBTElEX0NPTU1BTkQpIHsKLQotICAgICAgICAgICAgICAgIG5neF9sb2dfZGVidWcyKE5HWF9MT0dfREVCVUdfSFRUUCwgci0+Y29ubmVjdGlvbi0+bG9nLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzYXZlZDogJWQgZXJyb3I6ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPnNhdmVkLCByYyk7Ci0KLSAgICAgICAgICAgICAgICBpZiAobmd4X2h0dHBfc3NpX2Vycm9yKHIsIGN0eCkgPT0gTkdYX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHJjID09IE5HWF9IVFRQX1NTSV9JTlZBTElEX0NPTU1BTkQpIHsKLSAgICAgICAgICAgICAgICAgICAgbmd4X2xvZ19lcnJvcihOR1hfTE9HX0VSUiwgci0+Y29ubmVjdGlvbi0+bG9nLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnZhbGlkIFNTSSBjb21tYW5kIFwiJXNcIiBmb3VuZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5jb21tYW5kLmRhdGEpOwotCi0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyYyA9PSBOR1hfSFRUUF9TU0lfSU5WQUxJRF9QQVJBTSkgewotICAgICAgICAgICAgICAgICAgICBuZ3hfbG9nX2Vycm9yKE5HWF9MT0dfRVJSLCByLT5jb25uZWN0aW9uLT5sb2csIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludmFsaWQgcGFyYW1ldGVyIFwiJXNcIiBmb3VuZCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluIFNTSSBjb21tYW5kIFwiJXNcIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5wYXJhbS0+a2V5LmRhdGEsIGN0eC0+Y29tbWFuZC5kYXRhKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSNpZiAwCi0gICAgICAgICAgICB9IGVsc2UgaWYgKHJjID09IE5HWF9IVFRQX1NTSV9JTlZBTElEX0NPTU1BTkQpIHsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAocmMgPT0gTkdYX0hUVFBfU1NJX0lOVkFMSURfUEFSQU0pIHsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAocmMgPT0gTkdYX0hUVFBfU1NJX0lOVkFMSURfVkFMVUUpIHsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAocmMgPT0gTkdYX0hUVFBfU1NJX0xPTkdfVkFMVUUpIHsKLSNlbmRpZgotCi0gICAgICAgICAgICB9IGVsc2UgewotCi0gICAgICAgICAgICAgICAgZm91bmQgPSAwOwotCi0gICAgICAgICAgICAgICAgZm9yIChjbWQgPSBuZ3hfaHR0cF9zc2lfY29tbWFuZHM7IGNtZC0+bmFtZS5sZW47IGNtZCsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICBpZiAoY3R4LT5jb21tYW5kLmxlbiAhPSBjbWQtPm5hbWUubGVuKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgIGlmIChuZ3hfc3RybmNtcChjdHgtPmNvbW1hbmQuZGF0YSwgY21kLT5uYW1lLmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtZC0+bmFtZS5sZW4pICE9IDApCi0gICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gMTsKLQotICAgICAgICAgICAgICAgICAgICAgaWYgKGNtZC0+b3AociwgY3R4KSA9PSBOR1hfRVJST1IpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmICghZm91bmQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5neF9odHRwX3NzaV9lcnJvcihyLCBjdHgpID09IE5HWF9FUlJPUikgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGItPmluX2ZpbGUgPSAwOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogCi0jaWYgMAotICAgICAgICAgICAgICAgIGlmICghKGh1bmsgPSBuZ3hfY2FsbG9jX2h1bmsoci0+cG9vbCkpKSB7CisgICAgICAgICAgICAgICAgaWYgKCEoY2wgPSBuZ3hfYWxsb2NfY2hhaW5fbGluayhyLT5wb29sKSkpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBodW5rLT50eXBlID0gTkdYX0hVTktfSU5fTUVNT1JZfE5HWF9IVU5LX1RFTVA7Ci0gICAgICAgICAgICAgICAgaHVuay0+cG9zID0gc3R1Yl9zdHJpbmc7Ci0gICAgICAgICAgICAgICAgaHVuay0+bGFzdCA9IHN0dWJfc3RyaW5nICsgc2l6ZW9mKHN0dWJfc3RyaW5nKSAtIDE7Ci0KLSAgICAgICAgICAgICAgICBuZ3hfYWxsb2NfbGlua19hbmRfc2V0X2h1bmsoY2wsIGh1bmssIHItPnBvb2wsIE5HWF9FUlJPUik7Ci0KKyAgICAgICAgICAgICAgICBjbC0+YnVmID0gYjsKKyAgICAgICAgICAgICAgICBjbC0+bmV4dCA9IE5VTEw7CiAgICAgICAgICAgICAgICAgKmN0eC0+bGFzdF9vdXQgPSBjbDsKICAgICAgICAgICAgICAgICBjdHgtPmxhc3Rfb3V0ID0gJmNsLT5uZXh0OwotI2VuZGlmCiAgICAgICAgICAgICB9Ci0gICAgICAgIH0KIAotICAgICAgICBjdHgtPmJ1ZiA9IE5VTEw7Ci0gICAgfQorICAgICAgICAgICAgaWYgKGN0eC0+c3RhdGUgPT0gc3NpX3N0YXJ0X3N0YXRlKSB7CisgICAgICAgICAgICAgICAgY3R4LT5jb3B5X3N0YXJ0ID0gY3R4LT5wb3M7CisgICAgICAgICAgICAgICAgY3R4LT5jb3B5X2VuZCA9IGN0eC0+cG9zOwogCi0gICAgaWYgKGN0eC0+b3V0KSB7Ci0gICAgICAgIGlmIChuZ3hfaHR0cF9uZXh0X2JvZHlfZmlsdGVyKHIsIGN0eC0+b3V0KSA9PSBOR1hfRVJST1IpIHsKLSAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7Ci0gICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY3R4LT5jb3B5X3N0YXJ0ID0gTlVMTDsKKyAgICAgICAgICAgICAgICBjdHgtPmNvcHlfZW5kID0gTlVMTDsKKyAgICAgICAgICAgIH0KIAotICAgICAgICBpZiAoY3R4LT5idXN5ID09IE5VTEwpIHsKLSAgICAgICAgICAgIGN0eC0+YnVzeSA9IGN0eC0+b3V0OworICAgICAgICAgICAgaWYgKHJjID09IE5HWF9BR0FJTikgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQogCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmb3IgKHRsID0gY3R4LT5idXN5OyAvKiB2b2lkICovIDsgdGwgPSB0bC0+bmV4dCkgewotICAgICAgICAgICAgICAgIGlmICh0bC0+bmV4dCA9PSBOVUxMKSB7IAotICAgICAgICAgICAgICAgICAgICB0bC0+bmV4dCA9IGN0eC0+b3V0OworCisgICAgICAgICAgICBpZiAocmMgPT0gTkdYX09LKSB7CisKKyAgICAgICAgICAgICAgICBmb3IgKGNtZCA9IG5neF9odHRwX3NzaV9jb21tYW5kczsgY21kLT5oYW5kbGVyOyBjbWQrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAoY21kLT5uYW1lLmxlbiA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjbWQgPSAobmd4X2h0dHBfc3NpX2NvbW1hbmRfdCAqKSBjbWQtPmhhbmRsZXI7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoY21kLT5uYW1lLmxlbiAhPSBjdHgtPmNvbW1hbmQubGVuCisgICAgICAgICAgICAgICAgICAgICAgICB8fCBuZ3hfc3RybmNtcChjbWQtPm5hbWUuZGF0YSwgY3R4LT5jb21tYW5kLmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPmNvbW1hbmQubGVuKSAhPSAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIAotICAgICAgICBjdHgtPm91dCA9IE5VTEw7Ci0gICAgICAgIGN0eC0+bGFzdF9vdXQgPSAmY3R4LT5vdXQ7CiAKLSAgICAgICAgd2hpbGUgKGN0eC0+YnVzeSkgewotICAgICAgICAgICAgaWYgKG5neF9odW5rX3NpemUoY3R4LT5idXN5LT5odW5rKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGNtZC0+bmFtZS5sZW4gPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBuZ3hfbG9nX2Vycm9yKE5HWF9MT0dfRVJSLCByLT5jb25uZWN0aW9uLT5sb2csIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludmFsaWQgU1NJIGNvbW1hbmQ6IFwiJVZcIiIsICZjdHgtPmNvbW1hbmQpOworICAgICAgICAgICAgICAgICAgICBnb3RvIHNzaV9lcnJvcjsKKyAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIC8qIFRPRE86IE5HWF9IVU5LX1pFUk9DT1BZX0JVU1kgKi8KKyAgICAgICAgICAgICAgICBuZ3hfbWVtemVybyhwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkdYX0hUVFBfU1NJX01BWF9QQVJBTVMgKiBzaXplb2Yobmd4X3N0cl90ICopKTsKIAotICAgICAgICAgICAgaHVuayA9IGN0eC0+YnVzeS0+aHVuay0+c2hhZG93OwotICAgICAgICAgICAgaWYgKGh1bmspIHsKLSAgICAgICAgICAgICAgICBodW5rLT5wb3MgPSBjdHgtPmJ1c3ktPmh1bmstPnBvczsKKyAgICAgICAgICAgICAgICBwYXJhbSA9IGN0eC0+cGFyYW1zLmVsdHM7CiAKLSAgICAgICAgICAgICAgICBsZW4gPSBodW5rLT5sYXN0IC0gaHVuay0+cG9zOwotICAgICAgICAgICAgICAgIGlmIChsZW4gPCA1ICYmIG5neF9zdHJuY21wKGh1bmstPnBvcywgc3NpX3N0cmluZywgbGVuKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGh1bmstPnBvcyA9IGh1bmstPmxhc3Q7CisKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY3R4LT5wYXJhbXMubmVsdHM7IGkrKykgeworCisgICAgICAgICAgICAgICAgICAgIGZvciAocHJtID0gY21kLT5wYXJhbXM7IHBybS0+bmFtZS5sZW47IHBybSsrKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbVtpXS5rZXkubGVuICE9IHBybS0+bmFtZS5sZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBuZ3hfc3RybmNtcChwYXJhbVtpXS5rZXkuZGF0YSwgcHJtLT5uYW1lLmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJtLT5uYW1lLmxlbikgIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtc1twcm0tPmluZGV4XSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5neF9sb2dfZXJyb3IoTkdYX0xPR19FUlIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLT5jb25uZWN0aW9uLT5sb2csIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZHVwbGljYXRlIFwiJVZcIiBwYXJhbWV0ZXIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluIFwiJVZcIiBTU0kgY29tbWFuZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyYW1baV0ua2V5LCAmY3R4LT5jb21tYW5kKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gc3NpX2Vycm9yOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXNbcHJtLT5pbmRleF0gPSAmcGFyYW1baV0udmFsdWU7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBybS0+bmFtZS5sZW4gPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2xvZ19lcnJvcihOR1hfTE9HX0VSUiwgci0+Y29ubmVjdGlvbi0+bG9nLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW52YWxpZCBwYXJhbWV0ZXIgbmFtZTogXCIlVlwiICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluIFwiJVZcIiBTU0kgY29tbWFuZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJhbVtpXS5rZXksICZjdHgtPmNvbW1hbmQpOworCisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIHNzaV9lcnJvcjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAocHJtID0gY21kLT5wYXJhbXM7IHBybS0+bmFtZS5sZW47IHBybSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwcm0tPm1hbmRhdG9yeSAmJiBwYXJhbXNbcHJtLT5pbmRleF0gPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2xvZ19lcnJvcihOR1hfTE9HX0VSUiwgci0+Y29ubmVjdGlvbi0+bG9nLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWFuZGF0b3J5IFwiJVZcIiBwYXJhbWV0ZXIgaXMgYWJzZW50ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluIFwiJVZcIiBTU0kgY29tbWFuZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwcm0tPm5hbWUsICZjdHgtPmNvbW1hbmQpOworCisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIHNzaV9lcnJvcjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChjbWQtPmhhbmRsZXIociwgY3R4LCBwYXJhbXMpID09IE5HWF9PSykgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGN0eC0+YnVzeSA9IGN0eC0+YnVzeS0+bmV4dDsKKworICAgICAgICAgICAgLyogcmMgPT0gTkdYX0hUVFBfU1NJX0VSUk9SICovCisKK3NzaV9lcnJvcjoKKworICAgICAgICAgICAgaWYgKGNvbmYtPnNpbGVudF9lcnJvcnMpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCEoYiA9IG5neF9jYWxsb2NfYnVmKHItPnBvb2wpKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGItPm1lbW9yeSA9IDE7CisgICAgICAgICAgICBiLT5wb3MgPSBuZ3hfaHR0cF9zc2lfZXJyb3Jfc3RyaW5nOworICAgICAgICAgICAgYi0+bGFzdCA9IG5neF9odHRwX3NzaV9lcnJvcl9zdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgICArIHNpemVvZihuZ3hfaHR0cF9zc2lfZXJyb3Jfc3RyaW5nKSAtIDE7CisKKyAgICAgICAgICAgIGlmICghKGNsID0gbmd4X2FsbG9jX2NoYWluX2xpbmsoci0+cG9vbCkpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2wtPmJ1ZiA9IGI7CisgICAgICAgICAgICBjbC0+bmV4dCA9IE5VTEw7CisgICAgICAgICAgICAqY3R4LT5sYXN0X291dCA9IGNsOworICAgICAgICAgICAgY3R4LT5sYXN0X291dCA9ICZjbC0+bmV4dDsKKworICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KKworICAgICAgICBjdHgtPmJ1Zi0+cG9zID0gY3R4LT5idWYtPmxhc3Q7CisKKyAgICAgICAgaWYgKGIgJiYgY3R4LT5idWYtPmxhc3RfYnVmKSB7CisgICAgICAgICAgICBiLT5sYXN0X2J1ZiA9IDE7CisgICAgICAgIH0KKworICAgICAgICBjdHgtPnNhdmVkID0gY3R4LT5sb29rZWQ7CiAgICAgfQogCi0gICAgcmV0dXJuIE5HWF9PSzsKKyAgICBpZiAoY3R4LT5vdXQgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTkdYX09LOworICAgIH0KKworICAgIHJjID0gbmd4X2h0dHBfbmV4dF9ib2R5X2ZpbHRlcihyLCBjdHgtPm91dCk7CisKKyAgICBjdHgtPm91dCA9IE5VTEw7CisgICAgY3R4LT5sYXN0X291dCA9ICZjdHgtPm91dDsKKworICAgIHJldHVybiByYzsKIH0KIAogCi1zdGF0aWMgbmd4X2ludF90IG5neF9odHRwX3NzaV9lcnJvcihuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfaHR0cF9zc2lfY3R4X3QgKmN0eCkKLXsKLSAgICBuZ3hfaHVua190ICAgKmh1bms7Ci0gICAgbmd4X2NoYWluX3QgICpjbDsKLQotICAgIGlmICghKGh1bmsgPSBuZ3hfY2FsbG9jX2h1bmsoci0+cG9vbCkpKSB7Ci0gICAgICAgIHJldHVybiBOR1hfRVJST1I7Ci0gICAgfQotCi0gICAgaHVuay0+dHlwZSA9IE5HWF9IVU5LX0lOX01FTU9SWXxOR1hfSFVOS19URU1QOwotICAgIGh1bmstPnBvcyA9IGVycm9yX3N0cmluZzsKLSAgICBodW5rLT5sYXN0ID0gZXJyb3Jfc3RyaW5nICsgc2l6ZW9mKGVycm9yX3N0cmluZykgLSAxOwotCi0gICAgbmd4X2FsbG9jX2xpbmtfYW5kX3NldF9odW5rKGNsLCBodW5rLCByLT5wb29sLCBOR1hfRVJST1IpOwotCi0gICAgKmN0eC0+bGFzdF9vdXQgPSBjbDsKLSAgICBjdHgtPmxhc3Rfb3V0ID0gJmNsLT5uZXh0OwotCi0gICAgcmV0dXJuIE5HWF9PSzsKLX0KLQotCi0jaWYgMAotCi1zdGF0aWMgaW50IG5neF9odHRwX3NzaV9jb3B5X29wY29kZShuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfaHR0cF9zc2lfY3R4X3QgKmN0eCwgdm9pZCAqZGF0YSkKLXsKLSAgICBuZ3hfaHR0cF9zc2lfY29weV90ICpjb3B5ID0gZGF0YTsKLQotICAgIG5neF9odW5rX3QgICAqaDsKLSAgICBuZ3hfY2hhaW5fdCAgIGNoYWluOwotCi0gICAgaCA9IGN0eC0+aW5jb21pbmctPmh1bms7Ci0KLSAgICBpZiAoY3R4LT5sb29rZWQgPT0gMCAmJiBjdHgtPnBvcyA9PSBoLT5sYXN0KSB7Ci0gICAgICAgIGNoYWluLmh1bmsgPSBoOwotICAgICAgICBjaGFpbi5uZXh0ID0gTlVMTDsKLQotICAgICAgICByZXR1cm4gbmV4dF9ib2R5X2ZpbHRlcihyLCAmY2hhaW4pOwotICAgIH0KLQotICAgIGlmIChjdHgtPmh1bmsgPT0gTlVMTCkgewotICAgICAgICBuZ3hfdGVzdF9udWxsKGN0eC0+aHVuaywgbmd4X2NhbGxvY19odW5rKHItPnBvb2wpLCBOR1hfRVJST1IpOwotICAgICAgICBjdHgtPmh1bmstPnR5cGUgPSBoLT50eXBlICYgTkdYX0hVTktfU1RPUkFHRTsKLSAgICB9Ci0KLQotICAgIGlmIChoLT50eXBlICYgTkdYX0hVTktfRklMRSkgewotICAgICAgICBpZiAoY29weS0+c3RhcnQgPD0gaC0+ZmlsZV9wb3MpIHsKLSAgICAgICAgICAgIGN0eC0+aHVuay0+ZmlsZV9wb3MgPSBoLT5maWxlX3BvczsKLSAgICAgICAgfSBlbHNlIGlmIChjb3B5LT5zdGFydCA8IGgtPmZpbGVfbGFzdCkgewotICAgICAgICAgICAgY3R4LT5odW5rLT5maWxlX3BvcyA9IGNvcHktPmZpbGVfcG9zOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGNvcHktPmVuZCA+PSBoLT5maWxlX2xhc3QpIHsKLSAgICAgICAgICAgIGN0eC0+aHVuay0+ZmlsZV9sYXN0ID0gaC0+ZmlsZV9sYXN0OwotICAgICAgICB9IGVsc2UgaWYgKGNvcHktPmVuZCA+IGgtPmZpbGVfcG9zKSB7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIGlmIChoLT50eXBlICYgTkdYX0hVTktfSU5fTUVNT1JZKSB7Ci0gICAgICAgIGlmIChjb3B5LT5zdGFydCA8PSBjdHgtPm9mZnNldCArIChoLT5wb3MgLSBoLT5zdGFydCkpIHsKLSAgICAgICAgICAgIGN0eC0+aHVuay0+cG9zID0gaC0+cG9zOwotICAgICAgICB9IGVsc2UgaWYgKGNvcHktPnN0YXJ0IDwgY3R4LT5vZmZzZXQgKyAoaC0+bGFzdCAtIGgtPnN0YXJ0KSkgewotICAgICAgICAgICAgY3R4LT5odW5rLT5wb3MgPSBoLT5zdGFydCArIChjb3B5LT5zdGFydCAtIGN0eC0+b2Zmc2V0KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChjb3B5LT5lbmQgPj0gY3R4LT5vZmZzZXQgKyAoaC0+bGFzdCAtIGgtPnN0YXJ0KSB7Ci0gICAgICAgICAgICBjdHgtPmh1bmstPmxhc3QgPSBoLT5sYXN0OwotICAgICAgICB9IGVsc2UgaWYgKGNvcHktPmVuZCA+IGN0eC0+b2Zmc2V0ICsgKGgtPnBvcyAtIGgtPnN0YXJ0KSkgewotICAgICAgICAgICAgY3R4LT5odW5rLT5sYXN0ID0gaC0+c3RhcnQgKyAoY29weS0+ZW5kIC0gY3R4LT5vZmZzZXQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogVE9ETzogTkdYX0hVTktfRkxVU0ggKi8KLQotICAgIGlmICgoaC0+dHlwZSAmIE5HWF9IVU5LX0xBU1QpICYmIGN0eC0+aHVuay0+bGFzdCA9PSBoLT5sYXN0KQotCi0gICAgLyogTEFTVCAqLwotfQotCi0jZW5kaWYKLQotCiBzdGF0aWMgbmd4X2ludF90CiBuZ3hfaHR0cF9zc2lfcGFyc2Uobmd4X2h0dHBfcmVxdWVzdF90ICpyLCBuZ3hfaHR0cF9zc2lfY3R4X3QgKmN0eCkKIHsKLSAgICB1X2NoYXIgICAgICAgICAgICAgICAgKnAsICpsYXN0LCAqZW5kLCBjaDsKLSAgICBuZ3hfaHR0cF9zc2lfY29uZl90ICAgKmNvbmY7CisgICAgdV9jaGFyICAgICAgICAgICAgICAgICpwLCAqbGFzdCwgKmNvcHlfZW5kLCBjaDsKKyAgICBzaXplX3QgICAgICAgICAgICAgICAgIGxvb2tlZDsKICAgICBuZ3hfaHR0cF9zc2lfc3RhdGVfZSAgIHN0YXRlOwogCi0gICAgY29uZiA9IG5neF9odHRwX2dldF9tb2R1bGVfbG9jX2NvbmYociwgbmd4X2h0dHBfc3NpX2ZpbHRlcl9tb2R1bGUpOwotCiAgICAgc3RhdGUgPSBjdHgtPnN0YXRlOwotICAgIGVuZCA9IGN0eC0+YnVmLT5sYXN0OwotICAgIGxhc3QgPSBOVUxMOworICAgIGxvb2tlZCA9IGN0eC0+bG9va2VkOworICAgIGxhc3QgPSBjdHgtPmJ1Zi0+bGFzdDsKKyAgICBjb3B5X2VuZCA9IGN0eC0+Y29weV9lbmQ7CiAKLSAgICBmb3IgKHAgPSBjdHgtPnBvczsgcCA8IGVuZDsgcCsrKSB7CisgICAgZm9yIChwID0gY3R4LT5wb3M7IHAgPCBsYXN0OyBwKyspIHsKIAogICAgICAgICBjaCA9ICpwOwogCkBAIC01MzksMjMgKzUzMCwzMCBAQAogCiAgICAgICAgICAgICAvKiB0aGUgdGlnaHQgbG9vcCAqLwogCi0gICAgICAgICAgICBmb3IgKCAvKiB2b2lkICovIDsgcCA8IGVuZDsgcCsrKSB7CisgICAgICAgICAgICBmb3IgKCAvKiB2b2lkICovIDsgcCA8IGxhc3Q7IGNoID0gKigrK3ApKSB7CiAgICAgICAgICAgICAgICAgaWYgKGNoICE9ICc8JykgewogICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBsYXN0ID0gcDsKKyAgICAgICAgICAgICAgICBjb3B5X2VuZCA9IHA7CisgICAgICAgICAgICAgICAgbG9va2VkID0gMTsKICAgICAgICAgICAgICAgICBzdGF0ZSA9IHNzaV90YWdfc3RhdGU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBnb3RvIHRhZ19zdGFydGVkOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAocCA9PSBlbmQpIHsKLSAgICAgICAgICAgICAgICBjdHgtPmxhc3QgPSBwOwotICAgICAgICAgICAgICAgIGN0eC0+cG9zID0gcDsKLSAgICAgICAgICAgICAgICBjdHgtPnN0YXRlID0gc3NpX3N0YXJ0X3N0YXRlOworICAgICAgICAgICAgY3R4LT5wb3MgPSBwOworICAgICAgICAgICAgY3R4LT5sb29rZWQgPSBsb29rZWQ7CisgICAgICAgICAgICBjdHgtPmNvcHlfZW5kID0gcDsKIAotICAgICAgICAgICAgICAgIHJldHVybiBOR1hfSFRUUF9TU0lfQ09QWTsKKyAgICAgICAgICAgIGlmIChjdHgtPmNvcHlfc3RhcnQgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGN0eC0+Y29weV9zdGFydCA9IGN0eC0+YnVmLT5wb3M7CiAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBOR1hfQUdBSU47CisKK3RhZ19zdGFydGVkOgorICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KIAogICAgICAgICBzd2l0Y2ggKHN0YXRlKSB7CkBAIC01NjYsMTQgKzU2NCwxNyBAQAogICAgICAgICBjYXNlIHNzaV90YWdfc3RhdGU6CiAgICAgICAgICAgICBzd2l0Y2ggKGNoKSB7CiAgICAgICAgICAgICBjYXNlICchJzoKKyAgICAgICAgICAgICAgICBsb29rZWQgPSAyOwogICAgICAgICAgICAgICAgIHN0YXRlID0gc3NpX2NvbW1lbnQwX3N0YXRlOwogICAgICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgICAgICBjYXNlICc8JzoKLSAgICAgICAgICAgICAgICBsYXN0ID0gcDsKKyAgICAgICAgICAgICAgICBjb3B5X2VuZCA9IHA7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgY29weV9lbmQgPSBwOworICAgICAgICAgICAgICAgIGxvb2tlZCA9IDA7CiAgICAgICAgICAgICAgICAgc3RhdGUgPSBzc2lfc3RhcnRfc3RhdGU7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CkBAIC01ODMsMTUgKzU4NCwxOSBAQAogICAgICAgICBjYXNlIHNzaV9jb21tZW50MF9zdGF0ZToKICAgICAgICAgICAgIHN3aXRjaCAoY2gpIHsKICAgICAgICAgICAgIGNhc2UgJy0nOgorICAgICAgICAgICAgICAgIGxvb2tlZCA9IDM7CiAgICAgICAgICAgICAgICAgc3RhdGUgPSBzc2lfY29tbWVudDFfc3RhdGU7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgICAgIGNhc2UgJzwnOgotICAgICAgICAgICAgICAgIGxhc3QgPSBwOworICAgICAgICAgICAgICAgIGNvcHlfZW5kID0gcDsKKyAgICAgICAgICAgICAgICBsb29rZWQgPSAxOwogICAgICAgICAgICAgICAgIHN0YXRlID0gc3NpX3RhZ19zdGF0ZTsKICAgICAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBjb3B5X2VuZCA9IHA7CisgICAgICAgICAgICAgICAgbG9va2VkID0gMDsKICAgICAgICAgICAgICAgICBzdGF0ZSA9IHNzaV9zdGFydF9zdGF0ZTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KQEAgLTYwMSwxNSArNjA2LDE5IEBACiAgICAgICAgIGNhc2Ugc3NpX2NvbW1lbnQxX3N0YXRlOgogICAgICAgICAgICAgc3dpdGNoIChjaCkgewogICAgICAgICAgICAgY2FzZSAnLSc6CisgICAgICAgICAgICAgICAgbG9va2VkID0gNDsKICAgICAgICAgICAgICAgICBzdGF0ZSA9IHNzaV9zaGFycF9zdGF0ZTsKICAgICAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICAgICAgY2FzZSAnPCc6Ci0gICAgICAgICAgICAgICAgbGFzdCA9IHA7CisgICAgICAgICAgICAgICAgY29weV9lbmQgPSBwOworICAgICAgICAgICAgICAgIGxvb2tlZCA9IDE7CiAgICAgICAgICAgICAgICAgc3RhdGUgPSBzc2lfdGFnX3N0YXRlOwogICAgICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGNvcHlfZW5kID0gcDsKKyAgICAgICAgICAgICAgICBsb29rZWQgPSAwOwogICAgICAgICAgICAgICAgIHN0YXRlID0gc3NpX3N0YXJ0X3N0YXRlOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQpAQCAtNjE5LDE3ICs2MjgsMjIgQEAKICAgICAgICAgY2FzZSBzc2lfc2hhcnBfc3RhdGU6CiAgICAgICAgICAgICBzd2l0Y2ggKGNoKSB7CiAgICAgICAgICAgICBjYXNlICcjJzoKLSAgICAgICAgICAgICAgICBjdHgtPmxhc3QgPSBsYXN0OwotICAgICAgICAgICAgICAgIGN0eC0+cG9zID0gcDsKLSAgICAgICAgICAgICAgICBjdHgtPnN0YXRlID0gc3NpX3ByZWNvbW1hbmRfc3RhdGU7CisgICAgICAgICAgICAgICAgaWYgKGN0eC0+Y29weV9zdGFydCkgeworICAgICAgICAgICAgICAgICAgICBjdHgtPnNhdmVkID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbG9va2VkID0gMDsKKyAgICAgICAgICAgICAgICBzdGF0ZSA9IHNzaV9wcmVjb21tYW5kX3N0YXRlOwogICAgICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgICAgICBjYXNlICc8JzoKLSAgICAgICAgICAgICAgICBsYXN0ID0gcDsKKyAgICAgICAgICAgICAgICBjb3B5X2VuZCA9IHA7CisgICAgICAgICAgICAgICAgbG9va2VkID0gMTsKICAgICAgICAgICAgICAgICBzdGF0ZSA9IHNzaV90YWdfc3RhdGU7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgY29weV9lbmQgPSBwOworICAgICAgICAgICAgICAgIGxvb2tlZCA9IDA7CiAgICAgICAgICAgICAgICAgc3RhdGUgPSBzc2lfc3RhcnRfc3RhdGU7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CkBAIC02NDYsMTMgKzY2MCwxNCBAQAogCiAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgIGN0eC0+Y29tbWFuZC5sZW4gPSAxOwotICAgICAgICAgICAgICAgIGN0eC0+Y29tbWFuZC5kYXRhID0gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfcGFsbG9jKHItPnBvb2wsIE5HWF9IVFRQX1NTSV9DT01NQU5EX0xFTik7CisgICAgICAgICAgICAgICAgY3R4LT5jb21tYW5kLmRhdGEgPSBuZ3hfcGFsbG9jKHItPnBvb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5HWF9IVFRQX1NTSV9DT01NQU5EX0xFTiArIDEpOwogICAgICAgICAgICAgICAgIGlmIChjdHgtPmNvbW1hbmQuZGF0YSA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgY3R4LT5jb21tYW5kLmRhdGFbMF0gPSBjaDsKKyAgICAgICAgICAgICAgICBjdHgtPnBhcmFtcy5uZWx0cyA9IDA7CiAgICAgICAgICAgICAgICAgc3RhdGUgPSBzc2lfY29tbWFuZF9zdGF0ZTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KQEAgLTY3MywxNCArNjg4LDE2IEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgaWYgKGN0eC0+Y29tbWFuZC5sZW4gPT0gTkdYX0hUVFBfU1NJX0NPTU1BTkRfTEVOKSB7Ci0gICAgICAgICAgICAgICAgICAgIGN0eC0+cG9zID0gcDsKLSAgICAgICAgICAgICAgICAgICAgY3R4LT5zdGF0ZSA9IHNzaV9lcnJvcl9zdGF0ZTsKLQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0hUVFBfU1NJX0lOVkFMSURfQ09NTUFORDsKLSAgICAgICAgICAgICAgICB9Ci0KICAgICAgICAgICAgICAgICBjdHgtPmNvbW1hbmQuZGF0YVtjdHgtPmNvbW1hbmQubGVuKytdID0gY2g7CisKKyAgICAgICAgICAgICAgICBpZiAoY3R4LT5jb21tYW5kLmxlbiA9PSBOR1hfSFRUUF9TU0lfQ09NTUFORF9MRU4pIHsKKyAgICAgICAgICAgICAgICAgICAgbmd4X2xvZ19lcnJvcihOR1hfTE9HX0VSUiwgci0+Y29ubmVjdGlvbi0+bG9nLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGUgXCIlVlwiIFNTSSBjb21tYW5kIGlzIHRvbyBsb25nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3R4LT5jb21tYW5kKTsKKworICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IHNzaV9lcnJvcl9zdGF0ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBicmVhazsKQEAgLTY5OCwyOCArNzE1LDIyIEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgaWYgKGN0eC0+cGFyYW1zLmVsdHMgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBpZiAobmd4X2FycmF5X2luaXQoJmN0eC0+cGFyYW1zID0gci0+cG9vbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQsIHNpemVvZihuZ3hfdGFibGVfZWx0X3QpKSA9IE5HWF9FUlJPUikKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9FUlJPUjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQogICAgICAgICAgICAgICAgIGlmICghKGN0eC0+cGFyYW0gPSBuZ3hfYXJyYXlfcHVzaCgmY3R4LT5wYXJhbXMpKSkgewogICAgICAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGN0eC0+cGFyYW0tPmtleS5sZW4gPSAxOwotICAgICAgICAgICAgICAgIGN0eC0+cGFyYW0tPmtleS5kYXRhID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X3BhbGxvYyhyLT5wb29sLCBOR1hfSFRUUF9TU0lfUEFSQU1fTEVOKTsKKyAgICAgICAgICAgICAgICBjdHgtPnBhcmFtLT5rZXkuZGF0YSA9IG5neF9wYWxsb2Moci0+cG9vbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkdYX0hUVFBfU1NJX1BBUkFNX0xFTiArIDEpOwogICAgICAgICAgICAgICAgIGlmIChjdHgtPnBhcmFtLT5rZXkuZGF0YSA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOR1hfRVJST1I7CiAgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgY3R4LT5wYXJhbS0+a2V5LmRhdGFbMF0gPSBjaDsKIAogICAgICAgICAgICAgICAgIGN0eC0+cGFyYW0tPnZhbHVlLmxlbiA9IDA7Ci0gICAgICAgICAgICAgICAgY3R4LT5wYXJhbS0+dmFsdWUuZGF0YSA9IG5neF9wYWxsb2Moci0+cG9vbCwgY29uZi0+dmFsdWVfbGVuKTsKKyAgICAgICAgICAgICAgICBjdHgtPnBhcmFtLT52YWx1ZS5kYXRhID0gbmd4X3BhbGxvYyhyLT5wb29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+dmFsdWVfbGVuICsgMSk7CiAgICAgICAgICAgICAgICAgaWYgKGN0eC0+cGFyYW0tPnZhbHVlLmRhdGEgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0VSUk9SOwogICAgICAgICAgICAgICAgIH0KQEAgLTc0NCwyMCArNzU1LDI1IEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgICAgIGNhc2UgJy0nOgotICAgICAgICAgICAgICAgIGN0eC0+cG9zID0gcDsKLSAgICAgICAgICAgICAgICBjdHgtPnN0YXRlID0gc3NpX2Vycm9yX2VuZDBfc3RhdGU7Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0hUVFBfU1NJX0lOVkFMSURfUEFSQU07Ci0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgaWYgKGN0eC0+cGFyYW0tPmtleS5sZW4gPT0gTkdYX0hUVFBfU1NJX1BBUkFNX0xFTikgewotICAgICAgICAgICAgICAgICAgICBjdHgtPnBvcyA9IHA7Ci0gICAgICAgICAgICAgICAgICAgIGN0eC0+c3RhdGUgPSBzc2lfZXJyb3Jfc3RhdGU7Ci0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9IVFRQX1NTSV9JTlZBTElEX1BBUkFNOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdGF0ZSA9IHNzaV9lcnJvcl9lbmQwX3N0YXRlOwogCiAgICAgICAgICAgICAgICAgY3R4LT5wYXJhbS0+a2V5LmRhdGFbY3R4LT5wYXJhbS0+a2V5LmxlbisrXSA9IGNoOworICAgICAgICAgICAgICAgIG5neF9sb2dfZXJyb3IoTkdYX0xPR19FUlIsIHItPmNvbm5lY3Rpb24tPmxvZywgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnZhbGlkIFwiJVZcIiBwYXJhbWV0ZXIgaW4gXCIlVlwiIFNTSSBjb21tYW5kIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjdHgtPnBhcmFtLT5rZXksICZjdHgtPmNvbW1hbmQpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGN0eC0+cGFyYW0tPmtleS5kYXRhW2N0eC0+cGFyYW0tPmtleS5sZW4rK10gPSBjaDsKKworICAgICAgICAgICAgICAgIGlmIChjdHgtPnBhcmFtLT5rZXkubGVuID09IE5HWF9IVFRQX1NTSV9QQVJBTV9MRU4pIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBzc2lfZXJyb3Jfc3RhdGU7CisgICAgICAgICAgICAgICAgICAgIG5neF9sb2dfZXJyb3IoTkdYX0xPR19FUlIsIHItPmNvbm5lY3Rpb24tPmxvZywgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidG9vIGxvbmcgXCIlVlwiIHBhcmFtZXRlciBpbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiJVZcIiBTU0kgY29tbWFuZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmN0eC0+cGFyYW0tPmtleSwgJmN0eC0+Y29tbWFuZCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgYnJlYWs7CkBAIC03NzQsMTggKzc5MCwxOCBAQAogICAgICAgICAgICAgICAgIHN0YXRlID0gc3NpX3ByZXZhbHVlX3N0YXRlOwogICAgICAgICAgICAgICAgIGJyZWFrOwogCi0gICAgICAgICAgICBjYXNlICctJzoKLSAgICAgICAgICAgICAgICBjdHgtPnBvcyA9IHA7Ci0gICAgICAgICAgICAgICAgY3R4LT5zdGF0ZSA9IHNzaV9lcnJvcl9lbmQwX3N0YXRlOwotCi0gICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9IVFRQX1NTSV9JTlZBTElEX1BBUkFNOwotCiAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGN0eC0+bGFzdCA9IGxhc3Q7Ci0gICAgICAgICAgICAgICAgY3R4LT5wb3MgPSBwOwotICAgICAgICAgICAgICAgIGN0eC0+c3RhdGUgPSBzc2lfZXJyb3Jfc3RhdGU7CisgICAgICAgICAgICAgICAgaWYgKGNoID09ICctJykgeworICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IHNzaV9lcnJvcl9lbmQwX3N0YXRlOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gc3NpX2Vycm9yX3N0YXRlOworICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIHJldHVybiBOR1hfSFRUUF9TU0lfSU5WQUxJRF9QQVJBTTsKKyAgICAgICAgICAgICAgICBuZ3hfbG9nX2Vycm9yKE5HWF9MT0dfRVJSLCByLT5jb25uZWN0aW9uLT5sb2csIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5leHBlY3RlZCBcIiVjXCIgc3ltYm9sIGFmdGVyIFwiJVZcIiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFyYW1ldGVyIGluIFwiJVZcIiBTU0kgY29tbWFuZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaCwgJmN0eC0+cGFyYW0tPmtleSwgJmN0eC0+Y29tbWFuZCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGJyZWFrOwpAQCAtODA2LDE5ICs4MjIsMTggQEAKICAgICAgICAgICAgICAgICBzdGF0ZSA9IHNzaV9xdW90ZWRfdmFsdWVfc3RhdGU7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgICAgIGNhc2UgJy0nOgotICAgICAgICAgICAgICAgIGN0eC0+bGFzdCA9IGxhc3Q7Ci0gICAgICAgICAgICAgICAgY3R4LT5wb3MgPSBwOwotICAgICAgICAgICAgICAgIGN0eC0+c3RhdGUgPSBzc2lfZXJyb3JfZW5kMF9zdGF0ZTsKLQotICAgICAgICAgICAgICAgIHJldHVybiBOR1hfSFRUUF9TU0lfSU5WQUxJRF9WQUxVRTsKLQogICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBjdHgtPmxhc3QgPSBsYXN0OwotICAgICAgICAgICAgICAgIGN0eC0+cG9zID0gcDsKLSAgICAgICAgICAgICAgICBjdHgtPnN0YXRlID0gc3NpX2Vycm9yX3N0YXRlOworICAgICAgICAgICAgICAgIGlmIChjaCA9PSAnLScpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBzc2lfZXJyb3JfZW5kMF9zdGF0ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IHNzaV9lcnJvcl9zdGF0ZTsKKyAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0hUVFBfU1NJX0lOVkFMSURfVkFMVUU7CisgICAgICAgICAgICAgICAgbmd4X2xvZ19lcnJvcihOR1hfTE9HX0VSUiwgci0+Y29ubmVjdGlvbi0+bG9nLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVuZXhwZWN0ZWQgXCIlY1wiIHN5bWJvbCBiZWZvcmUgdmFsdWUgb2YgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiJVZcIiBwYXJhbWV0ZXIgaW4gXCIlVlwiIFNTSSBjb21tYW5kIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoLCAmY3R4LT5wYXJhbS0+a2V5LCAmY3R4LT5jb21tYW5kKTsKKyAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgYnJlYWs7CkBAIC04MjYsNzcgKzg0MSw5OCBAQAogICAgICAgICBjYXNlIHNzaV9kb3VibGVfcXVvdGVkX3ZhbHVlX3N0YXRlOgogICAgICAgICAgICAgc3dpdGNoIChjaCkgewogICAgICAgICAgICAgY2FzZSAnXFwnOgotICAgICAgICAgICAgICAgIHN0YXRlID0gc3NpX2RvdWJsZV9xdW90ZWRfdmFsdWVfcXVvdGVfc3RhdGU7CisgICAgICAgICAgICAgICAgY3R4LT5zYXZlZF9zdGF0ZSA9IHNzaV9kb3VibGVfcXVvdGVkX3ZhbHVlX3N0YXRlOworICAgICAgICAgICAgICAgIHN0YXRlID0gc3NpX3F1b3RlZF9zeW1ib2xfc3RhdGU7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgICAgIGNhc2UgJyInOgotICAgICAgICAgICAgICAgIHN0YXRlID0gc3NpX3ByZXBhcmFtX3N0YXRlOworICAgICAgICAgICAgICAgIHN0YXRlID0gc3NpX3Bvc3RwYXJhbV9zdGF0ZTsKICAgICAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBpZiAoY3R4LT5wYXJhbS0+dmFsdWUubGVuID49IGNvbmYtPnZhbHVlX2xlbikgewotICAgICAgICAgICAgICAgICAgICBjdHgtPmxhc3QgPSBsYXN0OwotICAgICAgICAgICAgICAgICAgICBjdHgtPnBvcyA9IHA7Ci0gICAgICAgICAgICAgICAgICAgIGN0eC0+c3RhdGUgPSBzc2lfZXJyb3Jfc3RhdGU7Ci0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9IVFRQX1NTSV9MT05HX1ZBTFVFOwotICAgICAgICAgICAgICAgIH0KLQogICAgICAgICAgICAgICAgIGN0eC0+cGFyYW0tPnZhbHVlLmRhdGFbY3R4LT5wYXJhbS0+dmFsdWUubGVuKytdID0gY2g7CisKKyAgICAgICAgICAgICAgICBpZiAoY3R4LT5wYXJhbS0+dmFsdWUubGVuID09IGN0eC0+dmFsdWVfbGVuKSB7CisgICAgICAgICAgICAgICAgICAgIG5neF9sb2dfZXJyb3IoTkdYX0xPR19FUlIsIHItPmNvbm5lY3Rpb24tPmxvZywgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidG9vIGxvbmcgXCIlVlwiIHZhbHVlIG9mIFwiJVZcIiBwYXJhbWV0ZXIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbiBcIiVWXCIgU1NJIGNvbW1hbmQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjdHgtPnBhcmFtLT52YWx1ZSwgJmN0eC0+cGFyYW0tPmtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3R4LT5jb21tYW5kKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBzc2lfZXJyb3Jfc3RhdGU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgY2FzZSBzc2lfZG91YmxlX3F1b3RlZF92YWx1ZV9xdW90ZV9zdGF0ZToKLSAgICAgICAgICAgIGlmIChjdHgtPnBhcmFtLT52YWx1ZS5sZW4gPj0gY29uZi0+dmFsdWVfbGVuKSB7Ci0gICAgICAgICAgICAgICAgY3R4LT5sYXN0ID0gbGFzdDsKLSAgICAgICAgICAgICAgICBjdHgtPnBvcyA9IHA7Ci0gICAgICAgICAgICAgICAgY3R4LT5zdGF0ZSA9IHNzaV9lcnJvcl9zdGF0ZTsKLQotICAgICAgICAgICAgICAgIHJldHVybiBOR1hfSFRUUF9TU0lfTE9OR19WQUxVRTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY3R4LT5wYXJhbS0+dmFsdWUuZGF0YVtjdHgtPnBhcmFtLT52YWx1ZS5sZW4rK10gPSBjaDsKLQotICAgICAgICAgICAgc3RhdGUgPSBzc2lfZG91YmxlX3F1b3RlZF92YWx1ZV9zdGF0ZTsKLSAgICAgICAgICAgIGJyZWFrOwotCiAgICAgICAgIGNhc2Ugc3NpX3F1b3RlZF92YWx1ZV9zdGF0ZToKICAgICAgICAgICAgIHN3aXRjaCAoY2gpIHsKICAgICAgICAgICAgIGNhc2UgJ1xcJzoKLSAgICAgICAgICAgICAgICBzdGF0ZSA9IHNzaV9xdW90ZWRfdmFsdWVfcXVvdGVfc3RhdGU7CisgICAgICAgICAgICAgICAgY3R4LT5zYXZlZF9zdGF0ZSA9IHNzaV9xdW90ZWRfdmFsdWVfc3RhdGU7CisgICAgICAgICAgICAgICAgc3RhdGUgPSBzc2lfcXVvdGVkX3N5bWJvbF9zdGF0ZTsKICAgICAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICAgICAgY2FzZSAnXCcnOgotICAgICAgICAgICAgICAgIHN0YXRlID0gc3NpX3ByZXBhcmFtX3N0YXRlOworICAgICAgICAgICAgICAgIHN0YXRlID0gc3NpX3Bvc3RwYXJhbV9zdGF0ZTsKICAgICAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBpZiAoY3R4LT5wYXJhbS0+dmFsdWUubGVuID49IGNvbmYtPnZhbHVlX2xlbikgewotICAgICAgICAgICAgICAgICAgICBjdHgtPmxhc3QgPSBsYXN0OwotICAgICAgICAgICAgICAgICAgICBjdHgtPnBvcyA9IHA7Ci0gICAgICAgICAgICAgICAgICAgIGN0eC0+c3RhdGUgPSBzc2lfZXJyb3Jfc3RhdGU7Ci0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9IVFRQX1NTSV9MT05HX1ZBTFVFOwotICAgICAgICAgICAgICAgIH0KLQogICAgICAgICAgICAgICAgIGN0eC0+cGFyYW0tPnZhbHVlLmRhdGFbY3R4LT5wYXJhbS0+dmFsdWUubGVuKytdID0gY2g7CisKKyAgICAgICAgICAgICAgICBpZiAoY3R4LT5wYXJhbS0+dmFsdWUubGVuID09IGN0eC0+dmFsdWVfbGVuKSB7CisgICAgICAgICAgICAgICAgICAgIG5neF9sb2dfZXJyb3IoTkdYX0xPR19FUlIsIHItPmNvbm5lY3Rpb24tPmxvZywgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidG9vIGxvbmcgXCIlVlwiIHZhbHVlIG9mIFwiJVZcIiBwYXJhbWV0ZXIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbiBcIiVWXCIgU1NJIGNvbW1hbmQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjdHgtPnBhcmFtLT52YWx1ZSwgJmN0eC0+cGFyYW0tPmtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3R4LT5jb21tYW5kKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBzc2lfZXJyb3Jfc3RhdGU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgY2FzZSBzc2lfcXVvdGVkX3ZhbHVlX3F1b3RlX3N0YXRlOgotICAgICAgICAgICAgaWYgKGN0eC0+cGFyYW0tPnZhbHVlLmxlbiA+PSBjb25mLT52YWx1ZV9sZW4pIHsKLSAgICAgICAgICAgICAgICBjdHgtPmxhc3QgPSBsYXN0OwotICAgICAgICAgICAgICAgIGN0eC0+cG9zID0gcDsKLSAgICAgICAgICAgICAgICBjdHgtPnN0YXRlID0gc3NpX2Vycm9yX3N0YXRlOwotCi0gICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9IVFRQX1NTSV9MT05HX1ZBTFVFOwotICAgICAgICAgICAgfQotCisgICAgICAgIGNhc2Ugc3NpX3F1b3RlZF9zeW1ib2xfc3RhdGU6CiAgICAgICAgICAgICBjdHgtPnBhcmFtLT52YWx1ZS5kYXRhW2N0eC0+cGFyYW0tPnZhbHVlLmxlbisrXSA9IGNoOwogCi0gICAgICAgICAgICBzdGF0ZSA9IHNzaV9xdW90ZWRfdmFsdWVfc3RhdGU7CisgICAgICAgICAgICBpZiAoY3R4LT5wYXJhbS0+dmFsdWUubGVuID09IGN0eC0+dmFsdWVfbGVuKSB7CisgICAgICAgICAgICAgICAgaWYgKGN0eC0+cGFyYW0tPnZhbHVlLmxlbiA9PSBjdHgtPnZhbHVlX2xlbikgeworICAgICAgICAgICAgICAgICAgICBuZ3hfbG9nX2Vycm9yKE5HWF9MT0dfRVJSLCByLT5jb25uZWN0aW9uLT5sb2csIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRvbyBsb25nIFwiJVZcIiB2YWx1ZSBvZiBcIiVWXCIgcGFyYW1ldGVyICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW4gXCIlVlwiIFNTSSBjb21tYW5kIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3R4LT5wYXJhbS0+dmFsdWUsICZjdHgtPnBhcmFtLT5rZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmN0eC0+Y29tbWFuZCk7CisgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gc3NpX2Vycm9yX3N0YXRlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlID0gY3R4LT5zYXZlZF9zdGF0ZTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2Ugc3NpX3Bvc3RwYXJhbV9zdGF0ZToKKyAgICAgICAgICAgIHN3aXRjaCAoY2gpIHsKKyAgICAgICAgICAgIGNhc2UgJyAnOgorICAgICAgICAgICAgY2FzZSBDUjoKKyAgICAgICAgICAgIGNhc2UgTEY6CisgICAgICAgICAgICBjYXNlICdcdCc6CisgICAgICAgICAgICAgICAgc3RhdGUgPSBzc2lfcHJlcGFyYW1fc3RhdGU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgJy0nOgorICAgICAgICAgICAgICAgIHN0YXRlID0gc3NpX2NvbW1lbnRfZW5kMF9zdGF0ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBuZ3hfbG9nX2Vycm9yKE5HWF9MT0dfRVJSLCByLT5jb25uZWN0aW9uLT5sb2csIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5leHBlY3RlZCBcIiVjXCIgc3ltYm9sIGFmdGVyIFwiJVZcIiB2YWx1ZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib2YgXCIlVlwiIHBhcmFtZXRlciBpbiBcIiVWXCIgU1NJIGNvbW1hbmQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2gsICZjdHgtPnBhcmFtLT52YWx1ZSwgJmN0eC0+cGFyYW0tPmtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjdHgtPmNvbW1hbmQpOworICAgICAgICAgICAgICAgIHN0YXRlID0gc3NpX2Vycm9yX3N0YXRlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIHNzaV9jb21tZW50X2VuZDBfc3RhdGU6CkBAIC05MDYsMTEgKzk0MiwxMSBAQAogICAgICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGN0eC0+bGFzdCA9IGxhc3Q7Ci0gICAgICAgICAgICAgICAgY3R4LT5wb3MgPSBwOwotICAgICAgICAgICAgICAgIGN0eC0+c3RhdGUgPSBzc2lfZXJyb3Jfc3RhdGU7Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0hUVFBfU1NJX0lOVkFMSURfQ09NTUFORDsKKyAgICAgICAgICAgICAgICBuZ3hfbG9nX2Vycm9yKE5HWF9MT0dfRVJSLCByLT5jb25uZWN0aW9uLT5sb2csIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5leHBlY3RlZCBcIiVjXCIgc3ltYm9sIGluIFwiJVZcIiBTU0kgY29tbWFuZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaCwgJmN0eC0+Y29tbWFuZCk7CisgICAgICAgICAgICAgICAgc3RhdGUgPSBzc2lfZXJyb3Jfc3RhdGU7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGJyZWFrOwpAQCAtOTE5LDE3ICs5NTUsMjIgQEAKICAgICAgICAgICAgIHN3aXRjaCAoY2gpIHsKICAgICAgICAgICAgIGNhc2UgJz4nOgogICAgICAgICAgICAgICAgIGN0eC0+c3RhdGUgPSBzc2lfc3RhcnRfc3RhdGU7Ci0gICAgICAgICAgICAgICAgY3R4LT5zdGFydCA9IHA7Ci0gICAgICAgICAgICAgICAgY3R4LT5wb3MgPSBwOworICAgICAgICAgICAgICAgIGN0eC0+cG9zID0gcCArIDE7CisgICAgICAgICAgICAgICAgY3R4LT5sb29rZWQgPSBsb29rZWQ7CisgICAgICAgICAgICAgICAgY3R4LT5jb3B5X2VuZCA9IGNvcHlfZW5kOworCisgICAgICAgICAgICAgICAgaWYgKGN0eC0+Y29weV9zdGFydCA9PSBOVUxMICYmIGNvcHlfZW5kKSB7CisgICAgICAgICAgICAgICAgICAgIGN0eC0+Y29weV9zdGFydCA9IGN0eC0+YnVmLT5wb3M7CisgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9PSzsKIAogICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBjdHgtPmxhc3QgPSBsYXN0OwotICAgICAgICAgICAgICAgIGN0eC0+cG9zID0gcDsKLSAgICAgICAgICAgICAgICBjdHgtPnN0YXRlID0gc3NpX2Vycm9yX3N0YXRlOwotCi0gICAgICAgICAgICAgICAgcmV0dXJuIE5HWF9IVFRQX1NTSV9JTlZBTElEX0NPTU1BTkQ7CisgICAgICAgICAgICAgICAgbmd4X2xvZ19lcnJvcihOR1hfTE9HX0VSUiwgci0+Y29ubmVjdGlvbi0+bG9nLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVuZXhwZWN0ZWQgXCIlY1wiIHN5bWJvbCBpbiBcIiVWXCIgU1NJIGNvbW1hbmQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2gsICZjdHgtPmNvbW1hbmQpOworICAgICAgICAgICAgICAgIHN0YXRlID0gc3NpX2Vycm9yX3N0YXRlOworICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBicmVhazsKQEAgLTk2MywxMCArMTAwNCwxNSBAQAogICAgICAgICAgICAgc3dpdGNoIChjaCkgewogICAgICAgICAgICAgY2FzZSAnPic6CiAgICAgICAgICAgICAgICAgY3R4LT5zdGF0ZSA9IHNzaV9zdGFydF9zdGF0ZTsKLSAgICAgICAgICAgICAgICBjdHgtPnN0YXJ0ID0gcDsKLSAgICAgICAgICAgICAgICBjdHgtPnBvcyA9IHA7CisgICAgICAgICAgICAgICAgY3R4LT5wb3MgPSBwICsgMTsKKyAgICAgICAgICAgICAgICBjdHgtPmxvb2tlZCA9IGxvb2tlZDsKKyAgICAgICAgICAgICAgICBjdHgtPmNvcHlfZW5kID0gY29weV9lbmQ7CiAKLSAgICAgICAgICAgICAgICByZXR1cm4gTkdYX0FHQUlOOworICAgICAgICAgICAgICAgIGlmIChjdHgtPmNvcHlfc3RhcnQgPT0gTlVMTCAmJiBjb3B5X2VuZCkgeworICAgICAgICAgICAgICAgICAgICBjdHgtPmNvcHlfc3RhcnQgPSBjdHgtPmJ1Zi0+cG9zOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiBOR1hfSFRUUF9TU0lfRVJST1I7CiAKICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgc3RhdGUgPSBzc2lfZXJyb3Jfc3RhdGU7CkBAIC05NzgsMjEgKzEwMjQsMTE1IEBACiAgICAgfQogCiAgICAgY3R4LT5zdGF0ZSA9IHN0YXRlOwotICAgIGN0eC0+bGFzdCA9IGxhc3Q7CiAgICAgY3R4LT5wb3MgPSBwOworICAgIGN0eC0+bG9va2VkID0gbG9va2VkOwogCi0gICAgcmV0dXJuIE5HWF9IVFRQX1NTSV9DT1BZOworICAgIGN0eC0+Y29weV9lbmQgPSAoc3RhdGUgPT0gc3NpX3N0YXJ0X3N0YXRlKSA/IHAgOiBjb3B5X2VuZDsKKworICAgIGlmIChjdHgtPmNvcHlfc3RhcnQgPT0gTlVMTCAmJiBjdHgtPmNvcHlfZW5kKSB7CisgICAgICAgIGN0eC0+Y29weV9zdGFydCA9IGN0eC0+YnVmLT5wb3M7CisgICAgfQorCisgICAgcmV0dXJuIE5HWF9BR0FJTjsKIH0KIAogCi1zdGF0aWMgbmd4X2ludF90IG5neF9odHRwX3NzaV9lY2hvKG5neF9odHRwX3JlcXVlc3RfdCAqciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2h0dHBfc3NpX2N0eF90ICpjdHgpCitzdGF0aWMgbmd4X2ludF90CituZ3hfaHR0cF9zc2lfZWNobyhuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIG5neF9odHRwX3NzaV9jdHhfdCAqY3R4LAorICAgIG5neF9zdHJfdCAqKnBhcmFtcykKIHsKKyAgICB1X2NoYXIgICAgICAgICAgICBjaDsKKyAgICBuZ3hfdWludF90ICAgICAgICBpLCBuOworICAgIG5neF9idWZfdCAgICAgICAgKmI7CisgICAgbmd4X3N0cl90ICAgICAgICAqdmFyLCAqdmFsdWU7CisgICAgbmd4X2NoYWluX3QgICAgICAqY2w7CisgICAgbmd4X2xpc3RfcGFydF90ICAqcGFydDsKKyAgICBuZ3hfdGFibGVfZWx0X3QgICpoZWFkZXI7CisKKyAgICB2YXIgPSBwYXJhbXNbTkdYX0hUVFBfU1NJX0VDSE9fVkFSXTsKKyAgICB2YWx1ZSA9IE5VTEw7CisKKyAgICBpZiAodmFyLT5sZW4gPiA1ICYmIG5neF9zdHJuY21wKHZhci0+ZGF0YSwgIkhUVFBfIiwgNSkgPT0gMCkgeworCisgICAgICAgIHBhcnQgPSAmci0+aGVhZGVyc19pbi5oZWFkZXJzLnBhcnQ7CisgICAgICAgIGhlYWRlciA9IHBhcnQtPmVsdHM7CisKKyAgICAgICAgZm9yIChpID0gMDsgLyogdm9pZCAqLyA7IGkrKykgeworCisgICAgICAgICAgICBpZiAoaSA+PSBwYXJ0LT5uZWx0cykgeworICAgICAgICAgICAgICAgIGlmIChwYXJ0LT5uZXh0ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcGFydCA9IHBhcnQtPm5leHQ7CisgICAgICAgICAgICAgICAgaGVhZGVyID0gcGFydC0+ZWx0czsKKyAgICAgICAgICAgICAgICBpID0gMDsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAobiA9IDA7IG4gKyA1IDwgdmFyLT5sZW4gJiYgbiA8IGhlYWRlcltpXS5rZXkubGVuOyBuKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2ggPSBoZWFkZXJbaV0ua2V5LmRhdGFbbl07CisKKyAgICAgICAgICAgICAgICBpZiAoY2ggPj0gJ2EnICYmIGNoIDw9ICd6JykgeworICAgICAgICAgICAgICAgICAgICBjaCAmPSB+MHgyMDsKKworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJy0nKSB7CisgICAgICAgICAgICAgICAgICAgIGNoID0gJ18nOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh2YXItPmRhdGFbbiArIDVdICE9IGNoKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG4gKyA1ID09IHZhci0+bGVuKSB7CisgICAgICAgICAgICAgICAgdmFsdWUgPSAmaGVhZGVyW2ldLnZhbHVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9IGVsc2UgaWYgKHZhci0+bGVuID09IHNpemVvZigiUkVNT1RFX0FERFIiKSAtIDEKKyAgICAgICAgICAgICAgICYmIG5neF9zdHJuY21wKHZhci0+ZGF0YSwgIlJFTU9URV9BRERSIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigiUkVNT1RFX0FERFIiKSAtIDEpID09IDApCisgICAgeworICAgICAgICB2YWx1ZSA9ICZyLT5jb25uZWN0aW9uLT5hZGRyX3RleHQ7CisgICAgfQorCisKKyAgICBpZiAodmFsdWUgPT0gTlVMTCkgeworICAgICAgICB2YWx1ZSA9IHBhcmFtc1tOR1hfSFRUUF9TU0lfRUNIT19ERUZBVUxUXTsKKyAgICB9CisKKyAgICBpZiAodmFsdWUgPT0gTlVMTCkgeworICAgICAgICB2YWx1ZSA9ICZuZ3hfaHR0cF9zc2lfbm9uZTsKKworICAgIH0gZWxzZSBpZiAodmFsdWUtPmxlbiA9PSAwKSB7CisgICAgICAgIHJldHVybiBOR1hfT0s7CisgICAgfQorCisgICAgaWYgKCEoYiA9IG5neF9jYWxsb2NfYnVmKHItPnBvb2wpKSkgeworICAgICAgICByZXR1cm4gTkdYX0hUVFBfU1NJX0VSUk9SOworICAgIH0KKworICAgIGlmICghKGNsID0gbmd4X2FsbG9jX2NoYWluX2xpbmsoci0+cG9vbCkpKSB7CisgICAgICAgIHJldHVybiBOR1hfSFRUUF9TU0lfRVJST1I7CisgICAgfQorCisgICAgYi0+bWVtb3J5ID0gMTsKKyAgICBiLT5wb3MgPSB2YWx1ZS0+ZGF0YTsKKyAgICBiLT5sYXN0ID0gdmFsdWUtPmRhdGEgKyB2YWx1ZS0+bGVuOworCisgICAgY2wtPmJ1ZiA9IGI7CisgICAgY2wtPm5leHQgPSBOVUxMOworICAgICpjdHgtPmxhc3Rfb3V0ID0gY2w7CisgICAgY3R4LT5sYXN0X291dCA9ICZjbC0+bmV4dDsKKwogICAgIHJldHVybiBOR1hfT0s7CiB9CiAKIAotc3RhdGljIHZvaWQgKm5neF9odHRwX3NzaV9jcmVhdGVfY29uZihuZ3hfY29uZl90ICpjZikKK3N0YXRpYyB2b2lkICoKK25neF9odHRwX3NzaV9jcmVhdGVfY29uZihuZ3hfY29uZl90ICpjZikKIHsKICAgICBuZ3hfaHR0cF9zc2lfY29uZl90ICAqY29uZjsKIApAQCAtMTAwMSwyNiArMTE0MSwzMyBAQAogICAgIH0KIAogICAgIGNvbmYtPmVuYWJsZSA9IE5HWF9DT05GX1VOU0VUOworICAgIGNvbmYtPnNpbGVudF9lcnJvcnMgPSBOR1hfQ09ORl9VTlNFVDsKKworICAgIGNvbmYtPm1pbl9maWxlX2NodW5rID0gTkdYX0NPTkZfVU5TRVRfU0laRTsKICAgICBjb25mLT52YWx1ZV9sZW4gPSBOR1hfQ09ORl9VTlNFVF9TSVpFOwogCiAgICAgcmV0dXJuIGNvbmY7CiB9CiAKIAotc3RhdGljIGNoYXIgKm5neF9odHRwX3NzaV9tZXJnZV9jb25mKG5neF9jb25mX3QgKmNmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnBhcmVudCwgdm9pZCAqY2hpbGQpCitzdGF0aWMgY2hhciAqCituZ3hfaHR0cF9zc2lfbWVyZ2VfY29uZihuZ3hfY29uZl90ICpjZiwgdm9pZCAqcGFyZW50LCB2b2lkICpjaGlsZCkKIHsKICAgICBuZ3hfaHR0cF9zc2lfY29uZl90ICpwcmV2ID0gcGFyZW50OwogICAgIG5neF9odHRwX3NzaV9jb25mX3QgKmNvbmYgPSBjaGlsZDsKIAogICAgIG5neF9jb25mX21lcmdlX3ZhbHVlKGNvbmYtPmVuYWJsZSwgcHJldi0+ZW5hYmxlLCAwKTsKKyAgICBuZ3hfY29uZl9tZXJnZV92YWx1ZShjb25mLT5zaWxlbnRfZXJyb3JzLCBwcmV2LT5zaWxlbnRfZXJyb3JzLCAwKTsKKworICAgIG5neF9jb25mX21lcmdlX3NpemVfdmFsdWUoY29uZi0+bWluX2ZpbGVfY2h1bmssIHByZXYtPm1pbl9maWxlX2NodW5rLCAxMDI0KTsKICAgICBuZ3hfY29uZl9tZXJnZV9zaXplX3ZhbHVlKGNvbmYtPnZhbHVlX2xlbiwgcHJldi0+dmFsdWVfbGVuLCAyNTYpOwogCiAgICAgcmV0dXJuIE5HWF9DT05GX09LOwogfQogCiAKLXN0YXRpYyBpbnQgbmd4X2h0dHBfc3NpX2ZpbHRlcl9pbml0KG5neF9jeWNsZV90ICpjeWNsZSkKK3N0YXRpYyBuZ3hfaW50X3QKK25neF9odHRwX3NzaV9maWx0ZXJfaW5pdChuZ3hfY3ljbGVfdCAqY3ljbGUpCiB7CiAgICAgbmd4X2h0dHBfbmV4dF9oZWFkZXJfZmlsdGVyID0gbmd4X2h0dHBfdG9wX2hlYWRlcl9maWx0ZXI7CiAgICAgbmd4X2h0dHBfdG9wX2hlYWRlcl9maWx0ZXIgPSBuZ3hfaHR0cF9zc2lfaGVhZGVyX2ZpbHRlcjsKZGlmZiAtLWdpdCBhL3NyYy9odHRwL21vZHVsZXMvcHJveHkvbmd4X2h0dHBfcHJveHlfdXBzdHJlYW0uYyBiL3NyYy9odHRwL21vZHVsZXMvcHJveHkvbmd4X2h0dHBfcHJveHlfdXBzdHJlYW0uYwppbmRleCBlMmZlMDE1Li5lMzU0MzNiIDEwMDY0NAotLS0gYS9zcmMvaHR0cC9tb2R1bGVzL3Byb3h5L25neF9odHRwX3Byb3h5X3Vwc3RyZWFtLmMKKysrIGIvc3JjL2h0dHAvbW9kdWxlcy9wcm94eS9uZ3hfaHR0cF9wcm94eV91cHN0cmVhbS5jCkBAIC0xNDUsMTAgKzE0NSwxOCBAQAogICAgIH0KIAogCi0gICAgaWYgKHAtPmxjZi0+cHJlc2VydmVfaG9zdCAmJiByLT5oZWFkZXJzX2luLmhvc3QpIHsKLSAgICAgICAgbGVuICs9IHNpemVvZihob3N0X2hlYWRlcikgLSAxCi0gICAgICAgICAgICArIHItPmhlYWRlcnNfaW4uaG9zdF9uYW1lX2xlbiArIHNpemVvZigiOiIpIC0gMSArIHVjLT5wb3J0X3RleHQubGVuCi0gICAgICAgICAgICArIHNpemVvZihDUkxGKSAtIDE7CisgICAgaWYgKHAtPmxjZi0+cHJlc2VydmVfaG9zdCkgeworICAgICAgICBpZiAoci0+aGVhZGVyc19pbi5ob3N0KSB7CisgICAgICAgICAgICBsZW4gKz0gc2l6ZW9mKGhvc3RfaGVhZGVyKSAtIDEKKyAgICAgICAgICAgICAgICArIHItPmhlYWRlcnNfaW4uaG9zdF9uYW1lX2xlbiArIHNpemVvZigiOiIpIC0gMQorICAgICAgICAgICAgICAgICsgdWMtPnBvcnRfdGV4dC5sZW4gKyBzaXplb2YoQ1JMRikgLSAxOworCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBsZW4gKz0gc2l6ZW9mKGhvc3RfaGVhZGVyKSAtIDEKKyAgICAgICAgICAgICAgICArIHItPnNlcnZlcl9uYW1lLmxlbiArIHNpemVvZigiOiIpIC0gMQorICAgICAgICAgICAgICAgICsgdWMtPnBvcnRfdGV4dC5sZW4gKyBzaXplb2YoQ1JMRikgLSAxOworICAgICAgICB9CisKICAgICB9IGVsc2UgewogICAgICAgICBsZW4gKz0gc2l6ZW9mKGhvc3RfaGVhZGVyKSAtIDEgKyB1Yy0+aG9zdF9oZWFkZXIubGVuCiAgICAgICAgICAgICArIHNpemVvZihDUkxGKSAtIDE7CkBAIC0yNzgsOSArMjg2LDE0IEBACiAKICAgICBiLT5sYXN0ID0gbmd4X2NweW1lbShiLT5sYXN0LCBob3N0X2hlYWRlciwgc2l6ZW9mKGhvc3RfaGVhZGVyKSAtIDEpOwogCi0gICAgaWYgKHAtPmxjZi0+cHJlc2VydmVfaG9zdCAmJiByLT5oZWFkZXJzX2luLmhvc3QpIHsKLSAgICAgICAgYi0+bGFzdCA9IG5neF9jcHltZW0oYi0+bGFzdCwgci0+aGVhZGVyc19pbi5ob3N0LT52YWx1ZS5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLT5oZWFkZXJzX2luLmhvc3RfbmFtZV9sZW4pOworICAgIGlmIChwLT5sY2YtPnByZXNlcnZlX2hvc3QpIHsKKyAgICAgICAgaWYgKHItPmhlYWRlcnNfaW4uaG9zdCkgeworICAgICAgICAgICAgYi0+bGFzdCA9IG5neF9jcHltZW0oYi0+bGFzdCwgci0+aGVhZGVyc19pbi5ob3N0LT52YWx1ZS5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci0+aGVhZGVyc19pbi5ob3N0X25hbWVfbGVuKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGItPmxhc3QgPSBuZ3hfY3B5bWVtKGItPmxhc3QsIHItPnNlcnZlcl9uYW1lLmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLT5zZXJ2ZXJfbmFtZS5sZW4pOworICAgICAgICB9CiAKICAgICAgICAgaWYgKCF1Yy0+ZGVmYXVsdF9wb3J0KSB7CiAgICAgICAgICAgICAqYi0+bGFzdCsrID0gJzonOwpkaWZmIC0tZ2l0IGEvc3JjL2h0dHAvbmd4X2h0dHBfbG9nX2hhbmRsZXIuYyBiL3NyYy9odHRwL25neF9odHRwX2xvZ19oYW5kbGVyLmMKaW5kZXggMTQ4MjQ2Zi4uNWEzZWZlMiAxMDA2NDQKLS0tIGEvc3JjL2h0dHAvbmd4X2h0dHBfbG9nX2hhbmRsZXIuYworKysgYi9zcmMvaHR0cC9uZ3hfaHR0cF9sb2dfaGFuZGxlci5jCkBAIC0xMSw5MyArMTEsOTEgQEAKIAogCiBzdGF0aWMgdV9jaGFyICpuZ3hfaHR0cF9sb2dfYWRkcihuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIHVfY2hhciAqYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2h0dHBfbG9nX29wX3QgKm9wKTsKKyAgICBuZ3hfaHR0cF9sb2dfb3BfdCAqb3ApOwogc3RhdGljIHVfY2hhciAqbmd4X2h0dHBfbG9nX2Nvbm5lY3Rpb24obmd4X2h0dHBfcmVxdWVzdF90ICpyLCB1X2NoYXIgKmJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5neF9odHRwX2xvZ19vcF90ICpvcCk7CisgICAgbmd4X2h0dHBfbG9nX29wX3QgKm9wKTsKIHN0YXRpYyB1X2NoYXIgKm5neF9odHRwX2xvZ19waXBlKG5neF9odHRwX3JlcXVlc3RfdCAqciwgdV9jaGFyICpidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfaHR0cF9sb2dfb3BfdCAqb3ApOworICAgIG5neF9odHRwX2xvZ19vcF90ICpvcCk7CiBzdGF0aWMgdV9jaGFyICpuZ3hfaHR0cF9sb2dfdGltZShuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIHVfY2hhciAqYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2h0dHBfbG9nX29wX3QgKm9wKTsKKyAgICBuZ3hfaHR0cF9sb2dfb3BfdCAqb3ApOwogc3RhdGljIHVfY2hhciAqbmd4X2h0dHBfbG9nX21zZWMobmd4X2h0dHBfcmVxdWVzdF90ICpyLCB1X2NoYXIgKmJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5neF9odHRwX2xvZ19vcF90ICpvcCk7CisgICAgbmd4X2h0dHBfbG9nX29wX3QgKm9wKTsKK3N0YXRpYyB1X2NoYXIgKm5neF9odHRwX2xvZ19yZXF1ZXN0X3RpbWUobmd4X2h0dHBfcmVxdWVzdF90ICpyLCB1X2NoYXIgKmJ1ZiwKKyAgICBuZ3hfaHR0cF9sb2dfb3BfdCAqb3ApOwogc3RhdGljIHVfY2hhciAqbmd4X2h0dHBfbG9nX3N0YXR1cyhuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIHVfY2hhciAqYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfaHR0cF9sb2dfb3BfdCAqb3ApOworICAgIG5neF9odHRwX2xvZ19vcF90ICpvcCk7CiBzdGF0aWMgdV9jaGFyICpuZ3hfaHR0cF9sb2dfbGVuZ3RoKG5neF9odHRwX3JlcXVlc3RfdCAqciwgdV9jaGFyICpidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5neF9odHRwX2xvZ19vcF90ICpvcCk7CisgICAgbmd4X2h0dHBfbG9nX29wX3QgKm9wKTsKIHN0YXRpYyB1X2NoYXIgKm5neF9odHRwX2xvZ19hcGFjaGVfbGVuZ3RoKG5neF9odHRwX3JlcXVlc3RfdCAqciwgdV9jaGFyICpidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfaHR0cF9sb2dfb3BfdCAqb3ApOworICAgIG5neF9odHRwX2xvZ19vcF90ICpvcCk7CiBzdGF0aWMgdV9jaGFyICpuZ3hfaHR0cF9sb2dfcmVxdWVzdF9sZW5ndGgobmd4X2h0dHBfcmVxdWVzdF90ICpyLCB1X2NoYXIgKmJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfaHR0cF9sb2dfb3BfdCAqb3ApOworICAgIG5neF9odHRwX2xvZ19vcF90ICpvcCk7CiAKIHN0YXRpYyBzaXplX3Qgbmd4X2h0dHBfbG9nX3JlcXVlc3RfZ2V0bGVuKG5neF9odHRwX3JlcXVlc3RfdCAqciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnRwdHJfdCBkYXRhKTsKKyAgICB1aW50cHRyX3QgZGF0YSk7CiBzdGF0aWMgdV9jaGFyICpuZ3hfaHR0cF9sb2dfcmVxdWVzdChuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIHVfY2hhciAqYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2h0dHBfbG9nX29wX3QgKm9wKTsKKyAgICBuZ3hfaHR0cF9sb2dfb3BfdCAqb3ApOwogCiBzdGF0aWMgbmd4X2ludF90IG5neF9odHRwX2xvZ19oZWFkZXJfaW5fY29tcGlsZShuZ3hfaHR0cF9sb2dfb3BfdCAqb3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfc3RyX3QgKnZhbHVlKTsKKyAgICBuZ3hfc3RyX3QgKnZhbHVlKTsKIHN0YXRpYyBzaXplX3Qgbmd4X2h0dHBfbG9nX2hlYWRlcl9pbl9nZXRsZW4obmd4X2h0dHBfcmVxdWVzdF90ICpyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50cHRyX3QgZGF0YSk7CisgICAgdWludHB0cl90IGRhdGEpOwogc3RhdGljIHVfY2hhciAqbmd4X2h0dHBfbG9nX2hlYWRlcl9pbihuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIHVfY2hhciAqYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfaHR0cF9sb2dfb3BfdCAqb3ApOworICAgIG5neF9odHRwX2xvZ19vcF90ICpvcCk7CiBzdGF0aWMgc2l6ZV90IG5neF9odHRwX2xvZ191bmtub3duX2hlYWRlcl9pbl9nZXRsZW4obmd4X2h0dHBfcmVxdWVzdF90ICpyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnRwdHJfdCBkYXRhKTsKKyAgICB1aW50cHRyX3QgZGF0YSk7CiBzdGF0aWMgdV9jaGFyICpuZ3hfaHR0cF9sb2dfdW5rbm93bl9oZWFkZXJfaW4obmd4X2h0dHBfcmVxdWVzdF90ICpyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5neF9odHRwX2xvZ19vcF90ICpvcCk7CisgICAgdV9jaGFyICpidWYsIG5neF9odHRwX2xvZ19vcF90ICpvcCk7CiAKIHN0YXRpYyBuZ3hfaW50X3Qgbmd4X2h0dHBfbG9nX2hlYWRlcl9vdXRfY29tcGlsZShuZ3hfaHR0cF9sb2dfb3BfdCAqb3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X3N0cl90ICp2YWx1ZSk7CisgICAgbmd4X3N0cl90ICp2YWx1ZSk7CiBzdGF0aWMgc2l6ZV90IG5neF9odHRwX2xvZ19oZWFkZXJfb3V0X2dldGxlbihuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50cHRyX3QgZGF0YSk7CisgICAgdWludHB0cl90IGRhdGEpOwogc3RhdGljIHVfY2hhciAqbmd4X2h0dHBfbG9nX2hlYWRlcl9vdXQobmd4X2h0dHBfcmVxdWVzdF90ICpyLCB1X2NoYXIgKmJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5neF9odHRwX2xvZ19vcF90ICpvcCk7CisgICAgbmd4X2h0dHBfbG9nX29wX3QgKm9wKTsKIHN0YXRpYyBzaXplX3Qgbmd4X2h0dHBfbG9nX3Vua25vd25faGVhZGVyX291dF9nZXRsZW4obmd4X2h0dHBfcmVxdWVzdF90ICpyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50cHRyX3QgZGF0YSk7CisgICAgdWludHB0cl90IGRhdGEpOwogc3RhdGljIHVfY2hhciAqbmd4X2h0dHBfbG9nX3Vua25vd25faGVhZGVyX291dChuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfaHR0cF9sb2dfb3BfdCAqb3ApOworICAgIHVfY2hhciAqYnVmLCBuZ3hfaHR0cF9sb2dfb3BfdCAqb3ApOwogCiBzdGF0aWMgdV9jaGFyICpuZ3hfaHR0cF9sb2dfY29ubmVjdGlvbl9oZWFkZXJfb3V0KG5neF9odHRwX3JlcXVlc3RfdCAqciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICpidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5neF9odHRwX2xvZ19vcF90ICpvcCk7CisgICAgdV9jaGFyICpidWYsIG5neF9odHRwX2xvZ19vcF90ICpvcCk7CiBzdGF0aWMgdV9jaGFyICpuZ3hfaHR0cF9sb2dfdHJhbnNmZXJfZW5jb2RpbmdfaGVhZGVyX291dChuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2NoYXIgKmJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5neF9odHRwX2xvZ19vcF90ICpvcCk7CisgICAgdV9jaGFyICpidWYsIG5neF9odHRwX2xvZ19vcF90ICpvcCk7CiAKIHN0YXRpYyBuZ3hfdGFibGVfZWx0X3QgKm5neF9odHRwX2xvZ191bmtub3duX2hlYWRlcihuZ3hfbGlzdF90ICpoZWFkZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5neF9zdHJfdCAqdmFsdWUpOworICAgIG5neF9zdHJfdCAqdmFsdWUpOwogCiBzdGF0aWMgbmd4X2ludF90IG5neF9odHRwX2xvZ19zZXRfZm9ybWF0cyhuZ3hfY29uZl90ICpjZik7CiBzdGF0aWMgdm9pZCAqbmd4X2h0dHBfbG9nX2NyZWF0ZV9tYWluX2NvbmYobmd4X2NvbmZfdCAqY2YpOwogc3RhdGljIHZvaWQgKm5neF9odHRwX2xvZ19jcmVhdGVfbG9jX2NvbmYobmd4X2NvbmZfdCAqY2YpOwogc3RhdGljIGNoYXIgKm5neF9odHRwX2xvZ19tZXJnZV9sb2NfY29uZihuZ3hfY29uZl90ICpjZiwgdm9pZCAqcGFyZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjaGlsZCk7CisgICAgdm9pZCAqY2hpbGQpOwogc3RhdGljIGNoYXIgKm5neF9odHRwX2xvZ19zZXRfbG9nKG5neF9jb25mX3QgKmNmLCBuZ3hfY29tbWFuZF90ICpjbWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY29uZik7CisgICAgdm9pZCAqY29uZik7CiBzdGF0aWMgY2hhciAqbmd4X2h0dHBfbG9nX3NldF9mb3JtYXQobmd4X2NvbmZfdCAqY2YsIG5neF9jb21tYW5kX3QgKmNtZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjb25mKTsKKyAgICB2b2lkICpjb25mKTsKIHN0YXRpYyBuZ3hfaW50X3Qgbmd4X2h0dHBfbG9nX3BhcnNlX2Zvcm1hdChuZ3hfY29uZl90ICpjZiwgbmd4X2FycmF5X3QgKm9wcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfc3RyX3QgKmxpbmUpOworICAgIG5neF9zdHJfdCAqbGluZSk7CiAKIAogc3RhdGljIG5neF9jb21tYW5kX3QgIG5neF9odHRwX2xvZ19jb21tYW5kc1tdID0gewogCi0gICAge25neF9zdHJpbmcoImxvZ19mb3JtYXQiKSwKLSAgICAgTkdYX0hUVFBfTUFJTl9DT05GfE5HWF9IVFRQX1NSVl9DT05GfE5HWF9IVFRQX0xPQ19DT05GfE5HWF9DT05GXzJNT1JFLAotICAgICBuZ3hfaHR0cF9sb2dfc2V0X2Zvcm1hdCwKLSAgICAgTkdYX0hUVFBfTUFJTl9DT05GX09GRlNFVCwKLSAgICAgMCwKLSAgICAgTlVMTH0sCisgICAgeyBuZ3hfc3RyaW5nKCJsb2dfZm9ybWF0IiksCisgICAgICBOR1hfSFRUUF9NQUlOX0NPTkZ8TkdYX0hUVFBfU1JWX0NPTkZ8TkdYX0hUVFBfTE9DX0NPTkZ8TkdYX0NPTkZfMk1PUkUsCisgICAgICBuZ3hfaHR0cF9sb2dfc2V0X2Zvcm1hdCwKKyAgICAgIE5HWF9IVFRQX01BSU5fQ09ORl9PRkZTRVQsCisgICAgICAwLAorICAgICAgTlVMTCB9LAogCi0gICAge25neF9zdHJpbmcoImFjY2Vzc19sb2ciKSwKLSAgICAgTkdYX0hUVFBfTUFJTl9DT05GfE5HWF9IVFRQX1NSVl9DT05GfE5HWF9IVFRQX0xPQ19DT05GfE5HWF9DT05GX1RBS0UxMiwKLSAgICAgbmd4X2h0dHBfbG9nX3NldF9sb2csCi0gICAgIE5HWF9IVFRQX0xPQ19DT05GX09GRlNFVCwKLSAgICAgMCwKLSAgICAgTlVMTH0sCisgICAgeyBuZ3hfc3RyaW5nKCJhY2Nlc3NfbG9nIiksCisgICAgICBOR1hfSFRUUF9NQUlOX0NPTkZ8TkdYX0hUVFBfU1JWX0NPTkZ8TkdYX0hUVFBfTE9DX0NPTkZ8TkdYX0NPTkZfVEFLRTEyLAorICAgICAgbmd4X2h0dHBfbG9nX3NldF9sb2csCisgICAgICBOR1hfSFRUUF9MT0NfQ09ORl9PRkZTRVQsCisgICAgICAwLAorICAgICAgTlVMTCB9LAogCi0gICAgbmd4X251bGxfY29tbWFuZAorICAgICAgbmd4X251bGxfY29tbWFuZAogfTsKIAogCkBAIC0xNDEsNiArMTM5LDggQEAKICAgICB7IG5neF9zdHJpbmcoInRpbWUiKSwgc2l6ZW9mKCIyOC9TZXAvMTk3MDoxMjowMDowMCArMDYwMCIpIC0gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgbmd4X2h0dHBfbG9nX3RpbWUgfSwKICAgICB7IG5neF9zdHJpbmcoIm1zZWMiKSwgTkdYX1RJTUVfVF9MRU4gKyA0LCBOVUxMLCBOVUxMLCBuZ3hfaHR0cF9sb2dfbXNlYyB9LAorICAgIHsgbmd4X3N0cmluZygicmVxdWVzdF90aW1lIiksIE5HWF9USU1FX1RfTEVOLCBOVUxMLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfaHR0cF9sb2dfcmVxdWVzdF90aW1lIH0sCiAgICAgeyBuZ3hfc3RyaW5nKCJzdGF0dXMiKSwgMywgTlVMTCwgTlVMTCwgbmd4X2h0dHBfbG9nX3N0YXR1cyB9LAogICAgIHsgbmd4X3N0cmluZygibGVuZ3RoIiksIE5HWF9PRkZfVF9MRU4sIE5VTEwsIE5VTEwsIG5neF9odHRwX2xvZ19sZW5ndGggfSwKICAgICB7IG5neF9zdHJpbmcoImFwYWNoZV9sZW5ndGgiKSwgTkdYX09GRl9UX0xFTiwKQEAgLTE2NCw3ICsxNjQsOCBAQAogfTsKIAogCi1uZ3hfaW50X3Qgbmd4X2h0dHBfbG9nX2hhbmRsZXIobmd4X2h0dHBfcmVxdWVzdF90ICpyKQorbmd4X2ludF90CituZ3hfaHR0cF9sb2dfaGFuZGxlcihuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIpCiB7CiAgICAgbmd4X3VpbnRfdCAgICAgICAgICAgICAgICBpLCBsOwogICAgIHVfY2hhciAgICAgICAgICAgICAgICAgICAqbGluZSwgKnA7CkBAIC0yMjgsOCArMjI5LDkgQEAKIH0KIAogCi1zdGF0aWMgdV9jaGFyICpuZ3hfaHR0cF9sb2dfY29weV9zaG9ydChuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIHVfY2hhciAqYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2h0dHBfbG9nX29wX3QgKm9wKQorc3RhdGljIHVfY2hhciAqCituZ3hfaHR0cF9sb2dfY29weV9zaG9ydChuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIHVfY2hhciAqYnVmLAorICAgIG5neF9odHRwX2xvZ19vcF90ICpvcCkKIHsKICAgICBzaXplX3QgICAgIGxlbjsKICAgICB1aW50cHRyX3QgIGRhdGE7CkBAIC0yNDYsMzAgKzI0OCwzMiBAQAogfQogCiAKLXN0YXRpYyB1X2NoYXIgKm5neF9odHRwX2xvZ19jb3B5X2xvbmcobmd4X2h0dHBfcmVxdWVzdF90ICpyLCB1X2NoYXIgKmJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2h0dHBfbG9nX29wX3QgKm9wKQorc3RhdGljIHVfY2hhciAqCituZ3hfaHR0cF9sb2dfY29weV9sb25nKG5neF9odHRwX3JlcXVlc3RfdCAqciwgdV9jaGFyICpidWYsCisgICAgbmd4X2h0dHBfbG9nX29wX3QgKm9wKQogewogICAgIHJldHVybiBuZ3hfY3B5bWVtKGJ1ZiwgKHVfY2hhciAqKSBvcC0+ZGF0YSwgb3AtPmxlbik7CiB9CiAKIAotc3RhdGljIHVfY2hhciAqbmd4X2h0dHBfbG9nX2FkZHIobmd4X2h0dHBfcmVxdWVzdF90ICpyLCB1X2NoYXIgKmJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5neF9odHRwX2xvZ19vcF90ICpvcCkKK3N0YXRpYyB1X2NoYXIgKgorbmd4X2h0dHBfbG9nX2FkZHIobmd4X2h0dHBfcmVxdWVzdF90ICpyLCB1X2NoYXIgKmJ1Ziwgbmd4X2h0dHBfbG9nX29wX3QgKm9wKQogewogICAgIHJldHVybiBuZ3hfY3B5bWVtKGJ1Ziwgci0+Y29ubmVjdGlvbi0+YWRkcl90ZXh0LmRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgci0+Y29ubmVjdGlvbi0+YWRkcl90ZXh0Lmxlbik7CiB9CiAKIAotc3RhdGljIHVfY2hhciAqbmd4X2h0dHBfbG9nX2Nvbm5lY3Rpb24obmd4X2h0dHBfcmVxdWVzdF90ICpyLCB1X2NoYXIgKmJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5neF9odHRwX2xvZ19vcF90ICpvcCkKK3N0YXRpYyB1X2NoYXIgKgorbmd4X2h0dHBfbG9nX2Nvbm5lY3Rpb24obmd4X2h0dHBfcmVxdWVzdF90ICpyLCB1X2NoYXIgKmJ1ZiwKKyAgICBuZ3hfaHR0cF9sb2dfb3BfdCAqb3ApCiB7CiAgICAgcmV0dXJuIG5neF9zcHJpbnRmKGJ1ZiwgIiV1aSIsIHItPmNvbm5lY3Rpb24tPm51bWJlcik7CiB9CiAKIAotc3RhdGljIHVfY2hhciAqbmd4X2h0dHBfbG9nX3BpcGUobmd4X2h0dHBfcmVxdWVzdF90ICpyLCB1X2NoYXIgKmJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5neF9odHRwX2xvZ19vcF90ICpvcCkKK3N0YXRpYyB1X2NoYXIgKgorbmd4X2h0dHBfbG9nX3BpcGUobmd4X2h0dHBfcmVxdWVzdF90ICpyLCB1X2NoYXIgKmJ1Ziwgbmd4X2h0dHBfbG9nX29wX3QgKm9wKQogewogICAgIGlmIChyLT5waXBlbGluZSkgewogICAgICAgICAqYnVmID0gJ3AnOwpAQCAtMjgxLDE2ICsyODUsMTYgQEAKIH0KIAogCi1zdGF0aWMgdV9jaGFyICpuZ3hfaHR0cF9sb2dfdGltZShuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIHVfY2hhciAqYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2h0dHBfbG9nX29wX3QgKm9wKQorc3RhdGljIHVfY2hhciAqCituZ3hfaHR0cF9sb2dfdGltZShuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIHVfY2hhciAqYnVmLCBuZ3hfaHR0cF9sb2dfb3BfdCAqb3ApCiB7CiAgICAgcmV0dXJuIG5neF9jcHltZW0oYnVmLCBuZ3hfY2FjaGVkX2h0dHBfbG9nX3RpbWUuZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICBuZ3hfY2FjaGVkX2h0dHBfbG9nX3RpbWUubGVuKTsKIH0KIAogCi1zdGF0aWMgdV9jaGFyICpuZ3hfaHR0cF9sb2dfbXNlYyhuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIHVfY2hhciAqYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2h0dHBfbG9nX29wX3QgKm9wKQorc3RhdGljIHVfY2hhciAqCituZ3hfaHR0cF9sb2dfbXNlYyhuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIHVfY2hhciAqYnVmLCBuZ3hfaHR0cF9sb2dfb3BfdCAqb3ApCiB7CiAgICAgc3RydWN0IHRpbWV2YWwgIHR2OwogCkBAIC0zMDAsNTEgKzMwNCw3NSBAQAogfQogCiAKLXN0YXRpYyBzaXplX3Qgbmd4X2h0dHBfbG9nX3JlcXVlc3RfZ2V0bGVuKG5neF9odHRwX3JlcXVlc3RfdCAqciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnRwdHJfdCBkYXRhKQorc3RhdGljIHVfY2hhciAqCituZ3hfaHR0cF9sb2dfcmVxdWVzdF90aW1lKG5neF9odHRwX3JlcXVlc3RfdCAqciwgdV9jaGFyICpidWYsCisgICAgbmd4X2h0dHBfbG9nX29wX3QgKm9wKQoreworICAgIHRpbWVfdCAgZWxhcHNlZDsKKworICAgIGVsYXBzZWQgPSBuZ3hfdGltZSgpIC0gci0+c3RhcnRfdGltZTsKKworICAgIHJldHVybiBuZ3hfc3ByaW50ZihidWYsICIlVCIsIGVsYXBzZWQpOworfQorCisKK3N0YXRpYyBzaXplX3QKK25neF9odHRwX2xvZ19yZXF1ZXN0X2dldGxlbihuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIHVpbnRwdHJfdCBkYXRhKQogewogICAgIHJldHVybiByLT5yZXF1ZXN0X2xpbmUubGVuOwogfQogCiAKLXN0YXRpYyB1X2NoYXIgKm5neF9odHRwX2xvZ19yZXF1ZXN0KG5neF9odHRwX3JlcXVlc3RfdCAqciwgdV9jaGFyICpidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfaHR0cF9sb2dfb3BfdCAqb3ApCitzdGF0aWMgdV9jaGFyICoKK25neF9odHRwX2xvZ19yZXF1ZXN0KG5neF9odHRwX3JlcXVlc3RfdCAqciwgdV9jaGFyICpidWYsIG5neF9odHRwX2xvZ19vcF90ICpvcCkKIHsKICAgICByZXR1cm4gbmd4X2NweW1lbShidWYsIHItPnJlcXVlc3RfbGluZS5kYXRhLCByLT5yZXF1ZXN0X2xpbmUubGVuKTsKIH0KIAogCi1zdGF0aWMgdV9jaGFyICpuZ3hfaHR0cF9sb2dfc3RhdHVzKG5neF9odHRwX3JlcXVlc3RfdCAqciwgdV9jaGFyICpidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5neF9odHRwX2xvZ19vcF90ICpvcCkKK3N0YXRpYyB1X2NoYXIgKgorbmd4X2h0dHBfbG9nX3N0YXR1cyhuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIHVfY2hhciAqYnVmLCBuZ3hfaHR0cF9sb2dfb3BfdCAqb3ApCiB7CiAgICAgcmV0dXJuIG5neF9zcHJpbnRmKGJ1ZiwgIiV1aSIsCiAgICAgICAgICAgICAgICAgICAgICAgIHItPmVycl9zdGF0dXMgPyByLT5lcnJfc3RhdHVzIDogci0+aGVhZGVyc19vdXQuc3RhdHVzKTsKIH0KIAogCi1zdGF0aWMgdV9jaGFyICpuZ3hfaHR0cF9sb2dfbGVuZ3RoKG5neF9odHRwX3JlcXVlc3RfdCAqciwgdV9jaGFyICpidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5neF9odHRwX2xvZ19vcF90ICpvcCkKK3N0YXRpYyB1X2NoYXIgKgorbmd4X2h0dHBfbG9nX2xlbmd0aChuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIHVfY2hhciAqYnVmLCBuZ3hfaHR0cF9sb2dfb3BfdCAqb3ApCiB7CiAgICAgcmV0dXJuIG5neF9zcHJpbnRmKGJ1ZiwgIiVPIiwgci0+Y29ubmVjdGlvbi0+c2VudCk7CiB9CiAKIAotc3RhdGljIHVfY2hhciAqbmd4X2h0dHBfbG9nX2FwYWNoZV9sZW5ndGgobmd4X2h0dHBfcmVxdWVzdF90ICpyLCB1X2NoYXIgKmJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5neF9odHRwX2xvZ19vcF90ICpvcCkKK3N0YXRpYyB1X2NoYXIgKgorbmd4X2h0dHBfbG9nX2FwYWNoZV9sZW5ndGgobmd4X2h0dHBfcmVxdWVzdF90ICpyLCB1X2NoYXIgKmJ1ZiwKKyAgICBuZ3hfaHR0cF9sb2dfb3BfdCAqb3ApCiB7Ci0gICAgcmV0dXJuIG5neF9zcHJpbnRmKGJ1ZiwgIiVPIiwgci0+Y29ubmVjdGlvbi0+c2VudCAtIHItPmhlYWRlcl9zaXplKTsKKyAgICBvZmZfdCAgbGVuZ3RoOworCisgICAgbGVuZ3RoID0gci0+Y29ubmVjdGlvbi0+c2VudCAtIHItPmhlYWRlcl9zaXplOworCisgICAgaWYgKGxlbmd0aCA+IDApIHsKKyAgICAgICAgcmV0dXJuIG5neF9zcHJpbnRmKGJ1ZiwgIiVPIiwgbGVuZ3RoKTsKKyAgICB9CisKKyAgICAqYnVmID0gJzAnOworCisgICAgcmV0dXJuIGJ1ZiArIDE7CiB9CiAKIAotc3RhdGljIHVfY2hhciAqbmd4X2h0dHBfbG9nX3JlcXVlc3RfbGVuZ3RoKG5neF9odHRwX3JlcXVlc3RfdCAqciwgdV9jaGFyICpidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2h0dHBfbG9nX29wX3QgKm9wKQorc3RhdGljIHVfY2hhciAqCituZ3hfaHR0cF9sb2dfcmVxdWVzdF9sZW5ndGgobmd4X2h0dHBfcmVxdWVzdF90ICpyLCB1X2NoYXIgKmJ1ZiwKKyAgICBuZ3hfaHR0cF9sb2dfb3BfdCAqb3ApCiB7CiAgICAgcmV0dXJuIG5neF9zcHJpbnRmKGJ1ZiwgIiV6Iiwgci0+cmVxdWVzdF9sZW5ndGgpOwogfQogCiAKLXN0YXRpYyBuZ3hfaW50X3Qgbmd4X2h0dHBfbG9nX2hlYWRlcl9pbl9jb21waWxlKG5neF9odHRwX2xvZ19vcF90ICpvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5neF9zdHJfdCAqdmFsdWUpCitzdGF0aWMgbmd4X2ludF90CituZ3hfaHR0cF9sb2dfaGVhZGVyX2luX2NvbXBpbGUobmd4X2h0dHBfbG9nX29wX3QgKm9wLCBuZ3hfc3RyX3QgKnZhbHVlKQogewogICAgIG5neF91aW50X3QgIGk7CiAKQEAgLTM3NSw4ICs0MDMsOCBAQAogfQogCiAKLXN0YXRpYyBzaXplX3Qgbmd4X2h0dHBfbG9nX2hlYWRlcl9pbl9nZXRsZW4obmd4X2h0dHBfcmVxdWVzdF90ICpyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50cHRyX3QgZGF0YSkKK3N0YXRpYyBzaXplX3QKK25neF9odHRwX2xvZ19oZWFkZXJfaW5fZ2V0bGVuKG5neF9odHRwX3JlcXVlc3RfdCAqciwgdWludHB0cl90IGRhdGEpCiB7CiAgICAgbmd4X3RhYmxlX2VsdF90ICAqaDsKIApAQCAtMzkwLDggKzQxOCw5IEBACiB9CiAKIAotc3RhdGljIHVfY2hhciAqbmd4X2h0dHBfbG9nX2hlYWRlcl9pbihuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIHVfY2hhciAqYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfaHR0cF9sb2dfb3BfdCAqb3ApCitzdGF0aWMgdV9jaGFyICoKK25neF9odHRwX2xvZ19oZWFkZXJfaW4obmd4X2h0dHBfcmVxdWVzdF90ICpyLCB1X2NoYXIgKmJ1ZiwKKyAgICBuZ3hfaHR0cF9sb2dfb3BfdCAqb3ApCiB7CiAgICAgbmd4X3RhYmxlX2VsdF90ICAqaDsKIApAQCAtNDA3LDggKzQzNiw4IEBACiB9CiAKIAotc3RhdGljIHNpemVfdCBuZ3hfaHR0cF9sb2dfdW5rbm93bl9oZWFkZXJfaW5fZ2V0bGVuKG5neF9odHRwX3JlcXVlc3RfdCAqciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50cHRyX3QgZGF0YSkKK3N0YXRpYyBzaXplX3QKK25neF9odHRwX2xvZ191bmtub3duX2hlYWRlcl9pbl9nZXRsZW4obmd4X2h0dHBfcmVxdWVzdF90ICpyLCB1aW50cHRyX3QgZGF0YSkKIHsKICAgICBuZ3hfdGFibGVfZWx0X3QgICpoOwogCkBAIC00MjIsOSArNDUxLDkgQEAKIH0KIAogCi1zdGF0aWMgdV9jaGFyICpuZ3hfaHR0cF9sb2dfdW5rbm93bl9oZWFkZXJfaW4obmd4X2h0dHBfcmVxdWVzdF90ICpyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5neF9odHRwX2xvZ19vcF90ICpvcCkKK3N0YXRpYyB1X2NoYXIgKgorbmd4X2h0dHBfbG9nX3Vua25vd25faGVhZGVyX2luKG5neF9odHRwX3JlcXVlc3RfdCAqciwgdV9jaGFyICpidWYsCisgICAgbmd4X2h0dHBfbG9nX29wX3QgKm9wKQogewogICAgIG5neF90YWJsZV9lbHRfdCAgKmg7CiAKQEAgLTQ0MSw4ICs0NzAsOCBAQAogfQogCiAKLXN0YXRpYyBuZ3hfaW50X3Qgbmd4X2h0dHBfbG9nX2hlYWRlcl9vdXRfY29tcGlsZShuZ3hfaHR0cF9sb2dfb3BfdCAqb3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X3N0cl90ICp2YWx1ZSkKK3N0YXRpYyBuZ3hfaW50X3QKK25neF9odHRwX2xvZ19oZWFkZXJfb3V0X2NvbXBpbGUobmd4X2h0dHBfbG9nX29wX3QgKm9wLCBuZ3hfc3RyX3QgKnZhbHVlKQogewogICAgIG5neF91aW50X3QgIGk7CiAKQEAgLTQ1NSw3ICs0ODQsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgaWYgKG5neF9zdHJuY2FzZWNtcChuZ3hfaHR0cF9oZWFkZXJzX291dFtpXS5uYW1lLmRhdGEsIHZhbHVlLT5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS0+bGVuKSA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLT5sZW4pID09IDApCiAgICAgICAgIHsKICAgICAgICAgICAgIG9wLT5nZXRsZW4gPSBuZ3hfaHR0cF9sb2dfaGVhZGVyX291dF9nZXRsZW47CiAgICAgICAgICAgICBvcC0+cnVuID0gbmd4X2h0dHBfbG9nX2hlYWRlcl9vdXQ7CkBAIC00OTMsOCArNTIyLDggQEAKIH0KIAogCi1zdGF0aWMgc2l6ZV90IG5neF9odHRwX2xvZ19oZWFkZXJfb3V0X2dldGxlbihuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50cHRyX3QgZGF0YSkKK3N0YXRpYyBzaXplX3QKK25neF9odHRwX2xvZ19oZWFkZXJfb3V0X2dldGxlbihuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIHVpbnRwdHJfdCBkYXRhKQogewogICAgIG5neF90YWJsZV9lbHRfdCAgKmg7CiAKQEAgLTU0MCw4ICs1NjksOSBAQAogfQogCiAKLXN0YXRpYyB1X2NoYXIgKm5neF9odHRwX2xvZ19oZWFkZXJfb3V0KG5neF9odHRwX3JlcXVlc3RfdCAqciwgdV9jaGFyICpidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfaHR0cF9sb2dfb3BfdCAqb3ApCitzdGF0aWMgdV9jaGFyICoKK25neF9odHRwX2xvZ19oZWFkZXJfb3V0KG5neF9odHRwX3JlcXVlc3RfdCAqciwgdV9jaGFyICpidWYsCisgICAgbmd4X2h0dHBfbG9nX29wX3QgKm9wKQogewogICAgIG5neF90YWJsZV9lbHRfdCAgKmg7CiAKQEAgLTU5NCw4ICs2MjQsOCBAQAogfQogCiAKLXN0YXRpYyBzaXplX3Qgbmd4X2h0dHBfbG9nX3Vua25vd25faGVhZGVyX291dF9nZXRsZW4obmd4X2h0dHBfcmVxdWVzdF90ICpyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50cHRyX3QgZGF0YSkKK3N0YXRpYyBzaXplX3QKK25neF9odHRwX2xvZ191bmtub3duX2hlYWRlcl9vdXRfZ2V0bGVuKG5neF9odHRwX3JlcXVlc3RfdCAqciwgdWludHB0cl90IGRhdGEpCiB7CiAgICAgbmd4X3RhYmxlX2VsdF90ICAqaDsKIApAQCAtNjEwLDkgKzY0MCw5IEBACiB9CiAKIAotc3RhdGljIHVfY2hhciAqbmd4X2h0dHBfbG9nX3Vua25vd25faGVhZGVyX291dChuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfaHR0cF9sb2dfb3BfdCAqb3ApCitzdGF0aWMgdV9jaGFyICoKK25neF9odHRwX2xvZ191bmtub3duX2hlYWRlcl9vdXQobmd4X2h0dHBfcmVxdWVzdF90ICpyLCB1X2NoYXIgKmJ1ZiwKKyAgICBuZ3hfaHR0cF9sb2dfb3BfdCAqb3ApCiB7CiAgICAgbmd4X3RhYmxlX2VsdF90ICAqaDsKIApAQCAtNjI5LDggKzY1OSw4IEBACiB9CiAKIAotc3RhdGljIG5neF90YWJsZV9lbHRfdCAqbmd4X2h0dHBfbG9nX3Vua25vd25faGVhZGVyKG5neF9saXN0X3QgKmhlYWRlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X3N0cl90ICp2YWx1ZSkKK3N0YXRpYyBuZ3hfdGFibGVfZWx0X3QgKgorbmd4X2h0dHBfbG9nX3Vua25vd25faGVhZGVyKG5neF9saXN0X3QgKmhlYWRlcnMsIG5neF9zdHJfdCAqdmFsdWUpCiB7CiAgICAgbmd4X3VpbnRfdCAgICAgICAgaTsKICAgICBuZ3hfbGlzdF9wYXJ0X3QgICpwYXJ0OwpAQCAtNjY0LDkgKzY5NCw5IEBACiB9CiAKIAotc3RhdGljIHVfY2hhciAqbmd4X2h0dHBfbG9nX2Nvbm5lY3Rpb25faGVhZGVyX291dChuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ3hfaHR0cF9sb2dfb3BfdCAqb3ApCitzdGF0aWMgdV9jaGFyICoKK25neF9odHRwX2xvZ19jb25uZWN0aW9uX2hlYWRlcl9vdXQobmd4X2h0dHBfcmVxdWVzdF90ICpyLCB1X2NoYXIgKmJ1ZiwKKyAgICBuZ3hfaHR0cF9sb2dfb3BfdCAqb3ApCiB7CiAgICAgaWYgKHItPmtlZXBhbGl2ZSkgewogICAgICAgICByZXR1cm4gbmd4X2NweW1lbShidWYsICJrZWVwLWFsaXZlIiwgc2l6ZW9mKCJrZWVwLWFsaXZlIikgLSAxKTsKQEAgLTY3Nyw5ICs3MDcsOSBAQAogfQogCiAKLXN0YXRpYyB1X2NoYXIgKm5neF9odHRwX2xvZ190cmFuc2Zlcl9lbmNvZGluZ19oZWFkZXJfb3V0KG5neF9odHRwX3JlcXVlc3RfdCAqciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X2h0dHBfbG9nX29wX3QgKm9wKQorc3RhdGljIHVfY2hhciAqCituZ3hfaHR0cF9sb2dfdHJhbnNmZXJfZW5jb2RpbmdfaGVhZGVyX291dChuZ3hfaHR0cF9yZXF1ZXN0X3QgKnIsIHVfY2hhciAqYnVmLAorICAgIG5neF9odHRwX2xvZ19vcF90ICpvcCkKIHsKICAgICBpZiAoci0+Y2h1bmtlZCkgewogICAgICAgICByZXR1cm4gbmd4X2NweW1lbShidWYsICJjaHVua2VkIiwgc2l6ZW9mKCJjaHVua2VkIikgLSAxKTsKQEAgLTY5MSw3ICs3MjEsOCBAQAogfQogCiAKLXN0YXRpYyBuZ3hfaW50X3Qgbmd4X2h0dHBfbG9nX3NldF9mb3JtYXRzKG5neF9jb25mX3QgKmNmKQorc3RhdGljIG5neF9pbnRfdAorbmd4X2h0dHBfbG9nX3NldF9mb3JtYXRzKG5neF9jb25mX3QgKmNmKQogewogICAgIG5neF9odHRwX2xvZ19vcF9uYW1lX3QgICpvcDsKIApAQCAtNzAyLDcgKzczMyw4IEBACiB9CiAKIAotc3RhdGljIHZvaWQgKm5neF9odHRwX2xvZ19jcmVhdGVfbWFpbl9jb25mKG5neF9jb25mX3QgKmNmKQorc3RhdGljIHZvaWQgKgorbmd4X2h0dHBfbG9nX2NyZWF0ZV9tYWluX2NvbmYobmd4X2NvbmZfdCAqY2YpCiB7CiAgICAgbmd4X2h0dHBfbG9nX21haW5fY29uZl90ICAqY29uZjsKIApAQCAtNzEzLDIzICs3NDUsMjYgQEAKICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOwogICAgIH0KIAotICAgIG5neF9pbml0X2FycmF5KGNvbmYtPmZvcm1hdHMsIGNmLT5wb29sLCA1LCBzaXplb2Yobmd4X2h0dHBfbG9nX2ZtdF90KSwKLSAgICAgICAgICAgICAgICAgIE5HWF9DT05GX0VSUk9SKTsKLQotICAgIGNmLT5hcmdzLT5uZWx0cyA9IDA7Ci0KLSAgICBpZiAoISh2YWx1ZSA9IG5neF9wdXNoX2FycmF5KGNmLT5hcmdzKSkpIHsKKyAgICBpZiAobmd4X2FycmF5X2luaXQoJmNvbmYtPmZvcm1hdHMsIGNmLT5wb29sLCA0LCBzaXplb2Yobmd4X2h0dHBfbG9nX2ZtdF90KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IE5HWF9FUlJPUikKKyAgICB7CiAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKICAgICB9CiAKLSAgICBpZiAoISh2YWx1ZSA9IG5neF9wdXNoX2FycmF5KGNmLT5hcmdzKSkpIHsKKyAgICBjZi0+YXJncy0+bmVsdHMgPSAwOworCisgICAgaWYgKCEodmFsdWUgPSBuZ3hfYXJyYXlfcHVzaChjZi0+YXJncykpKSB7CisgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKKyAgICB9CisKKyAgICBpZiAoISh2YWx1ZSA9IG5neF9hcnJheV9wdXNoKGNmLT5hcmdzKSkpIHsKICAgICAgICAgcmV0dXJuIE5HWF9DT05GX0VSUk9SOwogICAgIH0KIAogICAgIHZhbHVlLT5sZW4gPSBzaXplb2YoImNvbWJpbmVkIikgLSAxOwogICAgIHZhbHVlLT5kYXRhID0gKHVfY2hhciAqKSAiY29tYmluZWQiOwogCi0gICAgaWYgKCEodmFsdWUgPSBuZ3hfcHVzaF9hcnJheShjZi0+YXJncykpKSB7CisgICAgaWYgKCEodmFsdWUgPSBuZ3hfYXJyYXlfcHVzaChjZi0+YXJncykpKSB7CiAgICAgICAgIHJldHVybiBOR1hfQ09ORl9FUlJPUjsKICAgICB9CiAKQEAgLTc0NCw3ICs3NzksOCBAQAogfQogCiAKLXN0YXRpYyB2b2lkICpuZ3hfaHR0cF9sb2dfY3JlYXRlX2xvY19jb25mKG5neF9jb25mX3QgKmNmKQorc3RhdGljIHZvaWQgKgorbmd4X2h0dHBfbG9nX2NyZWF0ZV9sb2NfY29uZihuZ3hfY29uZl90ICpjZikKIHsKICAgICBuZ3hfaHR0cF9sb2dfbG9jX2NvbmZfdCAgKmNvbmY7CiAKQEAgLTc1Niw4ICs3OTIsOCBAQAogfQogCiAKLXN0YXRpYyBjaGFyICpuZ3hfaHR0cF9sb2dfbWVyZ2VfbG9jX2NvbmYobmd4X2NvbmZfdCAqY2YsIHZvaWQgKnBhcmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY2hpbGQpCitzdGF0aWMgY2hhciAqCituZ3hfaHR0cF9sb2dfbWVyZ2VfbG9jX2NvbmYobmd4X2NvbmZfdCAqY2YsIHZvaWQgKnBhcmVudCwgdm9pZCAqY2hpbGQpCiB7CiAgICAgbmd4X2h0dHBfbG9nX2xvY19jb25mX3QgKnByZXYgPSBwYXJlbnQ7CiAgICAgbmd4X2h0dHBfbG9nX2xvY19jb25mX3QgKmNvbmYgPSBjaGlsZDsKQEAgLTgwOCw4ICs4NDQsOCBAQAogfQogCiAKLXN0YXRpYyBjaGFyICpuZ3hfaHR0cF9sb2dfc2V0X2xvZyhuZ3hfY29uZl90ICpjZiwgbmd4X2NvbW1hbmRfdCAqY21kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmNvbmYpCitzdGF0aWMgY2hhciAqCituZ3hfaHR0cF9sb2dfc2V0X2xvZyhuZ3hfY29uZl90ICpjZiwgbmd4X2NvbW1hbmRfdCAqY21kLCB2b2lkICpjb25mKQogewogICAgIG5neF9odHRwX2xvZ19sb2NfY29uZl90ICpsbGNmID0gY29uZjsKIApAQCAtODY3LDggKzkwMyw4IEBACiB9CiAKIAotc3RhdGljIGNoYXIgKm5neF9odHRwX2xvZ19zZXRfZm9ybWF0KG5neF9jb25mX3QgKmNmLCBuZ3hfY29tbWFuZF90ICpjbWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY29uZikKK3N0YXRpYyBjaGFyICoKK25neF9odHRwX2xvZ19zZXRfZm9ybWF0KG5neF9jb25mX3QgKmNmLCBuZ3hfY29tbWFuZF90ICpjbWQsIHZvaWQgKmNvbmYpCiB7CiAgICAgbmd4X2h0dHBfbG9nX21haW5fY29uZl90ICpsbWNmID0gY29uZjsKIApkaWZmIC0tZ2l0IGEvc3JjL2h0dHAvbmd4X2h0dHBfcmVxdWVzdC5jIGIvc3JjL2h0dHAvbmd4X2h0dHBfcmVxdWVzdC5jCmluZGV4IGI3ZTUzZmYuLmRkMTA0ZDQgMTAwNjQ0Ci0tLSBhL3NyYy9odHRwL25neF9odHRwX3JlcXVlc3QuYworKysgYi9zcmMvaHR0cC9uZ3hfaHR0cF9yZXF1ZXN0LmMKQEAgLTQyMiw2ICs0MjIsOCBAQAogICAgIGMtPnNpbmdsZV9jb25uZWN0aW9uID0gMTsKICAgICByLT5jb25uZWN0aW9uID0gYzsKIAorICAgIHItPnN0YXJ0X3RpbWUgPSBuZ3hfdGltZSgpOworCiAgICAgci0+ZmlsZS5mZCA9IE5HWF9JTlZBTElEX0ZJTEU7CiAKICAgICByLT5oZWFkZXJzX2luLmNvbnRlbnRfbGVuZ3RoX24gPSAtMTsKZGlmZiAtLWdpdCBhL3NyYy9odHRwL25neF9odHRwX3JlcXVlc3QuaCBiL3NyYy9odHRwL25neF9odHRwX3JlcXVlc3QuaAppbmRleCA1NDJhNjg5Li4wZTdlMTA1IDEwMDY0NAotLS0gYS9zcmMvaHR0cC9uZ3hfaHR0cF9yZXF1ZXN0LmgKKysrIGIvc3JjL2h0dHAvbmd4X2h0dHBfcmVxdWVzdC5oCkBAIC0yNzUsNyArMjc1LDggQEAKIAogICAgIG5neF9odHRwX3JlcXVlc3RfYm9keV90ICAqcmVxdWVzdF9ib2R5OwogCi0gICAgdGltZV90ICAgICAgICAgICAgICAgbGluZ2VyaW5nX3RpbWU7CisgICAgdGltZV90ICAgICAgICAgICAgICAgICAgICBsaW5nZXJpbmdfdGltZTsKKyAgICB0aW1lX3QgICAgICAgICAgICAgICAgICAgIHN0YXJ0X3RpbWU7CiAKICAgICBuZ3hfdWludF90ICAgICAgICAgICBtZXRob2Q7CiAgICAgbmd4X3VpbnRfdCAgICAgICAgICAgaHR0cF92ZXJzaW9uOwpkaWZmIC0tZ2l0IGEvc3JjL29zL3VuaXgvbmd4X2F0b21pYy5oIGIvc3JjL29zL3VuaXgvbmd4X2F0b21pYy5oCmluZGV4IGQ4ODJhMDIuLmQ5MGNmNjYgMTAwNjQ0Ci0tLSBhL3NyYy9vcy91bml4L25neF9hdG9taWMuaAorKysgYi9zcmMvb3MvdW5peC9uZ3hfYXRvbWljLmgKQEAgLTM4OCw2ICszODgsNyBAQAogdHlwZWRlZiBpbnQzMl90ICBuZ3hfYXRvbWljX2ludF90OwogdHlwZWRlZiB1aW50MzJfdCAgbmd4X2F0b21pY191aW50X3Q7CiB0eXBlZGVmIHZvbGF0aWxlIG5neF9hdG9taWNfdWludF90ICBuZ3hfYXRvbWljX3Q7CisjZGVmaW5lIE5HWF9BVE9NSUNfVF9MRU4gIHNpemVvZigiLTIxNDc0ODM2NDgiKSAtIDEKIAogI2RlZmluZSBuZ3hfYXRvbWljX2luYyh4KSAgKysoKih4KSkKICNkZWZpbmUgbmd4X2F0b21pY19kZWMoeCkgIC0tKCooeCkpCmRpZmYgLS1naXQgYS9zcmMvb3MvdW5peC9uZ3hfZmlsZXMuaCBiL3NyYy9vcy91bml4L25neF9maWxlcy5oCmluZGV4IGJlOWNlYmUuLjU3ZjUzZWIgMTAwNjQ0Ci0tLSBhL3NyYy9vcy91bml4L25neF9maWxlcy5oCisrKyBiL3NyYy9vcy91bml4L25neF9maWxlcy5oCkBAIC0xOCw3ICsxOCw3IEBACiAKIAogI2RlZmluZSBuZ3hfb3Blbl9maWxlKG5hbWUsIGFjY2VzcywgY3JlYXRlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZW4oKGNvbnN0IGNoYXIgKikgbmFtZSwgYWNjZXNzfGNyZWF0ZSwgMDY0NCkKKyAgICBvcGVuKChjb25zdCBjaGFyICopIG5hbWUsIGFjY2Vzc3xjcmVhdGUsIDA2NDQpCiAjZGVmaW5lIG5neF9vcGVuX2ZpbGVfbiAgICAgICAgICAib3BlbigpIgogCiAjZGVmaW5lIE5HWF9GSUxFX1JET05MWSAgICAgICAgICBPX1JET05MWQpAQCAtNDYsMTAgKzQ2LDEwIEBACiAKIAogc3NpemVfdCBuZ3hfd3JpdGVfZmlsZShuZ3hfZmlsZV90ICpmaWxlLCB1X2NoYXIgKmJ1Ziwgc2l6ZV90IHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgIG9mZl90IG9mZnNldCk7CisgICAgb2ZmX3Qgb2Zmc2V0KTsKIAogc3NpemVfdCBuZ3hfd3JpdGVfY2hhaW5fdG9fZmlsZShuZ3hfZmlsZV90ICpmaWxlLCBuZ3hfY2hhaW5fdCAqY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZl90IG9mZnNldCwgbmd4X3Bvb2xfdCAqcG9vbCk7CisgICAgb2ZmX3Qgb2Zmc2V0LCBuZ3hfcG9vbF90ICpwb29sKTsKIAogCiAjZGVmaW5lIG5neF9yZW5hbWVfZmlsZSAgICAgICAgICByZW5hbWUKQEAgLTg2LDcgKzg2LDcgQEAKIAogCiAjZGVmaW5lIG5neF9yZWFkX2RpcihkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKGQpLT5kZSA9IHJlYWRkaXIoKGQpLT5kaXIpKSA/IE5HWF9PSyA6IE5HWF9FUlJPUikKKyAgICAoKChkKS0+ZGUgPSByZWFkZGlyKChkKS0+ZGlyKSkgPyBOR1hfT0sgOiBOR1hfRVJST1IpCiAjZGVmaW5lIG5neF9yZWFkX2Rpcl9uICAgICAgICAgICAicmVhZGRpcigpIgogCiAKQEAgLTEwNCwxMCArMTA0LDEzIEBACiAjZWxzZQogI2RlZmluZSBuZ3hfZGVfbmFtZWxlbihkaXIpICAgICAgbmd4X3N0cmxlbigoZGlyKS0+ZGUtPmRfbmFtZSkKICNlbmRpZgotI2RlZmluZSBuZ3hfZGVfaW5mbyhuYW1lLCBkaXIpICAgbHN0YXQoKGNvbnN0IGNoYXIgKikgbmFtZSwgJihkaXIpLT5pbmZvKQorI2RlZmluZSBuZ3hfZGVfaW5mbyhuYW1lLCBkaXIpICAgc3RhdCgoY29uc3QgY2hhciAqKSBuYW1lLCAmKGRpciktPmluZm8pCiAjZGVmaW5lIG5neF9kZV9pbmZvX24gICAgICAgICAgICAic3RhdCgpIgorI2RlZmluZSBuZ3hfZGVfbGlua19pbmZvKG5hbWUsIGRpcikgIGxzdGF0KChjb25zdCBjaGFyICopIG5hbWUsICYoZGlyKS0+aW5mbykKKyNkZWZpbmUgbmd4X2RlX2xpbmtfaW5mb19uICAgICAgICJsc3RhdCgpIgogI2RlZmluZSBuZ3hfZGVfaXNfZGlyKGRpcikgICAgICAgKFNfSVNESVIoKGRpciktPmluZm8uc3RfbW9kZSkpCiAjZGVmaW5lIG5neF9kZV9pc19maWxlKGRpcikgICAgICAoU19JU1JFRygoZGlyKS0+aW5mby5zdF9tb2RlKSkKKyNkZWZpbmUgbmd4X2RlX2lzX2xpbmsoZGlyKSAgICAgIChTX0lTTE5LKChkaXIpLT5pbmZvLnN0X21vZGUpKQogI2RlZmluZSBuZ3hfZGVfc2l6ZShkaXIpICAgICAgICAgKGRpciktPmluZm8uc3Rfc2l6ZQogI2RlZmluZSBuZ3hfZGVfbXRpbWUoZGlyKSAgICAgICAgKGRpciktPmluZm8uc3RfbXRpbWUKIApkaWZmIC0tZ2l0IGEvc3JjL29zL3dpbjMyL25neF9hdG9taWMuaCBiL3NyYy9vcy93aW4zMi9uZ3hfYXRvbWljLmgKaW5kZXggNzAyMmJmYS4uMDFlZjk4ZSAxMDA2NDQKLS0tIGEvc3JjL29zL3dpbjMyL25neF9hdG9taWMuaAorKysgYi9zcmMvb3Mvd2luMzIvbmd4X2F0b21pYy5oCkBAIC0xNCw4ICsxNCw5IEBACiAKICNkZWZpbmUgTkdYX0hBVkVfQVRPTUlDX09QUyAgIDEKIAotdHlwZWRlZiB1aW50MzJfdCAgbmd4X2F0b21pY19pbnRfdDsKLXR5cGVkZWYgdm9sYXRpbGUgbmd4X2F0b21pY19pbnRfdCAgbmd4X2F0b21pY190OwordHlwZWRlZiBpbnQzMl90ICBuZ3hfYXRvbWljX2ludF90OwordHlwZWRlZiB1aW50MzJfdCAgbmd4X2F0b21pY191aW50X3Q7Cit0eXBlZGVmIHZvbGF0aWxlIG5neF9hdG9taWNfdWludF90ICBuZ3hfYXRvbWljX3Q7CiAjZGVmaW5lIE5HWF9BVE9NSUNfVF9MRU4gIHNpemVvZigiLTIxNDc0ODM2NDgiKSAtIDEKIAogCmRpZmYgLS1naXQgYS9zcmMvb3Mvd2luMzIvbmd4X2ZpbGVzLmggYi9zcmMvb3Mvd2luMzIvbmd4X2ZpbGVzLmgKaW5kZXggYWYwODkyYS4uNDhiNTRiMyAxMDA2NDQKLS0tIGEvc3JjL29zL3dpbjMyL25neF9maWxlcy5oCisrKyBiL3NyYy9vcy93aW4zMi9uZ3hfZmlsZXMuaApAQCAtMjksMTEgKzI5LDExIEBACiAKIAogI2RlZmluZSBuZ3hfb3Blbl9maWxlKG5hbWUsIGFjY2VzcywgY3JlYXRlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIENyZWF0ZUZpbGUoKGNvbnN0IGNoYXIgKikgbmFtZSwgYWNjZXNzLCAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgIEZJTEVfU0hBUkVfUkVBRHxGSUxFX1NIQVJFX1dSSVRFfEZJTEVfU0hBUkVfREVMRVRFLCAgXAotICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBjcmVhdGUsIEZJTEVfRkxBR19CQUNLVVBfU0VNQU5USUNTLCBOVUxMKQorICAgIENyZWF0ZUZpbGUoKGNvbnN0IGNoYXIgKikgbmFtZSwgYWNjZXNzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgIEZJTEVfU0hBUkVfUkVBRHxGSUxFX1NIQVJFX1dSSVRFfEZJTEVfU0hBUkVfREVMRVRFLCAgICAgICAgICBcCisgICAgICAgICAgICAgICBOVUxMLCBjcmVhdGUsIEZJTEVfRkxBR19CQUNLVVBfU0VNQU5USUNTLCBOVUxMKQogLyoKLSAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgT1BFTl9FWElTVElORywgMCwgTlVMTCkKKyAgICAgICAgICAgICAgIE5VTEwsIE9QRU5fRVhJU1RJTkcsIDAsIE5VTEwpCiAqLwogI2RlZmluZSBuZ3hfb3Blbl9maWxlX24gICAgICAgICAgICAgIkNyZWF0ZUZpbGUoKSIKIApAQCAtNDksMTQgKzQ5LDE0IEBACiAKIAogI2RlZmluZSBuZ3hfb3Blbl90ZW1wZmlsZShuYW1lLCBwZXJzaXN0ZW50KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIENyZWF0ZUZpbGUoKGNvbnN0IGNoYXIgKikgbmFtZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgIEdFTkVSSUNfUkVBRHxHRU5FUklDX1dSSVRFLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICBGSUxFX1NIQVJFX1JFQUR8RklMRV9TSEFSRV9XUklURXxGSUxFX1NIQVJFX0RFTEVURSwgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgIENSRUFURV9ORVcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICBwZXJzaXN0ZW50ID8gMDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZJTEVfQVRUUklCVVRFX1RFTVBPUkFSWXxGSUxFX0ZMQUdfREVMRVRFX09OX0NMT1NFLCBcCi0gICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgIENyZWF0ZUZpbGUoKGNvbnN0IGNoYXIgKikgbmFtZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgIEdFTkVSSUNfUkVBRHxHRU5FUklDX1dSSVRFLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICBGSUxFX1NIQVJFX1JFQUR8RklMRV9TSEFSRV9XUklURXxGSUxFX1NIQVJFX0RFTEVURSwgICAgICAgICAgXAorICAgICAgICAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgIENSRUFURV9ORVcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICBwZXJzaXN0ZW50ID8gMDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgIEZJTEVfQVRUUklCVVRFX1RFTVBPUkFSWXxGSUxFX0ZMQUdfREVMRVRFX09OX0NMT1NFLCAgICAgIFwKKyAgICAgICAgICAgICAgIE5VTEwpOwogCiAjZGVmaW5lIG5neF9vcGVuX3RlbXBmaWxlX24gICAgICAgICAiQ3JlYXRlRmlsZSgpIgogCkBAIC03Miw3ICs3Miw3IEBACiAjZGVmaW5lIG5neF9yZW5hbWVfZmlsZSAgICAgICAgICAgICBNb3ZlRmlsZQogI2RlZmluZSBuZ3hfcmVuYW1lX2ZpbGVfbiAgICAgICAgICAgIk1vdmVGaWxlKCkiCiBuZ3hfaW50X3Qgbmd4X3dpbjMyX3JlbmFtZV9maWxlKG5neF9zdHJfdCAqZnJvbSwgbmd4X3N0cl90ICp0bywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmd4X3Bvb2xfdCAqcG9vbCk7CisgICAgbmd4X3Bvb2xfdCAqcG9vbCk7CiAKIAogbmd4X2ludF90IG5neF9maWxlX2luZm8odV9jaGFyICpmaWxlbmFtZSwgbmd4X2ZpbGVfaW5mb190ICpmaSk7CkBAIC04OCw3ICs4OCw3IEBACiAKIAogI2RlZmluZSBuZ3hfZmlsZV9zaXplKGZpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAoKChvZmZfdCkgKGZpKS0+bkZpbGVTaXplSGlnaCA8PCAzMikgfCAoZmkpLT5uRmlsZVNpemVMb3cpCisgICAgKCgob2ZmX3QpIChmaSktPm5GaWxlU2l6ZUhpZ2ggPDwgMzIpIHwgKGZpKS0+bkZpbGVTaXplTG93KQogCiAjZGVmaW5lIG5neF9maWxlX3VuaXEoZmkpICAgKCoobmd4X2ZpbGVfdW5pcV90ICopICYoZmkpLT5uRmlsZUluZGV4SGlnaCkKIApAQCAtMTM0LDE3ICsxMzQsMjAgQEAKICNkZWZpbmUgbmd4X2RlX25hbWVsZW4oZGlyKSAgICAgICAgIG5neF9zdHJsZW4oKGRpciktPmZkLmNGaWxlTmFtZSkKICNkZWZpbmUgbmd4X2RlX2luZm8obmFtZSwgZGlyKSAgICAgIE5HWF9PSwogI2RlZmluZSBuZ3hfZGVfaW5mb19uICAgICAgICAgICAgICAgImR1bW15KCkiCisjZGVmaW5lIG5neF9kZV9saW5rX2luZm8obmFtZSwgZGlyKSBOR1hfT0sKKyNkZWZpbmUgbmd4X2RlX2xpbmtfaW5mb19uICAgICAgICAgICJkdW1teSgpIgogI2RlZmluZSBuZ3hfZGVfaXNfZGlyKGRpcikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAoKGRpciktPmZkLmR3RmlsZUF0dHJpYnV0ZXMgJiBGSUxFX0FUVFJJQlVURV9ESVJFQ1RPUlkpCisgICAgKChkaXIpLT5mZC5kd0ZpbGVBdHRyaWJ1dGVzICYgRklMRV9BVFRSSUJVVEVfRElSRUNUT1JZKQogI2RlZmluZSBuZ3hfZGVfaXNfZmlsZShkaXIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAhKChkaXIpLT5mZC5kd0ZpbGVBdHRyaWJ1dGVzICYgRklMRV9BVFRSSUJVVEVfRElSRUNUT1JZKQorICAgICEoKGRpciktPmZkLmR3RmlsZUF0dHJpYnV0ZXMgJiBGSUxFX0FUVFJJQlVURV9ESVJFQ1RPUlkpCisjZGVmaW5lIG5neF9kZV9pc19saW5rKGRpcikgICAgICAgICAwCiAjZGVmaW5lIG5neF9kZV9zaXplKGRpcikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAoKChvZmZfdCkgKGRpciktPmZkLm5GaWxlU2l6ZUhpZ2ggPDwgMzIpIHwgKGRpciktPmZkLm5GaWxlU2l6ZUxvdykKKyAgICAoKChvZmZfdCkgKGRpciktPmZkLm5GaWxlU2l6ZUhpZ2ggPDwgMzIpIHwgKGRpciktPmZkLm5GaWxlU2l6ZUxvdykKIAogLyogMTE2NDQ0NzM2MDAwMDAwMDAwIGlzIGNvbW1lbnRlZCBpbiBzcmMvb3Mvd2luMzIvbmd4X3RpbWUuYyAqLwogCiAjZGVmaW5lIG5neF9kZV9tdGltZShkaXIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgKHRpbWVfdCkgKCgoKCh1bnNpZ25lZCBfX2ludDY0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKHRpbWVfdCkgKCgoKCh1bnNpZ25lZCBfX2ludDY0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGlyKS0+ZmQuZnRMYXN0V3JpdGVUaW1lLmR3SGlnaERhdGVUaW1lIDw8IDMyKSAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoZGlyKS0+ZmQuZnRMYXN0V3JpdGVUaW1lLmR3TG93RGF0ZVRpbWUpICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDExNjQ0NDczNjAwMDAwMDAwMCkgLyAxMDAwMDAwMCkKQEAgLTE1NSwxMCArMTU4LDEwIEBACiAjZGVmaW5lIG5neF9yZWFkX2ZpbGVfbiAgICAgICAgICAgICAiUmVhZEZpbGUoKSIKIAogc3NpemVfdCBuZ3hfd3JpdGVfZmlsZShuZ3hfZmlsZV90ICpmaWxlLCB1X2NoYXIgKmJ1Ziwgc2l6ZV90IHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgIG9mZl90IG9mZnNldCk7CisgICAgb2ZmX3Qgb2Zmc2V0KTsKIAogc3NpemVfdCBuZ3hfd3JpdGVfY2hhaW5fdG9fZmlsZShuZ3hfZmlsZV90ICpmaWxlLCBuZ3hfY2hhaW5fdCAqY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZl90IG9mZnNldCwgbmd4X3Bvb2xfdCAqcG9vbCk7CisgICAgb2ZmX3Qgb2Zmc2V0LCBuZ3hfcG9vbF90ICpwb29sKTsKIAogCiAjZW5kaWYgLyogX05HWF9GSUxFU19IX0lOQ0xVREVEXyAqLwo=