Ly89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8KLy8gU3BsYXNoLmgKLy8KLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci8vCi8vIE1vZGlmaWVkIHVuZGVyIHRoZSBQb3BwbGVyIHByb2plY3QgLSBodHRwOi8vcG9wcGxlci5mcmVlZGVza3RvcC5vcmcKLy8KLy8gQWxsIGNoYW5nZXMgbWFkZSB1bmRlciB0aGUgUG9wcGxlciBwcm9qZWN0IHRvIHRoaXMgZmlsZSBhcmUgbGljZW5zZWQKLy8gdW5kZXIgR1BMIHZlcnNpb24gMiBvciBsYXRlcgovLwovLyBDb3B5cmlnaHQgKEMpIDIwMDUgTWFyY28gUGVzZW50aSBHcml0dGkgPG1wZ0ByZWRoYXQuY29tPgovLyBDb3B5cmlnaHQgKEMpIDIwMDcsIDIwMTEsIDIwMTggQWxiZXJ0IEFzdGFscyBDaWQgPGFhY2lkQGtkZS5vcmc+Ci8vIENvcHlyaWdodCAoQykgMjAxMC0yMDEzLCAyMDE1IFRob21hcyBGcmVpdGFnIDxUaG9tYXMuRnJlaXRhZ0BhbGZhLmRlPgovLyBDb3B5cmlnaHQgKEMpIDIwMTAgQ2hyaXN0aWFuIEZldWVyc+RuZ2VyIDxjZmV1ZXJzYWVuZ2VyQGdvb2dsZW1haWwuY29tPgovLyBDb3B5cmlnaHQgKEMpIDIwMTIsIDIwMTcgQWRyaWFuIEpvaG5zb24gPGFqb2huc29uQHJlZG5lb24uY29tPgovLwovLyBUbyBzZWUgYSBkZXNjcmlwdGlvbiBvZiB0aGUgY2hhbmdlcyBwbGVhc2Ugc2VlIHRoZSBDaGFuZ2Vsb2cgZmlsZSB0aGF0Ci8vIGNhbWUgd2l0aCB5b3VyIHRhcmJhbGwgb3IgdHlwZSBtYWtlIENoYW5nZUxvZyBpZiB5b3UgYXJlIGJ1aWxkaW5nIGZyb20gZ2l0Ci8vCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgojaWZuZGVmIFNQTEFTSF9ICiNkZWZpbmUgU1BMQVNIX0gKCiNpbmNsdWRlIDxzdGRkZWYuaD4KI2luY2x1ZGUgIlNwbGFzaFR5cGVzLmgiCiNpbmNsdWRlICJTcGxhc2hDbGlwLmgiCiNpbmNsdWRlICJTcGxhc2hQYXR0ZXJuLmgiCgpjbGFzcyBTcGxhc2hCaXRtYXA7CnN0cnVjdCBTcGxhc2hHbHlwaEJpdG1hcDsKY2xhc3MgU3BsYXNoU3RhdGU7CmNsYXNzIFNwbGFzaFNjcmVlbjsKY2xhc3MgU3BsYXNoUGF0aDsKY2xhc3MgU3BsYXNoWFBhdGg7CmNsYXNzIFNwbGFzaEZvbnQ7CnN0cnVjdCBTcGxhc2hQaXBlOwoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCi8vIFJldHJpZXZlcyB0aGUgbmV4dCBsaW5lIG9mIHBpeGVscyBpbiBhbiBpbWFnZSBtYXNrLiAgTm9ybWFsbHksCi8vIGZpbGxzIGluICo8bGluZT4gYW5kIHJldHVybnMgdHJ1ZS4gIElmIHRoZSBpbWFnZSBzdHJlYW0gaXMKLy8gZXhoYXVzdGVkLCByZXR1cm5zIGZhbHNlLgp0eXBlZGVmIGJvb2wgKCpTcGxhc2hJbWFnZU1hc2tTb3VyY2UpKHZvaWQgKmRhdGEsIFNwbGFzaENvbG9yUHRyIHBpeGVsKTsKCi8vIFJldHJpZXZlcyB0aGUgbmV4dCBsaW5lIG9mIHBpeGVscyBpbiBhbiBpbWFnZS4gIE5vcm1hbGx5LCBmaWxscyBpbgovLyAqPGxpbmU+IGFuZCByZXR1cm5zIHRydWUuICBJZiB0aGUgaW1hZ2Ugc3RyZWFtIGlzIGV4aGF1c3RlZCwKLy8gcmV0dXJucyBmYWxzZS4KdHlwZWRlZiBib29sICgqU3BsYXNoSW1hZ2VTb3VyY2UpKHZvaWQgKmRhdGEsIFNwbGFzaENvbG9yUHRyIGNvbG9yTGluZSwKCQkJCSAgIHVuc2lnbmVkIGNoYXIgKmFscGhhTGluZSk7CgovLyBVc2UgSUNDQ29sb3JTcGFjZSB0byB0cmFuc2Zvcm0gYSBiaXRtYXAKdHlwZWRlZiB2b2lkICgqU3BsYXNoSUNDVHJhbnNmb3JtKSh2b2lkICpkYXRhLCBTcGxhc2hCaXRtYXAgKmJpdG1hcCk7CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKZW51bSBTcGxhc2hQaXBlUmVzdWx0Q29sb3JDdHJsIHsKI2lmZGVmIFNQTEFTSF9DTVlLCiAgc3BsYXNoUGlwZVJlc3VsdENvbG9yTm9BbHBoYUJsZW5kQ01ZSywKICBzcGxhc2hQaXBlUmVzdWx0Q29sb3JOb0FscGhhQmxlbmREZXZpY2VOLAojZW5kaWYKICBzcGxhc2hQaXBlUmVzdWx0Q29sb3JOb0FscGhhQmxlbmRSR0IsCiAgc3BsYXNoUGlwZVJlc3VsdENvbG9yTm9BbHBoYUJsZW5kTW9ubywKICBzcGxhc2hQaXBlUmVzdWx0Q29sb3JBbHBoYU5vQmxlbmRNb25vLAogIHNwbGFzaFBpcGVSZXN1bHRDb2xvckFscGhhTm9CbGVuZFJHQiwKI2lmZGVmIFNQTEFTSF9DTVlLCiAgc3BsYXNoUGlwZVJlc3VsdENvbG9yQWxwaGFOb0JsZW5kQ01ZSywKICBzcGxhc2hQaXBlUmVzdWx0Q29sb3JBbHBoYU5vQmxlbmREZXZpY2VOLAojZW5kaWYKICBzcGxhc2hQaXBlUmVzdWx0Q29sb3JBbHBoYUJsZW5kTW9ubywKICBzcGxhc2hQaXBlUmVzdWx0Q29sb3JBbHBoYUJsZW5kUkdCCiNpZmRlZiBTUExBU0hfQ01ZSwogICwKICBzcGxhc2hQaXBlUmVzdWx0Q29sb3JBbHBoYUJsZW5kQ01ZSywKICBzcGxhc2hQaXBlUmVzdWx0Q29sb3JBbHBoYUJsZW5kRGV2aWNlTgojZW5kaWYKfTsKCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIFNwbGFzaAovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKY2xhc3MgU3BsYXNoIHsKcHVibGljOgoKICAvLyBDcmVhdGUgYSBuZXcgcmFzdGVyaXplciBvYmplY3QuCiAgU3BsYXNoKFNwbGFzaEJpdG1hcCAqYml0bWFwQSwgYm9vbCB2ZWN0b3JBbnRpYWxpYXNBLAoJIFNwbGFzaFNjcmVlblBhcmFtcyAqc2NyZWVuUGFyYW1zID0gbnVsbHB0cik7CiAgU3BsYXNoKFNwbGFzaEJpdG1hcCAqYml0bWFwQSwgYm9vbCB2ZWN0b3JBbnRpYWxpYXNBLAoJIFNwbGFzaFNjcmVlbiAqc2NyZWVuQSk7CgogIH5TcGxhc2goKTsKCiAgU3BsYXNoKGNvbnN0IFNwbGFzaCAmKSA9IGRlbGV0ZTsKICBTcGxhc2gmIG9wZXJhdG9yPShjb25zdCBTcGxhc2ggJikgPSBkZWxldGU7CgogIC8vLS0tLS0gc3RhdGUgcmVhZAoKICBTcGxhc2hDb29yZCAqZ2V0TWF0cml4KCk7CiAgU3BsYXNoUGF0dGVybiAqZ2V0U3Ryb2tlUGF0dGVybigpOwogIFNwbGFzaFBhdHRlcm4gKmdldEZpbGxQYXR0ZXJuKCk7CiAgU3BsYXNoU2NyZWVuICpnZXRTY3JlZW4oKTsKICBTcGxhc2hCbGVuZEZ1bmMgZ2V0QmxlbmRGdW5jKCk7CiAgU3BsYXNoQ29vcmQgZ2V0U3Ryb2tlQWxwaGEoKTsKICBTcGxhc2hDb29yZCBnZXRGaWxsQWxwaGEoKTsKICBTcGxhc2hDb29yZCBnZXRMaW5lV2lkdGgoKTsKICBpbnQgZ2V0TGluZUNhcCgpOwogIGludCBnZXRMaW5lSm9pbigpOwogIFNwbGFzaENvb3JkIGdldE1pdGVyTGltaXQoKTsKICBTcGxhc2hDb29yZCBnZXRGbGF0bmVzcygpOwogIFNwbGFzaENvb3JkICpnZXRMaW5lRGFzaCgpOwogIGludCBnZXRMaW5lRGFzaExlbmd0aCgpOwogIFNwbGFzaENvb3JkIGdldExpbmVEYXNoUGhhc2UoKTsKICBib29sIGdldFN0cm9rZUFkanVzdCgpOwogIFNwbGFzaENsaXAgKmdldENsaXAoKTsKICBTcGxhc2hCaXRtYXAgKmdldFNvZnRNYXNrKCk7CiAgYm9vbCBnZXRJbk5vbklzb2xhdGVkR3JvdXAoKTsKCiAgLy8tLS0tLSBzdGF0ZSB3cml0ZQoKICB2b2lkIHNldE1hdHJpeChTcGxhc2hDb29yZCAqbWF0cml4KTsKICB2b2lkIHNldFN0cm9rZVBhdHRlcm4oU3BsYXNoUGF0dGVybiAqc3Ryb2tlQ29sb3IpOwogIHZvaWQgc2V0RmlsbFBhdHRlcm4oU3BsYXNoUGF0dGVybiAqZmlsbENvbG9yKTsKICB2b2lkIHNldFNjcmVlbihTcGxhc2hTY3JlZW4gKnNjcmVlbik7CiAgdm9pZCBzZXRCbGVuZEZ1bmMoU3BsYXNoQmxlbmRGdW5jIGZ1bmMpOwogIHZvaWQgc2V0U3Ryb2tlQWxwaGEoU3BsYXNoQ29vcmQgYWxwaGEpOwogIHZvaWQgc2V0RmlsbEFscGhhKFNwbGFzaENvb3JkIGFscGhhKTsKICB2b2lkIHNldFBhdHRlcm5BbHBoYShTcGxhc2hDb29yZCBzdHJva2VBbHBoYSwgU3BsYXNoQ29vcmQgZmlsbEFscGhhKTsKICB2b2lkIGNsZWFyUGF0dGVybkFscGhhKCk7CiAgdm9pZCBzZXRGaWxsT3ZlcnByaW50KGJvb2wgZm9wKTsKICB2b2lkIHNldFN0cm9rZU92ZXJwcmludChib29sIHNvcCk7CiAgdm9pZCBzZXRPdmVycHJpbnRNb2RlKGludCBvcG0pOwogIHZvaWQgc2V0TGluZVdpZHRoKFNwbGFzaENvb3JkIGxpbmVXaWR0aCk7CiAgdm9pZCBzZXRMaW5lQ2FwKGludCBsaW5lQ2FwKTsKICB2b2lkIHNldExpbmVKb2luKGludCBsaW5lSm9pbik7CiAgdm9pZCBzZXRNaXRlckxpbWl0KFNwbGFzaENvb3JkIG1pdGVyTGltaXQpOwogIHZvaWQgc2V0RmxhdG5lc3MoU3BsYXNoQ29vcmQgZmxhdG5lc3MpOwogIC8vIHRoZSA8bGluZURhc2g+IGFycmF5IHdpbGwgYmUgY29waWVkCiAgdm9pZCBzZXRMaW5lRGFzaChTcGxhc2hDb29yZCAqbGluZURhc2gsIGludCBsaW5lRGFzaExlbmd0aCwKCQkgICBTcGxhc2hDb29yZCBsaW5lRGFzaFBoYXNlKTsKICB2b2lkIHNldFN0cm9rZUFkanVzdChib29sIHN0cm9rZUFkanVzdCk7CiAgLy8gTkI6IHVzZXMgdHJhbnNmb3JtZWQgY29vcmRpbmF0ZXMuCiAgdm9pZCBjbGlwUmVzZXRUb1JlY3QoU3BsYXNoQ29vcmQgeDAsIFNwbGFzaENvb3JkIHkwLAoJCSAgICAgICBTcGxhc2hDb29yZCB4MSwgU3BsYXNoQ29vcmQgeTEpOwogIC8vIE5COiB1c2VzIHRyYW5zZm9ybWVkIGNvb3JkaW5hdGVzLgogIFNwbGFzaEVycm9yIGNsaXBUb1JlY3QoU3BsYXNoQ29vcmQgeDAsIFNwbGFzaENvb3JkIHkwLAoJCQkgU3BsYXNoQ29vcmQgeDEsIFNwbGFzaENvb3JkIHkxKTsKICAvLyBOQjogdXNlcyB1bnRyYW5zZm9ybWVkIGNvb3JkaW5hdGVzLgogIFNwbGFzaEVycm9yIGNsaXBUb1BhdGgoU3BsYXNoUGF0aCAqcGF0aCwgYm9vbCBlbyk7CiAgdm9pZCBzZXRTb2Z0TWFzayhTcGxhc2hCaXRtYXAgKnNvZnRNYXNrKTsKICB2b2lkIHNldEluTm9uSXNvbGF0ZWRHcm91cChTcGxhc2hCaXRtYXAgKmFscGhhMEJpdG1hcEEsCgkJCSAgICAgaW50IGFscGhhMFhBLCBpbnQgYWxwaGEwWUEpOwogIHZvaWQgc2V0VHJhbnNmZXIodW5zaWduZWQgY2hhciAqcmVkLCB1bnNpZ25lZCBjaGFyICpncmVlbiwgdW5zaWduZWQgY2hhciAqYmx1ZSwgdW5zaWduZWQgY2hhciAqZ3JheSk7CiAgdm9pZCBzZXRPdmVycHJpbnRNYXNrKHVuc2lnbmVkIGludCBvdmVycHJpbnRNYXNrLCBib29sIGFkZGl0aXZlKTsKCiAgLy8tLS0tLSBzdGF0ZSBzYXZlL3Jlc3RvcmUKCiAgdm9pZCBzYXZlU3RhdGUoKTsKICBTcGxhc2hFcnJvciByZXN0b3JlU3RhdGUoKTsKCiAgLy8tLS0tLSBkcmF3aW5nIG9wZXJhdGlvbnMKCiAgLy8gRmlsbCB0aGUgYml0bWFwIHdpdGggPGNvbG9yPi4gIFRoaXMgaXMgbm90IHN1YmplY3QgdG8gY2xpcHBpbmcuCiAgdm9pZCBjbGVhcihTcGxhc2hDb2xvclB0ciBjb2xvciwgdW5zaWduZWQgY2hhciBhbHBoYSA9IDB4MDApOwoKICAvLyBTdHJva2UgYSBwYXRoIHVzaW5nIHRoZSBjdXJyZW50IHN0cm9rZSBwYXR0ZXJuLgogIFNwbGFzaEVycm9yIHN0cm9rZShTcGxhc2hQYXRoICpwYXRoKTsKCiAgLy8gRmlsbCBhIHBhdGggdXNpbmcgdGhlIGN1cnJlbnQgZmlsbCBwYXR0ZXJuLgogIFNwbGFzaEVycm9yIGZpbGwoU3BsYXNoUGF0aCAqcGF0aCwgYm9vbCBlbyk7CgogIC8vIEZpbGwgYSBwYXRoLCBYT1Jpbmcgd2l0aCB0aGUgY3VycmVudCBmaWxsIHBhdHRlcm4uCiAgU3BsYXNoRXJyb3IgeG9yRmlsbChTcGxhc2hQYXRoICpwYXRoLCBib29sIGVvKTsKCiAgLy8gRHJhdyBhIGNoYXJhY3RlciwgdXNpbmcgdGhlIGN1cnJlbnQgZmlsbCBwYXR0ZXJuLgogIFNwbGFzaEVycm9yIGZpbGxDaGFyKFNwbGFzaENvb3JkIHgsIFNwbGFzaENvb3JkIHksIGludCBjLCBTcGxhc2hGb250ICpmb250KTsKCiAgLy8gRHJhdyBhIGdseXBoLCB1c2luZyB0aGUgY3VycmVudCBmaWxsIHBhdHRlcm4uICBUaGlzIGZ1bmN0aW9uIGRvZXMKICAvLyBub3QgZnJlZSBhbnkgZGF0YSwgaS5lLiwgaXQgaWdub3JlcyBnbHlwaC0+ZnJlZURhdGEuCiAgdm9pZCBmaWxsR2x5cGgoU3BsYXNoQ29vcmQgeCwgU3BsYXNoQ29vcmQgeSwKCQkJU3BsYXNoR2x5cGhCaXRtYXAgKmdseXBoKTsKCiAgLy8gRHJhd3MgYW4gaW1hZ2UgbWFzayB1c2luZyB0aGUgZmlsbCBjb2xvci4gIFRoaXMgd2lsbCByZWFkIDxoPgogIC8vIGxpbmVzIG9mIDx3PiBwaXhlbHMgZnJvbSA8c3JjPiwgc3RhcnRpbmcgd2l0aCB0aGUgdG9wIGxpbmUuICAiMSIKICAvLyBwaXhlbHMgd2lsbCBiZSBkcmF3biB3aXRoIHRoZSBjdXJyZW50IGZpbGwgY29sb3I7ICIwIiBwaXhlbHMgYXJlCiAgLy8gdHJhbnNwYXJlbnQuICBUaGUgbWF0cml4OgogIC8vICAgIFsgbWF0WzBdIG1hdFsxXSAwIF0KICAvLyAgICBbIG1hdFsyXSBtYXRbM10gMCBdCiAgLy8gICAgWyBtYXRbNF0gbWF0WzVdIDEgXQogIC8vIG1hcHMgYSB1bml0IHNxdWFyZSB0byB0aGUgZGVzaXJlZCBkZXN0aW5hdGlvbiBmb3IgdGhlIGltYWdlLCBpbgogIC8vIFBvc3RTY3JpcHQgc3R5bGU6CiAgLy8gICAgW3gnIHknIDFdID0gW3ggeSAxXSAqIG1hdAogIC8vIE5vdGUgdGhhdCB0aGUgU3BsYXNoIHkgYXhpcyBwb2ludHMgZG93bndhcmQsIGFuZCB0aGUgaW1hZ2Ugc291cmNlCiAgLy8gaXMgYXNzdW1lZCB0byBwcm9kdWNlIHBpeGVscyBpbiByYXN0ZXIgb3JkZXIsIHN0YXJ0aW5nIGZyb20gdGhlCiAgLy8gdG9wIGxpbmUuCiAgU3BsYXNoRXJyb3IgZmlsbEltYWdlTWFzayhTcGxhc2hJbWFnZU1hc2tTb3VyY2Ugc3JjLCB2b2lkICpzcmNEYXRhLAoJCQkgICAgaW50IHcsIGludCBoLCBTcGxhc2hDb29yZCAqbWF0LAoJCQkgICAgYm9vbCBnbHlwaE1vZGUpOwoKICAvLyBEcmF3IGFuIGltYWdlLiAgVGhpcyB3aWxsIHJlYWQgPGg+IGxpbmVzIG9mIDx3PiBwaXhlbHMgZnJvbQogIC8vIDxzcmM+LCBzdGFydGluZyB3aXRoIHRoZSB0b3AgbGluZS4gIFRoZXNlIHBpeGVscyBhcmUgYXNzdW1lZCB0bwogIC8vIGJlIGluIHRoZSBzb3VyY2UgbW9kZSwgPHNyY01vZGU+LiAgSWYgPHNyY0FscGhhPiBpcyB0cnVlLCB0aGUKICAvLyBhbHBoYSB2YWx1ZXMgcmV0dXJuZWQgYnkgPHNyYz4gYXJlIHVzZWQ7IG90aGVyd2lzZSB0aGV5IGFyZQogIC8vIGlnbm9yZWQuICBUaGUgZm9sbG93aW5nIGNvbWJpbmF0aW9ucyBvZiBzb3VyY2UgYW5kIHRhcmdldCBtb2RlcwogIC8vIGFyZSBzdXBwb3J0ZWQ6CiAgLy8gICAgc291cmNlICAgICAgIHRhcmdldAogIC8vICAgIC0tLS0tLSAgICAgICAtLS0tLS0KICAvLyAgICBNb25vMSAgICAgICAgTW9ubzEKICAvLyAgICBNb25vOCAgICAgICAgTW9ubzEgICAtLSB3aXRoIGRpdGhlcmluZwogIC8vICAgIE1vbm84ICAgICAgICBNb25vOAogIC8vICAgIFJHQjggICAgICAgICBSR0I4CiAgLy8gICAgQkdSOCAgICAgICAgIEJHUjgKICAvLyAgICBDTVlLOCAgICAgICAgQ01ZSzgKICAvLyBUaGUgbWF0cml4IGJlaGF2ZXMgYXMgZm9yIGZpbGxJbWFnZU1hc2suCiAgU3BsYXNoRXJyb3IgZHJhd0ltYWdlKFNwbGFzaEltYWdlU291cmNlIHNyYywgU3BsYXNoSUNDVHJhbnNmb3JtIHRmLCB2b2lkICpzcmNEYXRhLAoJCQlTcGxhc2hDb2xvck1vZGUgc3JjTW9kZSwgYm9vbCBzcmNBbHBoYSwKCQkJaW50IHcsIGludCBoLCBTcGxhc2hDb29yZCAqbWF0LCBib29sIGludGVycG9sYXRlLAoJCQlib29sIHRpbGluZ1BhdHRlcm4gPSBmYWxzZSk7CgogIC8vIENvbXBvc2l0ZSBhIHJlY3Rhbmd1bGFyIHJlZ2lvbiBmcm9tIDxzcmM+IG9udG8gdGhpcyBTcGxhc2gKICAvLyBvYmplY3QuCiAgU3BsYXNoRXJyb3IgY29tcG9zaXRlKFNwbGFzaEJpdG1hcCAqc3JjLCBpbnQgeFNyYywgaW50IHlTcmMsCgkJCWludCB4RGVzdCwgaW50IHlEZXN0LCBpbnQgdywgaW50IGgsCgkJCWJvb2wgbm9DbGlwLCBib29sIG5vbklzb2xhdGVkLAoJCQlib29sIGtub2Nrb3V0ID0gZmFsc2UsIFNwbGFzaENvb3JkIGtub2Nrb3V0T3BhY2l0eSA9IDEuMCk7CgogIC8vIENvbXBvc2l0ZSB0aGlzIFNwbGFzaCBvYmplY3Qgb250byBhIGJhY2tncm91bmQgY29sb3IuICBUaGUKICAvLyBiYWNrZ3JvdW5kIGFscGhhIGlzIGFzc3VtZWQgdG8gYmUgMS4KICB2b2lkIGNvbXBvc2l0ZUJhY2tncm91bmQoU3BsYXNoQ29sb3JQdHIgY29sb3IpOwoKICAvLyBDb3B5IGEgcmVjdGFuZ3VsYXIgcmVnaW9uIGZyb20gPHNyYz4gb250byB0aGUgYml0bWFwIGJlbG9uZ2luZyB0bwogIC8vIHRoaXMgU3BsYXNoIG9iamVjdC4gIFRoZSBkZXN0aW5hdGlvbiBhbHBoYSB2YWx1ZXMgYXJlIGFsbCBzZXQgdG8KICAvLyB6ZXJvLgogIFNwbGFzaEVycm9yIGJsaXRUcmFuc3BhcmVudChTcGxhc2hCaXRtYXAgKnNyYywgaW50IHhTcmMsIGludCB5U3JjLAoJCQkgICAgICBpbnQgeERlc3QsIGludCB5RGVzdCwgaW50IHcsIGludCBoKTsKICB2b2lkIGJsaXRJbWFnZShTcGxhc2hCaXRtYXAgKnNyYywgYm9vbCBzcmNBbHBoYSwgaW50IHhEZXN0LCBpbnQgeURlc3QpOwoKICAvLy0tLS0tIG1pc2MKCiAgLy8gQ29uc3RydWN0IGEgcGF0aCBmb3IgYSBzdHJva2UsIGdpdmVuIHRoZSBwYXRoIHRvIGJlIHN0cm9rZWQgYW5kCiAgLy8gdGhlIGxpbmUgd2lkdGggPHc+LiAgQWxsIG90aGVyIHN0cm9rZSBwYXJhbWV0ZXJzIGFyZSB0YWtlbiBmcm9tCiAgLy8gdGhlIGN1cnJlbnQgc3RhdGUuICBJZiA8ZmxhdHRlbj4gaXMgdHJ1ZSwgdGhpcyBmdW5jdGlvbiB3aWxsCiAgLy8gZmlyc3QgZmxhdHRlbiB0aGUgcGF0aCBhbmQgaGFuZGxlIHRoZSBsaW5lZGFzaC4KICBTcGxhc2hQYXRoICptYWtlU3Ryb2tlUGF0aChTcGxhc2hQYXRoICpwYXRoLCBTcGxhc2hDb29yZCB3LAoJCQkgICAgIGJvb2wgZmxhdHRlbiA9IHRydWUpOwoKICAvLyBSZXR1cm4gdGhlIGFzc29jaWF0ZWQgYml0bWFwLgogIFNwbGFzaEJpdG1hcCAqZ2V0Qml0bWFwKCkgeyByZXR1cm4gYml0bWFwOyB9CgogIC8vIFNldCB0aGUgbWluaW11bSBsaW5lIHdpZHRoLgogIHZvaWQgc2V0TWluTGluZVdpZHRoKFNwbGFzaENvb3JkIHcpIHsgbWluTGluZVdpZHRoID0gdzsgfQoKICAvLyBTZXR0ZXIvR2V0dGVyIGZvciB0aGluIGxpbmUgbW9kZQogIHZvaWQgc2V0VGhpbkxpbmVNb2RlKFNwbGFzaFRoaW5MaW5lTW9kZSB0aGluTGluZU1vZGVBKSB7IHRoaW5MaW5lTW9kZSA9IHRoaW5MaW5lTW9kZUE7IH0KICBTcGxhc2hUaGluTGluZU1vZGUgZ2V0VGhpbkxpbmVNb2RlKCkgeyByZXR1cm4gdGhpbkxpbmVNb2RlOyB9CgogIC8vIEdldCBhIGJvdW5kaW5nIGJveCB3aGljaCBpbmNsdWRlcyBhbGwgbW9kaWZpY2F0aW9ucyBzaW5jZSB0aGUKICAvLyBsYXN0IGNhbGwgdG8gY2xlYXJNb2RSZWdpb24uCiAgdm9pZCBnZXRNb2RSZWdpb24oaW50ICp4TWluLCBpbnQgKnlNaW4sIGludCAqeE1heCwgaW50ICp5TWF4KQogICAgeyAqeE1pbiA9IG1vZFhNaW47ICp5TWluID0gbW9kWU1pbjsgKnhNYXggPSBtb2RYTWF4OyAqeU1heCA9IG1vZFlNYXg7IH0KCiAgLy8gQ2xlYXIgdGhlIG1vZGlmaWVkIHJlZ2lvbiBib3VuZGluZyBib3guCiAgdm9pZCBjbGVhck1vZFJlZ2lvbigpOwoKICAvLyBHZXQgY2xpcHBpbmcgc3RhdHVzIGZvciB0aGUgbGFzdCBkcmF3aW5nIG9wZXJhdGlvbiBzdWJqZWN0IHRvCiAgLy8gY2xpcHBpbmcuCiAgU3BsYXNoQ2xpcFJlc3VsdCBnZXRDbGlwUmVzKCkgeyByZXR1cm4gb3BDbGlwUmVzOyB9CgogIC8vIFRvZ2dsZSBkZWJ1ZyBtb2RlIG9uIG9yIG9mZi4KICB2b2lkIHNldERlYnVnTW9kZShib29sIGRlYnVnTW9kZUEpIHsgZGVidWdNb2RlID0gZGVidWdNb2RlQTsgfQoKI2lmIDEgLy9+dG1wOiB0dXJuIG9mZiBhbnRpLWFsaWFzaW5nIHRlbXBvcmFyaWx5CiAgdm9pZCBzZXRJblNoYWRpbmcoYm9vbCBzaCkgeyBpblNoYWRpbmcgPSBzaDsgfQogIGJvb2wgZ2V0VmVjdG9yQW50aWFsaWFzKCkgeyByZXR1cm4gdmVjdG9yQW50aWFsaWFzOyB9CiAgdm9pZCBzZXRWZWN0b3JBbnRpYWxpYXMoYm9vbCB2YWEpIHsgdmVjdG9yQW50aWFsaWFzID0gdmFhOyB9CiNlbmRpZgoKICAvLyBEbyBzaGFkZWQgZmlsbHMgd2l0aCBkeW5hbWljIHBhdHRlcm5zCiAgU3BsYXNoRXJyb3Igc2hhZGVkRmlsbChTcGxhc2hQYXRoICpwYXRoLCBib29sIGhhc0JCb3gsCiAgICAgICAgICAgICAgICAgICAgICAgICBTcGxhc2hQYXR0ZXJuICpwYXR0ZXJuKTsKICAvLyBEcmF3IGEgZ291cmF1ZCB0cmlhbmdsZSBzaGFkaW5nLgogIGJvb2wgZ291cmF1ZFRyaWFuZ2xlU2hhZGVkRmlsbChTcGxhc2hHb3VyYXVkQ29sb3IgKnNoYWRpbmcpOwoKcHJpdmF0ZToKCiAgdm9pZCBwaXBlSW5pdChTcGxhc2hQaXBlICpwaXBlLCBpbnQgeCwgaW50IHksCgkJU3BsYXNoUGF0dGVybiAqcGF0dGVybiwgU3BsYXNoQ29sb3JQdHIgY1NyYywKCQl1bnNpZ25lZCBjaGFyIGFJbnB1dCwgYm9vbCB1c2VzU2hhcGUsCgkJYm9vbCBub25Jc29sYXRlZEdyb3VwLAoJCWJvb2wga25vY2tvdXQgPSBmYWxzZSwgdW5zaWduZWQgY2hhciBrbm9ja291dE9wYWNpdHkgPSAyNTUpOwogIHZvaWQgcGlwZVJ1bihTcGxhc2hQaXBlICpwaXBlKTsKICB2b2lkIHBpcGVSdW5TaW1wbGVNb25vMShTcGxhc2hQaXBlICpwaXBlKTsKICB2b2lkIHBpcGVSdW5TaW1wbGVNb25vOChTcGxhc2hQaXBlICpwaXBlKTsKICB2b2lkIHBpcGVSdW5TaW1wbGVSR0I4KFNwbGFzaFBpcGUgKnBpcGUpOwogIHZvaWQgcGlwZVJ1blNpbXBsZVhCR1I4KFNwbGFzaFBpcGUgKnBpcGUpOwogIHZvaWQgcGlwZVJ1blNpbXBsZUJHUjgoU3BsYXNoUGlwZSAqcGlwZSk7CiNpZmRlZiBTUExBU0hfQ01ZSwogIHZvaWQgcGlwZVJ1blNpbXBsZUNNWUs4KFNwbGFzaFBpcGUgKnBpcGUpOwogIHZvaWQgcGlwZVJ1blNpbXBsZURldmljZU44KFNwbGFzaFBpcGUgKnBpcGUpOwojZW5kaWYKICB2b2lkIHBpcGVSdW5BQU1vbm8xKFNwbGFzaFBpcGUgKnBpcGUpOwogIHZvaWQgcGlwZVJ1bkFBTW9ubzgoU3BsYXNoUGlwZSAqcGlwZSk7CiAgdm9pZCBwaXBlUnVuQUFSR0I4KFNwbGFzaFBpcGUgKnBpcGUpOwogIHZvaWQgcGlwZVJ1bkFBWEJHUjgoU3BsYXNoUGlwZSAqcGlwZSk7CiAgdm9pZCBwaXBlUnVuQUFCR1I4KFNwbGFzaFBpcGUgKnBpcGUpOwojaWZkZWYgU1BMQVNIX0NNWUsKICB2b2lkIHBpcGVSdW5BQUNNWUs4KFNwbGFzaFBpcGUgKnBpcGUpOwogIHZvaWQgcGlwZVJ1bkFBRGV2aWNlTjgoU3BsYXNoUGlwZSAqcGlwZSk7CiNlbmRpZgogIHZvaWQgcGlwZVNldFhZKFNwbGFzaFBpcGUgKnBpcGUsIGludCB4LCBpbnQgeSk7CiAgdm9pZCBwaXBlSW5jWChTcGxhc2hQaXBlICpwaXBlKTsKICB2b2lkIGRyYXdQaXhlbChTcGxhc2hQaXBlICpwaXBlLCBpbnQgeCwgaW50IHksIGJvb2wgbm9DbGlwKTsKICB2b2lkIGRyYXdBQVBpeGVsSW5pdCgpOwogIHZvaWQgZHJhd0FBUGl4ZWwoU3BsYXNoUGlwZSAqcGlwZSwgaW50IHgsIGludCB5KTsKICB2b2lkIGRyYXdTcGFuKFNwbGFzaFBpcGUgKnBpcGUsIGludCB4MCwgaW50IHgxLCBpbnQgeSwgYm9vbCBub0NsaXApOwogIHZvaWQgZHJhd0FBTGluZShTcGxhc2hQaXBlICpwaXBlLCBpbnQgeDAsIGludCB4MSwgaW50IHksIGJvb2wgYWRqdXN0TGluZSA9IGZhbHNlLCB1bnNpZ25lZCBjaGFyIGxpbmVPcGFjaXR5ID0gMCk7CiAgdm9pZCB0cmFuc2Zvcm0oU3BsYXNoQ29vcmQgKm1hdHJpeCwgU3BsYXNoQ29vcmQgeGksIFNwbGFzaENvb3JkIHlpLAoJCSBTcGxhc2hDb29yZCAqeG8sIFNwbGFzaENvb3JkICp5byk7CiAgdm9pZCB1cGRhdGVNb2RYKGludCB4KTsKICB2b2lkIHVwZGF0ZU1vZFkoaW50IHkpOwogIHZvaWQgc3Ryb2tlTmFycm93KFNwbGFzaFBhdGggKnBhdGgpOwogIHZvaWQgc3Ryb2tlV2lkZShTcGxhc2hQYXRoICpwYXRoLCBTcGxhc2hDb29yZCB3KTsKICBTcGxhc2hQYXRoICpmbGF0dGVuUGF0aChTcGxhc2hQYXRoICpwYXRoLCBTcGxhc2hDb29yZCAqbWF0cml4LAoJCQkgIFNwbGFzaENvb3JkIGZsYXRuZXNzKTsKICB2b2lkIGZsYXR0ZW5DdXJ2ZShTcGxhc2hDb29yZCB4MCwgU3BsYXNoQ29vcmQgeTAsCgkJICAgIFNwbGFzaENvb3JkIHgxLCBTcGxhc2hDb29yZCB5MSwKCQkgICAgU3BsYXNoQ29vcmQgeDIsIFNwbGFzaENvb3JkIHkyLAoJCSAgICBTcGxhc2hDb29yZCB4MywgU3BsYXNoQ29vcmQgeTMsCgkJICAgIFNwbGFzaENvb3JkICptYXRyaXgsIFNwbGFzaENvb3JkIGZsYXRuZXNzMiwKCQkgICAgU3BsYXNoUGF0aCAqZlBhdGgpOwogIFNwbGFzaFBhdGggKm1ha2VEYXNoZWRQYXRoKFNwbGFzaFBhdGggKnhQYXRoKTsKICB2b2lkIGdldEJCb3hGUChTcGxhc2hQYXRoICpwYXRoLCBTcGxhc2hDb29yZCAqeE1pbkEsIFNwbGFzaENvb3JkICp5TWluQSwgU3BsYXNoQ29vcmQgKnhNYXhBLCBTcGxhc2hDb29yZCAqeU1heEEpOwogIFNwbGFzaEVycm9yIGZpbGxXaXRoUGF0dGVybihTcGxhc2hQYXRoICpwYXRoLCBib29sIGVvLAoJCQkgICAgICBTcGxhc2hQYXR0ZXJuICpwYXR0ZXJuLCBTcGxhc2hDb29yZCBhbHBoYSk7CiAgYm9vbCBwYXRoQWxsT3V0c2lkZShTcGxhc2hQYXRoICpwYXRoKTsKICB2b2lkIGZpbGxHbHlwaDIoaW50IHgwLCBpbnQgeTAsIFNwbGFzaEdseXBoQml0bWFwICpnbHlwaCwgYm9vbCBub2NsaXApOwogIHZvaWQgYXJiaXRyYXJ5VHJhbnNmb3JtTWFzayhTcGxhc2hJbWFnZU1hc2tTb3VyY2Ugc3JjLCB2b2lkICpzcmNEYXRhLAoJCQkgICAgICBpbnQgc3JjV2lkdGgsIGludCBzcmNIZWlnaHQsCgkJCSAgICAgIFNwbGFzaENvb3JkICptYXQsIGJvb2wgZ2x5cGhNb2RlKTsKICBTcGxhc2hCaXRtYXAgKnNjYWxlTWFzayhTcGxhc2hJbWFnZU1hc2tTb3VyY2Ugc3JjLCB2b2lkICpzcmNEYXRhLAoJCQkgIGludCBzcmNXaWR0aCwgaW50IHNyY0hlaWdodCwKCQkJICBpbnQgc2NhbGVkV2lkdGgsIGludCBzY2FsZWRIZWlnaHQpOwogIHZvaWQgc2NhbGVNYXNrWWRYZChTcGxhc2hJbWFnZU1hc2tTb3VyY2Ugc3JjLCB2b2lkICpzcmNEYXRhLAoJCSAgICAgaW50IHNyY1dpZHRoLCBpbnQgc3JjSGVpZ2h0LAoJCSAgICAgaW50IHNjYWxlZFdpZHRoLCBpbnQgc2NhbGVkSGVpZ2h0LAoJCSAgICAgU3BsYXNoQml0bWFwICpkZXN0KTsKICB2b2lkIHNjYWxlTWFza1lkWHUoU3BsYXNoSW1hZ2VNYXNrU291cmNlIHNyYywgdm9pZCAqc3JjRGF0YSwKCQkgICAgIGludCBzcmNXaWR0aCwgaW50IHNyY0hlaWdodCwKCQkgICAgIGludCBzY2FsZWRXaWR0aCwgaW50IHNjYWxlZEhlaWdodCwKCQkgICAgIFNwbGFzaEJpdG1hcCAqZGVzdCk7CiAgdm9pZCBzY2FsZU1hc2tZdVhkKFNwbGFzaEltYWdlTWFza1NvdXJjZSBzcmMsIHZvaWQgKnNyY0RhdGEsCgkJICAgICBpbnQgc3JjV2lkdGgsIGludCBzcmNIZWlnaHQsCgkJICAgICBpbnQgc2NhbGVkV2lkdGgsIGludCBzY2FsZWRIZWlnaHQsCgkJICAgICBTcGxhc2hCaXRtYXAgKmRlc3QpOwogIHZvaWQgc2NhbGVNYXNrWXVYdShTcGxhc2hJbWFnZU1hc2tTb3VyY2Ugc3JjLCB2b2lkICpzcmNEYXRhLAoJCSAgICAgaW50IHNyY1dpZHRoLCBpbnQgc3JjSGVpZ2h0LAoJCSAgICAgaW50IHNjYWxlZFdpZHRoLCBpbnQgc2NhbGVkSGVpZ2h0LAoJCSAgICAgU3BsYXNoQml0bWFwICpkZXN0KTsKICB2b2lkIGJsaXRNYXNrKFNwbGFzaEJpdG1hcCAqc3JjLCBpbnQgeERlc3QsIGludCB5RGVzdCwKCQlTcGxhc2hDbGlwUmVzdWx0IGNsaXBSZXMpOwogIFNwbGFzaEVycm9yIGFyYml0cmFyeVRyYW5zZm9ybUltYWdlKFNwbGFzaEltYWdlU291cmNlIHNyYywgU3BsYXNoSUNDVHJhbnNmb3JtIHRmLCB2b2lkICpzcmNEYXRhLAoJCQkgICAgICAgU3BsYXNoQ29sb3JNb2RlIHNyY01vZGUsIGludCBuQ29tcHMsCgkJCSAgICAgICBib29sIHNyY0FscGhhLAoJCQkgICAgICAgaW50IHNyY1dpZHRoLCBpbnQgc3JjSGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3BsYXNoQ29vcmQgKm1hdCwgYm9vbCBpbnRlcnBvbGF0ZSwgYm9vbCB0aWxpbmdQYXR0ZXJuID0gZmFsc2UpOwogIFNwbGFzaEJpdG1hcCAqc2NhbGVJbWFnZShTcGxhc2hJbWFnZVNvdXJjZSBzcmMsIHZvaWQgKnNyY0RhdGEsCgkJCSAgIFNwbGFzaENvbG9yTW9kZSBzcmNNb2RlLCBpbnQgbkNvbXBzLAoJCQkgICBib29sIHNyY0FscGhhLCBpbnQgc3JjV2lkdGgsIGludCBzcmNIZWlnaHQsCgkJCSAgIGludCBzY2FsZWRXaWR0aCwgaW50IHNjYWxlZEhlaWdodCwgYm9vbCBpbnRlcnBvbGF0ZSwgYm9vbCB0aWxpbmdQYXR0ZXJuID0gZmFsc2UpOwogIHZvaWQgc2NhbGVJbWFnZVlkWGQoU3BsYXNoSW1hZ2VTb3VyY2Ugc3JjLCB2b2lkICpzcmNEYXRhLAoJCSAgICAgIFNwbGFzaENvbG9yTW9kZSBzcmNNb2RlLCBpbnQgbkNvbXBzLAoJCSAgICAgIGJvb2wgc3JjQWxwaGEsIGludCBzcmNXaWR0aCwgaW50IHNyY0hlaWdodCwKCQkgICAgICBpbnQgc2NhbGVkV2lkdGgsIGludCBzY2FsZWRIZWlnaHQsCgkJICAgICAgU3BsYXNoQml0bWFwICpkZXN0KTsKICB2b2lkIHNjYWxlSW1hZ2VZZFh1KFNwbGFzaEltYWdlU291cmNlIHNyYywgdm9pZCAqc3JjRGF0YSwKCQkgICAgICBTcGxhc2hDb2xvck1vZGUgc3JjTW9kZSwgaW50IG5Db21wcywKCQkgICAgICBib29sIHNyY0FscGhhLCBpbnQgc3JjV2lkdGgsIGludCBzcmNIZWlnaHQsCgkJICAgICAgaW50IHNjYWxlZFdpZHRoLCBpbnQgc2NhbGVkSGVpZ2h0LAoJCSAgICAgIFNwbGFzaEJpdG1hcCAqZGVzdCk7CiAgdm9pZCBzY2FsZUltYWdlWXVYZChTcGxhc2hJbWFnZVNvdXJjZSBzcmMsIHZvaWQgKnNyY0RhdGEsCgkJICAgICAgU3BsYXNoQ29sb3JNb2RlIHNyY01vZGUsIGludCBuQ29tcHMsCgkJICAgICAgYm9vbCBzcmNBbHBoYSwgaW50IHNyY1dpZHRoLCBpbnQgc3JjSGVpZ2h0LAoJCSAgICAgIGludCBzY2FsZWRXaWR0aCwgaW50IHNjYWxlZEhlaWdodCwKCQkgICAgICBTcGxhc2hCaXRtYXAgKmRlc3QpOwogIHZvaWQgc2NhbGVJbWFnZVl1WHUoU3BsYXNoSW1hZ2VTb3VyY2Ugc3JjLCB2b2lkICpzcmNEYXRhLAoJCSAgICAgIFNwbGFzaENvbG9yTW9kZSBzcmNNb2RlLCBpbnQgbkNvbXBzLAoJCSAgICAgIGJvb2wgc3JjQWxwaGEsIGludCBzcmNXaWR0aCwgaW50IHNyY0hlaWdodCwKCQkgICAgICBpbnQgc2NhbGVkV2lkdGgsIGludCBzY2FsZWRIZWlnaHQsCgkJICAgICAgU3BsYXNoQml0bWFwICpkZXN0KTsKICB2b2lkIHNjYWxlSW1hZ2VZdVh1QmlsaW5lYXIoU3BsYXNoSW1hZ2VTb3VyY2Ugc3JjLCB2b2lkICpzcmNEYXRhLAoJCSAgICAgIFNwbGFzaENvbG9yTW9kZSBzcmNNb2RlLCBpbnQgbkNvbXBzLAoJCSAgICAgIGJvb2wgc3JjQWxwaGEsIGludCBzcmNXaWR0aCwgaW50IHNyY0hlaWdodCwKCQkgICAgICBpbnQgc2NhbGVkV2lkdGgsIGludCBzY2FsZWRIZWlnaHQsCgkJICAgICAgU3BsYXNoQml0bWFwICpkZXN0KTsKICB2b2lkIHZlcnRGbGlwSW1hZ2UoU3BsYXNoQml0bWFwICppbWcsIGludCB3aWR0aCwgaW50IGhlaWdodCwKCQkgICAgIGludCBuQ29tcHMpOwogIHZvaWQgYmxpdEltYWdlKFNwbGFzaEJpdG1hcCAqc3JjLCBib29sIHNyY0FscGhhLCBpbnQgeERlc3QsIGludCB5RGVzdCwKCQkgU3BsYXNoQ2xpcFJlc3VsdCBjbGlwUmVzKTsKICB2b2lkIGJsaXRJbWFnZUNsaXBwZWQoU3BsYXNoQml0bWFwICpzcmMsIGJvb2wgc3JjQWxwaGEsCgkJCWludCB4U3JjLCBpbnQgeVNyYywgaW50IHhEZXN0LCBpbnQgeURlc3QsCgkJCWludCB3LCBpbnQgaCk7CiAgdm9pZCBkdW1wUGF0aChTcGxhc2hQYXRoICpwYXRoKTsKICB2b2lkIGR1bXBYUGF0aChTcGxhc2hYUGF0aCAqcGF0aCk7CgogIHN0YXRpYyBTcGxhc2hQaXBlUmVzdWx0Q29sb3JDdHJsIHBpcGVSZXN1bHRDb2xvck5vQWxwaGFCbGVuZFtdOwogIHN0YXRpYyBTcGxhc2hQaXBlUmVzdWx0Q29sb3JDdHJsIHBpcGVSZXN1bHRDb2xvckFscGhhTm9CbGVuZFtdOwogIHN0YXRpYyBTcGxhc2hQaXBlUmVzdWx0Q29sb3JDdHJsIHBpcGVSZXN1bHRDb2xvckFscGhhQmxlbmRbXTsKICBzdGF0aWMgaW50IHBpcGVOb25Jc29Hcm91cENvcnJlY3Rpb25bXTsKCiAgU3BsYXNoQml0bWFwICpiaXRtYXA7CiAgU3BsYXNoU3RhdGUgKnN0YXRlOwogIFNwbGFzaEJpdG1hcCAqYWFCdWY7CiAgaW50IGFhQnVmWTsKICBTcGxhc2hCaXRtYXAgKmFscGhhMEJpdG1hcDsJLy8gZm9yIG5vbi1pc29sYXRlZCBncm91cHMsIHRoaXMgaXMgdGhlCgkJCQkvLyAgIGJpdG1hcCBjb250YWluaW5nIHRoZSBhbHBoYTAgdmFsdWVzCiAgaW50IGFscGhhMFgsIGFscGhhMFk7CQkvLyBvZmZzZXQgd2l0aGluIGFscGhhMEJpdG1hcAogIFNwbGFzaENvb3JkIGFhR2FtbWFbc3BsYXNoQUFTaXplICogc3BsYXNoQUFTaXplICsgMV07CiAgU3BsYXNoQ29vcmQgbWluTGluZVdpZHRoOwogIFNwbGFzaFRoaW5MaW5lTW9kZSB0aGluTGluZU1vZGU7CiAgaW50IG1vZFhNaW4sIG1vZFlNaW4sIG1vZFhNYXgsIG1vZFlNYXg7CiAgU3BsYXNoQ2xpcFJlc3VsdCBvcENsaXBSZXM7CiAgYm9vbCB2ZWN0b3JBbnRpYWxpYXM7CiAgYm9vbCBpblNoYWRpbmc7CiAgYm9vbCBkZWJ1Z01vZGU7Cn07CgojZW5kaWYK