Lyogdm1zaWZ5LmMgLS0gTW9kdWxlIGZvciB2bXMgPC0+IHVuaXggZmlsZSBuYW1lIGNvbnZlcnNpb24KQ29weXJpZ2h0IChDKSAxOTk2LTIwMTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuClRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBNYWtlLgoKR05VIE1ha2UgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQpGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgp2ZXJzaW9uLgoKR05VIE1ha2UgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZCldBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SCkEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgoKWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAp0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwoKLyogV3JpdHRlbiBieSBLbGF1cyBL5G1wZiAoa2thZW1wZkBwcm9naXMuZGUpCiAgIG9mIHByb0dJUyBTb2Z0d2FyZSwgQWFjaGVuLCBHZXJtYW55ICovCgoKI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPGN0eXBlLmg+CgojaW5jbHVkZSAibWFrZWludC5oIgoKI2lmIFZNUwojaW5jbHVkZSA8dW5peGxpYi5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxqcGlkZWYuaD4KI2luY2x1ZGUgPGRlc2NyaXAuaD4KI2luY2x1ZGUgPHVhaWRlZi5oPgojaW5jbHVkZSA8c3NkZWYuaD4KI2luY2x1ZGUgPHN0YXJsZXQuaD4KI2luY2x1ZGUgPGxpYiRyb3V0aW5lcy5oPgovKiBJbml0aWFsaXplIGEgc3RyaW5nIGRlc2NyaXB0b3IgKHN0cnVjdCBkc2MkZGVzY3JpcHRvcl9zKSBmb3IgYW4KICAgYXJiaXRyYXJ5IHN0cmluZy4gICBBRERSIGlzIGEgcG9pbnRlciB0byB0aGUgZmlyc3QgY2hhcmFjdGVyCiAgIG9mIHRoZSBzdHJpbmcsIGFuZCBMRU4gaXMgdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nLiAqLwoKI2RlZmluZSBJTklUX0RTQ19TKGRzYywgYWRkciwgbGVuKSBkbyB7IFwKICAoZHNjKS5kc2MkYl9kdHlwZSA9IERTQyRLX0RUWVBFX1Q7ICAgIFwKICAoZHNjKS5kc2MkYl9jbGFzcyA9IERTQyRLX0NMQVNTX1M7ICAgIFwKICAoZHNjKS5kc2Mkd19sZW5ndGggPSAobGVuKTsgICAgICAgICAgIFwKICAoZHNjKS5kc2MkYV9wb2ludGVyID0gKGFkZHIpOyAgICAgICAgIFwKfSB3aGlsZSAoMCkKCi8qIEluaXRpYWxpemUgYSBzdHJpbmcgZGVzY3JpcHRvciAoc3RydWN0IGRzYyRkZXNjcmlwdG9yX3MpIGZvciBhCiAgIE5VTC10ZXJtaW5hdGVkIHN0cmluZy4gIFMgaXMgYSBwb2ludGVyIHRvIHRoZSBzdHJpbmc7IHRoZSBsZW5ndGgKICAgaXMgZGV0ZXJtaW5lZCBieSBjYWxsaW5nIHN0cmxlbigpLiAqLwoKI2RlZmluZSBJTklUX0RTQ19DU1RSSU5HKGRzYywgcykgSU5JVF9EU0NfUyhkc2MsIHMsIHN0cmxlbihzKSkKI2VuZGlmCgovKgogIGNvcHkgJ2Zyb20nIHRvICd0bycgdXAgdG8gYnV0IG5vdCBpbmNsdWRpbmcgJ3VwdG8nCiAgcmV0dXJuIDAgaWYgZW9zIG9uIGZyb20KICByZXR1cm4gMSBpZiB1cHRvIGZvdW5kCgogIHJldHVybiAndG8nIGF0IGxhc3QgY2hhciArIDEKICByZXR1cm4gJ2Zyb20nIGF0IG1hdGNoICsgMSBvciBlb3MgaWYgbm8gbWF0Y2gKCiAgaWYgYXNfZGlyID09IDEsIGNoYW5nZSBhbGwgJy4nIHRvICdfJwogIGVsc2UgY2hhbmdlIGFsbCAnLicgYnV0IHRoZSBsYXN0IHRvICdfJwoqLwoKc3RhdGljIGludApjb3B5dG8gKGNoYXIgKip0bywgY29uc3QgY2hhciAqKmZyb20sIGNoYXIgdXB0bywgaW50IGFzX2RpcikKewogIGNvbnN0IGNoYXIgKnM7CgogIHMgPSBzdHJyY2hyICgqZnJvbSwgJy4nKTsKCiAgd2hpbGUgKCoqZnJvbSkKICAgIHsKICAgICAgaWYgKCoqZnJvbSA9PSB1cHRvKQoJewoJICBkbwoJICAgIHsKCSAgICAgICgqZnJvbSkrKzsKCSAgICB9CgkgIHdoaWxlICgqKmZyb20gPT0gdXB0byk7CgkgIHJldHVybiAxOwoJfQogICAgICBpZiAoKipmcm9tID09ICcuJykKCXsKCSAgaWYgKChhc19kaXIgPT0gMSkKCSAgICAgIHx8ICgqZnJvbSAhPSBzKSkKCSAgICAqKnRvID0gJ18nOwoJICBlbHNlCgkgICAgKip0byA9ICcuJzsKCX0KICAgICAgZWxzZQoJewojaWZkZWYgSEFWRV9DQVNFX0lOU0VOU0lUSVZFX0ZTCgkgIGlmIChpc3VwcGVyICgodW5zaWduZWQgY2hhcikqKmZyb20pKQoJICAgICoqdG8gPSB0b2xvd2VyICgodW5zaWduZWQgY2hhcikqKmZyb20pOwoJICBlbHNlCiNlbmRpZgoJICAgICoqdG8gPSAqKmZyb207Cgl9CiAgICAgICgqdG8pKys7CiAgICAgICgqZnJvbSkrKzsKICAgIH0KCiAgcmV0dXJuIDA7Cn0KCgovKgogIGdldCB0cmFuc2xhdGlvbiBvZiBsb2dpY2FsIG5hbWUKCiovCgpzdGF0aWMgY2hhciAqCnRybmxvZyAoY29uc3QgY2hhciAqbmFtZSkKewogIGludCBzdGF0OwogIHN0YXRpYyBjaGFyIHJlc2x0WzEwMjRdOwogICRERVNDUklQVE9SIChyZXNsdF9kc2MsIHJlc2x0KTsKICBzaG9ydCByZXNsdGxlbjsKICBzdHJ1Y3QgZHNjJGRlc2NyaXB0b3JfcyBuYW1lX2RzYzsKICBjaGFyICpzOwoKICAvKgogICAqIHRoZSBzdHJpbmcgaXNuJ3QgY2hhbmdlZCwgYnV0IHRoZXJlIGlzIG5vIHN0cmluZyBkZXNjcmlwdG9yIHdpdGgKICAgKiAiY29uc3QgY2hhciAqZHNjJGFfcG9pbnRlciIKICAgKi8KICBJTklUX0RTQ19DU1RSSU5HIChuYW1lX2RzYywgKGNoYXIgKiluYW1lKTsKCiAgc3RhdCA9IGxpYiRzeXNfdHJubG9nICgmbmFtZV9kc2MsICZyZXNsdGxlbiwgJnJlc2x0X2RzYyk7CgogIGlmICgoc3RhdCYxKSA9PSAwKQogICAgewogICAgICByZXR1cm4gIiI7CiAgICB9CiAgaWYgKHN0YXQgPT0gU1MkX05PVFJBTikKICAgIHsKICAgICAgcmV0dXJuICIiOwogICAgfQogIHJlc2x0W3Jlc2x0bGVuXSA9ICdcMCc7CgogIHMgPSB4bWFsbG9jIChyZXNsdGxlbisxKTsKICBzdHJjcHkgKHMsIHJlc2x0KTsKICByZXR1cm4gczsKfQoKc3RhdGljIGNoYXIgKgpzaG93YWxsIChjaGFyICpzKQp7CiAgc3RhdGljIGNoYXIgdFs1MTJdOwogIGNoYXIgKnB0OwoKICBwdCA9IHQ7CiAgaWYgKHN0cmNociAocywgJ1xcJykgPT0gMCkKICAgIHJldHVybiBzOwogIHdoaWxlICgqcykKICAgIHsKICAgICAgaWYgKCpzID09ICdcXCcpCgl7CgkgICpwdCsrID0gKnM7Cgl9CiAgICAgICpwdCsrID0gKnMrKzsKICAgIH0KICByZXR1cm4gcHQ7Cn0KCgplbnVtIG5hbWVzdGF0ZSB7IE5fU1RBUlQsIE5fREVWSUNFLCBOX09QRU4sIE5fRE9ULCBOX0NMT1NFRCwgTl9ET05FIH07CgovKgogIGNvbnZlcnQgdW5peCBzdHlsZSBuYW1lIHRvIHZtcyBzdHlsZQogIHR5cGUgPSAwIC0+IG5hbWUgaXMgYSBmdWxsIG5hbWUgKGRpcmVjdG9yeSBhbmQgZmlsZW5hbWUgcGFydCkKICB0eXBlID0gMSAtPiBuYW1lIGlzIGEgZGlyZWN0b3J5CiAgdHlwZSA9IDIgLT4gbmFtZSBpcyBhIGZpbGVuYW1lIHdpdGhvdXQgZGlyZWN0b3J5CgogIFRoZSBmb2xsb3dpbmcgY29udmVyc2lvbnMgYXJlIGFwcGxpZWQKCQkJKDApCQkoMSkJCQkoMikKCWlucHV0CQlmdWxsIG5hbWUJZGlyIG5hbWUJCWZpbGUgbmFtZQoKMQkuLwkJPGN3ZD4JCVtdCQkJPGN1cnJlbnQgZGlyZWN0b3J5Pi5kaXIKMgkuLi8JCTxob21lIG9mIGN3ZD4JPGhvbWUgb2YgY3dkPgkJPGhvbWUgb2YgY3dkPi5kaXIKCjMJLy8JCTxkZXYgb2YgY3dkPjoJPGRldiBvZiBjd2Q+OlswMDAwMDBdCTxkZXYgb2YgY3dkPjowMDAwMDAuZGlyCjQJLy9hCQlhOgkJYToJCQlhOgo1CS8vYS8JCWE6CQlhOgkJCWE6MDAwMDAwLmRpcgoKOQkvCQlbMDAwMDAwXQlbMDAwMDAwXQkJMDAwMDAwLmRpcgoxMAkvYQkJWzAwMDAwMF1hCVthXQkJCVswMDAwMDBdYQoxMQkvYS8JCVthXQkJW2FdCQkJWzAwMDAwMF1hLmRpcgoxMgkvYS9iCQlbYV1iCQlbYS5iXQkJCVthXWIKMTMJL2EvYi8JCVthLmJdCQlbYS5iXQkJCVthXWIuZGlyCjE0CS9hL2IvYwkJW2EuYl1jCQlbYS5iLmNdCQkJW2EuYl1jCjE1CS9hL2IvYy8JCVthLmIuY10JCVthLmIuY10JCQlbYS5iXWMuZGlyCgoxNglhCQlhCQlbLmFdCQkJYQoxNwlhLwkJWy5hXQkJWy5hXQkJCWEuZGlyCjE4CWEvYgkJWy5hXWIJCVsuYS5iXQkJCVsuYV1iCjE5CWEvYi8JCVsuYS5iXQkJWy5hLmJdCQkJWy5hXWIuZGlyCjIwCWEvYi9jCQlbLmEuYl1jCQlbLmEuYi5jXQkJWy5hLmJdYwoyMQlhL2IvYy8JCVsuYS5iLmNdCVsuYS5iLmNdCQlbLmEuYl1jLmRpcgoKMjIJYS5iLmMJCWFfYi5jCQlbLmFfYl9jXQkJYV9iX2MuZGlyCgoyMwlbeF1beV16CQlbeC55XXoJCVt4LnldegkJCVt4LnldegoyNAlbeF1bLnldeglbeC55XXoJCVt4LnldegkJCVt4LnldegoKMjUgIGZpbGVuYW1lcyB3aXRoICckJyAgYXJlIGxlZnQgdW5jaGFuZ2VkIGlmIHRoZXkgY29udGFpbiBubyAnLycKMjUgIGZpbGVuYW1lcyB3aXRoICc6JyBhcmUgbGVmdCB1bmNoYW5nZWQKMjYgIGZpbGVuYW1lcyB3aXRoIGEgc2luZ2xlIHBhaXIgb2YgJ1snICddJyBhcmUgbGVmdCB1bmNoYW5nZWQKCiAgVGhlIGlucHV0IHN0cmluZyBpcyBub3Qgd3JpdHRlbiB0by4gIFRoZSByZXN1bHQgaXMgYWxzbyBjb25zdCBiZWNhdXNlCiAgaXQncyBhIHN0YXRpYyBidWZmZXI7IHdlIGRvbid0IHdhbnQgdG8gY2hhbmdlIGl0LgoqLwoKY29uc3QgY2hhciAqCnZtc2lmeSAoY29uc3QgY2hhciAqbmFtZSwgaW50IHR5cGUpCnsKLyogbWF4IDI1NSBkZXZpY2UKICAgbWF4IDM5IGRpcmVjdG9yeQogICBtYXggMzkgZmlsZW5hbWUKICAgbWF4IDM5IGZpbGV0eXBlCiAgIG1heCA1IHZlcnNpb24KKi8KLyogdG9kbzogVk1TTUFYUEFUSExFTiBpcyBkZWZpbmVkIGZvciBPRFMyIG5hbWVzOiBpdCBuZWVkcyB0byBiZSBhZGp1c3RlZC4gKi8KI2RlZmluZSBWTVNNQVhQQVRITEVOIDUxMgoKICBlbnVtIG5hbWVzdGF0ZSBuc3RhdGU7CiAgc3RhdGljIGNoYXIgdm1zbmFtZVtWTVNNQVhQQVRITEVOKzFdOwogIGNvbnN0IGNoYXIgKmZwdHI7CiAgY29uc3QgY2hhciAqdDsKICBjaGFyICp2cHRyOwogIGludCBhc19kaXI7CiAgaW50IGNvdW50OwogIGNvbnN0IGNoYXIgKnM7CiAgY29uc3QgY2hhciAqczE7CiAgY29uc3QgY2hhciAqczI7CgogIGlmIChuYW1lID09IDApCiAgICByZXR1cm4gMDsKICBmcHRyID0gbmFtZTsKICB2cHRyID0gdm1zbmFtZTsKICBuc3RhdGUgPSBOX1NUQVJUOwoKICAvKiBjYXNlIDI1YSAqLwogIHQgPSBzdHJwYnJrIChuYW1lLCAiJDoiKTsKCiAgaWYgKHQgIT0gMCkKICAgIHsKLy8gICAgICBjb25zdCBjaGFyICpzMTsKLy8gICAgICBjb25zdCBjaGFyICpzMjsKCiAgICAgIGlmICh0eXBlID09IDEpCiAgICAgICAgewogICAgICAgICAgczEgPSBzdHJjaHIgKHQrMSwgJ1snKTsKICAgICAgICAgIHMyID0gc3RyY2hyICh0KzEsICddJyk7CiAgICAgICAgfQoKICAgICAgaWYgKCp0ID09ICckJykKICAgICAgICB7CiAgICAgICAgICBpZiAoc3RyY2hyIChuYW1lLCAnLycpID09IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICBzdHJjcHkgKHZtc25hbWUsIG5hbWUpOwogICAgICAgICAgICAgIGlmICgodHlwZSA9PSAxKSAmJiAoczEgIT0gMCkgJiYgKHMyID09IDApKQogICAgICAgICAgICAgICAgc3RyY2F0ICh2bXNuYW1lLCAiXSIpOwogICAgICAgICAgICAgIHJldHVybiB2bXNuYW1lOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgc3RyY3B5ICh2bXNuYW1lLCBuYW1lKTsKICAgICAgICAgIGlmICgodHlwZSA9PSAxKSAmJiAoczEgIT0gMCkgJiYgKHMyID09IDApKQogICAgICAgICAgICBzdHJjYXQgKHZtc25hbWUsICJdIik7CiAgICAgICAgICByZXR1cm4gdm1zbmFtZTsKICAgICAgICB9CiAgICB9CgogIC8qIGNhc2UgMjYgKi8KICB0ID0gc3RyY2hyIChuYW1lLCAnWycpOwoKICBpZiAodCAhPSAwKQogICAgewovLyAgICAgIGNvbnN0IGNoYXIgKnM7Ci8vICAgICAgY29uc3QgY2hhciAqczEgPSBzdHJjaHIgKHQrMSwgJ1snKTsKICAgICAgczEgPSBzdHJjaHIgKHQrMSwgJ1snKTsKICAgICAgaWYgKHMxID09IDApCgl7CiAgICAgICAgICBzdHJjcHkgKHZtc25hbWUsIG5hbWUpOwoJICBpZiAoKHR5cGUgPT0gMSkgJiYgKHN0cmNociAodCsxLCAnXScpID09IDApKQogICAgICAgICAgICBzdHJjYXQgKHZtc25hbWUsICJdIik7CiAgICAgICAgICByZXR1cm4gdm1zbmFtZTsKCX0KICAgICAgczEtLTsKICAgICAgaWYgKCpzMSAhPSAnXScpCgl7CiAgICAgICAgICBzdHJjcHkgKHZtc25hbWUsIG5hbWUpOwoJICByZXR1cm4gdm1zbmFtZTsJCS8qIG5vdCBdWywga2VlcCB1bmNoYW5nZWQgKi8KCX0KCiAgICAgIC8qIHdlIGhhdmUgXVsgKi8KCiAgICAgIHMgPSBuYW1lOwoKICAgICAgLyogcyAgLT4gc3RhcnRpbmcgY2hhcgoJIHMxIC0+IGVuZGluZyAnXScgICovCiAgICAgIGRvCgl7CgkgIHN0cm5jcHkgKHZwdHIsIHMsIHMxLXMpOwkvKiBjb3B5IHVwIHRvIGJ1dCBub3QgaW5jbHVkaW5nICddJyAqLwoJICB2cHRyICs9IHMxLXM7CgkgIGlmICgqczEgPT0gMCkKCSAgICBicmVhazsKCSAgcyA9IHMxICsgMTsJCQkvKiBzIC0+IGNoYXIgYmVoaW5kICddJyAqLwoJICBpZiAoKnMgIT0gJ1snKQkJLyogd2FzICddWycgPyAqLwoJICAgIGJyZWFrOwkJCS8qIG5vLCBsYXN0IF0gZm91bmQsIGV4aXQgKi8KCSAgcysrOwoJICBpZiAoKnMgIT0gJy4nKQoJICAgICp2cHRyKysgPSAnLic7CgkgIHMxID0gc3RyY2hyIChzLCAnXScpOwoJICBpZiAoczEgPT0gMCkJCQkvKiBubyBjbG9zaW5nIF0gKi8KCSAgICBzMSA9IHMgKyBzdHJsZW4gKHMpOwoJfQogICAgICB3aGlsZSAoMSk7CgogICAgICAqdnB0cisrID0gJ10nOwoKICAgICAgZnB0ciA9IHM7CgogICAgfQogIGVsc2UJCS8qIG5vIFsgaW4gbmFtZSAqLwogICAgewogICAgICBpbnQgc3RhdGUgPSAwOwogICAgICBpbnQgcm9vdGVkID0gMTsJLyogZmxhZyBpZiBsb2dpY2FsIGlzIHJvb3RlZCwgZWxzZSBpbnNlcnQgWzAwMDAwMF0gKi8KCiAgICAgIGRvCgl7CiAgICAgIHN3aXRjaCAoc3RhdGUpCgl7CgkgIGNhc2UgMDoJCQkJLyogc3RhcnQgb2YgbG9vcCAqLwoJICAgIGlmICgqZnB0ciA9PSAnLycpCgkgICAgICB7CgkJZnB0cisrOwoJCXN0YXRlID0gMTsKCSAgICAgIH0KCSAgICBlbHNlIGlmICgqZnB0ciA9PSAnLicpCgkgICAgICB7CgkJZnB0cisrOwoJCXN0YXRlID0gMTA7CgkgICAgICB9CgkgICAgZWxzZQoJICAgICAgc3RhdGUgPSAyOwoJICAgIGJyZWFrOwoKCSAgY2FzZSAxOgkJCQkvKiAnLycgYXQgc3RhcnQgKi8KCSAgICBpZiAoKmZwdHIgPT0gJy8nKQoJICAgICAgewoJCWZwdHIrKzsKCQlzdGF0ZSA9IDM7CgkgICAgICB9CgkgICAgZWxzZQoJICAgICAgc3RhdGUgPSA0OwoJICAgIGJyZWFrOwoKCSAgY2FzZSAyOgkJCQkvKiBubyAnLycgYXQgc3RhcnQgKi8KICAgICAgICAgICAgewogICAgICAgICAgICBjb25zdCBjaGFyICpzID0gc3RyY2hyIChmcHRyLCAnLycpOwoJICAgIGlmIChzID09IDApCQkJLyogbm8gJy8nICgxNikgKi8KCSAgICAgIHsKCQlpZiAodHlwZSA9PSAxKQoJCSAgewoJCSAgICBzdHJjcHkgKHZwdHIsICJbLiIpOwoJCSAgICB2cHRyICs9IDI7CgkJICB9CgkJY29weXRvICgmdnB0ciwgJmZwdHIsIDAsICh0eXBlPT0xKSk7CgkJaWYgKHR5cGUgPT0gMSkKCQkgICp2cHRyKysgPSAnXSc7CgkJc3RhdGUgPSAtMTsKCSAgICAgIH0KCSAgICBlbHNlCQkJLyogZm91bmQgJy8nICgxNy4uMjEpICovCgkgICAgICB7CgkJaWYgKCh0eXBlID09IDIpCgkJICAgICYmICgqKHMrMSkgPT0gMCkpCS8qIDE3KDIpICovCgkJICB7CgkJICAgIGNvcHl0byAoJnZwdHIsICZmcHRyLCAnLycsIDEpOwoJCSAgICBzdGF0ZSA9IDc7CgkJICB9CgkJZWxzZQoJCSAgewoJCSAgICBzdHJjcHkgKHZwdHIsICJbLiIpOwoJCSAgICB2cHRyICs9IDI7CgkJICAgIGNvcHl0byAoJnZwdHIsICZmcHRyLCAnLycsIDEpOwoJCSAgICBuc3RhdGUgPSBOX09QRU47CgkJICAgIHN0YXRlID0gOTsKCQkgIH0KCSAgICAgIH0KCSAgICBicmVhazsKICAgICAgICAgICAgfQoKCSAgY2FzZSAzOgkJCQkvKiAnLy8nIGF0IHN0YXJ0ICovCiAgICAgICAgICAgIHsKLy8gICAgICAgICAgICBjb25zdCBjaGFyICpzOwovLyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnMxOwogICAgICAgICAgICBjaGFyICp2cDsKCSAgICB3aGlsZSAoKmZwdHIgPT0gJy8nKQkvKiBjb2xsYXBzZSBhbGwgJy8nICovCgkgICAgICBmcHRyKys7CgkgICAgaWYgKCpmcHRyID09IDApCQkvKiBqdXN0IC8vICovCgkgICAgICB7CgkJY2hhciBjd2RidWZbVk1TTUFYUEFUSExFTisxXTsKCgkJczEgPSBnZXRjd2QoY3dkYnVmLCBWTVNNQVhQQVRITEVOKTsKCQlpZiAoczEgPT0gMCkKCQkgIHsKICAgICAgICAgICAgICAgICAgICB2bXNuYW1lWzBdID0gJ1wwJzsKCQkgICAgcmV0dXJuIHZtc25hbWU7CS8qIEZJWE1FLCBlcnIgZ2V0Y3dkICovCgkJICB9CgkJcyA9IHN0cmNociAoczEsICc6Jyk7CgkJaWYgKHMgPT0gMCkKCQkgIHsKICAgICAgICAgICAgICAgICAgICB2bXNuYW1lWzBdID0gJ1wwJzsKCQkgICAgcmV0dXJuIHZtc25hbWU7CS8qIEZJWE1FLCBlcnIgbm8gZGV2aWNlICovCgkJICB9CgkJc3RybmNweSAodnB0ciwgczEsIHMtczErMSk7CgkJdnB0ciArPSBzLXMxKzE7CgkJc3RhdGUgPSAtMTsKCQlicmVhazsKCSAgICAgIH0KCgkgICAgcyA9IHZwdHI7CgoJICAgIGlmIChjb3B5dG8gKCZ2cHRyLCAmZnB0ciwgJy8nLCAxKSA9PSAwKQkvKiBjb3B5IGRldmljZSBwYXJ0ICovCgkgICAgICB7CgkJKnZwdHIrKyA9ICc6JzsKCQlzdGF0ZSA9IC0xOwoJCWJyZWFrOwoJICAgICAgfQoJICAgICp2cHRyID0gJzonOwoJICAgIG5zdGF0ZSA9IE5fREVWSUNFOwoJICAgIGlmICgqZnB0ciA9PSAwKQkvKiBqdXN0ICcvL2EvJyAqLwoJICAgICAgewoJCXN0cmNweSAodnB0cisxLCAiWzAwMDAwMF0iKTsKCQl2cHRyICs9IDk7CgkJc3RhdGUgPSAtMTsKCQlicmVhazsKCSAgICAgIH0KCSAgICAqdnB0ciA9IDA7CgkJCQkvKiBjaGVjayBsb2dpY2FsIGZvciBbMDAwMDAwXSBpbnNlcnRpb24gKi8KCSAgICB2cCA9IHRybmxvZyAocyk7CgkgICAgaWYgKCp2cCAhPSAnXDAnKQoJICAgICAgewkJCS8qIGZvdW5kIHRyYW5zbGF0aW9uICovCgkJZm9yICg7OykJLyogbG9vcCBvdmVyIGFsbCBuZXN0ZWQgbG9naWNhbHMgKi8KCQkgIHsKCQkgICAgY2hhciAqdnAyID0gdnAgKyBzdHJsZW4gKHZwKSAtIDE7CgkJICAgIGlmICgqdnAyID09ICc6JykJLyogdHJhbnNsYXRpb24gZW5kcyBpbiAnOicgKi8KCQkgICAgICB7CgkJCXZwMiA9IHRybmxvZyAodnApOwoJCQlmcmVlICh2cCk7CgkJCWlmICgqdnAyID09IDApCgkJCSAgewoJCQkgICAgcm9vdGVkID0gMDsKCQkJICAgIGJyZWFrOwoJCQkgIH0KCQkJdnAgPSB2cDI7CgkJCWNvbnRpbnVlOwkvKiBuZXh0IGl0ZXJhdGlvbiAqLwoJCSAgICAgIH0KCQkgICAgaWYgKCp2cDIgPT0gJ10nKQkvKiB0cmFuc2xhdGlvbiBlbmRzIGluICddJyAqLwoJCSAgICAgIHsKCQkJaWYgKCoodnAyLTEpID09ICcuJykJLyogZW5kcyBpbiAnLl0nICovCgkJCSAgewoJCQkgICAgaWYgKHN0cm5jbXAgKGZwdHIsICIwMDAwMDAiLCA2KSAhPSAwKQoJCQkgICAgICByb290ZWQgPSAwOwoJCQkgIH0KCQkJZWxzZQoJCQkgIHsKCQkJICAgIHN0cmNweSAodm1zbmFtZSwgczEpOwoJCQkgICAgdnAgPSBzdHJjaHIgKHZtc25hbWUsICddJyk7CgkJCSAgICAqdnAgPSAnLic7CgkJCSAgICBuc3RhdGUgPSBOX0RPVDsKCQkJICAgIHZwdHIgPSB2cDsKCQkJICB9CgkJICAgICAgfQoJCSAgICBicmVhazsKCQkgIH0KCQlmcmVlICh2cCk7CgkgICAgICB9CgkgICAgZWxzZQoJICAgICAgcm9vdGVkID0gMDsKCgkgICAgaWYgKCp2cHRyID09IDApCgkgICAgICB7CgkJbnN0YXRlID0gTl9ERVZJQ0U7CgkgICAgICAgICp2cHRyKysgPSAnOic7CgkgICAgICB9CgkgICAgZWxzZQoJICAgICAgdnB0cisrOwoKCSAgICBpZiAocm9vdGVkID09IDApCgkgICAgICB7CgkJbnN0YXRlID0gTl9ET1Q7CgkgICAgICAgIHN0cmNweSAodnB0ciwgIlswMDAwMDAuIik7CgkJdnB0ciArPSA4OwoJCXZwID0gdnB0ci0xOwoJICAgICAgfQoJICAgIGVsc2UKCSAgICAgIHZwID0gMDsKCiAgICAgICAgICAgIC8qIHZwLT4gJy4nIGFmdGVyIDAwMDAwMCBvciBOVUxMICovCgoJICAgIHMgPSBzdHJjaHIgKGZwdHIsICcvJyk7CgkgICAgaWYgKHMgPT0gMCkKCSAgICAgIHsJCQkJLyogbm8gbmV4dCAnLycgKi8KCQlpZiAoKih2cHRyLTEpID09ICcuJykKCQkgICoodnB0ci0xKSA9ICddJzsKCQllbHNlIGlmIChyb290ZWQgPT0gMCkKCQkgICp2cHRyKysgPSAnXSc7CgkJY29weXRvICgmdnB0ciwgJmZwdHIsIDAsICh0eXBlID09IDEpKTsKCQlzdGF0ZSA9IC0xOwoJCWJyZWFrOwoJICAgICAgfQoJICAgIGVsc2UKCSAgICAgIHsKCQl3aGlsZSAoKihzKzEpID09ICcvJykJLyogc2tpcCBtdWx0aXBsZSAnLycgKi8KCQkgIHMrKzsKCSAgICAgIH0KCgkgICAgaWYgKChyb290ZWQgIT0gMCkKCSAgICAgICAgJiYgKCoodnB0ci0xKSAhPSAnLicpKQoJICAgICAgewoJCSp2cHRyKysgPSAnWyc7CgkJbnN0YXRlID0gTl9ET1Q7CgkgICAgICB9CgkgICAgZWxzZQoJICAgICAgaWYgKChuc3RhdGUgPT0gTl9ET1QpCgkJICYmICh2cCAhPSAwKQoJCSAmJiAoKihzKzEpID09IDApKQoJCXsKCQkgIGlmICh0eXBlID09IDIpCgkJICAgIHsKCQkgICAgICAqdnAgPSAnXSc7CgkJICAgICAgbnN0YXRlID0gTl9DTE9TRUQ7CgkJICAgIH0KCQl9CgkgICAgc3RhdGUgPSA5OwoJICAgIGJyZWFrOwogICAgICAgICAgICB9CgkgIGNhc2UgNDoJCQkJLyogc2luZ2xlICcvJyBhdCBzdGFydCAoOS4uMTUpICovCgkgICAgaWYgKCpmcHRyID09IDApCgkgICAgICBzdGF0ZSA9IDU7CgkgICAgZWxzZQoJICAgICAgc3RhdGUgPSA2OwoJICAgIGJyZWFrOwoKCSAgY2FzZSA1OgkJCQkvKiBqdXN0ICcvJyBhdCBzdGFydCAoOSkgKi8KCSAgICBpZiAodHlwZSAhPSAyKQoJICAgICAgewoJICAgICAgICAqdnB0cisrID0gJ1snOwoJCW5zdGF0ZSA9IE5fT1BFTjsKCSAgICAgIH0KCSAgICBzdHJjcHkgKHZwdHIsICIwMDAwMDAiKTsKCSAgICB2cHRyICs9IDY7CgkgICAgaWYgKHR5cGUgPT0gMikKCSAgICAgIHN0YXRlID0gNzsKCSAgICBlbHNlCgkgICAgICBzdGF0ZSA9IDg7CgkgICAgYnJlYWs7CgoJICBjYXNlIDY6CQkvKiBjaGFycyBmb2xsb3dpbmcgJy8nIGF0IHN0YXJ0IDEwLi4xNSAqLwogICAgICAgICAgICB7CiAgICAgICAgICAgIGNvbnN0IGNoYXIgKnM7CgkgICAgKnZwdHIrKyA9ICdbJzsKCSAgICBuc3RhdGUgPSBOX09QRU47CgkgICAgcyA9IHN0cmNociAoZnB0ciwgJy8nKTsKCSAgICBpZiAocyA9PSAwKQkJCS8qIDEwICovCgkgICAgICB7CgkJaWYgKHR5cGUgIT0gMSkKCQkgIHsKCQkgICAgc3RyY3B5ICh2cHRyLCAiMDAwMDAwXSIpOwoJCSAgICB2cHRyICs9IDc7CgkJICB9CgkJY29weXRvICgmdnB0ciwgJmZwdHIsIDAsICh0eXBlID09IDEpKTsKCQlpZiAodHlwZSA9PSAxKQoJCSAgewoJCSAgICAqdnB0cisrID0gJ10nOwoJCSAgfQoJCXN0YXRlID0gLTE7CgkgICAgICB9CgkgICAgZWxzZQkJCS8qIDExLi4xNSAqLwoJICAgICAgewoJCWlmICggKHR5cGUgPT0gMikKCQkgICAmJiAoKihzKzEpID09IDApKQkvKiAxMSgyKSAqLwoJCSAgewoJCSAgICBzdHJjcHkgKHZwdHIsICIwMDAwMDBdIik7CgkJICAgIG5zdGF0ZSA9IE5fQ0xPU0VEOwoJCSAgICB2cHRyICs9IDc7CgkJICB9CgkJY29weXRvICgmdnB0ciwgJmZwdHIsICcvJywgKCoodnB0ci0xKSAhPSAnXScpKTsKCQlzdGF0ZSA9IDk7CgkgICAgICB9CgkgICAgYnJlYWs7CiAgICAgICAgICAgIH0KCgkgIGNhc2UgNzoJCQkJLyogYWRkICcuZGlyJyBhbmQgZXhpdCAqLwoJICAgIGlmICgobnN0YXRlID09IE5fT1BFTikKCQl8fCAobnN0YXRlID09IE5fRE9UKSkKCSAgICAgIHsKCQljaGFyICp2cCA9IHZwdHItMTsKCQl3aGlsZSAodnAgPiB2bXNuYW1lKQoJCSAgewoJCSAgICBpZiAoKnZwID09ICddJykKCQkgICAgICB7CgkJCWJyZWFrOwoJCSAgICAgIH0KCQkgICAgaWYgKCp2cCA9PSAnLicpCgkJICAgICAgewoJCQkqdnAgPSAnXSc7CgkJCWJyZWFrOwoJCSAgICAgIH0KCQkgICAgdnAtLTsKCQkgIH0KCSAgICAgIH0KCSAgICBzdHJjcHkgKHZwdHIsICIuZGlyIik7CgkgICAgdnB0ciArPSA0OwoJICAgIHN0YXRlID0gLTE7CgkgICAgYnJlYWs7CgoJICBjYXNlIDg6CQkJCS8qIGFkZCAnXScgYW5kIGV4aXQgKi8KCSAgICAqdnB0cisrID0gJ10nOwoJICAgIHN0YXRlID0gLTE7CgkgICAgYnJlYWs7CgoJICBjYXNlIDk6CQkJLyogMTcuLjIxLCBmcHRyIC0+IDFzdCAnLycgKyAxICovCiAgICAgICAgICAgIHsKICAgICAgICAgICAgY29uc3QgY2hhciAqczsKCSAgICBpZiAoKmZwdHIgPT0gMCkKCSAgICAgIHsKCQlpZiAodHlwZSA9PSAyKQoJCSAgewoJCSAgICBzdGF0ZSA9IDc7CgkJICB9CgkJZWxzZQoJCSAgc3RhdGUgPSA4OwoJCWJyZWFrOwoJICAgICAgfQoJICAgIHMgPSBzdHJjaHIgKGZwdHIsICcvJyk7CgkgICAgaWYgKHMgPT0gMCkKCSAgICAgIHsKCQlpZiAodHlwZSAhPSAxKQoJCSAgewoJCSAgICBpZiAobnN0YXRlID09IE5fT1BFTikKCQkgICAgICB7CgkJCSp2cHRyKysgPSAnXSc7CgkJCW5zdGF0ZSA9IE5fQ0xPU0VEOwoJCSAgICAgIH0KCQkgICAgYXNfZGlyID0gMDsKCQkgIH0KCQllbHNlCgkJICB7CgkJICAgIGlmIChuc3RhdGUgPT0gTl9PUEVOKQoJCSAgICAgIHsKCQkJKnZwdHIrKyA9ICcuJzsKCQkJbnN0YXRlID0gTl9ET1Q7CgkJICAgICAgfQoJCSAgICBhc19kaXIgPSAxOwoJCSAgfQoJICAgICAgfQoJICAgIGVsc2UKCSAgICAgIHsKCQl3aGlsZSAoKihzKzEpID09ICcvJykKCQkgIHMrKzsKCQlpZiAoICh0eXBlID09IDIpCgkJICAgICYmICgqKHMrMSkgPT0gMCkpCQkvKiAxOSgyKSwgMjEoMikqLwoJCSAgewoJCSAgICBpZiAobnN0YXRlICE9IE5fQ0xPU0VEKQoJCSAgICAgIHsKCQkJKnZwdHIrKyA9ICddJzsKCQkJbnN0YXRlID0gTl9DTE9TRUQ7CgkJICAgICAgfQoJCSAgICBhc19kaXIgPSAxOwoJCSAgfQoJCWVsc2UKCQkgIHsKCQkgICAgaWYgKG5zdGF0ZSA9PSBOX09QRU4pCgkJICAgICAgewoJCQkqdnB0cisrID0gJy4nOwoJCQluc3RhdGUgPSBOX0RPVDsKCQkgICAgICB9CgkJICAgIGFzX2RpciA9IDE7CgkJICB9CgkgICAgICB9CgkgICAgaWYgKCAoKmZwdHIgPT0gJy4nKQkJCS8qIGNoZWNrIGZvciAnLi4nIG9yICcuLi8nICovCgkJJiYgKCooZnB0cisxKSA9PSAnLicpCgkJJiYgKCgqKGZwdHIrMikgPT0gJy8nKQoJCSAgICB8fCAoKihmcHRyKzIpID09IDApKSApCgkgICAgICB7CiAgICAgICAgICAgICAgICBjaGFyICp2cDsKCQlmcHRyICs9IDI7CgkJaWYgKCpmcHRyID09ICcvJykKCQkgIHsKCQkgICAgZG8KCQkgICAgICB7CgkJCWZwdHIrKzsKCQkgICAgICB9CgkJICAgIHdoaWxlICgqZnB0ciA9PSAnLycpOwoJCSAgfQoJCWVsc2UgaWYgKCpmcHRyID09IDApCgkJICB0eXBlID0gMTsKCQl2cHRyLS07CQkJCS8qIHZwdHIgLT4gJy4nIG9yICddJyAqLwoJCXZwID0gdnB0cjsKCQlmb3IgKDs7KQoJCSAgewoJCSAgICB2cC0tOwoJCSAgICBpZiAoKnZwID09ICcuJykJCS8qIG9uZSBiYWNrICovCgkJICAgICAgewoJCQl2cHRyID0gdnA7CgkJCW5zdGF0ZSA9IE5fT1BFTjsKCQkJYnJlYWs7CgkJICAgICAgfQoJCSAgICBpZiAoKnZwID09ICdbJykJCS8qIHRvcCBsZXZlbCByZWFjaGVkICovCgkJICAgICAgewoJCQlpZiAoKmZwdHIgPT0gMCkKCQkJICB7CgkJCSAgICBzdHJjcHkgKHZwLCAiWzAwMDAwMF0iKTsKCQkJICAgIHZwdHIgPSB2cCArIDg7CgkJCSAgICBuc3RhdGUgPSBOX0NMT1NFRDsKCQkJICAgIHMgPSAwOwoJCQkgICAgYnJlYWs7CgkJCSAgfQoJCQllbHNlCgkJCSAgewoJCQkgICAgdnB0ciA9IHZwKzE7CgkJCSAgICBuc3RhdGUgPSBOX09QRU47CgkJCSAgICBicmVhazsKCQkJICB9CgkJICAgICAgfQoJCSAgfQoJICAgICAgfQoJICAgIGVsc2UKCSAgICAgIHsKCQljb3B5dG8gKCZ2cHRyLCAmZnB0ciwgJy8nLCBhc19kaXIpOwoJCWlmIChuc3RhdGUgPT0gTl9ET1QpCgkJICBuc3RhdGUgPSBOX09QRU47CgkgICAgICB9CgkgICAgaWYgKHMgPT0gMCkKCSAgICAgIHsJCQkJCS8qIDE4LDIwICovCgkJaWYgKHR5cGUgPT0gMSkKCQkgICp2cHRyKysgPSAnXSc7CgkJc3RhdGUgPSAtMTsKCSAgICAgIH0KCSAgICBlbHNlCgkgICAgICB7CgkJaWYgKCoocysxKSA9PSAwKQoJCSAgewoJCSAgICBpZiAodHlwZSA9PSAyKQkJLyogMTksMjEgKi8KCQkgICAgICB7CgkJICAgICAgICBzdGF0ZSA9IDc7CgkJICAgICAgfQoJCSAgICBlbHNlCgkJICAgICAgewoJCQkqdnB0cisrID0gJ10nOwoJCQlzdGF0ZSA9IC0xOwoJCSAgICAgIH0KCQkgIH0KCSAgICAgIH0KCSAgICBicmVhazsKICAgICAgICAgICAgfQoKCSAgY2FzZSAxMDoJCQkJLyogMSwyIGZpcnN0IGlzICcuJyAqLwoJICAgIGlmICgqZnB0ciA9PSAnLicpCgkgICAgICB7CgkJZnB0cisrOwoJCXN0YXRlID0gMTE7CgkgICAgICB9CgkgICAgZWxzZQoJICAgICAgc3RhdGUgPSAxMjsKCSAgICBicmVhazsKCgkgIGNhc2UgMTE6CQkJCS8qIDIsICcuLicgYXQgc3RhcnQgKi8KCSAgICBjb3VudCA9IDE7CgkgICAgaWYgKCpmcHRyICE9IDApCgkgICAgICB7CgkJaWYgKCpmcHRyICE9ICcvJykJCS8qIGdvdCAuLnh4eCAqLwoJCSAgewogICAgICAgICAgICAgICAgICAgIHN0cmNweSAodm1zbmFtZSwgbmFtZSk7CgkJICAgIHJldHVybiB2bXNuYW1lOwoJCSAgfQoJCWRvCQkJCS8qIGdvdCAuLi8gKi8KCQkgIHsKCQkgICAgZnB0cisrOwoJCSAgICB3aGlsZSAoKmZwdHIgPT0gJy8nKSBmcHRyKys7CgkJICAgIGlmICgqZnB0ciAhPSAnLicpCgkJICAgICAgYnJlYWs7CgkJICAgIGlmICgqKGZwdHIrMSkgIT0gJy4nKQoJCSAgICAgIGJyZWFrOwoJCSAgICBmcHRyICs9IDI7CgkJICAgIGlmICgoKmZwdHIgPT0gMCkKCQkJfHwgKCpmcHRyID09ICcvJykpCgkJICAgICAgY291bnQrKzsKCQkgIH0KCQl3aGlsZSAoKmZwdHIgPT0gJy8nKTsKCSAgICAgIH0KCSAgICB7CQkJCQkvKiBnb3QgJy4uJyBvciAnLi4vJyAqLwogICAgICAgICAgICAgIGNoYXIgKnZwOwoJICAgICAgY2hhciBjd2RidWZbVk1TTUFYUEFUSExFTisxXTsKCgkgICAgICB2cCA9IGdldGN3ZChjd2RidWYsIFZNU01BWFBBVEhMRU4pOwoJICAgICAgaWYgKHZwID09IDApCgkJewogICAgICAgICAgICAgICAgICB2bXNuYW1lWzBdID0gJ1wwJzsKCQkgIHJldHVybiB2bXNuYW1lOyAgICAvKiBGSVhNRSwgZXJyIGdldGN3ZCAqLwoJCX0KCSAgICAgIHN0cmNweSAodnB0ciwgdnApOwoJICAgICAgdnAgPSBzdHJjaHIgKHZwdHIsICddJyk7CgkgICAgICBpZiAodnAgIT0gMCkKCQl7CgkJICBuc3RhdGUgPSBOX09QRU47CgkJICB3aGlsZSAodnAgPiB2cHRyKQoJCSAgICB7CgkJICAgICAgdnAtLTsKCQkgICAgICBpZiAoKnZwID09ICdbJykKCQkJewoJCQkgIHZwKys7CgkJCSAgc3RyY3B5ICh2cCwgIjAwMDAwMF0iKTsKCQkJICBzdGF0ZSA9IC0xOwoJCQkgIGJyZWFrOwoJCQl9CgkJICAgICAgZWxzZSBpZiAoKnZwID09ICcuJykKCQkJewoJCQkgIGlmICgtLWNvdW50ID09IDApCgkJCSAgICB7CgkJCSAgICAgIGlmICgqZnB0ciA9PSAwKQkvKiBoYWQgJy4uJyBvciAnLi4vJyAqLwoJCQkJewoJCQkJICAqdnArKyA9ICddJzsKCQkJCSAgc3RhdGUgPSAtMTsKCQkJCX0KCQkJICAgICAgZWxzZQkJCS8qIGhhZCAnLi4veHh4JyAqLwoJCQkJewoJCQkJICBzdGF0ZSA9IDk7CgkJCQl9CgkJCSAgICAgICp2cCA9ICdcMCc7CgkJCSAgICAgIGJyZWFrOwoJCQkgICAgfQoJCQl9CgkJICAgIH0KCQl9CgkgICAgICB2cHRyICs9IHN0cmxlbiAodnB0cik7CgkgICAgfQoJICAgIGJyZWFrOwoKCSAgY2FzZSAxMjoJCQkJLyogMSwgJy4nIGF0IHN0YXJ0ICovCgkgICAgaWYgKCpmcHRyICE9IDApCgkgICAgICB7CgkJaWYgKCpmcHRyICE9ICcvJykKCQkgIHsKICAgICAgICAgICAgICAgICAgICBzdHJjcHkgKHZtc25hbWUsIG5hbWUpOwoJCSAgICByZXR1cm4gdm1zbmFtZTsKCQkgIH0KCQl3aGlsZSAoKmZwdHIgPT0gJy8nKQoJCSAgZnB0cisrOwoJICAgICAgfQoKCSAgICB7CiAgICAgICAgICAgICAgY2hhciAqdnA7CgkgICAgICBjaGFyIGN3ZGJ1ZltWTVNNQVhQQVRITEVOKzFdOwoKCSAgICAgIHZwID0gZ2V0Y3dkKGN3ZGJ1ZiwgVk1TTUFYUEFUSExFTik7CgkgICAgICBpZiAodnAgPT0gMCkKCQl7CiAgICAgICAgICAgICAgICAgIHZtc25hbWVbMF0gPSAnXDAnOwoJCSAgcmV0dXJuIHZtc25hbWU7ICAgIC8qRklYTUUsIGVyciBnZXRjd2QgKi8KCQl9CgkgICAgICBzdHJjcHkgKHZwdHIsIHZwKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoKmZwdHIgPT0gMCkKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzdGF0ZSA9IC0xOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgY2hhciAqdnAgPSBzdHJjaHIgKHZwdHIsICddJyk7CiAgICAgICAgICAgICAgICBpZiAodnAgPT0gMCkKICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHN0YXRlID0gLTE7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICp2cCA9ICdcMCc7CiAgICAgICAgICAgICAgICBuc3RhdGUgPSBOX09QRU47CiAgICAgICAgICAgICAgICB2cHRyICs9IHN0cmxlbiAodnB0cik7CiAgICAgICAgICAgICAgICBzdGF0ZSA9IDk7CiAgICAgICAgICAgICAgfQoJICAgIGJyZWFrOwoJfQoKCX0KICAgICAgd2hpbGUgKHN0YXRlID4gMCk7CgoKICAgIH0KCgogIC8qIGRpcmVjdG9yeSBjb252ZXJzaW9uIGRvbmUKICAgICBmcHRyIC0+IGZpbGVuYW1lIHBhcnQgb2YgaW5wdXQgc3RyaW5nCiAgICAgdnB0ciAtPiBmcmVlIHNwYWNlIGluIHZtc25hbWUKICAqLwoKICAqdnB0cisrID0gMDsKCiAgcmV0dXJuIHZtc25hbWU7Cn0KCgoKLyoKICBjb252ZXJ0IGZyb20gdm1zLXN0eWxlIHRvIHVuaXgtc3R5bGUKCiAgZGV2OltkaXIxLmRpcjJdCS8vZGV2L2RpcjEvZGlyMi8KKi8KCmNvbnN0IGNoYXIgKgp1bml4aWZ5IChjb25zdCBjaGFyICpuYW1lKQp7CiAgc3RhdGljIGNoYXIgcGllY2VbNTEyXTsKICBjb25zdCBjaGFyICpzOwogIGNoYXIgKnA7CgogIGlmIChzdHJjaHIgKG5hbWUsICcvJykgIT0gMCkJCS8qIGFscmVhZHkgaW4gdW5peCBzdHlsZSAqLwogICAgewogICAgICBzdHJjcHkgKHBpZWNlLCBuYW1lKTsKICAgICAgcmV0dXJuIHBpZWNlOwogICAgfQoKICBwID0gcGllY2U7CiAgKnAgPSAwOwoKICAvKiBkZXZpY2UgcGFydCAqLwoKICBzID0gc3RyY2hyIChuYW1lLCAnOicpOwoKICBpZiAocyAhPSAwKQogICAgewogICAgICBpbnQgbCA9IHMgLSBuYW1lOwogICAgICAqcCsrID0gJy8nOwogICAgICAqcCsrID0gJy8nOwogICAgICBzdHJuY3B5IChwLCBuYW1lLCBsKTsKICAgICAgcCArPSBsOwogICAgfQoKICAvKiBkaXJlY3RvcnkgcGFydCAqLwoKICAqcCsrID0gJy8nOwogIHMgPSBzdHJjaHIgKG5hbWUsICdbJyk7CgogIGlmIChzICE9IDApCiAgICB7CiAgICAgIHMrKzsKICAgICAgc3dpdGNoICgqcykKICAgICAgICB7CgkgIGNhc2UgJ10nOgkJLyogW10gKi8KCSAgICBzdHJjYXQgKHAsICIuLyIpOwoJICAgIGJyZWFrOwoJICBjYXNlICctJzoJCS8qIFstICovCgkgICAgc3RyY2F0IChwLCAiLi4vIik7CgkgICAgYnJlYWs7CgkgIGNhc2UgJy4nOgoJICAgIHN0cmNhdCAocCwgIi4vIik7CS8qIFsuICovCgkgICAgYnJlYWs7CgkgIGRlZmF1bHQ6CgkgICAgcy0tOwoJICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgcysrOwogICAgICB3aGlsZSAoKnMpCiAgICAgICAgewoJICBpZiAoKnMgPT0gJy4nKQoJICAgICpwKysgPSAnLyc7CgkgIGVsc2UKCSAgICAqcCsrID0gKnM7CgkgIHMrKzsKCSAgaWYgKCpzID09ICddJykKCSAgICB7CgkgICAgICBzKys7CgkgICAgICBicmVhazsKCSAgICB9CiAgICAgICAgfQogICAgICBpZiAoKnMgIT0gMCkJCS8qIG1vcmUgYWZ0ZXIgJ10nID8/ICovCiAgICAgICAgewoJICBpZiAoKihwLTEpICE9ICcvJykKCSAgICAqcCsrID0gJy8nOwoJICBzdHJjcHkgKHAsIHMpOwkJLyogY29weSBpdCBhbnl3YXkgKi8KICAgICAgICB9CiAgICB9CgogIGVsc2UJCS8qIG5vICdbJyBhbnl3aGVyZSAqLwoKICAgIHsKICAgICAgKnArKyA9IDA7CiAgICB9CgogIC8qIGZvcmNlIGVuZCB3aXRoICcvJyAqLwoKICBpZiAoKihwLTEpICE9ICcvJykKICAgICpwKysgPSAnLyc7CiAgKnAgPSAwOwoKICByZXR1cm4gcGllY2U7Cn0KCi8qIEVPRiAqLwo=