Ly8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KCi8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCgojaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L0phdmFTY3JpcHQuaCIKI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvamF2YXNjcmlwdC9JSmF2YVNjcmlwdC5oIgojaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L0pTX0RlZmluZS5oIgojaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L0pTX09iamVjdC5oIgojaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L0pTX1ZhbHVlLmgiCiNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2phdmFzY3JpcHQvUHVibGljTWV0aG9kcy5oIgojaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L0pTX0V2ZW50SGFuZGxlci5oIgojaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L3Jlc291cmNlLmgiCiNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2phdmFzY3JpcHQvSlNfQ29udGV4dC5oIgojaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L0pTX1ZhbHVlLmgiCiNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2phdmFzY3JpcHQvdXRpbC5oIgojaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9qYXZhc2NyaXB0L0ZpZWxkLmgiCiNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2phdmFzY3JpcHQvY29sb3IuaCIKI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvamF2YXNjcmlwdC9KU19SdW50aW1lLmgiCgpzdGF0aWMgdjg6Oklzb2xhdGUqIEdldElzb2xhdGUoSUZYSlNfQ29udGV4dCogY2MpCnsKICAgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCAqKWNjOwogICAgQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwoKICAgIENKU19SdW50aW1lKiBwUnVudGltZSA9IHBDb250ZXh0LT5HZXRKU1J1bnRpbWUoKTsKICAgIEFTU0VSVChwUnVudGltZSAhPSBOVUxMKTsKCiAgICByZXR1cm4gcFJ1bnRpbWUtPkdldElzb2xhdGUoKTsKfQoKCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENKU19QdWJsaWNNZXRob2RzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgojZGVmaW5lIERPVUJMRV9DT1JSRUNUICAwLjAwMDAwMDAwMDAwMDAwMQoKQkVHSU5fSlNfU1RBVElDX0dMT0JBTF9GVU4oQ0pTX1B1YmxpY01ldGhvZHMpCiAgICBKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRk51bWJlcl9Gb3JtYXQpCiAgICBKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRk51bWJlcl9LZXlzdHJva2UpCiAgICBKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRlBlcmNlbnRfRm9ybWF0KQogICAgSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZQZXJjZW50X0tleXN0cm9rZSkKICAgIEpTX1NUQVRJQ19HTE9CQUxfRlVOX0VOVFJZKEFGRGF0ZV9Gb3JtYXRFeCkKICAgIEpTX1NUQVRJQ19HTE9CQUxfRlVOX0VOVFJZKEFGRGF0ZV9LZXlzdHJva2VFeCkKICAgIEpTX1NUQVRJQ19HTE9CQUxfRlVOX0VOVFJZKEFGRGF0ZV9Gb3JtYXQpCiAgICBKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRkRhdGVfS2V5c3Ryb2tlKQogICAgSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZUaW1lX0Zvcm1hdEV4KQogICAgSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZUaW1lX0tleXN0cm9rZUV4KQogICAgSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZUaW1lX0Zvcm1hdCkKICAgIEpTX1NUQVRJQ19HTE9CQUxfRlVOX0VOVFJZKEFGVGltZV9LZXlzdHJva2UpCiAgICBKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRlNwZWNpYWxfRm9ybWF0KQogICAgSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZTcGVjaWFsX0tleXN0cm9rZSkKICAgIEpTX1NUQVRJQ19HTE9CQUxfRlVOX0VOVFJZKEFGU3BlY2lhbF9LZXlzdHJva2VFeCkKICAgIEpTX1NUQVRJQ19HTE9CQUxfRlVOX0VOVFJZKEFGU2ltcGxlKQogICAgSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZNYWtlTnVtYmVyKQogICAgSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZTaW1wbGVfQ2FsY3VsYXRlKQogICAgSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZSYW5nZV9WYWxpZGF0ZSkKICAgIEpTX1NUQVRJQ19HTE9CQUxfRlVOX0VOVFJZKEFGTWVyZ2VDaGFuZ2UpCiAgICBKU19TVEFUSUNfR0xPQkFMX0ZVTl9FTlRSWShBRlBhcnNlRGF0ZUV4KQogICAgSlNfU1RBVElDX0dMT0JBTF9GVU5fRU5UUlkoQUZFeHRyYWN0TnVtcykKRU5EX0pTX1NUQVRJQ19HTE9CQUxfRlVOKCkKCklNUExFTUVOVF9KU19TVEFUSUNfR0xPQkFMX0ZVTihDSlNfUHVibGljTWV0aG9kcykKCnN0YXRpYyBjb25zdCBGWF9XQ0hBUiogbW9udGhzW10gPQp7CiAgICBMIkphbiIsIEwiRmViIiwgTCJNYXIiLCBMIkFwciIsIEwiTWF5IiwgTCJKdW4iLCBMIkp1bCIsIEwiQXVnIiwgTCJTZXAiLCBMIk9jdCIsIEwiTm92IiwgTCJEZWMiCn07CgpzdGF0aWMgY29uc3QgRlhfV0NIQVIqIGZ1bGxtb250aHNbXSA9CnsKICAgIEwiSmFudWFyeSIsIEwiRmVicnVhcnkiLCBMIk1hcmNoIiwgTCJBcHJpbCIsIEwiTWF5IiwgTCJKdW5lIiwgTCJKdWx5IiwgTCJBdWd1c3QiLCBMIlNlcHRlbWJlciIsIEwiT2N0b2JlciIsIEwiTm92ZW1iZXIiLCBMIkRlY2VtYmVyIgp9OwoKRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6SXNOdW1iZXIoY29uc3QgRlhfV0NIQVIqIHN0cmluZykKewogICAgQ0ZYX1dpZGVTdHJpbmcgc1RyaW0gPSBTdHJUcmltKHN0cmluZyk7CiAgICBjb25zdCBGWF9XQ0hBUiogcFRyaW0gPSBzVHJpbS5jX3N0cigpOwogICAgY29uc3QgRlhfV0NIQVIqIHAgPSBwVHJpbTsKCgogICAgRlhfQk9PTCBiRG90ID0gRkFMU0U7CiAgICBGWF9CT09MIGJLWEpTID0gRkFMU0U7CgogICAgd2NoYXJfdCBjOwogICAgd2hpbGUgKChjID0gKnApKQogICAgewogICAgICAgIGlmIChjID09ICcuJyB8fCBjID09ICcsJykKICAgICAgICB7CiAgICAgICAgICAgIGlmIChiRG90KSByZXR1cm4gRkFMU0U7CiAgICAgICAgICAgIGJEb3QgPSBUUlVFOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChjID09ICctJyB8fCBjID09ICcrJykKICAgICAgICB7CiAgICAgICAgICAgIGlmIChwICE9IHBUcmltKQogICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChjID09ICdlJyB8fCBjID09ICdFJykKICAgICAgICB7CiAgICAgICAgICAgIGlmIChiS1hKUykKICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKCiAgICAgICAgICAgIHArKzsKICAgICAgICAgICAgYyA9ICpwOwogICAgICAgICAgICBpZiAoYyA9PSAnKycgfHwgYyA9PSAnLScpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGJLWEpTID0gVFJVRTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIGlmICghSXNEaWdpdChjKSkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICB9CiAgICAgICAgcCsrOwogICAgfQoKICAgIHJldHVybiBUUlVFOwp9CgpGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpJc0RpZ2l0KHdjaGFyX3QgY2gpCnsKICAgIHJldHVybiAoY2ggPj0gTCcwJyAmJiBjaCA8PSBMJzknKTsKfQoKRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6SXNEaWdpdChjaGFyIGNoKQp7CiAgICByZXR1cm4gKGNoID49ICcwJyAmJiBjaCA8PSAnOScpOwp9CgpGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpJc0FscGhhYmV0aWMod2NoYXJfdCBjaCkKewogICAgcmV0dXJuICgoY2ggPj0gTCdhJyAmJiBjaCA8PSBMJ3onKSB8fCAoY2ggPj0gTCdBJyAmJiBjaCA8PSBMJ1onKSk7Cn0KCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OklzQWxwaGFOdW1lcmljKHdjaGFyX3QgY2gpCnsKICAgIHJldHVybiAoSXNEaWdpdChjaCkgfHwgSXNBbHBoYWJldGljKGNoKSk7Cn0KCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6Om1hc2tTYXRpc2ZpZWQod2NoYXJfdCBjX0NoYW5nZSx3Y2hhcl90IGNfTWFzaykKewogICAgc3dpdGNoIChjX01hc2spCiAgICB7CiAgICBjYXNlIEwnOSc6CiAgICAgICAgcmV0dXJuIElzRGlnaXQoY19DaGFuZ2UpOwogICAgY2FzZSBMJ0EnOgogICAgICAgIHJldHVybiBJc0FscGhhYmV0aWMoY19DaGFuZ2UpOwogICAgY2FzZSBMJ08nOgogICAgICAgIHJldHVybiBJc0FscGhhTnVtZXJpYyhjX0NoYW5nZSk7CiAgICBjYXNlIEwnWCc6CiAgICAgICAgcmV0dXJuIFRSVUU7CiAgICBkZWZhdWx0OgogICAgICAgIHJldHVybiAoY19DaGFuZ2UgPT0gY19NYXNrKTsKICAgIH0KfQoKRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6aXNSZXNlcnZlZE1hc2tDaGFyKHdjaGFyX3QgY2gpCnsKICAgIHJldHVybiBjaCA9PSBMJzknIHx8IGNoID09IEwnQScgfHwgY2ggPT0gTCdPJyB8fCBjaCA9PSBMJ1gnOwp9Cgpkb3VibGUgQ0pTX1B1YmxpY01ldGhvZHM6OkFGX1NpbXBsZShjb25zdCBGWF9XQ0hBUiogc0Z1Y3Rpb24sIGRvdWJsZSBkVmFsdWUxLCBkb3VibGUgZFZhbHVlMikKewogICAgaWYgKEZYU1lTX3djc2ljbXAoc0Z1Y3Rpb24sTCJBVkciKSA9PSAwIHx8IEZYU1lTX3djc2ljbXAoc0Z1Y3Rpb24sTCJTVU0iKSA9PSAwKQogICAgewogICAgICAgIHJldHVybiBkVmFsdWUxICsgZFZhbHVlMjsKICAgIH0KICAgIGlmIChGWFNZU193Y3NpY21wKHNGdWN0aW9uLCBMIlBSRCIpID09IDApCiAgICB7CiAgICAgICAgcmV0dXJuIGRWYWx1ZTEgKiBkVmFsdWUyOwogICAgfQogICAgaWYgKEZYU1lTX3djc2ljbXAoc0Z1Y3Rpb24sTCJNSU4iKSA9PSAwKQogICAgewogICAgICAgIHJldHVybiBGWF9NSU4oZFZhbHVlMSwgZFZhbHVlMik7CiAgICB9CiAgICBpZiAoRlhTWVNfd2NzaWNtcChzRnVjdGlvbixMIk1BWCIpID09IDApCiAgICB7CiAgICAgICAgcmV0dXJuIEZYX01BWChkVmFsdWUxLCBkVmFsdWUyKTsKICAgIH0KICAgIHJldHVybiBkVmFsdWUxOwp9CgpDRlhfV2lkZVN0cmluZyBDSlNfUHVibGljTWV0aG9kczo6U3RyTFRyaW0oY29uc3QgRlhfV0NIQVIqIHBTdHIpCnsKICAgIHdoaWxlICgqcFN0ciAmJiAqcFN0ciA9PSBMJyAnKSBwU3RyKys7CgogICAgcmV0dXJuIHBTdHI7Cn0KCkNGWF9XaWRlU3RyaW5nIENKU19QdWJsaWNNZXRob2RzOjpTdHJSVHJpbShjb25zdCBGWF9XQ0hBUiogcFN0cikKewogICAgY29uc3QgRlhfV0NIQVIqIHAgPSBwU3RyOwogICAgd2hpbGUgKCpwKSBwKys7CiAgICB3aGlsZSAocCA+IHBTdHIgJiYgKihwIC0gMSkgPT0gTCcgJykgcC0tOwoKICAgIHJldHVybiBDRlhfV2lkZVN0cmluZyhwU3RyLCBwIC0gcFN0cik7Cn0KCkNGWF9XaWRlU3RyaW5nIENKU19QdWJsaWNNZXRob2RzOjpTdHJUcmltKGNvbnN0IEZYX1dDSEFSKiBwU3RyKQp7CiAgICByZXR1cm4gU3RyUlRyaW0oU3RyTFRyaW0ocFN0cikuY19zdHIoKSk7Cn0KCkNGWF9CeXRlU3RyaW5nIENKU19QdWJsaWNNZXRob2RzOjpTdHJMVHJpbShjb25zdCBGWF9DSEFSKiBwU3RyKQp7CiAgICB3aGlsZSAoKnBTdHIgJiYgKnBTdHIgPT0gJyAnKSBwU3RyKys7CgogICAgICAgIHJldHVybiBwU3RyOwp9CgpDRlhfQnl0ZVN0cmluZyBDSlNfUHVibGljTWV0aG9kczo6U3RyUlRyaW0oY29uc3QgRlhfQ0hBUiogcFN0cikKewogICAgY29uc3QgRlhfQ0hBUiogcCA9IHBTdHI7CiAgICB3aGlsZSAoKnApIHArKzsKICAgIHdoaWxlIChwID4gcFN0ciAmJiAqKHAgLSAxKSA9PSBMJyAnKSBwLS07CgogICAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKHBTdHIscC1wU3RyKTsKfQoKQ0ZYX0J5dGVTdHJpbmcgQ0pTX1B1YmxpY01ldGhvZHM6OlN0clRyaW0oY29uc3QgRlhfQ0hBUiogcFN0cikKewogICAgcmV0dXJuIFN0clJUcmltKFN0ckxUcmltKHBTdHIpKTsKfQoKZG91YmxlIENKU19QdWJsaWNNZXRob2RzOjpQYXJzZU51bWJlcihjb25zdCBGWF9XQ0hBUiogc3dTb3VyY2UsIEZYX0JPT0wmIGJBbGxEaWdpdHMsIEZYX0JPT0wmIGJEb3QsIEZYX0JPT0wmIGJTaWduLCBGWF9CT09MJiBiS1hKUykKewogICAgYkRvdCA9IEZBTFNFOwogICAgYlNpZ24gPSBGQUxTRTsKICAgIGJLWEpTID0gRkFMU0U7CgogICAgRlhfQk9PTCBiRGlnaXRFeGlzdCA9IEZBTFNFOwoKICAgIGNvbnN0IEZYX1dDSEFSKiBwID0gc3dTb3VyY2U7CiAgICB3Y2hhcl90IGM7CgogICAgY29uc3QgRlhfV0NIQVIqIHBTdGFydCA9IE5VTEw7CiAgICBjb25zdCBGWF9XQ0hBUiogcEVuZCA9IE5VTEw7CgogICAgd2hpbGUgKChjID0gKnApKQogICAgewogICAgICAgIGlmICghcFN0YXJ0ICYmIGMgIT0gTCcgJykKICAgICAgICB7CiAgICAgICAgICAgIHBTdGFydCA9IHA7CiAgICAgICAgfQoKICAgICAgICBwRW5kID0gcDsKICAgICAgICBwKys7CiAgICB9CgogICAgaWYgKCFwU3RhcnQpCiAgICB7CiAgICAgICAgYkFsbERpZ2l0cyA9IEZBTFNFOwogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgIHdoaWxlIChwRW5kICE9IHBTdGFydCkKICAgIHsKICAgICAgICBpZiAoKnBFbmQgPT0gTCcgJykKICAgICAgICAgICAgcEVuZCAtLTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIGJyZWFrOwogICAgfQoKICAgIGRvdWJsZSBkUmV0ID0gMDsKICAgIHAgPSBwU3RhcnQ7CiAgICBiQWxsRGlnaXRzID0gVFJVRTsKICAgIENGWF9XaWRlU3RyaW5nIHN3RGlnaXRzOwoKICAgIHdoaWxlIChwIDw9IHBFbmQpCiAgICB7CiAgICAgICAgYyA9ICpwOwoKICAgICAgICBpZiAoSXNEaWdpdChjKSkKICAgICAgICB7CiAgICAgICAgICAgIHN3RGlnaXRzICs9IGM7CiAgICAgICAgICAgIGJEaWdpdEV4aXN0ID0gVFJVRTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgc3dpdGNoIChjKQogICAgICAgICAgICB7CiAgICAgICAgICAgIGNhc2UgTCcgJzoKICAgICAgICAgICAgICAgIGJBbGxEaWdpdHMgPSBGQUxTRTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIEwnLic6CiAgICAgICAgICAgIGNhc2UgTCcsJzoKICAgICAgICAgICAgICAgIGlmICghYkRvdCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoYkRpZ2l0RXhpc3QpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzd0RpZ2l0cyArPSBMJy4nOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzd0RpZ2l0cyArPSBMJzAnOwogICAgICAgICAgICAgICAgICAgICAgICBzd0RpZ2l0cyArPSBMJy4nOwogICAgICAgICAgICAgICAgICAgICAgICBiRGlnaXRFeGlzdCA9IFRSVUU7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBiRG90ID0gVFJVRTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgY2FzZSAnZSc6CiAgICAgICAgICAgIGNhc2UgJ0UnOgogICAgICAgICAgICAgICAgaWYgKCFiS1hKUykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBwKys7CiAgICAgICAgICAgICAgICAgICAgYyA9ICpwOwogICAgICAgICAgICAgICAgICAgIGlmIChjID09ICcrJyB8fCBjID09ICctJykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJLWEpTID0gVFJVRTsKICAgICAgICAgICAgICAgICAgICAgICAgc3dEaWdpdHMgKz0gJ2UnOwogICAgICAgICAgICAgICAgICAgICAgICBzd0RpZ2l0cyArPSBjOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgY2FzZSBMJy0nOgogICAgICAgICAgICAgICAgaWYgKCFiRGlnaXRFeGlzdCAmJiAhYlNpZ24pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc3dEaWdpdHMgKz0gYzsKICAgICAgICAgICAgICAgICAgICBiU2lnbiA9IFRSVUU7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICBiQWxsRGlnaXRzID0gRkFMU0U7CgogICAgICAgICAgICAgICAgaWYgKHAgIT0gcFN0YXJ0ICYmICFiRG90ICYmIGJEaWdpdEV4aXN0KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHN3RGlnaXRzICs9IEwnLic7CiAgICAgICAgICAgICAgICAgICAgYkRvdCA9IFRSVUU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgYkRvdCA9IEZBTFNFOwogICAgICAgICAgICAgICAgICAgIGJEaWdpdEV4aXN0ID0gRkFMU0U7CiAgICAgICAgICAgICAgICAgICAgc3dEaWdpdHMgPSBMIiI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcCsrOwogICAgfQoKICAgIGlmIChzd0RpZ2l0cy5HZXRMZW5ndGgoKSA+IDAgJiYgc3dEaWdpdHMuR2V0TGVuZ3RoKCkgPCAxNykKICAgIHsKICAgICAgICBDRlhfQnl0ZVN0cmluZyBzRGlnaXRzID0gc3dEaWdpdHMuVVRGOEVuY29kZSgpOwoKICAgICAgICBpZiAoYktYSlMpCiAgICAgICAgewogICAgICAgICAgICBkUmV0ID0gYXRvZihzRGlnaXRzKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgaWYgKGJEb3QpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNoYXIqIHBTdG9wU3RyaW5nOwogICAgICAgICAgICAgICAgZFJldCA9IDo6c3RydG9kKHNEaWdpdHMsICZwU3RvcFN0cmluZyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBkUmV0ID0gYXRvbChzRGlnaXRzKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICB9CgogICAgcmV0dXJuIGRSZXQ7Cn0KCmRvdWJsZSBDSlNfUHVibGljTWV0aG9kczo6UGFyc2VTdHJpbmdUb051bWJlcihjb25zdCBGWF9XQ0hBUiogc3dTb3VyY2UpCnsKICAgIEZYX0JPT0wgYkFsbERpZ2l0cyA9IEZBTFNFOwogICAgRlhfQk9PTCBiRG90ID0gRkFMU0U7CiAgICBGWF9CT09MIGJTaWduID0gRkFMU0U7CiAgICBGWF9CT09MIGJLWEpTID0gRkFMU0U7CgogICAgcmV0dXJuIFBhcnNlTnVtYmVyKHN3U291cmNlLCBiQWxsRGlnaXRzLCBiRG90LCBiU2lnbiwgYktYSlMpOwp9CgpGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpDb252ZXJ0U3RyaW5nVG9OdW1iZXIoY29uc3QgRlhfV0NIQVIqIHN3U291cmNlLCBkb3VibGUgJiBkUmV0LCBGWF9CT09MICYgYkRvdCkKewogICAgRlhfQk9PTCBiQWxsRGlnaXRzID0gRkFMU0U7CiAgICBGWF9CT09MIGJTaWduID0gRkFMU0U7CiAgICBGWF9CT09MIGJLWEpTID0gRkFMU0U7CgogICAgZFJldCA9IFBhcnNlTnVtYmVyKHN3U291cmNlLCBiQWxsRGlnaXRzLCBiRG90LCBiU2lnbiwgYktYSlMpOwoKICAgIHJldHVybiBiQWxsRGlnaXRzOwp9CgpDSlNfQXJyYXkgQ0pTX1B1YmxpY01ldGhvZHM6OkFGX01ha2VBcnJheUZyb21MaXN0KHY4OjpJc29sYXRlKiBpc29sYXRlLCBDSlNfVmFsdWUgdmFsKQp7CiAgICBDSlNfQXJyYXkgU3RyQXJyYXkoaXNvbGF0ZSk7CiAgICBpZih2YWwuSXNBcnJheU9iamVjdCgpKQogICAgewogICAgICAgIHZhbC5Db252ZXJ0VG9BcnJheShTdHJBcnJheSk7CiAgICAgICAgcmV0dXJuIFN0ckFycmF5OwogICAgfQogICAgQ0ZYX1dpZGVTdHJpbmcgd3NTdHIgPSB2YWwuVG9DRlhXaWRlU3RyaW5nKCk7CiAgICBDRlhfQnl0ZVN0cmluZyB0ID0gQ0ZYX0J5dGVTdHJpbmc6OkZyb21Vbmljb2RlKHdzU3RyKTsKICAgIGNvbnN0IGNoYXIgKiBwID0gKGNvbnN0IGNoYXIgKil0OwoKCiAgICBpbnQgY2ggPSAnLCcgOwogICAgaW50IG5JbmRleCA9IDA7CgogICAgd2hpbGUgKCpwKQogICAgewogICAgICAgIGNvbnN0IGNoYXIgKiBwVGVtcCA9IHN0cmNocihwLCBjaCk7CiAgICAgICAgaWYgKHBUZW1wID09IE5VTEwpCiAgICAgICAgewogICAgICAgICAgICBTdHJBcnJheS5TZXRFbGVtZW50KG5JbmRleCwgQ0pTX1ZhbHVlKGlzb2xhdGUsIFN0clRyaW0ocCkuY19zdHIoKSkpOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgY2hhciAqIHBTdWIgPSBuZXcgY2hhcltwVGVtcCAtIHAgKyAxXTsKICAgICAgICAgICAgc3RybmNweShwU3ViLCBwLCBwVGVtcCAtIHApOwogICAgICAgICAgICAqKHBTdWIgKyAocFRlbXAgLSBwKSkgPSAnXDAnOwoKICAgICAgICAgICAgU3RyQXJyYXkuU2V0RWxlbWVudChuSW5kZXgsIENKU19WYWx1ZShpc29sYXRlLCBTdHJUcmltKHBTdWIpLmNfc3RyKCkpKTsKICAgICAgICAgICAgZGVsZXRlIFtdcFN1YjsKCiAgICAgICAgICAgIG5JbmRleCArKzsKICAgICAgICAgICAgcCA9ICsrcFRlbXA7CiAgICAgICAgfQoKICAgIH0KICAgIHJldHVybiBTdHJBcnJheTsKfQoKaW50IENKU19QdWJsaWNNZXRob2RzOjpQYXJzZVN0cmluZ0ludGVnZXIoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0cmluZyxpbnQgblN0YXJ0LGludCYgblNraXAsIGludCBuTWF4U3RlcCkKewogICAgaW50IG5SZXQgPSAwOwogICAgblNraXAgPSAwOwogICAgZm9yIChpbnQgaT1uU3RhcnQsIHN6PXN0cmluZy5HZXRMZW5ndGgoKTsgaSA8IHN6OyBpKyspCiAgICB7CiAgICAgICAgaWYgKGktblN0YXJ0ID4gMTApCiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBGWF9XQ0hBUiBjID0gc3RyaW5nLkdldEF0KGkpOwogICAgICAgIGlmIChJc0RpZ2l0KCh3Y2hhcl90KWMpKQogICAgICAgIHsKICAgICAgICAgICAgblJldCA9IG5SZXQgKiAxMCArIChjIC0gJzAnKTsKICAgICAgICAgICAgblNraXAgPSBpIC0gblN0YXJ0ICsgMTsKICAgICAgICAgICAgaWYgKG5Ta2lwID49IG5NYXhTdGVwKQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICAgICAgYnJlYWs7CiAgICB9CgogICAgcmV0dXJuIG5SZXQ7Cn0KCkNGWF9XaWRlU3RyaW5nIENKU19QdWJsaWNNZXRob2RzOjpQYXJzZVN0cmluZ1N0cmluZyhjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyaW5nLCBpbnQgblN0YXJ0LCBpbnQmIG5Ta2lwKQp7CiAgICBDRlhfV2lkZVN0cmluZyBzd1JldDsKICAgIG5Ta2lwID0gMDsKICAgIGZvciAoaW50IGk9blN0YXJ0LCBzej1zdHJpbmcuR2V0TGVuZ3RoKCk7IGkgPCBzejsgaSsrKQogICAgewogICAgICAgIEZYX1dDSEFSIGMgPSBzdHJpbmcuR2V0QXQoaSk7CiAgICAgICAgaWYgKChjID49IEwnYScgJiYgYyA8PSBMJ3onKSB8fCAoYyA+PSBMJ0EnICYmIGMgPD0gTCdaJykpCiAgICAgICAgewogICAgICAgICAgICBzd1JldCArPSBjOwogICAgICAgICAgICBuU2tpcCA9IGkgLSBuU3RhcnQgKyAxOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgICAgIGJyZWFrOwogICAgfQoKICAgIHJldHVybiBzd1JldDsKfQoKZG91YmxlIENKU19QdWJsaWNNZXRob2RzOjpQYXJzZU5vcm1hbERhdGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJiB2YWx1ZSwgRlhfQk9PTCYgYldyb25nRm9ybWF0KQp7CiAgICBkb3VibGUgZHQgPSBKU19HZXREYXRlVGltZSgpOwoKICAgIGludCBuWWVhciA9IEpTX0dldFllYXJGcm9tVGltZShkdCk7CiAgICBpbnQgbk1vbnRoID0gSlNfR2V0TW9udGhGcm9tVGltZShkdCkgKyAxOwogICAgaW50IG5EYXkgPSBKU19HZXREYXlGcm9tVGltZShkdCk7CiAgICBpbnQgbkhvdXIgPSBKU19HZXRIb3VyRnJvbVRpbWUoZHQpOwogICAgaW50IG5NaW4gPSBKU19HZXRNaW5Gcm9tVGltZShkdCk7CiAgICBpbnQgblNlYyA9IEpTX0dldFNlY0Zyb21UaW1lKGR0KTsKCiAgICBpbnQgbnVtYmVyWzNdOwoKICAgIGludCBuU2tpcCA9IDA7CiAgICBpbnQgbkxlbiA9IHZhbHVlLkdldExlbmd0aCgpOwogICAgaW50IG5JbmRleCA9IDA7CiAgICBpbnQgaSA9IDA7CiAgICB3aGlsZSAoaSA8IG5MZW4pCiAgICB7CiAgICAgICAgaWYgKG5JbmRleCA+IDIpIGJyZWFrOwoKICAgICAgICBGWF9XQ0hBUiBjID0gdmFsdWUuR2V0QXQoaSk7CiAgICAgICAgaWYgKElzRGlnaXQoKHdjaGFyX3QpYykpCiAgICAgICAgewogICAgICAgICAgICBudW1iZXJbbkluZGV4KytdID0gUGFyc2VTdHJpbmdJbnRlZ2VyKHZhbHVlLCBpLCBuU2tpcCwgNCk7CiAgICAgICAgICAgIGkgKz0gblNraXA7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIGkgKys7CiAgICAgICAgfQogICAgfQoKICAgIGlmIChuSW5kZXggPT0gMikKICAgIHsKICAgICAgICAvLyBjYXNlMjogbW9udGgvZGF5CiAgICAgICAgLy8gY2FzZTM6IGRheS9tb250aAogICAgICAgIGlmICgobnVtYmVyWzBdID49IDEgJiYgbnVtYmVyWzBdIDw9IDEyKSAmJiAobnVtYmVyWzFdID49IDEgJiYgbnVtYmVyWzFdIDw9IDMxKSkKICAgICAgICB7CiAgICAgICAgICAgIG5Nb250aCA9IG51bWJlclswXTsKICAgICAgICAgICAgbkRheSA9IG51bWJlclsxXTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoKG51bWJlclswXSA+PSAxICYmIG51bWJlclswXSA8PSAzMSkgJiYgKG51bWJlclsxXSA+PSAxICYmIG51bWJlclsxXSA8PSAxMikpCiAgICAgICAgewogICAgICAgICAgICBuRGF5ID0gbnVtYmVyWzBdOwogICAgICAgICAgICBuTW9udGggPSBudW1iZXJbMV07CiAgICAgICAgfQoKICAgICAgICBiV3JvbmdGb3JtYXQgPSBGQUxTRTsKICAgIH0KICAgIGVsc2UgaWYgKG5JbmRleCA9PSAzKQogICAgewogICAgICAgIC8vIGNhc2UxOiB5ZWFyL21vbnRoL2RheQogICAgICAgIC8vIGNhc2UyOiBtb250aC9kYXkveWVhcgogICAgICAgIC8vIGNhc2UzOiBkYXkvbW9udGgveWVhcgoKICAgICAgICBpZiAobnVtYmVyWzBdID4gMTIgJiYgKG51bWJlclsxXSA+PSAxICYmIG51bWJlclsxXSA8PSAxMikgJiYgKG51bWJlclsyXSA+PSAxICYmIG51bWJlclsyXSA8PSAzMSkpCiAgICAgICAgewogICAgICAgICAgICBuWWVhciA9IG51bWJlclswXTsKICAgICAgICAgICAgbk1vbnRoID0gbnVtYmVyWzFdOwogICAgICAgICAgICBuRGF5ID0gbnVtYmVyWzJdOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmICgobnVtYmVyWzBdID49IDEgJiYgbnVtYmVyWzBdIDw9IDEyKSAmJiAobnVtYmVyWzFdID49IDEgJiYgbnVtYmVyWzFdIDw9IDMxKSAmJiBudW1iZXJbMl0gPiAzMSkKICAgICAgICB7CiAgICAgICAgICAgIG5Nb250aCA9IG51bWJlclswXTsKICAgICAgICAgICAgbkRheSA9IG51bWJlclsxXTsKICAgICAgICAgICAgblllYXIgPSBudW1iZXJbMl07CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKChudW1iZXJbMF0gPj0gMSAmJiBudW1iZXJbMF0gPD0gMzEpICYmIChudW1iZXJbMV0gPj0gMSAmJiBudW1iZXJbMV0gPD0gMTIpICYmIG51bWJlclsyXSA+IDMxKQogICAgICAgIHsKICAgICAgICAgICAgbkRheSA9IG51bWJlclswXTsKICAgICAgICAgICAgbk1vbnRoID0gbnVtYmVyWzFdOwogICAgICAgICAgICBuWWVhciA9IG51bWJlclsyXTsKICAgICAgICB9CgogICAgICAgIGJXcm9uZ0Zvcm1hdCA9IEZBTFNFOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIGJXcm9uZ0Zvcm1hdCA9IFRSVUU7CiAgICAgICAgcmV0dXJuIGR0OwogICAgfQoKICAgIENGWF9XaWRlU3RyaW5nIHN3VGVtcDsKICAgIHN3VGVtcC5Gb3JtYXQoTCIlZC8lZC8lZCAlZDolZDolZCIsbk1vbnRoLG5EYXksblllYXIsbkhvdXIsbk1pbixuU2VjKTsKICAgIHJldHVybiBKU19EYXRlUGFyc2Uoc3dUZW1wLmNfc3RyKCkpOwp9Cgpkb3VibGUgQ0pTX1B1YmxpY01ldGhvZHM6Ok1ha2VSZWd1bGFyRGF0ZShjb25zdCBDRlhfV2lkZVN0cmluZyAmIHZhbHVlLCBjb25zdCBDRlhfV2lkZVN0cmluZyAmIGZvcm1hdCwgRlhfQk9PTCYgYldyb25nRm9ybWF0KQp7CiAgICBkb3VibGUgZHQgPSBKU19HZXREYXRlVGltZSgpOwoKICAgIGlmIChmb3JtYXQuSXNFbXB0eSgpIHx8IHZhbHVlLklzRW1wdHkoKSkKICAgICAgICByZXR1cm4gZHQ7CgogICAgaW50IG5ZZWFyID0gSlNfR2V0WWVhckZyb21UaW1lKGR0KTsKICAgIGludCBuTW9udGggPSBKU19HZXRNb250aEZyb21UaW1lKGR0KSArIDE7CiAgICBpbnQgbkRheSA9IEpTX0dldERheUZyb21UaW1lKGR0KTsKICAgIGludCBuSG91ciA9IEpTX0dldEhvdXJGcm9tVGltZShkdCk7CiAgICBpbnQgbk1pbiA9IEpTX0dldE1pbkZyb21UaW1lKGR0KTsKICAgIGludCBuU2VjID0gSlNfR2V0U2VjRnJvbVRpbWUoZHQpOwoKICAgIGludCBuWWVhclN1YiA9IDk5OyAvL25ZZWFyIC0gMjAwMDsKCiAgICBGWF9CT09MIGJQbSA9IEZBTFNFOwogICAgRlhfQk9PTCBiRXhpdCA9IEZBTFNFOwogICAgYldyb25nRm9ybWF0ID0gRkFMU0U7CgogICAgaW50IGk9MDsKICAgIGludCBqPTA7CgogICAgd2hpbGUgKGkgPCBmb3JtYXQuR2V0TGVuZ3RoKCkpCiAgICB7CiAgICAgICAgaWYgKGJFeGl0KSBicmVhazsKCiAgICAgICAgRlhfV0NIQVIgYyA9IGZvcm1hdC5HZXRBdChpKTsKICAgICAgICBzd2l0Y2ggKGMpCiAgICAgICAgewogICAgICAgICAgICBjYXNlICc6JzoKICAgICAgICAgICAgY2FzZSAnLic6CiAgICAgICAgICAgIGNhc2UgJy0nOgogICAgICAgICAgICBjYXNlICdcXCc6CiAgICAgICAgICAgIGNhc2UgJy8nOgogICAgICAgICAgICAgICAgaSsrOwogICAgICAgICAgICAgICAgaisrOwogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlICd5JzoKICAgICAgICAgICAgY2FzZSAnbSc6CiAgICAgICAgICAgIGNhc2UgJ2QnOgogICAgICAgICAgICBjYXNlICdIJzoKICAgICAgICAgICAgY2FzZSAnaCc6CiAgICAgICAgICAgIGNhc2UgJ00nOgogICAgICAgICAgICBjYXNlICdzJzoKICAgICAgICAgICAgY2FzZSAndCc6CiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaW50IG9sZGogPSBqOwogICAgICAgICAgICAgICAgICAgIGludCBuU2tpcCA9IDA7CiAgICAgICAgICAgICAgICAgICAgaW50IHJlbWFpbmluZyA9IGZvcm1hdC5HZXRMZW5ndGgoKSAtIGkgLSAxOwoKICAgICAgICAgICAgICAgICAgICBpZiAocmVtYWluaW5nID09IDAgfHwgZm9ybWF0LkdldEF0KGkrMSkgIT0gYykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYykKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAneSc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGorKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ20nOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5Nb250aCA9IFBhcnNlU3RyaW5nSW50ZWdlcih2YWx1ZSwgaiwgblNraXAsIDIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqICs9IG5Ta2lwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnZCc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbkRheSA9IFBhcnNlU3RyaW5nSW50ZWdlcih2YWx1ZSwgaiwgblNraXAsIDIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqICs9IG5Ta2lwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnSCc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbkhvdXIgPSBQYXJzZVN0cmluZ0ludGVnZXIodmFsdWUsIGosIG5Ta2lwLCAyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaiArPSBuU2tpcDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2gnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5Ib3VyID0gUGFyc2VTdHJpbmdJbnRlZ2VyKHZhbHVlLCBqLCBuU2tpcCwgMik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGogKz0gblNraXA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdNJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuTWluID0gUGFyc2VTdHJpbmdJbnRlZ2VyKHZhbHVlLCBqLCBuU2tpcCwgMik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGogKz0gblNraXA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdzJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuU2VjID0gUGFyc2VTdHJpbmdJbnRlZ2VyKHZhbHVlLCBqLCBuU2tpcCwgMik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGogKz0gblNraXA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd0JzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUG0gPSAoaiA8IHZhbHVlLkdldExlbmd0aCgpICYmIHZhbHVlLkdldEF0KGopID09ICdwJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGorKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChyZW1haW5pbmcgPT0gMSB8fCBmb3JtYXQuR2V0QXQoaSsyKSAhPSBjKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChjKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd5JzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuWWVhciA9IFBhcnNlU3RyaW5nSW50ZWdlcih2YWx1ZSwgaiwgblNraXAsIDQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgKz0gMjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqICs9IG5Ta2lwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnbSc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbk1vbnRoID0gUGFyc2VTdHJpbmdJbnRlZ2VyKHZhbHVlLCBqLCBuU2tpcCwgMik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSArPSAyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGogKz0gblNraXA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdkJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuRGF5ID0gUGFyc2VTdHJpbmdJbnRlZ2VyKHZhbHVlLCBqLCBuU2tpcCwgMik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSArPSAyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGogKz0gblNraXA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdIJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuSG91ciA9IFBhcnNlU3RyaW5nSW50ZWdlcih2YWx1ZSwgaiwgblNraXAsIDIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgKz0gMjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqICs9IG5Ta2lwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnaCc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbkhvdXIgPSBQYXJzZVN0cmluZ0ludGVnZXIodmFsdWUsIGosIG5Ta2lwLCAyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpICs9IDI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaiArPSBuU2tpcDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ00nOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5NaW4gPSBQYXJzZVN0cmluZ0ludGVnZXIodmFsdWUsIGosIG5Ta2lwLCAyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpICs9IDI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaiArPSBuU2tpcDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3MnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5TZWMgPSBQYXJzZVN0cmluZ0ludGVnZXIodmFsdWUsIGosIG5Ta2lwLCAyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpICs9IDI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaiArPSBuU2tpcDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3QnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJQbSA9IChqICsgMSA8IHZhbHVlLkdldExlbmd0aCgpICYmIHZhbHVlLkdldEF0KGopID09ICdwJyAmJiB2YWx1ZS5HZXRBdChqKzEpID09ICdtJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSArPSAyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGogKz0gMjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChyZW1haW5pbmcgPT0gMiB8fCBmb3JtYXQuR2V0QXQoaSszKSAhPSBjKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChjKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdtJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHNNb250aCA9IFBhcnNlU3RyaW5nU3RyaW5nKHZhbHVlLCBqLCBuU2tpcCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkZpbmQgPSBGQUxTRTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgbSA9IDA7IG0gPCAxMjsgbSsrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc01vbnRoLkNvbXBhcmVOb0Nhc2UobW9udGhzW21dKSA9PSAwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5Nb250aCA9IG0gKyAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkrPTM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgais9blNraXA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkZpbmQgPSBUUlVFOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWJGaW5kKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuTW9udGggPSBQYXJzZVN0cmluZ0ludGVnZXIodmFsdWUsIGosIG5Ta2lwLCAzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkrPTM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqICs9IG5Ta2lwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAneSc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkrPTM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgais9MzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChyZW1haW5pbmcgPT0gMyB8fCBmb3JtYXQuR2V0QXQoaSs0KSAhPSBjKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChjKQogICAgICAgICAgICAgICAgICAgICAgICB7CgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3knOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ZZWFyID0gUGFyc2VTdHJpbmdJbnRlZ2VyKHZhbHVlLCBqLCBuU2tpcCwgNCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaiArPSBuU2tpcDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpICs9IDQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdtJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0JPT0wgYkZpbmQgPSBGQUxTRTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHNNb250aCA9IFBhcnNlU3RyaW5nU3RyaW5nKHZhbHVlLCBqLCBuU2tpcCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNNb250aC5NYWtlTG93ZXIoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IG0gPSAwOyBtIDwgMTI7IG0rKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgc0Z1bGxNb250aHMgPSBmdWxsbW9udGhzW21dOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc0Z1bGxNb250aHMuTWFrZUxvd2VyKCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNGdWxsTW9udGhzLkZpbmQoc01vbnRoLmNfc3RyKCksIDApICE9IC0xKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5Nb250aCA9IG0gKyAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgKz0gNDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqICs9IG5Ta2lwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJGaW5kID0gVFJVRTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFiRmluZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbk1vbnRoID0gUGFyc2VTdHJpbmdJbnRlZ2VyKHZhbHVlLCBqLCBuU2tpcCwgNCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKz00OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaiArPSBuU2tpcDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSArPSA0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGogKz0gNDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaiA+PSB2YWx1ZS5HZXRMZW5ndGgoKSB8fCBmb3JtYXQuR2V0QXQoaSkgIT0gdmFsdWUuR2V0QXQoaikpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJXcm9uZ0Zvcm1hdCA9IFRSVUU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRXhpdCA9IFRSVUU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaSsrOwogICAgICAgICAgICAgICAgICAgICAgICBqKys7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZiAob2xkaiA9PSBqKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgYldyb25nRm9ybWF0ID0gVFJVRTsKICAgICAgICAgICAgICAgICAgICAgICAgYkV4aXQgPSBUUlVFOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5HZXRMZW5ndGgoKSA8PSBqKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGJFeGl0ID0gVFJVRTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKGZvcm1hdC5HZXRBdChpKSAhPSB2YWx1ZS5HZXRBdChqKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBiV3JvbmdGb3JtYXQgPSBUUlVFOwogICAgICAgICAgICAgICAgICAgIGJFeGl0ID0gVFJVRTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpKys7CiAgICAgICAgICAgICAgICBqKys7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICB9CgogICAgaWYgKGJQbSkgbkhvdXIgKz0gMTI7CgogICAgaWYgKG5ZZWFyID49IDAgJiYgblllYXIgPD0gblllYXJTdWIpCiAgICAgICAgblllYXIgKz0gMjAwMDsKCiAgICBpZiAobk1vbnRoIDwgMSB8fCBuTW9udGggPiAxMikKICAgICAgICBiV3JvbmdGb3JtYXQgPSBUUlVFOwoKICAgIGlmIChuRGF5IDwgMSB8fCBuRGF5ID4gMzEpCiAgICAgICAgYldyb25nRm9ybWF0ID0gVFJVRTsKCiAgICBpZiAobkhvdXIgPCAwIHx8IG5Ib3VyID4gMjQpCiAgICAgICAgYldyb25nRm9ybWF0ID0gVFJVRTsKCiAgICBpZiAobk1pbiA8IDAgfHwgbk1pbiA+IDYwKQogICAgICAgIGJXcm9uZ0Zvcm1hdCA9IFRSVUU7CgogICAgaWYgKG5TZWMgPCAwIHx8IG5TZWMgPiA2MCkKICAgICAgICBiV3JvbmdGb3JtYXQgPSBUUlVFOwoKICAgIGRvdWJsZSBkUmV0ID0gMDsKCiAgICBpZiAoYldyb25nRm9ybWF0KQogICAgewogICAgICAgIGRSZXQgPSBQYXJzZU5vcm1hbERhdGUodmFsdWUsIGJXcm9uZ0Zvcm1hdCk7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgZFJldCA9IEpTX01ha2VEYXRlKEpTX01ha2VEYXkoblllYXIsbk1vbnRoIC0gMSxuRGF5KSxKU19NYWtlVGltZShuSG91ciwgbk1pbiwgblNlYywgMCkpOwoKICAgICAgICBpZiAoSlNfUG9ydElzTmFuKGRSZXQpKQogICAgICAgIHsKICAgICAgICAgICAgZFJldCA9IEpTX0RhdGVQYXJzZSh2YWx1ZS5jX3N0cigpKTsKICAgICAgICB9CiAgICB9CgogICAgaWYgKEpTX1BvcnRJc05hbihkUmV0KSkKICAgIHsKICAgICAgICBkUmV0ID0gUGFyc2VOb3JtYWxEYXRlKHZhbHVlLCBiV3JvbmdGb3JtYXQpOwogICAgfQoKICAgIHJldHVybiBkUmV0OwoKfQoKQ0ZYX1dpZGVTdHJpbmcgQ0pTX1B1YmxpY01ldGhvZHM6Ok1ha2VGb3JtYXREYXRlKGRvdWJsZSBkRGF0ZSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcgJiBmb3JtYXQpCnsKICAgIENGWF9XaWRlU3RyaW5nIHNSZXQgPSBMIiIsc1BhcnQgPSBMIiI7CgogICAgaW50IG5ZZWFyID0gSlNfR2V0WWVhckZyb21UaW1lKGREYXRlKTsKICAgIGludCBuTW9udGggPSBKU19HZXRNb250aEZyb21UaW1lKGREYXRlKSArIDE7CiAgICBpbnQgbkRheSA9IEpTX0dldERheUZyb21UaW1lKGREYXRlKTsKICAgIGludCBuSG91ciA9IEpTX0dldEhvdXJGcm9tVGltZShkRGF0ZSk7CiAgICBpbnQgbk1pbiA9IEpTX0dldE1pbkZyb21UaW1lKGREYXRlKTsKICAgIGludCBuU2VjID0gSlNfR2V0U2VjRnJvbVRpbWUoZERhdGUpOwoKICAgIGludCBpID0gMDsKICAgIHdoaWxlIChpIDwgZm9ybWF0LkdldExlbmd0aCgpKQogICAgewogICAgICAgICAgICBGWF9XQ0hBUiBjID0gZm9ybWF0LkdldEF0KGkpOwogICAgICAgICAgICAgICAgaW50IHJlbWFpbmluZyA9IGZvcm1hdC5HZXRMZW5ndGgoKSAtIGkgLSAxOwogICAgICAgIHNQYXJ0ID0gTCIiOwogICAgICAgIHN3aXRjaCAoYykKICAgICAgICB7CiAgICAgICAgICAgIGNhc2UgJ3knOgogICAgICAgICAgICBjYXNlICdtJzoKICAgICAgICAgICAgY2FzZSAnZCc6CiAgICAgICAgICAgIGNhc2UgJ0gnOgogICAgICAgICAgICBjYXNlICdoJzoKICAgICAgICAgICAgY2FzZSAnTSc6CiAgICAgICAgICAgIGNhc2UgJ3MnOgogICAgICAgICAgICBjYXNlICd0JzoKICAgICAgICAgICAgICAgIGlmIChyZW1haW5pbmcgPT0gMCB8fCBmb3JtYXQuR2V0QXQoaSsxKSAhPSBjKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3knOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc1BhcnQgKz0gYzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdtJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNQYXJ0LkZvcm1hdChMIiVkIixuTW9udGgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2QnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc1BhcnQuRm9ybWF0KEwiJWQiLG5EYXkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0gnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc1BhcnQuRm9ybWF0KEwiJWQiLG5Ib3VyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdoJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNQYXJ0LkZvcm1hdChMIiVkIixuSG91cj4xMj9uSG91ciAtIDEyOm5Ib3VyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdNJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNQYXJ0LkZvcm1hdChMIiVkIixuTWluKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdzJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNQYXJ0LkZvcm1hdChMIiVkIixuU2VjKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd0JzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNQYXJ0ICs9IG5Ib3VyPjEyPydwJzonYSc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaSsrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAocmVtYWluaW5nID09IDEgfHwgZm9ybWF0LkdldEF0KGkrMikgIT0gYykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGMpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd5JzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNQYXJ0LkZvcm1hdChMIiUwMmQiLG5ZZWFyIC0gKG5ZZWFyIC8gMTAwKSAqIDEwMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnbSc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzUGFydC5Gb3JtYXQoTCIlMDJkIixuTW9udGgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2QnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc1BhcnQuRm9ybWF0KEwiJTAyZCIsbkRheSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnSCc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzUGFydC5Gb3JtYXQoTCIlMDJkIixuSG91cik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnaCc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzUGFydC5Gb3JtYXQoTCIlMDJkIixuSG91cj4xMj9uSG91ciAtIDEyOm5Ib3VyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdNJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNQYXJ0LkZvcm1hdChMIiUwMmQiLG5NaW4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3MnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc1BhcnQuRm9ybWF0KEwiJTAyZCIsblNlYyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAndCc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzUGFydCA9IG5Ib3VyPjEyPyBMInBtIjogTCJhbSI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaSs9MjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJlbWFpbmluZyA9PSAyIHx8IGZvcm1hdC5HZXRBdChpKzMpICE9IGMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChjKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnbSc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKz0zOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5Nb250aCA+IDAmJm5Nb250aCA8PSAxMikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzUGFydCArPSBtb250aHNbbk1vbnRoIC0gMV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkrPTM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzUGFydCArPSBjOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc1BhcnQgKz0gYzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNQYXJ0ICs9IGM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChyZW1haW5pbmcgPT0gMyB8fCBmb3JtYXQuR2V0QXQoaSs0KSAhPSBjKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3knOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc1BhcnQuRm9ybWF0KEwiJTA0ZCIsblllYXIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaSArPSA0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ20nOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaSs9NDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuTW9udGggPiAwJiZuTW9udGggPD0gMTIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc1BhcnQgKz0gZnVsbG1vbnRoc1tuTW9udGggLSAxXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaSArPSA0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc1BhcnQgKz0gYzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNQYXJ0ICs9IGM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzUGFydCArPSBjOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc1BhcnQgKz0gYzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpKys7CiAgICAgICAgICAgICAgICAgICAgc1BhcnQgKz0gYzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgaSsrOwogICAgICAgICAgICAgICAgc1BhcnQgKz0gYzsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCiAgICAgICAgc1JldCArPSBzUGFydDsKICAgIH0KCiAgICByZXR1cm4gc1JldDsKfQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCi8vZnVuY3Rpb24gQUZOdW1iZXJfRm9ybWF0KG5EZWMsIHNlcFN0eWxlLCBuZWdTdHlsZSwgY3VyclN0eWxlLCBzdHJDdXJyZW5jeSwgYkN1cnJlbmN5UHJlcGVuZCkKRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZOdW1iZXJfRm9ybWF0KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCnsKI2lmIF9GWF9PU18gIT0gX0ZYX0FORFJPSURfCiAgICB2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9IDo6R2V0SXNvbGF0ZShjYyk7CiAgICBDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQgKiljYzsKICAgIEFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKICAgIENKU19FdmVudEhhbmRsZXIqIHBFdmVudCA9IHBDb250ZXh0LT5HZXRFdmVudEhhbmRsZXIoKTsKICAgIEFTU0VSVChwRXZlbnQgIT0gTlVMTCk7CgogICAgaWYgKHBhcmFtcy5zaXplKCkgIT0gNikKICAgIHsKICAgICAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOwogICAgICAgIHJldHVybiBGQUxTRTsKICAgIH0KICAgIGlmKCFwRXZlbnQtPm1fcFZhbHVlKQogICAgICAgIHJldHVybiBGQUxTRTsKICAgIENGWF9XaWRlU3RyaW5nJiBWYWx1ZSA9IHBFdmVudC0+VmFsdWUoKTsKICAgIENGWF9CeXRlU3RyaW5nIHN0clZhbHVlID0gU3RyVHJpbShDRlhfQnl0ZVN0cmluZzo6RnJvbVVuaWNvZGUoVmFsdWUpKTsKCiAgICBpZiAoc3RyVmFsdWUuSXNFbXB0eSgpKSByZXR1cm4gVFJVRTsKCiAgICBpbnQgaURlYyA9IHBhcmFtc1swXS5Ub0ludCgpOwogICAgaW50IGlTZXBTdHlsZSA9IHBhcmFtc1sxXS5Ub0ludCgpOwogICAgaW50IGlOZWdTdHlsZSA9IHBhcmFtc1syXS5Ub0ludCgpOwogICAgLy8gcGFyYW1zWzNdIGlzIGlDdXJyU3R5bGUsIGl0J3Mgbm90IHVzZWQuCiAgICBzdGQ6OndzdHJpbmcgd3N0ckN1cnJlbmN5KHBhcmFtc1s0XS5Ub0NGWFdpZGVTdHJpbmcoKS5jX3N0cigpKTsKICAgIEZYX0JPT0wgYkN1cnJlbmN5UHJlcGVuZCA9IHBhcmFtc1s1XS5Ub0Jvb2woKTsKCiAgICBpZiAoaURlYyA8IDApIGlEZWMgPSAtaURlYzsKCiAgICBpZiAoaVNlcFN0eWxlIDwgMCB8fCBpU2VwU3R5bGUgPiAzKQogICAgICAgIGlTZXBTdHlsZSA9IDA7CgogICAgaWYgKGlOZWdTdHlsZSA8IDAgfHwgaU5lZ1N0eWxlID4gMykKICAgICAgICBpTmVnU3R5bGUgPSAwOwoKCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgIC8vZm9yIHByb2Nlc3NpbmcgZGVjaW1hbCBwbGFjZXMKICAgIHN0clZhbHVlLlJlcGxhY2UoIiwiLCAiLiIpOwogICAgZG91YmxlIGRWYWx1ZSA9IGF0b2Yoc3RyVmFsdWUpOwogICAgaWYgKGlEZWMgPiAwKQogICAgICAgIGRWYWx1ZSArPSBET1VCTEVfQ09SUkVDVDsKCiAgICBpbnQgaURlYzI7CiAgICBpbnQgaU5lZ2F0aXZlID0gMDsKCiAgICBzdHJWYWx1ZSA9IGZjdnQoZFZhbHVlLCBpRGVjLCAmaURlYzIsICZpTmVnYXRpdmUpOwogICAgaWYgKHN0clZhbHVlLklzRW1wdHkoKSkKICAgIHsKICAgICAgICBkVmFsdWUgPSAwOwogICAgICAgIHN0clZhbHVlID0gZmN2dChkVmFsdWUsIGlEZWMsICZpRGVjMiwgJmlOZWdhdGl2ZSk7CiAgICAgICAgaWYgKHN0clZhbHVlLklzRW1wdHkoKSkKICAgICAgICB7CiAgICAgICAgICAgIHN0clZhbHVlID0gIjAiOwogICAgICAgICAgICBpRGVjMiA9IDE7CiAgICAgICAgfQoKICAgIH0KCiAgICBpZiAoaURlYzIgPCAwKQogICAgewogICAgICAgIGZvciAoaW50IGlOdW0gPSAwO2lOdW0gPCBhYnMoaURlYzIpO2lOdW0rKykKICAgICAgICB7CiAgICAgICAgICAgIHN0clZhbHVlID0gIjAiICsgc3RyVmFsdWU7CiAgICAgICAgfQogICAgICAgIGlEZWMyID0gMDsKCiAgICB9CiAgICBpbnQgaU1heCA9IHN0clZhbHVlLkdldExlbmd0aCgpOwogICAgaWYgKGlEZWMyID4gaU1heCkKICAgIHsKICAgICAgICBmb3IgKGludCBpTnVtID0gMDtpTnVtIDw9IGlEZWMyIC0gaU1heCA7aU51bSsrKQogICAgICAgIHsKICAgICAgICAgICAgc3RyVmFsdWUgKz0gIjAiOwogICAgICAgIH0KICAgICAgICBpTWF4ID0gaURlYzIrMTsKICAgIH0KICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgIC8vZm9yIHByb2Nlc3Npbmcgc2VwZXJhdG9yIHN0eWxlCiAgICBpZiAoaURlYzIgPCBpTWF4KQogICAgewogICAgICAgIGlmIChpU2VwU3R5bGUgPT0gMCB8fCBpU2VwU3R5bGUgPT0gMSkKICAgICAgICB7CiAgICAgICAgICAgIHN0clZhbHVlLkluc2VydChpRGVjMiwgJy4nKTsKICAgICAgICAgICAgaU1heCsrOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChpU2VwU3R5bGUgPT0gMiB8fCBpU2VwU3R5bGUgPT0gMykKICAgICAgICB7CiAgICAgICAgICAgIHN0clZhbHVlLkluc2VydChpRGVjMiwgJywnKTsKICAgICAgICAgICAgaU1heCsrOwogICAgICAgIH0KCiAgICAgICAgaWYgKGlEZWMyID09IDApCiAgICAgICAgICAgIHN0clZhbHVlLkluc2VydChpRGVjMiwgJzAnKTsKICAgIH0KICAgIGlmIChpU2VwU3R5bGUgPT0gMCB8fCBpU2VwU3R5bGUgPT0gMikKICAgIHsKICAgICAgICBjaGFyIGNTZXBlcmF0b3I7CiAgICAgICAgaWYgKGlTZXBTdHlsZSA9PSAwKQogICAgICAgICAgICBjU2VwZXJhdG9yID0gJywnOwogICAgICAgIGVsc2UKICAgICAgICAgICAgY1NlcGVyYXRvciA9ICcuJzsKCiAgICAgICAgaW50IGlEZWNQb3NpdGl2ZTsKICAgICAgICBpRGVjUG9zaXRpdmUgPSBpRGVjMjsKCiAgICAgICAgZm9yIChpRGVjUG9zaXRpdmUgPSBpRGVjMiAtMzsgaURlY1Bvc2l0aXZlID4gMDtpRGVjUG9zaXRpdmUgLT0gMykKICAgICAgICB7CiAgICAgICAgICAgIHN0clZhbHVlLkluc2VydChpRGVjUG9zaXRpdmUsIGNTZXBlcmF0b3IpOwogICAgICAgICAgICBpTWF4Kys7CiAgICAgICAgfQogICAgfQoKICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgIC8vZm9yIHByb2Nlc3NpbmcgY3VycmVuY3kgc3RyaW5nCgogICAgVmFsdWUgPSBDRlhfV2lkZVN0cmluZzo6RnJvbUxvY2FsKHN0clZhbHVlKTsKICAgIHN0ZDo6d3N0cmluZyBzdHJWYWx1ZTIgPSBWYWx1ZS5jX3N0cigpOwoKICAgIGlmIChiQ3VycmVuY3lQcmVwZW5kKQogICAgICAgIHN0clZhbHVlMiA9IHdzdHJDdXJyZW5jeSArIHN0clZhbHVlMjsKICAgIGVsc2UKICAgICAgICBzdHJWYWx1ZTIgPSBzdHJWYWx1ZTIgKyB3c3RyQ3VycmVuY3k7CgoKCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAvL2ZvciBwcm9jZXNzaW5nIG5lZ2F0aXZlIHN0eWxlCiAgICBpZiAoaU5lZ2F0aXZlKQogICAgewogICAgICAgIGlmIChpTmVnU3R5bGUgPT0gMCkKICAgICAgICB7CiAgICAgICAgICAgIHN0clZhbHVlMi5pbnNlcnQoMCxMIi0iKTsKICAgICAgICB9CiAgICAgICAgaWYgKGlOZWdTdHlsZSA9PSAyIHx8IGlOZWdTdHlsZSA9PSAzKQogICAgICAgIHsKICAgICAgICAgICAgc3RyVmFsdWUyLmluc2VydCgwLEwiKCIpOwogICAgICAgICAgICBzdHJWYWx1ZTIuaW5zZXJ0KHN0clZhbHVlMi5sZW5ndGgoKSxMIikiKTsKICAgICAgICB9CiAgICAgICAgaWYgKGlOZWdTdHlsZSA9PSAxIHx8IGlOZWdTdHlsZSA9PSAzKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKEZpZWxkICogZlRhcmdldCA9IHBFdmVudC0+VGFyZ2V0X0ZpZWxkKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIENKU19BcnJheSBhckNvbG9yKGlzb2xhdGUpOwogICAgICAgICAgICAgICAgQ0pTX1ZhbHVlIHZDb2xFbG0oaXNvbGF0ZSk7CiAgICAgICAgICAgICAgICB2Q29sRWxtID0gTCJSR0IiOwogICAgICAgICAgICAgICAgYXJDb2xvci5TZXRFbGVtZW50KDAsdkNvbEVsbSk7CiAgICAgICAgICAgICAgICB2Q29sRWxtID0gMTsKICAgICAgICAgICAgICAgIGFyQ29sb3IuU2V0RWxlbWVudCgxLHZDb2xFbG0pOwogICAgICAgICAgICAgICAgdkNvbEVsbSA9IDA7CiAgICAgICAgICAgICAgICBhckNvbG9yLlNldEVsZW1lbnQoMix2Q29sRWxtKTsKCiAgICAgICAgICAgICAgICBhckNvbG9yLlNldEVsZW1lbnQoMyx2Q29sRWxtKTsKCiAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlIHZQcm9wKGlzb2xhdGUpOwogICAgICAgICAgICAgICAgdlByb3AuU3RhcnRHZXR0aW5nKCk7CiAgICAgICAgICAgICAgICB2UHJvcDw8YXJDb2xvcjsKICAgICAgICAgICAgICAgIHZQcm9wLlN0YXJ0U2V0dGluZygpOwogICAgICAgICAgICAgICAgZlRhcmdldC0+dGV4dENvbG9yKGNjLHZQcm9wLHNFcnJvcik7Ly8gcmVkCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgaWYgKGlOZWdTdHlsZSA9PSAxIHx8IGlOZWdTdHlsZSA9PSAzKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKEZpZWxkICpmVGFyZ2V0ID0gcEV2ZW50LT5UYXJnZXRfRmllbGQoKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQ0pTX0FycmF5IGFyQ29sb3IoaXNvbGF0ZSk7CiAgICAgICAgICAgICAgICBDSlNfVmFsdWUgdkNvbEVsbShpc29sYXRlKTsKICAgICAgICAgICAgICAgIHZDb2xFbG0gPSBMIlJHQiI7CiAgICAgICAgICAgICAgICBhckNvbG9yLlNldEVsZW1lbnQoMCx2Q29sRWxtKTsKICAgICAgICAgICAgICAgIHZDb2xFbG0gPSAwOwogICAgICAgICAgICAgICAgYXJDb2xvci5TZXRFbGVtZW50KDEsdkNvbEVsbSk7CiAgICAgICAgICAgICAgICBhckNvbG9yLlNldEVsZW1lbnQoMix2Q29sRWxtKTsKICAgICAgICAgICAgICAgIGFyQ29sb3IuU2V0RWxlbWVudCgzLHZDb2xFbG0pOwoKICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUgdlByb3AoaXNvbGF0ZSk7CiAgICAgICAgICAgICAgICB2UHJvcC5TdGFydEdldHRpbmcoKTsKICAgICAgICAgICAgICAgIGZUYXJnZXQtPnRleHRDb2xvcihjYyx2UHJvcCxzRXJyb3IpOwoKICAgICAgICAgICAgICAgIENKU19BcnJheSBhUHJvcChpc29sYXRlKTsKICAgICAgICAgICAgICAgIHZQcm9wLkNvbnZlcnRUb0FycmF5KGFQcm9wKTsKCiAgICAgICAgICAgICAgICBDUFdMX0NvbG9yIGNyUHJvcDsKICAgICAgICAgICAgICAgIENQV0xfQ29sb3IgY3JDb2xvcjsKICAgICAgICAgICAgICAgIGNvbG9yOjpDb252ZXJ0QXJyYXlUb1BXTENvbG9yKGFQcm9wLCBjclByb3ApOwogICAgICAgICAgICAgICAgY29sb3I6OkNvbnZlcnRBcnJheVRvUFdMQ29sb3IoYXJDb2xvciwgY3JDb2xvcik7CgogICAgICAgICAgICAgICAgaWYgKGNyQ29sb3IgIT0gY3JQcm9wKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUgdlByb3AyKGlzb2xhdGUpOwogICAgICAgICAgICAgICAgICAgIHZQcm9wMi5TdGFydEdldHRpbmcoKTsKICAgICAgICAgICAgICAgICAgICB2UHJvcDI8PGFyQ29sb3I7CiAgICAgICAgICAgICAgICAgICAgdlByb3AyLlN0YXJ0U2V0dGluZygpOwogICAgICAgICAgICAgICAgICAgIGZUYXJnZXQtPnRleHRDb2xvcihjYyx2UHJvcDIsc0Vycm9yKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIFZhbHVlID0gc3RyVmFsdWUyLmNfc3RyKCk7CiNlbmRpZgogICAgcmV0dXJuIFRSVUU7Cn0KCi8vZnVuY3Rpb24gQUZOdW1iZXJfS2V5c3Ryb2tlKG5EZWMsIHNlcFN0eWxlLCBuZWdTdHlsZSwgY3VyclN0eWxlLCBzdHJDdXJyZW5jeSwgYkN1cnJlbmN5UHJlcGVuZCkKRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZOdW1iZXJfS2V5c3Ryb2tlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCnsKICAgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCAqKWNjOwogICAgQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwogICAgQ0pTX0V2ZW50SGFuZGxlciogcEV2ZW50ID0gcENvbnRleHQtPkdldEV2ZW50SGFuZGxlcigpOwogICAgQVNTRVJUKHBFdmVudCAhPSBOVUxMKTsKCiAgICBpZihwYXJhbXMuc2l6ZSgpIDwgMikKICAgICAgICByZXR1cm4gRkFMU0U7CiAgICBpbnQgaVNlcFN0eWxlID0gcGFyYW1zWzFdLlRvSW50KCk7CgogICAgaWYgKGlTZXBTdHlsZSA8IDAgfHwgaVNlcFN0eWxlID4gMykKICAgICAgICBpU2VwU3R5bGUgPSAwOwogICAgaWYoIXBFdmVudC0+bV9wVmFsdWUpCiAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgQ0ZYX1dpZGVTdHJpbmcgJiB2YWwgPSBwRXZlbnQtPlZhbHVlKCk7CiAgICBDRlhfV2lkZVN0cmluZyAmIHdfc3RyQ2hhbmdlID0gcEV2ZW50LT5DaGFuZ2UoKTsKICAgIENGWF9XaWRlU3RyaW5nIHdfc3RyVmFsdWUgPSB2YWw7CgogICAgaWYgKHBFdmVudC0+V2lsbENvbW1pdCgpKQogICAgewogICAgICAgIENGWF9XaWRlU3RyaW5nIHdzdHJDaGFuZ2UgPSB3X3N0ckNoYW5nZTsKICAgICAgICBDRlhfV2lkZVN0cmluZyB3c3RyVmFsdWUgPSBTdHJMVHJpbSh3X3N0clZhbHVlLmNfc3RyKCkpOwogICAgICAgIGlmICh3c3RyVmFsdWUuSXNFbXB0eSgpKQogICAgICAgICAgICByZXR1cm4gVFJVRTsKCiAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgc3dUZW1wID0gd3N0clZhbHVlOwogICAgICAgIHN3VGVtcC5SZXBsYWNlKEwiLCIsIEwiLiIpOwogICAgICAgIGlmICghSXNOdW1iZXIoc3dUZW1wLmNfc3RyKCkpKQogICAgICAgIHsKICAgICAgICAgICAgcEV2ZW50LT5SYygpID0gRkFMU0U7CiAgICAgICAgICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTQUZOVU1CRVJfS0VZU1RST0tFKTsKICAgICAgICAgICAgQWxlcnQocENvbnRleHQsIHNFcnJvci5jX3N0cigpKTsKICAgICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgICAgfQogICAgICAgIHJldHVybiBUUlVFOyAvLyBpdCBoYXBwZW5zIGFmdGVyIHRoZSBsYXN0IGtleXN0cm9rZSBhbmQgYmVmb3JlIHZhbGlkYXRpbmcsCiAgICB9CgogICAgc3RkOjp3c3RyaW5nIHdfc3RyVmFsdWUyID0gd19zdHJWYWx1ZS5jX3N0cigpOwogICAgc3RkOjp3c3RyaW5nIHdfc3RyQ2hhbmdlMiA9IHdfc3RyQ2hhbmdlLmNfc3RyKCk7CiAgICBzdGQ6OndzdHJpbmcgd19zdHJTZWxlY3RlZDsKICAgIGlmKC0xICE9IHBFdmVudC0+U2VsU3RhcnQoKSkKICAgICAgICB3X3N0clNlbGVjdGVkID0gd19zdHJWYWx1ZTIuc3Vic3RyKHBFdmVudC0+U2VsU3RhcnQoKSwocEV2ZW50LT5TZWxFbmQoKSAtIHBFdmVudC0+U2VsU3RhcnQoKSkpOwogICAgRlhfQk9PTCBiSGFzU2lnbiA9ICh3X3N0clZhbHVlMi5maW5kKCctJykgIT0gLTEpICYmICh3X3N0clNlbGVjdGVkLmZpbmQoJy0nKSA9PSAtMSk7CiAgICBpZiAoYkhhc1NpZ24pCiAgICB7CiAgICAgICAgLy9jYW4ndCBpbnNlcnQgImNoYW5nZSIgaW4gZnJvbnQgdG8gc2lnbiBwb3N0aW9uLgogICAgICAgIGlmIChwRXZlbnQtPlNlbFN0YXJ0KCkgPT0gMCkKICAgICAgICB7CiAgICAgICAgICAgIEZYX0JPT0wgJmJSYyA9IHBFdmVudC0+UmMoKTsKICAgICAgICAgICAgYlJjID0gRkFMU0U7CiAgICAgICAgICAgIHJldHVybiBUUlVFOwogICAgICAgIH0KICAgIH0KCiAgICBjaGFyIGNTZXAgPSBMJy4nOwoKICAgIHN3aXRjaCAoaVNlcFN0eWxlKQogICAgewogICAgY2FzZSAwOgogICAgY2FzZSAxOgogICAgICAgIGNTZXAgPSBMJy4nOwogICAgICAgIGJyZWFrOwogICAgY2FzZSAyOgogICAgY2FzZSAzOgogICAgICAgIGNTZXAgPSBMJywnOwogICAgICAgIGJyZWFrOwogICAgfQoKICAgIEZYX0JPT0wgYkhhc1NlcCA9ICh3X3N0clZhbHVlMi5maW5kKGNTZXApICE9IC0xKTsKICAgIGZvciAoc3RkOjp3c3RyaW5nOjppdGVyYXRvciBpdCA9IHdfc3RyQ2hhbmdlMi5iZWdpbigpOyBpdCAhPSB3X3N0ckNoYW5nZTIuZW5kKCk7IGl0KyspCiAgICB7CiAgICAgICAgaWYgKCppdCA9PSBjU2VwKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKGJIYXNTZXApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEZYX0JPT0wgJmJSYyA9IHBFdmVudC0+UmMoKTsKICAgICAgICAgICAgICAgIGJSYyA9IEZBTFNFOwogICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYkhhc1NlcCA9IFRSVUU7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBpZiAoKml0ID09IEwnLScpCiAgICAgICAgewogICAgICAgICAgICBpZiAoYkhhc1NpZ24pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEZYX0JPT0wgJmJSYyA9IHBFdmVudC0+UmMoKTsKICAgICAgICAgICAgICAgIGJSYyA9IEZBTFNFOwogICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGl0ICE9IHdfc3RyQ2hhbmdlMi5iZWdpbigpKSAvL3NpZ24ncyBwb3NpdGlvbiBpcyBub3QgY29ycmVjdAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBGWF9CT09MICZiUmMgPSBwRXZlbnQtPlJjKCk7CiAgICAgICAgICAgICAgICBiUmMgPSBGQUxTRTsKICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChwRXZlbnQtPlNlbFN0YXJ0KCkgIT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgRlhfQk9PTCAmYlJjID0gcEV2ZW50LT5SYygpOwogICAgICAgICAgICAgICAgYlJjID0gRkFMU0U7CiAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICAgICAgfQogICAgICAgICAgICBiSGFzU2lnbiA9IFRSVUU7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KCiAgICAgICAgaWYgKCFJc0RpZ2l0KCppdCkpCiAgICAgICAgewogICAgICAgICAgICBGWF9CT09MICZiUmMgPSBwRXZlbnQtPlJjKCk7CiAgICAgICAgICAgIGJSYyA9IEZBTFNFOwogICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICB9CiAgICB9CgoKICAgIHN0ZDo6d3N0cmluZyB3X3ByZWZpeCA9IHdfc3RyVmFsdWUyLnN1YnN0cigwLHBFdmVudC0+U2VsU3RhcnQoKSk7CiAgICBzdGQ6OndzdHJpbmcgd19wb3N0Zml4OwogICAgaWYgKHBFdmVudC0+U2VsRW5kKCk8KGludCl3X3N0clZhbHVlMi5sZW5ndGgoKSkKICAgICAgICB3X3Bvc3RmaXggID0gd19zdHJWYWx1ZTIuc3Vic3RyKHBFdmVudC0+U2VsRW5kKCkpOwogICAgd19zdHJWYWx1ZTIgPSB3X3ByZWZpeCArIHdfc3RyQ2hhbmdlMiArIHdfcG9zdGZpeDsKICAgIHdfc3RyVmFsdWUgPSB3X3N0clZhbHVlMi5jX3N0cigpOwogICAgdmFsID0gd19zdHJWYWx1ZTsKICAgIHJldHVybiBUUlVFOwoKfQoKLy9mdW5jdGlvbiBBRlBlcmNlbnRfRm9ybWF0KG5EZWMsIHNlcFN0eWxlKQpGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRlBlcmNlbnRfRm9ybWF0KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCnsKI2lmIF9GWF9PU18gIT0gX0ZYX0FORFJPSURfCiAgICBDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQgKiljYzsKICAgIEFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKICAgIENKU19FdmVudEhhbmRsZXIqIHBFdmVudCA9IHBDb250ZXh0LT5HZXRFdmVudEhhbmRsZXIoKTsKICAgIEFTU0VSVChwRXZlbnQgIT0gTlVMTCk7CgogICAgaWYgKHBhcmFtcy5zaXplKCkgIT0gMikKICAgIHsKICAgICAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOwogICAgICAgIHJldHVybiBGQUxTRTsKICAgIH0KICAgIGlmKCFwRXZlbnQtPm1fcFZhbHVlKQogICAgICAgIHJldHVybiBGQUxTRTsKCiAgICBDRlhfV2lkZVN0cmluZyYgVmFsdWUgPSBwRXZlbnQtPlZhbHVlKCk7CiAgICBDRlhfQnl0ZVN0cmluZyBzdHJWYWx1ZSA9IFN0clRyaW0oQ0ZYX0J5dGVTdHJpbmc6OkZyb21Vbmljb2RlKFZhbHVlKSk7CiAgICBpZiAoc3RyVmFsdWUuSXNFbXB0eSgpKQogICAgICAgIHJldHVybiBUUlVFOwoKICAgIGludCBpRGVjID0gcGFyYW1zWzBdLlRvSW50KCk7CiAgICBpZiAoaURlYyA8IDApCiAgICAgICAgaURlYyA9IC1pRGVjOwoKICAgIGludCBpU2VwU3R5bGUgPSBwYXJhbXNbMV0uVG9JbnQoKTsKICAgIGlmIChpU2VwU3R5bGUgPCAwIHx8IGlTZXBTdHlsZSA+IDMpCiAgICAgICAgaVNlcFN0eWxlID0gMDsKCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgIC8vZm9yIHByb2Nlc3NpbmcgZGVjaW1hbCBwbGFjZXMKICAgIGRvdWJsZSBkVmFsdWUgPSBhdG9mKHN0clZhbHVlKTsKICAgIGRWYWx1ZSAqPSAxMDA7CiAgICBpZiAoaURlYyA+IDApCiAgICAgICAgZFZhbHVlICs9IERPVUJMRV9DT1JSRUNUOy8v0KPV/QoKICAgIGludCBpRGVjMjsKICAgIGludCBpTmVnYXRpdmUgPSAwOwogICAgc3RyVmFsdWUgPSBmY3Z0KGRWYWx1ZSwgaURlYywgJmlEZWMyLCAmaU5lZ2F0aXZlKTsKICAgIGlmIChzdHJWYWx1ZS5Jc0VtcHR5KCkpCiAgICB7CiAgICAgICAgZFZhbHVlID0gMDsKICAgICAgICBzdHJWYWx1ZSA9IGZjdnQoZFZhbHVlLCBpRGVjLCAmaURlYzIsICZpTmVnYXRpdmUpOwogICAgfQoKICAgIGlmIChpRGVjMiA8IDApCiAgICB7CiAgICAgICAgZm9yIChpbnQgaU51bSA9IDA7IGlOdW0gPCBhYnMoaURlYzIpOyBpTnVtKyspCiAgICAgICAgewogICAgICAgICAgICBzdHJWYWx1ZSA9ICIwIiArIHN0clZhbHVlOwogICAgICAgIH0KICAgICAgICBpRGVjMiA9IDA7CgogICAgfQogICAgaW50IGlNYXggPSBzdHJWYWx1ZS5HZXRMZW5ndGgoKTsKICAgIGlmIChpRGVjMiA+IGlNYXgpCiAgICB7CiAgICAgICAgZm9yIChpbnQgaU51bSA9IDA7IGlOdW0gPD0gaURlYzIgLSBpTWF4OyBpTnVtKyspCiAgICAgICAgewogICAgICAgICAgICBzdHJWYWx1ZSArPSAiMCI7CiAgICAgICAgfQogICAgICAgIGlNYXggPSBpRGVjMisxOwogICAgfQogICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgLy9mb3IgcHJvY2Vzc2luZyBzZXBlcmF0b3Igc3R5bGUKICAgIGlmIChpRGVjMiA8IGlNYXgpCiAgICB7CiAgICAgICAgaWYgKGlTZXBTdHlsZSA9PSAwIHx8IGlTZXBTdHlsZSA9PSAxKQogICAgICAgIHsKICAgICAgICAgICAgc3RyVmFsdWUuSW5zZXJ0KGlEZWMyLCAnLicpOwogICAgICAgICAgICBpTWF4Kys7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGlTZXBTdHlsZSA9PSAyIHx8IGlTZXBTdHlsZSA9PSAzKQogICAgICAgIHsKICAgICAgICAgICAgc3RyVmFsdWUuSW5zZXJ0KGlEZWMyLCAnLCcpOwogICAgICAgICAgICBpTWF4Kys7CiAgICAgICAgfQoKICAgICAgICBpZiAoaURlYzIgPT0gMCkKICAgICAgICAgICAgc3RyVmFsdWUuSW5zZXJ0KGlEZWMyLCAnMCcpOwogICAgfQogICAgaWYgKGlTZXBTdHlsZSA9PSAwIHx8IGlTZXBTdHlsZSA9PSAyKQogICAgewogICAgICAgIGNoYXIgY1NlcGVyYXRvcjsKICAgICAgICBpZiAoaVNlcFN0eWxlID09IDApCiAgICAgICAgICAgIGNTZXBlcmF0b3IgPSAnLCc7CiAgICAgICAgZWxzZQogICAgICAgICAgICBjU2VwZXJhdG9yID0gJy4nOwoKICAgICAgICBpbnQgaURlY1Bvc2l0aXZlOwogICAgICAgIGlEZWNQb3NpdGl2ZSA9IGlEZWMyOwoKICAgICAgICBmb3IgKGlEZWNQb3NpdGl2ZSA9IGlEZWMyIC0zOyBpRGVjUG9zaXRpdmUgPiAwOyBpRGVjUG9zaXRpdmUgLT0gMykKICAgICAgICB7CiAgICAgICAgICAgIHN0clZhbHVlLkluc2VydChpRGVjUG9zaXRpdmUsY1NlcGVyYXRvcik7CiAgICAgICAgICAgIGlNYXgrKzsKICAgICAgICB9CiAgICB9CiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgLy9uZWdhdGl2ZSBtYXJrCiAgICBpZiAoaU5lZ2F0aXZlKQogICAgICAgIHN0clZhbHVlID0gIi0iICsgc3RyVmFsdWU7CiAgICBzdHJWYWx1ZSArPSAiJSI7CiAgICBWYWx1ZSA9IENGWF9XaWRlU3RyaW5nOjpGcm9tTG9jYWwoc3RyVmFsdWUpOwojZW5kaWYKICAgIHJldHVybiBUUlVFOwp9Ci8vQUZQZXJjZW50X0tleXN0cm9rZShuRGVjLCBzZXBTdHlsZSkKRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZQZXJjZW50X0tleXN0cm9rZShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQp7CiAgICByZXR1cm4gQUZOdW1iZXJfS2V5c3Ryb2tlKGNjLHBhcmFtcyx2UmV0LHNFcnJvcik7Cn0KCi8vZnVuY3Rpb24gQUZEYXRlX0Zvcm1hdEV4KGNGb3JtYXQpCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGRGF0ZV9Gb3JtYXRFeChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQp7CiAgICBDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQgKiljYzsKICAgIEFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKICAgIENKU19FdmVudEhhbmRsZXIqIHBFdmVudCA9IHBDb250ZXh0LT5HZXRFdmVudEhhbmRsZXIoKTsKICAgIEFTU0VSVChwRXZlbnQgIT0gTlVMTCk7CgogICAgaWYgKHBhcmFtcy5zaXplKCkgIT0gMSkKICAgIHsKICAgICAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOwogICAgICAgIHJldHVybiBGQUxTRTsKICAgIH0KICAgIGlmKCFwRXZlbnQtPm1fcFZhbHVlKQogICAgICAgIHJldHVybiBGQUxTRTsKCiAgICBDRlhfV2lkZVN0cmluZyYgdmFsID0gcEV2ZW50LT5WYWx1ZSgpOwogICAgQ0ZYX1dpZGVTdHJpbmcgc3RyVmFsdWUgPSB2YWw7CiAgICBpZiAoc3RyVmFsdWUuSXNFbXB0eSgpKQogICAgICAgIHJldHVybiBUUlVFOwoKICAgIENGWF9XaWRlU3RyaW5nIHNGb3JtYXQgPSBwYXJhbXNbMF0uVG9DRlhXaWRlU3RyaW5nKCk7CiAgICBGWF9CT09MIGJXcm9uZ0Zvcm1hdCA9IEZBTFNFOwogICAgZG91YmxlIGREYXRlID0gMC4wZjsKCiAgICBpZihzdHJWYWx1ZS5GaW5kKEwiR01UIikgIT0gLTEpCiAgICB7CiAgICAgICAgLy9mb3IgR01UIGZvcm1hdCB0aW1lCiAgICAgICAgLy9zdWNoIGFzICJUdWUgQXVnIDExIDE0OjI0OjE2IEdNVCswODAwMjAwOSIKICAgICAgICBkRGF0ZSA9IE1ha2VJbnRlckRhdGUoc3RyVmFsdWUpOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIGREYXRlID0gTWFrZVJlZ3VsYXJEYXRlKHN0clZhbHVlLHNGb3JtYXQsYldyb25nRm9ybWF0KTsKICAgIH0KCiAgICBpZiAoSlNfUG9ydElzTmFuKGREYXRlKSkKICAgIHsKICAgICAgICBDRlhfV2lkZVN0cmluZyBzd01zZzsKICAgICAgICBzd01zZy5Gb3JtYXQoSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJTRURBVEUpLmNfc3RyKCksIHNGb3JtYXQuY19zdHIoKSk7CiAgICAgICAgQWxlcnQocENvbnRleHQsIHN3TXNnLmNfc3RyKCkpOwogICAgICAgIHJldHVybiBGQUxTRTsKICAgIH0KCiAgICB2YWwgPSAgTWFrZUZvcm1hdERhdGUoZERhdGUsc0Zvcm1hdCk7CiAgICByZXR1cm4gVFJVRTsKfQoKZG91YmxlIENKU19QdWJsaWNNZXRob2RzOjpNYWtlSW50ZXJEYXRlKENGWF9XaWRlU3RyaW5nIHN0clZhbHVlKQp7CiAgICBpbnQgbkhvdXI7CiAgICBpbnQgbk1pbjsKICAgIGludCBuU2VjOwogICAgaW50IG5ZZWFyOwogICAgaW50IG5Nb250aDsKICAgIGludCBuRGF5OwoKICAgIENGWF9XaWRlU3RyaW5nQXJyYXkgd3NBcnJheTsKICAgIENGWF9XaWRlU3RyaW5nIHNNb250aCA9IEwiIjsKICAgIENGWF9XaWRlU3RyaW5nIHNUZW1wID0gTCIiOwogICAgaW50IG5TaXplID0gc3RyVmFsdWUuR2V0TGVuZ3RoKCk7CgogICAgZm9yKGludCBpID0gMDsgaSA8IG5TaXplOyBpKyspCiAgICB7CiAgICAgICAgRlhfV0NIQVIgYyA9IHN0clZhbHVlLkdldEF0KGkpOwogICAgICAgIGlmKGMgPT0gTCcgJyB8fCBjID09IEwnOicpCiAgICAgICAgewogICAgICAgICAgICB3c0FycmF5LkFkZChzVGVtcCk7CiAgICAgICAgICAgIHNUZW1wID0gTCIiOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CgogICAgICAgIHNUZW1wICs9IGM7CiAgICB9CgogICAgd3NBcnJheS5BZGQoc1RlbXApOwogICAgaWYod3NBcnJheS5HZXRTaXplKCkgIT0gOClyZXR1cm4gMDsKCiAgICBzVGVtcCA9IHdzQXJyYXlbMV07CiAgICBpZihzVGVtcC5Db21wYXJlKEwiSmFuIikgPT0gMCkgbk1vbnRoID0gMTsKICAgIGlmKHNUZW1wLkNvbXBhcmUoTCJGZWIiKSA9PSAwKSBuTW9udGggPSAyOwogICAgaWYoc1RlbXAuQ29tcGFyZShMIk1hciIpID09IDApIG5Nb250aCA9IDM7CiAgICBpZihzVGVtcC5Db21wYXJlKEwiQXByIikgPT0gMCkgbk1vbnRoID0gNDsKICAgIGlmKHNUZW1wLkNvbXBhcmUoTCJNYXkiKSA9PSAwKSBuTW9udGggPSA1OwogICAgaWYoc1RlbXAuQ29tcGFyZShMIkp1biIpID09IDApIG5Nb250aCA9IDY7CiAgICBpZihzVGVtcC5Db21wYXJlKEwiSnVsIikgPT0gMCkgbk1vbnRoID0gNzsKICAgIGlmKHNUZW1wLkNvbXBhcmUoTCJBdWciKSA9PSAwKSBuTW9udGggPSA4OwogICAgaWYoc1RlbXAuQ29tcGFyZShMIlNlcCIpID09IDApIG5Nb250aCA9IDk7CiAgICBpZihzVGVtcC5Db21wYXJlKEwiT2N0IikgPT0gMCkgbk1vbnRoID0gMTA7CiAgICBpZihzVGVtcC5Db21wYXJlKEwiTm92IikgPT0gMCkgbk1vbnRoID0gMTE7CiAgICBpZihzVGVtcC5Db21wYXJlKEwiRGVjIikgPT0gMCkgbk1vbnRoID0gMTI7CgogICAgbkRheSA9IChpbnQpUGFyc2VTdHJpbmdUb051bWJlcih3c0FycmF5WzJdLmNfc3RyKCkpOwogICAgbkhvdXIgPSAoaW50KVBhcnNlU3RyaW5nVG9OdW1iZXIod3NBcnJheVszXS5jX3N0cigpKTsKICAgIG5NaW4gPSAoaW50KVBhcnNlU3RyaW5nVG9OdW1iZXIod3NBcnJheVs0XS5jX3N0cigpKTsKICAgIG5TZWMgPSAoaW50KVBhcnNlU3RyaW5nVG9OdW1iZXIod3NBcnJheVs1XS5jX3N0cigpKTsKICAgIG5ZZWFyID0gKGludClQYXJzZVN0cmluZ1RvTnVtYmVyKHdzQXJyYXlbN10uY19zdHIoKSk7CgogICAgZG91YmxlIGRSZXQgPSBKU19NYWtlRGF0ZShKU19NYWtlRGF5KG5ZZWFyLG5Nb250aCAtIDEsbkRheSksSlNfTWFrZVRpbWUobkhvdXIsIG5NaW4sIG5TZWMsIDApKTsKCiAgICBpZiAoSlNfUG9ydElzTmFuKGRSZXQpKQogICAgewogICAgICAgIGRSZXQgPSBKU19EYXRlUGFyc2Uoc3RyVmFsdWUuY19zdHIoKSk7CiAgICB9CgogICAgcmV0dXJuIGRSZXQ7Cn0KCi8vQUZEYXRlX0tleXN0cm9rZUV4KGNGb3JtYXQpCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGRGF0ZV9LZXlzdHJva2VFeChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQp7CiAgICBDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQgKiljYzsKICAgIEFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKICAgIENKU19FdmVudEhhbmRsZXIqIHBFdmVudCA9IHBDb250ZXh0LT5HZXRFdmVudEhhbmRsZXIoKTsKICAgIEFTU0VSVChwRXZlbnQgIT0gTlVMTCk7CgogICAgaWYgKHBhcmFtcy5zaXplKCkgIT0gMSkKICAgIHsKICAgICAgICBzRXJyb3IgPSBMIkFGRGF0ZV9LZXlzdHJva2VFeCdzIHBhcmFtZXRlcnMnIHNpemUgciBub3QgY29ycmVjdCI7CiAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgfQoKICAgIGlmIChwRXZlbnQtPldpbGxDb21taXQoKSkKICAgIHsKICAgICAgICBpZighcEV2ZW50LT5tX3BWYWx1ZSkKICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgIENGWF9XaWRlU3RyaW5nIHN0clZhbHVlID0gcEV2ZW50LT5WYWx1ZSgpOwogICAgICAgIGlmIChzdHJWYWx1ZS5Jc0VtcHR5KCkpCiAgICAgICAgICAgIHJldHVybiBUUlVFOwoKICAgICAgICBDRlhfV2lkZVN0cmluZyBzRm9ybWF0ID0gcGFyYW1zWzBdLlRvQ0ZYV2lkZVN0cmluZygpOwogICAgICAgIEZYX0JPT0wgYldyb25nRm9ybWF0ID0gRkFMU0U7CiAgICAgICAgZG91YmxlIGRSZXQgPSBNYWtlUmVndWxhckRhdGUoc3RyVmFsdWUsc0Zvcm1hdCxiV3JvbmdGb3JtYXQpOwogICAgICAgIGlmIChiV3JvbmdGb3JtYXQgfHwgSlNfUG9ydElzTmFuKGRSZXQpKQogICAgICAgIHsKICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgc3dNc2c7CiAgICAgICAgICAgIHN3TXNnLkZvcm1hdChKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUlNFREFURSkuY19zdHIoKSwgc0Zvcm1hdC5jX3N0cigpKTsKICAgICAgICAgICAgQWxlcnQocENvbnRleHQsIHN3TXNnLmNfc3RyKCkpOwogICAgICAgICAgICBwRXZlbnQtPlJjKCkgPSBGQUxTRTsKICAgICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIFRSVUU7Cn0KCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGRGF0ZV9Gb3JtYXQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKewogICAgdjg6Oklzb2xhdGUqIGlzb2xhdGUgPSA6OkdldElzb2xhdGUoY2MpOwoKICAgIGlmIChwYXJhbXMuc2l6ZSgpICE9IDEpCiAgICB7CiAgICAgICAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKICAgICAgICBBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CgogICAgICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7CiAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgfQoKICAgIGludCBpSW5kZXggPSBwYXJhbXNbMF0uVG9JbnQoKTsKICAgIGNvbnN0IEZYX1dDSEFSKiBjRm9ybWF0c1tdID0gIHtMIm0vZCIsIEwibS9kL3l5IiwgTCJtbS9kZC95eSIsIEwibW0veXkiLCBMImQtbW1tIiwgTCJkLW1tbS15eSIsIEwiZGQtbW1tLXl5IiwKICAgICAgICBMInl5LW1tLWRkIiwgTCJtbW0teXkiLCBMIm1tbW0teXkiLCBMIm1tbSBkLCB5eXl5IiwgTCJtbW1tIGQsIHl5eXkiLAogICAgICAgIEwibS9kL3l5IGg6TU0gdHQiLCBMIm0vZC95eSBISDpNTSIgfTsKCiAgICBBU1NFUlQoaUluZGV4IDwgRlhfQXJyYXlTaXplKGNGb3JtYXRzKSk7CgogICAgaWYgKGlJbmRleCA8IDApCiAgICAgICAgaUluZGV4ID0gMDsKICAgIGlmIChpSW5kZXggPj0gRlhfQXJyYXlTaXplKGNGb3JtYXRzKSkKICAgICAgICBpSW5kZXggPSAwOwogICAgQ0pTX1BhcmFtZXRlcnMgbmV3UGFyYW1zOwogICAgQ0pTX1ZhbHVlIHZhbChpc29sYXRlLGNGb3JtYXRzW2lJbmRleF0pOwogICAgbmV3UGFyYW1zLnB1c2hfYmFjayh2YWwpOwogICAgcmV0dXJuIEFGRGF0ZV9Gb3JtYXRFeChjYyxuZXdQYXJhbXMsdlJldCxzRXJyb3IpOwp9CgovL0FGRGF0ZV9LZXlzdHJva2VFeChjRm9ybWF0KQpGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRkRhdGVfS2V5c3Ryb2tlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCnsKICAgIHY4OjpJc29sYXRlKiBpc29sYXRlID0gOjpHZXRJc29sYXRlKGNjKTsKCiAgICBpZiAocGFyYW1zLnNpemUoKSAhPSAxKQogICAgewogICAgICAgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CiAgICAgICAgQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwoKICAgICAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOwogICAgICAgIHJldHVybiBGQUxTRTsKICAgIH0KCiAgICBpbnQgaUluZGV4ID0gcGFyYW1zWzBdLlRvSW50KCk7CiAgICBjb25zdCBGWF9XQ0hBUiogY0Zvcm1hdHNbXSA9ICB7TCJtL2QiLCBMIm0vZC95eSIsIEwibW0vZGQveXkiLCBMIm1tL3l5IiwgTCJkLW1tbSIsIEwiZC1tbW0teXkiLCBMImRkLW1tbS15eSIsCiAgICAgICAgTCJ5eS1tbS1kZCIsIEwibW1tLXl5IiwgTCJtbW1tLXl5IiwgTCJtbW0gZCwgeXl5eSIsIEwibW1tbSBkLCB5eXl5IiwKICAgICAgICBMIm0vZC95eSBoOk1NIHR0IiwgTCJtL2QveXkgSEg6TU0iIH07CgogICAgQVNTRVJUKGlJbmRleDxGWF9BcnJheVNpemUoY0Zvcm1hdHMpKTsKCiAgICBpZiAoaUluZGV4IDwgMCkKICAgICAgICBpSW5kZXggPSAwOwogICAgaWYgKGlJbmRleCA+PSBGWF9BcnJheVNpemUoY0Zvcm1hdHMpKQogICAgICAgIGlJbmRleCA9IDA7CiAgICBDSlNfUGFyYW1ldGVycyBuZXdQYXJhbXM7CiAgICBDSlNfVmFsdWUgdmFsKGlzb2xhdGUsY0Zvcm1hdHNbaUluZGV4XSk7CiAgICBuZXdQYXJhbXMucHVzaF9iYWNrKHZhbCk7CiAgICByZXR1cm4gQUZEYXRlX0tleXN0cm9rZUV4KGNjLG5ld1BhcmFtcyx2UmV0LHNFcnJvcik7Cn0KCi8vZnVuY3Rpb24gQUZUaW1lX0Zvcm1hdChwdGYpCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGVGltZV9Gb3JtYXQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKewogICAgdjg6Oklzb2xhdGUqIGlzb2xhdGUgPSA6OkdldElzb2xhdGUoY2MpOwoKICAgIGlmIChwYXJhbXMuc2l6ZSgpICE9IDEpCiAgICB7CiAgICAgICAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKICAgICAgICBBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CiAgICAgICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKICAgICAgICByZXR1cm4gRkFMU0U7CiAgICB9CgogICAgaW50IGlJbmRleCA9IHBhcmFtc1swXS5Ub0ludCgpOwogICAgY29uc3QgRlhfV0NIQVIqIGNGb3JtYXRzW10gPSB7TCJISDpNTSIsIEwiaDpNTSB0dCIsIEwiSEg6TU06c3MiLCBMImg6TU06c3MgdHQifTsKCiAgICBBU1NFUlQoaUluZGV4PEZYX0FycmF5U2l6ZShjRm9ybWF0cykpOwoKICAgIGlmIChpSW5kZXggPCAwKQogICAgICAgIGlJbmRleCA9IDA7CiAgICBpZiAoaUluZGV4ID49IEZYX0FycmF5U2l6ZShjRm9ybWF0cykpCiAgICAgICAgaUluZGV4ID0gMDsKICAgIENKU19QYXJhbWV0ZXJzIG5ld1BhcmFtczsKICAgIENKU19WYWx1ZSB2YWwoaXNvbGF0ZSxjRm9ybWF0c1tpSW5kZXhdKTsKICAgIG5ld1BhcmFtcy5wdXNoX2JhY2sodmFsKTsKICAgIHJldHVybiBBRkRhdGVfRm9ybWF0RXgoY2MsbmV3UGFyYW1zLHZSZXQsc0Vycm9yKTsKfQoKRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZUaW1lX0tleXN0cm9rZShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQp7CiAgICB2ODo6SXNvbGF0ZSogaXNvbGF0ZSA9IDo6R2V0SXNvbGF0ZShjYyk7CiAgICBpZiAocGFyYW1zLnNpemUoKSAhPSAxKQogICAgewogICAgICAgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCopY2M7CiAgICAgICAgQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwogICAgICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7CiAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgfQoKICAgIGludCBpSW5kZXggPSBwYXJhbXNbMF0uVG9JbnQoKTsKICAgIGNvbnN0IEZYX1dDSEFSKiBjRm9ybWF0c1tdID0ge0wiSEg6TU0iLCBMImg6TU0gdHQiLCBMIkhIOk1NOnNzIiwgTCJoOk1NOnNzIHR0In07CgogICAgQVNTRVJUKGlJbmRleDxGWF9BcnJheVNpemUoY0Zvcm1hdHMpKTsKCiAgICBpZiAoaUluZGV4IDwgMCkKICAgICAgICBpSW5kZXggPSAwOwogICAgaWYgKGlJbmRleCA+PSBGWF9BcnJheVNpemUoY0Zvcm1hdHMpKQogICAgICAgIGlJbmRleCA9IDA7CiAgICBDSlNfUGFyYW1ldGVycyBuZXdQYXJhbXM7CiAgICBDSlNfVmFsdWUgdmFsKGlzb2xhdGUsY0Zvcm1hdHNbaUluZGV4XSk7CiAgICBuZXdQYXJhbXMucHVzaF9iYWNrKHZhbCk7CiAgICByZXR1cm4gQUZEYXRlX0tleXN0cm9rZUV4KGNjLG5ld1BhcmFtcyx2UmV0LHNFcnJvcik7Cn0KCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGVGltZV9Gb3JtYXRFeChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQp7CiAgICByZXR1cm4gQUZEYXRlX0Zvcm1hdEV4KGNjLHBhcmFtcyx2UmV0LHNFcnJvcik7Cn0KCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGVGltZV9LZXlzdHJva2VFeChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQp7CiAgICByZXR1cm4gQUZEYXRlX0tleXN0cm9rZUV4KGNjLHBhcmFtcyx2UmV0LHNFcnJvcik7Cn0KCi8vZnVuY3Rpb24gQUZTcGVjaWFsX0Zvcm1hdChwc2YpCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGU3BlY2lhbF9Gb3JtYXQoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKewogICAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0ICopY2M7CiAgICBBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CgogICAgaWYgKHBhcmFtcy5zaXplKCkgIT0gMSkKICAgIHsKICAgICAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNRVJST1IpOwogICAgICAgIHJldHVybiBGQUxTRTsKICAgIH0KCiAgICBzdGQ6OnN0cmluZyBjRm9ybWF0OwogICAgaW50IGlJbmRleCA9IHBhcmFtc1swXS5Ub0ludCgpOwoKICAgIENKU19FdmVudEhhbmRsZXIqIHBFdmVudCA9IHBDb250ZXh0LT5HZXRFdmVudEhhbmRsZXIoKTsKICAgIEFTU0VSVChwRXZlbnQgIT0gTlVMTCk7CgogICAgaWYoIXBFdmVudC0+bV9wVmFsdWUpCiAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlID0gcEV2ZW50LT5WYWx1ZSgpOwogICAgc3RkOjpzdHJpbmcgc3RyU3JjID0gQ0ZYX0J5dGVTdHJpbmc6OkZyb21Vbmljb2RlKFZhbHVlKS5jX3N0cigpOwoKICAgIHN3aXRjaCAoaUluZGV4KQogICAgewogICAgY2FzZSAwOgogICAgICAgIGNGb3JtYXQgPSAiOTk5OTkiOwogICAgICAgIGJyZWFrOwogICAgY2FzZSAxOgogICAgICAgIGNGb3JtYXQgPSAiOTk5OTktOTk5OSI7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIDI6CiAgICAgICAgewogICAgICAgICAgICBzdGQ6OnN0cmluZyBOdW1iZXJTdHI7CiAgICAgICAgICAgIHV0aWw6OnByaW50eCgiOTk5OTk5OTk5OSIsIHN0clNyYyxOdW1iZXJTdHIpOwogICAgICAgICAgICBpZiAoTnVtYmVyU3RyLmxlbmd0aCgpID49IDEwICkKICAgICAgICAgICAgICAgIGNGb3JtYXQgPSAiKDk5OSkgOTk5LTk5OTkiOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBjRm9ybWF0ID0gIjk5OS05OTk5IjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgY2FzZSAzOgogICAgICAgIGNGb3JtYXQgPSAiOTk5LTk5LTk5OTkiOwogICAgICAgIGJyZWFrOwogICAgfQoKICAgIHN0ZDo6c3RyaW5nIHN0ckRlczsKICAgIHV0aWw6OnByaW50eChjRm9ybWF0LHN0clNyYyxzdHJEZXMpOwogICAgVmFsdWUgPSBDRlhfV2lkZVN0cmluZzo6RnJvbUxvY2FsKHN0ckRlcy5jX3N0cigpKTsKICAgIHJldHVybiBUUlVFOwp9CgoKLy9mdW5jdGlvbiBBRlNwZWNpYWxfS2V5c3Ryb2tlRXgobWFzaykKRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZTcGVjaWFsX0tleXN0cm9rZUV4KElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCnsKICAgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCAqKWNjOwogICAgQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwogICAgQ0pTX0V2ZW50SGFuZGxlciogcEV2ZW50ID0gcENvbnRleHQtPkdldEV2ZW50SGFuZGxlcigpOwoKICAgIEFTU0VSVChwRXZlbnQgIT0gTlVMTCk7CgogICAgaWYgKHBhcmFtcy5zaXplKCkgPCAxKQogICAgewogICAgICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7CiAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgfQoKICAgIGlmKCFwRXZlbnQtPm1fcFZhbHVlKQogICAgICAgIHJldHVybiBGQUxTRTsKICAgIENGWF9XaWRlU3RyaW5nJiB2YWxFdmVudCA9IHBFdmVudC0+VmFsdWUoKTsKCiAgICBDRlhfV2lkZVN0cmluZyB3c3RyTWFzayA9IHBhcmFtc1swXS5Ub0NGWFdpZGVTdHJpbmcoKTsKICAgIGlmICh3c3RyTWFzay5Jc0VtcHR5KCkpCiAgICAgICAgcmV0dXJuIFRSVUU7CgogICAgc3RkOjp3c3RyaW5nIHdzdHJWYWx1ZSA9IHZhbEV2ZW50LmNfc3RyKCk7CgogICAgaWYgKHBFdmVudC0+V2lsbENvbW1pdCgpKQogICAgewogICAgICAgIGlmICh3c3RyVmFsdWUuZW1wdHkoKSkKICAgICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgICAgaW50IGlJbmRleE1hc2sgPSAwOwogICAgICAgIGZvciAoc3RkOjp3c3RyaW5nOjppdGVyYXRvciBpdCA9IHdzdHJWYWx1ZS5iZWdpbigpOyBpdCAhPSB3c3RyVmFsdWUuZW5kKCk7IGl0KyspCiAgICAgICAgewogICAgICAgICAgICB3Y2hhcl90IHdfVmFsdWUgPSAqaXQ7CiAgICAgICAgICAgIGlmICghbWFza1NhdGlzZmllZCh3X1ZhbHVlLHdzdHJNYXNrW2lJbmRleE1hc2tdKSkKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBpSW5kZXhNYXNrKys7CiAgICAgICAgfQoKICAgICAgICBpZiAoaUluZGV4TWFzayAhPSB3c3RyTWFzay5HZXRMZW5ndGgoKSB8fCAoaUluZGV4TWFzayAhPSB3c3RyVmFsdWUuc2l6ZSgpICYmIHdzdHJNYXNrLkdldExlbmd0aCgpICE9IDApKQogICAgICAgIHsKICAgICAgICAgICAgQWxlcnQocENvbnRleHQsIEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTQUZOVU1CRVJfS0VZU1RST0tFKS5jX3N0cigpKTsKICAgICAgICAgICAgcEV2ZW50LT5SYygpID0gRkFMU0U7CiAgICAgICAgfQogICAgICAgIHJldHVybiBUUlVFOwogICAgfQoKICAgIENGWF9XaWRlU3RyaW5nICZ3aWRlQ2hhbmdlID0gcEV2ZW50LT5DaGFuZ2UoKTsKICAgIHN0ZDo6d3N0cmluZyB3Q2hhbmdlID0gd2lkZUNoYW5nZS5jX3N0cigpOwogICAgaWYgKHdDaGFuZ2UuZW1wdHkoKSkKICAgICAgICByZXR1cm4gVFJVRTsKCiAgICBpbnQgaUluZGV4TWFzayA9IHBFdmVudC0+U2VsU3RhcnQoKTsKCiAgICBpZiAod3N0clZhbHVlLmxlbmd0aCgpIC0gKHBFdmVudC0+U2VsRW5kKCktcEV2ZW50LT5TZWxTdGFydCgpKSArIHdDaGFuZ2UubGVuZ3RoKCkgPiAoRlhfRFdPUkQpd3N0ck1hc2suR2V0TGVuZ3RoKCkpCiAgICB7CiAgICAgICAgQWxlcnQocENvbnRleHQsIEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1fVE9PTE9ORykuY19zdHIoKSk7CiAgICAgICAgcEV2ZW50LT5SYygpID0gRkFMU0U7CiAgICAgICAgcmV0dXJuIFRSVUU7CiAgICB9CgogICAgaWYgKGlJbmRleE1hc2sgPj0gd3N0ck1hc2suR2V0TGVuZ3RoKCkgJiYgKCF3Q2hhbmdlLmVtcHR5KCkpKQogICAgewogICAgICAgIEFsZXJ0KHBDb250ZXh0LCBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNX1RPT0xPTkcpLmNfc3RyKCkpOwogICAgICAgIHBFdmVudC0+UmMoKSA9IEZBTFNFOwogICAgICAgIHJldHVybiBUUlVFOwogICAgfQoKICAgIGZvciAoc3RkOjp3c3RyaW5nOjppdGVyYXRvciBpdCA9IHdDaGFuZ2UuYmVnaW4oKTsgaXQgIT0gd0NoYW5nZS5lbmQoKTsgaXQrKykKICAgIHsKICAgICAgICBpZiAoaUluZGV4TWFzayA+PSB3c3RyTWFzay5HZXRMZW5ndGgoKSkKICAgICAgICB7CiAgICAgICAgICAgIEFsZXJ0KHBDb250ZXh0LCBKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUkFNX1RPT0xPTkcpLmNfc3RyKCkpOwogICAgICAgICAgICBwRXZlbnQtPlJjKCkgPSBGQUxTRTsKICAgICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgICAgfQogICAgICAgIHdjaGFyX3Qgd19NYXNrID0gd3N0ck1hc2tbaUluZGV4TWFza107CiAgICAgICAgaWYgKCFpc1Jlc2VydmVkTWFza0NoYXIod19NYXNrKSkKICAgICAgICB7CiAgICAgICAgICAgICppdCA9IHdfTWFzazsKICAgICAgICB9CiAgICAgICAgd2NoYXJfdCB3X0NoYW5nZSA9ICppdDsKICAgICAgICBpZiAoIW1hc2tTYXRpc2ZpZWQod19DaGFuZ2Usd19NYXNrKSkKICAgICAgICB7CiAgICAgICAgICAgIHBFdmVudC0+UmMoKSA9IEZBTFNFOwogICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICB9CiAgICAgICAgaUluZGV4TWFzaysrOwogICAgfQoKICAgIHdpZGVDaGFuZ2UgPSB3Q2hhbmdlLmNfc3RyKCk7CiAgICByZXR1cm4gVFJVRTsKfQoKCi8vZnVuY3Rpb24gQUZTcGVjaWFsX0tleXN0cm9rZShwc2YpCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGU3BlY2lhbF9LZXlzdHJva2UoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKewogICAgdjg6Oklzb2xhdGUqIGlzb2xhdGUgPSA6OkdldElzb2xhdGUoY2MpOwoKICAgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCAqKWNjOwogICAgQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwogICAgQ0pTX0V2ZW50SGFuZGxlciogcEV2ZW50ID0gcENvbnRleHQtPkdldEV2ZW50SGFuZGxlcigpOwogICAgQVNTRVJUKHBFdmVudCAhPSBOVUxMKTsKCiAgICBpZiAocGFyYW1zLnNpemUoKSAhPSAxKQogICAgewogICAgICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7CiAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgfQoKICAgIHN0ZDo6c3RyaW5nIGNGb3JtYXQ7CiAgICBpbnQgaUluZGV4ID0gcGFyYW1zWzBdLlRvSW50KCk7CgogICAgaWYoIXBFdmVudC0+bV9wVmFsdWUpCiAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgLy9DSlNfVmFsdWUgdmFsID0gcEV2ZW50LT5WYWx1ZSgpOwogICAgQ0ZYX1dpZGVTdHJpbmcmIHZhbCA9IHBFdmVudC0+VmFsdWUoKTsKICAgIHN0ZDo6c3RyaW5nIHN0clNyYyA9IENGWF9CeXRlU3RyaW5nOjpGcm9tVW5pY29kZSh2YWwpLmNfc3RyKCk7CiAgICBzdGQ6OndzdHJpbmcgd3N0ckNoYW5nZSA9IHBFdmVudC0+Q2hhbmdlKCkuY19zdHIoKTsKCiAgICBzd2l0Y2ggKGlJbmRleCkKICAgIHsKICAgIGNhc2UgMDoKICAgICAgICBjRm9ybWF0ID0gIjk5OTk5IjsKICAgICAgICBicmVhazsKICAgIGNhc2UgMToKICAgICAgICAvL2NGb3JtYXQgPSAiOTk5OTktOTk5OSI7CiAgICAgICAgY0Zvcm1hdCA9ICI5OTk5OTk5OTkiOwogICAgICAgIGJyZWFrOwogICAgY2FzZSAyOgogICAgICAgIHsKICAgICAgICAgICAgc3RkOjpzdHJpbmcgTnVtYmVyU3RyOwogICAgICAgICAgICB1dGlsOjpwcmludHgoIjk5OTk5OTk5OTkiLCBzdHJTcmMsTnVtYmVyU3RyKTsKICAgICAgICAgICAgaWYgKHN0clNyYy5sZW5ndGgoKSArIHdzdHJDaGFuZ2UubGVuZ3RoKCkgPiA3ICkKICAgICAgICAgICAgICAgIC8vY0Zvcm1hdCA9ICIoOTk5KSA5OTktOTk5OSI7CiAgICAgICAgICAgICAgICBjRm9ybWF0ID0gIjk5OTk5OTk5OTkiOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAvL2NGb3JtYXQgPSAiOTk5LTk5OTkiOwogICAgICAgICAgICAgICAgY0Zvcm1hdCA9ICI5OTk5OTk5IjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgY2FzZSAzOgogICAgICAgIC8vY0Zvcm1hdCA9ICI5OTktOTktOTk5OSI7CiAgICAgICAgY0Zvcm1hdCA9ICI5OTk5OTk5OTkiOwogICAgICAgIGJyZWFrOwogICAgfQoKICAgIENKU19QYXJhbWV0ZXJzIHBhcmFtczI7CiAgICBDSlNfVmFsdWUgdk1hc2soaXNvbGF0ZSwgY0Zvcm1hdC5jX3N0cigpKTsKICAgIHBhcmFtczIucHVzaF9iYWNrKHZNYXNrKTsKCiAgICByZXR1cm4gQUZTcGVjaWFsX0tleXN0cm9rZUV4KGNjLHBhcmFtczIsdlJldCxzRXJyb3IpOwp9CgpGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRk1lcmdlQ2hhbmdlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCnsKICAgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCAqKWNjOwogICAgQVNTRVJUKHBDb250ZXh0ICE9IE5VTEwpOwogICAgQ0pTX0V2ZW50SGFuZGxlciogcEV2ZW50SGFuZGxlciA9IHBDb250ZXh0LT5HZXRFdmVudEhhbmRsZXIoKTsKICAgIEFTU0VSVChwRXZlbnRIYW5kbGVyICE9IE5VTEwpOwoKICAgIGlmIChwYXJhbXMuc2l6ZSgpICE9IDEpCiAgICB7CiAgICAgICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKICAgICAgICByZXR1cm4gRkFMU0U7CiAgICB9CgogICAgQ0ZYX1dpZGVTdHJpbmcgc3dWYWx1ZTsKICAgIGlmIChwRXZlbnRIYW5kbGVyLT5tX3BWYWx1ZSAhPSBOVUxMKQogICAgICAgIHN3VmFsdWUgPSBwRXZlbnRIYW5kbGVyLT5WYWx1ZSgpOwoKICAgIGlmIChwRXZlbnRIYW5kbGVyLT5XaWxsQ29tbWl0KCkpCiAgICB7CiAgICAgICAgdlJldCA9IHN3VmFsdWUuY19zdHIoKTsKICAgICAgICByZXR1cm4gVFJVRTsKICAgIH0KCiAgICBDRlhfV2lkZVN0cmluZyBwcmVmaXgscG9zdGZpeDsKCiAgICBpZiAocEV2ZW50SGFuZGxlci0+U2VsU3RhcnQoKSA+PSAwKQogICAgICAgIHByZWZpeCA9IHN3VmFsdWUuTWlkKDAscEV2ZW50SGFuZGxlci0+U2VsU3RhcnQoKSk7CiAgICBlbHNlCiAgICAgICAgcHJlZml4ID0gTCIiOwoKCiAgICBpZiAocEV2ZW50SGFuZGxlci0+U2VsRW5kKCkgPj0gMCAmJiBwRXZlbnRIYW5kbGVyLT5TZWxFbmQoKSA8PSBzd1ZhbHVlLkdldExlbmd0aCgpKQogICAgICAgIHBvc3RmaXggPSBzd1ZhbHVlLk1pZChwRXZlbnRIYW5kbGVyLT5TZWxFbmQoKSwgc3dWYWx1ZS5HZXRMZW5ndGgoKSAtIHBFdmVudEhhbmRsZXItPlNlbEVuZCgpKTsKICAgIGVsc2UgcG9zdGZpeCA9IEwiIjsKCiAgICB2UmV0ID0gKHByZWZpeCArIHBFdmVudEhhbmRsZXItPkNoYW5nZSgpICsgcG9zdGZpeCkuY19zdHIoKTsKCiAgICByZXR1cm4gVFJVRTsKfQoKRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZQYXJzZURhdGVFeChJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQp7CiAgICBDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQgKiljYzsKICAgIEFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKCiAgICBpZiAocGFyYW1zLnNpemUoKSAhPSAyKQogICAgewogICAgICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7CiAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgfQoKICAgIENGWF9XaWRlU3RyaW5nIHNWYWx1ZSA9IHBhcmFtc1swXS5Ub0NGWFdpZGVTdHJpbmcoKTsKICAgIENGWF9XaWRlU3RyaW5nIHNGb3JtYXQgPSBwYXJhbXNbMV0uVG9DRlhXaWRlU3RyaW5nKCk7CgogICAgRlhfQk9PTCBiV3JvbmdGb3JtYXQgPSBGQUxTRTsKICAgIGRvdWJsZSBkRGF0ZSA9IE1ha2VSZWd1bGFyRGF0ZShzVmFsdWUsc0Zvcm1hdCxiV3JvbmdGb3JtYXQpOwoKICAgIGlmIChKU19Qb3J0SXNOYW4oZERhdGUpKQogICAgewogICAgICAgIENGWF9XaWRlU3RyaW5nIHN3TXNnOwogICAgICAgIHN3TXNnLkZvcm1hdChKU0dldFN0cmluZ0Zyb21JRChwQ29udGV4dCwgSURTX1NUUklOR19KU1BBUlNFREFURSkuY19zdHIoKSwgc0Zvcm1hdC5jX3N0cigpKTsKICAgICAgICBBbGVydCgoQ0pTX0NvbnRleHQgKiljYywgc3dNc2cuY19zdHIoKSk7CiAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgfQoKICAgIHZSZXQgPSBkRGF0ZTsKICAgIHJldHVybiBUUlVFOwp9CgpGWF9CT09MIENKU19QdWJsaWNNZXRob2RzOjpBRlNpbXBsZShJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQp7CiAgICBpZiAocGFyYW1zLnNpemUoKSAhPSAzKQogICAgewogICAgICAgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCAqKWNjOwogICAgICAgIEFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKCiAgICAgICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKICAgICAgICByZXR1cm4gRkFMU0U7CiAgICB9CgogICAgdlJldCA9IChkb3VibGUpQUZfU2ltcGxlKHBhcmFtc1swXS5Ub0NGWFdpZGVTdHJpbmcoKS5jX3N0cigpLCBwYXJhbXNbMV0uVG9Eb3VibGUoKSwgcGFyYW1zWzJdLlRvRG91YmxlKCkpOwogICAgcmV0dXJuIFRSVUU7Cn0KCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGTWFrZU51bWJlcihJRlhKU19Db250ZXh0KiBjYywgY29uc3QgQ0pTX1BhcmFtZXRlcnMmIHBhcmFtcywgQ0pTX1ZhbHVlJiB2UmV0LCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKQp7CiAgICBpZiAocGFyYW1zLnNpemUoKSAhPSAxKQogICAgewogICAgICAgIENKU19Db250ZXh0KiBwQ29udGV4dCA9IChDSlNfQ29udGV4dCAqKWNjOwogICAgICAgIEFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKCiAgICAgICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKICAgICAgICByZXR1cm4gRkFMU0U7CiAgICB9CiAgICB2UmV0ID0gUGFyc2VTdHJpbmdUb051bWJlcihwYXJhbXNbMF0uVG9DRlhXaWRlU3RyaW5nKCkuY19zdHIoKSk7CiAgICByZXR1cm4gVFJVRTsKfQoKRlhfQk9PTCBDSlNfUHVibGljTWV0aG9kczo6QUZTaW1wbGVfQ2FsY3VsYXRlKElGWEpTX0NvbnRleHQqIGNjLCBjb25zdCBDSlNfUGFyYW1ldGVycyYgcGFyYW1zLCBDSlNfVmFsdWUmIHZSZXQsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpCnsKICAgIHY4OjpJc29sYXRlKiBpc29sYXRlID0gOjpHZXRJc29sYXRlKGNjKTsKCiAgICBDSlNfQ29udGV4dCogcENvbnRleHQgPSAoQ0pTX0NvbnRleHQgKiljYzsKICAgIEFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKCiAgICBpZiAocGFyYW1zLnNpemUoKSAhPSAyKQogICAgewogICAgICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7CiAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgfQoKICAgIENKU19WYWx1ZSBwYXJhbXMxID0gcGFyYW1zWzFdOwoKICAgIGlmICghcGFyYW1zMS5Jc0FycmF5T2JqZWN0KCkgJiYgcGFyYW1zMS5HZXRUeXBlKCkgIT0gVlRfc3RyaW5nKQogICAgewogICAgICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7CiAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgfQoKICAgIENQREZTREtfRG9jdW1lbnQqIHBSZWFkZXJEb2MgPSBwQ29udGV4dC0+R2V0UmVhZGVyRG9jdW1lbnQoKTsKICAgIEFTU0VSVChwUmVhZGVyRG9jICE9IE5VTEwpOwoKICAgIENQREZTREtfSW50ZXJGb3JtKiBwUmVhZGVySW50ZXJGb3JtID0gcFJlYWRlckRvYy0+R2V0SW50ZXJGb3JtKCk7CiAgICBBU1NFUlQocFJlYWRlckludGVyRm9ybSAhPSBOVUxMKTsKCiAgICBDUERGX0ludGVyRm9ybSogcEludGVyRm9ybSA9IHBSZWFkZXJJbnRlckZvcm0tPkdldEludGVyRm9ybSgpOwogICAgQVNTRVJUKHBJbnRlckZvcm0gIT0gTlVMTCk7CgogICAgZG91YmxlIGRWYWx1ZTsKICAgIENGWF9XaWRlU3RyaW5nIHNGdW5jdGlvbiA9IHBhcmFtc1swXS5Ub0NGWFdpZGVTdHJpbmcoKTsKICAgIGlmICh3Y3NjbXAoc0Z1bmN0aW9uLmNfc3RyKCksIEwiUFJEIikgPT0gMCkKICAgICAgICBkVmFsdWUgPSAxLjA7CiAgICBlbHNlCiAgICAgICAgZFZhbHVlID0gMC4wOwoKICAgIENKU19BcnJheSBGaWVsZE5hbWVBcnJheSA9IEFGX01ha2VBcnJheUZyb21MaXN0KGlzb2xhdGUscGFyYW1zMSk7CgogICAgaW50IG5GaWVsZHNDb3VudCA9IDA7CgogICAgZm9yIChpbnQgaT0wLGlzej1GaWVsZE5hbWVBcnJheS5HZXRMZW5ndGgoKTsgaTxpc3o7IGkrKykKICAgIHsKICAgICAgICBDSlNfVmFsdWUganNWYWx1ZShpc29sYXRlKTsKICAgICAgICBGaWVsZE5hbWVBcnJheS5HZXRFbGVtZW50KGksanNWYWx1ZSk7CiAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NGaWVsZE5hbWUgPSBqc1ZhbHVlLlRvQ0ZYV2lkZVN0cmluZygpOwoKICAgICAgICBmb3IgKGludCBqPTAsanN6PXBJbnRlckZvcm0tPkNvdW50RmllbGRzKHdzRmllbGROYW1lKTsgajxqc3o7IGorKykKICAgICAgICB7CiAgICAgICAgICAgIGlmIChDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IHBJbnRlckZvcm0tPkdldEZpZWxkKGosIHdzRmllbGROYW1lKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZG91YmxlIGRUZW1wID0gMC4wOwoKICAgICAgICAgICAgICAgIHN3aXRjaCAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYXNlIEZJRUxEVFlQRV9URVhURklFTEQ6CiAgICAgICAgICAgICAgICBjYXNlIEZJRUxEVFlQRV9DT01CT0JPWDoKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRUZW1wID0gUGFyc2VTdHJpbmdUb051bWJlcihwRm9ybUZpZWxkLT5HZXRWYWx1ZSgpLmNfc3RyKCkpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYXNlIEZJRUxEVFlQRV9QVVNIQlVUVE9OOgogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgZFRlbXAgPSAwLjA7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhc2UgRklFTERUWVBFX0NIRUNLQk9YOgogICAgICAgICAgICAgICAgY2FzZSBGSUVMRFRZUEVfUkFESU9CVVRUT046CiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBkVGVtcCA9IDAuMDsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgYz0wLGNzej1wRm9ybUZpZWxkLT5Db3VudENvbnRyb2xzKCk7IGM8Y3N6OyBjKyspCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChDUERGX0Zvcm1Db250cm9sKiBwRm9ybUN0cmwgPSBwRm9ybUZpZWxkLT5HZXRDb250cm9sKGMpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwRm9ybUN0cmwtPklzQ2hlY2tlZCgpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZFRlbXAgKz0gUGFyc2VTdHJpbmdUb051bWJlcihwRm9ybUN0cmwtPkdldEV4cG9ydFZhbHVlKCkuY19zdHIoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhc2UgRklFTERUWVBFX0xJU1RCT1g6CiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBkVGVtcCA9IDAuMDsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBGb3JtRmllbGQtPkNvdW50U2VsZWN0ZWRJdGVtcygpID4gMSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRUZW1wID0gUGFyc2VTdHJpbmdUb051bWJlcihwRm9ybUZpZWxkLT5HZXRWYWx1ZSgpLmNfc3RyKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChpID09IDAgJiYgaiA9PSAwICYmICh3Y3NjbXAoc0Z1bmN0aW9uLmNfc3RyKCksIEwiTUlOIikgPT0gMCB8fCB3Y3NjbXAoc0Z1bmN0aW9uLmNfc3RyKCksIEwiTUFYIikgPT0gMCkpCiAgICAgICAgICAgICAgICAgICAgZFZhbHVlID0gZFRlbXA7CgogICAgICAgICAgICAgICAgZFZhbHVlID0gQUZfU2ltcGxlKHNGdW5jdGlvbi5jX3N0cigpLCBkVmFsdWUsIGRUZW1wKTsKCiAgICAgICAgICAgICAgICBuRmllbGRzQ291bnQrKzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBpZiAod2NzY21wKHNGdW5jdGlvbi5jX3N0cigpLCBMIkFWRyIpID09IDAgJiYgbkZpZWxkc0NvdW50ID4gMCkKICAgICAgICBkVmFsdWUgLz0gbkZpZWxkc0NvdW50OwoKICAgIGRWYWx1ZSA9IChkb3VibGUpZmxvb3IoZFZhbHVlICogRlhTWVNfcG93KChkb3VibGUpMTAsKGRvdWJsZSk2KSArIDAuNDkpIC8gRlhTWVNfcG93KChkb3VibGUpMTAsKGRvdWJsZSk2KTsKICAgIENKU19WYWx1ZSBqc1ZhbHVlKGlzb2xhdGUsZFZhbHVlKTsKICAgIGlmKChDSlNfRXZlbnRIYW5kbGVyKilwQ29udGV4dC0+R2V0RXZlbnRIYW5kbGVyKCktPm1fcFZhbHVlKQogICAgICAgICgoQ0pTX0V2ZW50SGFuZGxlciopcENvbnRleHQtPkdldEV2ZW50SGFuZGxlcigpKS0+VmFsdWUoKSA9IGpzVmFsdWUuVG9DRlhXaWRlU3RyaW5nKCk7CgogICAgcmV0dXJuIFRSVUU7Cn0KCi8qIFRoaXMgZnVuY3Rpb24gdmFsaWRhdGVzIHRoZSBjdXJyZW50IGV2ZW50IHRvIGVuc3VyZSB0aGF0IGl0cyB2YWx1ZSBpcwoqKiB3aXRoaW4gdGhlIHNwZWNpZmllZCByYW5nZS4gKi8KCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGUmFuZ2VfVmFsaWRhdGUoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKewogICAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0ICopY2M7CiAgICBBU1NFUlQocENvbnRleHQgIT0gTlVMTCk7CiAgICBDSlNfRXZlbnRIYW5kbGVyKiBwRXZlbnQgPSBwQ29udGV4dC0+R2V0RXZlbnRIYW5kbGVyKCk7CiAgICBBU1NFUlQocEV2ZW50ICE9IE5VTEwpOwoKICAgIGlmIChwYXJhbXMuc2l6ZSgpICE9IDQpCiAgICB7CiAgICAgICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKICAgICAgICByZXR1cm4gRkFMU0U7CiAgICB9CgogICAgaWYoIXBFdmVudC0+bV9wVmFsdWUpCiAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgaWYgKHBFdmVudC0+VmFsdWUoKS5Jc0VtcHR5KCkgKQogICAgICAgIHJldHVybiBUUlVFOwogICAgZG91YmxlIGRFZW50VmFsdWUgPSBhdG9mKENGWF9CeXRlU3RyaW5nOjpGcm9tVW5pY29kZShwRXZlbnQtPlZhbHVlKCkpKTsKICAgIEZYX0JPT0wgYkdyZWF0ZXJUaGFuID0gcGFyYW1zWzBdLlRvQm9vbCgpOwogICAgZG91YmxlIGRHcmVhdGVyVGhhbiA9IHBhcmFtc1sxXS5Ub0RvdWJsZSgpOwogICAgRlhfQk9PTCBiTGVzc1RoYW4gPSBwYXJhbXNbMl0uVG9Cb29sKCk7CiAgICBkb3VibGUgZExlc3NUaGFuID0gcGFyYW1zWzNdLlRvRG91YmxlKCk7CiAgICBDRlhfV2lkZVN0cmluZyBzd01zZzsKCiAgICBpZiAoYkdyZWF0ZXJUaGFuICYmIGJMZXNzVGhhbikKICAgIHsKICAgICAgICBpZiAoZEVlbnRWYWx1ZSA8IGRHcmVhdGVyVGhhbiB8fCBkRWVudFZhbHVlID4gZExlc3NUaGFuKQogICAgICAgICAgICBzd01zZy5Gb3JtYXQoSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNSQU5HRTEpLmNfc3RyKCksCiAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXNbMV0uVG9DRlhXaWRlU3RyaW5nKCkuY19zdHIoKSwKICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtc1szXS5Ub0NGWFdpZGVTdHJpbmcoKS5jX3N0cigpKTsKICAgIH0KICAgIGVsc2UgaWYgKGJHcmVhdGVyVGhhbikKICAgIHsKICAgICAgICBpZiAoZEVlbnRWYWx1ZSA8IGRHcmVhdGVyVGhhbikKICAgICAgICAgICAgc3dNc2cuRm9ybWF0KEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUkFOR0UyKS5jX3N0cigpLAogICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zWzFdLlRvQ0ZYV2lkZVN0cmluZygpLmNfc3RyKCkpOwogICAgfQogICAgZWxzZSBpZiAoYkxlc3NUaGFuKQogICAgewogICAgICAgIGlmIChkRWVudFZhbHVlID4gZExlc3NUaGFuKQogICAgICAgICAgICBzd01zZy5Gb3JtYXQoSlNHZXRTdHJpbmdGcm9tSUQocENvbnRleHQsIElEU19TVFJJTkdfSlNSQU5HRTMpLmNfc3RyKCksCiAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXNbM10uVG9DRlhXaWRlU3RyaW5nKCkuY19zdHIoKSk7CiAgICB9CgogICAgaWYgKCFzd01zZy5Jc0VtcHR5KCkpCiAgICB7CiAgICAgICAgQWxlcnQocENvbnRleHQsIHN3TXNnLmNfc3RyKCkpOwogICAgICAgIHBFdmVudC0+UmMoKSA9IEZBTFNFOwogICAgfQogICAgcmV0dXJuIFRSVUU7Cn0KCkZYX0JPT0wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGRXh0cmFjdE51bXMoSUZYSlNfQ29udGV4dCogY2MsIGNvbnN0IENKU19QYXJhbWV0ZXJzJiBwYXJhbXMsIENKU19WYWx1ZSYgdlJldCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikKewogICAgdjg6Oklzb2xhdGUqIGlzb2xhdGUgPSA6OkdldElzb2xhdGUoY2MpOwogICAgQ0pTX0NvbnRleHQqIHBDb250ZXh0ID0gKENKU19Db250ZXh0KiljYzsKICAgIEFTU0VSVChwQ29udGV4dCAhPSBOVUxMKTsKCiAgICBpZiAocGFyYW1zLnNpemUoKSAhPSAxKQogICAgewogICAgICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKHBDb250ZXh0LCBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7CiAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgfQoKICAgIENKU19BcnJheSBudW1zKGlzb2xhdGUpOwoKICAgIENGWF9XaWRlU3RyaW5nIHN0ciA9IHBhcmFtc1swXS5Ub0NGWFdpZGVTdHJpbmcoKTsKICAgIENGWF9XaWRlU3RyaW5nIHNQYXJ0OwoKICAgIGlmIChzdHIuR2V0QXQoMCkgPT0gTCcuJyB8fCBzdHIuR2V0QXQoMCkgPT0gTCcsJykKICAgICAgICBzdHIgPSBMIjAiICsgc3RyOwoKICAgIGludCBuSW5kZXggPSAwOwogICAgZm9yIChpbnQgaT0wLCBzej1zdHIuR2V0TGVuZ3RoKCk7IGk8c3o7IGkrKykKICAgIHsKICAgICAgICBGWF9XQ0hBUiB3YyA9IHN0ci5HZXRBdChpKTsKICAgICAgICBpZiAoSXNEaWdpdCgod2NoYXJfdCl3YykpCiAgICAgICAgewogICAgICAgICAgICBzUGFydCArPSB3YzsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHNQYXJ0LkdldExlbmd0aCgpID4gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbnVtcy5TZXRFbGVtZW50KG5JbmRleCxDSlNfVmFsdWUoaXNvbGF0ZSxzUGFydC5jX3N0cigpKSk7CiAgICAgICAgICAgICAgICBzUGFydCA9IEwiIjsKICAgICAgICAgICAgICAgIG5JbmRleCArKzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBpZiAoc1BhcnQuR2V0TGVuZ3RoKCkgPiAwKQogICAgewogICAgICAgIG51bXMuU2V0RWxlbWVudChuSW5kZXgsQ0pTX1ZhbHVlKGlzb2xhdGUsc1BhcnQuY19zdHIoKSkpOwogICAgfQoKICAgIGlmIChudW1zLkdldExlbmd0aCgpID4gMCkKICAgICAgICB2UmV0ID0gbnVtczsKICAgIGVsc2UKICAgICAgICB2UmV0LlNldE51bGwoKTsKCiAgICByZXR1cm4gVFJVRTsKfQo=