Ly89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8KLy8gU3BsYXNoLmgKLy8KLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci8vCi8vIE1vZGlmaWVkIHVuZGVyIHRoZSBQb3BwbGVyIHByb2plY3QgLSBodHRwOi8vcG9wcGxlci5mcmVlZGVza3RvcC5vcmcKLy8KLy8gQWxsIGNoYW5nZXMgbWFkZSB1bmRlciB0aGUgUG9wcGxlciBwcm9qZWN0IHRvIHRoaXMgZmlsZSBhcmUgbGljZW5zZWQKLy8gdW5kZXIgR1BMIHZlcnNpb24gMiBvciBsYXRlcgovLwovLyBDb3B5cmlnaHQgKEMpIDIwMDUgTWFyY28gUGVzZW50aSBHcml0dGkgPG1wZ0ByZWRoYXQuY29tPgovLyBDb3B5cmlnaHQgKEMpIDIwMDcsIDIwMTEgQWxiZXJ0IEFzdGFscyBDaWQgPGFhY2lkQGtkZS5vcmc+Ci8vIENvcHlyaWdodCAoQykgMjAxMC0yMDEzIFRob21hcyBGcmVpdGFnIDxUaG9tYXMuRnJlaXRhZ0BhbGZhLmRlPgovLyBDb3B5cmlnaHQgKEMpIDIwMTAgQ2hyaXN0aWFuIEZldWVyc+RuZ2VyIDxjZmV1ZXJzYWVuZ2VyQGdvb2dsZW1haWwuY29tPgovLyBDb3B5cmlnaHQgKEMpIDIwMTIgQWRyaWFuIEpvaG5zb24gPGFqb2huc29uQHJlZG5lb24uY29tPgovLwovLyBUbyBzZWUgYSBkZXNjcmlwdGlvbiBvZiB0aGUgY2hhbmdlcyBwbGVhc2Ugc2VlIHRoZSBDaGFuZ2Vsb2cgZmlsZSB0aGF0Ci8vIGNhbWUgd2l0aCB5b3VyIHRhcmJhbGwgb3IgdHlwZSBtYWtlIENoYW5nZUxvZyBpZiB5b3UgYXJlIGJ1aWxkaW5nIGZyb20gZ2l0Ci8vCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgojaWZuZGVmIFNQTEFTSF9ICiNkZWZpbmUgU1BMQVNIX0gKCiNpZmRlZiBVU0VfR0NDX1BSQUdNQVMKI3ByYWdtYSBpbnRlcmZhY2UKI2VuZGlmCgojaW5jbHVkZSA8c3RkZGVmLmg+CiNpbmNsdWRlICJTcGxhc2hUeXBlcy5oIgojaW5jbHVkZSAiU3BsYXNoQ2xpcC5oIgojaW5jbHVkZSAiU3BsYXNoUGF0dGVybi5oIgoKY2xhc3MgU3BsYXNoQml0bWFwOwpzdHJ1Y3QgU3BsYXNoR2x5cGhCaXRtYXA7CmNsYXNzIFNwbGFzaFN0YXRlOwpjbGFzcyBTcGxhc2hTY3JlZW47CmNsYXNzIFNwbGFzaFBhdGg7CmNsYXNzIFNwbGFzaFhQYXRoOwpjbGFzcyBTcGxhc2hGb250OwpzdHJ1Y3QgU3BsYXNoUGlwZTsKCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgovLyBSZXRyaWV2ZXMgdGhlIG5leHQgbGluZSBvZiBwaXhlbHMgaW4gYW4gaW1hZ2UgbWFzay4gIE5vcm1hbGx5LAovLyBmaWxscyBpbiAqPGxpbmU+IGFuZCByZXR1cm5zIHRydWUuICBJZiB0aGUgaW1hZ2Ugc3RyZWFtIGlzCi8vIGV4aGF1c3RlZCwgcmV0dXJucyBmYWxzZS4KdHlwZWRlZiBHQm9vbCAoKlNwbGFzaEltYWdlTWFza1NvdXJjZSkodm9pZCAqZGF0YSwgU3BsYXNoQ29sb3JQdHIgcGl4ZWwpOwoKLy8gUmV0cmlldmVzIHRoZSBuZXh0IGxpbmUgb2YgcGl4ZWxzIGluIGFuIGltYWdlLiAgTm9ybWFsbHksIGZpbGxzIGluCi8vICo8bGluZT4gYW5kIHJldHVybnMgdHJ1ZS4gIElmIHRoZSBpbWFnZSBzdHJlYW0gaXMgZXhoYXVzdGVkLAovLyByZXR1cm5zIGZhbHNlLgp0eXBlZGVmIEdCb29sICgqU3BsYXNoSW1hZ2VTb3VyY2UpKHZvaWQgKmRhdGEsIFNwbGFzaENvbG9yUHRyIGNvbG9yTGluZSwKCQkJCSAgIEd1Y2hhciAqYWxwaGFMaW5lKTsKCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgplbnVtIFNwbGFzaFBpcGVSZXN1bHRDb2xvckN0cmwgewojaWYgU1BMQVNIX0NNWUsKICBzcGxhc2hQaXBlUmVzdWx0Q29sb3JOb0FscGhhQmxlbmRDTVlLLAogIHNwbGFzaFBpcGVSZXN1bHRDb2xvck5vQWxwaGFCbGVuZERldmljZU4sCiNlbmRpZgogIHNwbGFzaFBpcGVSZXN1bHRDb2xvck5vQWxwaGFCbGVuZFJHQiwKICBzcGxhc2hQaXBlUmVzdWx0Q29sb3JOb0FscGhhQmxlbmRNb25vLAogIHNwbGFzaFBpcGVSZXN1bHRDb2xvckFscGhhTm9CbGVuZE1vbm8sCiAgc3BsYXNoUGlwZVJlc3VsdENvbG9yQWxwaGFOb0JsZW5kUkdCLAojaWYgU1BMQVNIX0NNWUsKICBzcGxhc2hQaXBlUmVzdWx0Q29sb3JBbHBoYU5vQmxlbmRDTVlLLAogIHNwbGFzaFBpcGVSZXN1bHRDb2xvckFscGhhTm9CbGVuZERldmljZU4sCiNlbmRpZgogIHNwbGFzaFBpcGVSZXN1bHRDb2xvckFscGhhQmxlbmRNb25vLAogIHNwbGFzaFBpcGVSZXN1bHRDb2xvckFscGhhQmxlbmRSR0IKI2lmIFNQTEFTSF9DTVlLCiAgLAogIHNwbGFzaFBpcGVSZXN1bHRDb2xvckFscGhhQmxlbmRDTVlLLAogIHNwbGFzaFBpcGVSZXN1bHRDb2xvckFscGhhQmxlbmREZXZpY2VOCiNlbmRpZgp9OwoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gU3BsYXNoCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpjbGFzcyBTcGxhc2ggewpwdWJsaWM6CgogIC8vIENyZWF0ZSBhIG5ldyByYXN0ZXJpemVyIG9iamVjdC4KICBTcGxhc2goU3BsYXNoQml0bWFwICpiaXRtYXBBLCBHQm9vbCB2ZWN0b3JBbnRpYWxpYXNBLAoJIFNwbGFzaFNjcmVlblBhcmFtcyAqc2NyZWVuUGFyYW1zID0gTlVMTCk7CiAgU3BsYXNoKFNwbGFzaEJpdG1hcCAqYml0bWFwQSwgR0Jvb2wgdmVjdG9yQW50aWFsaWFzQSwKCSBTcGxhc2hTY3JlZW4gKnNjcmVlbkEpOwoKICB+U3BsYXNoKCk7CgogIC8vLS0tLS0gc3RhdGUgcmVhZAoKICBTcGxhc2hDb29yZCAqZ2V0TWF0cml4KCk7CiAgU3BsYXNoUGF0dGVybiAqZ2V0U3Ryb2tlUGF0dGVybigpOwogIFNwbGFzaFBhdHRlcm4gKmdldEZpbGxQYXR0ZXJuKCk7CiAgU3BsYXNoU2NyZWVuICpnZXRTY3JlZW4oKTsKICBTcGxhc2hCbGVuZEZ1bmMgZ2V0QmxlbmRGdW5jKCk7CiAgU3BsYXNoQ29vcmQgZ2V0U3Ryb2tlQWxwaGEoKTsKICBTcGxhc2hDb29yZCBnZXRGaWxsQWxwaGEoKTsKICBTcGxhc2hDb29yZCBnZXRMaW5lV2lkdGgoKTsKICBpbnQgZ2V0TGluZUNhcCgpOwogIGludCBnZXRMaW5lSm9pbigpOwogIFNwbGFzaENvb3JkIGdldE1pdGVyTGltaXQoKTsKICBTcGxhc2hDb29yZCBnZXRGbGF0bmVzcygpOwogIFNwbGFzaENvb3JkICpnZXRMaW5lRGFzaCgpOwogIGludCBnZXRMaW5lRGFzaExlbmd0aCgpOwogIFNwbGFzaENvb3JkIGdldExpbmVEYXNoUGhhc2UoKTsKICBHQm9vbCBnZXRTdHJva2VBZGp1c3QoKTsKICBTcGxhc2hDbGlwICpnZXRDbGlwKCk7CiAgU3BsYXNoQml0bWFwICpnZXRTb2Z0TWFzaygpOwogIEdCb29sIGdldEluTm9uSXNvbGF0ZWRHcm91cCgpOwoKICAvLy0tLS0tIHN0YXRlIHdyaXRlCgogIHZvaWQgc2V0TWF0cml4KFNwbGFzaENvb3JkICptYXRyaXgpOwogIHZvaWQgc2V0U3Ryb2tlUGF0dGVybihTcGxhc2hQYXR0ZXJuICpzdHJva2VDb2xvcik7CiAgdm9pZCBzZXRGaWxsUGF0dGVybihTcGxhc2hQYXR0ZXJuICpmaWxsQ29sb3IpOwogIHZvaWQgc2V0U2NyZWVuKFNwbGFzaFNjcmVlbiAqc2NyZWVuKTsKICB2b2lkIHNldEJsZW5kRnVuYyhTcGxhc2hCbGVuZEZ1bmMgZnVuYyk7CiAgdm9pZCBzZXRTdHJva2VBbHBoYShTcGxhc2hDb29yZCBhbHBoYSk7CiAgdm9pZCBzZXRGaWxsQWxwaGEoU3BsYXNoQ29vcmQgYWxwaGEpOwogIHZvaWQgc2V0RmlsbE92ZXJwcmludChHQm9vbCBmb3ApOwogIHZvaWQgc2V0U3Ryb2tlT3ZlcnByaW50KEdCb29sIHNvcCk7CiAgdm9pZCBzZXRPdmVycHJpbnRNb2RlKGludCBvcG0pOwogIHZvaWQgc2V0TGluZVdpZHRoKFNwbGFzaENvb3JkIGxpbmVXaWR0aCk7CiAgdm9pZCBzZXRMaW5lQ2FwKGludCBsaW5lQ2FwKTsKICB2b2lkIHNldExpbmVKb2luKGludCBsaW5lSm9pbik7CiAgdm9pZCBzZXRNaXRlckxpbWl0KFNwbGFzaENvb3JkIG1pdGVyTGltaXQpOwogIHZvaWQgc2V0RmxhdG5lc3MoU3BsYXNoQ29vcmQgZmxhdG5lc3MpOwogIC8vIHRoZSA8bGluZURhc2g+IGFycmF5IHdpbGwgYmUgY29waWVkCiAgdm9pZCBzZXRMaW5lRGFzaChTcGxhc2hDb29yZCAqbGluZURhc2gsIGludCBsaW5lRGFzaExlbmd0aCwKCQkgICBTcGxhc2hDb29yZCBsaW5lRGFzaFBoYXNlKTsKICB2b2lkIHNldFN0cm9rZUFkanVzdChHQm9vbCBzdHJva2VBZGp1c3QpOwogIC8vIE5COiB1c2VzIHRyYW5zZm9ybWVkIGNvb3JkaW5hdGVzLgogIHZvaWQgY2xpcFJlc2V0VG9SZWN0KFNwbGFzaENvb3JkIHgwLCBTcGxhc2hDb29yZCB5MCwKCQkgICAgICAgU3BsYXNoQ29vcmQgeDEsIFNwbGFzaENvb3JkIHkxKTsKICAvLyBOQjogdXNlcyB0cmFuc2Zvcm1lZCBjb29yZGluYXRlcy4KICBTcGxhc2hFcnJvciBjbGlwVG9SZWN0KFNwbGFzaENvb3JkIHgwLCBTcGxhc2hDb29yZCB5MCwKCQkJIFNwbGFzaENvb3JkIHgxLCBTcGxhc2hDb29yZCB5MSk7CiAgLy8gTkI6IHVzZXMgdW50cmFuc2Zvcm1lZCBjb29yZGluYXRlcy4KICBTcGxhc2hFcnJvciBjbGlwVG9QYXRoKFNwbGFzaFBhdGggKnBhdGgsIEdCb29sIGVvKTsKICB2b2lkIHNldFNvZnRNYXNrKFNwbGFzaEJpdG1hcCAqc29mdE1hc2spOwogIHZvaWQgc2V0SW5Ob25Jc29sYXRlZEdyb3VwKFNwbGFzaEJpdG1hcCAqYWxwaGEwQml0bWFwQSwKCQkJICAgICBpbnQgYWxwaGEwWEEsIGludCBhbHBoYTBZQSk7CiAgdm9pZCBzZXRUcmFuc2ZlcihHdWNoYXIgKnJlZCwgR3VjaGFyICpncmVlbiwgR3VjaGFyICpibHVlLCBHdWNoYXIgKmdyYXkpOwogIHZvaWQgc2V0T3ZlcnByaW50TWFzayhHdWludCBvdmVycHJpbnRNYXNrLCBHQm9vbCBhZGRpdGl2ZSk7CgogIC8vLS0tLS0gc3RhdGUgc2F2ZS9yZXN0b3JlCgogIHZvaWQgc2F2ZVN0YXRlKCk7CiAgU3BsYXNoRXJyb3IgcmVzdG9yZVN0YXRlKCk7CgogIC8vLS0tLS0gZHJhd2luZyBvcGVyYXRpb25zCgogIC8vIEZpbGwgdGhlIGJpdG1hcCB3aXRoIDxjb2xvcj4uICBUaGlzIGlzIG5vdCBzdWJqZWN0IHRvIGNsaXBwaW5nLgogIHZvaWQgY2xlYXIoU3BsYXNoQ29sb3JQdHIgY29sb3IsIEd1Y2hhciBhbHBoYSA9IDB4MDApOwoKICAvLyBTdHJva2UgYSBwYXRoIHVzaW5nIHRoZSBjdXJyZW50IHN0cm9rZSBwYXR0ZXJuLgogIFNwbGFzaEVycm9yIHN0cm9rZShTcGxhc2hQYXRoICpwYXRoKTsKCiAgLy8gRmlsbCBhIHBhdGggdXNpbmcgdGhlIGN1cnJlbnQgZmlsbCBwYXR0ZXJuLgogIFNwbGFzaEVycm9yIGZpbGwoU3BsYXNoUGF0aCAqcGF0aCwgR0Jvb2wgZW8pOwoKICAvLyBGaWxsIGEgcGF0aCwgWE9SaW5nIHdpdGggdGhlIGN1cnJlbnQgZmlsbCBwYXR0ZXJuLgogIFNwbGFzaEVycm9yIHhvckZpbGwoU3BsYXNoUGF0aCAqcGF0aCwgR0Jvb2wgZW8pOwoKICAvLyBEcmF3IGEgY2hhcmFjdGVyLCB1c2luZyB0aGUgY3VycmVudCBmaWxsIHBhdHRlcm4uCiAgU3BsYXNoRXJyb3IgZmlsbENoYXIoU3BsYXNoQ29vcmQgeCwgU3BsYXNoQ29vcmQgeSwgaW50IGMsIFNwbGFzaEZvbnQgKmZvbnQpOwoKICAvLyBEcmF3IGEgZ2x5cGgsIHVzaW5nIHRoZSBjdXJyZW50IGZpbGwgcGF0dGVybi4gIFRoaXMgZnVuY3Rpb24gZG9lcwogIC8vIG5vdCBmcmVlIGFueSBkYXRhLCBpLmUuLCBpdCBpZ25vcmVzIGdseXBoLT5mcmVlRGF0YS4KICB2b2lkIGZpbGxHbHlwaChTcGxhc2hDb29yZCB4LCBTcGxhc2hDb29yZCB5LAoJCQlTcGxhc2hHbHlwaEJpdG1hcCAqZ2x5cGgpOwoKICAvLyBEcmF3cyBhbiBpbWFnZSBtYXNrIHVzaW5nIHRoZSBmaWxsIGNvbG9yLiAgVGhpcyB3aWxsIHJlYWQgPGg+CiAgLy8gbGluZXMgb2YgPHc+IHBpeGVscyBmcm9tIDxzcmM+LCBzdGFydGluZyB3aXRoIHRoZSB0b3AgbGluZS4gICIxIgogIC8vIHBpeGVscyB3aWxsIGJlIGRyYXduIHdpdGggdGhlIGN1cnJlbnQgZmlsbCBjb2xvcjsgIjAiIHBpeGVscyBhcmUKICAvLyB0cmFuc3BhcmVudC4gIFRoZSBtYXRyaXg6CiAgLy8gICAgWyBtYXRbMF0gbWF0WzFdIDAgXQogIC8vICAgIFsgbWF0WzJdIG1hdFszXSAwIF0KICAvLyAgICBbIG1hdFs0XSBtYXRbNV0gMSBdCiAgLy8gbWFwcyBhIHVuaXQgc3F1YXJlIHRvIHRoZSBkZXNpcmVkIGRlc3RpbmF0aW9uIGZvciB0aGUgaW1hZ2UsIGluCiAgLy8gUG9zdFNjcmlwdCBzdHlsZToKICAvLyAgICBbeCcgeScgMV0gPSBbeCB5IDFdICogbWF0CiAgLy8gTm90ZSB0aGF0IHRoZSBTcGxhc2ggeSBheGlzIHBvaW50cyBkb3dud2FyZCwgYW5kIHRoZSBpbWFnZSBzb3VyY2UKICAvLyBpcyBhc3N1bWVkIHRvIHByb2R1Y2UgcGl4ZWxzIGluIHJhc3RlciBvcmRlciwgc3RhcnRpbmcgZnJvbSB0aGUKICAvLyB0b3AgbGluZS4KICBTcGxhc2hFcnJvciBmaWxsSW1hZ2VNYXNrKFNwbGFzaEltYWdlTWFza1NvdXJjZSBzcmMsIHZvaWQgKnNyY0RhdGEsCgkJCSAgICBpbnQgdywgaW50IGgsIFNwbGFzaENvb3JkICptYXQsCgkJCSAgICBHQm9vbCBnbHlwaE1vZGUpOwoKICAvLyBEcmF3IGFuIGltYWdlLiAgVGhpcyB3aWxsIHJlYWQgPGg+IGxpbmVzIG9mIDx3PiBwaXhlbHMgZnJvbQogIC8vIDxzcmM+LCBzdGFydGluZyB3aXRoIHRoZSB0b3AgbGluZS4gIFRoZXNlIHBpeGVscyBhcmUgYXNzdW1lZCB0bwogIC8vIGJlIGluIHRoZSBzb3VyY2UgbW9kZSwgPHNyY01vZGU+LiAgSWYgPHNyY0FscGhhPiBpcyB0cnVlLCB0aGUKICAvLyBhbHBoYSB2YWx1ZXMgcmV0dXJuZWQgYnkgPHNyYz4gYXJlIHVzZWQ7IG90aGVyd2lzZSB0aGV5IGFyZQogIC8vIGlnbm9yZWQuICBUaGUgZm9sbG93aW5nIGNvbWJpbmF0aW9ucyBvZiBzb3VyY2UgYW5kIHRhcmdldCBtb2RlcwogIC8vIGFyZSBzdXBwb3J0ZWQ6CiAgLy8gICAgc291cmNlICAgICAgIHRhcmdldAogIC8vICAgIC0tLS0tLSAgICAgICAtLS0tLS0KICAvLyAgICBNb25vMSAgICAgICAgTW9ubzEKICAvLyAgICBNb25vOCAgICAgICAgTW9ubzEgICAtLSB3aXRoIGRpdGhlcmluZwogIC8vICAgIE1vbm84ICAgICAgICBNb25vOAogIC8vICAgIFJHQjggICAgICAgICBSR0I4CiAgLy8gICAgQkdSOCAgICAgICAgIEJHUjgKICAvLyAgICBDTVlLOCAgICAgICAgQ01ZSzgKICAvLyBUaGUgbWF0cml4IGJlaGF2ZXMgYXMgZm9yIGZpbGxJbWFnZU1hc2suCiAgU3BsYXNoRXJyb3IgZHJhd0ltYWdlKFNwbGFzaEltYWdlU291cmNlIHNyYywgdm9pZCAqc3JjRGF0YSwKCQkJU3BsYXNoQ29sb3JNb2RlIHNyY01vZGUsIEdCb29sIHNyY0FscGhhLAoJCQlpbnQgdywgaW50IGgsIFNwbGFzaENvb3JkICptYXQsIEdCb29sIGludGVycG9sYXRlLAoJCQlHQm9vbCB0aWxpbmdQYXR0ZXJuID0gZ0ZhbHNlKTsKCiAgLy8gQ29tcG9zaXRlIGEgcmVjdGFuZ3VsYXIgcmVnaW9uIGZyb20gPHNyYz4gb250byB0aGlzIFNwbGFzaAogIC8vIG9iamVjdC4KICBTcGxhc2hFcnJvciBjb21wb3NpdGUoU3BsYXNoQml0bWFwICpzcmMsIGludCB4U3JjLCBpbnQgeVNyYywKCQkJaW50IHhEZXN0LCBpbnQgeURlc3QsIGludCB3LCBpbnQgaCwKCQkJR0Jvb2wgbm9DbGlwLCBHQm9vbCBub25Jc29sYXRlZCwKCQkJR0Jvb2wga25vY2tvdXQgPSBnRmFsc2UsIFNwbGFzaENvb3JkIGtub2Nrb3V0T3BhY2l0eSA9IDEuMCk7CgogIC8vIENvbXBvc2l0ZSB0aGlzIFNwbGFzaCBvYmplY3Qgb250byBhIGJhY2tncm91bmQgY29sb3IuICBUaGUKICAvLyBiYWNrZ3JvdW5kIGFscGhhIGlzIGFzc3VtZWQgdG8gYmUgMS4KICB2b2lkIGNvbXBvc2l0ZUJhY2tncm91bmQoU3BsYXNoQ29sb3JQdHIgY29sb3IpOwoKICAvLyBDb3B5IGEgcmVjdGFuZ3VsYXIgcmVnaW9uIGZyb20gPHNyYz4gb250byB0aGUgYml0bWFwIGJlbG9uZ2luZyB0bwogIC8vIHRoaXMgU3BsYXNoIG9iamVjdC4gIFRoZSBkZXN0aW5hdGlvbiBhbHBoYSB2YWx1ZXMgYXJlIGFsbCBzZXQgdG8KICAvLyB6ZXJvLgogIFNwbGFzaEVycm9yIGJsaXRUcmFuc3BhcmVudChTcGxhc2hCaXRtYXAgKnNyYywgaW50IHhTcmMsIGludCB5U3JjLAoJCQkgICAgICBpbnQgeERlc3QsIGludCB5RGVzdCwgaW50IHcsIGludCBoKTsKICB2b2lkIGJsaXRJbWFnZShTcGxhc2hCaXRtYXAgKnNyYywgR0Jvb2wgc3JjQWxwaGEsIGludCB4RGVzdCwgaW50IHlEZXN0KTsKCiAgLy8tLS0tLSBtaXNjCgogIC8vIENvbnN0cnVjdCBhIHBhdGggZm9yIGEgc3Ryb2tlLCBnaXZlbiB0aGUgcGF0aCB0byBiZSBzdHJva2VkIGFuZAogIC8vIHRoZSBsaW5lIHdpZHRoIDx3Pi4gIEFsbCBvdGhlciBzdHJva2UgcGFyYW1ldGVycyBhcmUgdGFrZW4gZnJvbQogIC8vIHRoZSBjdXJyZW50IHN0YXRlLiAgSWYgPGZsYXR0ZW4+IGlzIHRydWUsIHRoaXMgZnVuY3Rpb24gd2lsbAogIC8vIGZpcnN0IGZsYXR0ZW4gdGhlIHBhdGggYW5kIGhhbmRsZSB0aGUgbGluZWRhc2guCiAgU3BsYXNoUGF0aCAqbWFrZVN0cm9rZVBhdGgoU3BsYXNoUGF0aCAqcGF0aCwgU3BsYXNoQ29vcmQgdywKCQkJICAgICBHQm9vbCBmbGF0dGVuID0gZ1RydWUpOwoKICAvLyBSZXR1cm4gdGhlIGFzc29jaWF0ZWQgYml0bWFwLgogIFNwbGFzaEJpdG1hcCAqZ2V0Qml0bWFwKCkgeyByZXR1cm4gYml0bWFwOyB9CgogIC8vIFNldCB0aGUgbWluaW11bSBsaW5lIHdpZHRoLgogIHZvaWQgc2V0TWluTGluZVdpZHRoKFNwbGFzaENvb3JkIHcpIHsgbWluTGluZVdpZHRoID0gdzsgfQoKICAvLyBTZXR0ZXIvR2V0dGVyIGZvciB0aGluIGxpbmUgbW9kZQogIHZvaWQgc2V0VGhpbkxpbmVNb2RlKFNwbGFzaFRoaW5MaW5lTW9kZSB0aGluTGluZU1vZGVBKSB7IHRoaW5MaW5lTW9kZSA9IHRoaW5MaW5lTW9kZUE7IH0KICBTcGxhc2hUaGluTGluZU1vZGUgZ2V0VGhpbkxpbmVNb2RlKCkgeyByZXR1cm4gdGhpbkxpbmVNb2RlOyB9CgogIC8vIEdldCBhIGJvdW5kaW5nIGJveCB3aGljaCBpbmNsdWRlcyBhbGwgbW9kaWZpY2F0aW9ucyBzaW5jZSB0aGUKICAvLyBsYXN0IGNhbGwgdG8gY2xlYXJNb2RSZWdpb24uCiAgdm9pZCBnZXRNb2RSZWdpb24oaW50ICp4TWluLCBpbnQgKnlNaW4sIGludCAqeE1heCwgaW50ICp5TWF4KQogICAgeyAqeE1pbiA9IG1vZFhNaW47ICp5TWluID0gbW9kWU1pbjsgKnhNYXggPSBtb2RYTWF4OyAqeU1heCA9IG1vZFlNYXg7IH0KCiAgLy8gQ2xlYXIgdGhlIG1vZGlmaWVkIHJlZ2lvbiBib3VuZGluZyBib3guCiAgdm9pZCBjbGVhck1vZFJlZ2lvbigpOwoKICAvLyBHZXQgY2xpcHBpbmcgc3RhdHVzIGZvciB0aGUgbGFzdCBkcmF3aW5nIG9wZXJhdGlvbiBzdWJqZWN0IHRvCiAgLy8gY2xpcHBpbmcuCiAgU3BsYXNoQ2xpcFJlc3VsdCBnZXRDbGlwUmVzKCkgeyByZXR1cm4gb3BDbGlwUmVzOyB9CgogIC8vIFRvZ2dsZSBkZWJ1ZyBtb2RlIG9uIG9yIG9mZi4KICB2b2lkIHNldERlYnVnTW9kZShHQm9vbCBkZWJ1Z01vZGVBKSB7IGRlYnVnTW9kZSA9IGRlYnVnTW9kZUE7IH0KCiNpZiAxIC8vfnRtcDogdHVybiBvZmYgYW50aS1hbGlhc2luZyB0ZW1wb3JhcmlseQogIHZvaWQgc2V0SW5TaGFkaW5nKEdCb29sIHNoKSB7IGluU2hhZGluZyA9IHNoOyB9CiAgR0Jvb2wgZ2V0VmVjdG9yQW50aWFsaWFzKCkgeyByZXR1cm4gdmVjdG9yQW50aWFsaWFzOyB9CiAgdm9pZCBzZXRWZWN0b3JBbnRpYWxpYXMoR0Jvb2wgdmFhKSB7IHZlY3RvckFudGlhbGlhcyA9IHZhYTsgfQojZW5kaWYKCiAgLy8gRG8gc2hhZGVkIGZpbGxzIHdpdGggZHluYW1pYyBwYXR0ZXJucwogIFNwbGFzaEVycm9yIHNoYWRlZEZpbGwoU3BsYXNoUGF0aCAqcGF0aCwgR0Jvb2wgaGFzQkJveCwKICAgICAgICAgICAgICAgICAgICAgICAgIFNwbGFzaFBhdHRlcm4gKnBhdHRlcm4pOwogIC8vIERyYXcgYSBnb3VyYXVkIHRyaWFuZ2xlIHNoYWRpbmcuCiAgR0Jvb2wgZ291cmF1ZFRyaWFuZ2xlU2hhZGVkRmlsbChTcGxhc2hHb3VyYXVkQ29sb3IgKnNoYWRpbmcpOwoKcHJpdmF0ZToKCiAgdm9pZCBwaXBlSW5pdChTcGxhc2hQaXBlICpwaXBlLCBpbnQgeCwgaW50IHksCgkJU3BsYXNoUGF0dGVybiAqcGF0dGVybiwgU3BsYXNoQ29sb3JQdHIgY1NyYywKCQlHdWNoYXIgYUlucHV0LCBHQm9vbCB1c2VzU2hhcGUsCgkJR0Jvb2wgbm9uSXNvbGF0ZWRHcm91cCwKCQlHQm9vbCBrbm9ja291dCA9IGdGYWxzZSwgR3VjaGFyIGtub2Nrb3V0T3BhY2l0eSA9IDI1NSk7CiAgdm9pZCBwaXBlUnVuKFNwbGFzaFBpcGUgKnBpcGUpOwogIHZvaWQgcGlwZVJ1blNpbXBsZU1vbm8xKFNwbGFzaFBpcGUgKnBpcGUpOwogIHZvaWQgcGlwZVJ1blNpbXBsZU1vbm84KFNwbGFzaFBpcGUgKnBpcGUpOwogIHZvaWQgcGlwZVJ1blNpbXBsZVJHQjgoU3BsYXNoUGlwZSAqcGlwZSk7CiAgdm9pZCBwaXBlUnVuU2ltcGxlWEJHUjgoU3BsYXNoUGlwZSAqcGlwZSk7CiAgdm9pZCBwaXBlUnVuU2ltcGxlQkdSOChTcGxhc2hQaXBlICpwaXBlKTsKI2lmIFNQTEFTSF9DTVlLCiAgdm9pZCBwaXBlUnVuU2ltcGxlQ01ZSzgoU3BsYXNoUGlwZSAqcGlwZSk7CiAgdm9pZCBwaXBlUnVuU2ltcGxlRGV2aWNlTjgoU3BsYXNoUGlwZSAqcGlwZSk7CiNlbmRpZgogIHZvaWQgcGlwZVJ1bkFBTW9ubzEoU3BsYXNoUGlwZSAqcGlwZSk7CiAgdm9pZCBwaXBlUnVuQUFNb25vOChTcGxhc2hQaXBlICpwaXBlKTsKICB2b2lkIHBpcGVSdW5BQVJHQjgoU3BsYXNoUGlwZSAqcGlwZSk7CiAgdm9pZCBwaXBlUnVuQUFYQkdSOChTcGxhc2hQaXBlICpwaXBlKTsKICB2b2lkIHBpcGVSdW5BQUJHUjgoU3BsYXNoUGlwZSAqcGlwZSk7CiNpZiBTUExBU0hfQ01ZSwogIHZvaWQgcGlwZVJ1bkFBQ01ZSzgoU3BsYXNoUGlwZSAqcGlwZSk7CiAgdm9pZCBwaXBlUnVuQUFEZXZpY2VOOChTcGxhc2hQaXBlICpwaXBlKTsKI2VuZGlmCiAgdm9pZCBwaXBlU2V0WFkoU3BsYXNoUGlwZSAqcGlwZSwgaW50IHgsIGludCB5KTsKICB2b2lkIHBpcGVJbmNYKFNwbGFzaFBpcGUgKnBpcGUpOwogIHZvaWQgZHJhd1BpeGVsKFNwbGFzaFBpcGUgKnBpcGUsIGludCB4LCBpbnQgeSwgR0Jvb2wgbm9DbGlwKTsKICB2b2lkIGRyYXdBQVBpeGVsSW5pdCgpOwogIHZvaWQgZHJhd0FBUGl4ZWwoU3BsYXNoUGlwZSAqcGlwZSwgaW50IHgsIGludCB5KTsKICB2b2lkIGRyYXdTcGFuKFNwbGFzaFBpcGUgKnBpcGUsIGludCB4MCwgaW50IHgxLCBpbnQgeSwgR0Jvb2wgbm9DbGlwKTsKICB2b2lkIGRyYXdBQUxpbmUoU3BsYXNoUGlwZSAqcGlwZSwgaW50IHgwLCBpbnQgeDEsIGludCB5LCBHQm9vbCBhZGp1c3RMaW5lID0gZ0ZhbHNlLCBHdWNoYXIgbGluZU9wYWNpdHkgPSAwKTsKICB2b2lkIHRyYW5zZm9ybShTcGxhc2hDb29yZCAqbWF0cml4LCBTcGxhc2hDb29yZCB4aSwgU3BsYXNoQ29vcmQgeWksCgkJIFNwbGFzaENvb3JkICp4bywgU3BsYXNoQ29vcmQgKnlvKTsKICB2b2lkIHVwZGF0ZU1vZFgoaW50IHgpOwogIHZvaWQgdXBkYXRlTW9kWShpbnQgeSk7CiAgdm9pZCBzdHJva2VOYXJyb3coU3BsYXNoUGF0aCAqcGF0aCk7CiAgdm9pZCBzdHJva2VXaWRlKFNwbGFzaFBhdGggKnBhdGgsIFNwbGFzaENvb3JkIHcpOwogIFNwbGFzaFBhdGggKmZsYXR0ZW5QYXRoKFNwbGFzaFBhdGggKnBhdGgsIFNwbGFzaENvb3JkICptYXRyaXgsCgkJCSAgU3BsYXNoQ29vcmQgZmxhdG5lc3MpOwogIHZvaWQgZmxhdHRlbkN1cnZlKFNwbGFzaENvb3JkIHgwLCBTcGxhc2hDb29yZCB5MCwKCQkgICAgU3BsYXNoQ29vcmQgeDEsIFNwbGFzaENvb3JkIHkxLAoJCSAgICBTcGxhc2hDb29yZCB4MiwgU3BsYXNoQ29vcmQgeTIsCgkJICAgIFNwbGFzaENvb3JkIHgzLCBTcGxhc2hDb29yZCB5MywKCQkgICAgU3BsYXNoQ29vcmQgKm1hdHJpeCwgU3BsYXNoQ29vcmQgZmxhdG5lc3MyLAoJCSAgICBTcGxhc2hQYXRoICpmUGF0aCk7CiAgU3BsYXNoUGF0aCAqbWFrZURhc2hlZFBhdGgoU3BsYXNoUGF0aCAqeFBhdGgpOwogIHZvaWQgZ2V0QkJveEZQKFNwbGFzaFBhdGggKnBhdGgsIFNwbGFzaENvb3JkICp4TWluQSwgU3BsYXNoQ29vcmQgKnlNaW5BLCBTcGxhc2hDb29yZCAqeE1heEEsIFNwbGFzaENvb3JkICp5TWF4QSk7CiAgU3BsYXNoRXJyb3IgZmlsbFdpdGhQYXR0ZXJuKFNwbGFzaFBhdGggKnBhdGgsIEdCb29sIGVvLAoJCQkgICAgICBTcGxhc2hQYXR0ZXJuICpwYXR0ZXJuLCBTcGxhc2hDb29yZCBhbHBoYSk7CiAgR0Jvb2wgcGF0aEFsbE91dHNpZGUoU3BsYXNoUGF0aCAqcGF0aCk7CiAgdm9pZCBmaWxsR2x5cGgyKGludCB4MCwgaW50IHkwLCBTcGxhc2hHbHlwaEJpdG1hcCAqZ2x5cGgsIEdCb29sIG5vY2xpcCk7CiAgdm9pZCBhcmJpdHJhcnlUcmFuc2Zvcm1NYXNrKFNwbGFzaEltYWdlTWFza1NvdXJjZSBzcmMsIHZvaWQgKnNyY0RhdGEsCgkJCSAgICAgIGludCBzcmNXaWR0aCwgaW50IHNyY0hlaWdodCwKCQkJICAgICAgU3BsYXNoQ29vcmQgKm1hdCwgR0Jvb2wgZ2x5cGhNb2RlKTsKICBTcGxhc2hCaXRtYXAgKnNjYWxlTWFzayhTcGxhc2hJbWFnZU1hc2tTb3VyY2Ugc3JjLCB2b2lkICpzcmNEYXRhLAoJCQkgIGludCBzcmNXaWR0aCwgaW50IHNyY0hlaWdodCwKCQkJICBpbnQgc2NhbGVkV2lkdGgsIGludCBzY2FsZWRIZWlnaHQpOwogIHZvaWQgc2NhbGVNYXNrWWRYZChTcGxhc2hJbWFnZU1hc2tTb3VyY2Ugc3JjLCB2b2lkICpzcmNEYXRhLAoJCSAgICAgaW50IHNyY1dpZHRoLCBpbnQgc3JjSGVpZ2h0LAoJCSAgICAgaW50IHNjYWxlZFdpZHRoLCBpbnQgc2NhbGVkSGVpZ2h0LAoJCSAgICAgU3BsYXNoQml0bWFwICpkZXN0KTsKICB2b2lkIHNjYWxlTWFza1lkWHUoU3BsYXNoSW1hZ2VNYXNrU291cmNlIHNyYywgdm9pZCAqc3JjRGF0YSwKCQkgICAgIGludCBzcmNXaWR0aCwgaW50IHNyY0hlaWdodCwKCQkgICAgIGludCBzY2FsZWRXaWR0aCwgaW50IHNjYWxlZEhlaWdodCwKCQkgICAgIFNwbGFzaEJpdG1hcCAqZGVzdCk7CiAgdm9pZCBzY2FsZU1hc2tZdVhkKFNwbGFzaEltYWdlTWFza1NvdXJjZSBzcmMsIHZvaWQgKnNyY0RhdGEsCgkJICAgICBpbnQgc3JjV2lkdGgsIGludCBzcmNIZWlnaHQsCgkJICAgICBpbnQgc2NhbGVkV2lkdGgsIGludCBzY2FsZWRIZWlnaHQsCgkJICAgICBTcGxhc2hCaXRtYXAgKmRlc3QpOwogIHZvaWQgc2NhbGVNYXNrWXVYdShTcGxhc2hJbWFnZU1hc2tTb3VyY2Ugc3JjLCB2b2lkICpzcmNEYXRhLAoJCSAgICAgaW50IHNyY1dpZHRoLCBpbnQgc3JjSGVpZ2h0LAoJCSAgICAgaW50IHNjYWxlZFdpZHRoLCBpbnQgc2NhbGVkSGVpZ2h0LAoJCSAgICAgU3BsYXNoQml0bWFwICpkZXN0KTsKICB2b2lkIGJsaXRNYXNrKFNwbGFzaEJpdG1hcCAqc3JjLCBpbnQgeERlc3QsIGludCB5RGVzdCwKCQlTcGxhc2hDbGlwUmVzdWx0IGNsaXBSZXMpOwogIFNwbGFzaEVycm9yIGFyYml0cmFyeVRyYW5zZm9ybUltYWdlKFNwbGFzaEltYWdlU291cmNlIHNyYywgdm9pZCAqc3JjRGF0YSwKCQkJICAgICAgIFNwbGFzaENvbG9yTW9kZSBzcmNNb2RlLCBpbnQgbkNvbXBzLAoJCQkgICAgICAgR0Jvb2wgc3JjQWxwaGEsCgkJCSAgICAgICBpbnQgc3JjV2lkdGgsIGludCBzcmNIZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTcGxhc2hDb29yZCAqbWF0LCBHQm9vbCBpbnRlcnBvbGF0ZSwgR0Jvb2wgdGlsaW5nUGF0dGVybiA9IGdGYWxzZSk7CiAgU3BsYXNoQml0bWFwICpzY2FsZUltYWdlKFNwbGFzaEltYWdlU291cmNlIHNyYywgdm9pZCAqc3JjRGF0YSwKCQkJICAgU3BsYXNoQ29sb3JNb2RlIHNyY01vZGUsIGludCBuQ29tcHMsCgkJCSAgIEdCb29sIHNyY0FscGhhLCBpbnQgc3JjV2lkdGgsIGludCBzcmNIZWlnaHQsCgkJCSAgIGludCBzY2FsZWRXaWR0aCwgaW50IHNjYWxlZEhlaWdodCwgR0Jvb2wgaW50ZXJwb2xhdGUsIEdCb29sIHRpbGluZ1BhdHRlcm4gPSBnRmFsc2UpOwogIHZvaWQgc2NhbGVJbWFnZVlkWGQoU3BsYXNoSW1hZ2VTb3VyY2Ugc3JjLCB2b2lkICpzcmNEYXRhLAoJCSAgICAgIFNwbGFzaENvbG9yTW9kZSBzcmNNb2RlLCBpbnQgbkNvbXBzLAoJCSAgICAgIEdCb29sIHNyY0FscGhhLCBpbnQgc3JjV2lkdGgsIGludCBzcmNIZWlnaHQsCgkJICAgICAgaW50IHNjYWxlZFdpZHRoLCBpbnQgc2NhbGVkSGVpZ2h0LAoJCSAgICAgIFNwbGFzaEJpdG1hcCAqZGVzdCk7CiAgdm9pZCBzY2FsZUltYWdlWWRYdShTcGxhc2hJbWFnZVNvdXJjZSBzcmMsIHZvaWQgKnNyY0RhdGEsCgkJICAgICAgU3BsYXNoQ29sb3JNb2RlIHNyY01vZGUsIGludCBuQ29tcHMsCgkJICAgICAgR0Jvb2wgc3JjQWxwaGEsIGludCBzcmNXaWR0aCwgaW50IHNyY0hlaWdodCwKCQkgICAgICBpbnQgc2NhbGVkV2lkdGgsIGludCBzY2FsZWRIZWlnaHQsCgkJICAgICAgU3BsYXNoQml0bWFwICpkZXN0KTsKICB2b2lkIHNjYWxlSW1hZ2VZdVhkKFNwbGFzaEltYWdlU291cmNlIHNyYywgdm9pZCAqc3JjRGF0YSwKCQkgICAgICBTcGxhc2hDb2xvck1vZGUgc3JjTW9kZSwgaW50IG5Db21wcywKCQkgICAgICBHQm9vbCBzcmNBbHBoYSwgaW50IHNyY1dpZHRoLCBpbnQgc3JjSGVpZ2h0LAoJCSAgICAgIGludCBzY2FsZWRXaWR0aCwgaW50IHNjYWxlZEhlaWdodCwKCQkgICAgICBTcGxhc2hCaXRtYXAgKmRlc3QpOwogIHZvaWQgc2NhbGVJbWFnZVl1WHUoU3BsYXNoSW1hZ2VTb3VyY2Ugc3JjLCB2b2lkICpzcmNEYXRhLAoJCSAgICAgIFNwbGFzaENvbG9yTW9kZSBzcmNNb2RlLCBpbnQgbkNvbXBzLAoJCSAgICAgIEdCb29sIHNyY0FscGhhLCBpbnQgc3JjV2lkdGgsIGludCBzcmNIZWlnaHQsCgkJICAgICAgaW50IHNjYWxlZFdpZHRoLCBpbnQgc2NhbGVkSGVpZ2h0LAoJCSAgICAgIFNwbGFzaEJpdG1hcCAqZGVzdCk7CiAgdm9pZCBzY2FsZUltYWdlWXVYdUJpbGluZWFyKFNwbGFzaEltYWdlU291cmNlIHNyYywgdm9pZCAqc3JjRGF0YSwKCQkgICAgICBTcGxhc2hDb2xvck1vZGUgc3JjTW9kZSwgaW50IG5Db21wcywKCQkgICAgICBHQm9vbCBzcmNBbHBoYSwgaW50IHNyY1dpZHRoLCBpbnQgc3JjSGVpZ2h0LAoJCSAgICAgIGludCBzY2FsZWRXaWR0aCwgaW50IHNjYWxlZEhlaWdodCwKCQkgICAgICBTcGxhc2hCaXRtYXAgKmRlc3QpOwogIHZvaWQgdmVydEZsaXBJbWFnZShTcGxhc2hCaXRtYXAgKmltZywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAoJCSAgICAgaW50IG5Db21wcyk7CiAgdm9pZCBibGl0SW1hZ2UoU3BsYXNoQml0bWFwICpzcmMsIEdCb29sIHNyY0FscGhhLCBpbnQgeERlc3QsIGludCB5RGVzdCwKCQkgU3BsYXNoQ2xpcFJlc3VsdCBjbGlwUmVzKTsKICB2b2lkIGJsaXRJbWFnZUNsaXBwZWQoU3BsYXNoQml0bWFwICpzcmMsIEdCb29sIHNyY0FscGhhLAoJCQlpbnQgeFNyYywgaW50IHlTcmMsIGludCB4RGVzdCwgaW50IHlEZXN0LAoJCQlpbnQgdywgaW50IGgpOwogIHZvaWQgZHVtcFBhdGgoU3BsYXNoUGF0aCAqcGF0aCk7CiAgdm9pZCBkdW1wWFBhdGgoU3BsYXNoWFBhdGggKnBhdGgpOwoKICBzdGF0aWMgU3BsYXNoUGlwZVJlc3VsdENvbG9yQ3RybCBwaXBlUmVzdWx0Q29sb3JOb0FscGhhQmxlbmRbXTsKICBzdGF0aWMgU3BsYXNoUGlwZVJlc3VsdENvbG9yQ3RybCBwaXBlUmVzdWx0Q29sb3JBbHBoYU5vQmxlbmRbXTsKICBzdGF0aWMgU3BsYXNoUGlwZVJlc3VsdENvbG9yQ3RybCBwaXBlUmVzdWx0Q29sb3JBbHBoYUJsZW5kW107CiAgc3RhdGljIGludCBwaXBlTm9uSXNvR3JvdXBDb3JyZWN0aW9uW107CgogIFNwbGFzaEJpdG1hcCAqYml0bWFwOwogIFNwbGFzaFN0YXRlICpzdGF0ZTsKICBTcGxhc2hCaXRtYXAgKmFhQnVmOwogIGludCBhYUJ1Zlk7CiAgU3BsYXNoQml0bWFwICphbHBoYTBCaXRtYXA7CS8vIGZvciBub24taXNvbGF0ZWQgZ3JvdXBzLCB0aGlzIGlzIHRoZQoJCQkJLy8gICBiaXRtYXAgY29udGFpbmluZyB0aGUgYWxwaGEwIHZhbHVlcwogIGludCBhbHBoYTBYLCBhbHBoYTBZOwkJLy8gb2Zmc2V0IHdpdGhpbiBhbHBoYTBCaXRtYXAKICBTcGxhc2hDb29yZCBhYUdhbW1hW3NwbGFzaEFBU2l6ZSAqIHNwbGFzaEFBU2l6ZSArIDFdOwogIFNwbGFzaENvb3JkIG1pbkxpbmVXaWR0aDsKICBTcGxhc2hUaGluTGluZU1vZGUgdGhpbkxpbmVNb2RlOwogIGludCBtb2RYTWluLCBtb2RZTWluLCBtb2RYTWF4LCBtb2RZTWF4OwogIFNwbGFzaENsaXBSZXN1bHQgb3BDbGlwUmVzOwogIEdCb29sIHZlY3RvckFudGlhbGlhczsKICBHQm9vbCBpblNoYWRpbmc7CiAgR0Jvb2wgZGVidWdNb2RlOwp9OwoKI2VuZGlmCg==