Ly8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCgojaW5jbHVkZSAiUHVibGljTWV0aG9kcy5oIgoKI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvZnNka19tZ3IuaCIgIC8vIEZvciBDUERGRG9jX0Vudmlyb25tZW50LgojaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L0lKYXZhU2NyaXB0LmgiCiNpbmNsdWRlICJGaWVsZC5oIgojaW5jbHVkZSAiSlNfQ29udGV4dC5oIgojaW5jbHVkZSAiSlNfRGVmaW5lLmgiCiNpbmNsdWRlICJKU19FdmVudEhhbmRsZXIuaCIKI2luY2x1ZGUgIkpTX09iamVjdC5oIgojaW5jbHVkZSAiSlNfUnVudGltZS5oIgojaW5jbHVkZSAiSlNfVmFsdWUuaCIKI2luY2x1ZGUgImNvbG9yLmgiCiNpbmNsdWRlICJyZXNvdXJjZS5oIgojaW5jbHVkZSAidXRpbC5oIgoKc3RhdGljIHY4OjpJc29sYXRlKiBHZXRJc29sYXRlKElGWEpTX0NvbnRleHQqIGNjKSB7CiAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKICBBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CgogIENKU19SdW50aW1lKiBwUnVudGltZSA9IHBDb250ZXh0LT5HZXRKU1J1bnRpbWUoKTsKICBBU1NFUlQocFJ1bnRpbWUgIT0gTlVMTCk7CgogIHJldHVybiBwUnVudGltZS0+R2V0SXNvbGF0ZSgpOwp9CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDSlNfUHVibGljTWV0aG9kcwogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKI2RlZmluZSBET1VCTEVfQ09SUkVDVCAwLjAwMDAwMDAwMDAwMDAwMQoKQkVHSU5fSlNfU1RBVElDX0dMT0JBTF9GVU4oQ0pTX1B1YmxpY01ldGhvZHMpCkpTX1NUQVRJQ19HTE9CQUxfRlVOX0VOVFJZKEFGTnVtYmVyX0Zvcm1hdCkKSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZOdW1iZXJfS2V5c3Ryb2tlKQpKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRlBlcmNlbnRfRm9ybWF0KQpKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRlBlcmNlbnRfS2V5c3Ryb2tlKQpKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRkRhdGVfRm9ybWF0RXgpCkpTX1NUQVRJQ19HTE9CQUxfRlVOX0VOVFJZKEFGRGF0ZV9LZXlzdHJva2VFeCkKSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZEYXRlX0Zvcm1hdCkKSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZEYXRlX0tleXN0cm9rZSkKSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZUaW1lX0Zvcm1hdEV4KQpKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRlRpbWVfS2V5c3Ryb2tlRXgpCkpTX1NUQVRJQ19HTE9CQUxfRlVOX0VOVFJZKEFGVGltZV9Gb3JtYXQpCkpTX1NUQVRJQ19HTE9CQUxfRlVOX0VOVFJZKEFGVGltZV9LZXlzdHJva2UpCkpTX1NUQVRJQ19HTE9CQUxfRlVOX0VOVFJZKEFGU3BlY2lhbF9Gb3JtYXQpCkpTX1NUQVRJQ19HTE9CQUxfRlVOX0VOVFJZKEFGU3BlY2lhbF9LZXlzdHJva2UpCkpTX1NUQVRJQ19HTE9CQUxfRlVOX0VOVFJZKEFGU3BlY2lhbF9LZXlzdHJva2VFeCkKSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZTaW1wbGUpCkpTX1NUQVRJQ19HTE9CQUxfRlVOX0VOVFJZKEFGTWFrZU51bWJlcikKSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZTaW1wbGVfQ2FsY3VsYXRlKQpKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRlJhbmdlX1ZhbGlkYXRlKQpKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRk1lcmdlQ2hhbmdlKQpKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRlBhcnNlRGF0ZUV4KQpKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRkV4dHJhY3ROdW1zKQpFTkRfSlNfU1RBVElDX0dMT0JBTF9GVU4oKQoKSU1QTEVNRU5UX0pTX1NUQVRJQ19HTE9CQUxfRlVOKENKU19QdWJsaWNNZXRob2RzKQoKc3RhdGljIGNvbnN0IEZYX1dDSEFSKiBtb250aHNbXSA9IHtMIkphbiIsIEwiRmViIiwgTCJNYXIiLCBMIkFwciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJNYXkiLCBMIkp1biIsIEwiSnVsIiwgTCJBdWciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwiU2VwIiwgTCJPY3QiLCBMIk5vdiIsIEwiRGVjIn07CgpzdGF0aWMgY29uc3QgRlhfV0NIQVIqIGZ1bGxtb250aHNbXSA9IHtMIkphbnVhcnkiLCBMIkZlYnJ1YXJ5IiwgTCJNYXJjaCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwiQXByaWwiLCAgIEwiTWF5IiwgICAgICBMIkp1bmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMIkp1bHkiLCAgICBMIkF1Z3VzdCIsICAgTCJTZXB0ZW1iZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMIk9jdG9iZXIiLCBMIk5vdmVtYmVyIiwgTCJEZWNlbWJlciJ9OwoKRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6SXNOdW1iZXIoY29uc3QgRlhfV0NIQVIqIHN0cmluZykgewogIENGWF9XaWRlU3RyaW5nIHNUcmltID0gU3RyVHJpbShzdHJpbmcpOwogIGNvbnN0IEZYX1dDSEFSKiBwVHJpbSA9IHNUcmltLmNfc3RyKCk7CiAgY29uc3QgRlhfV0NIQVIqIHAgPSBwVHJpbTsKCiAgRlhfQk9PTCBiRG90ID0gRkFMU0U7CiAgRlhfQk9PTCBiS1hKUyA9IEZBTFNFOwoKICB3Y2hhcl90IGM7CiAgd2hpbGUgKChjID0gKnApKSB7CiAgICBpZiAoYyA9PSAnLicgfHwgYyA9PSAnLCcpIHsKICAgICAgaWYgKGJEb3QpCiAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICBiRG90ID0gVFJVRTsKICAgIH0gZWxzZSBpZiAoYyA9PSAnLScgfHwgYyA9PSAnKycpIHsKICAgICAgaWYgKHAgIT0gcFRyaW0pCiAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgfSBlbHNlIGlmIChjID09ICdlJyB8fCBjID09ICdFJykgewogICAgICBpZiAoYktYSlMpCiAgICAgICAgcmV0dXJuIEZBTFNFOwoKICAgICAgcCsrOwogICAgICBjID0gKnA7CiAgICAgIGlmIChjID09ICcrJyB8fCBjID09ICctJykgewogICAgICAgIGJLWEpTID0gVFJVRTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoIUlzRGlnaXQoYykpIHsKICAgICAgcmV0dXJuIEZBTFNFOwogICAgfQogICAgcCsrOwogIH0KCiAgcmV0dXJuIFRSVUU7Cn0KCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OklzRGlnaXQod2NoYXJfdCBjaCkgewogIHJldHVybiAoY2ggPj0gTCcwJyAmJiBjaCA8PSBMJzknKTsKfQoKRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6SXNEaWdpdChjaGFyIGNoKSB7CiAgcmV0dXJuIChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKTsKfQoKRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6SXNBbHBoYWJldGljKHdjaGFyX3QgY2gpIHsKICByZXR1cm4gKChjaCA+PSBMJ2EnICYmIGNoIDw9IEwneicpIHx8IChjaCA+PSBMJ0EnICYmIGNoIDw9IEwnWicpKTsKfQoKRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6SXNBbHBoYU51bWVyaWMod2NoYXJfdCBjaCkgewogIHJldHVybiAoSXNEaWdpdChjaCkgfHwgSXNBbHBoYWJldGljKGNoKSk7Cn0KCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6Om1hc2tTYXRpc2ZpZWQod2NoYXJfdCBjX0NoYW5nZSwgd2NoYXJfdCBjX01hc2spIHsKICBzd2l0Y2ggKGNfTWFzaykgewogICAgY2FzZSBMJzknOgogICAgICByZXR1cm4gSXNEaWdpdChjX0NoYW5nZSk7CiAgICBjYXNlIEwnQSc6CiAgICAgIHJldHVybiBJc0FscGhhYmV0aWMoY19DaGFuZ2UpOwogICAgY2FzZSBMJ08nOgogICAgICByZXR1cm4gSXNBbHBoYU51bWVyaWMoY19DaGFuZ2UpOwogICAgY2FzZSBMJ1gnOgogICAgICByZXR1cm4gVFJVRTsKICAgIGRlZmF1bHQ6CiAgICAgIHJldHVybiAoY19DaGFuZ2UgPT0gY19NYXNrKTsKICB9Cn0KCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OmlzUmVzZXJ2ZWRNYXNrQ2hhcih3Y2hhcl90IGNoKSB7CiAgcmV0dXJuIGNoID09IEwnOScgfHwgY2ggPT0gTCdBJyB8fCBjaCA9PSBMJ08nIHx8IGNoID09IEwnWCc7Cn0KCmRvdWJsZSBDSlNfUHVibGljTWV0aG9kczo6QUZfU2ltcGxlKGNvbnN0IEZYX1dDSEFSKiBzRnVjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGRWYWx1ZTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBkVmFsdWUyKSB7CiAgaWYgKEZYU1lTX3djc2ljbXAoc0Z1Y3Rpb24sIEwiQVZHIikgPT0gMCB8fAogICAgICBGWFNZU193Y3NpY21wKHNGdWN0aW9uLCBMIlNVTSIpID09IDApIHsKICAgIHJldHVybiBkVmFsdWUxICsgZFZhbHVlMjsKICB9CiAgaWYgKEZYU1lTX3djc2ljbXAoc0Z1Y3Rpb24sIEwiUFJEIikgPT0gMCkgewogICAgcmV0dXJuIGRWYWx1ZTEgKiBkVmFsdWUyOwogIH0KICBpZiAoRlhTWVNfd2NzaWNtcChzRnVjdGlvbiwgTCJNSU4iKSA9PSAwKSB7CiAgICByZXR1cm4gRlhfTUlOKGRWYWx1ZTEsIGRWYWx1ZTIpOwogIH0KICBpZiAoRlhTWVNfd2NzaWNtcChzRnVjdGlvbiwgTCJNQVgiKSA9PSAwKSB7CiAgICByZXR1cm4gRlhfTUFYKGRWYWx1ZTEsIGRWYWx1ZTIpOwogIH0KICByZXR1cm4gZFZhbHVlMTsKfQoKQ0ZYX1dpZGVTdHJpbmcgQ0pTX1B1YmxpY01ldGhvZHM6OlN0ckxUcmltKGNvbnN0IEZYX1dDSEFSKiBwU3RyKSB7CiAgd2hpbGUgKCpwU3RyICYmICpwU3RyID09IEwnICcpCiAgICBwU3RyKys7CgogIHJldHVybiBwU3RyOwp9CgpDRlhfV2lkZVN0cmluZyBDSlNfUHVibGljTWV0aG9kczo6U3RyUlRyaW0oY29uc3QgRlhfV0NIQVIqIHBTdHIpIHsKICBjb25zdCBGWF9XQ0hBUiogcCA9IHBTdHI7CiAgd2hpbGUgKCpwKQogICAgcCsrOwogIHdoaWxlIChwID4gcFN0ciAmJiAqKHAgLSAxKSA9PSBMJyAnKQogICAgcC0tOwoKICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmcocFN0ciwgcCAtIHBTdHIpOwp9CgpDRlhfV2lkZVN0cmluZyBDSlNfUHVibGljTWV0aG9kczo6U3RyVHJpbShjb25zdCBGWF9XQ0hBUiogcFN0cikgewogIHJldHVybiBTdHJSVHJpbShTdHJMVHJpbShwU3RyKS5jX3N0cigpKTsKfQoKQ0ZYX0J5dGVTdHJpbmcgQ0pTX1B1YmxpY01ldGhvZHM6OlN0ckxUcmltKGNvbnN0IEZYX0NIQVIqIHBTdHIpIHsKICB3aGlsZSAoKnBTdHIgJiYgKnBTdHIgPT0gJyAnKQogICAgcFN0cisrOwoKICByZXR1cm4gcFN0cjsKfQoKQ0ZYX0J5dGVTdHJpbmcgQ0pTX1B1YmxpY01ldGhvZHM6OlN0clJUcmltKGNvbnN0IEZYX0NIQVIqIHBTdHIpIHsKICBjb25zdCBGWF9DSEFSKiBwID0gcFN0cjsKICB3aGlsZSAoKnApCiAgICBwKys7CiAgd2hpbGUgKHAgPiBwU3RyICYmICoocCAtIDEpID09IEwnICcpCiAgICBwLS07CgogIHJldHVybiBDRlhfQnl0ZVN0cmluZyhwU3RyLCBwIC0gcFN0cik7Cn0KCkNGWF9CeXRlU3RyaW5nIENKU19QdWJsaWNNZXRob2RzOjpTdHJUcmltKGNvbnN0IEZYX0NIQVIqIHBTdHIpIHsKICByZXR1cm4gU3RyUlRyaW0oU3RyTFRyaW0ocFN0cikpOwp9Cgpkb3VibGUgQ0pTX1B1YmxpY01ldGhvZHM6OlBhcnNlTnVtYmVyKGNvbnN0IEZYX1dDSEFSKiBzd1NvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MJiBiQWxsRGlnaXRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wmIGJEb3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCYgYlNpZ24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQk9PTCYgYktYSlMpIHsKICBiRG90ID0gRkFMU0U7CiAgYlNpZ24gPSBGQUxTRTsKICBiS1hKUyA9IEZBTFNFOwoKICBGWF9CT09MIGJEaWdpdEV4aXN0ID0gRkFMU0U7CgogIGNvbnN0IEZYX1dDSEFSKiBwID0gc3dTb3VyY2U7CiAgd2NoYXJfdCBjOwoKICBjb25zdCBGWF9XQ0hBUiogcFN0YXJ0ID0gTlVMTDsKICBjb25zdCBGWF9XQ0hBUiogcEVuZCA9IE5VTEw7CgogIHdoaWxlICgoYyA9ICpwKSkgewogICAgaWYgKCFwU3RhcnQgJiYgYyAhPSBMJyAnKSB7CiAgICAgIHBTdGFydCA9IHA7CiAgICB9CgogICAgcEVuZCA9IHA7CiAgICBwKys7CiAgfQoKICBpZiAoIXBTdGFydCkgewogICAgYkFsbERpZ2l0cyA9IEZBTFNFOwogICAgcmV0dXJuIDA7CiAgfQoKICB3aGlsZSAocEVuZCAhPSBwU3RhcnQpIHsKICAgIGlmICgqcEVuZCA9PSBMJyAnKQogICAgICBwRW5kLS07CiAgICBlbHNlCiAgICAgIGJyZWFrOwogIH0KCiAgZG91YmxlIGRSZXQgPSAwOwogIHAgPSBwU3RhcnQ7CiAgYkFsbERpZ2l0cyA9IFRSVUU7CiAgQ0ZYX1dpZGVTdHJpbmcgc3dEaWdpdHM7CgogIHdoaWxlIChwIDw9IHBFbmQpIHsKICAgIGMgPSAqcDsKCiAgICBpZiAoSXNEaWdpdChjKSkgewogICAgICBzd0RpZ2l0cyArPSBjOwogICAgICBiRGlnaXRFeGlzdCA9IFRSVUU7CiAgICB9IGVsc2UgewogICAgICBzd2l0Y2ggKGMpIHsKICAgICAgICBjYXNlIEwnICc6CiAgICAgICAgICBiQWxsRGlnaXRzID0gRkFMU0U7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIEwnLic6CiAgICAgICAgY2FzZSBMJywnOgogICAgICAgICAgaWYgKCFiRG90KSB7CiAgICAgICAgICAgIGlmIChiRGlnaXRFeGlzdCkgewogICAgICAgICAgICAgIHN3RGlnaXRzICs9IEwnLic7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgc3dEaWdpdHMgKz0gTCcwJzsKICAgICAgICAgICAgICBzd0RpZ2l0cyArPSBMJy4nOwogICAgICAgICAgICAgIGJEaWdpdEV4aXN0ID0gVFJVRTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgYkRvdCA9IFRSVUU7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIGNhc2UgJ2UnOgogICAgICAgIGNhc2UgJ0UnOgogICAgICAgICAgaWYgKCFiS1hKUykgewogICAgICAgICAgICBwKys7CiAgICAgICAgICAgIGMgPSAqcDsKICAgICAgICAgICAgaWYgKGMgPT0gJysnIHx8IGMgPT0gJy0nKSB7CiAgICAgICAgICAgICAgYktYSlMgPSBUUlVFOwogICAgICAgICAgICAgIHN3RGlnaXRzICs9ICdlJzsKICAgICAgICAgICAgICBzd0RpZ2l0cyArPSBjOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIGNhc2UgTCctJzoKICAgICAgICAgIGlmICghYkRpZ2l0RXhpc3QgJiYgIWJTaWduKSB7CiAgICAgICAgICAgIHN3RGlnaXRzICs9IGM7CiAgICAgICAgICAgIGJTaWduID0gVFJVRTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgIGJBbGxEaWdpdHMgPSBGQUxTRTsKCiAgICAgICAgICBpZiAocCAhPSBwU3RhcnQgJiYgIWJEb3QgJiYgYkRpZ2l0RXhpc3QpIHsKICAgICAgICAgICAgc3dEaWdpdHMgKz0gTCcuJzsKICAgICAgICAgICAgYkRvdCA9IFRSVUU7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBiRG90ID0gRkFMU0U7CiAgICAgICAgICAgIGJEaWdpdEV4aXN0ID0gRkFMU0U7CiAgICAgICAgICAgIHN3RGlnaXRzID0gTCIiOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KCiAgICBwKys7CiAgfQoKICBpZiAoc3dEaWdpdHMuR2V0TGVuZ3RoKCkgPiAwICYmIHN3RGlnaXRzLkdldExlbmd0aCgpIDwgMTcpIHsKICAgIENGWF9CeXRlU3RyaW5nIHNEaWdpdHMgPSBzd0RpZ2l0cy5VVEY4RW5jb2RlKCk7CgogICAgaWYgKGJLWEpTKSB7CiAgICAgIGRSZXQgPSBhdG9mKHNEaWdpdHMpOwogICAgfSBlbHNlIHsKICAgICAgaWYgKGJEb3QpIHsKICAgICAgICBjaGFyKiBwU3RvcFN0cmluZzsKICAgICAgICBkUmV0ID0gOjpzdHJ0b2Qoc0RpZ2l0cywgJnBTdG9wU3RyaW5nKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBkUmV0ID0gYXRvbChzRGlnaXRzKTsKICAgICAgfQogICAgfQogIH0KCiAgcmV0dXJuIGRSZXQ7Cn0KCmRvdWJsZSBDSlNfUHVibGljTWV0aG9kczo6UGFyc2VTdHJpbmdUb051bWJlcihjb25zdCBGWF9XQ0hBUiogc3dTb3VyY2UpIHsKICBGWF9CT09MIGJBbGxEaWdpdHMgPSBGQUxTRTsKICBGWF9CT09MIGJEb3QgPSBGQUxTRTsKICBGWF9CT09MIGJTaWduID0gRkFMU0U7CiAgRlhfQk9PTCBiS1hKUyA9IEZBTFNFOwoKICByZXR1cm4gUGFyc2VOdW1iZXIoc3dTb3VyY2UsIGJBbGxEaWdpdHMsIGJEb3QsIGJTaWduLCBiS1hKUyk7Cn0KCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkNvbnZlcnRTdHJpbmdUb051bWJlcihjb25zdCBGWF9XQ0hBUiogc3dTb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUmIGRSZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MJiBiRG90KSB7CiAgRlhfQk9PTCBiQWxsRGlnaXRzID0gRkFMU0U7CiAgRlhfQk9PTCBiU2lnbiA9IEZBTFNFOwogIEZYX0JPT0wgYktYSlMgPSBGQUxTRTsKCiAgZFJldCA9IFBhcnNlTnVtYmVyKHN3U291cmNlLCBiQWxsRGlnaXRzLCBiRG90LCBiU2lnbiwgYktYSlMpOwoKICByZXR1cm4gYkFsbERpZ2l0czsKfQoKQ0pTX0FycmF5IENKU19QdWJsaWNNZXRob2RzOjpBRl9NYWtlQXJyYXlGcm9tTGlzdCh2ODo6SXNvbGF0ZSogaXNvbGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUgdmFsKSB7CiAgQ0pTX0FycmF5IFN0ckFycmF5KGlzb2xhdGUpOwogIGlmICh2YWwuSXNBcnJheU9iamVjdCgpKSB7CiAgICB2YWwuQ29udmVydFRvQXJyYXkoU3RyQXJyYXkpOwogICAgcmV0dXJuIFN0ckFycmF5OwogIH0KICBDRlhfV2lkZVN0cmluZyB3c1N0ciA9IHZhbC5Ub0NGWFdpZGVTdHJpbmcoKTsKICBDRlhfQnl0ZVN0cmluZyB0ID0gQ0ZYX0J5dGVTdHJpbmc6OkZyb21Vbmljb2RlKHdzU3RyKTsKICBjb25zdCBjaGFyKiBwID0gKGNvbnN0IGNoYXIqKXQ7CgogIGludCBjaCA9ICcsJzsKICBpbnQgbkluZGV4ID0gMDsKCiAgd2hpbGUgKCpwKSB7CiAgICBjb25zdCBjaGFyKiBwVGVtcCA9IHN0cmNocihwLCBjaCk7CiAgICBpZiAocFRlbXAgPT0gTlVMTCkgewogICAgICBTdHJBcnJheS5TZXRFbGVtZW50KG5JbmRleCwgQ0pTX1ZhbHVlKGlzb2xhdGUsIFN0clRyaW0ocCkuY19zdHIoKSkpOwogICAgICBicmVhazsKICAgIH0gZWxzZSB7CiAgICAgIGNoYXIqIHBTdWIgPSBuZXcgY2hhcltwVGVtcCAtIHAgKyAxXTsKICAgICAgc3RybmNweShwU3ViLCBwLCBwVGVtcCAtIHApOwogICAgICAqKHBTdWIgKyAocFRlbXAgLSBwKSkgPSAnXDAnOwoKICAgICAgU3RyQXJyYXkuU2V0RWxlbWVudChuSW5kZXgsIENKU19WYWx1ZShpc29sYXRlLCBTdHJUcmltKHBTdWIpLmNfc3RyKCkpKTsKICAgICAgZGVsZXRlW10gcFN1YjsKCiAgICAgIG5JbmRleCsrOwogICAgICBwID0gKytwVGVtcDsKICAgIH0KICB9CiAgcmV0dXJuIFN0ckFycmF5Owp9CgppbnQgQ0pTX1B1YmxpY01ldGhvZHM6OlBhcnNlU3RyaW5nSW50ZWdlcihjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyaW5nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgblN0YXJ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIG5Ta2lwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbk1heFN0ZXApIHsKICBpbnQgblJldCA9IDA7CiAgblNraXAgPSAwOwogIGZvciAoaW50IGkgPSBuU3RhcnQsIHN6ID0gc3RyaW5nLkdldExlbmd0aCgpOyBpIDwgc3o7IGkrKykgewogICAgaWYgKGkgLSBuU3RhcnQgPiAxMCkKICAgICAgYnJlYWs7CgogICAgRlhfV0NIQVIgYyA9IHN0cmluZy5HZXRBdChpKTsKICAgIGlmIChJc0RpZ2l0KCh3Y2hhcl90KWMpKSB7CiAgICAgIG5SZXQgPSBuUmV0ICogMTAgKyAoYyAtICcwJyk7CiAgICAgIG5Ta2lwID0gaSAtIG5TdGFydCArIDE7CiAgICAgIGlmIChuU2tpcCA+PSBuTWF4U3RlcCkKICAgICAgICBicmVhazsKICAgIH0gZWxzZQogICAgICBicmVhazsKICB9CgogIHJldHVybiBuUmV0Owp9CgpDRlhfV2lkZVN0cmluZyBDSlNfUHVibGljTWV0aG9kczo6UGFyc2VTdHJpbmdTdHJpbmcoCiAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyaW5nLAogICAgaW50IG5TdGFydCwKICAgIGludCYgblNraXApIHsKICBDRlhfV2lkZVN0cmluZyBzd1JldDsKICBuU2tpcCA9IDA7CiAgZm9yIChpbnQgaSA9IG5TdGFydCwgc3ogPSBzdHJpbmcuR2V0TGVuZ3RoKCk7IGkgPCBzejsgaSsrKSB7CiAgICBGWF9XQ0hBUiBjID0gc3RyaW5nLkdldEF0KGkpOwogICAgaWYgKChjID49IEwnYScgJiYgYyA8PSBMJ3onKSB8fCAoYyA+PSBMJ0EnICYmIGMgPD0gTCdaJykpIHsKICAgICAgc3dSZXQgKz0gYzsKICAgICAgblNraXAgPSBpIC0gblN0YXJ0ICsgMTsKICAgIH0gZWxzZQogICAgICBicmVhazsKICB9CgogIHJldHVybiBzd1JldDsKfQoKZG91YmxlIENKU19QdWJsaWNNZXRob2RzOjpQYXJzZU5vcm1hbERhdGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MJiBiV3JvbmdGb3JtYXQpIHsKICBkb3VibGUgZHQgPSBKU19HZXREYXRlVGltZSgpOwoKICBpbnQgblllYXIgPSBKU19HZXRZZWFyRnJvbVRpbWUoZHQpOwogIGludCBuTW9udGggPSBKU19HZXRNb250aEZyb21UaW1lKGR0KSArIDE7CiAgaW50IG5EYXkgPSBKU19HZXREYXlGcm9tVGltZShkdCk7CiAgaW50IG5Ib3VyID0gSlNfR2V0SG91ckZyb21UaW1lKGR0KTsKICBpbnQgbk1pbiA9IEpTX0dldE1pbkZyb21UaW1lKGR0KTsKICBpbnQgblNlYyA9IEpTX0dldFNlY0Zyb21UaW1lKGR0KTsKCiAgaW50IG51bWJlclszXTsKCiAgaW50IG5Ta2lwID0gMDsKICBpbnQgbkxlbiA9IHZhbHVlLkdldExlbmd0aCgpOwogIGludCBuSW5kZXggPSAwOwogIGludCBpID0gMDsKICB3aGlsZSAoaSA8IG5MZW4pIHsKICAgIGlmIChuSW5kZXggPiAyKQogICAgICBicmVhazsKCiAgICBGWF9XQ0hBUiBjID0gdmFsdWUuR2V0QXQoaSk7CiAgICBpZiAoSXNEaWdpdCgod2NoYXJfdCljKSkgewogICAgICBudW1iZXJbbkluZGV4KytdID0gUGFyc2VTdHJpbmdJbnRlZ2VyKHZhbHVlLCBpLCBuU2tpcCwgNCk7CiAgICAgIGkgKz0gblNraXA7CiAgICB9IGVsc2UgewogICAgICBpKys7CiAgICB9CiAgfQoKICBpZiAobkluZGV4ID09IDIpIHsKICAgIC8vIGNhc2UyOiBtb250aC9kYXkKICAgIC8vIGNhc2UzOiBkYXkvbW9udGgKICAgIGlmICgobnVtYmVyWzBdID49IDEgJiYgbnVtYmVyWzBdIDw9IDEyKSAmJgogICAgICAgIChudW1iZXJbMV0gPj0gMSAmJiBudW1iZXJbMV0gPD0gMzEpKSB7CiAgICAgIG5Nb250aCA9IG51bWJlclswXTsKICAgICAgbkRheSA9IG51bWJlclsxXTsKICAgIH0gZWxzZSBpZiAoKG51bWJlclswXSA+PSAxICYmIG51bWJlclswXSA8PSAzMSkgJiYKICAgICAgICAgICAgICAgKG51bWJlclsxXSA+PSAxICYmIG51bWJlclsxXSA8PSAxMikpIHsKICAgICAgbkRheSA9IG51bWJlclswXTsKICAgICAgbk1vbnRoID0gbnVtYmVyWzFdOwogICAgfQoKICAgIGJXcm9uZ0Zvcm1hdCA9IEZBTFNFOwogIH0gZWxzZSBpZiAobkluZGV4ID09IDMpIHsKICAgIC8vIGNhc2UxOiB5ZWFyL21vbnRoL2RheQogICAgLy8gY2FzZTI6IG1vbnRoL2RheS95ZWFyCiAgICAvLyBjYXNlMzogZGF5L21vbnRoL3llYXIKCiAgICBpZiAobnVtYmVyWzBdID4gMTIgJiYgKG51bWJlclsxXSA+PSAxICYmIG51bWJlclsxXSA8PSAxMikgJiYKICAgICAgICAobnVtYmVyWzJdID49IDEgJiYgbnVtYmVyWzJdIDw9IDMxKSkgewogICAgICBuWWVhciA9IG51bWJlclswXTsKICAgICAgbk1vbnRoID0gbnVtYmVyWzFdOwogICAgICBuRGF5ID0gbnVtYmVyWzJdOwogICAgfSBlbHNlIGlmICgobnVtYmVyWzBdID49IDEgJiYgbnVtYmVyWzBdIDw9IDEyKSAmJgogICAgICAgICAgICAgICAobnVtYmVyWzFdID49IDEgJiYgbnVtYmVyWzFdIDw9IDMxKSAmJiBudW1iZXJbMl0gPiAzMSkgewogICAgICBuTW9udGggPSBudW1iZXJbMF07CiAgICAgIG5EYXkgPSBudW1iZXJbMV07CiAgICAgIG5ZZWFyID0gbnVtYmVyWzJdOwogICAgfSBlbHNlIGlmICgobnVtYmVyWzBdID49IDEgJiYgbnVtYmVyWzBdIDw9IDMxKSAmJgogICAgICAgICAgICAgICAobnVtYmVyWzFdID49IDEgJiYgbnVtYmVyWzFdIDw9IDEyKSAmJiBudW1iZXJbMl0gPiAzMSkgewogICAgICBuRGF5ID0gbnVtYmVyWzBdOwogICAgICBuTW9udGggPSBudW1iZXJbMV07CiAgICAgIG5ZZWFyID0gbnVtYmVyWzJdOwogICAgfQoKICAgIGJXcm9uZ0Zvcm1hdCA9IEZBTFNFOwogIH0gZWxzZSB7CiAgICBiV3JvbmdGb3JtYXQgPSBUUlVFOwogICAgcmV0dXJuIGR0OwogIH0KCiAgQ0ZYX1dpZGVTdHJpbmcgc3dUZW1wOwogIHN3VGVtcC5Gb3JtYXQoTCIlZC8lZC8lZCAlZDolZDolZCIsIG5Nb250aCwgbkRheSwgblllYXIsIG5Ib3VyLCBuTWluLCBuU2VjKTsKICByZXR1cm4gSlNfRGF0ZVBhcnNlKHN3VGVtcC5jX3N0cigpKTsKfQoKZG91YmxlIENKU19QdWJsaWNNZXRob2RzOjpNYWtlUmVndWxhckRhdGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CT09MJiBiV3JvbmdGb3JtYXQpIHsKICBkb3VibGUgZHQgPSBKU19HZXREYXRlVGltZSgpOwoKICBpZiAoZm9ybWF0LklzRW1wdHkoKSB8fCB2YWx1ZS5Jc0VtcHR5KCkpCiAgICByZXR1cm4gZHQ7CgogIGludCBuWWVhciA9IEpTX0dldFllYXJGcm9tVGltZShkdCk7CiAgaW50IG5Nb250aCA9IEpTX0dldE1vbnRoRnJvbVRpbWUoZHQpICsgMTsKICBpbnQgbkRheSA9IEpTX0dldERheUZyb21UaW1lKGR0KTsKICBpbnQgbkhvdXIgPSBKU19HZXRIb3VyRnJvbVRpbWUoZHQpOwogIGludCBuTWluID0gSlNfR2V0TWluRnJvbVRpbWUoZHQpOwogIGludCBuU2VjID0gSlNfR2V0U2VjRnJvbVRpbWUoZHQpOwoKICBpbnQgblllYXJTdWIgPSA5OTsgIC8vIG5ZZWFyIC0gMjAwMDsKCiAgRlhfQk9PTCBiUG0gPSBGQUxTRTsKICBGWF9CT09MIGJFeGl0ID0gRkFMU0U7CiAgYldyb25nRm9ybWF0ID0gRkFMU0U7CgogIGludCBpID0gMDsKICBpbnQgaiA9IDA7CgogIHdoaWxlIChpIDwgZm9ybWF0LkdldExlbmd0aCgpKSB7CiAgICBpZiAoYkV4aXQpCiAgICAgIGJyZWFrOwoKICAgIEZYX1dDSEFSIGMgPSBmb3JtYXQuR2V0QXQoaSk7CiAgICBzd2l0Y2ggKGMpIHsKICAgICAgY2FzZSAnOic6CiAgICAgIGNhc2UgJy4nOgogICAgICBjYXNlICctJzoKICAgICAgY2FzZSAnXFwnOgogICAgICBjYXNlICcvJzoKICAgICAgICBpKys7CiAgICAgICAgaisrOwogICAgICAgIGJyZWFrOwoKICAgICAgY2FzZSAneSc6CiAgICAgIGNhc2UgJ20nOgogICAgICBjYXNlICdkJzoKICAgICAgY2FzZSAnSCc6CiAgICAgIGNhc2UgJ2gnOgogICAgICBjYXNlICdNJzoKICAgICAgY2FzZSAncyc6CiAgICAgIGNhc2UgJ3QnOiB7CiAgICAgICAgaW50IG9sZGogPSBqOwogICAgICAgIGludCBuU2tpcCA9IDA7CiAgICAgICAgaW50IHJlbWFpbmluZyA9IGZvcm1hdC5HZXRMZW5ndGgoKSAtIGkgLSAxOwoKICAgICAgICBpZiAocmVtYWluaW5nID09IDAgfHwgZm9ybWF0LkdldEF0KGkgKyAxKSAhPSBjKSB7CiAgICAgICAgICBzd2l0Y2ggKGMpIHsKICAgICAgICAgICAgY2FzZSAneSc6CiAgICAgICAgICAgICAgaSsrOwogICAgICAgICAgICAgIGorKzsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnbSc6CiAgICAgICAgICAgICAgbk1vbnRoID0gUGFyc2VTdHJpbmdJbnRlZ2VyKHZhbHVlLCBqLCBuU2tpcCwgMik7CiAgICAgICAgICAgICAgaSsrOwogICAgICAgICAgICAgIGogKz0gblNraXA7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2QnOgogICAgICAgICAgICAgIG5EYXkgPSBQYXJzZVN0cmluZ0ludGVnZXIodmFsdWUsIGosIG5Ta2lwLCAyKTsKICAgICAgICAgICAgICBpKys7CiAgICAgICAgICAgICAgaiArPSBuU2tpcDsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnSCc6CiAgICAgICAgICAgICAgbkhvdXIgPSBQYXJzZVN0cmluZ0ludGVnZXIodmFsdWUsIGosIG5Ta2lwLCAyKTsKICAgICAgICAgICAgICBpKys7CiAgICAgICAgICAgICAgaiArPSBuU2tpcDsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnaCc6CiAgICAgICAgICAgICAgbkhvdXIgPSBQYXJzZVN0cmluZ0ludGVnZXIodmFsdWUsIGosIG5Ta2lwLCAyKTsKICAgICAgICAgICAgICBpKys7CiAgICAgICAgICAgICAgaiArPSBuU2tpcDsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnTSc6CiAgICAgICAgICAgICAgbk1pbiA9IFBhcnNlU3RyaW5nSW50ZWdlcih2YWx1ZSwgaiwgblNraXAsIDIpOwogICAgICAgICAgICAgIGkrKzsKICAgICAgICAgICAgICBqICs9IG5Ta2lwOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdzJzoKICAgICAgICAgICAgICBuU2VjID0gUGFyc2VTdHJpbmdJbnRlZ2VyKHZhbHVlLCBqLCBuU2tpcCwgMik7CiAgICAgICAgICAgICAgaSsrOwogICAgICAgICAgICAgIGogKz0gblNraXA7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3QnOgogICAgICAgICAgICAgIGJQbSA9IChqIDwgdmFsdWUuR2V0TGVuZ3RoKCkgJiYgdmFsdWUuR2V0QXQoaikgPT0gJ3AnKTsKICAgICAgICAgICAgICBpKys7CiAgICAgICAgICAgICAgaisrOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAocmVtYWluaW5nID09IDEgfHwgZm9ybWF0LkdldEF0KGkgKyAyKSAhPSBjKSB7CiAgICAgICAgICBzd2l0Y2ggKGMpIHsKICAgICAgICAgICAgY2FzZSAneSc6CiAgICAgICAgICAgICAgblllYXIgPSBQYXJzZVN0cmluZ0ludGVnZXIodmFsdWUsIGosIG5Ta2lwLCA0KTsKICAgICAgICAgICAgICBpICs9IDI7CiAgICAgICAgICAgICAgaiArPSBuU2tpcDsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnbSc6CiAgICAgICAgICAgICAgbk1vbnRoID0gUGFyc2VTdHJpbmdJbnRlZ2VyKHZhbHVlLCBqLCBuU2tpcCwgMik7CiAgICAgICAgICAgICAgaSArPSAyOwogICAgICAgICAgICAgIGogKz0gblNraXA7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2QnOgogICAgICAgICAgICAgIG5EYXkgPSBQYXJzZVN0cmluZ0ludGVnZXIodmFsdWUsIGosIG5Ta2lwLCAyKTsKICAgICAgICAgICAgICBpICs9IDI7CiAgICAgICAgICAgICAgaiArPSBuU2tpcDsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnSCc6CiAgICAgICAgICAgICAgbkhvdXIgPSBQYXJzZVN0cmluZ0ludGVnZXIodmFsdWUsIGosIG5Ta2lwLCAyKTsKICAgICAgICAgICAgICBpICs9IDI7CiAgICAgICAgICAgICAgaiArPSBuU2tpcDsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnaCc6CiAgICAgICAgICAgICAgbkhvdXIgPSBQYXJzZVN0cmluZ0ludGVnZXIodmFsdWUsIGosIG5Ta2lwLCAyKTsKICAgICAgICAgICAgICBpICs9IDI7CiAgICAgICAgICAgICAgaiArPSBuU2tpcDsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnTSc6CiAgICAgICAgICAgICAgbk1pbiA9IFBhcnNlU3RyaW5nSW50ZWdlcih2YWx1ZSwgaiwgblNraXAsIDIpOwogICAgICAgICAgICAgIGkgKz0gMjsKICAgICAgICAgICAgICBqICs9IG5Ta2lwOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdzJzoKICAgICAgICAgICAgICBuU2VjID0gUGFyc2VTdHJpbmdJbnRlZ2VyKHZhbHVlLCBqLCBuU2tpcCwgMik7CiAgICAgICAgICAgICAgaSArPSAyOwogICAgICAgICAgICAgIGogKz0gblNraXA7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3QnOgogICAgICAgICAgICAgIGJQbSA9IChqICsgMSA8IHZhbHVlLkdldExlbmd0aCgpICYmIHZhbHVlLkdldEF0KGopID09ICdwJyAmJgogICAgICAgICAgICAgICAgICAgICB2YWx1ZS5HZXRBdChqICsgMSkgPT0gJ20nKTsKICAgICAgICAgICAgICBpICs9IDI7CiAgICAgICAgICAgICAgaiArPSAyOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAocmVtYWluaW5nID09IDIgfHwgZm9ybWF0LkdldEF0KGkgKyAzKSAhPSBjKSB7CiAgICAgICAgICBzd2l0Y2ggKGMpIHsKICAgICAgICAgICAgY2FzZSAnbSc6IHsKICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyBzTW9udGggPSBQYXJzZVN0cmluZ1N0cmluZyh2YWx1ZSwgaiwgblNraXApOwogICAgICAgICAgICAgIEZYX0JPT0wgYkZpbmQgPSBGQUxTRTsKICAgICAgICAgICAgICBmb3IgKGludCBtID0gMDsgbSA8IDEyOyBtKyspIHsKICAgICAgICAgICAgICAgIGlmIChzTW9udGguQ29tcGFyZU5vQ2FzZShtb250aHNbbV0pID09IDApIHsKICAgICAgICAgICAgICAgICAgbk1vbnRoID0gbSArIDE7CiAgICAgICAgICAgICAgICAgIGkgKz0gMzsKICAgICAgICAgICAgICAgICAgaiArPSBuU2tpcDsKICAgICAgICAgICAgICAgICAgYkZpbmQgPSBUUlVFOwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIGlmICghYkZpbmQpIHsKICAgICAgICAgICAgICAgIG5Nb250aCA9IFBhcnNlU3RyaW5nSW50ZWdlcih2YWx1ZSwgaiwgblNraXAsIDMpOwogICAgICAgICAgICAgICAgaSArPSAzOwogICAgICAgICAgICAgICAgaiArPSBuU2tpcDsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3knOgogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgIGkgKz0gMzsKICAgICAgICAgICAgICBqICs9IDM7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChyZW1haW5pbmcgPT0gMyB8fCBmb3JtYXQuR2V0QXQoaSArIDQpICE9IGMpIHsKICAgICAgICAgIHN3aXRjaCAoYykgewogICAgICAgICAgICBjYXNlICd5JzoKICAgICAgICAgICAgICBuWWVhciA9IFBhcnNlU3RyaW5nSW50ZWdlcih2YWx1ZSwgaiwgblNraXAsIDQpOwogICAgICAgICAgICAgIGogKz0gblNraXA7CiAgICAgICAgICAgICAgaSArPSA0OwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdtJzogewogICAgICAgICAgICAgIEZYX0JPT0wgYkZpbmQgPSBGQUxTRTsKCiAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgc01vbnRoID0gUGFyc2VTdHJpbmdTdHJpbmcodmFsdWUsIGosIG5Ta2lwKTsKICAgICAgICAgICAgICBzTW9udGguTWFrZUxvd2VyKCk7CgogICAgICAgICAgICAgIGZvciAoaW50IG0gPSAwOyBtIDwgMTI7IG0rKykgewogICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgc0Z1bGxNb250aHMgPSBmdWxsbW9udGhzW21dOwogICAgICAgICAgICAgICAgc0Z1bGxNb250aHMuTWFrZUxvd2VyKCk7CgogICAgICAgICAgICAgICAgaWYgKHNGdWxsTW9udGhzLkZpbmQoc01vbnRoLmNfc3RyKCksIDApICE9IC0xKSB7CiAgICAgICAgICAgICAgICAgIG5Nb250aCA9IG0gKyAxOwogICAgICAgICAgICAgICAgICBpICs9IDQ7CiAgICAgICAgICAgICAgICAgIGogKz0gblNraXA7CiAgICAgICAgICAgICAgICAgIGJGaW5kID0gVFJVRTsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICBpZiAoIWJGaW5kKSB7CiAgICAgICAgICAgICAgICBuTW9udGggPSBQYXJzZVN0cmluZ0ludGVnZXIodmFsdWUsIGosIG5Ta2lwLCA0KTsKICAgICAgICAgICAgICAgIGkgKz0gNDsKICAgICAgICAgICAgICAgIGogKz0gblNraXA7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGJyZWFrOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgIGkgKz0gNDsKICAgICAgICAgICAgICBqICs9IDQ7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlmIChqID49IHZhbHVlLkdldExlbmd0aCgpIHx8IGZvcm1hdC5HZXRBdChpKSAhPSB2YWx1ZS5HZXRBdChqKSkgewogICAgICAgICAgICBiV3JvbmdGb3JtYXQgPSBUUlVFOwogICAgICAgICAgICBiRXhpdCA9IFRSVUU7CiAgICAgICAgICB9CiAgICAgICAgICBpKys7CiAgICAgICAgICBqKys7CiAgICAgICAgfQoKICAgICAgICBpZiAob2xkaiA9PSBqKSB7CiAgICAgICAgICBiV3JvbmdGb3JtYXQgPSBUUlVFOwogICAgICAgICAgYkV4aXQgPSBUUlVFOwogICAgICAgIH0KICAgICAgfQoKICAgICAgYnJlYWs7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgaWYgKHZhbHVlLkdldExlbmd0aCgpIDw9IGopIHsKICAgICAgICAgIGJFeGl0ID0gVFJVRTsKICAgICAgICB9IGVsc2UgaWYgKGZvcm1hdC5HZXRBdChpKSAhPSB2YWx1ZS5HZXRBdChqKSkgewogICAgICAgICAgYldyb25nRm9ybWF0ID0gVFJVRTsKICAgICAgICAgIGJFeGl0ID0gVFJVRTsKICAgICAgICB9CgogICAgICAgIGkrKzsKICAgICAgICBqKys7CiAgICAgICAgYnJlYWs7CiAgICB9CiAgfQoKICBpZiAoYlBtKQogICAgbkhvdXIgKz0gMTI7CgogIGlmIChuWWVhciA+PSAwICYmIG5ZZWFyIDw9IG5ZZWFyU3ViKQogICAgblllYXIgKz0gMjAwMDsKCiAgaWYgKG5Nb250aCA8IDEgfHwgbk1vbnRoID4gMTIpCiAgICBiV3JvbmdGb3JtYXQgPSBUUlVFOwoKICBpZiAobkRheSA8IDEgfHwgbkRheSA+IDMxKQogICAgYldyb25nRm9ybWF0ID0gVFJVRTsKCiAgaWYgKG5Ib3VyIDwgMCB8fCBuSG91ciA+IDI0KQogICAgYldyb25nRm9ybWF0ID0gVFJVRTsKCiAgaWYgKG5NaW4gPCAwIHx8IG5NaW4gPiA2MCkKICAgIGJXcm9uZ0Zvcm1hdCA9IFRSVUU7CgogIGlmIChuU2VjIDwgMCB8fCBuU2VjID4gNjApCiAgICBiV3JvbmdGb3JtYXQgPSBUUlVFOwoKICBkb3VibGUgZFJldCA9IDA7CgogIGlmIChiV3JvbmdGb3JtYXQpIHsKICAgIGRSZXQgPSBQYXJzZU5vcm1hbERhdGUodmFsdWUsIGJXcm9uZ0Zvcm1hdCk7CiAgfSBlbHNlIHsKICAgIGRSZXQgPSBKU19NYWtlRGF0ZShKU19NYWtlRGF5KG5ZZWFyLCBuTW9udGggLSAxLCBuRGF5KSwKICAgICAgICAgICAgICAgICAgICAgICBKU19NYWtlVGltZShuSG91ciwgbk1pbiwgblNlYywgMCkpOwoKICAgIGlmIChKU19Qb3J0SXNOYW4oZFJldCkpIHsKICAgICAgZFJldCA9IEpTX0RhdGVQYXJzZSh2YWx1ZS5jX3N0cigpKTsKICAgIH0KICB9CgogIGlmIChKU19Qb3J0SXNOYW4oZFJldCkpIHsKICAgIGRSZXQgPSBQYXJzZU5vcm1hbERhdGUodmFsdWUsIGJXcm9uZ0Zvcm1hdCk7CiAgfQoKICByZXR1cm4gZFJldDsKfQoKQ0ZYX1dpZGVTdHJpbmcgQ0pTX1B1YmxpY01ldGhvZHM6Ok1ha2VGb3JtYXREYXRlKGRvdWJsZSBkRGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBmb3JtYXQpIHsKICBDRlhfV2lkZVN0cmluZyBzUmV0ID0gTCIiLCBzUGFydCA9IEwiIjsKCiAgaW50IG5ZZWFyID0gSlNfR2V0WWVhckZyb21UaW1lKGREYXRlKTsKICBpbnQgbk1vbnRoID0gSlNfR2V0TW9udGhGcm9tVGltZShkRGF0ZSkgKyAxOwogIGludCBuRGF5ID0gSlNfR2V0RGF5RnJvbVRpbWUoZERhdGUpOwogIGludCBuSG91ciA9IEpTX0dldEhvdXJGcm9tVGltZShkRGF0ZSk7CiAgaW50IG5NaW4gPSBKU19HZXRNaW5Gcm9tVGltZShkRGF0ZSk7CiAgaW50IG5TZWMgPSBKU19HZXRTZWNGcm9tVGltZShkRGF0ZSk7CgogIGludCBpID0gMDsKICB3aGlsZSAoaSA8IGZvcm1hdC5HZXRMZW5ndGgoKSkgewogICAgRlhfV0NIQVIgYyA9IGZvcm1hdC5HZXRBdChpKTsKICAgIGludCByZW1haW5pbmcgPSBmb3JtYXQuR2V0TGVuZ3RoKCkgLSBpIC0gMTsKICAgIHNQYXJ0ID0gTCIiOwogICAgc3dpdGNoIChjKSB7CiAgICAgIGNhc2UgJ3knOgogICAgICBjYXNlICdtJzoKICAgICAgY2FzZSAnZCc6CiAgICAgIGNhc2UgJ0gnOgogICAgICBjYXNlICdoJzoKICAgICAgY2FzZSAnTSc6CiAgICAgIGNhc2UgJ3MnOgogICAgICBjYXNlICd0JzoKICAgICAgICBpZiAocmVtYWluaW5nID09IDAgfHwgZm9ybWF0LkdldEF0KGkgKyAxKSAhPSBjKSB7CiAgICAgICAgICBzd2l0Y2ggKGMpIHsKICAgICAgICAgICAgY2FzZSAneSc6CiAgICAgICAgICAgICAgc1BhcnQgKz0gYzsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnbSc6CiAgICAgICAgICAgICAgc1BhcnQuRm9ybWF0KEwiJWQiLCBuTW9udGgpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdkJzoKICAgICAgICAgICAgICBzUGFydC5Gb3JtYXQoTCIlZCIsIG5EYXkpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdIJzoKICAgICAgICAgICAgICBzUGFydC5Gb3JtYXQoTCIlZCIsIG5Ib3VyKTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnaCc6CiAgICAgICAgICAgICAgc1BhcnQuRm9ybWF0KEwiJWQiLCBuSG91ciA+IDEyID8gbkhvdXIgLSAxMiA6IG5Ib3VyKTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnTSc6CiAgICAgICAgICAgICAgc1BhcnQuRm9ybWF0KEwiJWQiLCBuTWluKTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAncyc6CiAgICAgICAgICAgICAgc1BhcnQuRm9ybWF0KEwiJWQiLCBuU2VjKTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAndCc6CiAgICAgICAgICAgICAgc1BhcnQgKz0gbkhvdXIgPiAxMiA/ICdwJyA6ICdhJzsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGkrKzsKICAgICAgICB9IGVsc2UgaWYgKHJlbWFpbmluZyA9PSAxIHx8IGZvcm1hdC5HZXRBdChpICsgMikgIT0gYykgewogICAgICAgICAgc3dpdGNoIChjKSB7CiAgICAgICAgICAgIGNhc2UgJ3knOgogICAgICAgICAgICAgIHNQYXJ0LkZvcm1hdChMIiUwMmQiLCBuWWVhciAtIChuWWVhciAvIDEwMCkgKiAxMDApOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdtJzoKICAgICAgICAgICAgICBzUGFydC5Gb3JtYXQoTCIlMDJkIiwgbk1vbnRoKTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnZCc6CiAgICAgICAgICAgICAgc1BhcnQuRm9ybWF0KEwiJTAyZCIsIG5EYXkpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdIJzoKICAgICAgICAgICAgICBzUGFydC5Gb3JtYXQoTCIlMDJkIiwgbkhvdXIpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdoJzoKICAgICAgICAgICAgICBzUGFydC5Gb3JtYXQoTCIlMDJkIiwgbkhvdXIgPiAxMiA/IG5Ib3VyIC0gMTIgOiBuSG91cik7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ00nOgogICAgICAgICAgICAgIHNQYXJ0LkZvcm1hdChMIiUwMmQiLCBuTWluKTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAncyc6CiAgICAgICAgICAgICAgc1BhcnQuRm9ybWF0KEwiJTAyZCIsIG5TZWMpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICd0JzoKICAgICAgICAgICAgICBzUGFydCA9IG5Ib3VyID4gMTIgPyBMInBtIiA6IEwiYW0iOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgaSArPSAyOwogICAgICAgIH0gZWxzZSBpZiAocmVtYWluaW5nID09IDIgfHwgZm9ybWF0LkdldEF0KGkgKyAzKSAhPSBjKSB7CiAgICAgICAgICBzd2l0Y2ggKGMpIHsKICAgICAgICAgICAgY2FzZSAnbSc6CiAgICAgICAgICAgICAgaSArPSAzOwogICAgICAgICAgICAgIGlmIChuTW9udGggPiAwICYmIG5Nb250aCA8PSAxMikKICAgICAgICAgICAgICAgIHNQYXJ0ICs9IG1vbnRoc1tuTW9udGggLSAxXTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICBpICs9IDM7CiAgICAgICAgICAgICAgc1BhcnQgKz0gYzsKICAgICAgICAgICAgICBzUGFydCArPSBjOwogICAgICAgICAgICAgIHNQYXJ0ICs9IGM7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChyZW1haW5pbmcgPT0gMyB8fCBmb3JtYXQuR2V0QXQoaSArIDQpICE9IGMpIHsKICAgICAgICAgIHN3aXRjaCAoYykgewogICAgICAgICAgICBjYXNlICd5JzoKICAgICAgICAgICAgICBzUGFydC5Gb3JtYXQoTCIlMDRkIiwgblllYXIpOwogICAgICAgICAgICAgIGkgKz0gNDsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnbSc6CiAgICAgICAgICAgICAgaSArPSA0OwogICAgICAgICAgICAgIGlmIChuTW9udGggPiAwICYmIG5Nb250aCA8PSAxMikKICAgICAgICAgICAgICAgIHNQYXJ0ICs9IGZ1bGxtb250aHNbbk1vbnRoIC0gMV07CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgaSArPSA0OwogICAgICAgICAgICAgIHNQYXJ0ICs9IGM7CiAgICAgICAgICAgICAgc1BhcnQgKz0gYzsKICAgICAgICAgICAgICBzUGFydCArPSBjOwogICAgICAgICAgICAgIHNQYXJ0ICs9IGM7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGkrKzsKICAgICAgICAgIHNQYXJ0ICs9IGM7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgICBkZWZhdWx0OgogICAgICAgIGkrKzsKICAgICAgICBzUGFydCArPSBjOwogICAgICAgIGJyZWFrOwogICAgfQoKICAgIHNSZXQgKz0gc1BhcnQ7CiAgfQoKICByZXR1cm4gc1JldDsKfQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCi8vIGZ1bmN0aW9uIEFGTnVtYmVyX0Zvcm1hdChuRGVjLCBzZXBTdHlsZSwgbmVnU3R5bGUsIGN1cnJTdHlsZSwgc3RyQ3VycmVuY3ksCi8vIGJDdXJyZW5jeVByZXBlbmQpCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGTnVtYmVyX0Zvcm1hdChJRlhKU19Db250ZXh0KiBjYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CiNpZiBfRlhfT1NfICE9IF9GWF9BTkRST0lEXwogIHY4OjpJc29sYXRlKiBpc29sYXRlID0gOjpHZXRJc29sYXRlKGNjKTsKICBDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOwogIEFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKICBDSlNfRXZlbnRIYW5kbGVyKiBwRXZlbnQgPSBwQ29udGV4dC0+R2V0RXZlbnRIYW5kbGVyKCk7CiAgQVNTRVJUKHBFdmVudCAhPSBOVUxMKTsKCiAgaWYgKHBhcmFtcy5zaXplKCkgIT0gNikgewogICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKICAgIHJldHVybiBGQUxTRTsKICB9CiAgaWYgKCFwRXZlbnQtPm1fcFZhbHVlKQogICAgcmV0dXJuIEZBTFNFOwogIENGWF9XaWRlU3RyaW5nJiBWYWx1ZSA9IHBFdmVudC0+VmFsdWUoKTsKICBDRlhfQnl0ZVN0cmluZyBzdHJWYWx1ZSA9IFN0clRyaW0oQ0ZYX0J5dGVTdHJpbmc6OkZyb21Vbmljb2RlKFZhbHVlKSk7CgogIGlmIChzdHJWYWx1ZS5Jc0VtcHR5KCkpCiAgICByZXR1cm4gVFJVRTsKCiAgaW50IGlEZWMgPSBwYXJhbXNbMF0uVG9JbnQoKTsKICBpbnQgaVNlcFN0eWxlID0gcGFyYW1zWzFdLlRvSW50KCk7CiAgaW50IGlOZWdTdHlsZSA9IHBhcmFtc1syXS5Ub0ludCgpOwogIC8vIHBhcmFtc1szXSBpcyBpQ3VyclN0eWxlLCBpdCdzIG5vdCB1c2VkLgogIHN0ZDo6d3N0cmluZyB3c3RyQ3VycmVuY3kocGFyYW1zWzRdLlRvQ0ZYV2lkZVN0cmluZygpLmNfc3RyKCkpOwogIEZYX0JPT0wgYkN1cnJlbmN5UHJlcGVuZCA9IHBhcmFtc1s1XS5Ub0Jvb2woKTsKCiAgaWYgKGlEZWMgPCAwKQogICAgaURlYyA9IC1pRGVjOwoKICBpZiAoaVNlcFN0eWxlIDwgMCB8fCBpU2VwU3R5bGUgPiAzKQogICAgaVNlcFN0eWxlID0gMDsKCiAgaWYgKGlOZWdTdHlsZSA8IDAgfHwgaU5lZ1N0eWxlID4gMykKICAgIGlOZWdTdHlsZSA9IDA7CgogIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogIC8vIGZvciBwcm9jZXNzaW5nIGRlY2ltYWwgcGxhY2VzCiAgc3RyVmFsdWUuUmVwbGFjZSgiLCIsICIuIik7CiAgZG91YmxlIGRWYWx1ZSA9IGF0b2Yoc3RyVmFsdWUpOwogIGlmIChpRGVjID4gMCkKICAgIGRWYWx1ZSArPSBET1VCTEVfQ09SUkVDVDsKCiAgaW50IGlEZWMyOwogIGludCBpTmVnYXRpdmUgPSAwOwoKICBzdHJWYWx1ZSA9IGZjdnQoZFZhbHVlLCBpRGVjLCAmaURlYzIsICZpTmVnYXRpdmUpOwogIGlmIChzdHJWYWx1ZS5Jc0VtcHR5KCkpIHsKICAgIGRWYWx1ZSA9IDA7CiAgICBzdHJWYWx1ZSA9IGZjdnQoZFZhbHVlLCBpRGVjLCAmaURlYzIsICZpTmVnYXRpdmUpOwogICAgaWYgKHN0clZhbHVlLklzRW1wdHkoKSkgewogICAgICBzdHJWYWx1ZSA9ICIwIjsKICAgICAgaURlYzIgPSAxOwogICAgfQogIH0KCiAgaWYgKGlEZWMyIDwgMCkgewogICAgZm9yIChpbnQgaU51bSA9IDA7IGlOdW0gPCBhYnMoaURlYzIpOyBpTnVtKyspIHsKICAgICAgc3RyVmFsdWUgPSAiMCIgKyBzdHJWYWx1ZTsKICAgIH0KICAgIGlEZWMyID0gMDsKICB9CiAgaW50IGlNYXggPSBzdHJWYWx1ZS5HZXRMZW5ndGgoKTsKICBpZiAoaURlYzIgPiBpTWF4KSB7CiAgICBmb3IgKGludCBpTnVtID0gMDsgaU51bSA8PSBpRGVjMiAtIGlNYXg7IGlOdW0rKykgewogICAgICBzdHJWYWx1ZSArPSAiMCI7CiAgICB9CiAgICBpTWF4ID0gaURlYzIgKyAxOwogIH0KICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgLy8gZm9yIHByb2Nlc3Npbmcgc2VwZXJhdG9yIHN0eWxlCiAgaWYgKGlEZWMyIDwgaU1heCkgewogICAgaWYgKGlTZXBTdHlsZSA9PSAwIHx8IGlTZXBTdHlsZSA9PSAxKSB7CiAgICAgIHN0clZhbHVlLkluc2VydChpRGVjMiwgJy4nKTsKICAgICAgaU1heCsrOwogICAgfSBlbHNlIGlmIChpU2VwU3R5bGUgPT0gMiB8fCBpU2VwU3R5bGUgPT0gMykgewogICAgICBzdHJWYWx1ZS5JbnNlcnQoaURlYzIsICcsJyk7CiAgICAgIGlNYXgrKzsKICAgIH0KCiAgICBpZiAoaURlYzIgPT0gMCkKICAgICAgc3RyVmFsdWUuSW5zZXJ0KGlEZWMyLCAnMCcpOwogIH0KICBpZiAoaVNlcFN0eWxlID09IDAgfHwgaVNlcFN0eWxlID09IDIpIHsKICAgIGNoYXIgY1NlcGVyYXRvcjsKICAgIGlmIChpU2VwU3R5bGUgPT0gMCkKICAgICAgY1NlcGVyYXRvciA9ICcsJzsKICAgIGVsc2UKICAgICAgY1NlcGVyYXRvciA9ICcuJzsKCiAgICBpbnQgaURlY1Bvc2l0aXZlOwogICAgaURlY1Bvc2l0aXZlID0gaURlYzI7CgogICAgZm9yIChpRGVjUG9zaXRpdmUgPSBpRGVjMiAtIDM7IGlEZWNQb3NpdGl2ZSA+IDA7IGlEZWNQb3NpdGl2ZSAtPSAzKSB7CiAgICAgIHN0clZhbHVlLkluc2VydChpRGVjUG9zaXRpdmUsIGNTZXBlcmF0b3IpOwogICAgICBpTWF4Kys7CiAgICB9CiAgfQoKICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgLy8gZm9yIHByb2Nlc3NpbmcgY3VycmVuY3kgc3RyaW5nCgogIFZhbHVlID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21Mb2NhbChzdHJWYWx1ZSk7CiAgc3RkOjp3c3RyaW5nIHN0clZhbHVlMiA9IFZhbHVlLmNfc3RyKCk7CgogIGlmIChiQ3VycmVuY3lQcmVwZW5kKQogICAgc3RyVmFsdWUyID0gd3N0ckN1cnJlbmN5ICsgc3RyVmFsdWUyOwogIGVsc2UKICAgIHN0clZhbHVlMiA9IHN0clZhbHVlMiArIHdzdHJDdXJyZW5jeTsKCiAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogIC8vIGZvciBwcm9jZXNzaW5nIG5lZ2F0aXZlIHN0eWxlCiAgaWYgKGlOZWdhdGl2ZSkgewogICAgaWYgKGlOZWdTdHlsZSA9PSAwKSB7CiAgICAgIHN0clZhbHVlMi5pbnNlcnQoMCwgTCItIik7CiAgICB9CiAgICBpZiAoaU5lZ1N0eWxlID09IDIgfHwgaU5lZ1N0eWxlID09IDMpIHsKICAgICAgc3RyVmFsdWUyLmluc2VydCgwLCBMIigiKTsKICAgICAgc3RyVmFsdWUyLmluc2VydChzdHJWYWx1ZTIubGVuZ3RoKCksIEwiKSIpOwogICAgfQogICAgaWYgKGlOZWdTdHlsZSA9PSAxIHx8IGlOZWdTdHlsZSA9PSAzKSB7CiAgICAgIGlmIChGaWVsZCogZlRhcmdldCA9IHBFdmVudC0+VGFyZ2V0X0ZpZWxkKCkpIHsKICAgICAgICBDSlNfQXJyYXkgYXJDb2xvcihpc29sYXRlKTsKICAgICAgICBDSlNfVmFsdWUgdkNvbEVsbShpc29sYXRlKTsKICAgICAgICB2Q29sRWxtID0gTCJSR0IiOwogICAgICAgIGFyQ29sb3IuU2V0RWxlbWVudCgwLCB2Q29sRWxtKTsKICAgICAgICB2Q29sRWxtID0gMTsKICAgICAgICBhckNvbG9yLlNldEVsZW1lbnQoMSwgdkNvbEVsbSk7CiAgICAgICAgdkNvbEVsbSA9IDA7CiAgICAgICAgYXJDb2xvci5TZXRFbGVtZW50KDIsIHZDb2xFbG0pOwoKICAgICAgICBhckNvbG9yLlNldEVsZW1lbnQoMywgdkNvbEVsbSk7CgogICAgICAgIENKU19Qcm9wVmFsdWUgdlByb3AoaXNvbGF0ZSk7CiAgICAgICAgdlByb3AuU3RhcnRHZXR0aW5nKCk7CiAgICAgICAgdlByb3AgPDwgYXJDb2xvcjsKICAgICAgICB2UHJvcC5TdGFydFNldHRpbmcoKTsKICAgICAgICBmVGFyZ2V0LT50ZXh0Q29sb3IoY2MsIHZQcm9wLCBzRXJyb3IpOyAgLy8gcmVkCiAgICAgIH0KICAgIH0KICB9IGVsc2UgewogICAgaWYgKGlOZWdTdHlsZSA9PSAxIHx8IGlOZWdTdHlsZSA9PSAzKSB7CiAgICAgIGlmIChGaWVsZCogZlRhcmdldCA9IHBFdmVudC0+VGFyZ2V0X0ZpZWxkKCkpIHsKICAgICAgICBDSlNfQXJyYXkgYXJDb2xvcihpc29sYXRlKTsKICAgICAgICBDSlNfVmFsdWUgdkNvbEVsbShpc29sYXRlKTsKICAgICAgICB2Q29sRWxtID0gTCJSR0IiOwogICAgICAgIGFyQ29sb3IuU2V0RWxlbWVudCgwLCB2Q29sRWxtKTsKICAgICAgICB2Q29sRWxtID0gMDsKICAgICAgICBhckNvbG9yLlNldEVsZW1lbnQoMSwgdkNvbEVsbSk7CiAgICAgICAgYXJDb2xvci5TZXRFbGVtZW50KDIsIHZDb2xFbG0pOwogICAgICAgIGFyQ29sb3IuU2V0RWxlbWVudCgzLCB2Q29sRWxtKTsKCiAgICAgICAgQ0pTX1Byb3BWYWx1ZSB2UHJvcChpc29sYXRlKTsKICAgICAgICB2UHJvcC5TdGFydEdldHRpbmcoKTsKICAgICAgICBmVGFyZ2V0LT50ZXh0Q29sb3IoY2MsIHZQcm9wLCBzRXJyb3IpOwoKICAgICAgICBDSlNfQXJyYXkgYVByb3AoaXNvbGF0ZSk7CiAgICAgICAgdlByb3AuQ29udmVydFRvQXJyYXkoYVByb3ApOwoKICAgICAgICBDUFdMX0NvbG9yIGNyUHJvcDsKICAgICAgICBDUFdMX0NvbG9yIGNyQ29sb3I7CiAgICAgICAgY29sb3I6OkNvbnZlcnRBcnJheVRvUFdMQ29sb3IoYVByb3AsIGNyUHJvcCk7CiAgICAgICAgY29sb3I6OkNvbnZlcnRBcnJheVRvUFdMQ29sb3IoYXJDb2xvciwgY3JDb2xvcik7CgogICAgICAgIGlmIChjckNvbG9yICE9IGNyUHJvcCkgewogICAgICAgICAgQ0pTX1Byb3BWYWx1ZSB2UHJvcDIoaXNvbGF0ZSk7CiAgICAgICAgICB2UHJvcDIuU3RhcnRHZXR0aW5nKCk7CiAgICAgICAgICB2UHJvcDIgPDwgYXJDb2xvcjsKICAgICAgICAgIHZQcm9wMi5TdGFydFNldHRpbmcoKTsKICAgICAgICAgIGZUYXJnZXQtPnRleHRDb2xvcihjYywgdlByb3AyLCBzRXJyb3IpOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KICBWYWx1ZSA9IHN0clZhbHVlMi5jX3N0cigpOwojZW5kaWYKICByZXR1cm4gVFJVRTsKfQoKLy8gZnVuY3Rpb24gQUZOdW1iZXJfS2V5c3Ryb2tlKG5EZWMsIHNlcFN0eWxlLCBuZWdTdHlsZSwgY3VyclN0eWxlLCBzdHJDdXJyZW5jeSwKLy8gYkN1cnJlbmN5UHJlcGVuZCkKRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZOdW1iZXJfS2V5c3Ryb2tlKElGWEpTX0NvbnRleHQqIGNjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKICBDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOwogIEFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKICBDSlNfRXZlbnRIYW5kbGVyKiBwRXZlbnQgPSBwQ29udGV4dC0+R2V0RXZlbnRIYW5kbGVyKCk7CiAgQVNTRVJUKHBFdmVudCAhPSBOVUxMKTsKCiAgaWYgKHBhcmFtcy5zaXplKCkgPCAyKQogICAgcmV0dXJuIEZBTFNFOwogIGludCBpU2VwU3R5bGUgPSBwYXJhbXNbMV0uVG9JbnQoKTsKCiAgaWYgKGlTZXBTdHlsZSA8IDAgfHwgaVNlcFN0eWxlID4gMykKICAgIGlTZXBTdHlsZSA9IDA7CiAgaWYgKCFwRXZlbnQtPm1fcFZhbHVlKQogICAgcmV0dXJuIEZBTFNFOwogIENGWF9XaWRlU3RyaW5nJiB2YWwgPSBwRXZlbnQtPlZhbHVlKCk7CiAgQ0ZYX1dpZGVTdHJpbmcmIHdfc3RyQ2hhbmdlID0gcEV2ZW50LT5DaGFuZ2UoKTsKICBDRlhfV2lkZVN0cmluZyB3X3N0clZhbHVlID0gdmFsOwoKICBpZiAocEV2ZW50LT5XaWxsQ29tbWl0KCkpIHsKICAgIENGWF9XaWRlU3RyaW5nIHdzdHJDaGFuZ2UgPSB3X3N0ckNoYW5nZTsKICAgIENGWF9XaWRlU3RyaW5nIHdzdHJWYWx1ZSA9IFN0ckxUcmltKHdfc3RyVmFsdWUuY19zdHIoKSk7CiAgICBpZiAod3N0clZhbHVlLklzRW1wdHkoKSkKICAgICAgcmV0dXJuIFRSVUU7CgogICAgQ0ZYX1dpZGVTdHJpbmcgc3dUZW1wID0gd3N0clZhbHVlOwogICAgc3dUZW1wLlJlcGxhY2UoTCIsIiwgTCIuIik7CiAgICBpZiAoIUlzTnVtYmVyKHN3VGVtcC5jX3N0cigpKSkgewogICAgICBwRXZlbnQtPlJjKCkgPSBGQUxTRTsKICAgICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNBRk5VTUJFUl9LRVlTVFJPS0UpOwogICAgICBBbGVydChwQ29udGV4dCwgc0Vycm9yLmNfc3RyKCkpOwogICAgICByZXR1cm4gVFJVRTsKICAgIH0KICAgIHJldHVybiBUUlVFOyAgLy8gaXQgaGFwcGVucyBhZnRlciB0aGUgbGFzdCBrZXlzdHJva2UgYW5kIGJlZm9yZSB2YWxpZGF0aW5nLAogIH0KCiAgc3RkOjp3c3RyaW5nIHdfc3RyVmFsdWUyID0gd19zdHJWYWx1ZS5jX3N0cigpOwogIHN0ZDo6d3N0cmluZyB3X3N0ckNoYW5nZTIgPSB3X3N0ckNoYW5nZS5jX3N0cigpOwogIHN0ZDo6d3N0cmluZyB3X3N0clNlbGVjdGVkOwogIGlmICgtMSAhPSBwRXZlbnQtPlNlbFN0YXJ0KCkpCiAgICB3X3N0clNlbGVjdGVkID0gd19zdHJWYWx1ZTIuc3Vic3RyKHBFdmVudC0+U2VsU3RhcnQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBFdmVudC0+U2VsRW5kKCkgLSBwRXZlbnQtPlNlbFN0YXJ0KCkpKTsKICBib29sIGJIYXNTaWduID0gKHdfc3RyVmFsdWUyLmZpbmQoJy0nKSAhPSBzdGQ6OndzdHJpbmc6Om5wb3MpICYmCiAgICAgICAgICAgICAgICAgICh3X3N0clNlbGVjdGVkLmZpbmQoJy0nKSA9PSBzdGQ6OndzdHJpbmc6Om5wb3MpOwogIGlmIChiSGFzU2lnbikgewogICAgLy8gY2FuJ3QgaW5zZXJ0ICJjaGFuZ2UiIGluIGZyb250IHRvIHNpZ24gcG9zdGlvbi4KICAgIGlmIChwRXZlbnQtPlNlbFN0YXJ0KCkgPT0gMCkgewogICAgICBGWF9CT09MJiBiUmMgPSBwRXZlbnQtPlJjKCk7CiAgICAgIGJSYyA9IEZBTFNFOwogICAgICByZXR1cm4gVFJVRTsKICAgIH0KICB9CgogIGNoYXIgY1NlcCA9IEwnLic7CgogIHN3aXRjaCAoaVNlcFN0eWxlKSB7CiAgICBjYXNlIDA6CiAgICBjYXNlIDE6CiAgICAgIGNTZXAgPSBMJy4nOwogICAgICBicmVhazsKICAgIGNhc2UgMjoKICAgIGNhc2UgMzoKICAgICAgY1NlcCA9IEwnLCc7CiAgICAgIGJyZWFrOwogIH0KCiAgYm9vbCBiSGFzU2VwID0gKHdfc3RyVmFsdWUyLmZpbmQoY1NlcCkgIT0gc3RkOjp3c3RyaW5nOjpucG9zKTsKICBmb3IgKHN0ZDo6d3N0cmluZzo6aXRlcmF0b3IgaXQgPSB3X3N0ckNoYW5nZTIuYmVnaW4oKTsKICAgICAgIGl0ICE9IHdfc3RyQ2hhbmdlMi5lbmQoKTsgaXQrKykgewogICAgaWYgKCppdCA9PSBjU2VwKSB7CiAgICAgIGlmIChiSGFzU2VwKSB7CiAgICAgICAgRlhfQk9PTCYgYlJjID0gcEV2ZW50LT5SYygpOwogICAgICAgIGJSYyA9IEZBTFNFOwogICAgICAgIHJldHVybiBUUlVFOwogICAgICB9CiAgICAgIGJIYXNTZXAgPSBUUlVFOwogICAgICBjb250aW51ZTsKICAgIH0KICAgIGlmICgqaXQgPT0gTCctJykgewogICAgICBpZiAoYkhhc1NpZ24pIHsKICAgICAgICBGWF9CT09MJiBiUmMgPSBwRXZlbnQtPlJjKCk7CiAgICAgICAgYlJjID0gRkFMU0U7CiAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgIH0KICAgICAgaWYgKGl0ICE9IHdfc3RyQ2hhbmdlMi5iZWdpbigpKSAgLy8gc2lnbidzIHBvc2l0aW9uIGlzIG5vdCBjb3JyZWN0CiAgICAgIHsKICAgICAgICBGWF9CT09MJiBiUmMgPSBwRXZlbnQtPlJjKCk7CiAgICAgICAgYlJjID0gRkFMU0U7CiAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgIH0KICAgICAgaWYgKHBFdmVudC0+U2VsU3RhcnQoKSAhPSAwKSB7CiAgICAgICAgRlhfQk9PTCYgYlJjID0gcEV2ZW50LT5SYygpOwogICAgICAgIGJSYyA9IEZBTFNFOwogICAgICAgIHJldHVybiBUUlVFOwogICAgICB9CiAgICAgIGJIYXNTaWduID0gVFJVRTsKICAgICAgY29udGludWU7CiAgICB9CgogICAgaWYgKCFJc0RpZ2l0KCppdCkpIHsKICAgICAgRlhfQk9PTCYgYlJjID0gcEV2ZW50LT5SYygpOwogICAgICBiUmMgPSBGQUxTRTsKICAgICAgcmV0dXJuIFRSVUU7CiAgICB9CiAgfQoKICBzdGQ6OndzdHJpbmcgd19wcmVmaXggPSB3X3N0clZhbHVlMi5zdWJzdHIoMCwgcEV2ZW50LT5TZWxTdGFydCgpKTsKICBzdGQ6OndzdHJpbmcgd19wb3N0Zml4OwogIGlmIChwRXZlbnQtPlNlbEVuZCgpIDwgKGludCl3X3N0clZhbHVlMi5sZW5ndGgoKSkKICAgIHdfcG9zdGZpeCA9IHdfc3RyVmFsdWUyLnN1YnN0cihwRXZlbnQtPlNlbEVuZCgpKTsKICB3X3N0clZhbHVlMiA9IHdfcHJlZml4ICsgd19zdHJDaGFuZ2UyICsgd19wb3N0Zml4OwogIHdfc3RyVmFsdWUgPSB3X3N0clZhbHVlMi5jX3N0cigpOwogIHZhbCA9IHdfc3RyVmFsdWU7CiAgcmV0dXJuIFRSVUU7Cn0KCi8vIGZ1bmN0aW9uIEFGUGVyY2VudF9Gb3JtYXQobkRlYywgc2VwU3R5bGUpCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGUGVyY2VudF9Gb3JtYXQoSUZYSlNfQ29udGV4dCogY2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewojaWYgX0ZYX09TXyAhPSBfRlhfQU5EUk9JRF8KICBDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOwogIEFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKICBDSlNfRXZlbnRIYW5kbGVyKiBwRXZlbnQgPSBwQ29udGV4dC0+R2V0RXZlbnRIYW5kbGVyKCk7CiAgQVNTRVJUKHBFdmVudCAhPSBOVUxMKTsKCiAgaWYgKHBhcmFtcy5zaXplKCkgIT0gMikgewogICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKICAgIHJldHVybiBGQUxTRTsKICB9CiAgaWYgKCFwRXZlbnQtPm1fcFZhbHVlKQogICAgcmV0dXJuIEZBTFNFOwoKICBDRlhfV2lkZVN0cmluZyYgVmFsdWUgPSBwRXZlbnQtPlZhbHVlKCk7CiAgQ0ZYX0J5dGVTdHJpbmcgc3RyVmFsdWUgPSBTdHJUcmltKENGWF9CeXRlU3RyaW5nOjpGcm9tVW5pY29kZShWYWx1ZSkpOwogIGlmIChzdHJWYWx1ZS5Jc0VtcHR5KCkpCiAgICByZXR1cm4gVFJVRTsKCiAgaW50IGlEZWMgPSBwYXJhbXNbMF0uVG9JbnQoKTsKICBpZiAoaURlYyA8IDApCiAgICBpRGVjID0gLWlEZWM7CgogIGludCBpU2VwU3R5bGUgPSBwYXJhbXNbMV0uVG9JbnQoKTsKICBpZiAoaVNlcFN0eWxlIDwgMCB8fCBpU2VwU3R5bGUgPiAzKQogICAgaVNlcFN0eWxlID0gMDsKCiAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgLy8gZm9yIHByb2Nlc3NpbmcgZGVjaW1hbCBwbGFjZXMKICBkb3VibGUgZFZhbHVlID0gYXRvZihzdHJWYWx1ZSk7CiAgZFZhbHVlICo9IDEwMDsKICBpZiAoaURlYyA+IDApCiAgICBkVmFsdWUgKz0gRE9VQkxFX0NPUlJFQ1Q7ICAvL9Cj1f0KCiAgaW50IGlEZWMyOwogIGludCBpTmVnYXRpdmUgPSAwOwogIHN0clZhbHVlID0gZmN2dChkVmFsdWUsIGlEZWMsICZpRGVjMiwgJmlOZWdhdGl2ZSk7CiAgaWYgKHN0clZhbHVlLklzRW1wdHkoKSkgewogICAgZFZhbHVlID0gMDsKICAgIHN0clZhbHVlID0gZmN2dChkVmFsdWUsIGlEZWMsICZpRGVjMiwgJmlOZWdhdGl2ZSk7CiAgfQoKICBpZiAoaURlYzIgPCAwKSB7CiAgICBmb3IgKGludCBpTnVtID0gMDsgaU51bSA8IGFicyhpRGVjMik7IGlOdW0rKykgewogICAgICBzdHJWYWx1ZSA9ICIwIiArIHN0clZhbHVlOwogICAgfQogICAgaURlYzIgPSAwOwogIH0KICBpbnQgaU1heCA9IHN0clZhbHVlLkdldExlbmd0aCgpOwogIGlmIChpRGVjMiA+IGlNYXgpIHsKICAgIGZvciAoaW50IGlOdW0gPSAwOyBpTnVtIDw9IGlEZWMyIC0gaU1heDsgaU51bSsrKSB7CiAgICAgIHN0clZhbHVlICs9ICIwIjsKICAgIH0KICAgIGlNYXggPSBpRGVjMiArIDE7CiAgfQogIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAvLyBmb3IgcHJvY2Vzc2luZyBzZXBlcmF0b3Igc3R5bGUKICBpZiAoaURlYzIgPCBpTWF4KSB7CiAgICBpZiAoaVNlcFN0eWxlID09IDAgfHwgaVNlcFN0eWxlID09IDEpIHsKICAgICAgc3RyVmFsdWUuSW5zZXJ0KGlEZWMyLCAnLicpOwogICAgICBpTWF4Kys7CiAgICB9IGVsc2UgaWYgKGlTZXBTdHlsZSA9PSAyIHx8IGlTZXBTdHlsZSA9PSAzKSB7CiAgICAgIHN0clZhbHVlLkluc2VydChpRGVjMiwgJywnKTsKICAgICAgaU1heCsrOwogICAgfQoKICAgIGlmIChpRGVjMiA9PSAwKQogICAgICBzdHJWYWx1ZS5JbnNlcnQoaURlYzIsICcwJyk7CiAgfQogIGlmIChpU2VwU3R5bGUgPT0gMCB8fCBpU2VwU3R5bGUgPT0gMikgewogICAgY2hhciBjU2VwZXJhdG9yOwogICAgaWYgKGlTZXBTdHlsZSA9PSAwKQogICAgICBjU2VwZXJhdG9yID0gJywnOwogICAgZWxzZQogICAgICBjU2VwZXJhdG9yID0gJy4nOwoKICAgIGludCBpRGVjUG9zaXRpdmU7CiAgICBpRGVjUG9zaXRpdmUgPSBpRGVjMjsKCiAgICBmb3IgKGlEZWNQb3NpdGl2ZSA9IGlEZWMyIC0gMzsgaURlY1Bvc2l0aXZlID4gMDsgaURlY1Bvc2l0aXZlIC09IDMpIHsKICAgICAgc3RyVmFsdWUuSW5zZXJ0KGlEZWNQb3NpdGl2ZSwgY1NlcGVyYXRvcik7CiAgICAgIGlNYXgrKzsKICAgIH0KICB9CiAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAvLyBuZWdhdGl2ZSBtYXJrCiAgaWYgKGlOZWdhdGl2ZSkKICAgIHN0clZhbHVlID0gIi0iICsgc3RyVmFsdWU7CiAgc3RyVmFsdWUgKz0gIiUiOwogIFZhbHVlID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21Mb2NhbChzdHJWYWx1ZSk7CiNlbmRpZgogIHJldHVybiBUUlVFOwp9Ci8vIEFGUGVyY2VudF9LZXlzdHJva2UobkRlYywgc2VwU3R5bGUpCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGUGVyY2VudF9LZXlzdHJva2UoSUZYSlNfQ29udGV4dCogY2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewogIHJldHVybiBBRk51bWJlcl9LZXlzdHJva2UoY2MsIHBhcmFtcywgdlJldCwgc0Vycm9yKTsKfQoKLy8gZnVuY3Rpb24gQUZEYXRlX0Zvcm1hdEV4KGNGb3JtYXQpCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGRGF0ZV9Gb3JtYXRFeChJRlhKU19Db250ZXh0KiBjYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CiAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKICBBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CiAgQ0pTX0V2ZW50SGFuZGxlciogcEV2ZW50ID0gcENvbnRleHQtPkdldEV2ZW50SGFuZGxlcigpOwogIEFTU0VSVChwRXZlbnQgIT0gTlVMTCk7CgogIGlmIChwYXJhbXMuc2l6ZSgpICE9IDEpIHsKICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7CiAgICByZXR1cm4gRkFMU0U7CiAgfQogIGlmICghcEV2ZW50LT5tX3BWYWx1ZSkKICAgIHJldHVybiBGQUxTRTsKCiAgQ0ZYX1dpZGVTdHJpbmcmIHZhbCA9IHBFdmVudC0+VmFsdWUoKTsKICBDRlhfV2lkZVN0cmluZyBzdHJWYWx1ZSA9IHZhbDsKICBpZiAoc3RyVmFsdWUuSXNFbXB0eSgpKQogICAgcmV0dXJuIFRSVUU7CgogIENGWF9XaWRlU3RyaW5nIHNGb3JtYXQgPSBwYXJhbXNbMF0uVG9DRlhXaWRlU3RyaW5nKCk7CiAgRlhfQk9PTCBiV3JvbmdGb3JtYXQgPSBGQUxTRTsKICBkb3VibGUgZERhdGUgPSAwLjBmOwoKICBpZiAoc3RyVmFsdWUuRmluZChMIkdNVCIpICE9IC0xKSB7CiAgICAvLyBmb3IgR01UIGZvcm1hdCB0aW1lCiAgICAvLyBzdWNoIGFzICJUdWUgQXVnIDExIDE0OjI0OjE2IEdNVCswODAwMjAwOSIKICAgIGREYXRlID0gTWFrZUludGVyRGF0ZShzdHJWYWx1ZSk7CiAgfSBlbHNlIHsKICAgIGREYXRlID0gTWFrZVJlZ3VsYXJEYXRlKHN0clZhbHVlLCBzRm9ybWF0LCBiV3JvbmdGb3JtYXQpOwogIH0KCiAgaWYgKEpTX1BvcnRJc05hbihkRGF0ZSkpIHsKICAgIENGWF9XaWRlU3RyaW5nIHN3TXNnOwogICAgc3dNc2cuRm9ybWF0KEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSU0VEQVRFKS5jX3N0cigpLAogICAgICAgICAgICAgICAgIHNGb3JtYXQuY19zdHIoKSk7CiAgICBBbGVydChwQ29udGV4dCwgc3dNc2cuY19zdHIoKSk7CiAgICByZXR1cm4gRkFMU0U7CiAgfQoKICB2YWwgPSBNYWtlRm9ybWF0RGF0ZShkRGF0ZSwgc0Zvcm1hdCk7CiAgcmV0dXJuIFRSVUU7Cn0KCmRvdWJsZSBDSlNfUHVibGljTWV0aG9kczo6TWFrZUludGVyRGF0ZShDRlhfV2lkZVN0cmluZyBzdHJWYWx1ZSkgewogIGludCBuSG91cjsKICBpbnQgbk1pbjsKICBpbnQgblNlYzsKICBpbnQgblllYXI7CiAgaW50IG5Nb250aDsKICBpbnQgbkRheTsKCiAgQ0ZYX1dpZGVTdHJpbmdBcnJheSB3c0FycmF5OwogIENGWF9XaWRlU3RyaW5nIHNNb250aCA9IEwiIjsKICBDRlhfV2lkZVN0cmluZyBzVGVtcCA9IEwiIjsKICBpbnQgblNpemUgPSBzdHJWYWx1ZS5HZXRMZW5ndGgoKTsKCiAgZm9yIChpbnQgaSA9IDA7IGkgPCBuU2l6ZTsgaSsrKSB7CiAgICBGWF9XQ0hBUiBjID0gc3RyVmFsdWUuR2V0QXQoaSk7CiAgICBpZiAoYyA9PSBMJyAnIHx8IGMgPT0gTCc6JykgewogICAgICB3c0FycmF5LkFkZChzVGVtcCk7CiAgICAgIHNUZW1wID0gTCIiOwogICAgICBjb250aW51ZTsKICAgIH0KCiAgICBzVGVtcCArPSBjOwogIH0KCiAgd3NBcnJheS5BZGQoc1RlbXApOwogIGlmICh3c0FycmF5LkdldFNpemUoKSAhPSA4KQogICAgcmV0dXJuIDA7CgogIHNUZW1wID0gd3NBcnJheVsxXTsKICBpZiAoc1RlbXAuQ29tcGFyZShMIkphbiIpID09IDApCiAgICBuTW9udGggPSAxOwogIGlmIChzVGVtcC5Db21wYXJlKEwiRmViIikgPT0gMCkKICAgIG5Nb250aCA9IDI7CiAgaWYgKHNUZW1wLkNvbXBhcmUoTCJNYXIiKSA9PSAwKQogICAgbk1vbnRoID0gMzsKICBpZiAoc1RlbXAuQ29tcGFyZShMIkFwciIpID09IDApCiAgICBuTW9udGggPSA0OwogIGlmIChzVGVtcC5Db21wYXJlKEwiTWF5IikgPT0gMCkKICAgIG5Nb250aCA9IDU7CiAgaWYgKHNUZW1wLkNvbXBhcmUoTCJKdW4iKSA9PSAwKQogICAgbk1vbnRoID0gNjsKICBpZiAoc1RlbXAuQ29tcGFyZShMIkp1bCIpID09IDApCiAgICBuTW9udGggPSA3OwogIGlmIChzVGVtcC5Db21wYXJlKEwiQXVnIikgPT0gMCkKICAgIG5Nb250aCA9IDg7CiAgaWYgKHNUZW1wLkNvbXBhcmUoTCJTZXAiKSA9PSAwKQogICAgbk1vbnRoID0gOTsKICBpZiAoc1RlbXAuQ29tcGFyZShMIk9jdCIpID09IDApCiAgICBuTW9udGggPSAxMDsKICBpZiAoc1RlbXAuQ29tcGFyZShMIk5vdiIpID09IDApCiAgICBuTW9udGggPSAxMTsKICBpZiAoc1RlbXAuQ29tcGFyZShMIkRlYyIpID09IDApCiAgICBuTW9udGggPSAxMjsKCiAgbkRheSA9IChpbnQpUGFyc2VTdHJpbmdUb051bWJlcih3c0FycmF5WzJdLmNfc3RyKCkpOwogIG5Ib3VyID0gKGludClQYXJzZVN0cmluZ1RvTnVtYmVyKHdzQXJyYXlbM10uY19zdHIoKSk7CiAgbk1pbiA9IChpbnQpUGFyc2VTdHJpbmdUb051bWJlcih3c0FycmF5WzRdLmNfc3RyKCkpOwogIG5TZWMgPSAoaW50KVBhcnNlU3RyaW5nVG9OdW1iZXIod3NBcnJheVs1XS5jX3N0cigpKTsKICBuWWVhciA9IChpbnQpUGFyc2VTdHJpbmdUb051bWJlcih3c0FycmF5WzddLmNfc3RyKCkpOwoKICBkb3VibGUgZFJldCA9IEpTX01ha2VEYXRlKEpTX01ha2VEYXkoblllYXIsIG5Nb250aCAtIDEsIG5EYXkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgSlNfTWFrZVRpbWUobkhvdXIsIG5NaW4sIG5TZWMsIDApKTsKCiAgaWYgKEpTX1BvcnRJc05hbihkUmV0KSkgewogICAgZFJldCA9IEpTX0RhdGVQYXJzZShzdHJWYWx1ZS5jX3N0cigpKTsKICB9CgogIHJldHVybiBkUmV0Owp9CgovLyBBRkRhdGVfS2V5c3Ryb2tlRXgoY0Zvcm1hdCkKRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZEYXRlX0tleXN0cm9rZUV4KElGWEpTX0NvbnRleHQqIGNjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKICBDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOwogIEFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKICBDSlNfRXZlbnRIYW5kbGVyKiBwRXZlbnQgPSBwQ29udGV4dC0+R2V0RXZlbnRIYW5kbGVyKCk7CiAgQVNTRVJUKHBFdmVudCAhPSBOVUxMKTsKCiAgaWYgKHBhcmFtcy5zaXplKCkgIT0gMSkgewogICAgc0Vycm9yID0gTCJBRkRhdGVfS2V5c3Ryb2tlRXgncyBwYXJhbWV0ZXJzJyBzaXplIHIgbm90IGNvcnJlY3QiOwogICAgcmV0dXJuIEZBTFNFOwogIH0KCiAgaWYgKHBFdmVudC0+V2lsbENvbW1pdCgpKSB7CiAgICBpZiAoIXBFdmVudC0+bV9wVmFsdWUpCiAgICAgIHJldHVybiBGQUxTRTsKICAgIENGWF9XaWRlU3RyaW5nIHN0clZhbHVlID0gcEV2ZW50LT5WYWx1ZSgpOwogICAgaWYgKHN0clZhbHVlLklzRW1wdHkoKSkKICAgICAgcmV0dXJuIFRSVUU7CgogICAgQ0ZYX1dpZGVTdHJpbmcgc0Zvcm1hdCA9IHBhcmFtc1swXS5Ub0NGWFdpZGVTdHJpbmcoKTsKICAgIEZYX0JPT0wgYldyb25nRm9ybWF0ID0gRkFMU0U7CiAgICBkb3VibGUgZFJldCA9IE1ha2VSZWd1bGFyRGF0ZShzdHJWYWx1ZSwgc0Zvcm1hdCwgYldyb25nRm9ybWF0KTsKICAgIGlmIChiV3JvbmdGb3JtYXQgfHwgSlNfUG9ydElzTmFuKGRSZXQpKSB7CiAgICAgIENGWF9XaWRlU3RyaW5nIHN3TXNnOwogICAgICBzd01zZy5Gb3JtYXQoSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJTRURBVEUpLmNfc3RyKCksCiAgICAgICAgICAgICAgICAgICBzRm9ybWF0LmNfc3RyKCkpOwogICAgICBBbGVydChwQ29udGV4dCwgc3dNc2cuY19zdHIoKSk7CiAgICAgIHBFdmVudC0+UmMoKSA9IEZBTFNFOwogICAgICByZXR1cm4gVFJVRTsKICAgIH0KICB9CiAgcmV0dXJuIFRSVUU7Cn0KCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGRGF0ZV9Gb3JtYXQoSUZYSlNfQ29udGV4dCogY2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewogIHY4OjpJc29sYXRlKiBpc29sYXRlID0gOjpHZXRJc29sYXRlKGNjKTsKCiAgaWYgKHBhcmFtcy5zaXplKCkgIT0gMSkgewogICAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKICAgIEFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKCiAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOwogICAgcmV0dXJuIEZBTFNFOwogIH0KCiAgaW50IGlJbmRleCA9IHBhcmFtc1swXS5Ub0ludCgpOwogIGNvbnN0IEZYX1dDSEFSKiBjRm9ybWF0c1tdID0ge0wibS9kIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMIm0vZC95eSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJtbS9kZC95eSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJtbS95eSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJkLW1tbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJkLW1tbS15eSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJkZC1tbW0teXkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwieXktbW0tZGQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwibW1tLXl5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMIm1tbW0teXkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwibW1tIGQsIHl5eXkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwibW1tbSBkLCB5eXl5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMIm0vZC95eSBoOk1NIHR0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMIm0vZC95eSBISDpNTSJ9OwoKICBpZiAoaUluZGV4IDwgMCB8fCAoc3RhdGljX2Nhc3Q8c2l6ZV90PihpSW5kZXgpID49IEZYX0FycmF5U2l6ZShjRm9ybWF0cykpKQogICAgaUluZGV4ID0gMDsKCiAgQ0pTX1BhcmFtZXRlcnMgbmV3UGFyYW1zOwogIENKU19WYWx1ZSB2YWwoaXNvbGF0ZSwgY0Zvcm1hdHNbaUluZGV4XSk7CiAgbmV3UGFyYW1zLnB1c2hfYmFjayh2YWwpOwogIHJldHVybiBBRkRhdGVfRm9ybWF0RXgoY2MsIG5ld1BhcmFtcywgdlJldCwgc0Vycm9yKTsKfQoKLy8gQUZEYXRlX0tleXN0cm9rZUV4KGNGb3JtYXQpCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGRGF0ZV9LZXlzdHJva2UoSUZYSlNfQ29udGV4dCogY2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewogIHY4OjpJc29sYXRlKiBpc29sYXRlID0gOjpHZXRJc29sYXRlKGNjKTsKCiAgaWYgKHBhcmFtcy5zaXplKCkgIT0gMSkgewogICAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKICAgIEFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKCiAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOwogICAgcmV0dXJuIEZBTFNFOwogIH0KCiAgaW50IGlJbmRleCA9IHBhcmFtc1swXS5Ub0ludCgpOwogIGNvbnN0IEZYX1dDSEFSKiBjRm9ybWF0c1tdID0ge0wibS9kIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMIm0vZC95eSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJtbS9kZC95eSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJtbS95eSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJkLW1tbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJkLW1tbS15eSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJkZC1tbW0teXkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwieXktbW0tZGQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwibW1tLXl5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMIm1tbW0teXkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwibW1tIGQsIHl5eXkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwibW1tbSBkLCB5eXl5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMIm0vZC95eSBoOk1NIHR0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMIm0vZC95eSBISDpNTSJ9OwoKICBpZiAoaUluZGV4IDwgMCB8fCAoc3RhdGljX2Nhc3Q8c2l6ZV90PihpSW5kZXgpID49IEZYX0FycmF5U2l6ZShjRm9ybWF0cykpKQogICAgaUluZGV4ID0gMDsKCiAgQ0pTX1BhcmFtZXRlcnMgbmV3UGFyYW1zOwogIENKU19WYWx1ZSB2YWwoaXNvbGF0ZSwgY0Zvcm1hdHNbaUluZGV4XSk7CiAgbmV3UGFyYW1zLnB1c2hfYmFjayh2YWwpOwogIHJldHVybiBBRkRhdGVfS2V5c3Ryb2tlRXgoY2MsIG5ld1BhcmFtcywgdlJldCwgc0Vycm9yKTsKfQoKLy8gZnVuY3Rpb24gQUZUaW1lX0Zvcm1hdChwdGYpCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGVGltZV9Gb3JtYXQoSUZYSlNfQ29udGV4dCogY2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewogIHY4OjpJc29sYXRlKiBpc29sYXRlID0gOjpHZXRJc29sYXRlKGNjKTsKCiAgaWYgKHBhcmFtcy5zaXplKCkgIT0gMSkgewogICAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKICAgIEFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7CiAgICByZXR1cm4gRkFMU0U7CiAgfQoKICBpbnQgaUluZGV4ID0gcGFyYW1zWzBdLlRvSW50KCk7CiAgY29uc3QgRlhfV0NIQVIqIGNGb3JtYXRzW10gPSB7TCJISDpNTSIsIEwiaDpNTSB0dCIsIEwiSEg6TU06c3MiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwiaDpNTTpzcyB0dCJ9OwoKICBpZiAoaUluZGV4IDwgMCB8fCAoc3RhdGljX2Nhc3Q8c2l6ZV90PihpSW5kZXgpID49IEZYX0FycmF5U2l6ZShjRm9ybWF0cykpKQogICAgaUluZGV4ID0gMDsKCiAgQ0pTX1BhcmFtZXRlcnMgbmV3UGFyYW1zOwogIENKU19WYWx1ZSB2YWwoaXNvbGF0ZSwgY0Zvcm1hdHNbaUluZGV4XSk7CiAgbmV3UGFyYW1zLnB1c2hfYmFjayh2YWwpOwogIHJldHVybiBBRkRhdGVfRm9ybWF0RXgoY2MsIG5ld1BhcmFtcywgdlJldCwgc0Vycm9yKTsKfQoKRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZUaW1lX0tleXN0cm9rZShJRlhKU19Db250ZXh0KiBjYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CiAgdjg6Oklzb2xhdGUqIGlzb2xhdGUgPSA6OkdldElzb2xhdGUoY2MpOwogIGlmIChwYXJhbXMuc2l6ZSgpICE9IDEpIHsKICAgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CiAgICBBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CiAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOwogICAgcmV0dXJuIEZBTFNFOwogIH0KCiAgaW50IGlJbmRleCA9IHBhcmFtc1swXS5Ub0ludCgpOwogIGNvbnN0IEZYX1dDSEFSKiBjRm9ybWF0c1tdID0ge0wiSEg6TU0iLCBMImg6TU0gdHQiLCBMIkhIOk1NOnNzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMImg6TU06c3MgdHQifTsKCiAgaWYgKGlJbmRleCA8IDAgfHwgKHN0YXRpY19jYXN0PHNpemVfdD4oaUluZGV4KSA+PSBGWF9BcnJheVNpemUoY0Zvcm1hdHMpKSkKICAgIGlJbmRleCA9IDA7CgogIENKU19QYXJhbWV0ZXJzIG5ld1BhcmFtczsKICBDSlNfVmFsdWUgdmFsKGlzb2xhdGUsIGNGb3JtYXRzW2lJbmRleF0pOwogIG5ld1BhcmFtcy5wdXNoX2JhY2sodmFsKTsKICByZXR1cm4gQUZEYXRlX0tleXN0cm9rZUV4KGNjLCBuZXdQYXJhbXMsIHZSZXQsIHNFcnJvcik7Cn0KCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGVGltZV9Gb3JtYXRFeChJRlhKU19Db250ZXh0KiBjYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CiAgcmV0dXJuIEFGRGF0ZV9Gb3JtYXRFeChjYywgcGFyYW1zLCB2UmV0LCBzRXJyb3IpOwp9CgpGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRlRpbWVfS2V5c3Ryb2tlRXgoSUZYSlNfQ29udGV4dCogY2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewogIHJldHVybiBBRkRhdGVfS2V5c3Ryb2tlRXgoY2MsIHBhcmFtcywgdlJldCwgc0Vycm9yKTsKfQoKLy8gZnVuY3Rpb24gQUZTcGVjaWFsX0Zvcm1hdChwc2YpCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGU3BlY2lhbF9Gb3JtYXQoSUZYSlNfQ29udGV4dCogY2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewogIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CiAgQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwoKICBpZiAocGFyYW1zLnNpemUoKSAhPSAxKSB7CiAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOwogICAgcmV0dXJuIEZBTFNFOwogIH0KCiAgc3RkOjpzdHJpbmcgY0Zvcm1hdDsKICBpbnQgaUluZGV4ID0gcGFyYW1zWzBdLlRvSW50KCk7CgogIENKU19FdmVudEhhbmRsZXIqIHBFdmVudCA9IHBDb250ZXh0LT5HZXRFdmVudEhhbmRsZXIoKTsKICBBU1NFUlQocEV2ZW50ICE9IE5VTEwpOwoKICBpZiAoIXBFdmVudC0+bV9wVmFsdWUpCiAgICByZXR1cm4gRkFMU0U7CiAgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlID0gcEV2ZW50LT5WYWx1ZSgpOwogIHN0ZDo6c3RyaW5nIHN0clNyYyA9IENGWF9CeXRlU3RyaW5nOjpGcm9tVW5pY29kZShWYWx1ZSkuY19zdHIoKTsKCiAgc3dpdGNoIChpSW5kZXgpIHsKICAgIGNhc2UgMDoKICAgICAgY0Zvcm1hdCA9ICI5OTk5OSI7CiAgICAgIGJyZWFrOwogICAgY2FzZSAxOgogICAgICBjRm9ybWF0ID0gIjk5OTk5LTk5OTkiOwogICAgICBicmVhazsKICAgIGNhc2UgMjogewogICAgICBzdGQ6OnN0cmluZyBOdW1iZXJTdHI7CiAgICAgIHV0aWw6OnByaW50eCgiOTk5OTk5OTk5OSIsIHN0clNyYywgTnVtYmVyU3RyKTsKICAgICAgaWYgKE51bWJlclN0ci5sZW5ndGgoKSA+PSAxMCkKICAgICAgICBjRm9ybWF0ID0gIig5OTkpIDk5OS05OTk5IjsKICAgICAgZWxzZQogICAgICAgIGNGb3JtYXQgPSAiOTk5LTk5OTkiOwogICAgICBicmVhazsKICAgIH0KICAgIGNhc2UgMzoKICAgICAgY0Zvcm1hdCA9ICI5OTktOTktOTk5OSI7CiAgICAgIGJyZWFrOwogIH0KCiAgc3RkOjpzdHJpbmcgc3RyRGVzOwogIHV0aWw6OnByaW50eChjRm9ybWF0LCBzdHJTcmMsIHN0ckRlcyk7CiAgVmFsdWUgPSBDRlhfV2lkZVN0cmluZzo6RnJvbUxvY2FsKHN0ckRlcy5jX3N0cigpKTsKICByZXR1cm4gVFJVRTsKfQoKLy8gZnVuY3Rpb24gQUZTcGVjaWFsX0tleXN0cm9rZUV4KG1hc2spCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGU3BlY2lhbF9LZXlzdHJva2VFeChJRlhKU19Db250ZXh0KiBjYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CiAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKICBBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CiAgQ0pTX0V2ZW50SGFuZGxlciogcEV2ZW50ID0gcENvbnRleHQtPkdldEV2ZW50SGFuZGxlcigpOwoKICBBU1NFUlQocEV2ZW50ICE9IE5VTEwpOwoKICBpZiAocGFyYW1zLnNpemUoKSA8IDEpIHsKICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7CiAgICByZXR1cm4gRkFMU0U7CiAgfQoKICBpZiAoIXBFdmVudC0+bV9wVmFsdWUpCiAgICByZXR1cm4gRkFMU0U7CiAgQ0ZYX1dpZGVTdHJpbmcmIHZhbEV2ZW50ID0gcEV2ZW50LT5WYWx1ZSgpOwoKICBDRlhfV2lkZVN0cmluZyB3c3RyTWFzayA9IHBhcmFtc1swXS5Ub0NGWFdpZGVTdHJpbmcoKTsKICBpZiAod3N0ck1hc2suSXNFbXB0eSgpKQogICAgcmV0dXJuIFRSVUU7CgogIGNvbnN0IHNpemVfdCB3c3RyTWFza0xlbiA9IHdzdHJNYXNrLkdldExlbmd0aCgpOwogIGNvbnN0IHN0ZDo6d3N0cmluZyB3c3RyVmFsdWUgPSB2YWxFdmVudC5jX3N0cigpOwoKICBpZiAocEV2ZW50LT5XaWxsQ29tbWl0KCkpIHsKICAgIGlmICh3c3RyVmFsdWUuZW1wdHkoKSkKICAgICAgcmV0dXJuIFRSVUU7CiAgICBzaXplX3QgaUluZGV4TWFzayA9IDA7CiAgICBmb3IgKGNvbnN0IGF1dG8mIHdfVmFsdWUgOiB3c3RyVmFsdWUpIHsKICAgICAgaWYgKCFtYXNrU2F0aXNmaWVkKHdfVmFsdWUsIHdzdHJNYXNrW2lJbmRleE1hc2tdKSkKICAgICAgICBicmVhazsKICAgICAgaUluZGV4TWFzaysrOwogICAgfQoKICAgIGlmIChpSW5kZXhNYXNrICE9IHdzdHJNYXNrTGVuIHx8CiAgICAgICAgKGlJbmRleE1hc2sgIT0gd3N0clZhbHVlLnNpemUoKSAmJiB3c3RyTWFza0xlbiAhPSAwKSkgewogICAgICBBbGVydCgKICAgICAgICAgIHBDb250ZXh0LAogICAgICAgICAgSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNBRk5VTUJFUl9LRVlTVFJPS0UpLmNfc3RyKCkpOwogICAgICBwRXZlbnQtPlJjKCkgPSBGQUxTRTsKICAgIH0KICAgIHJldHVybiBUUlVFOwogIH0KCiAgQ0ZYX1dpZGVTdHJpbmcmIHdpZGVDaGFuZ2UgPSBwRXZlbnQtPkNoYW5nZSgpOwogIHN0ZDo6d3N0cmluZyB3Q2hhbmdlID0gd2lkZUNoYW5nZS5jX3N0cigpOwogIGlmICh3Q2hhbmdlLmVtcHR5KCkpCiAgICByZXR1cm4gVFJVRTsKCiAgaW50IGlJbmRleE1hc2sgPSBwRXZlbnQtPlNlbFN0YXJ0KCk7CgogIHNpemVfdCBjb21iaW5lZF9sZW4gPSB3c3RyVmFsdWUubGVuZ3RoKCkgKyB3Q2hhbmdlLmxlbmd0aCgpIC0KICAgICAgICAgICAgICAgICAgICAgICAgKHBFdmVudC0+U2VsRW5kKCkgLSBwRXZlbnQtPlNlbFN0YXJ0KCkpOwogIGlmIChjb21iaW5lZF9sZW4gPiB3c3RyTWFza0xlbikgewogICAgQWxlcnQocENvbnRleHQsCiAgICAgICAgICBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNX1RPT0xPTkcpLmNfc3RyKCkpOwogICAgcEV2ZW50LT5SYygpID0gRkFMU0U7CiAgICByZXR1cm4gVFJVRTsKICB9CgogIGlmIChpSW5kZXhNYXNrID49IHdzdHJNYXNrTGVuICYmICghd0NoYW5nZS5lbXB0eSgpKSkgewogICAgQWxlcnQocENvbnRleHQsCiAgICAgICAgICBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNX1RPT0xPTkcpLmNfc3RyKCkpOwogICAgcEV2ZW50LT5SYygpID0gRkFMU0U7CiAgICByZXR1cm4gVFJVRTsKICB9CgogIGZvciAoc3RkOjp3c3RyaW5nOjppdGVyYXRvciBpdCA9IHdDaGFuZ2UuYmVnaW4oKTsgaXQgIT0gd0NoYW5nZS5lbmQoKTsgaXQrKykgewogICAgaWYgKGlJbmRleE1hc2sgPj0gd3N0ck1hc2tMZW4pIHsKICAgICAgQWxlcnQocENvbnRleHQsCiAgICAgICAgICAgIEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1fVE9PTE9ORykuY19zdHIoKSk7CiAgICAgIHBFdmVudC0+UmMoKSA9IEZBTFNFOwogICAgICByZXR1cm4gVFJVRTsKICAgIH0KICAgIHdjaGFyX3Qgd19NYXNrID0gd3N0ck1hc2tbaUluZGV4TWFza107CiAgICBpZiAoIWlzUmVzZXJ2ZWRNYXNrQ2hhcih3X01hc2spKSB7CiAgICAgICppdCA9IHdfTWFzazsKICAgIH0KICAgIHdjaGFyX3Qgd19DaGFuZ2UgPSAqaXQ7CiAgICBpZiAoIW1hc2tTYXRpc2ZpZWQod19DaGFuZ2UsIHdfTWFzaykpIHsKICAgICAgcEV2ZW50LT5SYygpID0gRkFMU0U7CiAgICAgIHJldHVybiBUUlVFOwogICAgfQogICAgaUluZGV4TWFzaysrOwogIH0KCiAgd2lkZUNoYW5nZSA9IHdDaGFuZ2UuY19zdHIoKTsKICByZXR1cm4gVFJVRTsKfQoKLy8gZnVuY3Rpb24gQUZTcGVjaWFsX0tleXN0cm9rZShwc2YpCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGU3BlY2lhbF9LZXlzdHJva2UoSUZYSlNfQ29udGV4dCogY2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewogIHY4OjpJc29sYXRlKiBpc29sYXRlID0gOjpHZXRJc29sYXRlKGNjKTsKCiAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKICBBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CiAgQ0pTX0V2ZW50SGFuZGxlciogcEV2ZW50ID0gcENvbnRleHQtPkdldEV2ZW50SGFuZGxlcigpOwogIEFTU0VSVChwRXZlbnQgIT0gTlVMTCk7CgogIGlmIChwYXJhbXMuc2l6ZSgpICE9IDEpIHsKICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7CiAgICByZXR1cm4gRkFMU0U7CiAgfQoKICBzdGQ6OnN0cmluZyBjRm9ybWF0OwogIGludCBpSW5kZXggPSBwYXJhbXNbMF0uVG9JbnQoKTsKCiAgaWYgKCFwRXZlbnQtPm1fcFZhbHVlKQogICAgcmV0dXJuIEZBTFNFOwogIC8vIENKU19WYWx1ZSB2YWwgPSBwRXZlbnQtPlZhbHVlKCk7CiAgQ0ZYX1dpZGVTdHJpbmcmIHZhbCA9IHBFdmVudC0+VmFsdWUoKTsKICBzdGQ6OnN0cmluZyBzdHJTcmMgPSBDRlhfQnl0ZVN0cmluZzo6RnJvbVVuaWNvZGUodmFsKS5jX3N0cigpOwogIHN0ZDo6d3N0cmluZyB3c3RyQ2hhbmdlID0gcEV2ZW50LT5DaGFuZ2UoKS5jX3N0cigpOwoKICBzd2l0Y2ggKGlJbmRleCkgewogICAgY2FzZSAwOgogICAgICBjRm9ybWF0ID0gIjk5OTk5IjsKICAgICAgYnJlYWs7CiAgICBjYXNlIDE6CiAgICAgIC8vIGNGb3JtYXQgPSAiOTk5OTktOTk5OSI7CiAgICAgIGNGb3JtYXQgPSAiOTk5OTk5OTk5IjsKICAgICAgYnJlYWs7CiAgICBjYXNlIDI6IHsKICAgICAgc3RkOjpzdHJpbmcgTnVtYmVyU3RyOwogICAgICB1dGlsOjpwcmludHgoIjk5OTk5OTk5OTkiLCBzdHJTcmMsIE51bWJlclN0cik7CiAgICAgIGlmIChzdHJTcmMubGVuZ3RoKCkgKyB3c3RyQ2hhbmdlLmxlbmd0aCgpID4gNykKICAgICAgICAvLyBjRm9ybWF0ID0gIig5OTkpIDk5OS05OTk5IjsKICAgICAgICBjRm9ybWF0ID0gIjk5OTk5OTk5OTkiOwogICAgICBlbHNlCiAgICAgICAgLy8gY0Zvcm1hdCA9ICI5OTktOTk5OSI7CiAgICAgICAgY0Zvcm1hdCA9ICI5OTk5OTk5IjsKICAgICAgYnJlYWs7CiAgICB9CiAgICBjYXNlIDM6CiAgICAgIC8vIGNGb3JtYXQgPSAiOTk5LTk5LTk5OTkiOwogICAgICBjRm9ybWF0ID0gIjk5OTk5OTk5OSI7CiAgICAgIGJyZWFrOwogIH0KCiAgQ0pTX1BhcmFtZXRlcnMgcGFyYW1zMjsKICBDSlNfVmFsdWUgdk1hc2soaXNvbGF0ZSwgY0Zvcm1hdC5jX3N0cigpKTsKICBwYXJhbXMyLnB1c2hfYmFjayh2TWFzayk7CgogIHJldHVybiBBRlNwZWNpYWxfS2V5c3Ryb2tlRXgoY2MsIHBhcmFtczIsIHZSZXQsIHNFcnJvcik7Cn0KCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGTWVyZ2VDaGFuZ2UoSUZYSlNfQ29udGV4dCogY2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewogIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CiAgQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwogIENKU19FdmVudEhhbmRsZXIqIHBFdmVudEhhbmRsZXIgPSBwQ29udGV4dC0+R2V0RXZlbnRIYW5kbGVyKCk7CiAgQVNTRVJUKHBFdmVudEhhbmRsZXIgIT0gTlVMTCk7CgogIGlmIChwYXJhbXMuc2l6ZSgpICE9IDEpIHsKICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7CiAgICByZXR1cm4gRkFMU0U7CiAgfQoKICBDRlhfV2lkZVN0cmluZyBzd1ZhbHVlOwogIGlmIChwRXZlbnRIYW5kbGVyLT5tX3BWYWx1ZSAhPSBOVUxMKQogICAgc3dWYWx1ZSA9IHBFdmVudEhhbmRsZXItPlZhbHVlKCk7CgogIGlmIChwRXZlbnRIYW5kbGVyLT5XaWxsQ29tbWl0KCkpIHsKICAgIHZSZXQgPSBzd1ZhbHVlLmNfc3RyKCk7CiAgICByZXR1cm4gVFJVRTsKICB9CgogIENGWF9XaWRlU3RyaW5nIHByZWZpeCwgcG9zdGZpeDsKCiAgaWYgKHBFdmVudEhhbmRsZXItPlNlbFN0YXJ0KCkgPj0gMCkKICAgIHByZWZpeCA9IHN3VmFsdWUuTWlkKDAsIHBFdmVudEhhbmRsZXItPlNlbFN0YXJ0KCkpOwogIGVsc2UKICAgIHByZWZpeCA9IEwiIjsKCiAgaWYgKHBFdmVudEhhbmRsZXItPlNlbEVuZCgpID49IDAgJiYKICAgICAgcEV2ZW50SGFuZGxlci0+U2VsRW5kKCkgPD0gc3dWYWx1ZS5HZXRMZW5ndGgoKSkKICAgIHBvc3RmaXggPSBzd1ZhbHVlLk1pZChwRXZlbnRIYW5kbGVyLT5TZWxFbmQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBzd1ZhbHVlLkdldExlbmd0aCgpIC0gcEV2ZW50SGFuZGxlci0+U2VsRW5kKCkpOwogIGVsc2UKICAgIHBvc3RmaXggPSBMIiI7CgogIHZSZXQgPSAocHJlZml4ICsgcEV2ZW50SGFuZGxlci0+Q2hhbmdlKCkgKyBwb3N0Zml4KS5jX3N0cigpOwoKICByZXR1cm4gVFJVRTsKfQoKRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZQYXJzZURhdGVFeChJRlhKU19Db250ZXh0KiBjYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CiAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKICBBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CgogIGlmIChwYXJhbXMuc2l6ZSgpICE9IDIpIHsKICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7CiAgICByZXR1cm4gRkFMU0U7CiAgfQoKICBDRlhfV2lkZVN0cmluZyBzVmFsdWUgPSBwYXJhbXNbMF0uVG9DRlhXaWRlU3RyaW5nKCk7CiAgQ0ZYX1dpZGVTdHJpbmcgc0Zvcm1hdCA9IHBhcmFtc1sxXS5Ub0NGWFdpZGVTdHJpbmcoKTsKCiAgRlhfQk9PTCBiV3JvbmdGb3JtYXQgPSBGQUxTRTsKICBkb3VibGUgZERhdGUgPSBNYWtlUmVndWxhckRhdGUoc1ZhbHVlLCBzRm9ybWF0LCBiV3JvbmdGb3JtYXQpOwoKICBpZiAoSlNfUG9ydElzTmFuKGREYXRlKSkgewogICAgQ0ZYX1dpZGVTdHJpbmcgc3dNc2c7CiAgICBzd01zZy5Gb3JtYXQoSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJTRURBVEUpLmNfc3RyKCksCiAgICAgICAgICAgICAgICAgc0Zvcm1hdC5jX3N0cigpKTsKICAgIEFsZXJ0KChDSlNfQ29udGV4dCopY2MsIHN3TXNnLmNfc3RyKCkpOwogICAgcmV0dXJuIEZBTFNFOwogIH0KCiAgdlJldCA9IGREYXRlOwogIHJldHVybiBUUlVFOwp9CgpGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRlNpbXBsZShJRlhKU19Db250ZXh0KiBjYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CiAgaWYgKHBhcmFtcy5zaXplKCkgIT0gMykgewogICAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKICAgIEFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKCiAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOwogICAgcmV0dXJuIEZBTFNFOwogIH0KCiAgdlJldCA9IChkb3VibGUpQUZfU2ltcGxlKHBhcmFtc1swXS5Ub0NGWFdpZGVTdHJpbmcoKS5jX3N0cigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXNbMV0uVG9Eb3VibGUoKSwgcGFyYW1zWzJdLlRvRG91YmxlKCkpOwogIHJldHVybiBUUlVFOwp9CgpGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRk1ha2VOdW1iZXIoSUZYSlNfQ29udGV4dCogY2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewogIGlmIChwYXJhbXMuc2l6ZSgpICE9IDEpIHsKICAgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CiAgICBBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CgogICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKICAgIHJldHVybiBGQUxTRTsKICB9CiAgdlJldCA9IFBhcnNlU3RyaW5nVG9OdW1iZXIocGFyYW1zWzBdLlRvQ0ZYV2lkZVN0cmluZygpLmNfc3RyKCkpOwogIHJldHVybiBUUlVFOwp9CgpGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRlNpbXBsZV9DYWxjdWxhdGUoSUZYSlNfQ29udGV4dCogY2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewogIHY4OjpJc29sYXRlKiBpc29sYXRlID0gOjpHZXRJc29sYXRlKGNjKTsKCiAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKICBBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CgogIGlmIChwYXJhbXMuc2l6ZSgpICE9IDIpIHsKICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7CiAgICByZXR1cm4gRkFMU0U7CiAgfQoKICBDSlNfVmFsdWUgcGFyYW1zMSA9IHBhcmFtc1sxXTsKCiAgaWYgKCFwYXJhbXMxLklzQXJyYXlPYmplY3QoKSAmJiBwYXJhbXMxLkdldFR5cGUoKSAhPSBDSlNfVmFsdWU6OlZUX3N0cmluZykgewogICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKICAgIHJldHVybiBGQUxTRTsKICB9CgogIENQREZTREtfRG9jdW1lbnQqIHBSZWFkZXJEb2MgPSBwQ29udGV4dC0+R2V0UmVhZGVyRG9jdW1lbnQoKTsKICBBU1NFUlQocFJlYWRlckRvYyAhPSBOVUxMKTsKCiAgQ1BERlNES19JbnRlckZvcm0qIHBSZWFkZXJJbnRlckZvcm0gPSBwUmVhZGVyRG9jLT5HZXRJbnRlckZvcm0oKTsKICBBU1NFUlQocFJlYWRlckludGVyRm9ybSAhPSBOVUxMKTsKCiAgQ1BERl9JbnRlckZvcm0qIHBJbnRlckZvcm0gPSBwUmVhZGVySW50ZXJGb3JtLT5HZXRJbnRlckZvcm0oKTsKICBBU1NFUlQocEludGVyRm9ybSAhPSBOVUxMKTsKCiAgZG91YmxlIGRWYWx1ZTsKICBDRlhfV2lkZVN0cmluZyBzRnVuY3Rpb24gPSBwYXJhbXNbMF0uVG9DRlhXaWRlU3RyaW5nKCk7CiAgaWYgKHdjc2NtcChzRnVuY3Rpb24uY19zdHIoKSwgTCJQUkQiKSA9PSAwKQogICAgZFZhbHVlID0gMS4wOwogIGVsc2UKICAgIGRWYWx1ZSA9IDAuMDsKCiAgQ0pTX0FycmF5IEZpZWxkTmFtZUFycmF5ID0gQUZfTWFrZUFycmF5RnJvbUxpc3QoaXNvbGF0ZSwgcGFyYW1zMSk7CgogIGludCBuRmllbGRzQ291bnQgPSAwOwoKICBmb3IgKGludCBpID0gMCwgaXN6ID0gRmllbGROYW1lQXJyYXkuR2V0TGVuZ3RoKCk7IGkgPCBpc3o7IGkrKykgewogICAgQ0pTX1ZhbHVlIGpzVmFsdWUoaXNvbGF0ZSk7CiAgICBGaWVsZE5hbWVBcnJheS5HZXRFbGVtZW50KGksIGpzVmFsdWUpOwogICAgQ0ZYX1dpZGVTdHJpbmcgd3NGaWVsZE5hbWUgPSBqc1ZhbHVlLlRvQ0ZYV2lkZVN0cmluZygpOwoKICAgIGZvciAoaW50IGogPSAwLCBqc3ogPSBwSW50ZXJGb3JtLT5Db3VudEZpZWxkcyh3c0ZpZWxkTmFtZSk7IGogPCBqc3o7IGorKykgewogICAgICBpZiAoQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSBwSW50ZXJGb3JtLT5HZXRGaWVsZChqLCB3c0ZpZWxkTmFtZSkpIHsKICAgICAgICBkb3VibGUgZFRlbXAgPSAwLjA7CgogICAgICAgIHN3aXRjaCAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkpIHsKICAgICAgICAgIGNhc2UgRklFTERUWVBFX1RFWFRGSUVMRDoKICAgICAgICAgIGNhc2UgRklFTERUWVBFX0NPTUJPQk9YOiB7CiAgICAgICAgICAgIGRUZW1wID0gUGFyc2VTdHJpbmdUb051bWJlcihwRm9ybUZpZWxkLT5HZXRWYWx1ZSgpLmNfc3RyKCkpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGNhc2UgRklFTERUWVBFX1BVU0hCVVRUT046IHsKICAgICAgICAgICAgZFRlbXAgPSAwLjA7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgY2FzZSBGSUVMRFRZUEVfQ0hFQ0tCT1g6CiAgICAgICAgICBjYXNlIEZJRUxEVFlQRV9SQURJT0JVVFRPTjogewogICAgICAgICAgICBkVGVtcCA9IDAuMDsKICAgICAgICAgICAgZm9yIChpbnQgYyA9IDAsIGNzeiA9IHBGb3JtRmllbGQtPkNvdW50Q29udHJvbHMoKTsgYyA8IGNzejsgYysrKSB7CiAgICAgICAgICAgICAgaWYgKENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ3RybCA9IHBGb3JtRmllbGQtPkdldENvbnRyb2woYykpIHsKICAgICAgICAgICAgICAgIGlmIChwRm9ybUN0cmwtPklzQ2hlY2tlZCgpKSB7CiAgICAgICAgICAgICAgICAgIGRUZW1wICs9CiAgICAgICAgICAgICAgICAgICAgICBQYXJzZVN0cmluZ1RvTnVtYmVyKHBGb3JtQ3RybC0+R2V0RXhwb3J0VmFsdWUoKS5jX3N0cigpKTsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgY2FzZSBGSUVMRFRZUEVfTElTVEJPWDogewogICAgICAgICAgICBkVGVtcCA9IDAuMDsKICAgICAgICAgICAgaWYgKHBGb3JtRmllbGQtPkNvdW50U2VsZWN0ZWRJdGVtcygpID4gMSkKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgZFRlbXAgPSBQYXJzZVN0cmluZ1RvTnVtYmVyKHBGb3JtRmllbGQtPkdldFZhbHVlKCkuY19zdHIoKSk7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCiAgICAgICAgaWYgKGkgPT0gMCAmJiBqID09IDAgJiYgKHdjc2NtcChzRnVuY3Rpb24uY19zdHIoKSwgTCJNSU4iKSA9PSAwIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdjc2NtcChzRnVuY3Rpb24uY19zdHIoKSwgTCJNQVgiKSA9PSAwKSkKICAgICAgICAgIGRWYWx1ZSA9IGRUZW1wOwoKICAgICAgICBkVmFsdWUgPSBBRl9TaW1wbGUoc0Z1bmN0aW9uLmNfc3RyKCksIGRWYWx1ZSwgZFRlbXApOwoKICAgICAgICBuRmllbGRzQ291bnQrKzsKICAgICAgfQogICAgfQogIH0KCiAgaWYgKHdjc2NtcChzRnVuY3Rpb24uY19zdHIoKSwgTCJBVkciKSA9PSAwICYmIG5GaWVsZHNDb3VudCA+IDApCiAgICBkVmFsdWUgLz0gbkZpZWxkc0NvdW50OwoKICBkVmFsdWUgPSAoZG91YmxlKWZsb29yKGRWYWx1ZSAqIEZYU1lTX3BvdygoZG91YmxlKTEwLCAoZG91YmxlKTYpICsgMC40OSkgLwogICAgICAgICAgIEZYU1lTX3BvdygoZG91YmxlKTEwLCAoZG91YmxlKTYpOwogIENKU19WYWx1ZSBqc1ZhbHVlKGlzb2xhdGUsIGRWYWx1ZSk7CiAgaWYgKHBDb250ZXh0LT5HZXRFdmVudEhhbmRsZXIoKS0+bV9wVmFsdWUpCiAgICBwQ29udGV4dC0+R2V0RXZlbnRIYW5kbGVyKCktPlZhbHVlKCkgPSBqc1ZhbHVlLlRvQ0ZYV2lkZVN0cmluZygpOwoKICByZXR1cm4gVFJVRTsKfQoKLyogVGhpcyBmdW5jdGlvbiB2YWxpZGF0ZXMgdGhlIGN1cnJlbnQgZXZlbnQgdG8gZW5zdXJlIHRoYXQgaXRzIHZhbHVlIGlzCioqIHdpdGhpbiB0aGUgc3BlY2lmaWVkIHJhbmdlLiAqLwoKRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZSYW5nZV9WYWxpZGF0ZShJRlhKU19Db250ZXh0KiBjYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7CiAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKICBBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CiAgQ0pTX0V2ZW50SGFuZGxlciogcEV2ZW50ID0gcENvbnRleHQtPkdldEV2ZW50SGFuZGxlcigpOwogIEFTU0VSVChwRXZlbnQgIT0gTlVMTCk7CgogIGlmIChwYXJhbXMuc2l6ZSgpICE9IDQpIHsKICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7CiAgICByZXR1cm4gRkFMU0U7CiAgfQoKICBpZiAoIXBFdmVudC0+bV9wVmFsdWUpCiAgICByZXR1cm4gRkFMU0U7CiAgaWYgKHBFdmVudC0+VmFsdWUoKS5Jc0VtcHR5KCkpCiAgICByZXR1cm4gVFJVRTsKICBkb3VibGUgZEVlbnRWYWx1ZSA9IGF0b2YoQ0ZYX0J5dGVTdHJpbmc6OkZyb21Vbmljb2RlKHBFdmVudC0+VmFsdWUoKSkpOwogIEZYX0JPT0wgYkdyZWF0ZXJUaGFuID0gcGFyYW1zWzBdLlRvQm9vbCgpOwogIGRvdWJsZSBkR3JlYXRlclRoYW4gPSBwYXJhbXNbMV0uVG9Eb3VibGUoKTsKICBGWF9CT09MIGJMZXNzVGhhbiA9IHBhcmFtc1syXS5Ub0Jvb2woKTsKICBkb3VibGUgZExlc3NUaGFuID0gcGFyYW1zWzNdLlRvRG91YmxlKCk7CiAgQ0ZYX1dpZGVTdHJpbmcgc3dNc2c7CgogIGlmIChiR3JlYXRlclRoYW4gJiYgYkxlc3NUaGFuKSB7CiAgICBpZiAoZEVlbnRWYWx1ZSA8IGRHcmVhdGVyVGhhbiB8fCBkRWVudFZhbHVlID4gZExlc3NUaGFuKQogICAgICBzd01zZy5Gb3JtYXQoSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNSQU5HRTEpLmNfc3RyKCksCiAgICAgICAgICAgICAgICAgICBwYXJhbXNbMV0uVG9DRlhXaWRlU3RyaW5nKCkuY19zdHIoKSwKICAgICAgICAgICAgICAgICAgIHBhcmFtc1szXS5Ub0NGWFdpZGVTdHJpbmcoKS5jX3N0cigpKTsKICB9IGVsc2UgaWYgKGJHcmVhdGVyVGhhbikgewogICAgaWYgKGRFZW50VmFsdWUgPCBkR3JlYXRlclRoYW4pCiAgICAgIHN3TXNnLkZvcm1hdChKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1JBTkdFMikuY19zdHIoKSwKICAgICAgICAgICAgICAgICAgIHBhcmFtc1sxXS5Ub0NGWFdpZGVTdHJpbmcoKS5jX3N0cigpKTsKICB9IGVsc2UgaWYgKGJMZXNzVGhhbikgewogICAgaWYgKGRFZW50VmFsdWUgPiBkTGVzc1RoYW4pCiAgICAgIHN3TXNnLkZvcm1hdChKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1JBTkdFMykuY19zdHIoKSwKICAgICAgICAgICAgICAgICAgIHBhcmFtc1szXS5Ub0NGWFdpZGVTdHJpbmcoKS5jX3N0cigpKTsKICB9CgogIGlmICghc3dNc2cuSXNFbXB0eSgpKSB7CiAgICBBbGVydChwQ29udGV4dCwgc3dNc2cuY19zdHIoKSk7CiAgICBwRXZlbnQtPlJjKCkgPSBGQUxTRTsKICB9CiAgcmV0dXJuIFRSVUU7Cn0KCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGRXh0cmFjdE51bXMoSUZYSlNfQ29udGV4dCogY2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewogIHY4OjpJc29sYXRlKiBpc29sYXRlID0gOjpHZXRJc29sYXRlKGNjKTsKICBDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQqKWNjOwogIEFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKCiAgaWYgKHBhcmFtcy5zaXplKCkgIT0gMSkgewogICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKICAgIHJldHVybiBGQUxTRTsKICB9CgogIENKU19BcnJheSBudW1zKGlzb2xhdGUpOwoKICBDRlhfV2lkZVN0cmluZyBzdHIgPSBwYXJhbXNbMF0uVG9DRlhXaWRlU3RyaW5nKCk7CiAgQ0ZYX1dpZGVTdHJpbmcgc1BhcnQ7CgogIGlmIChzdHIuR2V0QXQoMCkgPT0gTCcuJyB8fCBzdHIuR2V0QXQoMCkgPT0gTCcsJykKICAgIHN0ciA9IEwiMCIgKyBzdHI7CgogIGludCBuSW5kZXggPSAwOwogIGZvciAoaW50IGkgPSAwLCBzeiA9IHN0ci5HZXRMZW5ndGgoKTsgaSA8IHN6OyBpKyspIHsKICAgIEZYX1dDSEFSIHdjID0gc3RyLkdldEF0KGkpOwogICAgaWYgKElzRGlnaXQoKHdjaGFyX3Qpd2MpKSB7CiAgICAgIHNQYXJ0ICs9IHdjOwogICAgfSBlbHNlIHsKICAgICAgaWYgKHNQYXJ0LkdldExlbmd0aCgpID4gMCkgewogICAgICAgIG51bXMuU2V0RWxlbWVudChuSW5kZXgsIENKU19WYWx1ZShpc29sYXRlLCBzUGFydC5jX3N0cigpKSk7CiAgICAgICAgc1BhcnQgPSBMIiI7CiAgICAgICAgbkluZGV4Kys7CiAgICAgIH0KICAgIH0KICB9CgogIGlmIChzUGFydC5HZXRMZW5ndGgoKSA+IDApIHsKICAgIG51bXMuU2V0RWxlbWVudChuSW5kZXgsIENKU19WYWx1ZShpc29sYXRlLCBzUGFydC5jX3N0cigpKSk7CiAgfQoKICBpZiAobnVtcy5HZXRMZW5ndGgoKSA+IDApCiAgICB2UmV0ID0gbnVtczsKICBlbHNlCiAgICB2UmV0LlNldE51bGwoKTsKCiAgcmV0dXJuIFRSVUU7Cn0K