LyoKICB2bXNpZnkuYwoKICBNb2R1bGUgZm9yIHZtcyA8LT4gdW5peCBmaWxlIG5hbWUgY29udmVyc2lvbgoKICBXcml0dGVuIGJ5IEtsYXVzIEvkbXBmIChra2FlbXBmQHByb2dpcy5kZSkKICBvZiBwcm9HSVMgU29mdHdhcmUsIEFhY2hlbiwgR2VybWFueQoKKi8KCiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPGN0eXBlLmg+CgojaWYgVk1TCiNpbmNsdWRlIDx1bml4bGliLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPGpwaWRlZi5oPgojaW5jbHVkZSA8ZGVzY3JpcC5oPgojaW5jbHVkZSA8dWFpZGVmLmg+CiNpbmNsdWRlIDxzc2RlZi5oPgojaW5jbHVkZSA8c3RhcmxldC5oPgojaW5jbHVkZSA8bGliJHJvdXRpbmVzLmg+Ci8qIEluaXRpYWxpemUgYSBzdHJpbmcgZGVzY3JpcHRvciAoc3RydWN0IGRzYyRkZXNjcmlwdG9yX3MpIGZvciBhbgogICBhcmJpdHJhcnkgc3RyaW5nLiAgIEFERFIgaXMgYSBwb2ludGVyIHRvIHRoZSBmaXJzdCBjaGFyYWN0ZXIKICAgb2YgdGhlIHN0cmluZywgYW5kIExFTiBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcuICovCgojZGVmaW5lIElOSVRfRFNDX1MoZHNjLCBhZGRyLCBsZW4pIGRvIHsgXAogIChkc2MpLmRzYyRiX2R0eXBlID0gRFNDJEtfRFRZUEVfVDsgICAgXAogIChkc2MpLmRzYyRiX2NsYXNzID0gRFNDJEtfQ0xBU1NfUzsgICAgXAogIChkc2MpLmRzYyR3X2xlbmd0aCA9IChsZW4pOyAgICAgICAgICAgXAogIChkc2MpLmRzYyRhX3BvaW50ZXIgPSAoYWRkcik7ICAgICAgICAgXAp9IHdoaWxlICgwKQoKLyogSW5pdGlhbGl6ZSBhIHN0cmluZyBkZXNjcmlwdG9yIChzdHJ1Y3QgZHNjJGRlc2NyaXB0b3JfcykgZm9yIGEKICAgTlVMLXRlcm1pbmF0ZWQgc3RyaW5nLiAgUyBpcyBhIHBvaW50ZXIgdG8gdGhlIHN0cmluZzsgdGhlIGxlbmd0aAogICBpcyBkZXRlcm1pbmVkIGJ5IGNhbGxpbmcgc3RybGVuKCkuICovCgojZGVmaW5lIElOSVRfRFNDX0NTVFJJTkcoZHNjLCBzKSBJTklUX0RTQ19TKGRzYywgcywgc3RybGVuKHMpKQojZW5kaWYKCi8qCiAgY29weSAnZnJvbScgdG8gJ3RvJyB1cCB0byBidXQgbm90IGluY2x1ZGluZyAndXB0bycKICByZXR1cm4gMCBpZiBlb3Mgb24gZnJvbQogIHJldHVybiAxIGlmIHVwdG8gZm91bmQKCiAgcmV0dXJuICd0bycgYXQgbGFzdCBjaGFyICsgMQogIHJldHVybiAnZnJvbScgYXQgbWF0Y2ggKyAxIG9yIGVvcyBpZiBubyBtYXRjaAoKICBpZiBhc19kaXIgPT0gMSwgY2hhbmdlIGFsbCAnLicgdG8gJ18nCiAgZWxzZSBjaGFuZ2UgYWxsICcuJyBidXQgdGhlIGxhc3QgdG8gJ18nCiovCgpzdGF0aWMgaW50CmNvcHl0byAoY2hhciAqKnRvLCBjaGFyICoqZnJvbSwgY2hhciB1cHRvLCBpbnQgYXNfZGlyKQp7CiAgY2hhciAqczsKCiAgcyA9IHN0cnJjaHIgKCpmcm9tLCAnLicpOwoKICB3aGlsZSAoKipmcm9tKQogICAgewogICAgICBpZiAoKipmcm9tID09IHVwdG8pCgl7CgkgIGRvCgkgICAgewoJICAgICAgKCpmcm9tKSsrOwoJICAgIH0KCSAgd2hpbGUgKCoqZnJvbSA9PSB1cHRvKTsKCSAgcmV0dXJuIDE7Cgl9CiAgICAgIGlmICgqKmZyb20gPT0gJy4nKQoJewoJICBpZiAoKGFzX2RpciA9PSAxKQoJICAgICAgfHwgKCpmcm9tICE9IHMpKQoJICAgICoqdG8gPSAnXyc7CgkgIGVsc2UKCSAgICAqKnRvID0gJy4nOwoJfQogICAgICBlbHNlCgl7CgkgIGlmIChpc2xvd2VyICgqKmZyb20pKQoJICAgICoqdG8gPSB0b3VwcGVyICgqKmZyb20pOwoJICBlbHNlCgkgICAgKip0byA9ICoqZnJvbTsKCX0KICAgICAgKCp0bykrKzsKICAgICAgKCpmcm9tKSsrOwogICAgfQoKICByZXR1cm4gMDsKfQoKCi8qCiAgZ2V0IHRyYW5zbGF0aW9uIG9mIGxvZ2ljYWwgbmFtZQoKKi8KCnN0YXRpYyBjaGFyICoKdHJubG9nIChjaGFyICpuYW1lKQp7CiAgaW50IHN0YXQ7CiAgc3RhdGljIGNoYXIgcmVzbHRbMTAyNF07CiAgJERFU0NSSVBUT1IgKHJlc2x0X2RzYywgcmVzbHQpOwogIHNob3J0IHJlc2x0bGVuOwogIHN0cnVjdCBkc2MkZGVzY3JpcHRvcl9zIG5hbWVfZHNjOwogIGNoYXIgKnM7CgogIElOSVRfRFNDX0NTVFJJTkcgKG5hbWVfZHNjLCBuYW1lKTsKCiAgc3RhdCA9IGxpYiRzeXNfdHJubG9nICgmbmFtZV9kc2MsICZyZXNsdGxlbiwgJnJlc2x0X2RzYyk7CgogIGlmICgoc3RhdCYxKSA9PSAwKQogICAgewogICAgICByZXR1cm4gIiI7CiAgICB9CiAgaWYgKHN0YXQgPT0gU1MkX05PVFJBTikKICAgIHsKICAgICAgcmV0dXJuICIiOwogICAgfQogIHJlc2x0W3Jlc2x0bGVuXSA9ICdcMCc7CgogIHMgPSAoY2hhciAqKW1hbGxvYyAocmVzbHRsZW4rMSk7CiAgaWYgKHMgPT0gMCkKICAgIHJldHVybiAiIjsKICBzdHJjcHkgKHMsIHJlc2x0KTsKICByZXR1cm4gczsKfQoKZW51bSBuYW1lc3RhdGUgeyBOX1NUQVJULCBOX0RFVklDRSwgTl9PUEVOLCBOX0RPVCwgTl9DTE9TRUQsIE5fRE9ORSB9OwoKLyoKICBjb252ZXJ0IHVuaXggc3R5bGUgbmFtZSB0byB2bXMgc3R5bGUKICB0eXBlID0gMCAtPiBuYW1lIGlzIGEgZnVsbCBuYW1lIChkaXJlY3RvcnkgYW5kIGZpbGVuYW1lIHBhcnQpCiAgdHlwZSA9IDEgLT4gbmFtZSBpcyBhIGRpcmVjdG9yeQogIHR5cGUgPSAyIC0+IG5hbWUgaXMgYSBmaWxlbmFtZSB3aXRob3V0IGRpcmVjdG9yeQoKICBUaGUgZm9sbG93aW5nIGNvbnZlcnNpb25zIGFyZSBhcHBsaWVkCgkJCSgwKQkJKDEpCQkJKDIpCglpbnB1dAkJZnVsbCBuYW1lCWRpciBuYW1lCQlmaWxlIG5hbWUKCjEJLi8JCTxjd2Q+CQlbXQkJCTxjdXJyZW50IGRpcmVjdG9yeT4uZGlyCjIJLi4vCQk8aG9tZSBvZiBjd2Q+CTxob21lIG9mIGN3ZD4JCTxob21lIG9mIGN3ZD4uZGlyCgozCS8vCQk8ZGV2IG9mIGN3ZD46CTxkZXYgb2YgY3dkPjpbMDAwMDAwXQk8ZGV2IG9mIGN3ZD46MDAwMDAwLmRpcgo0CS8vYQkJYToJCWE6CQkJYToKNQkvL2EvCQlhOgkJYToJCQlhOjAwMDAwMC5kaXIKCjkJLwkJWzAwMDAwMF0JWzAwMDAwMF0JCTAwMDAwMC5kaXIKMTAJL2EJCVswMDAwMDBdYQlbYV0JCQlbMDAwMDAwXWEKMTEJL2EvCQlbYV0JCVthXQkJCVswMDAwMDBdYS5kaXIKMTIJL2EvYgkJW2FdYgkJW2EuYl0JCQlbYV1iCjEzCS9hL2IvCQlbYS5iXQkJW2EuYl0JCQlbYV1iLmRpcgoxNAkvYS9iL2MJCVthLmJdYwkJW2EuYi5jXQkJCVthLmJdYwoxNQkvYS9iL2MvCQlbYS5iLmNdCQlbYS5iLmNdCQkJW2EuYl1jLmRpcgoKMTYJYQkJYQkJWy5hXQkJCWEKMTcJYS8JCVsuYV0JCVsuYV0JCQlhLmRpcgoxOAlhL2IJCVsuYV1iCQlbLmEuYl0JCQlbLmFdYgoxOQlhL2IvCQlbLmEuYl0JCVsuYS5iXQkJCVsuYV1iLmRpcgoyMAlhL2IvYwkJWy5hLmJdYwkJWy5hLmIuY10JCVsuYS5iXWMKMjEJYS9iL2MvCQlbLmEuYi5jXQlbLmEuYi5jXQkJWy5hLmJdYy5kaXIKCjIyCWEuYi5jCQlhX2IuYwkJWy5hX2JfY10JCWFfYl9jLmRpcgoKMjMJW3hdW3ldegkJW3gueV16CQlbeC55XXoJCQlbeC55XXoKMjQJW3hdWy55XXoJW3gueV16CQlbeC55XXoJCQlbeC55XXoKCjI1ICBmaWxlbmFtZXMgd2l0aCAnJCcgIGFyZSBsZWZ0IHVuY2hhbmdlZCBpZiB0aGV5IGNvbnRhaW4gbm8gJy8nCjI1ICBmaWxlbmFtZXMgd2l0aCAnOicgYXJlIGxlZnQgdW5jaGFuZ2VkCjI2ICBmaWxlbmFtZXMgd2l0aCBhIHNpbmdsZSBwYWlyIG9mICdbJyAnXScgYXJlIGxlZnQgdW5jaGFuZ2VkCgogIHRoZSBpbnB1dCBzdHJpbmcgaXMgbm90IHdyaXR0ZW4gdG8KKi8KCmNoYXIgKgp2bXNpZnkgKG5hbWUsIHR5cGUpCiAgICBjaGFyICpuYW1lOwogICAgaW50IHR5cGU7CnsKLyogbWF4IDI1NSBkZXZpY2UKICAgbWF4IDM5IGRpcmVjdG9yeQogICBtYXggMzkgZmlsZW5hbWUKICAgbWF4IDM5IGZpbGV0eXBlCiAgIG1heCA1IHZlcnNpb24KKi8KI2RlZmluZSBNQVhQQVRITEVOIDUxMgoKICBlbnVtIG5hbWVzdGF0ZSBuc3RhdGU7CiAgc3RhdGljIGNoYXIgdm1zbmFtZVtNQVhQQVRITEVOKzFdOwogIGNoYXIgKmZwdHI7CiAgY2hhciAqdnB0cjsKICBjaGFyICpzLCpzMTsKICBpbnQgYXNfZGlyOwogIGludCBjb3VudDsKCiAgaWYgKG5hbWUgPT0gMCkKICAgIHJldHVybiAwOwogIGZwdHIgPSBuYW1lOwogIHZwdHIgPSB2bXNuYW1lOwogIG5zdGF0ZSA9IE5fU1RBUlQ7CgogIC8qIGNhc2UgMjVhICovCgogIHMgPSBzdHJwYnJrIChuYW1lLCAiJDoiKTsKICBpZiAocyAhPSAwKQogICAgewogICAgICBpZiAoKnMgPT0gJyQnKQoJewoJICBpZiAoc3RyY2hyIChuYW1lLCAnLycpID09IDApCgkgICAgewoJICAgICAgcmV0dXJuIG5hbWU7CgkgICAgfQoJfQogICAgICBlbHNlCgl7CgkgIHJldHVybiBuYW1lOwoJfQogICAgfQoKICAvKiBjYXNlIDI2ICovCgogIHMgPSBzdHJjaHIgKG5hbWUsICdbJyk7CgogIGlmIChzICE9IDApCiAgICB7CiAgICAgIHMxID0gc3RyY2hyIChzKzEsICdbJyk7CiAgICAgIGlmIChzMSA9PSAwKQoJewoJICByZXR1cm4gbmFtZTsJCQkvKiBzaW5nbGUgWywga2VlcCB1bmNoYW5nZWQgKi8KCX0KICAgICAgczEtLTsKICAgICAgaWYgKCpzMSAhPSAnXScpCgl7CgkgIHJldHVybiBuYW1lOwkJCS8qIG5vdCBdWywga2VlcCB1bmNoYW5nZWQgKi8KCX0KCiAgICAgIC8qIHdlIGhhdmUgXVsgKi8KCiAgICAgIHMgPSBuYW1lOwoKICAgICAgLyogcyAgLT4gc3RhcnRpbmcgY2hhcgoJIHMxIC0+IGVuZGluZyAnXScgICovCgogICAgICBkbwoJewoJICBzdHJuY3B5ICh2cHRyLCBzLCBzMS1zKTsJLyogY29weSB1cCB0byBidXQgbm90IGluY2x1ZGluZyAnXScgKi8KCSAgdnB0ciArPSBzMS1zOwoJICBpZiAoKnMxID09IDApCgkgICAgYnJlYWs7CgkgIHMgPSBzMSArIDE7CQkJLyogcyAtPiBjaGFyIGJlaGluZCAnXScgKi8KCSAgaWYgKCpzICE9ICdbJykJCS8qIHdhcyAnXVsnID8gKi8KCSAgICBicmVhazsJCQkvKiBubywgbGFzdCBdIGZvdW5kLCBleGl0ICovCgkgIHMrKzsKCSAgaWYgKCpzICE9ICcuJykKCSAgICAqdnB0cisrID0gJy4nOwoJICBzMSA9IHN0cmNociAocywgJ10nKTsKCSAgaWYgKHMxID09IDApCQkJLyogbm8gY2xvc2luZyBdICovCgkgICAgczEgPSBzICsgc3RybGVuIChzKTsKCX0KICAgICAgd2hpbGUgKDEpOwoKICAgICAgKnZwdHIrKyA9ICddJzsKCiAgICAgIGZwdHIgPSBzOwoKICAgIH0KCiAgZWxzZQkJLyogbm8gWyBpbiBuYW1lICovCgogICAgewoKICAgICAgaW50IHN0YXRlOwogICAgICBpbnQgcm9vdGVkID0gMTsJLyogZmxhZyBpZiBsb2dpY2FsIGlzIHJvb3RlZCwgZWxzZSBpbnNlcnQgWzAwMDAwMF0gKi8KCiAgICAgIHN0YXRlID0gMDsKCiAgICAgIGRvCgl7CgogICAgICBzd2l0Y2ggKHN0YXRlKQoJewoJICBjYXNlIDA6CQkJCS8qIHN0YXJ0IG9mIGxvb3AgKi8KCSAgICBpZiAoKmZwdHIgPT0gJy8nKQoJICAgICAgewoJCWZwdHIrKzsKCQlzdGF0ZSA9IDE7CgkgICAgICB9CgkgICAgZWxzZSBpZiAoKmZwdHIgPT0gJy4nKQoJICAgICAgewoJCWZwdHIrKzsKCQlzdGF0ZSA9IDEwOwoJICAgICAgfQoJICAgIGVsc2UKCSAgICAgIHN0YXRlID0gMjsKCSAgICBicmVhazsKCgkgIGNhc2UgMToJCQkJLyogJy8nIGF0IHN0YXJ0ICovCgkgICAgaWYgKCpmcHRyID09ICcvJykKCSAgICAgIHsKCQlmcHRyKys7CgkJc3RhdGUgPSAzOwoJICAgICAgfQoJICAgIGVsc2UKCSAgICAgIHN0YXRlID0gNDsKCSAgICBicmVhazsKCgkgIGNhc2UgMjoJCQkJLyogbm8gJy8nIGF0IHN0YXJ0ICovCgkgICAgcyA9IHN0cmNociAoZnB0ciwgJy8nKTsKCSAgICBpZiAocyA9PSAwKQkJCS8qIG5vICcvJyAoMTYpICovCgkgICAgICB7CgkJaWYgKHR5cGUgPT0gMSkKCQkgIHsKCQkgICAgc3RyY3B5ICh2cHRyLCAiWy4iKTsKCQkgICAgdnB0ciArPSAyOwoJCSAgfQoJCWNvcHl0byAoJnZwdHIsICZmcHRyLCAwLCAodHlwZT09MSkpOwoJCWlmICh0eXBlID09IDEpCgkJICAqdnB0cisrID0gJ10nOwoJCXN0YXRlID0gLTE7CgkgICAgICB9CgkgICAgZWxzZQkJCS8qIGZvdW5kICcvJyAoMTcuLjIxKSAqLwoJICAgICAgewoJCWlmICgodHlwZSA9PSAyKQoJCSAgICAmJiAoKihzKzEpID09IDApKQkvKiAxNygyKSAqLwoJCSAgewoJCSAgICBjb3B5dG8gKCZ2cHRyLCAmZnB0ciwgJy8nLCAxKTsKCQkgICAgc3RhdGUgPSA3OwoJCSAgfQoJCWVsc2UKCQkgIHsKCQkgICAgc3RyY3B5ICh2cHRyLCAiWy4iKTsKCQkgICAgdnB0ciArPSAyOwoJCSAgICBjb3B5dG8gKCZ2cHRyLCAmZnB0ciwgJy8nLCAxKTsKCQkgICAgbnN0YXRlID0gTl9PUEVOOwoJCSAgICBzdGF0ZSA9IDk7CgkJICB9CgkgICAgICB9CgkgICAgYnJlYWs7CgoJICBjYXNlIDM6CQkJCS8qICcvLycgYXQgc3RhcnQgKi8KCSAgICB3aGlsZSAoKmZwdHIgPT0gJy8nKQkvKiBjb2xsYXBzZSBhbGwgJy8nICovCgkgICAgICBmcHRyKys7CgkgICAgaWYgKCpmcHRyID09IDApCQkvKiBqdXN0IC8vICovCgkgICAgICB7CgkJY2hhciBjd2RidWZbTUFYUEFUSExFTisxXTsKCgkJczEgPSBnZXRjd2QoY3dkYnVmLCBNQVhQQVRITEVOKTsKCQlpZiAoczEgPT0gMCkKCQkgIHsKCQkgICAgcmV0dXJuICIiOwkJLyogRklYTUUsIGVyciBnZXRjd2QgKi8KCQkgIH0KCQlzID0gc3RyY2hyIChzMSwgJzonKTsKCQlpZiAocyA9PSAwKQoJCSAgewoJCSAgICByZXR1cm4gIiI7CQkvKiBGSVhNRSwgZXJyIG5vIGRldmljZSAqLwoJCSAgfQoJCXN0cm5jcHkgKHZwdHIsIHMxLCBzLXMxKzEpOwoJCXZwdHIgKz0gcy1zMSsxOwoJCXN0YXRlID0gLTE7CgkJYnJlYWs7CgkgICAgICB9CgoJICAgIHMgPSB2cHRyOwoKCSAgICBpZiAoY29weXRvICgmdnB0ciwgJmZwdHIsICcvJywgMSkgPT0gMCkJLyogY29weSBkZXZpY2UgcGFydCAqLwoJICAgICAgewoJCSp2cHRyKysgPSAnOic7CgkJc3RhdGUgPSAtMTsKCQlicmVhazsKCSAgICAgIH0KCSAgICAqdnB0ciA9ICc6JzsKCSAgICBuc3RhdGUgPSBOX0RFVklDRTsKCSAgICBpZiAoKmZwdHIgPT0gMCkJLyoganVzdCAnLy9hLycgKi8KCSAgICAgIHsKCQlzdHJjcHkgKHZwdHIrMSwgIlswMDAwMDBdIik7CgkJdnB0ciArPSA5OwoJCXN0YXRlID0gLTE7CgkJYnJlYWs7CgkgICAgICB9CgkgICAgKnZwdHIgPSAwOwoJCQkJLyogY2hlY2sgbG9naWNhbCBmb3IgWzAwMDAwMF0gaW5zZXJ0aW9uICovCgkgICAgczEgPSB0cm5sb2cgKHMpOwoJICAgIGlmICgqczEgIT0gMCkKCSAgICAgIHsJCQkvKiBmb3VuZCB0cmFuc2xhdGlvbiAqLwoJCWNoYXIgKnMyOwoJCWZvciAoOzspCS8qIGxvb3Agb3ZlciBhbGwgbmVzdGVkIGxvZ2ljYWxzICovCgkJICB7CgkJICAgIHMyID0gczEgKyBzdHJsZW4gKHMxKSAtIDE7CgkJICAgIGlmICgqczIgPT0gJzonKQkvKiB0cmFuc2xhdGlvbiBlbmRzIGluICc6JyAqLwoJCSAgICAgIHsKCQkJczIgPSB0cm5sb2cgKHMxKTsKCQkJZnJlZSAoczEpOwoJCQlpZiAoKnMyID09IDApCgkJCSAgewoJCQkgICAgcm9vdGVkID0gMDsKCQkJICAgIGJyZWFrOwoJCQkgIH0KCQkJczEgPSBzMjsKCQkJY29udGludWU7CS8qIG5leHQgaXRlcmF0aW9uICovCgkJICAgICAgfQoJCSAgICBpZiAoKnMyID09ICddJykJLyogdHJhbnNsYXRpb24gZW5kcyBpbiAnXScgKi8KCQkgICAgICB7CgkJCWlmICgqKHMyLTEpID09ICcuJykJLyogZW5kcyBpbiAnLl0nICovCgkJCSAgewoJCQkgICAgaWYgKHN0cm5jbXAgKGZwdHIsICIwMDAwMDAiLCA2KSAhPSAwKQoJCQkgICAgICByb290ZWQgPSAwOwoJCQkgIH0KCQkJZWxzZQoJCQkgIHsKCQkJICAgIHN0cmNweSAodm1zbmFtZSwgczEpOwoJCQkgICAgcyA9IHN0cmNociAodm1zbmFtZSwgJ10nKTsKCQkJICAgICpzID0gJy4nOwoJCQkgICAgbnN0YXRlID0gTl9ET1Q7CgkJCSAgICB2cHRyID0gczsKCQkJICB9CgkJICAgICAgfQoJCSAgICBicmVhazsKCQkgIH0KCQlmcmVlIChzMSk7CgkgICAgICB9CgkgICAgZWxzZQoJICAgICAgcm9vdGVkID0gMDsKCgkgICAgaWYgKCp2cHRyID09IDApCgkgICAgICB7CgkJbnN0YXRlID0gTl9ERVZJQ0U7CgkgICAgICAgICp2cHRyKysgPSAnOic7CgkgICAgICB9CgkgICAgZWxzZQoJICAgICAgdnB0cisrOwoKCSAgICBpZiAocm9vdGVkID09IDApCgkgICAgICB7CgkgICAgICAgIHN0cmNweSAodnB0ciwgIlswMDAwMDAuIik7CgkJdnB0ciArPSA4OwoJCXMxID0gdnB0ci0xOwoJCW5zdGF0ZSA9IE5fRE9UOwoJICAgICAgfQoJICAgIGVsc2UKCSAgICAgIHMxID0gMDsKCgkvKiBzMS0+ICcuJyBhZnRlciAwMDAwMDAgb3IgTlVMTCAqLwoKCSAgICBzID0gc3RyY2hyIChmcHRyLCAnLycpOwoJICAgIGlmIChzID09IDApCgkgICAgICB7CQkJCS8qIG5vIG5leHQgJy8nICovCgkJaWYgKCoodnB0ci0xKSA9PSAnLicpCgkJICAqKHZwdHItMSkgPSAnXSc7CgkJZWxzZSBpZiAocm9vdGVkID09IDApCgkJICAqdnB0cisrID0gJ10nOwoJCWNvcHl0byAoJnZwdHIsICZmcHRyLCAwLCAodHlwZSA9PSAxKSk7CgkJc3RhdGUgPSAtMTsKCQlicmVhazsKCSAgICAgIH0KCSAgICBlbHNlCgkgICAgICB7CgkJd2hpbGUgKCoocysxKSA9PSAnLycpCS8qIHNraXAgbXVsdGlwbGUgJy8nICovCgkJICBzKys7CgkgICAgICB9CgoJICAgIGlmICgocm9vdGVkICE9IDApCgkgICAgICAgICYmICgqKHZwdHItMSkgIT0gJy4nKSkKCSAgICAgIHsKCQkqdnB0cisrID0gJ1snOwoJCW5zdGF0ZSA9IE5fRE9UOwoJICAgICAgfQoJICAgIGVsc2UKCSAgICAgIGlmICgobnN0YXRlID09IE5fRE9UKQoJCSAmJiAoczEgIT0gMCkKCQkgJiYgKCoocysxKSA9PSAwKSkKCQl7CgkJICBpZiAodHlwZSA9PSAyKQoJCSAgICB7CgkJICAgICAgKnMxID0gJ10nOwoJCSAgICAgIG5zdGF0ZSA9IE5fQ0xPU0VEOwoJCSAgICB9CgkJfQoJICAgIHN0YXRlID0gOTsKCSAgICBicmVhazsKCgkgIGNhc2UgNDoJCQkJLyogc2luZ2xlICcvJyBhdCBzdGFydCAoOS4uMTUpICovCgkgICAgaWYgKCpmcHRyID09IDApCgkgICAgICBzdGF0ZSA9IDU7CgkgICAgZWxzZQoJICAgICAgc3RhdGUgPSA2OwoJICAgIGJyZWFrOwoKCSAgY2FzZSA1OgkJCQkvKiBqdXN0ICcvJyBhdCBzdGFydCAoOSkgKi8KCSAgICBpZiAodHlwZSAhPSAyKQoJICAgICAgewoJICAgICAgICAqdnB0cisrID0gJ1snOwoJCW5zdGF0ZSA9IE5fT1BFTjsKCSAgICAgIH0KCSAgICBzdHJjcHkgKHZwdHIsICIwMDAwMDAiKTsKCSAgICB2cHRyICs9IDY7CgkgICAgaWYgKHR5cGUgPT0gMikKCSAgICAgIHN0YXRlID0gNzsKCSAgICBlbHNlCgkgICAgICBzdGF0ZSA9IDg7CgkgICAgYnJlYWs7CgoJICBjYXNlIDY6CQkJCS8qIGNoYXJzIGZvbGxvd2luZyAnLycgYXQgc3RhcnQgMTAuLjE1ICovCgkgICAgKnZwdHIrKyA9ICdbJzsKCSAgICBuc3RhdGUgPSBOX09QRU47CgkgICAgcyA9IHN0cmNociAoZnB0ciwgJy8nKTsKCSAgICBpZiAocyA9PSAwKQkJCS8qIDEwICovCgkgICAgICB7CgkJaWYgKHR5cGUgIT0gMSkKCQkgIHsKCQkgICAgc3RyY3B5ICh2cHRyLCAiMDAwMDAwXSIpOwoJCSAgICB2cHRyICs9IDc7CgkJICB9CgkJY29weXRvICgmdnB0ciwgJmZwdHIsIDAsICh0eXBlID09IDEpKTsKCQlpZiAodHlwZSA9PSAxKQoJCSAgewoJCSAgICAqdnB0cisrID0gJ10nOwoJCSAgfQoJCXN0YXRlID0gLTE7CgkgICAgICB9CgkgICAgZWxzZQkJCS8qIDExLi4xNSAqLwoJICAgICAgewoJCWlmICggKHR5cGUgPT0gMikKCQkgICAmJiAoKihzKzEpID09IDApKQkvKiAxMSgyKSAqLwoJCSAgewoJCSAgICBzdHJjcHkgKHZwdHIsICIwMDAwMDBdIik7CgkJICAgIG5zdGF0ZSA9IE5fQ0xPU0VEOwoJCSAgICB2cHRyICs9IDc7CgkJICB9CgkJY29weXRvICgmdnB0ciwgJmZwdHIsICcvJywgKCoodnB0ci0xKSAhPSAnXScpKTsKCQlzdGF0ZSA9IDk7CgkgICAgICB9CgkgICAgYnJlYWs7CgoJICBjYXNlIDc6CQkJCS8qIGFkZCAnLmRpcicgYW5kIGV4aXQgKi8KCSAgICBpZiAoKG5zdGF0ZSA9PSBOX09QRU4pCgkJfHwgKG5zdGF0ZSA9PSBOX0RPVCkpCgkgICAgICB7CgkJcyA9IHZwdHItMTsKCQl3aGlsZSAocyA+IHZtc25hbWUpCgkJICB7CgkJICAgIGlmICgqcyA9PSAnXScpCgkJICAgICAgewoJCQlicmVhazsKCQkgICAgICB9CgkJICAgIGlmICgqcyA9PSAnLicpCgkJICAgICAgewoJCQkqcyA9ICddJzsKCQkJYnJlYWs7CgkJICAgICAgfQoJCSAgICBzLS07CgkJICB9CgkgICAgICB9CgkgICAgc3RyY3B5ICh2cHRyLCAiLmRpciIpOwoJICAgIHZwdHIgKz0gNDsKCSAgICBzdGF0ZSA9IC0xOwoJICAgIGJyZWFrOwoKCSAgY2FzZSA4OgkJCQkvKiBhZGQgJ10nIGFuZCBleGl0ICovCgkgICAgKnZwdHIrKyA9ICddJzsKCSAgICBzdGF0ZSA9IC0xOwoJICAgIGJyZWFrOwoKCSAgY2FzZSA5OgkJCQkvKiAxNy4uMjEsIGZwdHIgLT4gMXN0ICcvJyArIDEgKi8KCSAgICBpZiAoKmZwdHIgPT0gMCkKCSAgICAgIHsKCQlpZiAodHlwZSA9PSAyKQoJCSAgewoJCSAgICBzdGF0ZSA9IDc7CgkJICB9CgkJZWxzZQoJCSAgc3RhdGUgPSA4OwoJCWJyZWFrOwoJICAgICAgfQoJICAgIHMgPSBzdHJjaHIgKGZwdHIsICcvJyk7CgkgICAgaWYgKHMgPT0gMCkKCSAgICAgIHsKCQlpZiAodHlwZSAhPSAxKQoJCSAgewoJCSAgICBpZiAobnN0YXRlID09IE5fT1BFTikKCQkgICAgICB7CgkJCSp2cHRyKysgPSAnXSc7CgkJCW5zdGF0ZSA9IE5fQ0xPU0VEOwoJCSAgICAgIH0KCQkgICAgYXNfZGlyID0gMDsKCQkgIH0KCQllbHNlCgkJICB7CgkJICAgIGlmIChuc3RhdGUgPT0gTl9PUEVOKQoJCSAgICAgIHsKCQkJKnZwdHIrKyA9ICcuJzsKCQkJbnN0YXRlID0gTl9ET1Q7CgkJICAgICAgfQoJCSAgICBhc19kaXIgPSAxOwoJCSAgfQoJICAgICAgfQoJICAgIGVsc2UKCSAgICAgIHsKCQl3aGlsZSAoKihzKzEpID09ICcvJykKCQkgIHMrKzsKCQlpZiAoICh0eXBlID09IDIpCgkJICAgICYmICgqKHMrMSkgPT0gMCkpCQkvKiAxOSgyKSwgMjEoMikqLwoJCSAgewoJCSAgICBpZiAobnN0YXRlICE9IE5fQ0xPU0VEKQoJCSAgICAgIHsKCQkJKnZwdHIrKyA9ICddJzsKCQkJbnN0YXRlID0gTl9DTE9TRUQ7CgkJICAgICAgfQoJCSAgICBhc19kaXIgPSAxOwoJCSAgfQoJCWVsc2UKCQkgIHsKCQkgICAgaWYgKG5zdGF0ZSA9PSBOX09QRU4pCgkJICAgICAgewoJCQkqdnB0cisrID0gJy4nOwoJCQluc3RhdGUgPSBOX0RPVDsKCQkgICAgICB9CgkJICAgIGFzX2RpciA9IDE7CgkJICB9CgkgICAgICB9CgkgICAgaWYgKCAoKmZwdHIgPT0gJy4nKQkJCS8qIGNoZWNrIGZvciAnLi4nIG9yICcuLi8nICovCgkJJiYgKCooZnB0cisxKSA9PSAnLicpCgkJJiYgKCgqKGZwdHIrMikgPT0gJy8nKQoJCSAgICB8fCAoKihmcHRyKzIpID09IDApKSApCgkgICAgICB7CgkJZnB0ciArPSAyOwoJCWlmICgqZnB0ciA9PSAnLycpCgkJICB7CgkJICAgIGRvCgkJICAgICAgewoJCQlmcHRyKys7CgkJICAgICAgfQoJCSAgICB3aGlsZSAoKmZwdHIgPT0gJy8nKTsKCQkgIH0KCQllbHNlIGlmICgqZnB0ciA9PSAwKQoJCSAgdHlwZSA9IDE7CgkJdnB0ci0tOwkJCQkvKiB2cHRyIC0+ICcuJyBvciAnXScgKi8KCQlzMSA9IHZwdHI7CgkJZm9yICg7OykKCQkgIHsKCQkgICAgczEtLTsKCQkgICAgaWYgKCpzMSA9PSAnLicpCQkvKiBvbmUgYmFjayAqLwoJCSAgICAgIHsKCQkJdnB0ciA9IHMxOwoJCQluc3RhdGUgPSBOX09QRU47CgkJCWJyZWFrOwoJCSAgICAgIH0KCQkgICAgaWYgKCpzMSA9PSAnWycpCQkvKiB0b3AgbGV2ZWwgcmVhY2hlZCAqLwoJCSAgICAgIHsKCQkJaWYgKCpmcHRyID09IDApCgkJCSAgewoJCQkgICAgc3RyY3B5IChzMSwgIlswMDAwMDBdIik7CgkJCSAgICB2cHRyID0gczEgKyA4OwoJCQkgICAgbnN0YXRlID0gTl9DTE9TRUQ7CgkJCSAgICBzID0gMDsKCQkJICAgIGJyZWFrOwoJCQkgIH0KCQkJZWxzZQoJCQkgIHsKCQkJICAgIHZwdHIgPSBzMSsxOwoJCQkgICAgbnN0YXRlID0gTl9PUEVOOwoJCQkgICAgYnJlYWs7CgkJCSAgfQoJCSAgICAgIH0gCgkJICB9CgkgICAgICB9CgkgICAgZWxzZQoJICAgICAgewoJCWNvcHl0byAoJnZwdHIsICZmcHRyLCAnLycsIGFzX2Rpcik7CgkJaWYgKG5zdGF0ZSA9PSBOX0RPVCkKCQkgIG5zdGF0ZSA9IE5fT1BFTjsKCSAgICAgIH0KCSAgICBpZiAocyA9PSAwKQoJICAgICAgewkJCQkJLyogMTgsMjAgKi8KCQlpZiAodHlwZSA9PSAxKQoJCSAgKnZwdHIrKyA9ICddJzsKCQlzdGF0ZSA9IC0xOwoJICAgICAgfQoJICAgIGVsc2UKCSAgICAgIHsKCQlpZiAoKihzKzEpID09IDApCgkJICB7CgkJICAgIGlmICh0eXBlID09IDIpCQkvKiAxOSwyMSAqLwoJCSAgICAgIHsKCQkgICAgICAgIHN0YXRlID0gNzsKCQkgICAgICB9CgkJICAgIGVsc2UKCQkgICAgICB7CgkJCSp2cHRyKysgPSAnXSc7CgkJCXN0YXRlID0gLTE7CgkJICAgICAgfQoJCSAgfQoJICAgICAgfQoJICAgIGJyZWFrOwoKCSAgY2FzZSAxMDoJCQkJLyogMSwyIGZpcnN0IGlzICcuJyAqLwoJICAgIGlmICgqZnB0ciA9PSAnLicpCgkgICAgICB7CgkJZnB0cisrOwoJCXN0YXRlID0gMTE7CgkgICAgICB9CgkgICAgZWxzZQoJICAgICAgc3RhdGUgPSAxMjsKCSAgICBicmVhazsKCgkgIGNhc2UgMTE6CQkJCS8qIDIsICcuLicgYXQgc3RhcnQgKi8KCSAgICBjb3VudCA9IDE7CgkgICAgaWYgKCpmcHRyICE9IDApCgkgICAgICB7CgkJaWYgKCpmcHRyICE9ICcvJykJCS8qIGdvdCAuLnh4eCAqLwoJCSAgewoJCSAgICByZXR1cm4gbmFtZTsKCQkgIH0KCQlkbwkJCQkvKiBnb3QgLi4vICovCgkJICB7CgkJICAgIGZwdHIrKzsKCQkgICAgd2hpbGUgKCpmcHRyID09ICcvJykgZnB0cisrOwoJCSAgICBpZiAoKmZwdHIgIT0gJy4nKQoJCSAgICAgIGJyZWFrOwoJCSAgICBpZiAoKihmcHRyKzEpICE9ICcuJykKCQkgICAgICBicmVhazsKCQkgICAgZnB0ciArPSAyOwoJCSAgICBpZiAoKCpmcHRyID09IDApCgkJCXx8ICgqZnB0ciA9PSAnLycpKQoJCSAgICAgIGNvdW50Kys7CgkJICB9CgkJd2hpbGUgKCpmcHRyID09ICcvJyk7CgkgICAgICB9CgkgICAgewkJCQkJLyogZ290ICcuLicgb3IgJy4uLycgKi8KCSAgICAgIGNoYXIgY3dkYnVmW01BWFBBVEhMRU4rMV07CgoJICAgICAgczEgPSBnZXRjd2QoY3dkYnVmLCBNQVhQQVRITEVOKTsKCSAgICAgIGlmIChzMSA9PSAwKQoJCXsKCQkgIHJldHVybiAiIjsJICAgIC8qIEZJWE1FLCBlcnIgZ2V0Y3dkICovCgkJfQoJICAgICAgc3RyY3B5ICh2cHRyLCBzMSk7CgkgICAgICBzID0gc3RyY2hyICh2cHRyLCAnXScpOwoJICAgICAgaWYgKHMgIT0gMCkKCQl7CgkJICBuc3RhdGUgPSBOX09QRU47CgkJICB3aGlsZSAocyA+IHZwdHIpCgkJICAgIHsKCQkgICAgICBzLS07CgkJICAgICAgaWYgKCpzID09ICdbJykKCQkJewoJCQkgIHMrKzsKCQkJICBzdHJjcHkgKHMsICIwMDAwMDBdIik7CgkJCSAgc3RhdGUgPSAtMTsKCQkJICBicmVhazsKCQkJfQoJCSAgICAgIGVsc2UgaWYgKCpzID09ICcuJykKCQkJewoJCQkgIGlmICgtLWNvdW50ID09IDApCgkJCSAgICB7CgkJCSAgICAgIGlmICgqZnB0ciA9PSAwKQkvKiBoYWQgJy4uJyBvciAnLi4vJyAqLwoJCQkJewoJCQkJICAqcysrID0gJ10nOwoJCQkJICBzdGF0ZSA9IC0xOwoJCQkJfQoJCQkgICAgICBlbHNlCQkJLyogaGFkICcuLi94eHgnICovCgkJCQl7CgkJCQkgIHN0YXRlID0gOTsKCQkJCX0KCQkJICAgICAgKnMgPSAwOwoJCQkgICAgICBicmVhazsKCQkJICAgIH0KCQkJfQoJCSAgICB9CgkJfQoJICAgICAgdnB0ciArPSBzdHJsZW4gKHZwdHIpOwoJICAgIH0KCSAgICBicmVhazsKCgkgIGNhc2UgMTI6CQkJCS8qIDEsICcuJyBhdCBzdGFydCAqLwoJICAgIGlmICgqZnB0ciAhPSAwKQoJICAgICAgewoJCWlmICgqZnB0ciAhPSAnLycpCgkJICB7CgkJICAgIHJldHVybiBuYW1lOwoJCSAgfQoJCWZwdHIrKzsKCSAgICAgIH0KCgkgICAgewoJICAgICAgY2hhciBjd2RidWZbTUFYUEFUSExFTisxXTsKCgkgICAgICBzMSA9IGdldGN3ZChjd2RidWYsIE1BWFBBVEhMRU4pOwoJICAgICAgaWYgKHMxID09IDApCgkJewoJCSAgcmV0dXJuICIiOwkgICAgLypGSVhNRSwgZXJyIGdldGN3ZCAqLwoJCX0KCSAgICAgIHN0cmNweSAodnB0ciwgczEpOwoJICAgICAgaWYgKCpmcHRyID09IDApCgkJewoJCSAgc3RhdGUgPSAtMTsKCQkgIGJyZWFrOwoJCX0KCSAgICAgIGVsc2UKCQl7CgkJICBzID0gc3RyY2hyICh2cHRyLCAnXScpOwoJCSAgaWYgKHMgPT0gMCkKCQkgICAgewoJCSAgICAgIHN0YXRlID0gLTE7CgkJICAgICAgYnJlYWs7CgkJICAgIH0KCQkgICpzID0gMDsKCQkgIG5zdGF0ZSA9IE5fT1BFTjsKCQkgIHZwdHIgKz0gc3RybGVuICh2cHRyKTsKCQkgIHN0YXRlID0gOTsKCQl9CgkgICAgfQoJICAgIGJyZWFrOwoJfQoKCX0KICAgICAgd2hpbGUgKHN0YXRlID4gMCk7CiAgICAgIAoKICAgIH0KCgogIC8qIGRpcmVjdG9yeSBjb252ZXJzaW9uIGRvbmUKICAgICBmcHRyIC0+IGZpbGVuYW1lIHBhcnQgb2YgaW5wdXQgc3RyaW5nCiAgICAgdnB0ciAtPiBmcmVlIHNwYWNlIGluIHZtc25hbWUKICAqLwoKICAqdnB0cisrID0gMDsKCiAgcmV0dXJuIHZtc25hbWU7Cn0KCgoKLyoKICBjb252ZXJ0IGZyb20gdm1zLXN0eWxlIHRvIHVuaXgtc3R5bGUKCiAgZGV2OltkaXIxLmRpcjJdCS8vZGV2L2RpcjEvZGlyMi8KKi8KCmNoYXIgKgp1bml4aWZ5IChjaGFyICpuYW1lKQp7CiAgc3RhdGljIGNoYXIgcGllY2VbNTEyXTsKICBjaGFyICpzLCAqcDsKCiAgaWYgKHN0cmNociAobmFtZSwgJy8nKSAhPSAwKQkJLyogYWxyZWFkeSBpbiB1bml4IHN0eWxlICovCiAgICByZXR1cm4gbmFtZTsKCiAgcCA9IHBpZWNlOwogICpwID0gMDsKCiAgLyogZGV2aWNlIHBhcnQgKi8KCiAgcyA9IHN0cmNociAobmFtZSwgJzonKTsKCiAgaWYgKHMgIT0gMCkKICAgIHsKICAgICAgKnMgPSAwOwogICAgICAqcCsrID0gJy8nOwogICAgICAqcCsrID0gJy8nOwogICAgICBzdHJjcHkgKHAsIG5hbWUpOwogICAgICBwICs9IHN0cmxlbiAocCk7CiAgICAgICpzID0gJzonOwogICAgfQoKICAvKiBkaXJlY3RvcnkgcGFydCAqLwoKICAqcCsrID0gJy8nOwogIHMgPSBzdHJjaHIgKG5hbWUsICdbJyk7CgogIGlmIChzICE9IDApCiAgICB7CiAgICAgIHMrKzsKICAgICAgc3dpdGNoICgqcykKICAgICAgICB7CgkgIGNhc2UgJ10nOgkJLyogW10gKi8KCSAgICBzdHJjYXQgKHAsICIuLyIpOwoJICAgIGJyZWFrOwoJICBjYXNlICctJzoJCS8qIFstICovCgkgICAgc3RyY2F0IChwLCAiLi4vIik7CgkgICAgYnJlYWs7CgkgIGNhc2UgJy4nOgoJICAgIHN0cmNhdCAocCwgIi4vIik7CS8qIFsuICovCgkgICAgYnJlYWs7CgkgIGRlZmF1bHQ6CgkgICAgcy0tOwoJICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgcysrOwogICAgICB3aGlsZSAoKnMpCiAgICAgICAgewoJICBpZiAoKnMgPT0gJy4nKQoJICAgICpwKysgPSAnLyc7CgkgIGVsc2UKCSAgICAqcCsrID0gKnM7CgkgIHMrKzsKCSAgaWYgKCpzID09ICddJykKCSAgICB7CgkgICAgICBzKys7CgkgICAgICBicmVhazsKCSAgICB9CiAgICAgICAgfQogICAgICBpZiAoKnMgIT0gMCkJCS8qIG1vcmUgYWZ0ZXIgJ10nID8/ICovCiAgICAgICAgewoJICBpZiAoKihwLTEpICE9ICcvJykKCSAgICAqcCsrID0gJy8nOwoJICBzdHJjcHkgKHAsIHMpOwkJLyogY29weSBpdCBhbnl3YXkgKi8KICAgICAgICB9CiAgICB9CgogIGVsc2UJCS8qIG5vICdbJyBhbnl3aGVyZSAqLwoKICAgIHsKICAgICAgKnArKyA9IDA7CiAgICB9CgogIC8qIGZvcmNlIGVuZCB3aXRoICcvJyAqLwoKICBpZiAoKihwLTEpICE9ICcvJykKICAgICpwKysgPSAnLyc7CiAgKnAgPSAwOwoKICByZXR1cm4gcGllY2U7Cn0KCi8qIEVPRiAqLwo=