Lyogd2luZHVuaS5jIC0tIHVuaWNvZGUgc3VwcG9ydCBmb3IgdGhlIHdpbmRyZXMgcHJvZ3JhbS4KICAgQ29weXJpZ2h0IDE5OTctMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydC4KICAgUmV3cml0dGVuIGJ5IEthaSBUaWV0eiwgT25ldmlzaW9uLgoKICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgoKICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KCiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCgogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQgLSBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQogICAwMjExMC0xMzAxLCBVU0EuICAqLwoKCi8qIFRoaXMgZmlsZSBjb250YWlucyB1bmljb2RlIHN1cHBvcnQgcm91dGluZXMgZm9yIHRoZSB3aW5kcmVzCiAgIHByb2dyYW0uICBJZGVhbGx5LCB3ZSB3b3VsZCBoYXZlIGdlbmVyaWMgdW5pY29kZSBzdXBwb3J0IHdoaWNoCiAgIHdvdWxkIHdvcmsgb24gYWxsIHN5c3RlbXMuICBIb3dldmVyLCB3ZSBkb24ndC4gIEluc3RlYWQsIG9uIGEKICAgV2luZG93cyBob3N0LCB3ZSBhcmUgcHJlcGFyZWQgdG8gY2FsbCBzb21lIFdpbmRvd3Mgcm91dGluZXMuICBUaGlzCiAgIG1lYW5zIHRoYXQgd2Ugd2lsbCBnZW5lcmF0ZSBkaWZmZXJlbnQgb3V0cHV0IG9uIFdpbmRvd3MgYW5kIFVuaXgKICAgaG9zdHMsIGJ1dCB0aGF0IHNlZW1zIGJldHRlciB0aGFuIG5vdCByZWFsbHkgc3VwcG9ydGluZyB1bmljb2RlIGF0CiAgIGFsbC4gICovCgojaW5jbHVkZSAic3lzZGVwLmgiCiNpbmNsdWRlICJiZmQuaCIKI2luY2x1ZGUgImxpYmliZXJ0eS5oIiAvKiBmb3IgeHN0cmR1cCAqLwojaW5jbHVkZSAiYnVjb21tLmgiCi8qIE11c3QgYmUgaW5jbHVkZSBiZWZvcmUgd2luZG93cy5oIGFuZCB3aW5ubHMuaC4gICovCiNpZiBkZWZpbmVkIChfV0lOMzIpIHx8IGRlZmluZWQgKF9fQ1lHV0lOX18pCiNpbmNsdWRlIDx3aW5kb3dzLmg+CiNpbmNsdWRlIDx3aW5ubHMuaD4KI2VuZGlmCiNpbmNsdWRlICJ3aW5kdW5pLmgiCiNpbmNsdWRlICJzYWZlLWN0eXBlLmgiCgojaWYgSEFWRV9JQ09OVgojaW5jbHVkZSA8aWNvbnYuaD4KI2VuZGlmCgpzdGF0aWMgcmNfdWludF90eXBlIHdpbmRfV2lkZUNoYXJUb011bHRpQnl0ZSAocmNfdWludF90eXBlLCBjb25zdCB1bmljaGFyICosIGNoYXIgKiwgcmNfdWludF90eXBlKTsKc3RhdGljIHJjX3VpbnRfdHlwZSB3aW5kX011bHRpQnl0ZVRvV2lkZUNoYXIgKHJjX3VpbnRfdHlwZSwgY29uc3QgY2hhciAqLCB1bmljaGFyICosIHJjX3VpbnRfdHlwZSk7CnN0YXRpYyBpbnQgdW5pY2hhcl9pc2FzY2lpIChjb25zdCB1bmljaGFyICosIHJjX3VpbnRfdHlwZSk7CgovKiBDb252ZXJ0IGFuIEFTQ0lJIHN0cmluZyB0byBhIHVuaWNvZGUgc3RyaW5nLiAgV2UganVzdCBjb3B5IGl0LAogICBleHBhbmRpbmcgY2hhcnMgdG8gc2hvcnRzLCByYXRoZXIgdGhhbiBkb2luZyBzb21ldGhpbmcgaW50ZWxsaWdlbnQuICAqLwogCiNpZiAhZGVmaW5lZCAoX1dJTjMyKSAmJiAhZGVmaW5lZCAoX19DWUdXSU5fXykKCi8qIENvZGVwYWdlcyBtYXBwZWQuICAqLwpzdGF0aWMgbG9jYWxfaWNvbnZfbWFwIGNvZGVwYWdlc1tdID0KewogIHsgMCwgIk1TLUFOU0kiIH0sCiAgeyAxLCAiV0lORE9XUy0xMjUyIiB9LAogIHsgNDM3LCAiTVMtQU5TSSIgfSwKICB7IDczNywgIk1TLUdSRUVLIiB9LAogIHsgNzc1LCAiV0lOQkFMVFJJTSIgfSwKICB7IDg1MCwgIk1TLUFOU0kiIH0sCiAgeyA4NTIsICJNUy1FRSIgfSwKICB7IDg1NywgIk1TLVRVUksiIH0sCiAgeyA4NjIsICJDUDg2MiIgfSwKICB7IDg2NCwgIkNQODY0IiB9LAogIHsgODY2LCAiTVMtQ1lSTCIgfSwKICB7IDg3NCwgIldJTkRPV1MtODc0IiB9LAogIHsgOTMyLCAiQ1A5MzIiIH0sCiAgeyA5MzYsICJDUDkzNiIgfSwKICB7IDk0OSwgIkNQOTQ5IiB9LAogIHsgOTUwLCAiQ1A5NTAiIH0sCiAgeyAxMjUwLCAiV0lORE9XUy0xMjUwIiB9LAogIHsgMTI1MSwgIldJTkRPV1MtMTI1MSIgfSwKICB7IDEyNTIsICJXSU5ET1dTLTEyNTIiIH0sCiAgeyAxMjUzLCAiV0lORE9XUy0xMjUzIiB9LAogIHsgMTI1NCwgIldJTkRPV1MtMTI1NCIgfSwKICB7IDEyNTUsICJXSU5ET1dTLTEyNTUiIH0sCiAgeyAxMjU2LCAiV0lORE9XUy0xMjU2IiB9LAogIHsgMTI1NywgIldJTkRPV1MtMTI1NyIgfSwKICB7IDEyNTgsICJXSU5ET1dTLTEyNTgiIH0sCiAgeyBDUF9VVEY3LCAiVVRGLTciIH0sCiAgeyBDUF9VVEY4LCAiVVRGLTgiIH0sCiAgeyBDUF9VVEYxNiwgIlVURi0xNkxFIiB9LAogIHsgKHJjX3VpbnRfdHlwZSkgLTEsIE5VTEwgfQp9OwoKLyogTGFuZ3VhZ2VzIHN1cHBvcnRlZC4gICovCnN0YXRpYyBjb25zdCB3aW5kX2xhbmd1YWdlX3QgbGFuZ3VhZ2VzW10gPQp7CiAgeyAweDAwMDAsIDQzNywgMTI1MiwgIk5ldXRyYWwiLCAiTmV1dHJhbCIgfSwKICB7IDB4MDQwMSwgODY0LCAxMjU2LCAiQXJhYmljIiwgIlNhdWRpIEFyYWJpYSIgfSwgICAgeyAweDA0MDIsIDg2NiwgMTI1MSwgIkJ1bGdhcmlhbiIsICJCdWxnYXJpYSIgfSwKICB7IDB4MDQwMywgODUwLCAxMjUyLCAiQ2F0YWxhbiIsICJTcGFpbiIgfSwJICAgICAgeyAweDA0MDQsIDk1MCwgIDk1MCwgIkNoaW5lc2UiLCAiVGFpd2FuIiB9LAogIHsgMHgwNDA1LCA4NTIsIDEyNTAsICJDemVjaCIsICJDemVjaCBSZXB1YmxpYyIgfSwgICB7IDB4MDQwNiwgODUwLCAxMjUyLCAiRGFuaXNoIiwgIkRlbm1hcmsiIH0sCiAgeyAweDA0MDcsIDg1MCwgMTI1MiwgIkdlcm1hbiIsICJHZXJtYW55IiB9LAkgICAgICB7IDB4MDQwOCwgNzM3LCAxMjUzLCAiR3JlZWsiLCAiR3JlZWNlIiB9LAogIHsgMHgwNDA5LCA0MzcsIDEyNTIsICJFbmdsaXNoIiwgIlVuaXRlZCBTdGF0ZXMiIH0sICB7IDB4MDQwQSwgODUwLCAxMjUyLCAiU3BhbmlzaCAtIFRyYWRpdGlvbmFsIFNvcnQiLCAiU3BhaW4iIH0sCiAgeyAweDA0MEIsIDg1MCwgMTI1MiwgIkZpbm5pc2giLCAiRmlubGFuZCIgfSwJICAgICAgeyAweDA0MEMsIDg1MCwgMTI1MiwgIkZyZW5jaCIsICJGcmFuY2UiIH0sCiAgeyAweDA0MEQsIDg2MiwgMTI1NSwgIkhlYnJldyIsICJJc3JhZWwiIH0sCSAgICAgIHsgMHgwNDBFLCA4NTIsIDEyNTAsICJIdW5nYXJpYW4iLCAiSHVuZ2FyeSIgfSwKICB7IDB4MDQwRiwgODUwLCAxMjUyLCAiSWNlbGFuZGljIiwgIkljZWxhbmQiIH0sICAgICAgeyAweDA0MTAsIDg1MCwgMTI1MiwgIkl0YWxpYW4iLCAiSXRhbHkiIH0sCiAgeyAweDA0MTEsIDkzMiwgIDkzMiwgIkphcGFuZXNlIiwgIkphcGFuIiB9LAkgICAgICB7IDB4MDQxMiwgOTQ5LCAgOTQ5LCAiS29yZWFuIiwgIktvcmVhIChzb3V0aCkiIH0sCiAgeyAweDA0MTMsIDg1MCwgMTI1MiwgIkR1dGNoIiwgIk5ldGhlcmxhbmRzIiB9LCAgICAgIHsgMHgwNDE0LCA4NTAsIDEyNTIsICJOb3J3ZWdpYW4gKEJva23lbCkiLCAiTm9yd2F5IiB9LAogIHsgMHgwNDE1LCA4NTIsIDEyNTAsICJQb2xpc2giLCAiUG9sYW5kIiB9LAkgICAgICB7IDB4MDQxNiwgODUwLCAxMjUyLCAiUG9ydHVndWVzZSIsICJCcmF6aWwiIH0sCiAgeyAweDA0MTgsIDg1MiwgMTI1MCwgIlJvbWFuaWFuIiwgIlJvbWFuaWEiIH0sCSAgICAgIHsgMHgwNDE5LCA4NjYsIDEyNTEsICJSdXNzaWFuIiwgIlJ1c3NpYSIgfSwKICB7IDB4MDQxQSwgODUyLCAxMjUwLCAiQ3JvYXRpYW4iLCAiQ3JvYXRpYSIgfSwJICAgICAgeyAweDA0MUIsIDg1MiwgMTI1MCwgIlNsb3ZhayIsICJTbG92YWtpYSIgfSwKICB7IDB4MDQxQywgODUyLCAxMjUwLCAiQWxiYW5pYW4iLCAiQWxiYW5pYSIgfSwJICAgICAgeyAweDA0MUQsIDg1MCwgMTI1MiwgIlN3ZWRpc2giLCAiU3dlZGVuIiB9LAogIHsgMHgwNDFFLCA4NzQsICA4NzQsICJUaGFpIiwgIlRoYWlsYW5kIiB9LAkgICAgICB7IDB4MDQxRiwgODU3LCAxMjU0LCAiVHVya2lzaCIsICJUdXJrZXkiIH0sCiAgeyAweDA0MjEsIDg1MCwgMTI1MiwgIkluZG9uZXNpYW4iLCAiSW5kb25lc2lhIiB9LCAgIHsgMHgwNDIyLCA4NjYsIDEyNTEsICJVa3JhaW5pYW4iLCAiVWtyYWluZSIgfSwKICB7IDB4MDQyMywgODY2LCAxMjUxLCAiQmVsYXJ1c2lhbiIsICJCZWxhcnVzIiB9LCAgICAgeyAweDA0MjQsIDg1MiwgMTI1MCwgIlNsb3ZlbmUiLCAiU2xvdmVuaWEiIH0sCiAgeyAweDA0MjUsIDc3NSwgMTI1NywgIkVzdG9uaWFuIiwgIkVzdG9uaWEiIH0sCSAgICAgIHsgMHgwNDI2LCA3NzUsIDEyNTcsICJMYXR2aWFuIiwgIkxhdHZpYSIgfSwKICB7IDB4MDQyNywgNzc1LCAxMjU3LCAiTGl0aHVhbmlhbiIsICJMaXRodWFuaWEiIH0sCiAgeyAweDA0MjksIDg2NCwgMTI1NiwgIkFyYWJpYyIsICJGYXJzaSIgfSwJICAgICAgeyAweDA0MkEsMTI1OCwgMTI1OCwgIlZpZXRuYW1lc2UiLCAiVmlldG5hbSIgfSwKICB7IDB4MDQyRCwgODUwLCAxMjUyLCAiQmFzcXVlIiwgIlNwYWluIiB9LAogIHsgMHgwNDJGLCA4NjYsIDEyNTEsICJNYWNlZG9uaWFuIiwgIkZvcm1lciBZdWdvc2xhdiBSZXB1YmxpYyBvZiBNYWNlZG9uaWEiIH0sCiAgeyAweDA0MzYsIDg1MCwgMTI1MiwgIkFmcmlrYWFucyIsICJTb3V0aCBBZnJpY2EiIH0sCiAgeyAweDA0MzgsIDg1MCwgMTI1MiwgIkZhcm9lc2UiLCAiRmFyb2UgSXNsYW5kcyIgfSwKICB7IDB4MDQzQywgNDM3LCAxMjUyLCAiSXJpc2giLCAiSXJlbGFuZCIgfSwKICB7IDB4MDQzRSwgODUwLCAxMjUyLCAiTWFsYXkiLCAiTWFsYXlzaWEiIH0sCiAgeyAweDA4MDEsIDg2NCwgMTI1NiwgIkFyYWJpYyIsICJJcmFxIiB9LAogIHsgMHgwODA0LCA5MzYsICA5MzYsICJDaGluZXNlIChQZW9wbGUncyByZXB1YmxpYyBvZiBDaGluYSkiLCAiUGVvcGxlJ3MgcmVwdWJsaWMgb2YgQ2hpbmEiIH0sCiAgeyAweDA4MDcsIDg1MCwgMTI1MiwgIkdlcm1hbiIsICJTd2l0emVybGFuZCIgfSwKICB7IDB4MDgwOSwgODUwLCAxMjUyLCAiRW5nbGlzaCIsICJVbml0ZWQgS2luZ2RvbSIgfSwgeyAweDA4MEEsIDg1MCwgMTI1MiwgIlNwYW5pc2giLCAiTWV4aWNvIiB9LAogIHsgMHgwODBDLCA4NTAsIDEyNTIsICJGcmVuY2giLCAiQmVsZ2l1bSIgfSwKICB7IDB4MDgxMCwgODUwLCAxMjUyLCAiSXRhbGlhbiIsICJTd2l0emVybGFuZCIgfSwKICB7IDB4MDgxMywgODUwLCAxMjUyLCAiRHV0Y2giLCAiQmVsZ2l1bSIgfSwJICAgICAgeyAweDA4MTQsIDg1MCwgMTI1MiwgIk5vcndlZ2lhbiAoTnlub3JzaykiLCAiTm9yd2F5IiB9LAogIHsgMHgwODE2LCA4NTAsIDEyNTIsICJQb3J0dWd1ZXNlIiwgIlBvcnR1Z2FsIiB9LAogIHsgMHgwODFBLCA4NTIsIDEyNTIsICJTZXJiaWFuIChsYXRpbikiLCAiWXVnb3NsYXZpYSIgfSwKICB7IDB4MDgxRCwgODUwLCAxMjUyLCAiU3dlZGlzaCAoRmlubGFuZCkiLCAiRmlubGFuZCIgfSwKICB7IDB4MEMwMSwgODY0LCAxMjU2LCAiQXJhYmljIiwgIkVneXB0IiB9LAogIHsgMHgwQzA0LCA5NTAsICA5NTAsICJDaGluZXNlIiwgIkhvbmcgS29uZyIgfSwKICB7IDB4MEMwNywgODUwLCAxMjUyLCAiR2VybWFuIiwgIkF1c3RyaWEiIH0sCiAgeyAweDBDMDksIDg1MCwgMTI1MiwgIkVuZ2xpc2giLCAiQXVzdHJhbGlhIiB9LCAgICAgIHsgMHgwQzBBLCA4NTAsIDEyNTIsICJTcGFuaXNoIC0gSW50ZXJuYXRpb25hbCBTb3J0IiwgIlNwYWluIiB9LAogIHsgMHgwQzBDLCA4NTAsIDEyNTIsICJGcmVuY2giLCAiQ2FuYWRhIn0sCiAgeyAweDBDMUEsIDg1NSwgMTI1MSwgIlNlcmJpYW4gKEN5cmlsbGljKSIsICJTZXJiaWEiIH0sCiAgeyAweDEwMDEsIDg2NCwgMTI1NiwgIkFyYWJpYyIsICJMaWJ5YSIgfSwKICB7IDB4MTAwNCwgOTM2LCAgOTM2LCAiQ2hpbmVzZSIsICJTaW5nYXBvcmUiIH0sCiAgeyAweDEwMDcsIDg1MCwgMTI1MiwgIkdlcm1hbiIsICJMdXhlbWJvdXJnIiB9LAogIHsgMHgxMDA5LCA4NTAsIDEyNTIsICJFbmdsaXNoIiwgIkNhbmFkYSIgfSwKICB7IDB4MTAwQSwgODUwLCAxMjUyLCAiU3BhbmlzaCIsICJHdWF0ZW1hbGEiIH0sCiAgeyAweDEwMEMsIDg1MCwgMTI1MiwgIkZyZW5jaCIsICJTd2l0emVybGFuZCIgfSwKICB7IDB4MTQwMSwgODY0LCAxMjU2LCAiQXJhYmljIiwgIkFsZ2VyaWEiIH0sCiAgeyAweDE0MDcsIDg1MCwgMTI1MiwgIkdlcm1hbiIsICJMaWVjaHRlbnN0ZWluIiB9LAogIHsgMHgxNDA5LCA4NTAsIDEyNTIsICJFbmdsaXNoIiwgIk5ldyBaZWFsYW5kIiB9LCAgICB7IDB4MTQwQSwgODUwLCAxMjUyLCAiU3BhbmlzaCIsICJDb3N0YSBSaWNhIiB9LAogIHsgMHgxNDBDLCA4NTAsIDEyNTIsICJGcmVuY2giLCAiTHV4ZW1ib3VyZyIgfSwKICB7IDB4MTgwMSwgODY0LCAxMjU2LCAiQXJhYmljIiwgIk1vcm9jY28iIH0sCiAgeyAweDE4MDksIDg1MCwgMTI1MiwgIkVuZ2xpc2giLCAiSXJlbGFuZCIgfSwJICAgICAgeyAweDE4MEEsIDg1MCwgMTI1MiwgIlNwYW5pc2giLCAiUGFuYW1hIiB9LAogIHsgMHgxODBDLCA4NTAsIDEyNTIsICJGcmVuY2giLCAiTW9uYWNvIiB9LAogIHsgMHgxQzAxLCA4NjQsIDEyNTYsICJBcmFiaWMiLCAiVHVuaXNpYSIgfSwKICB7IDB4MUMwOSwgNDM3LCAxMjUyLCAiRW5nbGlzaCIsICJTb3V0aCBBZnJpY2EiIH0sICAgeyAweDFDMEEsIDg1MCwgMTI1MiwgIlNwYW5pc2giLCAiRG9taW5pY2FuIFJlcHVibGljIiB9LAogIHsgMHgyMDAxLCA4NjQsIDEyNTYsICJBcmFiaWMiLCAiT21hbiIgfSwKICB7IDB4MjAwOSwgODUwLCAxMjUyLCAiRW5nbGlzaCIsICJKYW1haWNhIiB9LAkgICAgICB7IDB4MjAwQSwgODUwLCAxMjUyLCAiU3BhbmlzaCIsICJWZW5lenVlbGEiIH0sCiAgeyAweDI0MDEsIDg2NCwgMTI1NiwgIkFyYWJpYyIsICJZZW1lbiIgfSwKICB7IDB4MjQwOSwgODUwLCAxMjUyLCAiRW5nbGlzaCIsICJDYXJpYmJlYW4iIH0sICAgICAgeyAweDI0MEEsIDg1MCwgMTI1MiwgIlNwYW5pc2giLCAiQ29sb21iaWEiIH0sCiAgeyAweDI4MDEsIDg2NCwgMTI1NiwgIkFyYWJpYyIsICJTeXJpYSIgfSwKICB7IDB4MjgwOSwgODUwLCAxMjUyLCAiRW5nbGlzaCIsICJCZWxpemUiIH0sCSAgICAgIHsgMHgyODBBLCA4NTAsIDEyNTIsICJTcGFuaXNoIiwgIlBlcnUiIH0sCiAgeyAweDJDMDEsIDg2NCwgMTI1NiwgIkFyYWJpYyIsICJKb3JkYW4iIH0sCiAgeyAweDJDMDksIDQzNywgMTI1MiwgIkVuZ2xpc2giLCAiVHJpbmlkYWQgJiBUb2JhZ28iIH0seyAweDJDMEEsIDg1MCwgMTI1MiwgIlNwYW5pc2giLCAiQXJnZW50aW5hIiB9LAogIHsgMHgzMDAxLCA4NjQsIDEyNTYsICJBcmFiaWMiLCAiTGViYW5vbiIgfSwKICB7IDB4MzAwOSwgNDM3LCAxMjUyLCAiRW5nbGlzaCIsICJaaW1iYWJ3ZSIgfSwJICAgICAgeyAweDMwMEEsIDg1MCwgMTI1MiwgIlNwYW5pc2giLCAiRWN1YWRvciIgfSwKICB7IDB4MzQwMSwgODY0LCAxMjU2LCAiQXJhYmljIiwgIkt1d2FpdCIgfSwKICB7IDB4MzQwOSwgNDM3LCAxMjUyLCAiRW5nbGlzaCIsICJQaGlsaXBwaW5lcyIgfSwgICAgeyAweDM0MEEsIDg1MCwgMTI1MiwgIlNwYW5pc2giLCAiQ2hpbGUiIH0sCiAgeyAweDM4MDEsIDg2NCwgMTI1NiwgIkFyYWJpYyIsICJVbml0ZWQgQXJhYiBFbWlyYXRlcyIgfSwKICB7IDB4MzgwQSwgODUwLCAxMjUyLCAiU3BhbmlzaCIsICJVcnVndWF5IiB9LAogIHsgMHgzQzAxLCA4NjQsIDEyNTYsICJBcmFiaWMiLCAiQmFocmFpbiIgfSwKICB7IDB4M0MwQSwgODUwLCAxMjUyLCAiU3BhbmlzaCIsICJQYXJhZ3VheSIgfSwKICB7IDB4NDAwMSwgODY0LCAxMjU2LCAiQXJhYmljIiwgIlFhdGFyIiB9LAogIHsgMHg0MDBBLCA4NTAsIDEyNTIsICJTcGFuaXNoIiwgIkJvbGl2aWEiIH0sCiAgeyAweDQ0MEEsIDg1MCwgMTI1MiwgIlNwYW5pc2giLCAiRWwgU2FsdmFkb3IiIH0sCiAgeyAweDQ4MEEsIDg1MCwgMTI1MiwgIlNwYW5pc2giLCAiSG9uZHVyYXMiIH0sCiAgeyAweDRDMEEsIDg1MCwgMTI1MiwgIlNwYW5pc2giLCAiTmljYXJhZ3VhIiB9LAogIHsgMHg1MDBBLCA4NTAsIDEyNTIsICJTcGFuaXNoIiwgIlB1ZXJ0byBSaWNvIiB9LAogIHsgKHVuc2lnbmVkKSAtMSwgIDAsICAgICAgMCwgTlVMTCwgTlVMTCB9Cn07CgojZW5kaWYKCi8qIFNwZWNpZmllcyB0aGUgZGVmYXVsdCBjb2RlcGFnZSB0byBiZSB1c2VkIGZvciB1bmljb2RlCiAgIHRyYW5zZm9ybWF0aW9ucy4gIEJ5IGRlZmF1bHQgdGhpcyBpcyBDUF9BQ1AuICAqLwpyY191aW50X3R5cGUgd2luZF9kZWZhdWx0X2NvZGVwYWdlID0gQ1BfQUNQOwoKLyogU3BlY2lmaWVzIHRoZSBjdXJyZW50bHkgdXNlZCBjb2RlcGFnZSBmb3IgdW5pY29kZQogICB0cmFuc2Zvcm1hdGlvbnMuICBCeSBkZWZhdWx0IHRoaXMgaXMgQ1BfQUNQLiAgKi8KcmNfdWludF90eXBlIHdpbmRfY3VycmVudF9jb2RlcGFnZSA9IENQX0FDUDsKCi8qIENvbnZlcnQgYW4gQVNDSUkgc3RyaW5nIHRvIGEgdW5pY29kZSBzdHJpbmcuICBXZSBqdXN0IGNvcHkgaXQsCiAgIGV4cGFuZGluZyBjaGFycyB0byBzaG9ydHMsIHJhdGhlciB0aGFuIGRvaW5nIHNvbWV0aGluZyBpbnRlbGxpZ2VudC4gICovCgp2b2lkCnVuaWNvZGVfZnJvbV9hc2NpaSAocmNfdWludF90eXBlICpsZW5ndGgsIHVuaWNoYXIgKip1bmljb2RlLCBjb25zdCBjaGFyICphc2NpaSkKewogIHVuaWNvZGVfZnJvbV9jb2RlcGFnZSAobGVuZ3RoLCB1bmljb2RlLCBhc2NpaSwgd2luZF9jdXJyZW50X2NvZGVwYWdlKTsKfQoKLyogQ29udmVydCBhbiBBU0NJSSBzdHJpbmcgd2l0aCBsZW5ndGggQV9MRU5HVEggdG8gYSB1bmljb2RlIHN0cmluZy4gIFdlIGp1c3QKICAgY29weSBpdCwgZXhwYW5kaW5nIGNoYXJzIHRvIHNob3J0cywgcmF0aGVyIHRoYW4gZG9pbmcgc29tZXRoaW5nIGludGVsbGlnZW50LgogICBUaGlzIHJvdXRpbmUgY29udmVydHMgYWxzbyBcMCB3aXRoaW4gYSBzdHJpbmcuICAqLwoKdm9pZAp1bmljb2RlX2Zyb21fYXNjaWlfbGVuIChyY191aW50X3R5cGUgKmxlbmd0aCwgdW5pY2hhciAqKnVuaWNvZGUsIGNvbnN0IGNoYXIgKmFzY2lpLCByY191aW50X3R5cGUgYV9sZW5ndGgpCnsKICBjaGFyICp0bXAsICpwOwogIHJjX3VpbnRfdHlwZSB0bGVuLCBlbGVuLCBpZHggPSAwOwoKICAqdW5pY29kZSA9IE5VTEw7CgogIGlmICghYV9sZW5ndGgpCiAgICB7CiAgICAgIGlmIChsZW5ndGgpCiAgICAgICAgKmxlbmd0aCA9IDA7CiAgICAgIHJldHVybjsKICAgIH0KCiAgLyogTWFrZSBzdXJlIHdlIGhhdmUgemVybyB0ZXJtaW5hdGVkIHN0cmluZy4gICovCiAgcCA9IHRtcCA9IChjaGFyICopIGFsbG9jYSAoYV9sZW5ndGggKyAxKTsKICBtZW1jcHkgKHRtcCwgYXNjaWksIGFfbGVuZ3RoKTsKICB0bXBbYV9sZW5ndGhdID0gMDsKCiAgd2hpbGUgKGFfbGVuZ3RoID4gMCkKICAgIHsKICAgICAgdW5pY2hhciAqdXRtcCwgKnVwOwoKICAgICAgdGxlbiA9IHN0cmxlbiAocCk7CgogICAgICBpZiAodGxlbiA+IGFfbGVuZ3RoKQogICAgICAgIHRsZW4gPSBhX2xlbmd0aDsKICAgICAgaWYgKCpwID09IDApCiAgICAgICAgewoJICAvKiBNYWtlIHJvb20gZm9yIG9uZSBtb3JlIGNoYXJhY3Rlci4gICovCgkgIHV0bXAgPSAodW5pY2hhciAqKSByZXNfYWxsb2MgKHNpemVvZiAodW5pY2hhcikgKiAoaWR4ICsgMSkpOwoJICBpZiAoaWR4ID4gMCkKCSAgICB7CgkgICAgICBtZW1jcHkgKHV0bXAsICp1bmljb2RlLCBpZHggKiBzaXplb2YgKHVuaWNoYXIpKTsKCSAgICB9CgkgICp1bmljb2RlID0gdXRtcDsKCSAgdXRtcFtpZHgrK10gPSAwOwoJICAtLWFfbGVuZ3RoOwoJICBwKys7CgkgIGNvbnRpbnVlOwoJfQogICAgICB1dG1wID0gTlVMTDsKICAgICAgZWxlbiA9IDA7CiAgICAgIGVsZW4gPSB3aW5kX011bHRpQnl0ZVRvV2lkZUNoYXIgKHdpbmRfY3VycmVudF9jb2RlcGFnZSwgcCwgTlVMTCwgMCk7CiAgICAgIGlmIChlbGVuKQoJewoJICB1dG1wID0gKCh1bmljaGFyICopIHJlc19hbGxvYyAoZWxlbiArIHNpemVvZiAodW5pY2hhcikgKiAyKSk7CgkgIHdpbmRfTXVsdGlCeXRlVG9XaWRlQ2hhciAod2luZF9jdXJyZW50X2NvZGVwYWdlLCBwLCB1dG1wLCBlbGVuKTsKCSAgZWxlbiAvPSBzaXplb2YgKHVuaWNoYXIpOwoJICBlbGVuIC0tOwoJfQogICAgICBlbHNlCiAgICAgICAgewoJICAvKiBNYWtlIHJvb20gZm9yIG9uZSBtb3JlIGNoYXJhY3Rlci4gICovCgkgIHV0bXAgPSAodW5pY2hhciAqKSByZXNfYWxsb2MgKHNpemVvZiAodW5pY2hhcikgKiAoaWR4ICsgMSkpOwoJICBpZiAoaWR4ID4gMCkKCSAgICB7CgkgICAgICBtZW1jcHkgKHV0bXAsICp1bmljb2RlLCBpZHggKiBzaXplb2YgKHVuaWNoYXIpKTsKCSAgICB9CgkgICp1bmljb2RlID0gdXRtcDsKCSAgdXRtcFtpZHgrK10gPSAoKHVuaWNoYXIpICpwKSAmIDB4ZmY7CgkgIC0tYV9sZW5ndGg7CgkgIHArKzsKCSAgY29udGludWU7Cgl9CiAgICAgIHAgKz0gdGxlbjsKICAgICAgYV9sZW5ndGggLT0gdGxlbjsKCiAgICAgIHVwID0gKHVuaWNoYXIgKikgcmVzX2FsbG9jIChzaXplb2YgKHVuaWNoYXIpICogKGlkeCArIGVsZW4pKTsKICAgICAgaWYgKGlkeCA+IDApCgltZW1jcHkgKHVwLCAqdW5pY29kZSwgaWR4ICogc2l6ZW9mICh1bmljaGFyKSk7CgogICAgICAqdW5pY29kZSA9IHVwOwogICAgICBpZiAoZWxlbikKCW1lbWNweSAoJnVwW2lkeF0sIHV0bXAsIHNpemVvZiAodW5pY2hhcikgKiBlbGVuKTsKCiAgICAgIGlkeCArPSBlbGVuOwogICAgfQoKICBpZiAobGVuZ3RoKQogICAgKmxlbmd0aCA9IGlkeDsKfQoKLyogQ29udmVydCBhbiB1bmljb2RlIHN0cmluZyB0byBhbiBBU0NJSSBzdHJpbmcuICBXZSBqdXN0IGNvcHkgaXQsCiAgIHNocmluayBzaG9ydHMgdG8gY2hhcnMsIHJhdGhlciB0aGFuIGRvaW5nIHNvbWV0aGluZyBpbnRlbGxpZ2VudC4KICAgU2hvcnRzIHdpdGggbm90IHdpdGhpbiB0aGUgY2hhciByYW5nZSBhcmUgcmVwbGFjZWQgYnkgJ18nLiAgKi8KCnZvaWQKYXNjaWlfZnJvbV91bmljb2RlIChyY191aW50X3R5cGUgKmxlbmd0aCwgY29uc3QgdW5pY2hhciAqdW5pY29kZSwgY2hhciAqKmFzY2lpKQp7CiAgY29kZXBhZ2VfZnJvbV91bmljb2RlIChsZW5ndGgsIHVuaWNvZGUsIGFzY2lpLCB3aW5kX2N1cnJlbnRfY29kZXBhZ2UpOwp9CgovKiBQcmludCB0aGUgdW5pY29kZSBzdHJpbmcgVU5JQ09ERSB0byB0aGUgZmlsZSBFLiAgTEVOR1RIIGlzIHRoZQogICBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBwcmludCwgb3IgLTEgaWYgd2Ugc2hvdWxkIHByaW50IHVudGlsIHRoZQogICBlbmQgb2YgdGhlIHN0cmluZy4gIEZJWE1FOiBPbiBhIFdpbmRvd3MgaG9zdCwgd2Ugc2hvdWxkIGJlIGNhbGxpbmcKICAgc29tZSBXaW5kb3dzIGZ1bmN0aW9uLCBwcm9iYWJseSBXaWRlQ2hhclRvTXVsdGlCeXRlLiAgKi8KCnZvaWQKdW5pY29kZV9wcmludCAoRklMRSAqZSwgY29uc3QgdW5pY2hhciAqdW5pY29kZSwgcmNfdWludF90eXBlIGxlbmd0aCkKewogIHdoaWxlICgxKQogICAgewogICAgICB1bmljaGFyIGNoOwoKICAgICAgaWYgKGxlbmd0aCA9PSAwKQoJcmV0dXJuOwogICAgICBpZiAoKGJmZF9zaWduZWRfdm1hKSBsZW5ndGggPiAwKQoJLS1sZW5ndGg7CgogICAgICBjaCA9ICp1bmljb2RlOwoKICAgICAgaWYgKGNoID09IDAgJiYgKGJmZF9zaWduZWRfdm1hKSBsZW5ndGggPCAwKQoJcmV0dXJuOwoKICAgICAgKyt1bmljb2RlOwoKICAgICAgaWYgKChjaCAmIDB4N2YpID09IGNoKQoJewoJICBpZiAoY2ggPT0gJ1xcJykKCSAgICBmcHV0cyAoIlxcXFwiLCBlKTsKCSAgZWxzZSBpZiAoY2ggPT0gJyInKQoJICAgIGZwdXRzICgiXCJcIiIsIGUpOwoJICBlbHNlIGlmIChJU1BSSU5UIChjaCkpCgkgICAgcHV0YyAoY2gsIGUpOwoJICBlbHNlCgkgICAgewoJICAgICAgc3dpdGNoIChjaCkKCQl7CgkJY2FzZSBFU0NBUEVfQToKCQkgIGZwdXRzICgiXFxhIiwgZSk7CgkJICBicmVhazsKCgkJY2FzZSBFU0NBUEVfQjoKCQkgIGZwdXRzICgiXFxiIiwgZSk7CgkJICBicmVhazsKCgkJY2FzZSBFU0NBUEVfRjoKCQkgIGZwdXRzICgiXFxmIiwgZSk7CgkJICBicmVhazsKCgkJY2FzZSBFU0NBUEVfTjoKCQkgIGZwdXRzICgiXFxuIiwgZSk7CgkJICBicmVhazsKCgkJY2FzZSBFU0NBUEVfUjoKCQkgIGZwdXRzICgiXFxyIiwgZSk7CgkJICBicmVhazsKCgkJY2FzZSBFU0NBUEVfVDoKCQkgIGZwdXRzICgiXFx0IiwgZSk7CgkJICBicmVhazsKCgkJY2FzZSBFU0NBUEVfVjoKCQkgIGZwdXRzICgiXFx2IiwgZSk7CgkJICBicmVhazsKCgkJZGVmYXVsdDoKCQkgIGZwcmludGYgKGUsICJcXCUwM28iLCAodW5zaWduZWQgaW50KSBjaCk7CgkJICBicmVhazsKCQl9CgkgICAgfQoJfQogICAgICBlbHNlIGlmICgoY2ggJiAweGZmKSA9PSBjaCkKCWZwcmludGYgKGUsICJcXCUwM28iLCAodW5zaWduZWQgaW50KSBjaCk7CiAgICAgIGVsc2UKCWZwcmludGYgKGUsICJcXHglMDR4IiwgKHVuc2lnbmVkIGludCkgY2gpOwogICAgfQp9CgovKiBQcmludCBhIHVuaWNvZGUgc3RyaW5nIHRvIGEgZmlsZS4gICovCgp2b2lkCmFzY2lpX3ByaW50IChGSUxFICplLCBjb25zdCBjaGFyICpzLCByY191aW50X3R5cGUgbGVuZ3RoKQp7CiAgd2hpbGUgKDEpCiAgICB7CiAgICAgIGNoYXIgY2g7CgogICAgICBpZiAobGVuZ3RoID09IDApCglyZXR1cm47CiAgICAgIGlmICgoYmZkX3NpZ25lZF92bWEpIGxlbmd0aCA+IDApCgktLWxlbmd0aDsKCiAgICAgIGNoID0gKnM7CgogICAgICBpZiAoY2ggPT0gMCAmJiAoYmZkX3NpZ25lZF92bWEpIGxlbmd0aCA8IDApCglyZXR1cm47CgogICAgICArK3M7CgogICAgICBpZiAoKGNoICYgMHg3ZikgPT0gY2gpCgl7CgkgIGlmIChjaCA9PSAnXFwnKQoJICAgIGZwdXRzICgiXFxcXCIsIGUpOwoJICBlbHNlIGlmIChjaCA9PSAnIicpCgkgICAgZnB1dHMgKCJcIlwiIiwgZSk7CgkgIGVsc2UgaWYgKElTUFJJTlQgKGNoKSkKCSAgICBwdXRjIChjaCwgZSk7CgkgIGVsc2UKCSAgICB7CgkgICAgICBzd2l0Y2ggKGNoKQoJCXsKCQljYXNlIEVTQ0FQRV9BOgoJCSAgZnB1dHMgKCJcXGEiLCBlKTsKCQkgIGJyZWFrOwoKCQljYXNlIEVTQ0FQRV9COgoJCSAgZnB1dHMgKCJcXGIiLCBlKTsKCQkgIGJyZWFrOwoKCQljYXNlIEVTQ0FQRV9GOgoJCSAgZnB1dHMgKCJcXGYiLCBlKTsKCQkgIGJyZWFrOwoKCQljYXNlIEVTQ0FQRV9OOgoJCSAgZnB1dHMgKCJcXG4iLCBlKTsKCQkgIGJyZWFrOwoKCQljYXNlIEVTQ0FQRV9SOgoJCSAgZnB1dHMgKCJcXHIiLCBlKTsKCQkgIGJyZWFrOwoKCQljYXNlIEVTQ0FQRV9UOgoJCSAgZnB1dHMgKCJcXHQiLCBlKTsKCQkgIGJyZWFrOwoKCQljYXNlIEVTQ0FQRV9WOgoJCSAgZnB1dHMgKCJcXHYiLCBlKTsKCQkgIGJyZWFrOwoKCQlkZWZhdWx0OgoJCSAgZnByaW50ZiAoZSwgIlxcJTAzbyIsICh1bnNpZ25lZCBpbnQpIGNoKTsKCQkgIGJyZWFrOwoJCX0KCSAgICB9Cgl9CiAgICAgIGVsc2UKCWZwcmludGYgKGUsICJcXCUwM28iLCAodW5zaWduZWQgaW50KSBjaCAmIDB4ZmYpOwogICAgfQp9CgpyY191aW50X3R5cGUKdW5pY2hhcl9sZW4gKGNvbnN0IHVuaWNoYXIgKnVuaWNvZGUpCnsKICByY191aW50X3R5cGUgciA9IDA7CgogIGlmICh1bmljb2RlKQogICAgd2hpbGUgKHVuaWNvZGVbcl0gIT0gMCkKICAgICAgcisrOwogIGVsc2UKICAgIC0tcjsKICByZXR1cm4gcjsKfQoKdW5pY2hhciAqCnVuaWNoYXJfZHVwIChjb25zdCB1bmljaGFyICp1bmljb2RlKQp7CiAgdW5pY2hhciAqcjsKICBpbnQgbGVuOwoKICBpZiAoISB1bmljb2RlKQogICAgcmV0dXJuIE5VTEw7CiAgZm9yIChsZW4gPSAwOyB1bmljb2RlW2xlbl0gIT0gMDsgKytsZW4pCiAgICA7CiAgKytsZW47CiAgciA9ICgodW5pY2hhciAqKSByZXNfYWxsb2MgKGxlbiAqIHNpemVvZiAodW5pY2hhcikpKTsKICBtZW1jcHkgKHIsIHVuaWNvZGUsIGxlbiAqIHNpemVvZiAodW5pY2hhcikpOwogIHJldHVybiByOwp9Cgp1bmljaGFyICoKdW5pY2hhcl9kdXBfdXBwZXJjYXNlIChjb25zdCB1bmljaGFyICp1KQp7CiAgdW5pY2hhciAqciA9IHVuaWNoYXJfZHVwICh1KTsKICBpbnQgaTsKCiAgaWYgKCEgcikKICAgIHJldHVybiBOVUxMOwoKICBmb3IgKGkgPSAwOyByW2ldICE9IDA7ICsraSkKICAgIHsKICAgICAgaWYgKHJbaV0gPj0gJ2EnICYmIHJbaV0gPD0gJ3onKQoJcltpXSAmPSAweGRmOwogICAgfQogIHJldHVybiByOwp9CgpzdGF0aWMgaW50CnVuaWNoYXJfaXNhc2NpaSAoY29uc3QgdW5pY2hhciAqdSwgcmNfdWludF90eXBlIGxlbikKewogIHJjX3VpbnRfdHlwZSBpOwoKICBpZiAoKGJmZF9zaWduZWRfdm1hKSBsZW4gPCAwKQogICAgewogICAgICBpZiAodSkKCWxlbiA9IChyY191aW50X3R5cGUpIHVuaWNoYXJfbGVuICh1KTsKICAgICAgZWxzZQoJbGVuID0gMDsKICAgIH0KCiAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQogICAgaWYgKCh1W2ldICYgMHhmZjgwKSAhPSAwKQogICAgICByZXR1cm4gMDsKICByZXR1cm4gMTsKfQoKdm9pZAp1bmljb2RlX3ByaW50X3F1b3RlZCAoRklMRSAqZSwgY29uc3QgdW5pY2hhciAqdSwgcmNfdWludF90eXBlIGxlbikKewogIGlmICghIHVuaWNoYXJfaXNhc2NpaSAodSwgbGVuKSkKICAgIGZwdXRjICgnTCcsIGUpOwogIGZwdXRjICgnIicsIGUpOwogIHVuaWNvZGVfcHJpbnQgKGUsIHUsIGxlbik7CiAgZnB1dGMgKCciJywgZSk7Cn0KCmludAp1bmljb2RlX2lzX3ZhbGlkX2NvZGVwYWdlIChyY191aW50X3R5cGUgY3ApCnsKICBpZiAoKGNwICYgMHhmZmZmKSAhPSBjcCkKICAgIHJldHVybiAwOwogIGlmIChjcCA9PSBDUF9VVEYxNiB8fCBjcCA9PSBDUF9BQ1ApCiAgICByZXR1cm4gMTsKCiNpZiAhZGVmaW5lZCAoX1dJTjMyKSAmJiAhZGVmaW5lZCAoX19DWUdXSU5fXykKICBpZiAoISB3aW5kX2ZpbmRfY29kZXBhZ2VfaW5mbyAoY3ApKQogICAgcmV0dXJuIDA7CiAgcmV0dXJuIDE7CiNlbHNlCiAgcmV0dXJuICEhIElzVmFsaWRDb2RlUGFnZSAoKFVJTlQpIGNwKTsKI2VuZGlmCn0KCiNpZiBkZWZpbmVkIChfV0lOMzIpIHx8IGRlZmluZWQgKF9fQ1lHV0lOX18pCgojZGVmaW5lIG1heF9jcF9zdHJpbmdfbGVuIDYKCnN0YXRpYyB1bnNpZ25lZCBpbnQKY29kZXBhZ2VfZnJvbV9sYW5naWQgKHVuc2lnbmVkIHNob3J0IGxhbmdpZCkKewogIGNoYXIgY3Bfc3RyaW5nIFttYXhfY3Bfc3RyaW5nX2xlbl07CiAgaW50IGM7CgogIG1lbXNldCAoY3Bfc3RyaW5nLCAwLCBtYXhfY3Bfc3RyaW5nX2xlbik7CiAgLyogTE9DQUxFX1JFVFVSTl9OVU1CRVIgZmxhZyB3b3VsZCBhdm9pZCBzdHJ0b3VsIGNvbnZlcnNpb24sCiAgICAgYnV0IGlzIHVuYXZhaWxhYmxlIG9uIFdpbjk1LiAgKi8KICBjID0gR2V0TG9jYWxlSW5mb0EgKE1BS0VMQ0lEIChsYW5naWQsIFNPUlRfREVGQVVMVCksCiAgCQkgICAgICBMT0NBTEVfSURFRkFVTFRBTlNJQ09ERVBBR0UsCiAgCQkgICAgICBjcF9zdHJpbmcsIG1heF9jcF9zdHJpbmdfbGVuKTsKICAvKiBJZiBjb2RlcGFnZSBkYXRhIGZvciBhbiBMQ0lEIGlzIG5vdCBpbnN0YWxsZWQgb24gdXNlcnMncyBzeXN0ZW0sCiAgICAgR2V0TG9jYWxlSW5mbyByZXR1cm5zIGFuIGVtcHR5IHN0cmluZy4gIEZhbGwgYmFjayB0byBzeXN0ZW0gQU5TSQogICAgIGRlZmF1bHQuICovCiAgaWYgKGMgPT0gMCkKICAgIHJldHVybiBDUF9BQ1A7CiAgcmV0dXJuIHN0cnRvdWwgKGNwX3N0cmluZywgMCwgMTApOwp9CgpzdGF0aWMgdW5zaWduZWQgaW50CndpbmNvZGVwYWdlX2Zyb21fbGFuZ2lkICh1bnNpZ25lZCBzaG9ydCBsYW5naWQpCnsKICBjaGFyIGNwX3N0cmluZyBbbWF4X2NwX3N0cmluZ19sZW5dOwogIGludCBjOwoKICBtZW1zZXQgKGNwX3N0cmluZywgMCwgbWF4X2NwX3N0cmluZ19sZW4pOwogIC8qIExPQ0FMRV9SRVRVUk5fTlVNQkVSIGZsYWcgd291bGQgYXZvaWQgc3RydG91bCBjb252ZXJzaW9uLAogICAgIGJ1dCBpcyB1bmF2YWlsYWJsZSBvbiBXaW45NS4gICovCiAgYyA9IEdldExvY2FsZUluZm9BIChNQUtFTENJRCAobGFuZ2lkLCBTT1JUX0RFRkFVTFQpLAoJCSAgICAgIExPQ0FMRV9JREVGQVVMVENPREVQQUdFLAoJCSAgICAgIGNwX3N0cmluZywgbWF4X2NwX3N0cmluZ19sZW4pOwogIC8qIElmIGNvZGVwYWdlIGRhdGEgZm9yIGFuIExDSUQgaXMgbm90IGluc3RhbGxlZCBvbiB1c2VycydzIHN5c3RlbSwKICAgICBHZXRMb2NhbGVJbmZvIHJldHVybnMgYW4gZW1wdHkgc3RyaW5nLiAgRmFsbCBiYWNrIHRvIHN5c3RlbSBBTlNJCiAgICAgZGVmYXVsdC4gKi8KICBpZiAoYyA9PSAwKQogICAgcmV0dXJuIENQX09FTTsKICByZXR1cm4gc3RydG91bCAoY3Bfc3RyaW5nLCAwLCAxMCk7Cn0KCnN0YXRpYyBjaGFyICoKbGFuZ19mcm9tX2xhbmdpZCAodW5zaWduZWQgc2hvcnQgbGFuZ2lkKQp7CiAgY2hhciBjcF9zdHJpbmdbMjYxXTsKICBpbnQgYzsKCiAgbWVtc2V0IChjcF9zdHJpbmcsIDAsIDI2MSk7CiAgYyA9IEdldExvY2FsZUluZm9BIChNQUtFTENJRCAobGFuZ2lkLCBTT1JUX0RFRkFVTFQpLAogIAkJICAgICAgTE9DQUxFX1NFTkdMQU5HVUFHRSwKICAJCSAgICAgIGNwX3N0cmluZywgMjYwKTsKICAvKiBJZiBjb2RlcGFnZSBkYXRhIGZvciBhbiBMQ0lEIGlzIG5vdCBpbnN0YWxsZWQgb24gdXNlcnMncyBzeXN0ZW0sCiAgICAgR2V0TG9jYWxlSW5mbyByZXR1cm5zIGFuIGVtcHR5IHN0cmluZy4gIEZhbGwgYmFjayB0byBzeXN0ZW0gQU5TSQogICAgIGRlZmF1bHQuICovCiAgaWYgKGMgPT0gMCkKICAgIHN0cmNweSAoY3Bfc3RyaW5nLCAiTmV1dHJhbCIpOwogIHJldHVybiB4c3RyZHVwIChjcF9zdHJpbmcpOwp9CgpzdGF0aWMgY2hhciAqCmNvdW50cnlfZnJvbV9sYW5naWQgKHVuc2lnbmVkIHNob3J0IGxhbmdpZCkKewogIGNoYXIgY3Bfc3RyaW5nWzI2MV07CiAgaW50IGM7CgogIG1lbXNldCAoY3Bfc3RyaW5nLCAwLCAyNjEpOwogIGMgPSBHZXRMb2NhbGVJbmZvQSAoTUFLRUxDSUQgKGxhbmdpZCwgU09SVF9ERUZBVUxUKSwKICAJCSAgICAgIExPQ0FMRV9TRU5HQ09VTlRSWSwKICAJCSAgICAgIGNwX3N0cmluZywgMjYwKTsKICAvKiBJZiBjb2RlcGFnZSBkYXRhIGZvciBhbiBMQ0lEIGlzIG5vdCBpbnN0YWxsZWQgb24gdXNlcnMncyBzeXN0ZW0sCiAgICAgR2V0TG9jYWxlSW5mbyByZXR1cm5zIGFuIGVtcHR5IHN0cmluZy4gIEZhbGwgYmFjayB0byBzeXN0ZW0gQU5TSQogICAgIGRlZmF1bHQuICovCiAgaWYgKGMgPT0gMCkKICAgIHN0cmNweSAoY3Bfc3RyaW5nLCAiTmV1dHJhbCIpOwogIHJldHVybiB4c3RyZHVwIChjcF9zdHJpbmcpOwp9CgojZW5kaWYKCmNvbnN0IHdpbmRfbGFuZ3VhZ2VfdCAqCndpbmRfZmluZF9sYW5ndWFnZV9ieV9pZCAodW5zaWduZWQgaWQpCnsKI2lmICFkZWZpbmVkIChfV0lOMzIpICYmICFkZWZpbmVkIChfX0NZR1dJTl9fKQogIGludCBpOwoKICBpZiAoISBpZCkKICAgIHJldHVybiBOVUxMOwogIGZvciAoaSA9IDA7IGxhbmd1YWdlc1tpXS5pZCAhPSAodW5zaWduZWQpIC0xICYmIGxhbmd1YWdlc1tpXS5pZCAhPSBpZDsgaSsrKQogICAgOwogIGlmIChsYW5ndWFnZXNbaV0uaWQgPT0gaWQpCiAgICByZXR1cm4gJmxhbmd1YWdlc1tpXTsKICByZXR1cm4gTlVMTDsKI2Vsc2UKICBzdGF0aWMgd2luZF9sYW5ndWFnZV90IHdsOwoKICB3bC5pZCA9IGlkOwogIHdsLmRvc2NwID0gY29kZXBhZ2VfZnJvbV9sYW5naWQgKCh1bnNpZ25lZCBzaG9ydCkgaWQpOwogIHdsLndpbmNwID0gd2luY29kZXBhZ2VfZnJvbV9sYW5naWQgKCh1bnNpZ25lZCBzaG9ydCkgaWQpOwogIHdsLm5hbWUgPSBsYW5nX2Zyb21fbGFuZ2lkICgodW5zaWduZWQgc2hvcnQpIGlkKTsKICB3bC5jb3VudHJ5ID0gY291bnRyeV9mcm9tX2xhbmdpZCAoKHVuc2lnbmVkIHNob3J0KSBpZCk7CgogIHJldHVybiAmIHdsOwojZW5kaWYKfQoKY29uc3QgbG9jYWxfaWNvbnZfbWFwICoKd2luZF9maW5kX2NvZGVwYWdlX2luZm8gKHVuc2lnbmVkIGNwKQp7CiNpZiAhZGVmaW5lZCAoX1dJTjMyKSAmJiAhZGVmaW5lZCAoX19DWUdXSU5fXykKICBpbnQgaTsKCiAgZm9yIChpID0gMDsgY29kZXBhZ2VzW2ldLmNvZGVwYWdlICE9IChyY191aW50X3R5cGUpIC0xICYmIGNvZGVwYWdlc1tpXS5jb2RlcGFnZSAhPSBjcDsgaSsrKQogICAgOwogIGlmIChjb2RlcGFnZXNbaV0uY29kZXBhZ2UgPT0gKHJjX3VpbnRfdHlwZSkgLTEpCiAgICByZXR1cm4gTlVMTDsKICByZXR1cm4gJmNvZGVwYWdlc1tpXTsKI2Vsc2UKICBzdGF0aWMgbG9jYWxfaWNvbnZfbWFwIGxpbTsKICBpZiAoIXVuaWNvZGVfaXNfdmFsaWRfY29kZXBhZ2UgKGNwKSkKICAJcmV0dXJuIE5VTEw7CiAgbGltLmNvZGVwYWdlID0gY3A7CiAgbGltLmljb252X25hbWUgPSAiIjsKICByZXR1cm4gJiBsaW07CiNlbmRpZgp9CgovKiBDb252ZXJ0IGFuIENvZGVwYWdlIHN0cmluZyB0byBhIHVuaWNvZGUgc3RyaW5nLiAgKi8KCnZvaWQKdW5pY29kZV9mcm9tX2NvZGVwYWdlIChyY191aW50X3R5cGUgKmxlbmd0aCwgdW5pY2hhciAqKnUsIGNvbnN0IGNoYXIgKnNyYywgcmNfdWludF90eXBlIGNwKQp7CiAgcmNfdWludF90eXBlIGxlbjsKCiAgbGVuID0gd2luZF9NdWx0aUJ5dGVUb1dpZGVDaGFyIChjcCwgc3JjLCBOVUxMLCAwKTsKICBpZiAobGVuKQogICAgewogICAgICAqdSA9ICgodW5pY2hhciAqKSByZXNfYWxsb2MgKGxlbikpOwogICAgICB3aW5kX011bHRpQnl0ZVRvV2lkZUNoYXIgKGNwLCBzcmMsICp1LCBsZW4pOwogICAgfQogIC8qIERpc2NvdW50IHRoZSB0cmFpbGluZyAnLzAnLiAgSWYgTXVsdGlCeXRlVG9XaWRlQ2hhciBmYWlsZWQsCiAgICAgdGhpcyB3aWxsIHNldCAqbGVuZ3RoIHRvIC0xLiAgKi8KICBsZW4gLT0gc2l6ZW9mICh1bmljaGFyKTsKCiAgaWYgKGxlbmd0aCAhPSBOVUxMKQogICAgKmxlbmd0aCA9IGxlbiAvIHNpemVvZiAodW5pY2hhcik7Cn0KCi8qIENvbnZlcnQgYW4gdW5pY29kZSBzdHJpbmcgdG8gYW4gY29kZXBhZ2Ugc3RyaW5nLiAgKi8KCnZvaWQKY29kZXBhZ2VfZnJvbV91bmljb2RlIChyY191aW50X3R5cGUgKmxlbmd0aCwgY29uc3QgdW5pY2hhciAqdW5pY29kZSwgY2hhciAqKmFzY2lpLCByY191aW50X3R5cGUgY3ApCnsKICByY191aW50X3R5cGUgbGVuOwoKICBsZW4gPSB3aW5kX1dpZGVDaGFyVG9NdWx0aUJ5dGUgKGNwLCB1bmljb2RlLCBOVUxMLCAwKTsKICBpZiAobGVuKQogICAgewogICAgICAqYXNjaWkgPSAoY2hhciAqKSByZXNfYWxsb2MgKGxlbiAqIHNpemVvZiAoY2hhcikpOwogICAgICB3aW5kX1dpZGVDaGFyVG9NdWx0aUJ5dGUgKGNwLCB1bmljb2RlLCAqYXNjaWksIGxlbik7CiAgICB9CiAgLyogRGlzY291bnQgdGhlIHRyYWlsaW5nICcvMCcuICBJZiBNdWx0aUJ5dGVUb1dpZGVDaGFyIGZhaWxlZCwKICAgICB0aGlzIHdpbGwgc2V0ICpsZW5ndGggdG8gLTEuICAqLwogIGxlbi0tOwoKICBpZiAobGVuZ3RoICE9IE5VTEwpCiAgICAqbGVuZ3RoID0gbGVuOwp9CgojaWYgZGVmaW5lZCAoSEFWRV9JQ09OVikgJiYgIWRlZmluZWQgKF9XSU4zMikgJiYgIWRlZmluZWQgKF9fQ1lHV0lOX18pCnN0YXRpYyBpbnQKaWNvbnZfb25lY2hhciAoaWNvbnZfdCBjZCwgSUNPTlZfQ09OU1QgY2hhciAqcywgY2hhciAqZCwgaW50IGRfbGVuLCBjb25zdCBjaGFyICoqbl9zLCBjaGFyICoqbl9kKQp7CiAgaW50IGk7CgogIGZvciAoaSA9IDE7IGkgPD0gMzI7IGkrKykKICAgIHsKICAgICAgY2hhciAqdG1wX2QgPSBkOwogICAgICBJQ09OVl9DT05TVCBjaGFyICp0bXBfcyA9IHM7CiAgICAgIHNpemVfdCByZXQ7CiAgICAgIHNpemVfdCBzX2xlZnQgPSAoc2l6ZV90KSBpOwogICAgICBzaXplX3QgZF9sZWZ0ID0gKHNpemVfdCkgZF9sZW47CgogICAgICByZXQgPSBpY29udiAoY2QsICYgdG1wX3MsICYgc19sZWZ0LCAmIHRtcF9kLCAmIGRfbGVmdCk7CgogICAgICBpZiAocmV0ICE9IChzaXplX3QpIC0xKQoJewoJICAqbl9zID0gdG1wX3M7CgkgICpuX2QgPSB0bXBfZDsKCSAgcmV0dXJuIDA7Cgl9CiAgICB9CgogIHJldHVybiAxOwp9CgpzdGF0aWMgY29uc3QgY2hhciAqCndpbmRfaWNvbnZfY3AgKHJjX3VpbnRfdHlwZSBjcCkKewogIGNvbnN0IGxvY2FsX2ljb252X21hcCAqbGltID0gd2luZF9maW5kX2NvZGVwYWdlX2luZm8gKGNwKTsKCiAgaWYgKCFsaW0pCiAgICByZXR1cm4gTlVMTDsKICByZXR1cm4gbGltLT5pY29udl9uYW1lOwp9CiNlbmRpZiAvKiBIQVZFX0lDT05WICovCgpzdGF0aWMgcmNfdWludF90eXBlCndpbmRfTXVsdGlCeXRlVG9XaWRlQ2hhciAocmNfdWludF90eXBlIGNwLCBjb25zdCBjaGFyICptYiwKCQkJICB1bmljaGFyICp1LCByY191aW50X3R5cGUgdV9sZW4pCnsKICByY191aW50X3R5cGUgcmV0ID0gMDsKCiNpZiBkZWZpbmVkIChfV0lOMzIpIHx8IGRlZmluZWQgKF9fQ1lHV0lOX18pCiAgcmNfdWludF90eXBlIGNvbnZfZmxhZ3MgPSBNQl9QUkVDT01QT1NFRDsKCiAgLyogTUJfUFJFQ09NUE9TRUQgaXMgbm90IGFsbG93ZWQgZm9yIFVURi03IG9yIFVURi04LiAgCiAgICAgTXVsdGlCeXRlVG9XaWRlQ2hhciB3aWxsIHNldCB0aGUgbGFzdCBlcnJvciB0bwogICAgIEVSUk9SX0lOVkFMSURfRkxBR1MgaWYgd2UgZG8uICovCiAgaWYgKGNwID09IENQX1VURjggfHwgY3AgPT0gQ1BfVVRGNykKICAgIGNvbnZfZmxhZ3MgPSAwOwoKICByZXQgPSAocmNfdWludF90eXBlKSBNdWx0aUJ5dGVUb1dpZGVDaGFyIChjcCwgY29udl9mbGFncywKCQkJCQkgICAgbWIsIC0xLCB1LCB1X2xlbik7CiAgLyogQ29udmVydCB0byBieXRlcy4gKi8KICByZXQgKj0gc2l6ZW9mICh1bmljaGFyKTsKCiNlbGlmIGRlZmluZWQgKEhBVkVfSUNPTlYpCiAgaW50IGZpcnN0ID0gMTsKICBjaGFyIHRtcFszMl07CiAgY2hhciAqcF90bXA7CiAgY29uc3QgY2hhciAqaWNvbnZfbmFtZSA9IHdpbmRfaWNvbnZfY3AgKGNwKTsKCiAgaWYgKCFtYiB8fCAhaWNvbnZfbmFtZSkKICAgIHJldHVybiAwOwogIGljb252X3QgY2QgPSBpY29udl9vcGVuICgiVVRGLTE2TEUiLCBpY29udl9uYW1lKTsKCiAgd2hpbGUgKDEpCiAgICB7CiAgICAgIGludCBpcmV0OwogICAgICBjb25zdCBjaGFyICpuX21iID0gIiI7CiAgICAgIGNoYXIgKm5fdG1wID0gIiI7CgogICAgICBwX3RtcCA9IHRtcDsKICAgICAgaXJldCA9IGljb252X29uZWNoYXIgKGNkLCAoSUNPTlZfQ09OU1QgY2hhciAqKSBtYiwgcF90bXAsIDMyLCAmIG5fbWIsICYgbl90bXApOwogICAgICBpZiAoZmlyc3QpCgl7CgkgIGZpcnN0ID0gMDsKCSAgY29udGludWU7Cgl9CiAgICAgIGlmICghaXJldCkKCXsKCSAgc2l6ZV90IGxfdG1wID0gKHNpemVfdCkgKG5fdG1wIC0gcF90bXApOwoKCSAgaWYgKHUpCgkgICAgewoJICAgICAgaWYgKChzaXplX3QpIHVfbGVuIDwgbF90bXApCgkJYnJlYWs7CgkgICAgICBtZW1jcHkgKHUsIHRtcCwgbF90bXApOwoJICAgICAgdSArPSBsX3RtcC8yOwoJICAgICAgdV9sZW4gLT0gbF90bXA7CgkgICAgfQoJICByZXQgKz0gbF90bXA7Cgl9CiAgICAgIGVsc2UKCWJyZWFrOwogICAgICBpZiAodG1wWzBdID09IDAgJiYgdG1wWzFdID09IDApCglicmVhazsKICAgICAgbWIgPSBuX21iOwogICAgfQogIGljb252X2Nsb3NlIChjZCk7CiNlbHNlCiAgaWYgKGNwKQogICAgcmV0ID0gMDsKICByZXQgPSBzdHJsZW4gKG1iKSArIDE7CiAgcmV0ICo9IHNpemVvZiAodW5pY2hhcik7CiAgaWYgKHUgIT0gTlVMTCAmJiB1X2xlbiAhPSAwKQogICAgewogICAgICBkbwoJewoJICAqdSsrID0gKCh1bmljaGFyKSAqbWIpICYgMHhmZjsKCSAgLS11X2xlbjsgbWIrKzsKCX0KICAgICAgd2hpbGUgKHVfbGVuICE9IDAgJiYgbWJbLTFdICE9IDApOwogICAgfQogIGlmICh1ICE9IE5VTEwgJiYgdV9sZW4gIT0gMCkKICAgICp1ID0gMDsKI2VuZGlmCiAgcmV0dXJuIHJldDsKfQoKc3RhdGljIHJjX3VpbnRfdHlwZQp3aW5kX1dpZGVDaGFyVG9NdWx0aUJ5dGUgKHJjX3VpbnRfdHlwZSBjcCwgY29uc3QgdW5pY2hhciAqdSwgY2hhciAqbWIsIHJjX3VpbnRfdHlwZSBtYl9sZW4pCnsKICByY191aW50X3R5cGUgcmV0ID0gMDsKI2lmIGRlZmluZWQgKF9XSU4zMikgfHwgZGVmaW5lZCAoX19DWUdXSU5fXykKICBXSU5CT09MIHVzZWRfZGVmID0gRkFMU0U7CgogIHJldCA9IChyY191aW50X3R5cGUpIFdpZGVDaGFyVG9NdWx0aUJ5dGUgKGNwLCAwLCB1LCAtMSwgbWIsIG1iX2xlbiwKCQkJCSAgICAgIAkgICAgTlVMTCwgJiB1c2VkX2RlZik7CiNlbGlmIGRlZmluZWQgKEhBVkVfSUNPTlYpCiAgaW50IGZpcnN0ID0gMTsKICBjaGFyIHRtcFszMl07CiAgY2hhciAqcF90bXA7CiAgY29uc3QgY2hhciAqaWNvbnZfbmFtZSA9IHdpbmRfaWNvbnZfY3AgKGNwKTsKCiAgaWYgKCF1IHx8ICFpY29udl9uYW1lKQogICAgcmV0dXJuIDA7CiAgaWNvbnZfdCBjZCA9IGljb252X29wZW4gKGljb252X25hbWUsICJVVEYtMTZMRSIpOwoKICB3aGlsZSAoMSkKICAgIHsKICAgICAgaW50IGlyZXQ7CiAgICAgIGNvbnN0IGNoYXIgKm5fdSA9ICIiOwogICAgICBjaGFyICpuX3RtcCA9ICIiOwoKICAgICAgcF90bXAgPSB0bXA7CiAgICAgIGlyZXQgPSBpY29udl9vbmVjaGFyIChjZCwgKElDT05WX0NPTlNUIGNoYXIgKikgdSwgcF90bXAsIDMyLCAmbl91LCAmIG5fdG1wKTsKICAgICAgaWYgKGZpcnN0KQoJewoJICBmaXJzdCA9IDA7CgkgIGNvbnRpbnVlOwoJfQogICAgICBpZiAoIWlyZXQpCgl7CgkgIHNpemVfdCBsX3RtcCA9IChzaXplX3QpIChuX3RtcCAtIHBfdG1wKTsKCgkgIGlmIChtYikKCSAgICB7CgkgICAgICBpZiAoKHNpemVfdCkgbWJfbGVuIDwgbF90bXApCgkJYnJlYWs7CgkgICAgICBtZW1jcHkgKG1iLCB0bXAsIGxfdG1wKTsKCSAgICAgIG1iICs9IGxfdG1wOwoJICAgICAgbWJfbGVuIC09IGxfdG1wOwoJICAgIH0KCSAgcmV0ICs9IGxfdG1wOwoJfQogICAgICBlbHNlCglicmVhazsKICAgICAgaWYgKHVbMF0gPT0gMCkKCWJyZWFrOwogICAgICB1ID0gKGNvbnN0IHVuaWNoYXIgKikgbl91OwogICAgfQogIGljb252X2Nsb3NlIChjZCk7CiNlbHNlCiAgaWYgKGNwKQogICAgcmV0ID0gMDsKCiAgd2hpbGUgKHVbcmV0XSAhPSAwKQogICAgKytyZXQ7CgogICsrcmV0OwoKICBpZiAobWIpCiAgICB7CiAgICAgIHdoaWxlICgqdSAhPSAwICYmIG1iX2xlbiAhPSAwKQoJewoJICBpZiAodVswXSA9PSAodVswXSAmIDB4N2YpKQoJICAgICptYisrID0gKGNoYXIpIHVbMF07CgkgIGVsc2UKCSAgICAqbWIrKyA9ICdfJzsKCSAgKyt1OyAtLW1iX2xlbjsKCX0KICAgICAgaWYgKG1iX2xlbiAhPSAwKQoJKm1iID0gMDsKICAgIH0KI2VuZGlmCiAgcmV0dXJuIHJldDsKfQo=