LyoKKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAyMCwgSW50ZWwgQ29ycG9yYXRpb24KKgoqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCiogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCiogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCiogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCiogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKgoqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCiogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCioKKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUwoqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAoqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMCiogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCiovCi8vIQovLyEgXGZpbGUgICAgIG1od192ZWJveC5oCi8vISBcYnJpZWYgICAgTUhXIGludGVyZmFjZSBmb3IgY29uc3RydWN0aW5nIGNvbW1hbmRzIGZvciB0aGUgVkVCT1gKLy8hIFxkZXRhaWxzICBJbXBlbGVtZW50cyB0aGUgZnVuY3Rpb25hbGl0aWVzIGNvbW1vbiBhY3Jvc3MgYWxsIHBsYXRmb3JtcyBmb3IgTUhXX1ZFQk9YCi8vIQoKI2lmbmRlZiBfX01IV19WRUJPWF9IX18KI2RlZmluZSBfX01IV19WRUJPWF9IX18KCiNpbmNsdWRlICJtb3Nfb3MuaCIKI2luY2x1ZGUgIm1od191dGlsaXRpZXMuaCIKI2luY2x1ZGUgIm1od19jcF9pbnRlcmZhY2UuaCIKI2luY2x1ZGUgIm1od19taS5oIgojaW5jbHVkZSA8bWF0aC5oPgoKI2RlZmluZSBNSFdfRk9SV0FSRF9HQU1NQV9TRUdNRU5UX0NPVU5UICAgICAgIDEwMjQgICAgLy8hPCBGb3J3YXJkIEdhbW1hIENvcnJlY3Rpb24gTUFYIENvbnRyb2wgUG9pbnRzCgovLyEKLy8hIFxicmllZiAgVkVCT1ggY29uc3RhbnRzCi8vIQojZGVmaW5lIE1IV19WRUJPWF9NSU5fSEVJR0hUICAgICAgMTYKI2RlZmluZSBNSFdfVkVCT1hfTUlOX1dJRFRIICAgICAgIDY0CiNkZWZpbmUgTUhXX1ZFQk9YX0xJTkVBUl9QSVRDSCAgICA2NAovLyEKLy8hIFxicmllZiAgQUNFIGNvbnN0YW50cwovLyEKI2RlZmluZSBNSFdfTlVNX0FDRV9QV0xGX0NPRUZGICAgIDUKCi8vIQovLyEgXGJyaWVmICBWZWJveCBETkRJIGNvbnN0YW50cwovLyEKI2RlZmluZSBETkRJX0hJU1RPUllfSU5JVFZBTFVFICAgICAgICAgICAgICAgICAgICAgIDB4RkYKCi8vIQovLyEgXGJyaWVmICBWZWJveCBEZW5vaXNlIHBpeGVsIHJhbmdlIHRocmVzaG9sZCBudW1iZXJzCi8vIQojZGVmaW5lIE1IV19QSVhSQU5HRVRIUkVTX05VTSAgICAgNgoKLy8hCi8vISBcYnJpZWYgIFNURSBQYXJhbWV0ZXJzCi8vIQojZGVmaW5lIE1IV19TVEVfT1BUSU1BTCAgICAgICAgICAgMyAgLy8gZm9yIHBlcmZlY3QgSEQtSFFWIFNjb3JlCgovLyEKLy8hIFxicmllZiAgRGVmYXVsdCBzaXplIG9mIGFyZWEgZm9yIHN5bmMsIGRlYnVnZ2luZywgcGVyZm9ybWFuY2UgY29sbGVjdGluZwovLyEKI2RlZmluZSBNSFdfU1lOQ19TSVpFICAgMTI4IC8vIHJhbmdlOiAoMTI4IC4uLiA0MDk2KQoKLy8hCi8vISBcYnJpZWYgIERlZmF1bHQgbnVtYmVyIG9mIG1lZGlhIHN0YXRlcyAoRHluYW1pYyBHU0ggbW9kZSkKLy8hCiNkZWZpbmUgTUhXX01BWF9WRUJPWF9TVEFURVMgICAgMTYKCiNkZWZpbmUgTUhXX1BJICAgICAgICAgICAgICAgICAgICAgMy4xNDE1OTI2NTM1ODk3OTMyNGYgICAgICAgICAvLyE8IERlZmluaXRpb24gdGhlIGNvbnN0IHBpCgovLyEKLy8hIFxkZWYgTUhXX0RFR1JFRV9UT19SQURJQU4oZGVncmVlKQovLyEgQ29udmVydCBcYSBkZWdyZWUgdmFsdWUgdG8gXGEgcmFkaWFuIHZhbHVlLgovLyEKI2RlZmluZSBNSFdfREVHUkVFX1RPX1JBRElBTihkZWdyZWUpICAgKGRlZ3JlZSkgKiAoTUhXX1BJKSAvIDE4MAojZGVmaW5lIEFWU19UQkxfQ09FRl9QUkVDICAgICAgICAgNiAgICAgICAgICAgLy8hPCBUYWJsZSBjb2VmIHByZWNpc2lvbiAoYWZ0ZXIgZGVjaW1hbCBwb2ludAojZGVmaW5lIFNBTUVfU0FNUExFX1RIUkVTSE9MRCAgICAgMTAwMCAgICAgICAgLy8hPCBXaGVuIGNoZWNraW5nIHdoZXRoZXIgMiB0aW1lc3RhbXBzIGFyZSB0aGUgc2FtZSwgbGVhdmUgcm9vbSBmb3Igc29tZSBlcnJvcgoKI2RlZmluZSBNSFdfVkVCT1hfV0FUQ0hET0dfRU5BQkxFX0NPVU5URVIgICAgICAgICAgICAgICAgIDB4MAojZGVmaW5lIE1IV19WRUJPWF9XQVRDSERPR19ESVNBQkxFX0NPVU5URVIgICAgICAgICAgICAgICAgMHhGRkZGRkZGRgojZGVmaW5lIE1IV19WRUJPWF9USU1FT1VUX01TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjAKCnR5cGVkZWYgTWh3TWlJbnRlcmZhY2UgKlBNSFdfTUlfSU5URVJGQUNFOwoKLy8hCi8vISBcYnJpZWYgQ29sb3IgU3BhY2VzIGVudW0KLy8hCnR5cGVkZWYgZW51bSBfTUhXX0NTUEFDRQp7CiAgICBNSFdfQ1NwYWNlX05vbmUgICAgID0gLTUgICAgICAgICwgICAvLyE8IFVuaWRlbnRpZmllZAogICAgTUhXX0NTcGFjZV9Tb3VyY2UgICA9IC00ICAgICAgICAsICAgLy8hPCBDdXJyZW50IHNvdXJjZSBDb2xvciBTcGFjZQoKICAgIC8vIEdyb3VwcyBvZiBDb2xvciBTcGFjZXMKICAgIE1IV19DU3BhY2VfUkdCICAgICAgPSAtMyAgICAgICAgLCAgIC8vITwgc1JHQgogICAgTUhXX0NTcGFjZV9ZVVYgICAgICA9IC0yICAgICAgICAsICAgLy8hPCBZVVYgQlQ2MDEgb3IgQlQ3MDkgLSBub24geHZZQ0MKICAgIE1IV19DU3BhY2VfR3JheSAgICAgPSAtMSAgICAgICAgLCAgIC8vITwgR3JheSBzY2FsZSBpbWFnZSB3aXRoIG9ubHkgWSBjb21wb25lbnQKICAgIE1IV19DU3BhY2VfQW55ICAgICAgPSAgMCAgICAgICAgLCAgIC8vITwgQW55CgogICAgLy8gU3BlY2lmaWMgQ29sb3IgU3BhY2VzCiAgICBNSFdfQ1NwYWNlX3NSR0IgICAgICAgICAgICAgICAgICwgICAvLyE8IFJHQiAtIHNSR0IgICAgICAgLSAgIFJHQlswLDI1NV0KICAgIE1IV19DU3BhY2Vfc3RSR0IgICAgICAgICAgICAgICAgLCAgIC8vITwgUkdCIC0gc3RSR0IgICAgICAtICAgUkdCWzE2LDIzNV0KICAgIE1IV19DU3BhY2VfQlQ2MDEgICAgICAgICAgICAgICAgLCAgIC8vITwgWVVWIEJULjYwMSBZWzE2LDIzNV0gVVZbMTYsMjQwXQogICAgTUhXX0NTcGFjZV9CVDYwMV9GdWxsUmFuZ2UgICAgICAsICAgLy8hPCBZVVYgQlQuNjAxIFlbMCwyNTVdICBVVlstMTI4LCsxMjddCiAgICBNSFdfQ1NwYWNlX0JUNzA5ICAgICAgICAgICAgICAgICwgICAvLyE8IFlVViBCVC43MDkgWVsxNiwyMzVdIFVWWzE2LDI0MF0KICAgIE1IV19DU3BhY2VfQlQ3MDlfRnVsbFJhbmdlICAgICAgLCAgIC8vITwgWVVWIEJULjcwOSBZWzAsMjU1XSAgVVZbLTEyOCwrMTI3XQogICAgTUhXX0NTcGFjZV94dllDQzYwMSAgICAgICAgICAgICAsICAgLy8hPCB4dllDQyA2MDEgWVsxNiwyMzVdICBVVlsxNiwyNDBdCiAgICBNSFdfQ1NwYWNlX3h2WUNDNzA5ICAgICAgICAgICAgICwgICAvLyE8IHh2WUNDIDcwOSBZWzE2LDIzNV0gIFVWWzE2LDI0MF0KICAgIE1IV19DU3BhY2VfQlQ2MDFHcmF5ICAgICAgICAgICAgLCAgIC8vITwgQlQuNjAxIFlbMTYsMjM1XQogICAgTUhXX0NTcGFjZV9CVDYwMUdyYXlfRnVsbFJhbmdlICAsICAgLy8hPCBCVC42MDEgWVswLDI1NV0KICAgIE1IV19DU3BhY2VfQlQyMDIwICAgICAgICAgICAgICAgLCAgIC8vITwgQlQuMjAyMCBZVVYgTGltaXRlZCBSYW5nZSAxMGJpdCBZWzY0LCA5NDBdIFVWWzY0LCA5NjBdCiAgICBNSFdfQ1NwYWNlX0JUMjAyMF9GdWxsUmFuZ2UgICAgICwgICAvLyE8IEJULjIwMjAgWVVWIEZ1bGwgUmFuZ2UgMTBiaXQgWzAsIDEwMjNdCiAgICBNSFdfQ1NwYWNlX0JUMjAyMF9SR0IgICAgICAgICAgICwgICAvLyE8IEJULjIwMjAgUkdCIEZ1bGwgUmFuZ2UgMTBiaXQgWzAsIDEwMjNdCiAgICBNSFdfQ1NwYWNlX0JUMjAyMF9zdFJHQiAgICAgICAgICwgICAvLyE8IEJULjIwMjAgUkdCIFN0dWRpbyBSYW5nZSAxMGJpdCBbNjQsIDk0MF0KICAgIE1IV19DU3BhY2VfQ291bnQgICAgICAgICAgICAgICAgICAgIC8vITwgS2VlcCB0aGlzIGF0IHRoZSBlbmQKfSBNSFdfQ1NQQUNFOwpDX0FTU0VSVChNSFdfQ1NwYWNlX0NvdW50ID09IDE1KTsKCi8vIQovLyEgXGJyaWVmIEdhbXV0IE1vZGUgZW51bQovLyEKdHlwZWRlZiBlbnVtIF9NSFdfR0FNVVRfTU9ERQp7CiAgICBNSFdfR0FNVVRfTU9ERV9OT05FLAogICAgTUhXX0dBTVVUX01PREVfQkFTSUMsCiAgICBNSFdfR0FNVVRfTU9ERV9BRFZBTkNFRCwKICAgIE1IV19HQU1VVF9NT0RFX0NVU1RPTUlaRUQKfSBNSFdfR0FNVVRfTU9ERTsKQ19BU1NFUlQoTUhXX0dBTVVUX01PREVfQ1VTVE9NSVpFRCA9PSAzKTsKCi8vIQovLyEgXGJyaWVmIEdhbW1hIFZhbHVlcyBjb25maWd1cmF0aW9uIGVudW0KLy8hCnR5cGVkZWYgZW51bSBfTUhXX0dBTU1BX1ZBTFVFCnsKICAgIE1IV19HQU1NQV8xUDAgPSAwLAogICAgTUhXX0dBTU1BXzJQMiwKICAgIE1IV19HQU1NQV8yUDYKfSBNSFdfR0FNTUFfVkFMVUU7CkNfQVNTRVJUKE1IV19HQU1NQV8yUDYgPT0gMik7CgovLyEKLy8hIFxicmllZiAgU3RydWN0dXJlIHRvIFZlYm94IE1vZGUKLy8hCnR5cGVkZWYgc3RydWN0IF9NSFdfVkVCT1hfTU9ERQp7CiAgICB1aW50MzJfdCAgICBDb2xvckdhbXV0RXhwYW5zaW9uRW5hYmxlICAgICAgICAgICA6IDE7CiAgICB1aW50MzJfdCAgICBDb2xvckdhbXV0Q29tcHJlc3Npb25FbmFibGUgICAgICAgICA6IDE7CiAgICB1aW50MzJfdCAgICBHbG9iYWxJRUNQRW5hYmxlICAgICAgICAgICAgICAgICAgICA6IDE7CiAgICB1aW50MzJfdCAgICBETkVuYWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDE7CiAgICB1aW50MzJfdCAgICBESUVuYWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDE7CiAgICB1aW50MzJfdCAgICBETkRJRmlyc3RGcmFtZSAgICAgICAgICAgICAgICAgICAgICA6IDE7CiAgICB1aW50MzJfdCAgICBESU91dHB1dEZyYW1lcyAgICAgICAgICAgICAgICAgICAgICA6IDI7CiAgICB1aW50MzJfdCAgICBQaXBlU3luY2hyb25pemVEaXNhYmxlICAgICAgICAgICAgICA6IDE7CiAgICB1aW50MzJfdCAgICBEZW1vc2FpY0VuYWJsZSAgICAgICAgICAgICAgICAgICAgICA6IDE7ICAvLyBHZW44KwogICAgdWludDMyX3QgICAgVmlnbmV0dGVFbmFibGUgICAgICAgICAgICAgICAgICAgICAgOiAxOyAgLy8gR2VuOCsKICAgIHVpbnQzMl90ICAgIEFscGhhUGxhbmVFbmFibGUgICAgICAgICAgICAgICAgICAgIDogMTsKICAgIHVpbnQzMl90ICAgIEhvdFBpeGVsRmlsdGVyaW5nRW5hYmxlICAgICAgICAgICAgIDogMTsgIC8vIEdlbjgrCiAgICB1aW50MzJfdCAgICBTaW5nbGVTbGljZVZlYm94RW5hYmxlICAgICAgICAgICAgICA6IDI7ICAvLyBHZW45KwogICAgdWludDMyX3QgICAgTEFDRUNvcnJlY3Rpb25FbmFibGUgICAgICAgICAgICAgICAgOiAxOyAgLy8gR2VuOSsKICAgIHVpbnQzMl90ICAgIERpc2FibGVFbmNvZGVyU3RhdGlzdGljcyAgICAgICAgICAgIDogMTsgIC8vIEdlbjkrCiAgICB1aW50MzJfdCAgICBEaXNhYmxlVGVtcG9yYWxEZW5vaXNlRmlsdGVyICAgICAgICA6IDE7ICAvLyBHZW45KwogICAgdWludDMyX3QgICAgU2luZ2xlUGlwZUlFQ1BFbmFibGUgICAgICAgICAgICAgICAgOiAxOyAgLy8gR2VuOSsKICAgIHVpbnQzMl90ICAgIFNGQ1BhcmFsbGVsV3JpdGVFbmFibGUgICAgICAgICAgICAgIDogMTsgIC8vIEdlbjkrCiAgICB1aW50MzJfdCAgICBTY2FsYXJNb2RlICAgICAgICAgICAgICAgICAgICAgICAgICA6IDE7ICAvLyBHZW4xMCsKICAgIHVpbnQzMl90ICAgIEZvcndhcmRHYW1tYUNvcnJlY3Rpb25FbmFibGUgICAgICAgIDogMTsgIC8vIEdlbjkrCiAgICB1aW50MzJfdCAgICBIZHIxREx1dEVuYWJsZSAgICAgICAgICAgICAgICAgICAgICA6IDE7CiAgICB1aW50MzJfdCAgICBGcDE2TW9kZUVuYWJsZSAgICAgICAgICAgICAgICAgICAgICA6IDE7CiAgICB1aW50MzJfdCAgICBIZHIxSzFETHV0ICAgICAgICAgICAgICAgICAgICAgICAgICA6IDE7CiAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDc7IC8vIFJlc2VydmVkCn0gTUhXX1ZFQk9YX01PREUsICpQTUhXX1ZFQk9YX01PREU7Cgp0eXBlZGVmIGVudW0gX01IV19WRUJPWF9BRERSRVNTX1NISUZUCnsKICAgIE1IV19WRUJPWF9ESV9JRUNQX1NISUZUICAgICAgICAgICAgICAgICAgICA9IDEyLAp9IE1IV19WRUJPWF9BRERSRVNTX1NISUZUOwoKLy8hCi8vISBcYnJpZWYgIFN0cnVjdHVyZSB0byBDaHJvbWEgU2FtcGxpbmcgdG8gaGFuZGxlIFZFQk9YX1NUQVRFX0NNRCBDb21tYW5kCi8vIQp0eXBlZGVmIHN0cnVjdCBfTUhXX1ZFQk9YX0NIUk9NQV9TQU1QTElORwp7CiAgICB1aW50MzJfdCAgICBDaHJvbWFVcHNhbXBsaW5nQ29TaXRlZEhvcml6b250YWxPZmZzZXQgICAgIDogMjsKICAgIHVpbnQzMl90ICAgIENocm9tYVVwc2FtcGxpbmdDb1NpdGVkVmVydGljYWxPZmZzZXQgICAgICAgOiAzOwogICAgdWludDMyX3QgICAgQ2hyb21hRG93bnNhbXBsaW5nQ29TaXRlZEhvcml6b250YWxPZmZzZXQgICA6IDI7CiAgICB1aW50MzJfdCAgICBDaHJvbWFEb3duc2FtcGxpbmdDb1NpdGVkVmVydGljYWxPZmZzZXQgICAgIDogMzsKICAgIHVpbnQzMl90ICAgIEJ5cGFzc0Nocm9tYVVwc2FtcGxpbmcgICAgICAgICAgICAgICAgICAgICAgOiAxOwogICAgdWludDMyX3QgICAgQnlwYXNzQ2hyb21hRG93bnNhbXBsaW5nICAgICAgICAgICAgICAgICAgICA6IDE7CiAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMjA7IC8vIFJlc2VydmVkCn0gTUhXX1ZFQk9YX0NIUk9NQV9TQU1QTElORywgKlBNSFdfVkVCT1hfQ0hST01BX1NBTVBMSU5HOwoKdHlwZWRlZiBzdHJ1Y3QgX01IV19WRUJPWF8zRF9MVVQKewogICAgdWludDMyX3QgICAgQXJiaXRyYXRpb25Qcmlvcml0eUNvbnRyb2wgICAgICAgICAgICAgICAgICA6IDI7CiAgICB1aW50MzJfdCAgICBMdXQzZEVuYWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMTsKICAgIHVpbnQzMl90ICAgIEx1dDNkU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAyOwogICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDI3OyAvLyBSZXNlcnZlZAp9IE1IV19WRUJPWF8zRF9MVVQsICpQTUhXX1ZFQk9YXzNEX0xVVDsKCi8vIQovLyEgXGJyaWVmICBTdHJ1Y3R1cmUgdG8gaGFuZGxlIFZFQk9YX1NUQVRFX0NNRCBDb21tYW5kCi8vIQp0eXBlZGVmIHN0cnVjdCBfTUhXX1ZFQk9YX1NUQVRFX0NNRF9QQVJBTVMKewogICAgTUhXX1ZFQk9YX01PREUgICAgICAgICAgICAgICAgICAgICAgVmVib3hNb2RlOwogICAgTUhXX1ZFQk9YX0NIUk9NQV9TQU1QTElORyAgICAgICAgICAgQ2hyb21hU2FtcGxpbmc7CiAgICBNSFdfVkVCT1hfM0RfTFVUICAgICAgICAgICAgICAgICAgICBMVVQzRDsKICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJVc2VWZWJveEhlYXBLZXJuZWxSZXNvdXJjZTsKICAgIFBNT1NfUkVTT1VSQ0UgICAgICAgICAgICAgICAgICAgICAgIHBMYWNlTG9va1VwVGFibGVzOwogICAgUE1PU19SRVNPVVJDRSAgICAgICAgICAgICAgICAgICAgICAgcFZlYm94UGFyYW1TdXJmOwogICAgUE1PU19SRVNPVVJDRSAgICAgICAgICAgICAgICAgICAgICAgcFZlYm94M0RMb29rVXBUYWJsZXM7CiAgICBQTU9TX1JFU09VUkNFICAgICAgICAgICAgICAgICAgICAgICBwVmVib3gxRExvb2tVcFRhYmxlczsKICAgIE1PU19SRVNPVVJDRSAgICAgICAgICAgICAgICAgICAgICAgIER1bW15SWVjcFJlc291cmNlOwogICAgTUhXX01FTU9SWV9PQkpFQ1RfQ09OVFJPTF9QQVJBTVMgICAgTGFjZUxvb2tVcFRhYmxlc1N1cmZDdHJsOwogICAgTUhXX01FTU9SWV9PQkpFQ1RfQ09OVFJPTF9QQVJBTVMgICAgVmVib3gzRExvb2tVcFRhYmxlc1N1cmZDdHJsOwogICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYk5vVXNlVmVib3hIZWFwOwp9IE1IV19WRUJPWF9TVEFURV9DTURfUEFSQU1TLCAqUE1IV19WRUJPWF9TVEFURV9DTURfUEFSQU1TOwoKLy8hCi8vISBcYnJpZWYgIFZFQk9YIEROREkgcGFyYW1ldGVycwovLyEKdHlwZWRlZiBzdHJ1Y3QgX01IV19WRUJPWF9ETkRJX1BBUkFNUwp7CiAgICAvLyBESSBhbmQgTHVtYSBEZW5vaXNlIFBhcmFtcwogICAgdWludDMyX3QgIGR3RGVub2lzZUFTRFRocmVzaG9sZDsKICAgIHVpbnQzMl90ICBkd0Rlbm9pc2VIaXN0b3J5RGVsdGE7CiAgICB1aW50MzJfdCAgZHdEZW5vaXNlTWF4aW11bUhpc3Rvcnk7CiAgICB1aW50MzJfdCAgZHdEZW5vaXNlU1RBRFRocmVzaG9sZDsKICAgIHVpbnQzMl90ICBkd0Rlbm9pc2VTQ01UaHJlc2hvbGQ7CiAgICB1aW50MzJfdCAgZHdEZW5vaXNlTVBUaHJlc2hvbGQ7CiAgICB1aW50MzJfdCAgZHdMVERUaHJlc2hvbGQ7CiAgICB1aW50MzJfdCAgZHdURFRocmVzaG9sZDsKICAgIHVpbnQzMl90ICBkd0dvb2ROZWlnaGJvclRocmVzaG9sZDsKICAgIGJvb2wgICAgICBiRE5ESVRvcEZpcnN0OwogICAgYm9vbCAgICAgIGJQcm9ncmVzc2l2ZUROOwogICAgdWludDMyX3QgIGR3Rk1ERmlyc3RGaWVsZEN1cnJGcmFtZTsKICAgIHVpbnQzMl90ICBkd0ZNRFNlY29uZEZpZWxkUHJldkZyYW1lOwoKICAgIC8vIFBpeGVsIFJhbmdlIFRocmVzaG9sZCBBcnJheSBmb3IgNXg1IFNwYXRpYWwgRmlsdGVyCiAgICB1aW50MzJfdCAgZHdQaXhSYW5nZVRocmVzaG9sZFtNSFdfUElYUkFOR0VUSFJFU19OVU1dOwogICAgdWludDMyX3QgIGR3UGl4UmFuZ2VXZWlnaHRbTUhXX1BJWFJBTkdFVEhSRVNfTlVNXTsKCiAgICAvLyBDaHJvbWEgRGVub2lzZSBQYXJhbXMKICAgIHVpbnQzMl90ICBkd0hpc3RvcnlJbml0VVY7CiAgICB1aW50MzJfdCAgZHdDaHJvbWFTVEFEVGhyZXNob2xkOwogICAgdWludDMyX3QgIGR3Q2hyb21hTFREVGhyZXNob2xkOwogICAgdWludDMyX3QgIGR3Q2hyb21hVERUaHJlc2hvbGQ7CiAgICBib29sICAgICAgYkNocm9tYURORW5hYmxlOwoKICAgIC8vIEhvdCBQaXhlbCBQYXJhbXMKICAgIHVpbnQzMl90ICBkd0hvdFBpeGVsVGhyZXNob2xkOwogICAgdWludDMyX3QgIGR3SG90UGl4ZWxDb3VudDsKCiAgICAvLyBDTkwgTmV3IERJCiAgICB1aW50MzJfdCAgZHdMdW1hVERNV2VpZ2h0OwogICAgdWludDMyX3QgIGR3Q2hyb21hVERNV2VpZ2h0OwogICAgdWludDMyX3QgIGR3U0hDTURlbHRhOwogICAgdWludDMyX3QgIGR3U0hDTVRocmVzaG9sZDsKICAgIHVpbnQzMl90ICBkd1NWQ01EZWx0YTsKICAgIHVpbnQzMl90ICBkd1NWQ01UaHJlc2hvbGQ7CiAgICBib29sICAgICAgYkZhc3RlckNvbnZlcmdlbmNlOwogICAgYm9vbCAgICAgIGJURE1MdW1hU21hbGxlcldpbmRvdzsKICAgIGJvb2wgICAgICBiVERNQ2hyb21hU21hbGxlcldpbmRvdzsKICAgIHVpbnQzMl90ICBkd0x1bWFURE1Db3JpbmdUaHJlc2hvbGQ7CiAgICB1aW50MzJfdCAgZHdDaHJvbWFURE1Db3JpbmdUaHJlc2hvbGQ7CiAgICBib29sICAgICAgYkJ5cGFzc0RlZmxpY2tlckZpbHRlcjsKICAgIGJvb2wgICAgICBiVXNlU3ludGhldGljQ29udGVudE1lZGlhbjsKICAgIGJvb2wgICAgICBiTG9jYWxDaGVjazsKICAgIGJvb2wgICAgICBiU3ludGhldGljQ29udGVudENoZWNrOwogICAgYm9vbCAgICAgIGJTeW50aGV0aWNGcmFtZTsKICAgIGJvb2wgICAgICBiU0NERW5hYmxlOwogICAgdWludDMyX3QgIGR3RGlyZWN0aW9uQ2hlY2tUaHJlc2hvbGQ7CiAgICB1aW50MzJfdCAgZHdUZWFyaW5nTG93VGhyZXNob2xkOwogICAgdWludDMyX3QgIGR3VGVhcmluZ0hpZ2hUaHJlc2hvbGQ7CiAgICB1aW50MzJfdCAgZHdEaWZmQ2hlY2tTbGFja1RocmVzaG9sZDsKICAgIHVpbnQzMl90ICBkd1NBRFdUMDsKICAgIHVpbnQzMl90ICBkd1NBRFdUMTsKICAgIHVpbnQzMl90ICBkd1NBRFdUMjsKICAgIHVpbnQzMl90ICBkd1NBRFdUMzsKICAgIHVpbnQzMl90ICBkd1NBRFdUNDsKICAgIHVpbnQzMl90ICBkd1NBRFdUNjsKICAgIHVpbnQzMl90ICBkd0xQRld0TFVUMDsKICAgIHVpbnQzMl90ICBkd0xQRld0TFVUMTsKICAgIHVpbnQzMl90ICBkd0xQRld0TFVUMjsKICAgIHVpbnQzMl90ICBkd0xQRld0TFVUMzsKICAgIHVpbnQzMl90ICBkd0xQRld0TFVUNDsKICAgIHVpbnQzMl90ICBkd0xQRld0TFVUNTsKICAgIHVpbnQzMl90ICBkd0xQRld0TFVUNjsKICAgIHVpbnQzMl90ICBkd0xQRld0TFVUNzsKCiAgICAvL2ZvciBTbGltSVBVRGVub2lzZQogICAgdm9pZCAqICAgIHBTeXN0ZW1NZW0gPSBudWxscHRyOwogICAgdWludDMyX3QgIE1lbVNpemVJbkJ5dGVzOwogICAgYm9vbCAgICAgIGJFbmFibGVTbGltSVBVRGVub2lzZTsKCn0gTUhXX1ZFQk9YX0RORElfUEFSQU1TLCAqUE1IV19WRUJPWF9ETkRJX1BBUkFNUzsKCi8vIQovLyEgU3RydWN0dXJlIE1IV19TVEVfUEFSQU1TCi8vISBcYnJpZWYgU1RFIHBhcmFtZXRlcnMgLSBTa2luIFRvbmUgRW5oYW5jZW1lbnQKLy8hCnR5cGVkZWYgc3RydWN0IF9NSFdfU1RFX1BBUkFNUwp7CiAgICB1aW50MzJfdCAgICAgICAgICAgIGR3U1RFRmFjdG9yOwogICAgdWludDMyX3QgICAgICAgICAgICBzYXRQMTsKICAgIHVpbnQzMl90ICAgICAgICAgICAgc2F0UzA7CiAgICB1aW50MzJfdCAgICAgICAgICAgIHNhdFMxOwp9IE1IV19TVEVfUEFSQU1TLCAqUE1IV19TVEVfUEFSQU1TOwoKLy8hCi8vISBTdHJ1Y3R1cmUgTUhXX1RDQ19QQVJBTVMKLy8hIFxicmllZiBUQ0MgcGFyYW1ldGVycyAtIFRvdGFsIENvbG9yIENvbnRyb2wKLy8hCnR5cGVkZWYgc3RydWN0IF9NSFdfVENDX1BBUkFNUwp7CiAgICB1aW50OF90ICAgICAgICAgICAgIFJlZDsKICAgIHVpbnQ4X3QgICAgICAgICAgICAgR3JlZW47CiAgICB1aW50OF90ICAgICAgICAgICAgIEJsdWU7CiAgICB1aW50OF90ICAgICAgICAgICAgIEN5YW47CiAgICB1aW50OF90ICAgICAgICAgICAgIE1hZ2VudGE7CiAgICB1aW50OF90ICAgICAgICAgICAgIFllbGxvdzsKfSBNSFdfVENDX1BBUkFNUywgKlBNSFdfVENDX1BBUkFNUzsKCi8vIQovLyEgU3RydWN0dXJlIE1IV19MQUNFX1BBUkFNUwovLyEgXGJyaWVmIExBQ0UgcGFyYW1ldGVycyAtIExvY2FsIEFkYXB0aXZlIENvbnRyYXN0IEVuaGFuY2VtZW50Ci8vIQp0eXBlZGVmIHN0cnVjdCBfTUhXX0xBQ0VfUEFSQU1TCnsKICAgIGJvb2wgICAgICAgICAgICAgICAgYlNURDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVG8gZW5hYmxlIFNraW4gVG9uZSBTcGVjaWFsIGhhbmRsaW5nCiAgICB1aW50MzJfdCAgICAgICAgICAgIGR3U3RyZW5ndGg7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIExBQ0Ugc3RyZW5ndGgKICAgIHVpbnQxNl90ICAgICAgICAgICAgd01pbkFjZUx1bWE7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWluaW11bSBMdW1hIGZvciB3aGljaCBBQ0UgaGFzIHRvIGJlIGFwcGxpZWQKICAgIHVpbnQxNl90ICAgICAgICAgICAgd01heEFjZUx1bWE7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWF4aW11bSBMdW1hIGZvciB3aGljaCBBQ0UgaGFzIHRvIGJlIGFwcGxpZWQKfSBNSFdfTEFDRV9QQVJBTVMsICpQTUhXX0xBQ0VfUEFSQU1TOwoKLy8hCi8vISBTdHJ1Y3R1cmUgTUhXX0NPTE9SUElQRV9QQVJBTVMKLy8hIFxicmllZiBJRUNQIFBhcmFtZXRlcnMgLSBDb2xvciBQaXBlCi8vIQp0eXBlZGVmIHN0cnVjdCBfTUhXX0NPTE9SUElQRV9QQVJBTVMKewogICAgdWludDMyX3QgICAgICAgICAgICBiQWN0aXZlOyAgICAgICAgICAgICAgICAgICAgLy8hPCBBY3RpdmUgb3Igbm90CiAgICBib29sICAgICAgICAgICAgICAgIGJFbmFibGVBQ0U7CiAgICBib29sICAgICAgICAgICAgICAgIGJFbmFibGVTVEU7CiAgICBib29sICAgICAgICAgICAgICAgIGJFbmFibGVUQ0M7CiAgICBib29sICAgICAgICAgICAgICAgIGJBY2VMZXZlbENoYW5nZWQ7CiAgICB1aW50MzJfdCAgICAgICAgICAgIGR3QWNlTGV2ZWw7CiAgICB1aW50MzJfdCAgICAgICAgICAgIGR3QWNlU3RyZW5ndGg7CiAgICBib29sICAgICAgICAgICAgICAgIGJFbmFibGVMQUNFOwogICAgTUhXX1NURV9QQVJBTVMgICAgICBTdGVQYXJhbXM7CiAgICBNSFdfVENDX1BBUkFNUyAgICAgIFRjY1BhcmFtczsKICAgIE1IV19MQUNFX1BBUkFNUyAgICAgTGFjZVBhcmFtczsKfSBNSFdfQ09MT1JQSVBFX1BBUkFNUywgKlBNSFdfQ09MT1JQSVBFX1BBUkFNUzsKCi8vIQovLyEgXGJyaWVmICBBZGFwdGl2ZSBDb250cmFzdCBFbmhhbmNlbWVudCAoQUNFKSBQYXJhbXMKLy8hCnR5cGVkZWYgc3RydWN0IF9NSFdfQUNFX1BBUkFNUwp7CiAgICB1aW50MzJfdCBiQWN0aXZlOwogICAgdWludDE2X3Qgd0FDRVBXTEZfWFtNSFdfTlVNX0FDRV9QV0xGX0NPRUZGXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgUGllY2Utd2lzZSBsaW5lYXIgZnVuY3Rpb24geAogICAgdWludDE2X3Qgd0FDRVBXTEZfWVtNSFdfTlVNX0FDRV9QV0xGX0NPRUZGXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgUGllY2Utd2lzZSBsaW5lYXIgZnVuY3Rpb24geQogICAgdWludDE2X3Qgd0FDRVBXTEZfU1tNSFdfTlVNX0FDRV9QV0xGX0NPRUZGXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgUGllY2Utd2lzZSBsaW5lYXIgZnVuY3Rpb24gc2xvcGUKICAgIHVpbnQxNl90IHdBQ0VQV0xGX0JbTUhXX05VTV9BQ0VfUFdMRl9DT0VGRl07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIFBpZWNlLXdpc2UgbGluZWFyIGZ1bmN0aW9uIGJpYXMKfSBNSFdfQUNFX1BBUkFNUywgKlBNSFdfQUNFX1BBUkFNUzsKCi8vIQovLyEgU3RydWN0dXJlIE1IV19QUk9DQU1QX1BBUkFNUwovLyEgXGJyaWVmIFByb2NhbXAgcGFyYW1ldGVycwovLyEKdHlwZWRlZiBzdHJ1Y3QgX01IV19QUk9DQU1QX1BBUkFNUwp7CiAgICB1aW50MzJfdCAgICAgICAgICAgIGJBY3RpdmU7ICAgICAgICAgICAgICAgICAgICAvLyE8IEFjdGl2ZSBvciBub3QKICAgIGJvb2wgICAgICAgICAgICAgICAgYkVuYWJsZWQ7CiAgICB1aW50MzJfdCAgICAgICAgICAgIGJyaWdodG5lc3M7CiAgICB1aW50MzJfdCAgICAgICAgICAgIGNvbnRyYXN0OwogICAgdWludDMyX3QgICAgICAgICAgICBzaW5DUzsKICAgIHVpbnQzMl90ICAgICAgICAgICAgY29zQ1M7Cn0gTUhXX1BST0NBTVBfUEFSQU1TLCAqUE1IV19QUk9DQU1QX1BBUkFNUzsKCi8vIQovLyEgU3RydWN0dXJlIE1IV19IT1RQSVhFTF9QQVJBTVMKLy8hIFxicmllZiBIb3RwaXhlbCBQYXJhbWV0ZXJzCi8vIQp0eXBlZGVmIHN0cnVjdCBfTUhXX0hPVFBJWEVMX1BBUkFNUwp7CiAgICB1aW50MzJfdCBiQWN0aXZlOwogICAgdWludDMyX3QgUGl4ZWxUaHJlc2hvbGQ7CiAgICB1aW50MzJfdCBQaXhlbENvdW50Owp9IE1IV19IT1RQSVhFTF9QQVJBTVMsICpQTUhXX0hPVFBJWEVMX1BBUkFNUzsKCi8vIQovLyEgU3RydWN0dXJlIE1IV19WSUdORVRURV9QQVJBTVMKLy8hIFxicmllZiBWaWduZXR0ZSBQYXJhbWV0ZXJzCi8vIQp0eXBlZGVmIHN0cnVjdCBfTUhXX1ZJR05FVFRFX1BBUkFNUwp7CiAgICB1aW50MzJfdCBiQWN0aXZlOwogICAgdWludDMyX3QgV2lkdGg7CiAgICB1aW50MzJfdCBIZWlnaHQ7CiAgICB1aW50MzJfdCBTdHJpZGU7CiAgICB1aW50OF90ICpwQ29ycmVjdGlvbk1hcDsKfSBNSFdfVklHTkVUVEVfUEFSQU1TLCAqUE1IV19WSUdORVRURV9QQVJBTVM7CgovLyEKLy8hIFN0cnVjdHVyZSBNSFdfQkxBQ0tfTEVWRUxfUEFSQU1TCi8vISBcYnJpZWYgQmxhY2sgTGV2ZWwgUGFyYW1ldGVycwovLyEKdHlwZWRlZiBzdHJ1Y3QgX01IV19CTEFDS19MRVZFTF9QQVJBTVMKewogICAgdWludDMyX3QgYkFjdGl2ZTsKICAgIHVpbnQzMl90IFI7CiAgICB1aW50MzJfdCBHMDsKICAgIHVpbnQzMl90IEI7CiAgICB1aW50MzJfdCBHMTsKfSBNSFdfQkxBQ0tfTEVWRUxfUEFSQU1TLCAqUE1IV19CTEFDS19MRVZFTF9QQVJBTVM7CgovLyEKLy8hIFN0cnVjdHVyZSBNSFdfV0JfTU9ERQovLyEgXGJyaWVmIFdCIFBhcmFtZXRlcnMKLy8hCnR5cGVkZWYgZW51bSBfTUhXX1dCX01PREUKewogICAgTUhXX1dCX05PTkUsCiAgICBNSFdfV0JfTUFOVUFMLAogICAgTUhXX1dCX0FVVE9fSU1BR0UsCiAgICBNSFdfV0JfQ09VTlQKfSBNSFdfV0JfTU9ERTsKCi8vIQovLyEgU3RydWN0dXJlIE1IV19XSElURV9CQUxBTkNFX1BBUkFNUwovLyEgXGJyaWVmIFdoaXRlIEJhbGFuY2UgUGFyYW1ldGVycwovLyEKdHlwZWRlZiBzdHJ1Y3QgX01IV19XSElURV9CQUxBTkNFX1BBUkFNUwp7CiAgICB1aW50MzJfdCAgICAgICAgYkFjdGl2ZTsKICAgIE1IV19XQl9NT0RFICAgICBNb2RlOwogICAgZmxvYXQgICAgICAgICAgIFJlZENvcnJlY3Rpb247CiAgICBmbG9hdCAgICAgICAgICAgR3JlZW5Ub3BDb3JyZWN0aW9uOwogICAgZmxvYXQgICAgICAgICAgIEJsdWVDb3JyZWN0aW9uOwogICAgZmxvYXQgICAgICAgICAgIEdyZWVuQm90dG9tQ29ycmVjdGlvbjsKfSBNSFdfV0hJVEVfQkFMQU5DRV9QQVJBTVMsICpQTUhXX1dISVRFX0JBTEFOQ0VfUEFSQU1TOwoKLy8hCi8vISBTdHJ1Y3R1cmUgTUhXX0NPTE9SX0NPUlJFQ1RJT05fUEFSQU1TCi8vISBcYnJpZWYgQ29sb3IgQ29ycmVjdGlvbiBQYXJhbWV0ZXJzCi8vIQp0eXBlZGVmIHN0cnVjdCBfTUhXX0NPTE9SX0NPUlJFQ1RJT05fUEFSQU1TCnsKICAgIHVpbnQzMl90IGJBY3RpdmU7CiAgICBmbG9hdCAgIENDTVszXVszXTsKfSBNSFdfQ09MT1JfQ09SUkVDVElPTl9QQVJBTVMsICpQTUhXX0NPTE9SX0NPUlJFQ1RJT05fUEFSQU1TOwoKLy8hCi8vISBTdHJ1Y3R1cmUgTUhXX0ZPUldBUkRfR0FNTUFfU0VHCi8vISBcYnJpZWYgRm9yd2FyZCBHYW1tYSAgU0VHIFBhcmFtZXRlcnMKLy8hCnR5cGVkZWYgc3RydWN0IF9NSFdfRk9SV0FSRF9HQU1NQV9TRUcKewogICAgdWludDE2X3QgUGl4ZWxWYWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyE8IFNLTCsgVTE2ICAgICBSYW5nZT1bMCwgNjU1MzVdCiAgICB1aW50MTZfdCBSZWRDaGFubmVsQ29ycmVjdGVkVmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vITwgU0tMKyBVMTYgICAgIFJhbmdlPVswLCA2NTUzNV0KICAgIHVpbnQxNl90IEdyZWVuQ2hhbm5lbENvcnJlY3RlZFZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8hPCBTS0wrIFUxNiAgICAgUmFuZ2U9WzAsIDY1NTM1XQogICAgdWludDE2X3QgQmx1ZUNoYW5uZWxDb3JyZWN0ZWRWYWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyE8IFNLTCsgVTE2ICAgICBSYW5nZT1bMCwgNjU1MzVdCn0gTUhXX0ZPUldBUkRfR0FNTUFfU0VHLCAqUE1IV19GT1JXQVJEX0dBTU1BX1NFRzsKCi8vIQovLyEgU3RydWN0dXJlIE1IV19GV0RfR0FNTUFfUEFSQU1TCi8vISBcYnJpZWYgRm9yd2FyZCBHYW1tYSBQYXJhbWV0ZXJzCi8vIQp0eXBlZGVmIHN0cnVjdCBfTUhXX0ZXRF9HQU1NQV9QQVJBTVMKewogICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgIGJBY3RpdmU7CiAgICBNSFdfRk9SV0FSRF9HQU1NQV9TRUcgICAgICAgU2VnbWVudFtNSFdfRk9SV0FSRF9HQU1NQV9TRUdNRU5UX0NPVU5UXTsKfSBNSFdfRldEX0dBTU1BX1BBUkFNUywgKlBNSFdfRldEX0dBTU1BX1BBUkFNUzsKCi8vIQovLyEgU3RydWN0dXJlIE1IV19GRUNTQ19QQVJBTVMKLy8hIFxicmllZiBGcm9udCBFbmQgQ1NDIFBhcmFtZXRlcnMKLy8hCnR5cGVkZWYgc3RydWN0IF9NSFdfRkVDU0NfUEFSQU1TCnsKICAgIHVpbnQzMl90IGJBY3RpdmU7CiAgICBmbG9hdCAgIFByZU9mZnNldFszXTsKICAgIGZsb2F0ICAgTWF0cml4WzNdWzNdOwogICAgZmxvYXQgICBQb3N0T2Zmc2V0WzNdOwp9IE1IV19GRUNTQ19QQVJBTVMsICpQTUhXX0ZFQ1NDX1BBUkFNUzsKCi8vIQovLyEgU3RydWN0dXJlIE1IV19CRUNTQ19QQVJBTVMKLy8hIFxicmllZiBCYWNrIEVuZCBDU0MgUGFyYW1ldGVycwovLyEKdHlwZWRlZiBzdHJ1Y3QgX01IV19CRUNTQ19QQVJBTVMKewogICAgdWludDMyX3QgYkFjdGl2ZTsKICAgIGZsb2F0ICAgUHJlT2Zmc2V0WzNdOwogICAgZmxvYXQgICBNYXRyaXhbM11bM107CiAgICBmbG9hdCAgIFBvc3RPZmZzZXRbM107Cn0gTUhXX0JFQ1NDX1BBUkFNUywgKlBNSFdfQkVDU0NfUEFSQU1TOwoKLy8hCi8vISBTdHJ1Y3R1cmUgTUhXX0xHQ0FfUEFSQU1TCi8vISBcYnJpZWYgIEdlb21ldHJpYyBMZW5zIENvcnJlY3Rpb24gYW5kIENob3JtYSBBYmVycmF0aW9uICBwYXJhbWV0ZXJzCi8vIQp0eXBlZGVmIHN0cnVjdCBfTUhXX0xFTlNfQ09SUkVDVElPTl9QQVJBTVMKewogICAgdWludDMyX3QgYkFjdGl2ZTsgICAgICAgICAgICAgICAgICAgIC8vITwgQWN0aXZlIG9yIG5vdAogICAgZmxvYXQgICBhWzNdOyAgICAgICAgICAgICAgICAgICAgICAgLy8hPCBBcnJheSAocmVkLCBncmVlbiwgYmx1ZSkgb2YgdmFsdWVzIGZvciAiYSIKICAgIGZsb2F0ICAgYlszXTsgICAgICAgICAgICAgICAgICAgICAgIC8vITwgQXJyYXkgKHJlZCwgZ3JlZW4sIGJsdWUpIG9mIHZhbHVlcyBmb3IgImIiCiAgICBmbG9hdCAgIGNbM107ICAgICAgICAgICAgICAgICAgICAgICAvLyE8IEFycmF5IChyZWQsIGdyZWVuLCBibHVlKSBvZiB2YWx1ZXMgZm9yICJjIgogICAgZmxvYXQgICBkWzNdOyAgICAgICAgICAgICAgICAgICAgICAgLy8hPCBBcnJheSAocmVkLCBncmVlbiwgYmx1ZSkgb2YgdmFsdWVzIGZvciAiZCIKfSBNSFdfTEVOU19DT1JSRUNUSU9OX1BBUkFNUywgKlBNSFdfTEVOU19DT1JSRUNUSU9OX1BBUkFNUzsKCi8vIQovLyEgU3RydWN0dXJlIE1IV19JQ0NfQ09MT1JfQ09OVkVSU0lPTl9QQVJBTVMKLy8hIFxicmllZiAgSUNDIENvbG9yIENvbnZlcnNpb24KLy8hCnR5cGVkZWYgc3RydWN0IF9NSFdfSUNDX0NPTE9SX0NPTlZFUlNJT05fUEFSQU1TCnsKICAgIHVpbnQzMl90IGJBY3RpdmU7ICAgICAgICAgICAgICAgICAgICAvLyE8IEFjdGl2ZSBvciBub3QKICAgIHVpbnQzMl90IExVVFNpemU7ICAgICAgICAgICAgICAgICAgICAvLyE8IFNpemUgKG9uZSBkaW1lbnNpb25zKSBvZiB0aGUgTFVUCiAgICB1aW50MzJfdCBMVVRMZW5ndGg7ICAgICAgICAgICAgICAgICAgLy8hPCBMZW5ndGggb2YgdGhlIExVVCwgaW4gdW5pdCBvZiBiaXQKICAgIHVpbnQ4X3QgKnBMVVQ7ICAgICAgICAgICAgICAgICAgICAgICAvLyE8IFBvaW50ZXIgdG8gdGhlIExVVCB2YWx1ZQp9IE1IV19JQ0NfQ09MT1JfQ09OVkVSU0lPTl9QQVJBTVMsICpQTUhXX0lDQ19DT0xPUl9DT05WRVJTSU9OX1BBUkFNUzsKCnR5cGVkZWYgc3RydWN0IF9NSFdfREVCQVlFUl9QQVJBTVMKewogICAgdWludDMyX3QgQmF5ZXJJbnB1dDsgICAgICAgICAgICAgICAgICAvLyE8IDAgliBNU0IgKGRlZmF1bHQpOyAxIJYgTFNCCiAgICB1aW50MzJfdCBMU0JCYXllckJpdERlcHRoOyAgICAgICAgICAgIC8vITwgMTAsIDEyIG9yIDE0IGZvciB2YXJpZXMgYmF5ZXIgaW5wdXQKfSBNSFdfREVCQVlFUl9QQVJBTVMsICpQTUhXX0RFQkFZRVJfUEFSQU1TOwoKLy8hCi8vISBTdHJ1Y3R1cmUgTUhXX0NBUFBJUEVfUEFSQU1TCi8vISBcYnJpZWYgQ2FwdHVyZSBQaXBlIFBhcmFtZXRlcnMKLy8hCnR5cGVkZWYgc3RydWN0IF9NSFdfQ0FQUElQRV9QQVJBTVMKewogICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICBiQWN0aXZlOwogICAgTUhXX0hPVFBJWEVMX1BBUkFNUyAgICAgICAgICAgICBIb3RQaXhlbFBhcmFtczsKICAgIE1IV19WSUdORVRURV9QQVJBTVMgICAgICAgICAgICAgVmlnbmV0dGVQYXJhbXM7CiAgICBNSFdfQkxBQ0tfTEVWRUxfUEFSQU1TICAgICAgICAgIEJsYWNrTGV2ZWxQYXJhbXM7CiAgICBNSFdfV0hJVEVfQkFMQU5DRV9QQVJBTVMgICAgICAgIFdoaXRlQmFsYW5jZVBhcmFtczsKICAgIE1IV19DT0xPUl9DT1JSRUNUSU9OX1BBUkFNUyAgICAgQ29sb3JDb3JyZWN0aW9uUGFyYW1zOwogICAgTUhXX0ZXRF9HQU1NQV9QQVJBTVMgICAgICAgICAgICBGd2RHYW1tYVBhcmFtczsKICAgIE1IV19GRUNTQ19QQVJBTVMgICAgICAgICAgICAgICAgRkVDU0NQYXJhbXM7CiAgICBNSFdfQkVDU0NfUEFSQU1TICAgICAgICAgICAgICAgIEJFQ1NDUGFyYW1zOwogICAgTUhXX0xFTlNfQ09SUkVDVElPTl9QQVJBTVMgICAgICBMZW5zQ29ycmVjdGlvblBhcmFtczsKICAgIE1IV19JQ0NfQ09MT1JfQ09OVkVSU0lPTl9QQVJBTVMgSUNDQ29sb3JDb252ZXJzaW9uUGFyYW1zOwogICAgTUhXX0RFQkFZRVJfUEFSQU1TICAgICAgICAgICAgICBEZWJheWVyUGFyYW1zOwp9IE1IV19DQVBQSVBFX1BBUkFNUywgKlBNSFdfQ0FQUElQRV9QQVJBTVM7CgovLyEKLy8hIFN0cnVjdHVyZSBNSFdfM0RMVVRfUEFSQU1TCi8vISBcZGV0YWlscyBObyBwcmUtc2kgdmVyc2lvbiBmb3IgTUhXX1ZFQk9YX0lFQ1BfUEFSQU1TLCBqdXN0IGxlYXZlIGl0IG5vdyBhbmQgaGFuZGxlIGl0IGxhdGVyCi8vIQp0eXBlZGVmIHN0cnVjdCBfTUhXXzNETFVUX1BBUkFNUwp7CiAgICB1aW50MzJfdCBiQWN0aXZlOyAgICAgICAgICAgICAgICAgICAgLy8hPCBBY3RpdmUgb3Igbm90CiAgICB1aW50MzJfdCBMVVRTaXplOyAgICAgICAgICAgICAgICAgICAgLy8hPCBTaXplIChvbmUgZGltZW5zaW9ucykgb2YgdGhlIExVVAogICAgdWludDMyX3QgTFVUTGVuZ3RoOyAgICAgICAgICAgICAgICAgIC8vITwgTGVuZ3RoIG9mIHRoZSBMVVQsIGluIHVuaXQgb2YgYml0CiAgICB1aW50OF90ICpwTFVUOyAgICAgICAgICAgICAgICAgICAgICAgLy8hPCBQb2ludGVyIHRvIHRoZSBMVVQgdmFsdWUKfSBNSFdfM0RMVVRfUEFSQU1TLCAqUE1IV18zRExVVF9QQVJBTVM7CgovLyEKLy8hIFxicmllZiAgVkVCT1ggSERSIFBBUkFNUwovLyEgXGRldGFpbHMgRm9yIENDTSBzZXR0aW5ncywgbW92ZSAxREx1dCB0byBoZXJlIGxhdGVyCnR5cGVkZWYgc3RydWN0IF9NSFdfMURMVVRfUEFSQU1TCnsKICAgIHVpbnQzMl90IGJBY3RpdmU7CiAgICB2b2lkICAgICAqcDFETFVUOwogICAgdWludDMyX3QgTFVUU2l6ZTsKICAgIGludDMyX3QgKnBDQ007CiAgICB1aW50MzJfdCBDQ01TaXplOwp9IE1IV18xRExVVF9QQVJBTVMsICpQTUhXXzFETFVUX1BBUkFNUzsKCi8vIQovLyEgXGJyaWVmICBWRUJPWCBJRUNQIHBhcmFtZXRlcnMKLy8hCnR5cGVkZWYgc3RydWN0IF9NSFdfVkVCT1hfSUVDUF9QQVJBTVMKewogICAgTUhXX0NPTE9SUElQRV9QQVJBTVMgICAgICAgICAgICBDb2xvclBpcGVQYXJhbXM7CiAgICBNSFdfQUNFX1BBUkFNUyAgICAgICAgICAgICAgICAgIEFjZVBhcmFtczsKICAgIE1IV19QUk9DQU1QX1BBUkFNUyAgICAgICAgICAgICAgUHJvY0FtcFBhcmFtczsKICAgIE1IV19DQVBQSVBFX1BBUkFNUyAgICAgICAgICAgICAgQ2FwUGlwZVBhcmFtczsKICAgIE1PU19GT1JNQVQgICAgICAgICAgICAgICAgICAgICAgZHN0Rm9ybWF0OwogICAgTU9TX0ZPUk1BVCAgICAgICAgICAgICAgICAgICAgICBzcmNGb3JtYXQ7CiAgICBNSFdfQ1NQQUNFICAgICAgICAgICAgICAgICAgICAgIENvbG9yU3BhY2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29sb3JTcGFjZSBvZiB0aGUgaW5wdXQgc3VyZmFjZQoKICAgIC8vIENTQyBwYXJhbXMKICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkNTQ0VuYWJsZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFbmFibGUgQ1NDIHRyYW5zZm9ybQogICAgZmxvYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAqcGZDc2NDb2VmZjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBbM3gzXSBDU0MgQ29lZmYgbWF0cml4CiAgICBmbG9hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICpwZkNzY0luT2Zmc2V0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFszeDFdIENTQyBJbnB1dCBPZmZzZXQgbWF0cml4CiAgICBmbG9hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICpwZkNzY091dE9mZnNldDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFszeDFdIENTQyBPdXRwdXQgT2Zmc2V0IG1hdHJpeAogICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQWxwaGFFbmFibGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFscGhhIEVuYWJsZSBQYXJhbQogICAgdWludDE2X3QgICAgICAgICAgICAgICAgICAgICAgICB3QWxwaGFWYWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvbG9yIFBpcGUgQWxwaGEgVmFsdWUKCiAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJBY2U7CgogICAgTUhXXzNETFVUX1BBUkFNUyAgICAgICAgICAgICAgICBzM0RMdXRQYXJhbXM7CiAgICBNSFdfMURMVVRfUEFSQU1TICAgICAgICAgICAgICAgIHMxREx1dFBhcmFtczsKfSBNSFdfVkVCT1hfSUVDUF9QQVJBTVMsICpQTUhXX1ZFQk9YX0lFQ1BfUEFSQU1TOwoKLy8hCi8vISBcYnJpZWYgIFZFQk9YIENIX0RJUl9GSUxURVJfQ09FRkZJQ0lFTlQgcGFyYW1ldGVycwovLyEKdHlwZWRlZiBzdHJ1Y3QgX01IV19WRUJPWF9DSF9ESVJfRklMVEVSX0NPRUZGSUNJRU5UCnsKICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgRmlsdGVyQ29lZmZpY2llbnQwOwogICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICBGaWx0ZXJDb2VmZmljaWVudDE7CiAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgIEZpbHRlckNvZWZmaWNpZW50MjsKICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgRmlsdGVyQ29lZmZpY2llbnQzOwogICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICBGaWx0ZXJDb2VmZmljaWVudDQ7CiAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgIEZpbHRlckNvZWZmaWNpZW50NTsKICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgRmlsdGVyQ29lZmZpY2llbnQ2OwogICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICBGaWx0ZXJDb2VmZmljaWVudDc7Cn0gTUhXX1ZFQk9YX0NIX0RJUl9GSUxURVJfQ09FRkZJQ0lFTlQsICpQTUhXX1ZFQk9YX0NIX0RJUl9GSUxURVJfQ09FRkZJQ0lFTlQ7CgovLyEKLy8hIFxicmllZiAgVkVCT1ggU2NhbGFyIHBhcmFtZXRlcnMKLy8hCnR5cGVkZWYgc3RydWN0IF9NSFdfVkVCT1hfU0NBTEFSX1BBUkFNUwp7CiAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkRpc2FibGVDaHJvbWFDaGFubmVsRGlhZ29uYWxJbnRlcnBvbGF0aW9uOwogICAgTUhXX1ZFQk9YX0NIX0RJUl9GSUxURVJfQ09FRkZJQ0lFTlQgICAgIFVWQ2hDb2VmZmljaWVudDA7CiAgICBNSFdfVkVCT1hfQ0hfRElSX0ZJTFRFUl9DT0VGRklDSUVOVCAgICAgVVZDaENvZWZmaWNpZW50MTsKICAgIE1IV19WRUJPWF9DSF9ESVJfRklMVEVSX0NPRUZGSUNJRU5UICAgICBVVkNoQ29lZmZpY2llbnQyOwogICAgTUhXX1ZFQk9YX0NIX0RJUl9GSUxURVJfQ09FRkZJQ0lFTlQgICAgIFVWQ2hDb2VmZmljaWVudDM7CiAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdTQURXVDA7CiAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdTQURXVDE7CiAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdTQURXVDI7CiAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdTQURXVDM7CiAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdTQURXVDQ7CiAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdTQURXVDU7Cn0gTUhXX1ZFQk9YX1NDQUxBUl9QQVJBTVMsICpQTUhXX1ZFQk9YX1NDQUxBUl9QQVJBTVM7CgovLyEKLy8hIFxicmllZiAgVkVCT1ggR2FtdXQgcGFyYW1ldGVycwovLyEKdHlwZWRlZiBzdHJ1Y3QgX01IV19WRUJPWF9HQU1VVF9QQVJBTVMKewogICAgTUhXX0NTUEFDRSAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sb3JTcGFjZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvbG9yU3BhY2Ugb2YgdGhlIGlucHV0IHN1cmZhY2UKICAgIE1IV19DU1BBQ0UgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdENvbG9yU3BhY2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDb2xvclNwYWNlIG9mIHRoZSBvdXRwdXQgc3VyZmFjZQogICAgTU9TX0ZPUk1BVCAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjRm9ybWF0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElucHV0IHN1cmZhY2UgZm9ybWF0CiAgICBNT1NfRk9STUFUICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RGb3JtYXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3V0cHV0IHN1cmZhY2UgZm9ybWF0CiAgICAvLyBHQ29tcAogICAgTUhXX0dBTVVUX01PREUgICAgICAgICAgICAgICAgICAgICAgR0NvbXBNb2RlOwogICAgLy8gQmFzaWMgbW9kZSBwYXJhbXMKICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdDb21wQmFzaWNNb2RlOwogICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaUJhc2ljTW9kZVNjYWxpbmdGYWN0b3I7CiAgICAvLyBBZHZhbmNlZCBtb2RlIHBhcmFtcwogICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaURpbjsKICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlEaW5EZWZhdWx0OwogICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaURvdXQ7CiAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpRG91dERlZmF1bHQ7CgogICAgLy8gR0V4cAogICAgTUhXX0dBTVVUX01PREUgICAgICAgICAgICAgICAgICAgICAgR0V4cE1vZGU7CiAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcEZ3ZEdhbW1hQmlhczsKICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwSW52R2FtbWFCaWFzOwogICAgZmxvYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBmQ3NjQ29lZmY7ICAgICAgICAgLy8gWzN4M10gQ1NDIENvZWZmIG1hdHJpeAogICAgZmxvYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBmQ3NjSW5PZmZzZXQ7ICAgICAgLy8gWzN4MV0gQ1NDIElucHV0IE9mZnNldCBtYXRyaXgKICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwZkNzY091dE9mZnNldDsgICAgIC8vIFszeDFdIENTQyBPdXRwdXQgT2Zmc2V0IG1hdHJpeAogICAgZmxvYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBmRmVDc2NDb2VmZjsgICAgICAgLy8gWzN4M10gRnJvbnQtZW5kIENTQyBDb2VmZiBtYXRyaXgKICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwZkZlQ3NjSW5PZmZzZXQ7ICAgIC8vIFszeDFdIEZyb250LWVuZCBDU0MgSW5wdXQgT2Zmc2V0IG1hdHJpeAogICAgZmxvYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBmRmVDc2NPdXRPZmZzZXQ7ICAgLy8gWzN4MV0gRnJvbnQtZW5kIENTQyBPdXRwdXQgT2Zmc2V0IG1hdHJpeAogICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0cml4WzNdWzNdOwoKICAgIC8vIEdhbW1hIGNvcnJlY3Rpb24KICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJHYW1tYUNvcnI7CiAgICBNSFdfR0FNTUFfVkFMVUUgICAgICAgICAgICAgICAgICAgICBJbnB1dEdhbW1hVmFsdWU7CiAgICBNSFdfR0FNTUFfVkFMVUUgICAgICAgICAgICAgICAgICAgICBPdXRwdXRHYW1tYVZhbHVlOwoKICAgIC8vIEhEUgogICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkgyUzsKICAgIHVpbnQxNl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpTWF4Q0xMOwp9IE1IV19WRUJPWF9HQU1VVF9QQVJBTVMsICpQTUhXX1ZFQk9YX0dBTVVUX1BBUkFNUzsKCi8vIQovLyEgXGJyaWVmICBTdHJ1Y3R1cmUgdG8gaGFuZGxlIFZFQk9YX0RJX0lFQ1BfQ01EIENvbW1hbmQKLy8hCnR5cGVkZWYgc3RydWN0IF9NSFdfVkVCT1hfRElfSUVDUF9DTURfUEFSQU1TCnsKICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR3RW5kaW5nWDsKICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR3U3RhcnRpbmdYOwogICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdFbmRpbmdZOwogICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdTdGFydGluZ1k7CiAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBkd0N1cnJJbnB1dFN1cmZPZmZzZXQ7CiAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBkd1ByZXZJbnB1dFN1cmZPZmZzZXQ7CiAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBkd0N1cnJPdXRwdXRTdXJmT2Zmc2V0OwogICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdTdHJlYW1JRDsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3RyZWFtIElEIGZvciBpbnB1dCBzdXJmYWNlCiAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICBkd1N0cmVhbUlET3V0cHV0OyAgICAgICAgICAgICAgICAgICAvLyBTdHJlYW0gSUQgZm9yIG91dHB1dCBzdXJmYWNlCgogICAgUE1PU19SRVNPVVJDRSAgICAgICAgICAgICAgICAgICAgICAgcE9zUmVzQ3VycklucHV0OwogICAgUE1PU19SRVNPVVJDRSAgICAgICAgICAgICAgICAgICAgICAgcE9zUmVzUHJldklucHV0OwogICAgUE1PU19SRVNPVVJDRSAgICAgICAgICAgICAgICAgICAgICAgcE9zUmVzU3RtbUlucHV0OwogICAgUE1PU19SRVNPVVJDRSAgICAgICAgICAgICAgICAgICAgICAgcE9zUmVzU3RtbU91dHB1dDsKICAgIFBNT1NfUkVTT1VSQ0UgICAgICAgICAgICAgICAgICAgICAgIHBPc1Jlc0Rlbm9pc2VkQ3Vyck91dHB1dDsKICAgIFBNT1NfUkVTT1VSQ0UgICAgICAgICAgICAgICAgICAgICAgIHBPc1Jlc0N1cnJPdXRwdXQ7CiAgICBQTU9TX1JFU09VUkNFICAgICAgICAgICAgICAgICAgICAgICBwT3NSZXNQcmV2T3V0cHV0OwogICAgUE1PU19SRVNPVVJDRSAgICAgICAgICAgICAgICAgICAgICAgcE9zUmVzU3RhdGlzdGljc091dHB1dDsKICAgIFBNT1NfUkVTT1VSQ0UgICAgICAgICAgICAgICAgICAgICAgIHBPc1Jlc0FscGhhT3JWaWduZXR0ZTsKICAgIFBNT1NfUkVTT1VSQ0UgICAgICAgICAgICAgICAgICAgICAgIHBPc1Jlc0xhY2VPckFjZU9yUmdiSGlzdG9ncmFtOwogICAgUE1PU19SRVNPVVJDRSAgICAgICAgICAgICAgICAgICAgICAgcE9zUmVzU2tpblNjb3JlU3VyZmFjZTsKCiAgICBNSFdfTUVNT1JZX09CSkVDVF9DT05UUk9MX1BBUkFNUyAgICBDdXJySW5wdXRTdXJmQ3RybDsvL2NhbiBiZSByZW1vdmVkIGFmdGVyIFZQSEFMIG1vdmluZyB0byBuZXcgY21kIGRlZmluaXRpb24KICAgIE1IV19NRU1PUllfT0JKRUNUX0NPTlRST0xfUEFSQU1TICAgIFByZXZJbnB1dFN1cmZDdHJsOwogICAgTUhXX01FTU9SWV9PQkpFQ1RfQ09OVFJPTF9QQVJBTVMgICAgU3RtbUlucHV0U3VyZkN0cmw7CiAgICBNSFdfTUVNT1JZX09CSkVDVF9DT05UUk9MX1BBUkFNUyAgICBTdG1tT3V0cHV0U3VyZkN0cmw7CiAgICBNSFdfTUVNT1JZX09CSkVDVF9DT05UUk9MX1BBUkFNUyAgICBEZW5vaXNlZEN1cnJPdXRwdXRTdXJmQ3RybDsKICAgIE1IV19NRU1PUllfT0JKRUNUX0NPTlRST0xfUEFSQU1TICAgIEN1cnJPdXRwdXRTdXJmQ3RybDsKICAgIE1IV19NRU1PUllfT0JKRUNUX0NPTlRST0xfUEFSQU1TICAgIFByZXZPdXRwdXRTdXJmQ3RybDsKICAgIE1IV19NRU1PUllfT0JKRUNUX0NPTlRST0xfUEFSQU1TICAgIFN0YXRpc3RpY3NPdXRwdXRTdXJmQ3RybDsKICAgIE1IV19NRU1PUllfT0JKRUNUX0NPTlRST0xfUEFSQU1TICAgIEFscGhhT3JWaWduZXR0ZVN1cmZDdHJsOwogICAgTUhXX01FTU9SWV9PQkpFQ1RfQ09OVFJPTF9QQVJBTVMgICAgTGFjZU9yQWNlT3JSZ2JIaXN0b2dyYW1TdXJmQ3RybDsKICAgIE1IV19NRU1PUllfT0JKRUNUX0NPTlRST0xfUEFSQU1TICAgIFNraW5TY29yZVN1cmZhY2VTdXJmQ3RybDsKCiAgICBNT1NfTUVNQ09NUF9TVEFURSAgICAgICAgICAgICAgICAgICBDdXJJbnB1dFN1cmZNTUNTdGF0ZTsKfSBNSFdfVkVCT1hfRElfSUVDUF9DTURfUEFSQU1TLCAqUE1IV19WRUJPWF9ESV9JRUNQX0NNRF9QQVJBTVM7CgovLyEKLy8hIFxicmllZiAgU3RydWN0dXJlIHRvIFZFQk9YIFNVUkZBQ0UgUEFSQU1FVEVSUyBmb3IgVkVCT1hfU1VSRkFDRV9TVEFURV9DTUQgQ29tbWFuZAovLyEKdHlwZWRlZiBzdHJ1Y3QgX01IV19WRUJPWF9TVVJGQUNFX1BBUkFNUwp7CiAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgYkFjdGl2ZTsKICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICBiSXNDb21wcmVzc2VkOwogICAgTU9TX0ZPUk1BVCAgICAgICAgICAgICAgICAgIEZvcm1hdDsgICAgICAgICAgICAgIC8vITwgIFN1cmZhY2UgZm9ybWF0CiAgICBNT1NfUkVTT1VSQ0VfTU1DX01PREUgICAgICAgQ29tcHJlc3Npb25Nb2RlOyAgICAgLy8hPCAgU3VyZmFjZSBDb21wcmVzc2lvbiBNb2RlCiAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgZHdDb21wcmVzc2lvbkZvcm1hdDsgLy8hPCAgU3VyZmFjZSBDb21wcmVzc2lvbiBGb3JtYXQKICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICBkd1dpZHRoOyAgICAgICAgICAgICAvLyE8ICBTdXJmYWNlIHdpZHRoCiAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgZHdIZWlnaHQ7ICAgICAgICAgICAgLy8hPCAgU3VyZmFjZSBoZWlnaHQKICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICBkd1BpdGNoOyAgICAgICAgICAgICAvLyE8ICBTdXJmYWNlIHBpdGNoCiAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgZHdCaXREZXB0aDsgICAgICAgICAgLy8hPCAgU3VyZmFjZSBiaXRkZXB0aAogICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgIGR3U3RyZWFtSUQ7ICAgICAgICAgIC8vITwgIFN1cmZhY2UgU3RyZWFtSUQKICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICBkd1lvZmZzZXQ7ICAgICAgICAgICAvLyE8ICBTdXJmYWNlIFlvZmZzZXQgaW4gVmVydGljYWwKICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICBkd1VZb2Zmc2V0OyAgICAgICAgICAvLyE8ICBTdXJmYWNlIFVvZmZzZXQgaW4gVmVydGljYWwKICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICBkd09mZnNldDsgICAgICAgICAgICAvLyE8ICBTdXJmYWNlIE9mZnNldCBmcm9tIFN0YXJ0IFBvaW50CiAgICBNT1NfVElMRV9UWVBFICAgICAgICAgICAgICAgVGlsZVR5cGU7ICAgICAgICAgICAgLy8hPCAgVGlsZSBUeXBlCiAgICBNT1NfVElMRV9NT0RFX0dNTSAgICAgICAgICAgVGlsZU1vZGVHTU07ICAgICAgICAgLy8hPCAgVGlsZSBNb2RlIGZyb20gR01NIERlZmluaXRpb24KICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICBiR01NVGlsZUVuYWJsZWQ7ICAgICAvLyE8ICBHTU0gZGVmaW5lZCB0aWxlIG1vZGUgZmxhZwogICAgUkVDVCAgICAgICAgICAgICAgICAgICAgICAgIHJjU3JjID0gezAsIDAsIDAsIDB9OyAgLy8hPCBTb3VyY2UgcmVjdGFuZ2xlCiAgICBSRUNUICAgICAgICAgICAgICAgICAgICAgICAgcmNNYXhTcmM7ICAgICAgICAgICAgLy8hPCBNYXggc291cmNlIHJlY3RhbmdsZQogICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgIGJWRUJPWENyb3BwaW5nVXNlZCA9IGZhbHNlOyAgLy8hPFZlYm94IGNyb3AgY2FzZSBuZWVkIHVzZSByY1NyYyBhcyB2ZWJveCBpbnB1dC4KICAgIFBNT1NfUkVTT1VSQ0UgICAgICAgICAgICAgICBwT3NSZXNvdXJjZTsgICAgICAgICAvLyE8ICBTdXJmYWNlIHJlc291cmNlCn0gTUhXX1ZFQk9YX1NVUkZBQ0VfUEFSQU1TLCAqUE1IV19WRUJPWF9TVVJGQUNFX1BBUkFNUzsKCi8vIQovLyEgXGJyaWVmICBTdHJ1Y3R1cmUgdG8gaGFuZGxlIFZFQk9YX1NVUkZBQ0VfU1RBVEVfQ01EIENvbW1hbmQKLy8hCnR5cGVkZWYgc3RydWN0IF9NSFdfVkVCT1hfU1VSRkFDRV9TVEFURV9DTURfUEFSQU1TCnsKICAgIE1IV19WRUJPWF9TVVJGQUNFX1BBUkFNUyAgICAgICAgIFN1cmZJbnB1dDsKICAgIE1IV19WRUJPWF9TVVJGQUNFX1BBUkFNUyAgICAgICAgIFN1cmZPdXRwdXQ7CiAgICBNSFdfVkVCT1hfU1VSRkFDRV9QQVJBTVMgICAgICAgICBTdXJmU1RNTTsKICAgIE1IV19WRUJPWF9TVVJGQUNFX1BBUkFNUyAgICAgICAgIFN1cmZETk91dHB1dDsKICAgIE1IV19WRUJPWF9TVVJGQUNFX1BBUkFNUyAgICAgICAgIFN1cmZTa2luU2NvcmVPdXRwdXQ7CiAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRElFbmFibGU7CiAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiM0RsdXRFbmFibGU7CiAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiT3V0cHV0VmFsaWQ7Cn0gTUhXX1ZFQk9YX1NVUkZBQ0VfU1RBVEVfQ01EX1BBUkFNUywgKlBNSFdfVkVCT1hfU1VSRkFDRV9TVEFURV9DTURfUEFSQU1TOwoKLy8hCi8vISBcYnJpZWYgIFZFQk9YIGlucHV0IHN1cmZhY2UgY29udHJvbCBiaXRzIHBhcmFtcwovLyEKdHlwZWRlZiBzdHJ1Y3QgX01IV19WRUJPWF9TVVJGQUNFX0NOVExfUEFSQU1TCnsKICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgYklzQ29tcHJlc3NlZDsKICAgIE1PU19SRVNPVVJDRV9NTUNfTU9ERSAgICAgICAgICAgQ29tcHJlc3Npb25Nb2RlOwp9IE1IV19WRUJPWF9TVVJGQUNFX0NOVExfUEFSQU1TLCAqUE1IV19WRUJPWF9TVVJGQUNFX0NOVExfUEFSQU1TOwoKLy8hCi8vISBcYnJpZWYgIFZFQk9YIEhlYXAgU3RhdGUgU3RydWN0dXJlCi8vIQp0eXBlZGVmIHN0cnVjdCBfTUhXX1ZFQk9YX0hFQVBfU1RBVEUKewogICAgYm9vbCAgICAgICAgYkJ1c3k7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cnVlIGlmIHRoZSBzdGF0ZSBpcyBpbiB1c2UgKG11c3Qgc3luYyBiZWZvcmUgdXNlKQogICAgdWludDMyX3QgICAgZHdTeW5jVGFnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBWZWJveCBoZWFwIHN0YXRlIHN5bmMgdGFnCn0gTUhXX1ZFQk9YX0hFQVBfU1RBVEUsICpQTUhXX1ZFQk9YX0hFQVBfU1RBVEU7CgovLyEKLy8hIFxicmllZiAgVkVCT1ggSGVhcCBTdHJ1Y3R1cmUKLy8hCnR5cGVkZWYgc3RydWN0IF9NSFdfVkVCT1hfSEVBUAp7CiAgICB1aW50MzJfdCAgICAgICAgICAgICAgICB1aUN1clN0YXRlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ3VycmVudCBWRUJPWCBTdGF0ZQogICAgdWludDMyX3QgICAgICAgICAgICAgICAgdWlOZXh0U3RhdGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5leHQgVkVCT1ggU3RhdGUKICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIHVpT2Zmc2V0U3luYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPZmZzZXQgb2Ygc3luYyBkYXRhIGluIFZlYm94SGVhcAogICAgdWludDMyX3QgICAgICAgICAgICAgICAgdWlEbmRpU3RhdGVPZmZzZXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEROREkgb3IgU2NhbGFyIHN0YXRlIG9mZnNldAogICAgdWludDMyX3QgICAgICAgICAgICAgICAgdWlJZWNwU3RhdGVPZmZzZXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElFQ1Agc3RhdGUgb2Zmc2V0CiAgICB1aW50MzJfdCAgICAgICAgICAgICAgICB1aUdhbXV0U3RhdGVPZmZzZXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gR2FtdXQgc3RhdGUgb2Zmc2V0CiAgICB1aW50MzJfdCAgICAgICAgICAgICAgICB1aVZlcnRleFRhYmxlT2Zmc2V0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVmVydGV4IFRhYmxlIG9mZnNldAogICAgdWludDMyX3QgICAgICAgICAgICAgICAgdWlDYXB0dXJlUGlwZVN0YXRlT2Zmc2V0OyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENhcHR1cmUgUGlwZSBzdGF0ZSBvZmZzZXQKICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIHVpR2FtbWFDb3JyZWN0aW9uU3RhdGVPZmZzZXQ7ICAgICAgICAgICAgICAgICAgICAgICAvLyBHYW1tYSBDb3JyZWN0aW9uIHN0YXRlIG9mZnNldAogICAgdWludDMyX3QgICAgICAgICAgICAgICAgdWlIZHJTdGF0ZU9mZnNldDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhkciBTdGF0ZSBvZmZzZXQKICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIHVpSW5zdGFuY2VTaXplOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTaXplIG9mIHNpbmdsZSBpbnN0YW5jZSBvZiBWRUJPWCBzdGF0ZXMKICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIHVpU3RhdGVIZWFwU2l6ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUb3RhbCBzaXplIG9mIFZFQk9YIFN0YXRlcyBoZWFwCiAgICBQTUhXX1ZFQk9YX0hFQVBfU1RBVEUgICBwU3RhdGVzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXJyYXkgb2YgVkVCT1ggSGVhcCBTdGF0ZXMKICAgIE1PU19SRVNPVVJDRSAgICAgICAgICAgIERyaXZlclJlc291cmNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBHcmFwaGljcyBtZW1vcnkgZm9yIERyaXZlciBhY2Nlc3MKICAgIE1PU19SRVNPVVJDRSAgICAgICAgICAgIEtlcm5lbFJlc291cmNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBHcmFwaGljcyBtZW1vcnkgZm9yIEtlcm5lbCBhY2Nlc3MKICAgIHVpbnQ4X3QgICAgICAgICAgICAgICAgICpwTG9ja2VkRHJpdmVyUmVzb3VyY2VNZW07ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTG9ja2VkIERyaXZlciByZXNvdXJjZSBtZW1vcnkKCiAgICAvLyBTeW5jaHJvbml6YXRpb24KICAgIHZvbGF0aWxlIHVpbnQzMl90ICAgICAgICpwU3luYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUG9pbnRlciB0byBzeW5jIGFyZWEgKHdoZW4gbG9ja2VkKQogICAgdWludDMyX3QgICAgICAgICAgICAgICAgZHdOZXh0VGFnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5leHQgc3luYyB0YWcgdmFsdWUgdG8gdXNlCiAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBkd1N5bmNUYWc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTGFzdCBzeW5jIHRhZyBjb21wbGV0ZWQKfSBNSFdfVkVCT1hfSEVBUCwgKlBNSFdfVkVCT1hfSEVBUDsKCi8vIQovLyEgXGJyaWVmICBWRUJPWCBzZXR0aW5ncyBTdHJ1Y3R1cmUKLy8hCnR5cGVkZWYgc3RydWN0CnsKICAgIHVpbnQzMl90ICAgICAgICAgICAgdWlOdW1JbnN0YW5jZXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOdW1iZXIgb2YgVkVCT1ggaW5zdGFuY2VzIHRvIGNyZWF0ZQogICAgdWludDMyX3QgICAgICAgICAgICB1aVN5bmNTaXplOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN5bmMgRGF0YSBTaXplCiAgICB1aW50MzJfdCAgICAgICAgICAgIHVpRG5kaVN0YXRlU2l6ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRE5ESSBTdGF0ZSBTaXplCiAgICB1aW50MzJfdCAgICAgICAgICAgIHVpSWVjcFN0YXRlU2l6ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSUVDUCBTdGF0ZSBTaXplCiAgICB1aW50MzJfdCAgICAgICAgICAgIHVpR2FtdXRTdGF0ZVNpemU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gR2FtdXQgU3RhdGUgU2l6ZQogICAgdWludDMyX3QgICAgICAgICAgICB1aVZlcnRleFRhYmxlU2l6ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFZlcnRleCBUYWJsZSBTaXplCiAgICB1aW50MzJfdCAgICAgICAgICAgIHVpQ2FwdHVyZVBpcGVTdGF0ZVNpemU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2FwdHVyZSBQaXBlIFN0YXRlIFNpemUgKEdlbjgrKQogICAgdWludDMyX3QgICAgICAgICAgICB1aUdhbW1hQ29ycmVjdGlvblN0YXRlU2l6ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdhbW1hIENvcnJlY3Rpb24gU3RhdGUgU2l6ZSAoR2VuOSspCiAgICB1aW50MzJfdCAgICAgICAgICAgIHVpSGRyU3RhdGVTaXplOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSERSIFN0YXRlIFNpemUKfSBNSFdfVkVCT1hfU0VUVElOR1MsICpQTUhXX1ZFQk9YX1NFVFRJTkdTOwp0eXBlZGVmIGNvbnN0IE1IV19WRUJPWF9TRVRUSU5HUyBDTUhXX1ZFQk9YX1NFVFRJTkdTLCAqUENNSFdfVkVCT1hfU0VUVElOR1M7CgovLyEKLy8hIFxicmllZiAgTUhXIFZFQk9YIEdQVU5PREUgU3RydWN0dXJlCi8vIQp0eXBlZGVmIHN0cnVjdCBfTUhXX1ZFQk9YX0dQVU5PREVfTElNSVQKewogICAgYm9vbCAgICBiU2ZjSW5Vc2U7CiAgICBib29sICAgIGJDcEVuYWJsZWQ7CiAgICB1aW50MzJfdCBkd0dwdU5vZGVUb1VzZTsKfSBNSFdfVkVCT1hfR1BVTk9ERV9MSU1JVCwgKlBNSFdfVkVCT1hfR1BVTk9ERV9MSU1JVDsKCgoKY2xhc3MgTWh3VmVib3hJbnRlcmZhY2UKewpwdWJsaWM6CiAgICB2aXJ0dWFsIH5NaHdWZWJveEludGVyZmFjZSgpCiAgICB7CiAgICAgICAgTUhXX0ZVTkNUSU9OX0VOVEVSOwogICAgfQoKICAgIC8vIQogICAgLy8hIFxicmllZiAgICAgIEFkZCBWRUJPWCBWZXJ0ZXggVGFibGUKICAgIC8vISBcZGV0YWlscyAgICBBZGQgVmVib3ggdmVydGV4IHRhYmxlIGJhc2VkIG9uIGNvbG9yIHNwYWNlCiAgICAvLyEgXHBhcmFtICAgICAgW2luXSBDb2xvclNwYWNlCiAgICAvLyEgICAgICAgICAgICAgQ29sb3JTcGFjZSBvZiB0aGUgc291cmNlIHN1cmZhY2UKICAgIC8vISBccmV0dXJuICAgICBNT1NfU1RBVFVTCiAgICAvLyEKICAgIHZpcnR1YWwgTU9TX1NUQVRVUyBBZGRWZWJveFZlcnRleFRhYmxlKAogICAgICAgIE1IV19DU1BBQ0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xvclNwYWNlKSA9IDA7CgogICAgLy8hCiAgICAvLyEgXGJyaWVmICAgIEFkZCBWZWJveCBTdGF0ZQogICAgLy8hIFxkZXRhaWxzICBBZGQgVmVib3ggU3RhdGUgY29tbWFuZHMKICAgIC8vISBccGFyYW0gICAgW2luXSBwQ21kQnVmZmVyCiAgICAvLyEgICAgICAgICAgIFBvaW50ZXIgdG8gQ29tbWFuZCBCdWZmZXIKICAgIC8vISBccGFyYW0gICAgW2luXSBwVmVib3hTdGF0ZUNtZFBhcmFtcwogICAgLy8hICAgICAgICAgICBQb2ludGVyIHRvIFZlYm94IFN0YXRlIFBhcmFtcwogICAgLy8hIFxyZXR1cm4gICBNT1NfU1RBVFVTCiAgICAvLyEKICAgIHZpcnR1YWwgTU9TX1NUQVRVUyBBZGRWZWJveFN0YXRlKAogICAgICAgIFBNT1NfQ09NTUFORF9CVUZGRVIgICAgICAgICAgICAgICAgICAgICBwQ21kQnVmZmVyLAogICAgICAgIFBNSFdfVkVCT1hfU1RBVEVfQ01EX1BBUkFNUyAgICAgICAgICAgICBwVmVib3hTdGF0ZUNtZFBhcmFtcywKICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlVzZUNtQnVmZmVyKSA9IDA7CgogICAgLy8hCiAgICAvLyEgXGJyaWVmICAgICAgU2VuZCBWZWJveCBTdXJmYWNlIFN0YXRlIGNvbW1hbmRzCiAgICAvLyEgXGRldGFpbHMgICAgU2V0IHN1cmZhY2Ugc3RhdGUgZm9yIGlucHV0IGFuZCBvdXRwdXQgc3VyZmFjZXMKICAgIC8vISBccGFyYW0gICAgICBbaW5dIHBDbWRCdWZmZXIKICAgIC8vISAgICAgICAgICAgICBQb2ludGVyIHRvIGNvbW1hbmQgYnVmZmVyCiAgICAvLyEgXHBhcmFtICAgICAgW2luXSBwVmVib3hTdXJmYWNlU3RhdGVDbWRQYXJhbXMKICAgIC8vISAgICAgICAgICAgICBQb2ludGVyIHRvIHN1cmZhY2Ugc3RhdGUgcGFyYW1zCiAgICAvLyEgXHJldHVybiAgICAgTU9TX1NUQVRVUwogICAgLy8hCiAgICB2aXJ0dWFsIE1PU19TVEFUVVMgQWRkVmVib3hTdXJmYWNlcygKICAgICAgICBQTU9TX0NPTU1BTkRfQlVGRkVSICAgICAgICAgICAgICAgICAgICAgcENtZEJ1ZmZlciwKICAgICAgICBQTUhXX1ZFQk9YX1NVUkZBQ0VfU1RBVEVfQ01EX1BBUkFNUyAgICAgcFZlYm94U3VyZmFjZVN0YXRlQ21kUGFyYW1zKSA9IDA7CgogICAgLy8hCiAgICAvLyEgXGJyaWVmICAgIFNlbmQgVmVib3ggRGkgSWVjcAogICAgLy8hIFxkZXRhaWxzICBTZW5kIFZlYm94IERJIElFQ1AgY29tbWFuZHMKICAgIC8vISBccGFyYW0gICAgW2luXSBwQ21kQnVmZmVyCiAgICAvLyEgICAgICAgICAgIFBvaW50ZXIgdG8gQ29tbWFuZCBCdWZmZXIKICAgIC8vISBccGFyYW0gICAgW2luXSBwVmVib3hEaUllY3BDbWRQYXJhbXMKICAgIC8vISAgICAgICAgICAgUG9pbnRlciB0byBESSBJRUNQIFBhcmFtcwogICAgLy8hIFxyZXR1cm4gICBNT1NfU1RBVFVTCiAgICAvLyEKICAgIHZpcnR1YWwgTU9TX1NUQVRVUyBBZGRWZWJveERpSWVjcCgKICAgICAgICBQTU9TX0NPTU1BTkRfQlVGRkVSICAgICAgICAgICAgICAgICAgICAgcENtZEJ1ZmZlciwKICAgICAgICBQTUhXX1ZFQk9YX0RJX0lFQ1BfQ01EX1BBUkFNUyAgICAgICAgICAgcFZlYm94RGlJZWNwQ21kUGFyYW1zKSA9IDA7CgogICAgLy8hCiAgICAvLyEgXGJyaWVmICAgICAgQWRkIFZFQk9YIEROREkgU3RhdGVzCiAgICAvLyEgXGRldGFpbHMgICAgQWRkIHZlYm94IGRuZGkgc3RhdGVzCiAgICAvLyEgXHBhcmFtICAgICAgW2luXSBwVmVib3hEbmRpUGFyYW1zCiAgICAvLyEgICAgICAgICAgICAgUG9pbnRlciB0byBWRUJPWCBETkRJIFN0YXRlIFBhcmFtcwogICAgLy8hIFxyZXR1cm4gICAgIE1PU19TVEFUVVMKICAgIC8vIQogICAgdmlydHVhbCBNT1NfU1RBVFVTIEFkZFZlYm94RG5kaVN0YXRlKAogICAgICAgIFBNSFdfVkVCT1hfRE5ESV9QQVJBTVMgICAgICAgICAgICAgICAgICBwVmVib3hEbmRpUGFyYW1zKSA9IDA7CgogICAgLy8hCiAgICAvLyEgXGJyaWVmICAgICAgQWRkIFZFQk9YIEdhbXV0IFN0YXRlcwogICAgLy8hIFxkZXRhaWxzICAgIEFkZCBWZWJveCBHYW11dCBzdGF0ZXMKICAgIC8vISBccGFyYW0gICAgICBbaW5dIHBWZWJveEllY3BQYXJhbXMKICAgIC8vISAgICAgICAgICAgICBQb2ludGVyIHRvIFZFQk9YIElFQ1AgU3RhdGUgUGFyYW1zCiAgICAvLyEgXHBhcmFtICAgICAgW2luXSBwVmVib3hHYW11dFBhcmFtcwogICAgLy8hICAgICAgICAgICAgIFBvaW50ZXIgdG8gVkVCT1ggR2FtdXQgU3RhdGUgUGFyYW1zCiAgICAvLyEgXHJldHVybiAgICAgTU9TX1NUQVRVUwogICAgLy8hCiAgICB2aXJ0dWFsIE1PU19TVEFUVVMgQWRkVmVib3hHYW11dFN0YXRlKAogICAgICAgIFBNSFdfVkVCT1hfSUVDUF9QQVJBTVMgICAgICAgICAgICAgICAgICBwVmVib3hJZWNwUGFyYW1zLAogICAgICAgIFBNSFdfVkVCT1hfR0FNVVRfUEFSQU1TICAgICAgICAgICAgICAgICBwVmVib3hHYW11dFBhcmFtcykgPSAwOwoKICAgIC8vIQogICAgLy8hIFxicmllZiAgICAgIEFkZCBWRUJPWCBJRUNQIFN0YXRlcwogICAgLy8hIFxkZXRhaWxzICAgIEFkZCBWZWJveCBJRUNQIHN0YXRlcyBTVEQvRSwgQUNFLCBUQ0MsIEZFQ1NDLCBCTEMsIFByb2NBbXAsIGFsc28gYWRkIENhcFBpcGUgc3RhdGUKICAgIC8vISBccGFyYW0gICAgICBbaW4sIG91dF0gcFZlYm94SWVjcFBhcmFtcwogICAgLy8hICAgICAgICAgICAgIFBvaW50ZXIgdG8gVkVCT1ggSUVDUCBTdGF0ZSBQYXJhbXMKICAgIC8vISBccmV0dXJuICAgICBNT1NfU1RBVFVTCiAgICAvLyEKICAgIHZpcnR1YWwgTU9TX1NUQVRVUyBBZGRWZWJveEllY3BTdGF0ZSgKICAgICAgICBQTUhXX1ZFQk9YX0lFQ1BfUEFSQU1TICAgICAgICAgICAgICAgICAgcFZlYm94SWVjcFBhcmFtcykgPSAwOwoKICAgIC8vIQogICAgLy8hIFxicmllZiAgICAgIEFkZCBWRUJPWCBJRUNQIEFDRSBTdGF0ZQogICAgLy8hIFxkZXRhaWxzICAgIEFkZCB2ZWJveCBJRUNQICBBQ0UgU3RhdGUKICAgIC8vISBccGFyYW0gICAgICBbaW5dIHBWZWJveEllY3BQYXJhbXMKICAgIC8vISAgICAgICAgICAgICBQb2ludGVyIHRvIFZFQk9YIElFQ1AgU3RhdGUgUGFyYW1zCiAgICAvLyEgXHJldHVybiAgICAgTU9TX1NUQVRVUwogICAgLy8hCiAgICB2aXJ0dWFsIE1PU19TVEFUVVMgQWRkVmVib3hJZWNwQWNlU3RhdGUoCiAgICAgICAgUE1IV19WRUJPWF9JRUNQX1BBUkFNUyAgICAgICAgICAgICAgICAgIHBWZWJveEllY3BQYXJhbXMpID0gMDsKCiAgICAvLyEKICAgIC8vISBcYnJpZWYgICAgICBWZWJveCBhZGp1c3QgYm91bmRhcnkKICAgIC8vISBcZGV0YWlscyAgICBBZGp1c3QgdGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIHN1cmZhY2UgZm9yIFZlYm94CiAgICAvLyEgXHBhcmFtICAgICAgW2luXSBwU3VyZmFjZVBhcmFtCiAgICAvLyEgICAgICAgICAgICAgcG9pbnRlciB0byBpbnB1dCBTdXJmYWNlCiAgICAvLyEgXHBhcmFtICAgICAgW291dF0gcGR3U3VyZmFjZVdpZHRoCiAgICAvLyEgICAgICAgICAgICAgQWRqdXN0ZWQgc3VyZmFjZSB3aWR0aAogICAgLy8hIFxwYXJhbSAgICAgIFtvdXRdIHBkd1N1cmZhY2VIZWlnaHQKICAgIC8vISAgICAgICAgICAgICBBZGp1c3RlZCBzdXJmYWNlIGhlaWdodAogICAgLy8hIFxwYXJhbSAgICAgIFtpbl0gYkRJRW5hYmxlCiAgICAvLyEgICAgICAgICAgICAgaWRlbnRpZnkgaWYgREkgaXMgZW5hYmxlZAogICAgLy8hIFxyZXR1cm4gICAgIE1PU19TVEFUVVMKICAgIC8vIQogICAgdmlydHVhbCBNT1NfU1RBVFVTIFZlYm94QWRqdXN0Qm91bmRhcnkoCiAgICAgICAgUE1IV19WRUJPWF9TVVJGQUNFX1BBUkFNUyAgICAgICAgICAgICAgIHBTdXJmYWNlUGFyYW0sCiAgICAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwZHdTdXJmYWNlV2lkdGgsCiAgICAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwZHdTdXJmYWNlSGVpZ2h0LAogICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRElFbmFibGUpID0gMDsKCiAgICAvLyEgXGJyaWVmICAgICAgR2V0IEZ1bGwgSW1hZ2UgSGlzdG9ncmFtCiAgICAvLyEgXGRldGFpbHMgICAgR2V0IFZFQk9YIElFQ1AgQUNFIFN0YXRlIGluZm9yYXRpb24gYWJvdXQgRnVsbCBJbWFnZSBIaXN0b2dyYW0KICAgIC8vISBccGFyYW0gICAgICBbaW4sIG91dF0gcEZ1bGxJbWFnZUhpc3RvZ3JhbQogICAgLy8hICAgICAgICAgICAgIFBvaW50ZXIgdG8gRnVsbCBJbWFnZSBIaXN0b2dyYW0gUGFyYW0KICAgIC8vISBccmV0dXJuICAgICBNT1NfU1RBVFVTCiAgICAvLyEgICAgICAgICAgICAgTU9TX1NUQVRVU19TVUNDRVNTIGlmIHN1Y2Nlc3MsIGVsc2UgZmFpbCByZWFzb24KICAgIC8vIQogICAgdmlydHVhbCBNT1NfU1RBVFVTIEdldFZlYm94QWNlX0Z1bGxJbWFnZUhpc3RvZ3JhbSgKICAgICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBGdWxsSW1hZ2VIaXN0b2dyYW0pCiAgICB7CiAgICAgICAgTU9TX1NUQVRVUyBlU3RhdHVzID0gTU9TX1NUQVRVU19VTktOT1dOOwogICAgICAgIHJldHVybiBlU3RhdHVzOwogICAgfQogICAgLy8hCiAgICAvLyEgXGJyaWVmICAgIEFkZCBWZWJveCBTdXJmYWNlIENvbnRyb2xzIEJpdHMKICAgIC8vISBcZGV0YWlscyAgQWRkIFZlYm94IFN1cmZhY2UgQ29udHJvbCBCaXRzIGZvciBpbnB1dCBzdXJmYWNlCiAgICAvLyEgXHBhcmFtICAgIFtpbl0gcFZlYm94U3VyZkNudGxQYXJhbXMKICAgIC8vISAgICAgICAgICAgUG9pbnRlciB0byBWRUJPWCBTdXJmYWNlIGNvbnRyb2wgcGFyYW1ldGVycwogICAgLy8hIFxwYXJhbSAgICBbb3V0XSBwU3VyZkN0cmxCaXRzCiAgICAvLyEgICAgICAgICAgIFBvaW50ZXIgdG8gc3VyZmFjZSBjb250cm9sIGJpdHMKICAgIC8vISBccmV0dXJuICAgTU9TX1NUQVRVUwogICAgLy8hCiAgICB2aXJ0dWFsIE1PU19TVEFUVVMgQWRkVmVib3hTdXJmYWNlQ29udHJvbEJpdHMoCiAgICAgICAgUE1IV19WRUJPWF9TVVJGQUNFX0NOVExfUEFSQU1TICAgICAgICAgIHBWZWJveFN1cmZDbnRsUGFyYW1zLAogICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcFN1cmZDdHJsQml0cykgPSAwOwoKICAgIC8vIQogICAgLy8hIFxicmllZiAgICBBZGQgVmVib3ggVGlsaW5nIENvbnZlcnQgQ29udHJvbCBCaXRzCiAgICAvLyEgXGRldGFpbHMgIEFkZCBWZWJveCBUaWxpbmcgQ29udmVydCBDb250cm9sIEJpdHMKICAgIC8vISBccGFyYW0gICAgW2luXSBjbWRCdWZmZXIKICAgIC8vISAgICAgICAgICAgUG9pbnRlcnMgdG8gdGhlIEhXIENtZCBidWZmZXIKICAgIC8vISBccGFyYW0gICAgW2luXSBpblN1clBhcmFtcwogICAgLy8hICAgICAgICAgICBQb2ludGVyIHRvIGlucHV0IHZlYm94IHN1cmZhY2UgcGFyYW1zCiAgICAvLyEgXHBhcmFtICAgIFtpbl0gb3V0U3VyUGFyYW1zCiAgICAvLyEgICAgICAgICAgIFBvaW50ZXIgdG8gb3V0cHV0IHZlYm94IHN1cmZhY2UgcGFyYW1zCiAgICAvLyEgXHJldHVybiAgIE1PU19TVEFUVVMKICAgIC8vISAgICAgICAgICAgTU9TX1NUQVRVU19TVUNDRVNTIGlmIHN1Y2Nlc3MsIGVsc2UgZmFpbCByZWFzb24KICAgIHZpcnR1YWwgTU9TX1NUQVRVUyBBZGRWZWJveFRpbGluZ0NvbnZlcnQoCiAgICAgICAgUE1PU19DT01NQU5EX0JVRkZFUiBjbWRCdWZmZXIsCiAgICAgICAgUE1IV19WRUJPWF9TVVJGQUNFX1BBUkFNUyAgICAgICAgaW5TdXJQYXJhbXMsCiAgICAgICAgUE1IV19WRUJPWF9TVVJGQUNFX1BBUkFNUyAgICAgICAgb3V0U3VyUGFyYW1zKSA9IDA7CgogICAgLy8hCiAgICAvLyEgXGJyaWVmICAgIERlY2lkZSBXaGljaCBHUFUgTm9kZSB0byB1c2UgZm9yIFZlYm94CiAgICAvLyEgXGRldGFpbHMgIENsaWVudCBmYWNpbmcgZnVuY3Rpb24gdG8gY3JlYXRlIGdwdSBjb250ZXh0IHVzZWQgYnkgVmVib3gKICAgIC8vISBccGFyYW0gICAgW291dF0gcFZFR3B1Tm9kZUxpbWl0CiAgICAvLyEgICAgICAgICAgIFZFR3B1Tm9kZSBMaW1pdGF0aW9uCiAgICAvLyEgXHJldHVybiAgIE1PU19TVEFUVVMKICAgIC8vISAgICAgICAgICAgTU9TX1NUQVRVU19TVUNDRVNTIGlmIHN1Y2Nlc3MsIGVsc2UgZmFpbCByZWFzb24KICAgIC8vIQogICAgdmlydHVhbCBNT1NfU1RBVFVTIEZpbmRWZWJveEdwdU5vZGVUb1VzZSgKICAgICAgICBQTUhXX1ZFQk9YX0dQVU5PREVfTElNSVQgICAgICAgICAgICAgICAgcFZlYm94R3B1Tm9kZUxpbWl0KQogICAgewogICAgICAgIE1PU19HUFVfTk9ERSBWZWJveEdwdU5vZGUgPSBNT1NfR1BVX05PREVfVkU7CiAgICAgICAgTU9TX1NUQVRVUyAgIGVTdGF0dXMgPSBNT1NfU1RBVFVTX1NVQ0NFU1M7CgogICAgICAgIE1IV19DSEtfTlVMTChwVmVib3hHcHVOb2RlTGltaXQpOwoKICAgICAgICBwVmVib3hHcHVOb2RlTGltaXQtPmR3R3B1Tm9kZVRvVXNlID0gVmVib3hHcHVOb2RlOwoKICAgIGZpbmlzaDoKICAgICAgICByZXR1cm4gZVN0YXR1czsKICAgfQoKICAgIC8vIQogICAgLy8hIFxicmllZiAgICBDcmVhdGUgR3B1IENvbnRleHQgZm9yIFZlYm94CiAgICAvLyEgXGRldGFpbHMgIENyZWF0ZSBHcHUgQ29udGV4dCBmb3IgVmVib3gKICAgIC8vISBccGFyYW0gICAgW2luXSBwT3NJbnRlcmZhY2UKICAgIC8vISAgICAgICAgICAgT1MgaW50ZXJmYWNlCiAgICAvLyEgXHBhcmFtICAgIFtpbl0gVmVib3hHcHVDb250ZXh0CiAgICAvLyEgICAgICAgICAgIFZlYm94IEdwdSBDb250ZXh0CiAgICAvLyEgXHBhcmFtICAgIFtpbl0gVmVib3hHcHVOb2RlCiAgICAvLyEgICAgICAgICAgIFZlYm94IEdwdSBOb2RlCiAgICAvLyEgXHJldHVybiAgIE1PU19TVEFUVVMKICAgIC8vISAgICAgICAgICAgTU9TX1NUQVRVU19TVUNDRVNTIGlmIHN1Y2Nlc3MsIGVsc2UgZmFpbCByZWFzb24KICAgIC8vIQogICAgdmlydHVhbCBNT1NfU1RBVFVTIENyZWF0ZUdwdUNvbnRleHQoCiAgICAgICAgUE1PU19JTlRFUkZBQ0UgIHBPc0ludGVyZmFjZSwKICAgICAgICBNT1NfR1BVX0NPTlRFWFQgVmVib3hHcHVDb250ZXh0LAogICAgICAgIE1PU19HUFVfTk9ERSAgICBWZWJveEdwdU5vZGUpCiAgICB7CiAgICAgICAgTU9TX0dQVUNUWF9DUkVBVE9QVElPTlMgY3JlYXRlT3B0aW9uOwogICAgICAgIE1PU19TVEFUVVMgICAgICAgICAgICAgIGVTdGF0dXMgPSBNT1NfU1RBVFVTX1NVQ0NFU1M7CgogICAgICAgIE1IV19DSEtfTlVMTChwT3NJbnRlcmZhY2UpOwoKICAgICAgICBNSFdfQ0hLX1NUQVRVUyhwT3NJbnRlcmZhY2UtPnBmbkNyZWF0ZUdwdUNvbnRleHQoCiAgICAgICAgICAgIHBPc0ludGVyZmFjZSwKICAgICAgICAgICAgVmVib3hHcHVDb250ZXh0LAogICAgICAgICAgICBWZWJveEdwdU5vZGUsCiAgICAgICAgICAgICZjcmVhdGVPcHRpb24pKTsKCiAgICBmaW5pc2g6CiAgICAgICAgcmV0dXJuIGVTdGF0dXM7CiAgICB9CgogICAgdmlydHVhbCBNT1NfU1RBVFVTIHNldFZlYm94UHJvbG9nQ21kKAogICAgICAgIFBNSFdfTUlfSU5URVJGQUNFICAgbWh3TWlJbnRlcmZhY2UsCiAgICAgICAgUE1PU19DT01NQU5EX0JVRkZFUiBjbWRCdWZmZXIpID0gMDsKCnByb3RlY3RlZDoKICAgIE1od1ZlYm94SW50ZXJmYWNlKFBNT1NfSU5URVJGQUNFIHBPc0ludGVyZmFjZSk7CgogICAgLy8hCiAgICAvLyEgXGJyaWVmICAgIFRyYWNlIGluZGlyZWN0IHN0YXRlIGluZm8gYnkgT0NBCiAgICAvLyEgXGRldGFpbHMgIFRyYWNlIHdoaWNoIHJlc291cmNlIGJlaW5nIHVzZWQgdG8gc3RvcmUgaW5kaXJlY3Qgc3RhdGUgYnkgT0NBLgogICAgLy8hIFxwYXJhbSAgICBbaW5dIGNtZEJ1ZmZlcgogICAgLy8hICAgICAgICAgICBDb21tYW5kIGJ1ZmZlciBvZiBjdXJyZW50IHZlYm94IHdvcmtsb2FkLgogICAgLy8hIFxwYXJhbSAgICBbaW5dIG1vc0NvbnRleHQKICAgIC8vISAgICAgICAgICAgbW9zIGNvbnRleHQKICAgIC8vISBccGFyYW0gICAgW2luXSBpc0NtQnVmZmVyCiAgICAvLyEgICAgICAgICAgIHRydWUgaWYgQ00gYnVmZmVyIGJlaW5nIHVzZWQgZm9yIGluZGlyZWN0IHN0YXRlLCBvdGhlcndpc2UsIHZlYm94IGhlYXAgaXMgdXNlZC4KICAgIC8vISBccGFyYW0gICAgW2luXSB1c2VWZWJveEhlYXBLZXJuZWxSZXNvdXJjZQogICAgLy8hICAgICAgICAgICB0cnVlIGlmIGtlcm5lbCBjb3B5IG5lZWRlZCBmb3IgaW5kaXJlY3Qgc3RhdGUuCiAgICAvLyEgXHJldHVybiAgIHZvaWQKICAgIC8vIQogICAgdm9pZCBUcmFjZUluZGlyZWN0U3RhdGVJbmZvKE1PU19DT01NQU5EX0JVRkZFUiAmY21kQnVmZmVyLCBNT1NfQ09OVEVYVCAmbW9zQ29udGV4dCwgYm9vbCBpc0NtQnVmZmVyLCBib29sIHVzZVZlYm94SGVhcEtlcm5lbFJlc291cmNlKTsKCnB1YmxpYzoKICAgIC8vIQogICAgLy8hIFxicmllZiAgICBBZGRzIGEgcmVzb3VyY2UgdG8gdGhlIGNvbW1hbmQgYnVmZmVyIG9yIGluZGlyZWN0IHN0YXRlIChTU0gpCiAgICAvLyEgXGRldGFpbHMgIEludGVybmFsIE1IVyBmdW5jdGlvbiB0byBhZGQgZWl0aGVyIGEgZ3JhcGhpY3MgYWRkcmVzcyBvZiBhIHJlc291cmNlIG9yCiAgICAvLyEgICAgICAgICAgIGFkZCB0aGUgcmVzb3VyY2UgdG8gdGhlIHBhdGNoIGxpc3QgZm9yIHRoZSByZXF1ZXN0ZWQgYnVmZmVyIG9yIHN0YXRlCiAgICAvLyEgXHBhcmFtICAgIFtpbl0gcE9zSW50ZXJmYWNlCiAgICAvLyEgICAgICAgICAgIE9TIGludGVyZmFjZQogICAgLy8hIFxwYXJhbSAgICBbaW5dIHBDbWRCdWZmZXIKICAgIC8vISAgICAgICAgICAgSWYgYWRkaW5nIGEgcmVzb3VyY2UgdG8gdGhlIGNvbW1hbmQgYnVmZmVyLCB0aGUgYnVmZmVyIHRvIHdoaWNoIHRoZSByZXNvdXJjZQogICAgLy8hICAgICAgICAgICBpcyBhZGRlZAogICAgLy8hIFxwYXJhbSAgICBbaW5dIHBQYXJhbXMKICAgIC8vISAgICAgICAgICAgUGFyYW1ldGVycyBuZWNlc3NhcnkgdG8gYWRkIHRoZSBncmFwaGljcyBhZGRyZXNzCiAgICAvLyEgXHJldHVybiAgIE1PU19TVEFUVVMKICAgIC8vISAgICAgICAgICAgTU9TX1NUQVRVU19TVUNDRVNTIGlmIHN1Y2Nlc3MsIGVsc2UgZmFpbCByZWFzb24KICAgIC8vIQogICAgTU9TX1NUQVRVUygqcGZuQWRkUmVzb3VyY2VUb0NtZCkoCiAgICAgICAgUE1PU19JTlRFUkZBQ0UgICAgICAgICAgICAgICAgICAgICAgICAgIHBPc0ludGVyZmFjZSwKICAgICAgICBQTU9TX0NPTU1BTkRfQlVGRkVSICAgICAgICAgICAgICAgICAgICAgcENtZEJ1ZmZlciwKICAgICAgICBQTUhXX1JFU09VUkNFX1BBUkFNUyAgICAgICAgICAgICAgICAgICAgcFBhcmFtcyk7CgogICAgLy8hIFxicmllZiBWRUJPWCBIZWFwIG1hbmFnZW1lbnQgZnVuY3Rpb25zCiAgICAvLyEKICAgIC8vISBcYnJpZWYgICAgQ3JlYXRlIFZlYm94IEhlYXAKICAgIC8vISBcZGV0YWlscyAgQ3JlYXRlIFZlYm94IEhlYXAKICAgIC8vISAgICAgVlBIQUxfVkVCT1ggKENQVSkKICAgIC8vISAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIC8vISAgICAgfCBEcml2ZXJSZXNvdXJjZSAgICB8CiAgICAvLyEgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAvLyEgICAgIHwgS2VybmVsUmVzb3VyY2UgICAgfAogICAgLy8hICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgLy8hCiAgICAvLyEgICAgICBHUFUgKERyaXZlciBSZXNvdXJjZSkgICAgICBHUFUgKEtlcm5lbCBSZXNvdXJjZSkgICAgICAgIFZFQk9YIFN0YXRlIChpbiBHcmFwaGljcyBNZW1vcnkpCiAgICAvLyEgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAvLyEgICAgIHwgVkVCT1ggU3RhdGUgMCAgICAgfCAgICAgICB8IFZFQk9YIFN0YXRlIDAgICAgIHwgICAgICAgfCBETkRJIFN0YXRlICAgICAgICAgfAogICAgLy8hICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0gICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgLy8hICAgICB8IFZFQk9YIFN0YXRlIDEgICAgIHwgICAgICAgfCBWRUJPWCBTdGF0ZSAxICAgICB8ICAgICAgIHwgSUVDUCBTdGF0ZSAgICAgICAgIHwKICAgIC8vISAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0gICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIC8vISAgICAgfCBWRUJPWCBTdGF0ZSBOICAgICB8ICAgICAgIHwgVkVCT1ggU3RhdGUgTiAgICAgfCAgICAgICB8IEdhbXV0ICAgICAgICAgICAgICB8CiAgICAvLyEgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAvLyEgICAgIHwgVkVCT1ggU3luYyBEYXRhICAgfCAgICAgICB8IFZFQk9YIFN5bmMgRGF0YSAgIHwgICAgICAgfCBWZXJ0ZXggU3RhdGUgICAgICAgfAogICAgLy8hICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgLy8hICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQ2FwdHVyZVBpcGUgU3RhdGUgIHwKICAgIC8vISAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIC8vISAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEdhbW1hIENvcnJlY3Rpb24gU3RhdGUgfAogICAgLy8hICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIC8vISAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEhEUiBTdGF0ZSAgICAgICAgICAgICAgfAogICAgLy8hICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIC8vISBccmV0dXJuICAgTU9TX1NUQVRVUwogICAgLy8hCiAgICBNT1NfU1RBVFVTIENyZWF0ZUhlYXAoKTsKCiAgICAvLyEKICAgIC8vISBcYnJpZWYgICAgRGVzdHJveSBWZWJveCBIZWFwCiAgICAvLyEgXGRldGFpbHMgIERlc3Ryb3kgVmVib3ggSGVhcAogICAgLy8hIFxyZXR1cm4gICBNT1NfU1RBVFVTCiAgICAvLyEKICAgIE1PU19TVEFUVVMgRGVzdHJveUhlYXAoKTsKCiAgICAvLyEKICAgIC8vISBcYnJpZWYgICAgQXNzaWduIFZlYm94IFN0YXRlCiAgICAvLyEgXGRldGFpbHMgIEdldHMgYSBwb2ludGVyIHRvIHRoZSBuZXh0IGF2YWlsYWJsZSB2ZWJveCBoZWFwIGluc3RhbmNlCiAgICAvLyEgXHJldHVybiAgIE1PU19TVEFUVVMKICAgIC8vISAgICAgICAgICAgTU9TX1NUQVRVU19TVUNDRVNTOiBpZiB2ZWJveCBoZWFwIGF2YWxpYmxlLCBzZXRzIHBWZWJveEhlYXAtPnVpQ3VyU3RhdGUKICAgIC8vISAgICAgICAgICAgICAgICAgcG9pbnRlciB0byBhdmFsaWJsZSB2ZWJveCBoZWFwIGluc3RhbmNlIGluZGV4IGFuZCBjbGVhcgogICAgLy8hICAgICAgICAgICAgICAgICBiQnVzeSBmbGFnIGZvciBpdAogICAgLy8hICAgICAgICAgICBNT1NfU1RBVFVTX1VOS05PV046IGludmFsaWQsIG5vIGF2YWlsYWJsZSB2ZWJveCBoZWFwIGluc3RhbmNlIGF2YWlsYWJsZSArIHRpbWVvdXQKICAgIC8vIQogICAgTU9TX1NUQVRVUyBBc3NpZ25WZWJveFN0YXRlKCk7CgogICAgLy8hCiAgICAvLyEgXGJyaWVmICAgIEdldCBWZWJveCBIZWFwIEluZm9ybWF0aW9uCiAgICAvLyEgXGRldGFpbHMgIEdldCBWZWJveCBIZWFwIHBvaW50ZXIgdG8gYWNjZXNzIFZlYm94IEhlYXAgaW5mb3JtYXRpb24KICAgIC8vISBccGFyYW0gICAgW291dF0gcHBWZWJveEhlYXAKICAgIC8vISAgICAgICAgICAgUG9pbnRlciB0byBjb25zdCBWZWJveCBIZWFwIFN0cnVjdHVyZQogICAgLy8hIFxyZXR1cm4gICBNT1NfU1RBVFVTCiAgICAvLyEKICAgIE1PU19TVEFUVVMgR2V0VmVib3hIZWFwSW5mbygKICAgICAgICBjb25zdCBNSFdfVkVCT1hfSEVBUCAgICAgICAgICAgICAgICAgICAgKipwcFZlYm94SGVhcCk7CgogICAgLy8hCiAgICAvLyEgXGJyaWVmICAgIFVwZGF0ZSBWZWJveCBTeW5jIHRhZyBpbmZvCiAgICAvLyEgXGRldGFpbHMgIFVwZGF0ZSBWZWJveCBIZWFwIFN5bmMgdGFnIGluZm8KICAgIC8vISBccmV0dXJuICAgTU9TX1NUQVRVUwogICAgLy8hCiAgICBNT1NfU1RBVFVTIFVwZGF0ZVZlYm94U3luYygpOwoKICAgIC8vIQogICAgLy8hIFxicmllZiAgICBTZXQgd2hpY2ggdmVib3ggY2FuIGJlIHVzZWQgYnkgSFcKICAgIC8vISBcZGV0YWlscyAgVlBIQUwgc2V0IHdoaWNoIFZFQk9YIGNhbiBiZSB1c2UgYnkgSFcKICAgIC8vISBccGFyYW0gICAgW2luXSBkd1ZlYm94SW5kZXgKICAgIC8vISAgICAgICAgICAgc2V0IHdoaWNoIFZlYm94IGNhbiBiZSB1c2VkIGJ5IEhXCiAgICAvLyEgXHBhcmFtICAgIFtpbl0gZHdWZWJveENvdW50CiAgICAvLyEgICAgICAgICAgIHNldCBWZWJveCBDb3VudAogICAgLy8hIFxwYXJhbSAgICBbaW5dIGR3VXNpbmdTRkMKICAgIC8vISAgICAgICAgICAgc2V0IHdoZXRoZXIgdXNpbmcgU0ZDCiAgICAvLyEgXHJldHVybiAgIE1PU19TVEFUVVMKICAgIC8vISAgICAgICAgICAgTU9TX1NUQVRVU19TVUNDRVNTIGlmIHN1Y2Nlc3MsIGVsc2UgZmFpbCByZWFzb24KICAgIHZpcnR1YWwgTU9TX1NUQVRVUyBTZXRWZWJveEluZGV4KAogICAgICAgIHVpbnQzMl90IGR3VmVib3hJbmRleCwKICAgICAgICB1aW50MzJfdCBkd1ZlYm94Q291bnQsCiAgICAgICAgdWludDMyX3QgZHdVc2luZ1NGQykKICAgIHsKICAgICAgICBNT1NfVU5VU0VEKGR3VmVib3hJbmRleCk7CiAgICAgICAgTU9TX1VOVVNFRChkd1ZlYm94Q291bnQpOwogICAgICAgIE1PU19VTlVTRUQoZHdVc2luZ1NGQyk7CiAgICAgICAgcmV0dXJuIE1PU19TVEFUVVNfU1VDQ0VTUzsKICAgIH0KCnByaXZhdGU6CiAgICAvLyEKICAgIC8vISBcYnJpZWYgICAgUmVmcmVzaCBWZWJveCBTeW5jCiAgICAvLyEgXGRldGFpbHMgIFVwZGF0ZSBWZWJveCBIZWFwIFN5bmMgdGFncyBhbmQgY2xlYXIgYkJ1c3kgZmxhZyBpbiBhdmFpbGJsZQogICAgLy8hICAgICAgICAgICBwVmVib3hIZWFwLT5wU3RhdGVzCiAgICAvLyEgXHJldHVybiAgIHZvaWQKICAgIC8vIQogICAgdm9pZCBSZWZyZXNoVmVib3hTeW5jKCk7CgogICAgLy8hIFxicmllZiAgICBWZWJveCBoZWFwIGluc3RhbmNlIGluIHVzZQogICAgaW50ICAgICAgICAgICAgICAgICAgICBtX3ZlYm94SGVhcEluVXNlID0gMDsKCiBwdWJsaWM6CiAgICBQTU9TX0lOVEVSRkFDRSAgICAgICAgIG1fb3NJbnRlcmZhY2UgICA9IG51bGxwdHI7CiAgICBQTUhXX1ZFQk9YX0hFQVAgICAgICAgIG1fdmVib3hIZWFwICAgICA9IG51bGxwdHI7CiAgICBNSFdfVkVCT1hfU0VUVElOR1MgICAgIG1fdmVib3hTZXR0aW5nczsKfTsKCiNlbmRpZiAvLyBfX01IV19WRUJPWF9IX18K