Ly89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8KLy8gU3BsYXNoLmgKLy8KLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci8vCi8vIE1vZGlmaWVkIHVuZGVyIHRoZSBQb3BwbGVyIHByb2plY3QgLSBodHRwOi8vcG9wcGxlci5mcmVlZGVza3RvcC5vcmcKLy8KLy8gQWxsIGNoYW5nZXMgbWFkZSB1bmRlciB0aGUgUG9wcGxlciBwcm9qZWN0IHRvIHRoaXMgZmlsZSBhcmUgbGljZW5zZWQKLy8gdW5kZXIgR1BMIHZlcnNpb24gMiBvciBsYXRlcgovLwovLyBDb3B5cmlnaHQgKEMpIDIwMDUgTWFyY28gUGVzZW50aSBHcml0dGkgPG1wZ0ByZWRoYXQuY29tPgovLyBDb3B5cmlnaHQgKEMpIDIwMDcsIDIwMTEgQWxiZXJ0IEFzdGFscyBDaWQgPGFhY2lkQGtkZS5vcmc+Ci8vIENvcHlyaWdodCAoQykgMjAxMC0yMDEzLCAyMDE1IFRob21hcyBGcmVpdGFnIDxUaG9tYXMuRnJlaXRhZ0BhbGZhLmRlPgovLyBDb3B5cmlnaHQgKEMpIDIwMTAgQ2hyaXN0aWFuIEZldWVyc+RuZ2VyIDxjZmV1ZXJzYWVuZ2VyQGdvb2dsZW1haWwuY29tPgovLyBDb3B5cmlnaHQgKEMpIDIwMTIgQWRyaWFuIEpvaG5zb24gPGFqb2huc29uQHJlZG5lb24uY29tPgovLwovLyBUbyBzZWUgYSBkZXNjcmlwdGlvbiBvZiB0aGUgY2hhbmdlcyBwbGVhc2Ugc2VlIHRoZSBDaGFuZ2Vsb2cgZmlsZSB0aGF0Ci8vIGNhbWUgd2l0aCB5b3VyIHRhcmJhbGwgb3IgdHlwZSBtYWtlIENoYW5nZUxvZyBpZiB5b3UgYXJlIGJ1aWxkaW5nIGZyb20gZ2l0Ci8vCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgojaWZuZGVmIFNQTEFTSF9ICiNkZWZpbmUgU1BMQVNIX0gKCiNpZmRlZiBVU0VfR0NDX1BSQUdNQVMKI3ByYWdtYSBpbnRlcmZhY2UKI2VuZGlmCgojaW5jbHVkZSA8c3RkZGVmLmg+CiNpbmNsdWRlICJTcGxhc2hUeXBlcy5oIgojaW5jbHVkZSAiU3BsYXNoQ2xpcC5oIgojaW5jbHVkZSAiU3BsYXNoUGF0dGVybi5oIgoKY2xhc3MgU3BsYXNoQml0bWFwOwpzdHJ1Y3QgU3BsYXNoR2x5cGhCaXRtYXA7CmNsYXNzIFNwbGFzaFN0YXRlOwpjbGFzcyBTcGxhc2hTY3JlZW47CmNsYXNzIFNwbGFzaFBhdGg7CmNsYXNzIFNwbGFzaFhQYXRoOwpjbGFzcyBTcGxhc2hGb250OwpzdHJ1Y3QgU3BsYXNoUGlwZTsKCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgovLyBSZXRyaWV2ZXMgdGhlIG5leHQgbGluZSBvZiBwaXhlbHMgaW4gYW4gaW1hZ2UgbWFzay4gIE5vcm1hbGx5LAovLyBmaWxscyBpbiAqPGxpbmU+IGFuZCByZXR1cm5zIHRydWUuICBJZiB0aGUgaW1hZ2Ugc3RyZWFtIGlzCi8vIGV4aGF1c3RlZCwgcmV0dXJucyBmYWxzZS4KdHlwZWRlZiBHQm9vbCAoKlNwbGFzaEltYWdlTWFza1NvdXJjZSkodm9pZCAqZGF0YSwgU3BsYXNoQ29sb3JQdHIgcGl4ZWwpOwoKLy8gUmV0cmlldmVzIHRoZSBuZXh0IGxpbmUgb2YgcGl4ZWxzIGluIGFuIGltYWdlLiAgTm9ybWFsbHksIGZpbGxzIGluCi8vICo8bGluZT4gYW5kIHJldHVybnMgdHJ1ZS4gIElmIHRoZSBpbWFnZSBzdHJlYW0gaXMgZXhoYXVzdGVkLAovLyByZXR1cm5zIGZhbHNlLgp0eXBlZGVmIEdCb29sICgqU3BsYXNoSW1hZ2VTb3VyY2UpKHZvaWQgKmRhdGEsIFNwbGFzaENvbG9yUHRyIGNvbG9yTGluZSwKCQkJCSAgIEd1Y2hhciAqYWxwaGFMaW5lKTsKCi8vIFVzZSBJQ0NDb2xvclNwYWNlIHRvIHRyYW5zZm9ybSBhIGJpdG1hcAp0eXBlZGVmIHZvaWQgKCpTcGxhc2hJQ0NUcmFuc2Zvcm0pKHZvaWQgKmRhdGEsIFNwbGFzaEJpdG1hcCAqYml0bWFwKTsKCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgplbnVtIFNwbGFzaFBpcGVSZXN1bHRDb2xvckN0cmwgewojaWYgU1BMQVNIX0NNWUsKICBzcGxhc2hQaXBlUmVzdWx0Q29sb3JOb0FscGhhQmxlbmRDTVlLLAogIHNwbGFzaFBpcGVSZXN1bHRDb2xvck5vQWxwaGFCbGVuZERldmljZU4sCiNlbmRpZgogIHNwbGFzaFBpcGVSZXN1bHRDb2xvck5vQWxwaGFCbGVuZFJHQiwKICBzcGxhc2hQaXBlUmVzdWx0Q29sb3JOb0FscGhhQmxlbmRNb25vLAogIHNwbGFzaFBpcGVSZXN1bHRDb2xvckFscGhhTm9CbGVuZE1vbm8sCiAgc3BsYXNoUGlwZVJlc3VsdENvbG9yQWxwaGFOb0JsZW5kUkdCLAojaWYgU1BMQVNIX0NNWUsKICBzcGxhc2hQaXBlUmVzdWx0Q29sb3JBbHBoYU5vQmxlbmRDTVlLLAogIHNwbGFzaFBpcGVSZXN1bHRDb2xvckFscGhhTm9CbGVuZERldmljZU4sCiNlbmRpZgogIHNwbGFzaFBpcGVSZXN1bHRDb2xvckFscGhhQmxlbmRNb25vLAogIHNwbGFzaFBpcGVSZXN1bHRDb2xvckFscGhhQmxlbmRSR0IKI2lmIFNQTEFTSF9DTVlLCiAgLAogIHNwbGFzaFBpcGVSZXN1bHRDb2xvckFscGhhQmxlbmRDTVlLLAogIHNwbGFzaFBpcGVSZXN1bHRDb2xvckFscGhhQmxlbmREZXZpY2VOCiNlbmRpZgp9OwoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gU3BsYXNoCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpjbGFzcyBTcGxhc2ggewpwdWJsaWM6CgogIC8vIENyZWF0ZSBhIG5ldyByYXN0ZXJpemVyIG9iamVjdC4KICBTcGxhc2goU3BsYXNoQml0bWFwICpiaXRtYXBBLCBHQm9vbCB2ZWN0b3JBbnRpYWxpYXNBLAoJIFNwbGFzaFNjcmVlblBhcmFtcyAqc2NyZWVuUGFyYW1zID0gTlVMTCk7CiAgU3BsYXNoKFNwbGFzaEJpdG1hcCAqYml0bWFwQSwgR0Jvb2wgdmVjdG9yQW50aWFsaWFzQSwKCSBTcGxhc2hTY3JlZW4gKnNjcmVlbkEpOwoKICB+U3BsYXNoKCk7CgogIC8vLS0tLS0gc3RhdGUgcmVhZAoKICBTcGxhc2hDb29yZCAqZ2V0TWF0cml4KCk7CiAgU3BsYXNoUGF0dGVybiAqZ2V0U3Ryb2tlUGF0dGVybigpOwogIFNwbGFzaFBhdHRlcm4gKmdldEZpbGxQYXR0ZXJuKCk7CiAgU3BsYXNoU2NyZWVuICpnZXRTY3JlZW4oKTsKICBTcGxhc2hCbGVuZEZ1bmMgZ2V0QmxlbmRGdW5jKCk7CiAgU3BsYXNoQ29vcmQgZ2V0U3Ryb2tlQWxwaGEoKTsKICBTcGxhc2hDb29yZCBnZXRGaWxsQWxwaGEoKTsKICBTcGxhc2hDb29yZCBnZXRMaW5lV2lkdGgoKTsKICBpbnQgZ2V0TGluZUNhcCgpOwogIGludCBnZXRMaW5lSm9pbigpOwogIFNwbGFzaENvb3JkIGdldE1pdGVyTGltaXQoKTsKICBTcGxhc2hDb29yZCBnZXRGbGF0bmVzcygpOwogIFNwbGFzaENvb3JkICpnZXRMaW5lRGFzaCgpOwogIGludCBnZXRMaW5lRGFzaExlbmd0aCgpOwogIFNwbGFzaENvb3JkIGdldExpbmVEYXNoUGhhc2UoKTsKICBHQm9vbCBnZXRTdHJva2VBZGp1c3QoKTsKICBTcGxhc2hDbGlwICpnZXRDbGlwKCk7CiAgU3BsYXNoQml0bWFwICpnZXRTb2Z0TWFzaygpOwogIEdCb29sIGdldEluTm9uSXNvbGF0ZWRHcm91cCgpOwoKICAvLy0tLS0tIHN0YXRlIHdyaXRlCgogIHZvaWQgc2V0TWF0cml4KFNwbGFzaENvb3JkICptYXRyaXgpOwogIHZvaWQgc2V0U3Ryb2tlUGF0dGVybihTcGxhc2hQYXR0ZXJuICpzdHJva2VDb2xvcik7CiAgdm9pZCBzZXRGaWxsUGF0dGVybihTcGxhc2hQYXR0ZXJuICpmaWxsQ29sb3IpOwogIHZvaWQgc2V0U2NyZWVuKFNwbGFzaFNjcmVlbiAqc2NyZWVuKTsKICB2b2lkIHNldEJsZW5kRnVuYyhTcGxhc2hCbGVuZEZ1bmMgZnVuYyk7CiAgdm9pZCBzZXRTdHJva2VBbHBoYShTcGxhc2hDb29yZCBhbHBoYSk7CiAgdm9pZCBzZXRGaWxsQWxwaGEoU3BsYXNoQ29vcmQgYWxwaGEpOwogIHZvaWQgc2V0UGF0dGVybkFscGhhKFNwbGFzaENvb3JkIHN0cm9rZUFscGhhLCBTcGxhc2hDb29yZCBmaWxsQWxwaGEpOwogIHZvaWQgY2xlYXJQYXR0ZXJuQWxwaGEoKTsKICB2b2lkIHNldEZpbGxPdmVycHJpbnQoR0Jvb2wgZm9wKTsKICB2b2lkIHNldFN0cm9rZU92ZXJwcmludChHQm9vbCBzb3ApOwogIHZvaWQgc2V0T3ZlcnByaW50TW9kZShpbnQgb3BtKTsKICB2b2lkIHNldExpbmVXaWR0aChTcGxhc2hDb29yZCBsaW5lV2lkdGgpOwogIHZvaWQgc2V0TGluZUNhcChpbnQgbGluZUNhcCk7CiAgdm9pZCBzZXRMaW5lSm9pbihpbnQgbGluZUpvaW4pOwogIHZvaWQgc2V0TWl0ZXJMaW1pdChTcGxhc2hDb29yZCBtaXRlckxpbWl0KTsKICB2b2lkIHNldEZsYXRuZXNzKFNwbGFzaENvb3JkIGZsYXRuZXNzKTsKICAvLyB0aGUgPGxpbmVEYXNoPiBhcnJheSB3aWxsIGJlIGNvcGllZAogIHZvaWQgc2V0TGluZURhc2goU3BsYXNoQ29vcmQgKmxpbmVEYXNoLCBpbnQgbGluZURhc2hMZW5ndGgsCgkJICAgU3BsYXNoQ29vcmQgbGluZURhc2hQaGFzZSk7CiAgdm9pZCBzZXRTdHJva2VBZGp1c3QoR0Jvb2wgc3Ryb2tlQWRqdXN0KTsKICAvLyBOQjogdXNlcyB0cmFuc2Zvcm1lZCBjb29yZGluYXRlcy4KICB2b2lkIGNsaXBSZXNldFRvUmVjdChTcGxhc2hDb29yZCB4MCwgU3BsYXNoQ29vcmQgeTAsCgkJICAgICAgIFNwbGFzaENvb3JkIHgxLCBTcGxhc2hDb29yZCB5MSk7CiAgLy8gTkI6IHVzZXMgdHJhbnNmb3JtZWQgY29vcmRpbmF0ZXMuCiAgU3BsYXNoRXJyb3IgY2xpcFRvUmVjdChTcGxhc2hDb29yZCB4MCwgU3BsYXNoQ29vcmQgeTAsCgkJCSBTcGxhc2hDb29yZCB4MSwgU3BsYXNoQ29vcmQgeTEpOwogIC8vIE5COiB1c2VzIHVudHJhbnNmb3JtZWQgY29vcmRpbmF0ZXMuCiAgU3BsYXNoRXJyb3IgY2xpcFRvUGF0aChTcGxhc2hQYXRoICpwYXRoLCBHQm9vbCBlbyk7CiAgdm9pZCBzZXRTb2Z0TWFzayhTcGxhc2hCaXRtYXAgKnNvZnRNYXNrKTsKICB2b2lkIHNldEluTm9uSXNvbGF0ZWRHcm91cChTcGxhc2hCaXRtYXAgKmFscGhhMEJpdG1hcEEsCgkJCSAgICAgaW50IGFscGhhMFhBLCBpbnQgYWxwaGEwWUEpOwogIHZvaWQgc2V0VHJhbnNmZXIoR3VjaGFyICpyZWQsIEd1Y2hhciAqZ3JlZW4sIEd1Y2hhciAqYmx1ZSwgR3VjaGFyICpncmF5KTsKICB2b2lkIHNldE92ZXJwcmludE1hc2soR3VpbnQgb3ZlcnByaW50TWFzaywgR0Jvb2wgYWRkaXRpdmUpOwoKICAvLy0tLS0tIHN0YXRlIHNhdmUvcmVzdG9yZQoKICB2b2lkIHNhdmVTdGF0ZSgpOwogIFNwbGFzaEVycm9yIHJlc3RvcmVTdGF0ZSgpOwoKICAvLy0tLS0tIGRyYXdpbmcgb3BlcmF0aW9ucwoKICAvLyBGaWxsIHRoZSBiaXRtYXAgd2l0aCA8Y29sb3I+LiAgVGhpcyBpcyBub3Qgc3ViamVjdCB0byBjbGlwcGluZy4KICB2b2lkIGNsZWFyKFNwbGFzaENvbG9yUHRyIGNvbG9yLCBHdWNoYXIgYWxwaGEgPSAweDAwKTsKCiAgLy8gU3Ryb2tlIGEgcGF0aCB1c2luZyB0aGUgY3VycmVudCBzdHJva2UgcGF0dGVybi4KICBTcGxhc2hFcnJvciBzdHJva2UoU3BsYXNoUGF0aCAqcGF0aCk7CgogIC8vIEZpbGwgYSBwYXRoIHVzaW5nIHRoZSBjdXJyZW50IGZpbGwgcGF0dGVybi4KICBTcGxhc2hFcnJvciBmaWxsKFNwbGFzaFBhdGggKnBhdGgsIEdCb29sIGVvKTsKCiAgLy8gRmlsbCBhIHBhdGgsIFhPUmluZyB3aXRoIHRoZSBjdXJyZW50IGZpbGwgcGF0dGVybi4KICBTcGxhc2hFcnJvciB4b3JGaWxsKFNwbGFzaFBhdGggKnBhdGgsIEdCb29sIGVvKTsKCiAgLy8gRHJhdyBhIGNoYXJhY3RlciwgdXNpbmcgdGhlIGN1cnJlbnQgZmlsbCBwYXR0ZXJuLgogIFNwbGFzaEVycm9yIGZpbGxDaGFyKFNwbGFzaENvb3JkIHgsIFNwbGFzaENvb3JkIHksIGludCBjLCBTcGxhc2hGb250ICpmb250KTsKCiAgLy8gRHJhdyBhIGdseXBoLCB1c2luZyB0aGUgY3VycmVudCBmaWxsIHBhdHRlcm4uICBUaGlzIGZ1bmN0aW9uIGRvZXMKICAvLyBub3QgZnJlZSBhbnkgZGF0YSwgaS5lLiwgaXQgaWdub3JlcyBnbHlwaC0+ZnJlZURhdGEuCiAgdm9pZCBmaWxsR2x5cGgoU3BsYXNoQ29vcmQgeCwgU3BsYXNoQ29vcmQgeSwKCQkJU3BsYXNoR2x5cGhCaXRtYXAgKmdseXBoKTsKCiAgLy8gRHJhd3MgYW4gaW1hZ2UgbWFzayB1c2luZyB0aGUgZmlsbCBjb2xvci4gIFRoaXMgd2lsbCByZWFkIDxoPgogIC8vIGxpbmVzIG9mIDx3PiBwaXhlbHMgZnJvbSA8c3JjPiwgc3RhcnRpbmcgd2l0aCB0aGUgdG9wIGxpbmUuICAiMSIKICAvLyBwaXhlbHMgd2lsbCBiZSBkcmF3biB3aXRoIHRoZSBjdXJyZW50IGZpbGwgY29sb3I7ICIwIiBwaXhlbHMgYXJlCiAgLy8gdHJhbnNwYXJlbnQuICBUaGUgbWF0cml4OgogIC8vICAgIFsgbWF0WzBdIG1hdFsxXSAwIF0KICAvLyAgICBbIG1hdFsyXSBtYXRbM10gMCBdCiAgLy8gICAgWyBtYXRbNF0gbWF0WzVdIDEgXQogIC8vIG1hcHMgYSB1bml0IHNxdWFyZSB0byB0aGUgZGVzaXJlZCBkZXN0aW5hdGlvbiBmb3IgdGhlIGltYWdlLCBpbgogIC8vIFBvc3RTY3JpcHQgc3R5bGU6CiAgLy8gICAgW3gnIHknIDFdID0gW3ggeSAxXSAqIG1hdAogIC8vIE5vdGUgdGhhdCB0aGUgU3BsYXNoIHkgYXhpcyBwb2ludHMgZG93bndhcmQsIGFuZCB0aGUgaW1hZ2Ugc291cmNlCiAgLy8gaXMgYXNzdW1lZCB0byBwcm9kdWNlIHBpeGVscyBpbiByYXN0ZXIgb3JkZXIsIHN0YXJ0aW5nIGZyb20gdGhlCiAgLy8gdG9wIGxpbmUuCiAgU3BsYXNoRXJyb3IgZmlsbEltYWdlTWFzayhTcGxhc2hJbWFnZU1hc2tTb3VyY2Ugc3JjLCB2b2lkICpzcmNEYXRhLAoJCQkgICAgaW50IHcsIGludCBoLCBTcGxhc2hDb29yZCAqbWF0LAoJCQkgICAgR0Jvb2wgZ2x5cGhNb2RlKTsKCiAgLy8gRHJhdyBhbiBpbWFnZS4gIFRoaXMgd2lsbCByZWFkIDxoPiBsaW5lcyBvZiA8dz4gcGl4ZWxzIGZyb20KICAvLyA8c3JjPiwgc3RhcnRpbmcgd2l0aCB0aGUgdG9wIGxpbmUuICBUaGVzZSBwaXhlbHMgYXJlIGFzc3VtZWQgdG8KICAvLyBiZSBpbiB0aGUgc291cmNlIG1vZGUsIDxzcmNNb2RlPi4gIElmIDxzcmNBbHBoYT4gaXMgdHJ1ZSwgdGhlCiAgLy8gYWxwaGEgdmFsdWVzIHJldHVybmVkIGJ5IDxzcmM+IGFyZSB1c2VkOyBvdGhlcndpc2UgdGhleSBhcmUKICAvLyBpZ25vcmVkLiAgVGhlIGZvbGxvd2luZyBjb21iaW5hdGlvbnMgb2Ygc291cmNlIGFuZCB0YXJnZXQgbW9kZXMKICAvLyBhcmUgc3VwcG9ydGVkOgogIC8vICAgIHNvdXJjZSAgICAgICB0YXJnZXQKICAvLyAgICAtLS0tLS0gICAgICAgLS0tLS0tCiAgLy8gICAgTW9ubzEgICAgICAgIE1vbm8xCiAgLy8gICAgTW9ubzggICAgICAgIE1vbm8xICAgLS0gd2l0aCBkaXRoZXJpbmcKICAvLyAgICBNb25vOCAgICAgICAgTW9ubzgKICAvLyAgICBSR0I4ICAgICAgICAgUkdCOAogIC8vICAgIEJHUjggICAgICAgICBCR1I4CiAgLy8gICAgQ01ZSzggICAgICAgIENNWUs4CiAgLy8gVGhlIG1hdHJpeCBiZWhhdmVzIGFzIGZvciBmaWxsSW1hZ2VNYXNrLgogIFNwbGFzaEVycm9yIGRyYXdJbWFnZShTcGxhc2hJbWFnZVNvdXJjZSBzcmMsIFNwbGFzaElDQ1RyYW5zZm9ybSB0Ziwgdm9pZCAqc3JjRGF0YSwKCQkJU3BsYXNoQ29sb3JNb2RlIHNyY01vZGUsIEdCb29sIHNyY0FscGhhLAoJCQlpbnQgdywgaW50IGgsIFNwbGFzaENvb3JkICptYXQsIEdCb29sIGludGVycG9sYXRlLAoJCQlHQm9vbCB0aWxpbmdQYXR0ZXJuID0gZ0ZhbHNlKTsKCiAgLy8gQ29tcG9zaXRlIGEgcmVjdGFuZ3VsYXIgcmVnaW9uIGZyb20gPHNyYz4gb250byB0aGlzIFNwbGFzaAogIC8vIG9iamVjdC4KICBTcGxhc2hFcnJvciBjb21wb3NpdGUoU3BsYXNoQml0bWFwICpzcmMsIGludCB4U3JjLCBpbnQgeVNyYywKCQkJaW50IHhEZXN0LCBpbnQgeURlc3QsIGludCB3LCBpbnQgaCwKCQkJR0Jvb2wgbm9DbGlwLCBHQm9vbCBub25Jc29sYXRlZCwKCQkJR0Jvb2wga25vY2tvdXQgPSBnRmFsc2UsIFNwbGFzaENvb3JkIGtub2Nrb3V0T3BhY2l0eSA9IDEuMCk7CgogIC8vIENvbXBvc2l0ZSB0aGlzIFNwbGFzaCBvYmplY3Qgb250byBhIGJhY2tncm91bmQgY29sb3IuICBUaGUKICAvLyBiYWNrZ3JvdW5kIGFscGhhIGlzIGFzc3VtZWQgdG8gYmUgMS4KICB2b2lkIGNvbXBvc2l0ZUJhY2tncm91bmQoU3BsYXNoQ29sb3JQdHIgY29sb3IpOwoKICAvLyBDb3B5IGEgcmVjdGFuZ3VsYXIgcmVnaW9uIGZyb20gPHNyYz4gb250byB0aGUgYml0bWFwIGJlbG9uZ2luZyB0bwogIC8vIHRoaXMgU3BsYXNoIG9iamVjdC4gIFRoZSBkZXN0aW5hdGlvbiBhbHBoYSB2YWx1ZXMgYXJlIGFsbCBzZXQgdG8KICAvLyB6ZXJvLgogIFNwbGFzaEVycm9yIGJsaXRUcmFuc3BhcmVudChTcGxhc2hCaXRtYXAgKnNyYywgaW50IHhTcmMsIGludCB5U3JjLAoJCQkgICAgICBpbnQgeERlc3QsIGludCB5RGVzdCwgaW50IHcsIGludCBoKTsKICB2b2lkIGJsaXRJbWFnZShTcGxhc2hCaXRtYXAgKnNyYywgR0Jvb2wgc3JjQWxwaGEsIGludCB4RGVzdCwgaW50IHlEZXN0KTsKCiAgLy8tLS0tLSBtaXNjCgogIC8vIENvbnN0cnVjdCBhIHBhdGggZm9yIGEgc3Ryb2tlLCBnaXZlbiB0aGUgcGF0aCB0byBiZSBzdHJva2VkIGFuZAogIC8vIHRoZSBsaW5lIHdpZHRoIDx3Pi4gIEFsbCBvdGhlciBzdHJva2UgcGFyYW1ldGVycyBhcmUgdGFrZW4gZnJvbQogIC8vIHRoZSBjdXJyZW50IHN0YXRlLiAgSWYgPGZsYXR0ZW4+IGlzIHRydWUsIHRoaXMgZnVuY3Rpb24gd2lsbAogIC8vIGZpcnN0IGZsYXR0ZW4gdGhlIHBhdGggYW5kIGhhbmRsZSB0aGUgbGluZWRhc2guCiAgU3BsYXNoUGF0aCAqbWFrZVN0cm9rZVBhdGgoU3BsYXNoUGF0aCAqcGF0aCwgU3BsYXNoQ29vcmQgdywKCQkJICAgICBHQm9vbCBmbGF0dGVuID0gZ1RydWUpOwoKICAvLyBSZXR1cm4gdGhlIGFzc29jaWF0ZWQgYml0bWFwLgogIFNwbGFzaEJpdG1hcCAqZ2V0Qml0bWFwKCkgeyByZXR1cm4gYml0bWFwOyB9CgogIC8vIFNldCB0aGUgbWluaW11bSBsaW5lIHdpZHRoLgogIHZvaWQgc2V0TWluTGluZVdpZHRoKFNwbGFzaENvb3JkIHcpIHsgbWluTGluZVdpZHRoID0gdzsgfQoKICAvLyBTZXR0ZXIvR2V0dGVyIGZvciB0aGluIGxpbmUgbW9kZQogIHZvaWQgc2V0VGhpbkxpbmVNb2RlKFNwbGFzaFRoaW5MaW5lTW9kZSB0aGluTGluZU1vZGVBKSB7IHRoaW5MaW5lTW9kZSA9IHRoaW5MaW5lTW9kZUE7IH0KICBTcGxhc2hUaGluTGluZU1vZGUgZ2V0VGhpbkxpbmVNb2RlKCkgeyByZXR1cm4gdGhpbkxpbmVNb2RlOyB9CgogIC8vIEdldCBhIGJvdW5kaW5nIGJveCB3aGljaCBpbmNsdWRlcyBhbGwgbW9kaWZpY2F0aW9ucyBzaW5jZSB0aGUKICAvLyBsYXN0IGNhbGwgdG8gY2xlYXJNb2RSZWdpb24uCiAgdm9pZCBnZXRNb2RSZWdpb24oaW50ICp4TWluLCBpbnQgKnlNaW4sIGludCAqeE1heCwgaW50ICp5TWF4KQogICAgeyAqeE1pbiA9IG1vZFhNaW47ICp5TWluID0gbW9kWU1pbjsgKnhNYXggPSBtb2RYTWF4OyAqeU1heCA9IG1vZFlNYXg7IH0KCiAgLy8gQ2xlYXIgdGhlIG1vZGlmaWVkIHJlZ2lvbiBib3VuZGluZyBib3guCiAgdm9pZCBjbGVhck1vZFJlZ2lvbigpOwoKICAvLyBHZXQgY2xpcHBpbmcgc3RhdHVzIGZvciB0aGUgbGFzdCBkcmF3aW5nIG9wZXJhdGlvbiBzdWJqZWN0IHRvCiAgLy8gY2xpcHBpbmcuCiAgU3BsYXNoQ2xpcFJlc3VsdCBnZXRDbGlwUmVzKCkgeyByZXR1cm4gb3BDbGlwUmVzOyB9CgogIC8vIFRvZ2dsZSBkZWJ1ZyBtb2RlIG9uIG9yIG9mZi4KICB2b2lkIHNldERlYnVnTW9kZShHQm9vbCBkZWJ1Z01vZGVBKSB7IGRlYnVnTW9kZSA9IGRlYnVnTW9kZUE7IH0KCiNpZiAxIC8vfnRtcDogdHVybiBvZmYgYW50aS1hbGlhc2luZyB0ZW1wb3JhcmlseQogIHZvaWQgc2V0SW5TaGFkaW5nKEdCb29sIHNoKSB7IGluU2hhZGluZyA9IHNoOyB9CiAgR0Jvb2wgZ2V0VmVjdG9yQW50aWFsaWFzKCkgeyByZXR1cm4gdmVjdG9yQW50aWFsaWFzOyB9CiAgdm9pZCBzZXRWZWN0b3JBbnRpYWxpYXMoR0Jvb2wgdmFhKSB7IHZlY3RvckFudGlhbGlhcyA9IHZhYTsgfQojZW5kaWYKCiAgLy8gRG8gc2hhZGVkIGZpbGxzIHdpdGggZHluYW1pYyBwYXR0ZXJucwogIFNwbGFzaEVycm9yIHNoYWRlZEZpbGwoU3BsYXNoUGF0aCAqcGF0aCwgR0Jvb2wgaGFzQkJveCwKICAgICAgICAgICAgICAgICAgICAgICAgIFNwbGFzaFBhdHRlcm4gKnBhdHRlcm4pOwogIC8vIERyYXcgYSBnb3VyYXVkIHRyaWFuZ2xlIHNoYWRpbmcuCiAgR0Jvb2wgZ291cmF1ZFRyaWFuZ2xlU2hhZGVkRmlsbChTcGxhc2hHb3VyYXVkQ29sb3IgKnNoYWRpbmcpOwoKcHJpdmF0ZToKCiAgdm9pZCBwaXBlSW5pdChTcGxhc2hQaXBlICpwaXBlLCBpbnQgeCwgaW50IHksCgkJU3BsYXNoUGF0dGVybiAqcGF0dGVybiwgU3BsYXNoQ29sb3JQdHIgY1NyYywKCQlHdWNoYXIgYUlucHV0LCBHQm9vbCB1c2VzU2hhcGUsCgkJR0Jvb2wgbm9uSXNvbGF0ZWRHcm91cCwKCQlHQm9vbCBrbm9ja291dCA9IGdGYWxzZSwgR3VjaGFyIGtub2Nrb3V0T3BhY2l0eSA9IDI1NSk7CiAgdm9pZCBwaXBlUnVuKFNwbGFzaFBpcGUgKnBpcGUpOwogIHZvaWQgcGlwZVJ1blNpbXBsZU1vbm8xKFNwbGFzaFBpcGUgKnBpcGUpOwogIHZvaWQgcGlwZVJ1blNpbXBsZU1vbm84KFNwbGFzaFBpcGUgKnBpcGUpOwogIHZvaWQgcGlwZVJ1blNpbXBsZVJHQjgoU3BsYXNoUGlwZSAqcGlwZSk7CiAgdm9pZCBwaXBlUnVuU2ltcGxlWEJHUjgoU3BsYXNoUGlwZSAqcGlwZSk7CiAgdm9pZCBwaXBlUnVuU2ltcGxlQkdSOChTcGxhc2hQaXBlICpwaXBlKTsKI2lmIFNQTEFTSF9DTVlLCiAgdm9pZCBwaXBlUnVuU2ltcGxlQ01ZSzgoU3BsYXNoUGlwZSAqcGlwZSk7CiAgdm9pZCBwaXBlUnVuU2ltcGxlRGV2aWNlTjgoU3BsYXNoUGlwZSAqcGlwZSk7CiNlbmRpZgogIHZvaWQgcGlwZVJ1bkFBTW9ubzEoU3BsYXNoUGlwZSAqcGlwZSk7CiAgdm9pZCBwaXBlUnVuQUFNb25vOChTcGxhc2hQaXBlICpwaXBlKTsKICB2b2lkIHBpcGVSdW5BQVJHQjgoU3BsYXNoUGlwZSAqcGlwZSk7CiAgdm9pZCBwaXBlUnVuQUFYQkdSOChTcGxhc2hQaXBlICpwaXBlKTsKICB2b2lkIHBpcGVSdW5BQUJHUjgoU3BsYXNoUGlwZSAqcGlwZSk7CiNpZiBTUExBU0hfQ01ZSwogIHZvaWQgcGlwZVJ1bkFBQ01ZSzgoU3BsYXNoUGlwZSAqcGlwZSk7CiAgdm9pZCBwaXBlUnVuQUFEZXZpY2VOOChTcGxhc2hQaXBlICpwaXBlKTsKI2VuZGlmCiAgdm9pZCBwaXBlU2V0WFkoU3BsYXNoUGlwZSAqcGlwZSwgaW50IHgsIGludCB5KTsKICB2b2lkIHBpcGVJbmNYKFNwbGFzaFBpcGUgKnBpcGUpOwogIHZvaWQgZHJhd1BpeGVsKFNwbGFzaFBpcGUgKnBpcGUsIGludCB4LCBpbnQgeSwgR0Jvb2wgbm9DbGlwKTsKICB2b2lkIGRyYXdBQVBpeGVsSW5pdCgpOwogIHZvaWQgZHJhd0FBUGl4ZWwoU3BsYXNoUGlwZSAqcGlwZSwgaW50IHgsIGludCB5KTsKICB2b2lkIGRyYXdTcGFuKFNwbGFzaFBpcGUgKnBpcGUsIGludCB4MCwgaW50IHgxLCBpbnQgeSwgR0Jvb2wgbm9DbGlwKTsKICB2b2lkIGRyYXdBQUxpbmUoU3BsYXNoUGlwZSAqcGlwZSwgaW50IHgwLCBpbnQgeDEsIGludCB5LCBHQm9vbCBhZGp1c3RMaW5lID0gZ0ZhbHNlLCBHdWNoYXIgbGluZU9wYWNpdHkgPSAwKTsKICB2b2lkIHRyYW5zZm9ybShTcGxhc2hDb29yZCAqbWF0cml4LCBTcGxhc2hDb29yZCB4aSwgU3BsYXNoQ29vcmQgeWksCgkJIFNwbGFzaENvb3JkICp4bywgU3BsYXNoQ29vcmQgKnlvKTsKICB2b2lkIHVwZGF0ZU1vZFgoaW50IHgpOwogIHZvaWQgdXBkYXRlTW9kWShpbnQgeSk7CiAgdm9pZCBzdHJva2VOYXJyb3coU3BsYXNoUGF0aCAqcGF0aCk7CiAgdm9pZCBzdHJva2VXaWRlKFNwbGFzaFBhdGggKnBhdGgsIFNwbGFzaENvb3JkIHcpOwogIFNwbGFzaFBhdGggKmZsYXR0ZW5QYXRoKFNwbGFzaFBhdGggKnBhdGgsIFNwbGFzaENvb3JkICptYXRyaXgsCgkJCSAgU3BsYXNoQ29vcmQgZmxhdG5lc3MpOwogIHZvaWQgZmxhdHRlbkN1cnZlKFNwbGFzaENvb3JkIHgwLCBTcGxhc2hDb29yZCB5MCwKCQkgICAgU3BsYXNoQ29vcmQgeDEsIFNwbGFzaENvb3JkIHkxLAoJCSAgICBTcGxhc2hDb29yZCB4MiwgU3BsYXNoQ29vcmQgeTIsCgkJICAgIFNwbGFzaENvb3JkIHgzLCBTcGxhc2hDb29yZCB5MywKCQkgICAgU3BsYXNoQ29vcmQgKm1hdHJpeCwgU3BsYXNoQ29vcmQgZmxhdG5lc3MyLAoJCSAgICBTcGxhc2hQYXRoICpmUGF0aCk7CiAgU3BsYXNoUGF0aCAqbWFrZURhc2hlZFBhdGgoU3BsYXNoUGF0aCAqeFBhdGgpOwogIHZvaWQgZ2V0QkJveEZQKFNwbGFzaFBhdGggKnBhdGgsIFNwbGFzaENvb3JkICp4TWluQSwgU3BsYXNoQ29vcmQgKnlNaW5BLCBTcGxhc2hDb29yZCAqeE1heEEsIFNwbGFzaENvb3JkICp5TWF4QSk7CiAgU3BsYXNoRXJyb3IgZmlsbFdpdGhQYXR0ZXJuKFNwbGFzaFBhdGggKnBhdGgsIEdCb29sIGVvLAoJCQkgICAgICBTcGxhc2hQYXR0ZXJuICpwYXR0ZXJuLCBTcGxhc2hDb29yZCBhbHBoYSk7CiAgR0Jvb2wgcGF0aEFsbE91dHNpZGUoU3BsYXNoUGF0aCAqcGF0aCk7CiAgdm9pZCBmaWxsR2x5cGgyKGludCB4MCwgaW50IHkwLCBTcGxhc2hHbHlwaEJpdG1hcCAqZ2x5cGgsIEdCb29sIG5vY2xpcCk7CiAgdm9pZCBhcmJpdHJhcnlUcmFuc2Zvcm1NYXNrKFNwbGFzaEltYWdlTWFza1NvdXJjZSBzcmMsIHZvaWQgKnNyY0RhdGEsCgkJCSAgICAgIGludCBzcmNXaWR0aCwgaW50IHNyY0hlaWdodCwKCQkJICAgICAgU3BsYXNoQ29vcmQgKm1hdCwgR0Jvb2wgZ2x5cGhNb2RlKTsKICBTcGxhc2hCaXRtYXAgKnNjYWxlTWFzayhTcGxhc2hJbWFnZU1hc2tTb3VyY2Ugc3JjLCB2b2lkICpzcmNEYXRhLAoJCQkgIGludCBzcmNXaWR0aCwgaW50IHNyY0hlaWdodCwKCQkJICBpbnQgc2NhbGVkV2lkdGgsIGludCBzY2FsZWRIZWlnaHQpOwogIHZvaWQgc2NhbGVNYXNrWWRYZChTcGxhc2hJbWFnZU1hc2tTb3VyY2Ugc3JjLCB2b2lkICpzcmNEYXRhLAoJCSAgICAgaW50IHNyY1dpZHRoLCBpbnQgc3JjSGVpZ2h0LAoJCSAgICAgaW50IHNjYWxlZFdpZHRoLCBpbnQgc2NhbGVkSGVpZ2h0LAoJCSAgICAgU3BsYXNoQml0bWFwICpkZXN0KTsKICB2b2lkIHNjYWxlTWFza1lkWHUoU3BsYXNoSW1hZ2VNYXNrU291cmNlIHNyYywgdm9pZCAqc3JjRGF0YSwKCQkgICAgIGludCBzcmNXaWR0aCwgaW50IHNyY0hlaWdodCwKCQkgICAgIGludCBzY2FsZWRXaWR0aCwgaW50IHNjYWxlZEhlaWdodCwKCQkgICAgIFNwbGFzaEJpdG1hcCAqZGVzdCk7CiAgdm9pZCBzY2FsZU1hc2tZdVhkKFNwbGFzaEltYWdlTWFza1NvdXJjZSBzcmMsIHZvaWQgKnNyY0RhdGEsCgkJICAgICBpbnQgc3JjV2lkdGgsIGludCBzcmNIZWlnaHQsCgkJICAgICBpbnQgc2NhbGVkV2lkdGgsIGludCBzY2FsZWRIZWlnaHQsCgkJICAgICBTcGxhc2hCaXRtYXAgKmRlc3QpOwogIHZvaWQgc2NhbGVNYXNrWXVYdShTcGxhc2hJbWFnZU1hc2tTb3VyY2Ugc3JjLCB2b2lkICpzcmNEYXRhLAoJCSAgICAgaW50IHNyY1dpZHRoLCBpbnQgc3JjSGVpZ2h0LAoJCSAgICAgaW50IHNjYWxlZFdpZHRoLCBpbnQgc2NhbGVkSGVpZ2h0LAoJCSAgICAgU3BsYXNoQml0bWFwICpkZXN0KTsKICB2b2lkIGJsaXRNYXNrKFNwbGFzaEJpdG1hcCAqc3JjLCBpbnQgeERlc3QsIGludCB5RGVzdCwKCQlTcGxhc2hDbGlwUmVzdWx0IGNsaXBSZXMpOwogIFNwbGFzaEVycm9yIGFyYml0cmFyeVRyYW5zZm9ybUltYWdlKFNwbGFzaEltYWdlU291cmNlIHNyYywgU3BsYXNoSUNDVHJhbnNmb3JtIHRmLCB2b2lkICpzcmNEYXRhLAoJCQkgICAgICAgU3BsYXNoQ29sb3JNb2RlIHNyY01vZGUsIGludCBuQ29tcHMsCgkJCSAgICAgICBHQm9vbCBzcmNBbHBoYSwKCQkJICAgICAgIGludCBzcmNXaWR0aCwgaW50IHNyY0hlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNwbGFzaENvb3JkICptYXQsIEdCb29sIGludGVycG9sYXRlLCBHQm9vbCB0aWxpbmdQYXR0ZXJuID0gZ0ZhbHNlKTsKICBTcGxhc2hCaXRtYXAgKnNjYWxlSW1hZ2UoU3BsYXNoSW1hZ2VTb3VyY2Ugc3JjLCB2b2lkICpzcmNEYXRhLAoJCQkgICBTcGxhc2hDb2xvck1vZGUgc3JjTW9kZSwgaW50IG5Db21wcywKCQkJICAgR0Jvb2wgc3JjQWxwaGEsIGludCBzcmNXaWR0aCwgaW50IHNyY0hlaWdodCwKCQkJICAgaW50IHNjYWxlZFdpZHRoLCBpbnQgc2NhbGVkSGVpZ2h0LCBHQm9vbCBpbnRlcnBvbGF0ZSwgR0Jvb2wgdGlsaW5nUGF0dGVybiA9IGdGYWxzZSk7CiAgdm9pZCBzY2FsZUltYWdlWWRYZChTcGxhc2hJbWFnZVNvdXJjZSBzcmMsIHZvaWQgKnNyY0RhdGEsCgkJICAgICAgU3BsYXNoQ29sb3JNb2RlIHNyY01vZGUsIGludCBuQ29tcHMsCgkJICAgICAgR0Jvb2wgc3JjQWxwaGEsIGludCBzcmNXaWR0aCwgaW50IHNyY0hlaWdodCwKCQkgICAgICBpbnQgc2NhbGVkV2lkdGgsIGludCBzY2FsZWRIZWlnaHQsCgkJICAgICAgU3BsYXNoQml0bWFwICpkZXN0KTsKICB2b2lkIHNjYWxlSW1hZ2VZZFh1KFNwbGFzaEltYWdlU291cmNlIHNyYywgdm9pZCAqc3JjRGF0YSwKCQkgICAgICBTcGxhc2hDb2xvck1vZGUgc3JjTW9kZSwgaW50IG5Db21wcywKCQkgICAgICBHQm9vbCBzcmNBbHBoYSwgaW50IHNyY1dpZHRoLCBpbnQgc3JjSGVpZ2h0LAoJCSAgICAgIGludCBzY2FsZWRXaWR0aCwgaW50IHNjYWxlZEhlaWdodCwKCQkgICAgICBTcGxhc2hCaXRtYXAgKmRlc3QpOwogIHZvaWQgc2NhbGVJbWFnZVl1WGQoU3BsYXNoSW1hZ2VTb3VyY2Ugc3JjLCB2b2lkICpzcmNEYXRhLAoJCSAgICAgIFNwbGFzaENvbG9yTW9kZSBzcmNNb2RlLCBpbnQgbkNvbXBzLAoJCSAgICAgIEdCb29sIHNyY0FscGhhLCBpbnQgc3JjV2lkdGgsIGludCBzcmNIZWlnaHQsCgkJICAgICAgaW50IHNjYWxlZFdpZHRoLCBpbnQgc2NhbGVkSGVpZ2h0LAoJCSAgICAgIFNwbGFzaEJpdG1hcCAqZGVzdCk7CiAgdm9pZCBzY2FsZUltYWdlWXVYdShTcGxhc2hJbWFnZVNvdXJjZSBzcmMsIHZvaWQgKnNyY0RhdGEsCgkJICAgICAgU3BsYXNoQ29sb3JNb2RlIHNyY01vZGUsIGludCBuQ29tcHMsCgkJICAgICAgR0Jvb2wgc3JjQWxwaGEsIGludCBzcmNXaWR0aCwgaW50IHNyY0hlaWdodCwKCQkgICAgICBpbnQgc2NhbGVkV2lkdGgsIGludCBzY2FsZWRIZWlnaHQsCgkJICAgICAgU3BsYXNoQml0bWFwICpkZXN0KTsKICB2b2lkIHNjYWxlSW1hZ2VZdVh1QmlsaW5lYXIoU3BsYXNoSW1hZ2VTb3VyY2Ugc3JjLCB2b2lkICpzcmNEYXRhLAoJCSAgICAgIFNwbGFzaENvbG9yTW9kZSBzcmNNb2RlLCBpbnQgbkNvbXBzLAoJCSAgICAgIEdCb29sIHNyY0FscGhhLCBpbnQgc3JjV2lkdGgsIGludCBzcmNIZWlnaHQsCgkJICAgICAgaW50IHNjYWxlZFdpZHRoLCBpbnQgc2NhbGVkSGVpZ2h0LAoJCSAgICAgIFNwbGFzaEJpdG1hcCAqZGVzdCk7CiAgdm9pZCB2ZXJ0RmxpcEltYWdlKFNwbGFzaEJpdG1hcCAqaW1nLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCgkJICAgICBpbnQgbkNvbXBzKTsKICB2b2lkIGJsaXRJbWFnZShTcGxhc2hCaXRtYXAgKnNyYywgR0Jvb2wgc3JjQWxwaGEsIGludCB4RGVzdCwgaW50IHlEZXN0LAoJCSBTcGxhc2hDbGlwUmVzdWx0IGNsaXBSZXMpOwogIHZvaWQgYmxpdEltYWdlQ2xpcHBlZChTcGxhc2hCaXRtYXAgKnNyYywgR0Jvb2wgc3JjQWxwaGEsCgkJCWludCB4U3JjLCBpbnQgeVNyYywgaW50IHhEZXN0LCBpbnQgeURlc3QsCgkJCWludCB3LCBpbnQgaCk7CiAgdm9pZCBkdW1wUGF0aChTcGxhc2hQYXRoICpwYXRoKTsKICB2b2lkIGR1bXBYUGF0aChTcGxhc2hYUGF0aCAqcGF0aCk7CgogIHN0YXRpYyBTcGxhc2hQaXBlUmVzdWx0Q29sb3JDdHJsIHBpcGVSZXN1bHRDb2xvck5vQWxwaGFCbGVuZFtdOwogIHN0YXRpYyBTcGxhc2hQaXBlUmVzdWx0Q29sb3JDdHJsIHBpcGVSZXN1bHRDb2xvckFscGhhTm9CbGVuZFtdOwogIHN0YXRpYyBTcGxhc2hQaXBlUmVzdWx0Q29sb3JDdHJsIHBpcGVSZXN1bHRDb2xvckFscGhhQmxlbmRbXTsKICBzdGF0aWMgaW50IHBpcGVOb25Jc29Hcm91cENvcnJlY3Rpb25bXTsKCiAgU3BsYXNoQml0bWFwICpiaXRtYXA7CiAgU3BsYXNoU3RhdGUgKnN0YXRlOwogIFNwbGFzaEJpdG1hcCAqYWFCdWY7CiAgaW50IGFhQnVmWTsKICBTcGxhc2hCaXRtYXAgKmFscGhhMEJpdG1hcDsJLy8gZm9yIG5vbi1pc29sYXRlZCBncm91cHMsIHRoaXMgaXMgdGhlCgkJCQkvLyAgIGJpdG1hcCBjb250YWluaW5nIHRoZSBhbHBoYTAgdmFsdWVzCiAgaW50IGFscGhhMFgsIGFscGhhMFk7CQkvLyBvZmZzZXQgd2l0aGluIGFscGhhMEJpdG1hcAogIFNwbGFzaENvb3JkIGFhR2FtbWFbc3BsYXNoQUFTaXplICogc3BsYXNoQUFTaXplICsgMV07CiAgU3BsYXNoQ29vcmQgbWluTGluZVdpZHRoOwogIFNwbGFzaFRoaW5MaW5lTW9kZSB0aGluTGluZU1vZGU7CiAgaW50IG1vZFhNaW4sIG1vZFlNaW4sIG1vZFhNYXgsIG1vZFlNYXg7CiAgU3BsYXNoQ2xpcFJlc3VsdCBvcENsaXBSZXM7CiAgR0Jvb2wgdmVjdG9yQW50aWFsaWFzOwogIEdCb29sIGluU2hhZGluZzsKICBHQm9vbCBkZWJ1Z01vZGU7Cn07CgojZW5kaWYK