Ly89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8KLy8gU3BsYXNoQml0bWFwLmNjCi8vCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLwovLyBNb2RpZmllZCB1bmRlciB0aGUgUG9wcGxlciBwcm9qZWN0IC0gaHR0cDovL3BvcHBsZXIuZnJlZWRlc2t0b3Aub3JnCi8vCi8vIEFsbCBjaGFuZ2VzIG1hZGUgdW5kZXIgdGhlIFBvcHBsZXIgcHJvamVjdCB0byB0aGlzIGZpbGUgYXJlIGxpY2Vuc2VkCi8vIHVuZGVyIEdQTCB2ZXJzaW9uIDIgb3IgbGF0ZXIKLy8KLy8gQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA5LCAyMDEwIEFsYmVydCBBc3RhbHMgQ2lkIDxhYWNpZEBrZGUub3JnPgovLyBDb3B5cmlnaHQgKEMpIDIwMDcgSWxtYXJpIEhlaWtraW5lbiA8aWxtYXJpLmhlaWtraW5lbkBnbWFpbC5jb20+Ci8vIENvcHlyaWdodCAoQykgMjAwOSBTaGVuIExpYW5nIDxzaGVuemh1eGlAZ21haWwuY29tPgovLyBDb3B5cmlnaHQgKEMpIDIwMDkgU3RlZmFuIFRob21hcyA8dGhvbWFzQGVsb2FkMjQuY29tPgovLyBDb3B5cmlnaHQgKEMpIDIwMTAgQWRyaWFuIEpvaG5zb24gPGFqb2huc29uQHJlZG5lb24uY29tPgovLyBDb3B5cmlnaHQgKEMpIDIwMTAgSGFycnkgUm9iZXJ0cyA8aGFycnkucm9iZXJ0c0BtaWRuaWdodC1sYWJzLm9yZz4KLy8gQ29weXJpZ2h0IChDKSAyMDEwIENocmlzdGlhbiBGZXVlcnPkbmdlciA8Y2ZldWVyc2FlbmdlckBnb29nbGVtYWlsLmNvbT4KLy8KLy8gVG8gc2VlIGEgZGVzY3JpcHRpb24gb2YgdGhlIGNoYW5nZXMgcGxlYXNlIHNlZSB0aGUgQ2hhbmdlbG9nIGZpbGUgdGhhdAovLyBjYW1lIHdpdGggeW91ciB0YXJiYWxsIG9yIHR5cGUgbWFrZSBDaGFuZ2VMb2cgaWYgeW91IGFyZSBidWlsZGluZyBmcm9tIGdpdAovLwovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKI2luY2x1ZGUgPGNvbmZpZy5oPgoKI2lmZGVmIFVTRV9HQ0NfUFJBR01BUwojcHJhZ21hIGltcGxlbWVudGF0aW9uCiNlbmRpZgoKI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPGxpbWl0cy5oPgojaW5jbHVkZSAiZ29vL2dtZW0uaCIKI2luY2x1ZGUgIlNwbGFzaEVycm9yQ29kZXMuaCIKI2luY2x1ZGUgIlNwbGFzaEJpdG1hcC5oIgojaW5jbHVkZSAicG9wcGxlci9FcnJvci5oIgojaW5jbHVkZSAiZ29vL0pwZWdXcml0ZXIuaCIKI2luY2x1ZGUgImdvby9QTkdXcml0ZXIuaCIKI2luY2x1ZGUgImdvby9JbWdXcml0ZXIuaCIKCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIFNwbGFzaEJpdG1hcAovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKU3BsYXNoQml0bWFwOjpTcGxhc2hCaXRtYXAoaW50IHdpZHRoQSwgaW50IGhlaWdodEEsIGludCByb3dQYWRBLAoJCQkgICBTcGxhc2hDb2xvck1vZGUgbW9kZUEsIEdCb29sIGFscGhhQSwKCQkJICAgR0Jvb2wgdG9wRG93bikgewogIHdpZHRoID0gd2lkdGhBOwogIGhlaWdodCA9IGhlaWdodEE7CiAgbW9kZSA9IG1vZGVBOwogIHJvd1BhZCA9IHJvd1BhZEE7CiAgc3dpdGNoIChtb2RlKSB7CiAgY2FzZSBzcGxhc2hNb2RlTW9ubzE6CiAgICBpZiAod2lkdGggPiAwKSB7CiAgICAgIHJvd1NpemUgPSAod2lkdGggKyA3KSA+PiAzOwogICAgfSBlbHNlIHsKICAgICAgcm93U2l6ZSA9IC0xOwogICAgfQogICAgYnJlYWs7CiAgY2FzZSBzcGxhc2hNb2RlTW9ubzg6CiAgICBpZiAod2lkdGggPiAwKSB7CiAgICAgIHJvd1NpemUgPSB3aWR0aDsKICAgIH0gZWxzZSB7CiAgICAgIHJvd1NpemUgPSAtMTsKICAgIH0KICAgIGJyZWFrOwogIGNhc2Ugc3BsYXNoTW9kZVJHQjg6CiAgY2FzZSBzcGxhc2hNb2RlQkdSODoKICAgIGlmICh3aWR0aCA+IDAgJiYgd2lkdGggPD0gSU5UX01BWCAvIDMpIHsKICAgICAgcm93U2l6ZSA9IHdpZHRoICogMzsKICAgIH0gZWxzZSB7CiAgICAgIHJvd1NpemUgPSAtMTsKICAgIH0KICAgIGJyZWFrOwogIGNhc2Ugc3BsYXNoTW9kZVhCR1I4OgogICAgaWYgKHdpZHRoID4gMCAmJiB3aWR0aCA8PSBJTlRfTUFYIC8gNCkgewogICAgICByb3dTaXplID0gd2lkdGggKiA0OwogICAgfSBlbHNlIHsKICAgICAgcm93U2l6ZSA9IC0xOwogICAgfQogICAgYnJlYWs7CiNpZiBTUExBU0hfQ01ZSwogIGNhc2Ugc3BsYXNoTW9kZUNNWUs4OgogICAgaWYgKHdpZHRoID4gMCAmJiB3aWR0aCA8PSBJTlRfTUFYIC8gNCkgewogICAgICByb3dTaXplID0gd2lkdGggKiA0OwogICAgfSBlbHNlIHsKICAgICAgcm93U2l6ZSA9IC0xOwogICAgfQogICAgYnJlYWs7CiNlbmRpZgogIH0KICBpZiAocm93U2l6ZSA+IDApIHsKICAgIHJvd1NpemUgKz0gcm93UGFkIC0gMTsKICAgIHJvd1NpemUgLT0gcm93U2l6ZSAlIHJvd1BhZDsKICB9CiAgZGF0YSA9IChTcGxhc2hDb2xvclB0cilnbWFsbG9jbihyb3dTaXplLCBoZWlnaHQpOwogIGlmICghdG9wRG93bikgewogICAgZGF0YSArPSAoaGVpZ2h0IC0gMSkgKiByb3dTaXplOwogICAgcm93U2l6ZSA9IC1yb3dTaXplOwogIH0KICBpZiAoYWxwaGFBKSB7CiAgICBhbHBoYSA9IChHdWNoYXIgKilnbWFsbG9jbih3aWR0aCwgaGVpZ2h0KTsKICB9IGVsc2UgewogICAgYWxwaGEgPSBOVUxMOwogIH0KfQoKClNwbGFzaEJpdG1hcDo6flNwbGFzaEJpdG1hcCgpIHsKICBpZiAocm93U2l6ZSA8IDApIHsKICAgIGdmcmVlKGRhdGEgKyAoaGVpZ2h0IC0gMSkgKiByb3dTaXplKTsKICB9IGVsc2UgewogICAgZ2ZyZWUoZGF0YSk7CiAgfQogIGdmcmVlKGFscGhhKTsKfQoKClNwbGFzaEVycm9yIFNwbGFzaEJpdG1hcDo6d3JpdGVQTk1GaWxlKGNoYXIgKmZpbGVOYW1lKSB7CiAgRklMRSAqZjsKICBTcGxhc2hFcnJvciBlOwoKICBpZiAoIShmID0gZm9wZW4oZmlsZU5hbWUsICJ3YiIpKSkgewogICAgcmV0dXJuIHNwbGFzaEVyck9wZW5GaWxlOwogIH0KCiAgZSA9IHRoaXMtPndyaXRlUE5NRmlsZShmKTsKICAKICBmY2xvc2UoZik7CiAgcmV0dXJuIGU7Cn0KCgpTcGxhc2hFcnJvciBTcGxhc2hCaXRtYXA6OndyaXRlUE5NRmlsZShGSUxFICpmKSB7CiAgU3BsYXNoQ29sb3JQdHIgcm93LCBwOwogIGludCB4LCB5OwoKICBzd2l0Y2ggKG1vZGUpIHsKCiAgY2FzZSBzcGxhc2hNb2RlTW9ubzE6CiAgICBmcHJpbnRmKGYsICJQNFxuJWQgJWRcbiIsIHdpZHRoLCBoZWlnaHQpOwogICAgcm93ID0gZGF0YTsKICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7ICsreSkgewogICAgICBwID0gcm93OwogICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHggKz0gOCkgewoJZnB1dGMoKnAgXiAweGZmLCBmKTsKCSsrcDsKICAgICAgfQogICAgICByb3cgKz0gcm93U2l6ZTsKICAgIH0KICAgIGJyZWFrOwoKICBjYXNlIHNwbGFzaE1vZGVNb25vODoKICAgIGZwcmludGYoZiwgIlA1XG4lZCAlZFxuMjU1XG4iLCB3aWR0aCwgaGVpZ2h0KTsKICAgIHJvdyA9IGRhdGE7CiAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyArK3kpIHsKICAgICAgcCA9IHJvdzsKICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyArK3gpIHsKCWZwdXRjKCpwLCBmKTsKCSsrcDsKICAgICAgfQogICAgICByb3cgKz0gcm93U2l6ZTsKICAgIH0KICAgIGJyZWFrOwoKICBjYXNlIHNwbGFzaE1vZGVSR0I4OgogICAgZnByaW50ZihmLCAiUDZcbiVkICVkXG4yNTVcbiIsIHdpZHRoLCBoZWlnaHQpOwogICAgcm93ID0gZGF0YTsKICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7ICsreSkgewogICAgICBwID0gcm93OwogICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7ICsreCkgewoJZnB1dGMoc3BsYXNoUkdCOFIocCksIGYpOwoJZnB1dGMoc3BsYXNoUkdCOEcocCksIGYpOwoJZnB1dGMoc3BsYXNoUkdCOEIocCksIGYpOwoJcCArPSAzOwogICAgICB9CiAgICAgIHJvdyArPSByb3dTaXplOwogICAgfQogICAgYnJlYWs7CgogIGNhc2Ugc3BsYXNoTW9kZVhCR1I4OgogICAgZnByaW50ZihmLCAiUDZcbiVkICVkXG4yNTVcbiIsIHdpZHRoLCBoZWlnaHQpOwogICAgcm93ID0gZGF0YTsKICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7ICsreSkgewogICAgICBwID0gcm93OwogICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7ICsreCkgewoJZnB1dGMoc3BsYXNoQkdSOFIocCksIGYpOwoJZnB1dGMoc3BsYXNoQkdSOEcocCksIGYpOwoJZnB1dGMoc3BsYXNoQkdSOEIocCksIGYpOwoJcCArPSA0OwogICAgICB9CiAgICAgIHJvdyArPSByb3dTaXplOwogICAgfQogICAgYnJlYWs7CgoKICBjYXNlIHNwbGFzaE1vZGVCR1I4OgogICAgZnByaW50ZihmLCAiUDZcbiVkICVkXG4yNTVcbiIsIHdpZHRoLCBoZWlnaHQpOwogICAgcm93ID0gZGF0YTsKICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7ICsreSkgewogICAgICBwID0gcm93OwogICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7ICsreCkgewoJZnB1dGMoc3BsYXNoQkdSOFIocCksIGYpOwoJZnB1dGMoc3BsYXNoQkdSOEcocCksIGYpOwoJZnB1dGMoc3BsYXNoQkdSOEIocCksIGYpOwoJcCArPSAzOwogICAgICB9CiAgICAgIHJvdyArPSByb3dTaXplOwogICAgfQogICAgYnJlYWs7CgojaWYgU1BMQVNIX0NNWUsKICBjYXNlIHNwbGFzaE1vZGVDTVlLODoKICAgIC8vIFBOTSBkb2Vzbid0IHN1cHBvcnQgQ01ZSwogICAgZXJyb3IoLTEsICJ1bnN1cHBvcnRlZCBTcGxhc2hCaXRtYXAgbW9kZSIpOwogICAgcmV0dXJuIHNwbGFzaEVyckdlbmVyaWM7CiAgICBicmVhazsKI2VuZGlmCiAgfQogIHJldHVybiBzcGxhc2hPazsKfQoKCnZvaWQgU3BsYXNoQml0bWFwOjpnZXRQaXhlbChpbnQgeCwgaW50IHksIFNwbGFzaENvbG9yUHRyIHBpeGVsKSB7CiAgU3BsYXNoQ29sb3JQdHIgcDsKCiAgaWYgKHkgPCAwIHx8IHkgPj0gaGVpZ2h0IHx8IHggPCAwIHx8IHggPj0gd2lkdGgpIHsKICAgIHJldHVybjsKICB9CiAgc3dpdGNoIChtb2RlKSB7CiAgY2FzZSBzcGxhc2hNb2RlTW9ubzE6CiAgICBwID0gJmRhdGFbeSAqIHJvd1NpemUgKyAoeCA+PiAzKV07CiAgICBwaXhlbFswXSA9IChwWzBdICYgKDB4ODAgPj4gKHggJiA3KSkpID8gMHhmZiA6IDB4MDA7CiAgICBicmVhazsKICBjYXNlIHNwbGFzaE1vZGVNb25vODoKICAgIHAgPSAmZGF0YVt5ICogcm93U2l6ZSArIHhdOwogICAgcGl4ZWxbMF0gPSBwWzBdOwogICAgYnJlYWs7CiAgY2FzZSBzcGxhc2hNb2RlUkdCODoKICAgIHAgPSAmZGF0YVt5ICogcm93U2l6ZSArIDMgKiB4XTsKICAgIHBpeGVsWzBdID0gcFswXTsKICAgIHBpeGVsWzFdID0gcFsxXTsKICAgIHBpeGVsWzJdID0gcFsyXTsKICAgIGJyZWFrOwogIGNhc2Ugc3BsYXNoTW9kZVhCR1I4OgogICAgcCA9ICZkYXRhW3kgKiByb3dTaXplICsgNCAqIHhdOwogICAgcGl4ZWxbMF0gPSBwWzJdOwogICAgcGl4ZWxbMV0gPSBwWzFdOwogICAgcGl4ZWxbMl0gPSBwWzBdOwogICAgcGl4ZWxbM10gPSBwWzNdOwogICAgYnJlYWs7CiAgY2FzZSBzcGxhc2hNb2RlQkdSODoKICAgIHAgPSAmZGF0YVt5ICogcm93U2l6ZSArIDMgKiB4XTsKICAgIHBpeGVsWzBdID0gcFsyXTsKICAgIHBpeGVsWzFdID0gcFsxXTsKICAgIHBpeGVsWzJdID0gcFswXTsKICAgIGJyZWFrOwojaWYgU1BMQVNIX0NNWUsKICBjYXNlIHNwbGFzaE1vZGVDTVlLODoKICAgIHAgPSAmZGF0YVt5ICogcm93U2l6ZSArIDQgKiB4XTsKICAgIHBpeGVsWzBdID0gcFswXTsKICAgIHBpeGVsWzFdID0gcFsxXTsKICAgIHBpeGVsWzJdID0gcFsyXTsKICAgIHBpeGVsWzNdID0gcFszXTsKICAgIGJyZWFrOwojZW5kaWYKICB9Cn0KCkd1Y2hhciBTcGxhc2hCaXRtYXA6OmdldEFscGhhKGludCB4LCBpbnQgeSkgewogIHJldHVybiBhbHBoYVt5ICogd2lkdGggKyB4XTsKfQoKU3BsYXNoRXJyb3IgU3BsYXNoQml0bWFwOjp3cml0ZUltZ0ZpbGUoU3BsYXNoSW1hZ2VGaWxlRm9ybWF0IGZvcm1hdCwgY2hhciAqZmlsZU5hbWUsIGludCBoRFBJLCBpbnQgdkRQSSkgewogIEZJTEUgKmY7CiAgU3BsYXNoRXJyb3IgZTsKCiAgaWYgKCEoZiA9IGZvcGVuKGZpbGVOYW1lLCAid2IiKSkpIHsKICAgIHJldHVybiBzcGxhc2hFcnJPcGVuRmlsZTsKICB9CgogIGUgPSB3cml0ZUltZ0ZpbGUoZm9ybWF0LCBmLCBoRFBJLCB2RFBJKTsKICAKICBmY2xvc2UoZik7CiAgcmV0dXJuIGU7Cn0KClNwbGFzaEVycm9yIFNwbGFzaEJpdG1hcDo6d3JpdGVJbWdGaWxlKFNwbGFzaEltYWdlRmlsZUZvcm1hdCBmb3JtYXQsIEZJTEUgKmYsIGludCBoRFBJLCBpbnQgdkRQSSkgewogIEltZ1dyaXRlciAqd3JpdGVyOwoJU3BsYXNoRXJyb3IgZTsKICAKICBzd2l0Y2ggKGZvcm1hdCkgewogICAgI2lmZGVmIEVOQUJMRV9MSUJQTkcKICAgIGNhc2Ugc3BsYXNoRm9ybWF0UG5nOgoJICB3cml0ZXIgPSBuZXcgUE5HV3JpdGVyKCk7CiAgICAgIGJyZWFrOwogICAgI2VuZGlmCgogICAgI2lmZGVmIEVOQUJMRV9MSUJKUEVHCiAgICBjYXNlIHNwbGFzaEZvcm1hdEpwZWc6CiAgICAgIHdyaXRlciA9IG5ldyBKcGVnV3JpdGVyKCk7CiAgICAgIGJyZWFrOwogICAgI2VuZGlmCgkKICAgIGRlZmF1bHQ6CiAgICAgIC8vIE5vdCB0aGUgZ3JlYXRlc3QgZXJyb3IgbWVzc2FnZSwgYnV0IHVzZXJzIG9mIHRoaXMgZnVuY3Rpb24gc2hvdWxkCiAgICAgIC8vIGhhdmUgYWxyZWFkeSBjaGVja2VkIHdoZXRoZXIgdGhlaXIgZGVzaXJlZCBmb3JtYXQgaXMgY29tcGlsZWQgaW4uCiAgICAgIGVycm9yKC0xLCAiU3VwcG9ydCBmb3IgdGhpcyBpbWFnZSB0eXBlIG5vdCBjb21waWxlZCBpbiIpOwogICAgICByZXR1cm4gc3BsYXNoRXJyR2VuZXJpYzsKICB9CgoJZSA9IHdyaXRlSW1nRmlsZSh3cml0ZXIsIGYsIGhEUEksIHZEUEkpOwoJZGVsZXRlIHdyaXRlcjsKCXJldHVybiBlOwp9CgpTcGxhc2hFcnJvciBTcGxhc2hCaXRtYXA6OndyaXRlSW1nRmlsZShJbWdXcml0ZXIgKndyaXRlciwgRklMRSAqZiwgaW50IGhEUEksIGludCB2RFBJKSB7CiAgaWYgKG1vZGUgIT0gc3BsYXNoTW9kZVJHQjggJiYgbW9kZSAhPSBzcGxhc2hNb2RlTW9ubzggJiYgbW9kZSAhPSBzcGxhc2hNb2RlTW9ubzEgJiYgbW9kZSAhPSBzcGxhc2hNb2RlWEJHUjgpIHsKICAgIGVycm9yKC0xLCAidW5zdXBwb3J0ZWQgU3BsYXNoQml0bWFwIG1vZGUiKTsKICAgIHJldHVybiBzcGxhc2hFcnJHZW5lcmljOwogIH0KCiAgaWYgKCF3cml0ZXItPmluaXQoZiwgd2lkdGgsIGhlaWdodCwgaERQSSwgdkRQSSkpIHsKICAgIHJldHVybiBzcGxhc2hFcnJHZW5lcmljOwogIH0KCiAgc3dpdGNoIChtb2RlKSB7CiAgICBjYXNlIHNwbGFzaE1vZGVSR0I4OgogICAgewogICAgICBTcGxhc2hDb2xvclB0ciByb3c7CiAgICAgIHVuc2lnbmVkIGNoYXIgKipyb3dfcG9pbnRlcnMgPSBuZXcgdW5zaWduZWQgY2hhcipbaGVpZ2h0XTsKICAgICAgcm93ID0gZGF0YTsKCiAgICAgIGZvciAoaW50IHkgPSAwOyB5IDwgaGVpZ2h0OyArK3kpIHsKICAgICAgICByb3dfcG9pbnRlcnNbeV0gPSByb3c7CiAgICAgICAgcm93ICs9IHJvd1NpemU7CiAgICAgIH0KICAgICAgaWYgKCF3cml0ZXItPndyaXRlUG9pbnRlcnMocm93X3BvaW50ZXJzLCBoZWlnaHQpKSB7CiAgICAgICAgZGVsZXRlW10gcm93X3BvaW50ZXJzOwogICAgICAgIHJldHVybiBzcGxhc2hFcnJHZW5lcmljOwogICAgICB9CiAgICAgIGRlbGV0ZVtdIHJvd19wb2ludGVyczsKICAgIH0KICAgIGJyZWFrOwogICAgCiAgICBjYXNlIHNwbGFzaE1vZGVYQkdSODoKICAgIHsKICAgICAgdW5zaWduZWQgY2hhciAqcm93ID0gbmV3IHVuc2lnbmVkIGNoYXJbMyAqIHdpZHRoXTsKICAgICAgZm9yIChpbnQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgewogICAgICAgIC8vIENvbnZlcnQgaW50byBhIFBORyByb3cKICAgICAgICBmb3IgKGludCB4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKICAgICAgICAgIHJvd1szKnhdID0gZGF0YVt5ICogcm93U2l6ZSArIHggKiA0ICsgMl07CiAgICAgICAgICByb3dbMyp4KzFdID0gZGF0YVt5ICogcm93U2l6ZSArIHggKiA0ICsgMV07CiAgICAgICAgICByb3dbMyp4KzJdID0gZGF0YVt5ICogcm93U2l6ZSArIHggKiA0XTsKICAgICAgICB9CgogICAgICAgIGlmICghd3JpdGVyLT53cml0ZVJvdygmcm93KSkgewogICAgICAgICAgZGVsZXRlW10gcm93OwogICAgICAgICAgcmV0dXJuIHNwbGFzaEVyckdlbmVyaWM7CiAgICAgICAgfQogICAgICB9CiAgICAgIGRlbGV0ZVtdIHJvdzsKICAgIH0KICAgIGJyZWFrOwogICAgCiAgICBjYXNlIHNwbGFzaE1vZGVNb25vODoKICAgIHsKICAgICAgdW5zaWduZWQgY2hhciAqcm93ID0gbmV3IHVuc2lnbmVkIGNoYXJbMyAqIHdpZHRoXTsKICAgICAgZm9yIChpbnQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgewogICAgICAgIC8vIENvbnZlcnQgaW50byBhIFBORyByb3cKICAgICAgICBmb3IgKGludCB4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKICAgICAgICAgIHJvd1szKnhdID0gZGF0YVt5ICogcm93U2l6ZSArIHhdOwogICAgICAgICAgcm93WzMqeCsxXSA9IGRhdGFbeSAqIHJvd1NpemUgKyB4XTsKICAgICAgICAgIHJvd1szKngrMl0gPSBkYXRhW3kgKiByb3dTaXplICsgeF07CiAgICAgICAgfQoKICAgICAgICBpZiAoIXdyaXRlci0+d3JpdGVSb3coJnJvdykpIHsKICAgICAgICAgIGRlbGV0ZVtdIHJvdzsKICAgICAgICAgIHJldHVybiBzcGxhc2hFcnJHZW5lcmljOwogICAgICAgIH0KICAgICAgfQogICAgICBkZWxldGVbXSByb3c7CiAgICB9CiAgICBicmVhazsKICAgIAogICAgY2FzZSBzcGxhc2hNb2RlTW9ubzE6CiAgICB7CiAgICAgIHVuc2lnbmVkIGNoYXIgKnJvdyA9IG5ldyB1bnNpZ25lZCBjaGFyWzMgKiB3aWR0aF07CiAgICAgIGZvciAoaW50IHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKICAgICAgICAvLyBDb252ZXJ0IGludG8gYSBQTkcgcm93CiAgICAgICAgZm9yIChpbnQgeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CiAgICAgICAgICBnZXRQaXhlbCh4LCB5LCAmcm93WzMqeF0pOwogICAgICAgICAgcm93WzMqeCsxXSA9IHJvd1szKnhdOwogICAgICAgICAgcm93WzMqeCsyXSA9IHJvd1szKnhdOwogICAgICAgIH0KCiAgICAgICAgaWYgKCF3cml0ZXItPndyaXRlUm93KCZyb3cpKSB7CiAgICAgICAgICBkZWxldGVbXSByb3c7CiAgICAgICAgICByZXR1cm4gc3BsYXNoRXJyR2VuZXJpYzsKICAgICAgICB9CiAgICAgIH0KICAgICAgZGVsZXRlW10gcm93OwogICAgfQogICAgYnJlYWs7CiAgICAKICAgIGRlZmF1bHQ6CiAgICAvLyBjYW4ndCBoYXBwZW4KICAgIGJyZWFrOwogIH0KICAKICBpZiAod3JpdGVyLT5jbG9zZSgpKSB7CiAgICByZXR1cm4gc3BsYXNoRXJyR2VuZXJpYzsKICB9CgogIHJldHVybiBzcGxhc2hPazsKfQo=