LyogSGVscGVyIGxpYnJhcnkgZm9yIE1TSSBjcmVhdGlvbiB3aXRoIFB5dGhvbi4KICogQ29weXJpZ2h0IChDKSAyMDA1IE1hcnRpbiB2LiBM9ndpcwogKiBMaWNlbnNlZCB0byBQU0YgdW5kZXIgYSBjb250cmlidXRvciBhZ3JlZW1lbnQuCiAqLwoKI2luY2x1ZGUgPFB5dGhvbi5oPgojaW5jbHVkZSA8ZmNpLmg+CiNpbmNsdWRlIDxmY250bC5oPgojaW5jbHVkZSA8d2luZG93cy5oPgojaW5jbHVkZSA8bXNpLmg+CiNpbmNsdWRlIDxtc2lxdWVyeS5oPgojaW5jbHVkZSA8bXNpZGVmcy5oPgojaW5jbHVkZSA8cnBjLmg+CgpzdGF0aWMgUHlPYmplY3QgKk1TSUVycm9yOwoKc3RhdGljIFB5T2JqZWN0Kgp1dWlkY3JlYXRlKFB5T2JqZWN0KiBvYmosIFB5T2JqZWN0KmFyZ3MpCnsKICAgIFVVSUQgcmVzdWx0OwogICAgY2hhciAqY3Jlc3VsdDsKICAgIFB5T2JqZWN0ICpvcmVzdWx0OwogICAgCiAgICAvKiBNYXkgcmV0dXJuIG9rLCBsb2NhbCBvbmx5LCBhbmQgbm8gYWRkcmVzcy4KICAgICAgIEZvciBsb2NhbCBvbmx5LCB0aGUgZG9jdW1lbnRhdGlvbiBzYXlzIHdlIHN0aWxsIGdldCBhIHV1aWQuCiAgICAgICBGb3IgUlBDX1NfVVVJRF9OT19BRERSRVNTLCBpdCdzIG5vdCBjbGVhciB3aGV0aGVyIHdlIGNhbgogICAgICAgdXNlIHRoZSByZXN1bHQuICovCiAgICBpZiAoVXVpZENyZWF0ZSgmcmVzdWx0KSA9PSBSUENfU19VVUlEX05PX0FERFJFU1MpIHsKCVB5RXJyX1NldFN0cmluZyhQeUV4Y19Ob3RJbXBsZW1lbnRlZEVycm9yLCAicHJvY2Vzc2luZyAnbm8gYWRkcmVzcycgcmVzdWx0Iik7CglyZXR1cm4gTlVMTDsKICAgIH0KCiAgICBpZiAoVXVpZFRvU3RyaW5nKCZyZXN1bHQsICZjcmVzdWx0KSA9PSBSUENfU19PVVRfT0ZfTUVNT1JZKSB7CglQeUVycl9TZXRTdHJpbmcoUHlFeGNfTWVtb3J5RXJyb3IsICJvdXQgb2YgbWVtb3J5IGluIHV1aWRnZW4iKTsKCXJldHVybiBOVUxMOwogICAgfQoKICAgIG9yZXN1bHQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKGNyZXN1bHQpOwogICAgUnBjU3RyaW5nRnJlZSgmY3Jlc3VsdCk7CiAgICByZXR1cm4gb3Jlc3VsdDsKCn0KCi8qIEZDSSBjYWxsYmFjayBmdW5jdGlvbnMgKi8KCnN0YXRpYyBGTkZDSUFMTE9DKGNiX2FsbG9jKQp7CiAgICByZXR1cm4gbWFsbG9jKGNiKTsKfQoKc3RhdGljIEZORkNJRlJFRShjYl9mcmVlKQp7CiAgICBmcmVlKG1lbW9yeSk7Cn0KCnN0YXRpYyBGTkZDSU9QRU4oY2Jfb3BlbikKewogICAgaW50IHJlc3VsdCA9IF9vcGVuKHBzekZpbGUsIG9mbGFnLCBwbW9kZSk7CiAgICBpZiAocmVzdWx0ID09IC0xKQoJKmVyciA9IGVycm5vOwogICAgcmV0dXJuIHJlc3VsdDsKfQoKc3RhdGljIEZORkNJUkVBRChjYl9yZWFkKQp7CiAgICBVSU5UIHJlc3VsdCA9IChVSU5UKV9yZWFkKGhmLCBtZW1vcnksIGNiKTsKICAgIGlmIChyZXN1bHQgIT0gY2IpCgkqZXJyID0gZXJybm87CiAgICByZXR1cm4gcmVzdWx0Owp9CgpzdGF0aWMgRk5GQ0lXUklURShjYl93cml0ZSkKewogICAgVUlOVCByZXN1bHQgPSAoVUlOVClfd3JpdGUoaGYsIG1lbW9yeSwgY2IpOwogICAgaWYgKHJlc3VsdCAhPSBjYikKCSplcnIgPSBlcnJubzsKICAgIHJldHVybiByZXN1bHQ7Cn0KCnN0YXRpYyBGTkZDSUNMT1NFKGNiX2Nsb3NlKQp7CiAgICBpbnQgcmVzdWx0ID0gX2Nsb3NlKGhmKTsKICAgIGlmIChyZXN1bHQgIT0gMCkKCSplcnIgPSBlcnJubzsKICAgIHJldHVybiByZXN1bHQ7Cn0KCnN0YXRpYyBGTkZDSVNFRUsoY2Jfc2VlaykKewogICAgbG9uZyByZXN1bHQgPSAobG9uZylfbHNlZWsoaGYsIGRpc3QsIHNlZWt0eXBlKTsKICAgIGlmIChyZXN1bHQgPT0gLTEpCgkqZXJyID0gZXJybm87CiAgICByZXR1cm4gcmVzdWx0Owp9CgpzdGF0aWMgRk5GQ0lERUxFVEUoY2JfZGVsZXRlKQp7CiAgICBpbnQgcmVzdWx0ID0gcmVtb3ZlKHBzekZpbGUpOwogICAgaWYgKHJlc3VsdCAhPSAwKQoJKmVyciA9IGVycm5vOwogICAgcmV0dXJuIHJlc3VsdDsKfQoKc3RhdGljIEZORkNJRklMRVBMQUNFRChjYl9maWxlcGxhY2VkKQp7CiAgICByZXR1cm4gMDsKfQoKc3RhdGljIEZORkNJR0VUVEVNUEZJTEUoY2JfZ2V0dGVtcGZpbGUpCnsKICAgIGNoYXIgKm5hbWUgPSBfdGVtcG5hbSgiIiwgInRtcCIpOwogICAgaWYgKChuYW1lICE9IE5VTEwpICYmICgoaW50KXN0cmxlbihuYW1lKSA8IGNiVGVtcE5hbWUpKSB7CglzdHJjcHkocHN6VGVtcE5hbWUsIG5hbWUpOwoJZnJlZShuYW1lKTsKCXJldHVybiBUUlVFOwogICAgfQoKICAgIGlmIChuYW1lKSBmcmVlKG5hbWUpOwogICAgcmV0dXJuIEZBTFNFOwp9CgpzdGF0aWMgRk5GQ0lTVEFUVVMoY2Jfc3RhdHVzKQp7CiAgICBpZiAocHYpIHsKCVB5T2JqZWN0ICpyZXN1bHQgPSBQeU9iamVjdF9DYWxsTWV0aG9kKHB2LCAic3RhdHVzIiwgImlpaSIsIHR5cGVTdGF0dXMsIGNiMSwgY2IyKTsKCWlmIChyZXN1bHQgPT0gTlVMTCkKCSAgICByZXR1cm4gLTE7CglQeV9ERUNSRUYocmVzdWx0KTsKICAgIH0KICAgIHJldHVybiAwOwp9CgpzdGF0aWMgRk5GQ0lHRVRORVhUQ0FCSU5FVChjYl9nZXRuZXh0Y2FiaW5ldCkKewogICAgaWYgKHB2KSB7CglQeU9iamVjdCAqcmVzdWx0ID0gUHlPYmplY3RfQ2FsbE1ldGhvZChwdiwgImdldG5leHRjYWJpbmV0IiwgImkiLCBwY2NhYi0+aUNhYik7CglpZiAocmVzdWx0ID09IE5VTEwpCgkgICAgcmV0dXJuIC0xOwoJaWYgKCFQeVN0cmluZ19DaGVjayhyZXN1bHQpKSB7CgkgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgCgkJIkluY29ycmVjdCByZXR1cm4gdHlwZSAlcyBmcm9tIGdldG5leHRjYWJpbmV0IiwKCQlyZXN1bHQtPm9iX3R5cGUtPnRwX25hbWUpOwoJICAgIFB5X0RFQ1JFRihyZXN1bHQpOwoJICAgIHJldHVybiBGQUxTRTsKCX0KCXN0cm5jcHkocGNjYWItPnN6Q2FiLCBQeVN0cmluZ19Bc1N0cmluZyhyZXN1bHQpLCBzaXplb2YocGNjYWItPnN6Q2FiKSk7CglyZXR1cm4gVFJVRTsKICAgIH0KICAgIHJldHVybiBGQUxTRTsKfQoKc3RhdGljIEZORkNJR0VUT1BFTklORk8oY2JfZ2V0b3BlbmluZm8pCnsKICAgIEJZX0hBTkRMRV9GSUxFX0lORk9STUFUSU9OIGJoZmk7CiAgICBGSUxFVElNRSBmaWxldGltZTsKICAgIEhBTkRMRSBoYW5kbGU7CgogICAgLyogTmVlZCBXaW4zMiBoYW5kbGUgdG8gZ2V0IHRpbWUgc3RhbXBzICovCiAgICBoYW5kbGUgPSBDcmVhdGVGaWxlKHBzek5hbWUsIEdFTkVSSUNfUkVBRCwgRklMRV9TSEFSRV9SRUFELCBOVUxMLAoJT1BFTl9FWElTVElORywgRklMRV9BVFRSSUJVVEVfTk9STUFMLCBOVUxMKTsKICAgIGlmIChoYW5kbGUgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpCglyZXR1cm4gLTE7CgogICAgaWYgKEdldEZpbGVJbmZvcm1hdGlvbkJ5SGFuZGxlKGhhbmRsZSwgJmJoZmkpID09IEZBTFNFKQogICAgewoJQ2xvc2VIYW5kbGUoaGFuZGxlKTsKCXJldHVybiAtMTsKICAgIH0KCiAgICBGaWxlVGltZVRvTG9jYWxGaWxlVGltZSgmYmhmaS5mdExhc3RXcml0ZVRpbWUsICZmaWxldGltZSk7CiAgICBGaWxlVGltZVRvRG9zRGF0ZVRpbWUoJmZpbGV0aW1lLCBwZGF0ZSwgcHRpbWUpOwoKICAgICpwYXR0cmlicyA9IChpbnQpKGJoZmkuZHdGaWxlQXR0cmlidXRlcyAmIAoJKF9BX1JET05MWSB8IF9BX1NZU1RFTSB8IF9BX0hJRERFTiB8IF9BX0FSQ0gpKTsKCiAgICBDbG9zZUhhbmRsZShoYW5kbGUpOwoKICAgIHJldHVybiBfb3Blbihwc3pOYW1lLCBfT19SRE9OTFkgfCBfT19CSU5BUlkpOwp9CgpzdGF0aWMgUHlPYmplY3QqIGZjaWNyZWF0ZShQeU9iamVjdCogb2JqLCBQeU9iamVjdCogYXJncykKewogICAgY2hhciAqY2FibmFtZSwgKnA7CiAgICBQeU9iamVjdCAqZmlsZXM7CiAgICBDQ0FCIGNjYWI7CiAgICBIRkNJIGhmY2k7CiAgICBFUkYgZXJmOwogICAgUHlfc3NpemVfdCBpOwoKCiAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInNPOkZDSUNyZWF0ZSIsICZjYWJuYW1lLCAmZmlsZXMpKQoJcmV0dXJuIE5VTEw7CgogICAgaWYgKCFQeUxpc3RfQ2hlY2soZmlsZXMpKSB7CglQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiRkNJQ3JlYXRlIGV4cGVjdHMgYSBsaXN0Iik7CglyZXR1cm4gTlVMTDsKICAgIH0KCiAgICBjY2FiLmNiID0gSU5UX01BWDsgLyogbm8gbmVlZCB0byBzcGxpdCBDQUIgaW50byBtdWx0aXBsZSBtZWRpYSAqLwogICAgY2NhYi5jYkZvbGRlclRocmVzaCA9IDEwMDAwMDA7IC8qIGZsdXNoIGRpcmVjdG9yeSBhZnRlciB0aGlzIG1hbnkgYnl0ZXMgKi8KICAgIGNjYWIuY2JSZXNlcnZlQ0ZEYXRhID0gMDsKICAgIGNjYWIuY2JSZXNlcnZlQ0ZGb2xkZXIgPSAwOwogICAgY2NhYi5jYlJlc2VydmVDRkhlYWRlciA9IDA7CgogICAgY2NhYi5pQ2FiID0gMTsKICAgIGNjYWIuaURpc2sgPSAxOwoKICAgIGNjYWIuc2V0SUQgPSAwOwogICAgY2NhYi5zekRpc2tbMF0gPSAnXDAnOwoKICAgIGZvciAoaSA9IDAsIHAgPSBjYWJuYW1lOyAqcDsgcCA9IENoYXJOZXh0KHApKQoJaWYgKCpwID09ICdcXCcgfHwgKnAgPT0gJy8nKQoJICAgIGkgPSBwIC0gY2FibmFtZSArIDE7CgogICAgaWYgKGkgPj0gc2l6ZW9mKGNjYWIuc3pDYWJQYXRoKSB8fAoJc3RybGVuKGNhYm5hbWUraSkgPj0gc2l6ZW9mKGNjYWIuc3pDYWIpKSB7CglQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgInBhdGggbmFtZSB0b28gbG9uZyIpOwoJcmV0dXJuIDA7CiAgICB9CgogICAgaWYgKGkgPiAwKSB7CgltZW1jcHkoY2NhYi5zekNhYlBhdGgsIGNhYm5hbWUsIGkpOwoJY2NhYi5zekNhYlBhdGhbaV0gPSAnXDAnOwoJc3RyY3B5KGNjYWIuc3pDYWIsIGNhYm5hbWUraSk7CiAgICB9IGVsc2UgewoJc3RyY3B5KGNjYWIuc3pDYWJQYXRoLCAiLlxcIik7CglzdHJjcHkoY2NhYi5zekNhYiwgY2FibmFtZSk7CiAgICB9CgogICAgaGZjaSA9IEZDSUNyZWF0ZSgmZXJmLCBjYl9maWxlcGxhY2VkLCBjYl9hbGxvYywgY2JfZnJlZSwKCWNiX29wZW4sIGNiX3JlYWQsIGNiX3dyaXRlLCBjYl9jbG9zZSwgY2Jfc2VlaywgY2JfZGVsZXRlLAoJY2JfZ2V0dGVtcGZpbGUsICZjY2FiLCBOVUxMKTsKCiAgICBpZiAoaGZjaSA9PSBOVUxMKSB7CglQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwgIkZDSSBlcnJvciAlZCIsIGVyZi5lcmZPcGVyKTsKCXJldHVybiBOVUxMOwogICAgfQoKICAgIGZvciAoaT0wOyBpIDwgUHlMaXN0X0dFVF9TSVpFKGZpbGVzKTsgaSsrKSB7CglQeU9iamVjdCAqaXRlbSA9IFB5TGlzdF9HRVRfSVRFTShmaWxlcywgaSk7CgljaGFyICpmaWxlbmFtZSwgKmNhYm5hbWU7CglpZiAoIVB5QXJnX1BhcnNlVHVwbGUoaXRlbSwgInNzIiwgJmZpbGVuYW1lLCAmY2FibmFtZSkpCgkgICAgZ290byBlcnI7CglpZiAoIUZDSUFkZEZpbGUoaGZjaSwgZmlsZW5hbWUsIGNhYm5hbWUsIEZBTFNFLCAKCSAgICBjYl9nZXRuZXh0Y2FiaW5ldCwgY2Jfc3RhdHVzLCBjYl9nZXRvcGVuaW5mbywKCSAgICB0Y29tcFRZUEVfTVNaSVApKQoJICAgIGdvdG8gZXJyOwogICAgfQoKICAgIGlmICghRkNJRmx1c2hDYWJpbmV0KGhmY2ksIEZBTFNFLCBjYl9nZXRuZXh0Y2FiaW5ldCwgY2Jfc3RhdHVzKSkKCWdvdG8gZXJyOwoKICAgIGlmICghRkNJRGVzdHJveShoZmNpKSkKCWdvdG8gZXJyOwoKICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKICAgIHJldHVybiBQeV9Ob25lOwplcnI6CiAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwgIkZDSSBlcnJvciAlZCIsIGVyZi5lcmZPcGVyKTsgLyogWFhYIGJldHRlciBlcnJvciB0eXBlICovCiAgICBGQ0lEZXN0cm95KGhmY2kpOwogICAgcmV0dXJuIE5VTEw7Cn0KCnR5cGVkZWYgc3RydWN0IG1zaW9iansKICAgIFB5T2JqZWN0X0hFQUQKICAgIE1TSUhBTkRMRSBoOwp9bXNpb2JqOwoKc3RhdGljIHZvaWQgCm1zaW9ial9kZWFsbG9jKG1zaW9iaiogbXNpZGIpCnsKICAgIE1zaUNsb3NlSGFuZGxlKG1zaWRiLT5oKTsKICAgIG1zaWRiLT5oID0gMDsKfQoKc3RhdGljIFB5T2JqZWN0Kgptc2lvYmpfY2xvc2UobXNpb2JqKiBtc2lkYiwgUHlPYmplY3QgKmFyZ3MpCnsKICAgIE1zaUNsb3NlSGFuZGxlKG1zaWRiLT5oKTsKICAgIG1zaWRiLT5oID0gMDsKICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKICAgIHJldHVybiBQeV9Ob25lOwp9CgpzdGF0aWMgUHlPYmplY3QqCm1zaWVycm9yKGludCBzdGF0dXMpCnsKICAgIGludCBjb2RlOwogICAgY2hhciBidWZbMjAwMF07CiAgICBjaGFyICpyZXMgPSBidWY7CiAgICBEV09SRCBzaXplID0gc2l6ZW9mKGJ1Zik7CiAgICBNU0lIQU5ETEUgZXJyID0gTXNpR2V0TGFzdEVycm9yUmVjb3JkKCk7CgogICAgaWYgKGVyciA9PSAwKSB7Cglzd2l0Y2goc3RhdHVzKSB7CgljYXNlIEVSUk9SX0FDQ0VTU19ERU5JRUQ6CgkgICAgUHlFcnJfU2V0U3RyaW5nKE1TSUVycm9yLCAiYWNjZXNzIGRlbmllZCIpOwoJICAgIHJldHVybiBOVUxMOwoJY2FzZSBFUlJPUl9GVU5DVElPTl9GQUlMRUQ6CgkgICAgUHlFcnJfU2V0U3RyaW5nKE1TSUVycm9yLCAiZnVuY3Rpb24gZmFpbGVkIik7CgkgICAgcmV0dXJuIE5VTEw7CgljYXNlIEVSUk9SX0lOVkFMSURfREFUQToKCSAgICBQeUVycl9TZXRTdHJpbmcoTVNJRXJyb3IsICJpbnZhbGlkIGRhdGEiKTsKCSAgICByZXR1cm4gTlVMTDsKCWNhc2UgRVJST1JfSU5WQUxJRF9IQU5ETEU6CgkgICAgUHlFcnJfU2V0U3RyaW5nKE1TSUVycm9yLCAiaW52YWxpZCBoYW5kbGUiKTsKCSAgICByZXR1cm4gTlVMTDsKCWNhc2UgRVJST1JfSU5WQUxJRF9TVEFURToKCSAgICBQeUVycl9TZXRTdHJpbmcoTVNJRXJyb3IsICJpbnZhbGlkIHN0YXRlIik7CgkgICAgcmV0dXJuIE5VTEw7CgljYXNlIEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSOgoJICAgIFB5RXJyX1NldFN0cmluZyhNU0lFcnJvciwgImludmFsaWQgcGFyYW1ldGVyIik7CgkgICAgcmV0dXJuIE5VTEw7CglkZWZhdWx0OgoJICAgIFB5RXJyX0Zvcm1hdChNU0lFcnJvciwgInVua25vd24gZXJyb3IgJXgiLCBzdGF0dXMpOwoJICAgIHJldHVybiBOVUxMOwoJfQogICAgfQoKICAgIGNvZGUgPSBNc2lSZWNvcmRHZXRJbnRlZ2VyKGVyciwgMSk7IC8qIFhYWCBjb2RlICovCiAgICBpZiAoTXNpRm9ybWF0UmVjb3JkKDAsIGVyciwgcmVzLCAmc2l6ZSkgPT0gRVJST1JfTU9SRV9EQVRBKSB7CglyZXMgPSBtYWxsb2Moc2l6ZSsxKTsKCU1zaUZvcm1hdFJlY29yZCgwLCBlcnIsIHJlcywgJnNpemUpOwoJcmVzW3NpemVdPSdcMCc7CiAgICB9CiAgICBNc2lDbG9zZUhhbmRsZShlcnIpOwogICAgUHlFcnJfU2V0U3RyaW5nKE1TSUVycm9yLCByZXMpOwogICAgaWYgKHJlcyAhPSBidWYpCglmcmVlKHJlcyk7CiAgICByZXR1cm4gTlVMTDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiBSZWNvcmQgb2JqZWN0cyAqKioqKioqKioqKioqKioqKioqKioqLwoKc3RhdGljIFB5T2JqZWN0KgpyZWNvcmRfZ2V0ZmllbGRjb3VudChtc2lvYmoqIHJlY29yZCwgUHlPYmplY3QqIGFyZ3MpCnsKICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhNc2lSZWNvcmRHZXRGaWVsZENvdW50KHJlY29yZC0+aCkpOwp9CgpzdGF0aWMgUHlPYmplY3QqCnJlY29yZF9jbGVhcmRhdGEobXNpb2JqKiByZWNvcmQsIFB5T2JqZWN0ICphcmdzKQp7CiAgICBpbnQgc3RhdHVzID0gTXNpUmVjb3JkQ2xlYXJEYXRhKHJlY29yZC0+aCk7CiAgICBpZiAoc3RhdHVzICE9IEVSUk9SX1NVQ0NFU1MpCglyZXR1cm4gbXNpZXJyb3Ioc3RhdHVzKTsKCiAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CiAgICByZXR1cm4gUHlfTm9uZTsKfQoKc3RhdGljIFB5T2JqZWN0KgpyZWNvcmRfc2V0c3RyaW5nKG1zaW9iaiogcmVjb3JkLCBQeU9iamVjdCAqYXJncykKewogICAgaW50IHN0YXR1czsKICAgIGludCBmaWVsZDsKICAgIGNoYXIgKmRhdGE7CgogICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpczpTZXRTdHJpbmciLCAmZmllbGQsICZkYXRhKSkKCXJldHVybiBOVUxMOwoKICAgIGlmICgoc3RhdHVzID0gTXNpUmVjb3JkU2V0U3RyaW5nKHJlY29yZC0+aCwgZmllbGQsIGRhdGEpKSAhPSBFUlJPUl9TVUNDRVNTKQoJcmV0dXJuIG1zaWVycm9yKHN0YXR1cyk7CgogICAgUHlfSU5DUkVGKFB5X05vbmUpOwogICAgcmV0dXJuIFB5X05vbmU7Cn0KCnN0YXRpYyBQeU9iamVjdCoKcmVjb3JkX3NldHN0cmVhbShtc2lvYmoqIHJlY29yZCwgUHlPYmplY3QgKmFyZ3MpCnsKICAgIGludCBzdGF0dXM7CiAgICBpbnQgZmllbGQ7CiAgICBjaGFyICpkYXRhOwoKICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaXM6U2V0U3RyZWFtIiwgJmZpZWxkLCAmZGF0YSkpCglyZXR1cm4gTlVMTDsKCiAgICBpZiAoKHN0YXR1cyA9IE1zaVJlY29yZFNldFN0cmVhbShyZWNvcmQtPmgsIGZpZWxkLCBkYXRhKSkgIT0gRVJST1JfU1VDQ0VTUykKCXJldHVybiBtc2llcnJvcihzdGF0dXMpOwoKICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKICAgIHJldHVybiBQeV9Ob25lOwp9CgpzdGF0aWMgUHlPYmplY3QqCnJlY29yZF9zZXRpbnRlZ2VyKG1zaW9iaiogcmVjb3JkLCBQeU9iamVjdCAqYXJncykKewogICAgaW50IHN0YXR1czsKICAgIGludCBmaWVsZDsKICAgIGludCBkYXRhOwoKICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaWk6U2V0SW50ZWdlciIsICZmaWVsZCwgJmRhdGEpKQoJcmV0dXJuIE5VTEw7CgogICAgaWYgKChzdGF0dXMgPSBNc2lSZWNvcmRTZXRJbnRlZ2VyKHJlY29yZC0+aCwgZmllbGQsIGRhdGEpKSAhPSBFUlJPUl9TVUNDRVNTKQoJcmV0dXJuIG1zaWVycm9yKHN0YXR1cyk7CgogICAgUHlfSU5DUkVGKFB5X05vbmUpOwogICAgcmV0dXJuIFB5X05vbmU7Cn0KCgoKc3RhdGljIFB5TWV0aG9kRGVmIHJlY29yZF9tZXRob2RzW10gPSB7CiAgICB7ICJHZXRGaWVsZENvdW50IiwgKFB5Q0Z1bmN0aW9uKXJlY29yZF9nZXRmaWVsZGNvdW50LCBNRVRIX05PQVJHUywgCglQeURvY19TVFIoIkdldEZpZWxkQ291bnQoKSAtPiBpbnRcbldyYXBzIE1zaVJlY29yZEdldEZpZWxkQ291bnQiKX0sCiAgICB7ICJTZXRTdHJpbmciLCAoUHlDRnVuY3Rpb24pcmVjb3JkX3NldHN0cmluZywgTUVUSF9WQVJBUkdTLCAKCVB5RG9jX1NUUigiU2V0U3RyaW5nKGZpZWxkLHN0cikgLT4gTm9uZVxuV3JhcHMgTXNpUmVjb3JkU2V0U3RyaW5nIil9LAogICAgeyAiU2V0U3RyZWFtIiwgKFB5Q0Z1bmN0aW9uKXJlY29yZF9zZXRzdHJlYW0sIE1FVEhfVkFSQVJHUywgCglQeURvY19TVFIoIlNldFN0cmVhbShmaWVsZCxmaWxlbmFtZSkgLT4gTm9uZVxuV3JhcHMgTXNpUmVjb3JkU2V0SW50ZWdlciIpfSwKICAgIHsgIlNldEludGVnZXIiLCAoUHlDRnVuY3Rpb24pcmVjb3JkX3NldGludGVnZXIsIE1FVEhfVkFSQVJHUywgCglQeURvY19TVFIoIlNldEludGVnZXIoZmllbGQsaW50KSAtPiBOb25lXG5XcmFwcyBNc2lSZWNvcmRTZXRJbnRlZ2VyIil9LAogICAgeyAiQ2xlYXJEYXRhIiwgKFB5Q0Z1bmN0aW9uKXJlY29yZF9jbGVhcmRhdGEsIE1FVEhfTk9BUkdTLCAKCVB5RG9jX1NUUigiQ2xlYXJEYXRhKCkgLT4gaW50XG5XcmFwcyBNc2lSZWNvcmRHQ2xlYXJEYXRhIil9LAogICAgeyBOVUxMLCBOVUxMIH0KfTsKCnN0YXRpYyBQeVR5cGVPYmplY3QgcmVjb3JkX1R5cGUgPSB7CglQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKCTAsCQkJLypvYl9zaXplKi8KCSJfbXNpLlJlY29yZCIsCQkvKnRwX25hbWUqLwoJc2l6ZW9mKG1zaW9iaiksCS8qdHBfYmFzaWNzaXplKi8KCTAsCQkJLyp0cF9pdGVtc2l6ZSovCgkvKiBtZXRob2RzICovCgkoZGVzdHJ1Y3Rvciltc2lvYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KCTAsCQkJLyp0cF9wcmludCovCgkwLAkJCS8qdHBfZ2V0YXR0ciovCgkwLAkJCS8qdHBfc2V0YXR0ciovCgkwLAkJCS8qdHBfY29tcGFyZSovCgkwLAkJCS8qdHBfcmVwciovCgkwLAkJCS8qdHBfYXNfbnVtYmVyKi8KCTAsCQkJLyp0cF9hc19zZXF1ZW5jZSovCgkwLAkJCS8qdHBfYXNfbWFwcGluZyovCgkwLAkJCS8qdHBfaGFzaCovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jYWxsKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX3N0ciovCiAgICAgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsLyp0cF9nZXRhdHRybyovCiAgICAgICAgUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsLyp0cF9zZXRhdHRybyovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19idWZmZXIqLwogICAgICAgIFB5X1RQRkxBR1NfREVGQVVMVCwgICAgIC8qdHBfZmxhZ3MqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZG9jKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX3RyYXZlcnNlKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NsZWFyKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX3JpY2hjb21wYXJlKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2l0ZXIqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlcm5leHQqLwogICAgICAgIHJlY29yZF9tZXRob2RzLCAgICAgICAgICAgLyp0cF9tZXRob2RzKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX21lbWJlcnMqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0c2V0Ki8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2Jhc2UqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGljdCovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kZXNjcl9nZXQqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGVzY3Jfc2V0Ki8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2RpY3RvZmZzZXQqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaW5pdCovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hbGxvYyovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9uZXcqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZnJlZSovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pc19nYyovCn07CgpzdGF0aWMgUHlPYmplY3QqCnJlY29yZF9uZXcoTVNJSEFORExFIGgpCnsKICAgIG1zaW9iaiAqcmVzdWx0ID0gUHlPYmplY3RfTkVXKHN0cnVjdCBtc2lvYmosICZyZWNvcmRfVHlwZSk7CgogICAgaWYgKCFyZXN1bHQpIHsKCU1zaUNsb3NlSGFuZGxlKGgpOwoJcmV0dXJuIE5VTEw7CiAgICB9CgogICAgcmVzdWx0LT5oID0gaDsKICAgIHJldHVybiAoUHlPYmplY3QqKXJlc3VsdDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiBTdW1tYXJ5SW5mb3JtYXRpb24gb2JqZWN0cyAqKioqKioqKioqKioqKi8KCnN0YXRpYyBQeU9iamVjdCoKc3VtbWFyeV9nZXRwcm9wZXJ0eShtc2lvYmoqIHNpLCBQeU9iamVjdCAqYXJncykKewogICAgaW50IHN0YXR1czsKICAgIGludCBmaWVsZDsKICAgIFB5T2JqZWN0ICpyZXN1bHQ7CiAgICBVSU5UIHR5cGU7CiAgICBJTlQgaXZhbDsKICAgIEZJTEVUSU1FIGZ2YWw7CiAgICBjaGFyIHNidWZbMTAwMF07CiAgICBjaGFyICpzdmFsID0gc2J1ZjsKICAgIERXT1JEIHNzaXplID0gc2l6ZW9mKHN2YWwpOwoKICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTpHZXRQcm9wZXJ0eSIsICZmaWVsZCkpCglyZXR1cm4gTlVMTDsKCiAgICBzdGF0dXMgPSBNc2lTdW1tYXJ5SW5mb0dldFByb3BlcnR5KHNpLT5oLCBmaWVsZCwgJnR5cGUsICZpdmFsLCAKCSZmdmFsLCBzdmFsLCAmc3NpemUpOwogICAgaWYgKHN0YXR1cyA9PSBFUlJPUl9NT1JFX0RBVEEpIHsKCXN2YWwgPSBtYWxsb2Moc3NpemUpOwogICAgICAgIHN0YXR1cyA9IE1zaVN1bW1hcnlJbmZvR2V0UHJvcGVydHkoc2ktPmgsIGZpZWxkLCAmdHlwZSwgJml2YWwsIAogICAgCSAgICAmZnZhbCwgc3ZhbCwgJnNzaXplKTsKICAgIH0KCiAgICBzd2l0Y2godHlwZSkgewoJY2FzZSBWVF9JMjogY2FzZSBWVF9JNDoKCSAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoaXZhbCk7CgljYXNlIFZUX0ZJTEVUSU1FOgoJICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19Ob3RJbXBsZW1lbnRlZEVycm9yLCAiRklMRVRJTUUgcmVzdWx0Iik7CgkgICAgcmV0dXJuIE5VTEw7CgljYXNlIFZUX0xQU1RSOgoJICAgIHJlc3VsdCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHN2YWwsIHNzaXplKTsKCSAgICBpZiAoc3ZhbCAhPSBzYnVmKQoJCWZyZWUoc3ZhbCk7CgkgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19Ob3RJbXBsZW1lbnRlZEVycm9yLCAicmVzdWx0IG9mIHR5cGUgJWQiLCB0eXBlKTsKICAgIHJldHVybiBOVUxMOwp9CgpzdGF0aWMgUHlPYmplY3QqCnN1bW1hcnlfZ2V0cHJvcGVydHljb3VudChtc2lvYmoqIHNpLCBQeU9iamVjdCAqYXJncykKewogICAgaW50IHN0YXR1czsKICAgIFVJTlQgcmVzdWx0OwoKICAgIHN0YXR1cyA9IE1zaVN1bW1hcnlJbmZvR2V0UHJvcGVydHlDb3VudChzaS0+aCwgJnJlc3VsdCk7CiAgICBpZiAoc3RhdHVzICE9IEVSUk9SX1NVQ0NFU1MpCglyZXR1cm4gbXNpZXJyb3Ioc3RhdHVzKTsKCiAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcocmVzdWx0KTsKfQoKc3RhdGljIFB5T2JqZWN0KgpzdW1tYXJ5X3NldHByb3BlcnR5KG1zaW9iaiogc2ksIFB5T2JqZWN0ICphcmdzKQp7CiAgICBpbnQgc3RhdHVzOwogICAgaW50IGZpZWxkOwogICAgUHlPYmplY3QqIGRhdGE7CgogICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpTzpTZXRQcm9wZXJ0eSIsICZmaWVsZCwgJmRhdGEpKQoJcmV0dXJuIE5VTEw7CgogICAgaWYgKFB5U3RyaW5nX0NoZWNrKGRhdGEpKSB7CglzdGF0dXMgPSBNc2lTdW1tYXJ5SW5mb1NldFByb3BlcnR5KHNpLT5oLCBmaWVsZCwgVlRfTFBTVFIsCgkgICAgMCwgTlVMTCwgUHlTdHJpbmdfQXNTdHJpbmcoZGF0YSkpOwogICAgfSBlbHNlIGlmIChQeUludF9DaGVjayhkYXRhKSkgewoJc3RhdHVzID0gTXNpU3VtbWFyeUluZm9TZXRQcm9wZXJ0eShzaS0+aCwgZmllbGQsIFZUX0k0LAoJICAgIFB5SW50X0FzTG9uZyhkYXRhKSwgTlVMTCwgTlVMTCk7CiAgICB9IGVsc2UgewoJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgInVuc3VwcG9ydGVkIHR5cGUiKTsKCXJldHVybiBOVUxMOwogICAgfQogICAgCiAgICBpZiAoc3RhdHVzICE9IEVSUk9SX1NVQ0NFU1MpCglyZXR1cm4gbXNpZXJyb3Ioc3RhdHVzKTsKCiAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CiAgICByZXR1cm4gUHlfTm9uZTsKfQoKCnN0YXRpYyBQeU9iamVjdCoKc3VtbWFyeV9wZXJzaXN0KG1zaW9iaiogc2ksIFB5T2JqZWN0ICphcmdzKQp7CiAgICBpbnQgc3RhdHVzOwoKICAgIHN0YXR1cyA9IE1zaVN1bW1hcnlJbmZvUGVyc2lzdChzaS0+aCk7CiAgICBpZiAoc3RhdHVzICE9IEVSUk9SX1NVQ0NFU1MpCglyZXR1cm4gbXNpZXJyb3Ioc3RhdHVzKTsKICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKICAgIHJldHVybiBQeV9Ob25lOwp9CgpzdGF0aWMgUHlNZXRob2REZWYgc3VtbWFyeV9tZXRob2RzW10gPSB7CiAgICB7ICJHZXRQcm9wZXJ0eSIsIChQeUNGdW5jdGlvbilzdW1tYXJ5X2dldHByb3BlcnR5LCBNRVRIX1ZBUkFSR1MsIAoJUHlEb2NfU1RSKCJHZXRQcm9wZXJ0eShwcm9waWQpIC0+IHZhbHVlXG5XcmFwcyBNc2lTdW1tYXJ5SW5mb0dldFByb3BlcnR5Iil9LAogICAgeyAiR2V0UHJvcGVydHlDb3VudCIsIChQeUNGdW5jdGlvbilzdW1tYXJ5X2dldHByb3BlcnR5Y291bnQsIE1FVEhfTk9BUkdTLCAKCVB5RG9jX1NUUigiR2V0UHJvcGVydHkoKSAtPiBpbnRcbldyYXBzIE1zaVN1bW1hcnlJbmZvR2V0UHJvcGVydHlDb3VudCIpfSwKICAgIHsgIlNldFByb3BlcnR5IiwgKFB5Q0Z1bmN0aW9uKXN1bW1hcnlfc2V0cHJvcGVydHksIE1FVEhfVkFSQVJHUywgCglQeURvY19TVFIoIlNldFByb3BlcnR5KHZhbHVlKSAtPiBOb25lXG5XcmFwcyBNc2lTdW1tYXJ5SW5mb1Byb3BlcnR5Iil9LAogICAgeyAiUGVyc2lzdCIsIChQeUNGdW5jdGlvbilzdW1tYXJ5X3BlcnNpc3QsIE1FVEhfTk9BUkdTLCAKCVB5RG9jX1NUUigiUGVyc2lzdCgpIC0+IE5vbmVcbldyYXBzIE1zaVN1bW1hcnlJbmZvUGVyc2lzdCIpfSwKICAgIHsgTlVMTCwgTlVMTCB9Cn07CgpzdGF0aWMgUHlUeXBlT2JqZWN0IHN1bW1hcnlfVHlwZSA9IHsKCVB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQoJMCwJCQkvKm9iX3NpemUqLwoJIl9tc2kuU3VtbWFyeUluZm9ybWF0aW9uIiwJCS8qdHBfbmFtZSovCglzaXplb2YobXNpb2JqKSwJLyp0cF9iYXNpY3NpemUqLwoJMCwJCQkvKnRwX2l0ZW1zaXplKi8KCS8qIG1ldGhvZHMgKi8KCShkZXN0cnVjdG9yKW1zaW9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwoJMCwJCQkvKnRwX3ByaW50Ki8KCTAsCQkJLyp0cF9nZXRhdHRyKi8KCTAsCQkJLyp0cF9zZXRhdHRyKi8KCTAsCQkJLyp0cF9jb21wYXJlKi8KCTAsCQkJLyp0cF9yZXByKi8KCTAsCQkJLyp0cF9hc19udW1iZXIqLwoJMCwJCQkvKnRwX2FzX3NlcXVlbmNlKi8KCTAsCQkJLyp0cF9hc19tYXBwaW5nKi8KCTAsCQkJLyp0cF9oYXNoKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NhbGwqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc3RyKi8KICAgICAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwvKnRwX2dldGF0dHJvKi8KICAgICAgICBQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwvKnRwX3NldGF0dHJvKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX2J1ZmZlciovCiAgICAgICAgUHlfVFBGTEFHU19ERUZBVUxULCAgICAgLyp0cF9mbGFncyovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kb2MqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfdHJhdmVyc2UqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY2xlYXIqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcmljaGNvbXBhcmUqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfd2Vha2xpc3RvZmZzZXQqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlciovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVybmV4dCovCiAgICAgICAgc3VtbWFyeV9tZXRob2RzLCAgICAgICAgLyp0cF9tZXRob2RzKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX21lbWJlcnMqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0c2V0Ki8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2Jhc2UqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGljdCovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kZXNjcl9nZXQqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGVzY3Jfc2V0Ki8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2RpY3RvZmZzZXQqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaW5pdCovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hbGxvYyovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9uZXcqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZnJlZSovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pc19nYyovCn07CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqIFZpZXcgb2JqZWN0cyAqKioqKioqKioqKioqKi8KCnN0YXRpYyBQeU9iamVjdCoKdmlld19leGVjdXRlKG1zaW9iaiAqdmlldywgUHlPYmplY3QqYXJncykKewogICAgaW50IHN0YXR1czsKICAgIE1TSUhBTkRMRSBwYXJhbXMgPSAwOwogICAgUHlPYmplY3QgKm9wYXJhbXMgPSBQeV9Ob25lOwoKICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTzpFeGVjdXRlIiwgJm9wYXJhbXMpKQoJcmV0dXJuIE5VTEw7CgogICAgaWYgKG9wYXJhbXMgIT0gUHlfTm9uZSkgewogICAgICAgIGlmIChvcGFyYW1zLT5vYl90eXBlICE9ICZyZWNvcmRfVHlwZSkgewogICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiRXhlY3V0ZSBhcmd1bWVudCBtdXN0IGJlIGEgcmVjb3JkIik7CiAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgIH0KICAgICAgICBwYXJhbXMgPSAoKG1zaW9iaiopb3BhcmFtcyktPmg7CiAgICB9CgogICAgc3RhdHVzID0gTXNpVmlld0V4ZWN1dGUodmlldy0+aCwgcGFyYW1zKTsKICAgIGlmIChzdGF0dXMgIT0gRVJST1JfU1VDQ0VTUykKCXJldHVybiBtc2llcnJvcihzdGF0dXMpOwoKICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKICAgIHJldHVybiBQeV9Ob25lOwp9CgpzdGF0aWMgUHlPYmplY3QqCnZpZXdfZmV0Y2gobXNpb2JqICp2aWV3LCBQeU9iamVjdCphcmdzKQp7CiAgICBpbnQgc3RhdHVzOwogICAgTVNJSEFORExFIHJlc3VsdDsKCiAgICBpZiAoKHN0YXR1cyA9IE1zaVZpZXdGZXRjaCh2aWV3LT5oLCAmcmVzdWx0KSkgIT0gRVJST1JfU1VDQ0VTUykKCXJldHVybiBtc2llcnJvcihzdGF0dXMpOwoKICAgIHJldHVybiByZWNvcmRfbmV3KHJlc3VsdCk7Cn0KCnN0YXRpYyBQeU9iamVjdCoKdmlld19nZXRjb2x1bW5pbmZvKG1zaW9iaiAqdmlldywgUHlPYmplY3QgKmFyZ3MpCnsKICAgIGludCBzdGF0dXM7CiAgICBpbnQga2luZDsKICAgIE1TSUhBTkRMRSByZXN1bHQ7CgogICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOkdldENvbHVtbkluZm8iLCAma2luZCkpCglyZXR1cm4gTlVMTDsKCiAgICBpZiAoKHN0YXR1cyA9IE1zaVZpZXdHZXRDb2x1bW5JbmZvKHZpZXctPmgsIGtpbmQsICZyZXN1bHQpKSAhPSBFUlJPUl9TVUNDRVNTKQoJcmV0dXJuIG1zaWVycm9yKHN0YXR1cyk7CgogICAgcmV0dXJuIHJlY29yZF9uZXcocmVzdWx0KTsKfQoKc3RhdGljIFB5T2JqZWN0Kgp2aWV3X21vZGlmeShtc2lvYmogKnZpZXcsIFB5T2JqZWN0ICphcmdzKQp7CiAgICBpbnQga2luZDsKICAgIFB5T2JqZWN0ICpkYXRhOwogICAgaW50IHN0YXR1czsKCiAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlPOk1vZGlmeSIsICZraW5kLCAmZGF0YSkpCglyZXR1cm4gTlVMTDsKCiAgICBpZiAoZGF0YS0+b2JfdHlwZSAhPSAmcmVjb3JkX1R5cGUpIHsKCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJNb2RpZnkgZXhwZWN0cyBhIHJlY29yZCBvYmplY3QiKTsKCXJldHVybiBOVUxMOwogICAgfQoKICAgIGlmICgoc3RhdHVzID0gTXNpVmlld01vZGlmeSh2aWV3LT5oLCBraW5kLCAoKG1zaW9iaiopZGF0YSktPmgpKSAhPSBFUlJPUl9TVUNDRVNTKQoJcmV0dXJuIG1zaWVycm9yKHN0YXR1cyk7CgogICAgUHlfSU5DUkVGKFB5X05vbmUpOwogICAgcmV0dXJuIFB5X05vbmU7Cn0KCnN0YXRpYyBQeU9iamVjdCoKdmlld19jbG9zZShtc2lvYmogKnZpZXcsIFB5T2JqZWN0KmFyZ3MpCnsKICAgIGludCBzdGF0dXM7CgogICAgaWYgKChzdGF0dXMgPSBNc2lWaWV3Q2xvc2Uodmlldy0+aCkpICE9IEVSUk9SX1NVQ0NFU1MpCglyZXR1cm4gbXNpZXJyb3Ioc3RhdHVzKTsKCiAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CiAgICByZXR1cm4gUHlfTm9uZTsKfQoKc3RhdGljIFB5TWV0aG9kRGVmIHZpZXdfbWV0aG9kc1tdID0gewogICAgeyAiRXhlY3V0ZSIsIChQeUNGdW5jdGlvbil2aWV3X2V4ZWN1dGUsIE1FVEhfVkFSQVJHUywgCglQeURvY19TVFIoIkV4ZWN1dGUocGFyYW1zPU5vbmUpIC0+IE5vbmVcbldyYXBzIE1zaVZpZXdFeGVjdXRlIil9LAogICAgeyAiR2V0Q29sdW1uSW5mbyIsIChQeUNGdW5jdGlvbil2aWV3X2dldGNvbHVtbmluZm8sIE1FVEhfVkFSQVJHUywKCVB5RG9jX1NUUigiR2V0Q29sdW1uSW5mbygpIC0+IHJlc3VsdFxuV3JhcHMgTXNpR2V0Q29sdW1uSW5mbyIpfSwKICAgIHsgIkZldGNoIiwgKFB5Q0Z1bmN0aW9uKXZpZXdfZmV0Y2gsIE1FVEhfTk9BUkdTLAoJUHlEb2NfU1RSKCJGZXRjaCgpIC0+IHJlc3VsdFxuV3JhcHMgTXNpVmlld0ZldGNoIil9LAogICAgeyAiTW9kaWZ5IiwgKFB5Q0Z1bmN0aW9uKXZpZXdfbW9kaWZ5LCBNRVRIX1ZBUkFSR1MsCglQeURvY19TVFIoIk1vZGlmeShtb2RlLHJlY29yZCkgLT4gTm9uZVxuV3JhcHMgTXNpVmlld01vZGlmeSIpfSwKICAgIHsgIkNsb3NlIiwgKFB5Q0Z1bmN0aW9uKXZpZXdfY2xvc2UsIE1FVEhfTk9BUkdTLAoJUHlEb2NfU1RSKCJDbG9zZSgpIC0+IHJlc3VsdFxuV3JhcHMgTXNpVmlld0Nsb3NlIil9LAogICAgeyBOVUxMLCBOVUxMIH0KfTsKCnN0YXRpYyBQeVR5cGVPYmplY3QgbXNpdmlld19UeXBlID0gewoJUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCgkwLAkJCS8qb2Jfc2l6ZSovCgkiX21zaS5WaWV3IiwJCS8qdHBfbmFtZSovCglzaXplb2YobXNpb2JqKSwJLyp0cF9iYXNpY3NpemUqLwoJMCwJCQkvKnRwX2l0ZW1zaXplKi8KCS8qIG1ldGhvZHMgKi8KCShkZXN0cnVjdG9yKW1zaW9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwoJMCwJCQkvKnRwX3ByaW50Ki8KCTAsCQkJLyp0cF9nZXRhdHRyKi8KCTAsCQkJLyp0cF9zZXRhdHRyKi8KCTAsCQkJLyp0cF9jb21wYXJlKi8KCTAsCQkJLyp0cF9yZXByKi8KCTAsCQkJLyp0cF9hc19udW1iZXIqLwoJMCwJCQkvKnRwX2FzX3NlcXVlbmNlKi8KCTAsCQkJLyp0cF9hc19tYXBwaW5nKi8KCTAsCQkJLyp0cF9oYXNoKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NhbGwqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc3RyKi8KICAgICAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwvKnRwX2dldGF0dHJvKi8KICAgICAgICBQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwvKnRwX3NldGF0dHJvKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX2J1ZmZlciovCiAgICAgICAgUHlfVFBGTEFHU19ERUZBVUxULCAgICAgLyp0cF9mbGFncyovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kb2MqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfdHJhdmVyc2UqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY2xlYXIqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcmljaGNvbXBhcmUqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfd2Vha2xpc3RvZmZzZXQqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlciovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVybmV4dCovCiAgICAgICAgdmlld19tZXRob2RzLCAgICAgICAgICAgLyp0cF9tZXRob2RzKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX21lbWJlcnMqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0c2V0Ki8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2Jhc2UqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGljdCovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kZXNjcl9nZXQqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGVzY3Jfc2V0Ki8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2RpY3RvZmZzZXQqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaW5pdCovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hbGxvYyovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9uZXcqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZnJlZSovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pc19nYyovCn07CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqIERhdGFiYXNlIG9iamVjdHMgKioqKioqKioqKioqKiovCgpzdGF0aWMgUHlPYmplY3QqCm1zaWRiX29wZW52aWV3KG1zaW9iaiAqbXNpZGIsIFB5T2JqZWN0ICphcmdzKQp7CiAgICBpbnQgc3RhdHVzOwogICAgY2hhciAqc3FsOwogICAgTVNJSEFORExFIGhWaWV3OwogICAgbXNpb2JqICpyZXN1bHQ7CgogICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzOk9wZW5WaWV3IiwgJnNxbCkpCglyZXR1cm4gTlVMTDsKCiAgICBpZiAoKHN0YXR1cyA9IE1zaURhdGFiYXNlT3BlblZpZXcobXNpZGItPmgsIHNxbCwgJmhWaWV3KSkgIT0gRVJST1JfU1VDQ0VTUykKCXJldHVybiBtc2llcnJvcihzdGF0dXMpOwoKICAgIHJlc3VsdCA9IFB5T2JqZWN0X05FVyhzdHJ1Y3QgbXNpb2JqLCAmbXNpdmlld19UeXBlKTsKICAgIGlmICghcmVzdWx0KSB7CglNc2lDbG9zZUhhbmRsZShoVmlldyk7CglyZXR1cm4gTlVMTDsKICAgIH0KCiAgICByZXN1bHQtPmggPSBoVmlldzsKICAgIHJldHVybiAoUHlPYmplY3QqKXJlc3VsdDsKfQoKc3RhdGljIFB5T2JqZWN0Kgptc2lkYl9jb21taXQobXNpb2JqICptc2lkYiwgUHlPYmplY3QgKmFyZ3MpCnsKICAgIGludCBzdGF0dXM7CgogICAgaWYgKChzdGF0dXMgPSBNc2lEYXRhYmFzZUNvbW1pdChtc2lkYi0+aCkpICE9IEVSUk9SX1NVQ0NFU1MpCglyZXR1cm4gbXNpZXJyb3Ioc3RhdHVzKTsKCiAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CiAgICByZXR1cm4gUHlfTm9uZTsKfQoKc3RhdGljIFB5T2JqZWN0Kgptc2lkYl9nZXRzdW1tYXJ5aW5mb3JtYXRpb24obXNpb2JqICpkYiwgUHlPYmplY3QgKmFyZ3MpCnsKICAgIGludCBzdGF0dXM7CiAgICBpbnQgY291bnQ7CiAgICBNU0lIQU5ETEUgcmVzdWx0OwogICAgbXNpb2JqICpvcmVzdWx0OwoKICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTpHZXRTdW1tYXJ5SW5mb3JtYXRpb24iLCAmY291bnQpKQoJcmV0dXJuIE5VTEw7CgogICAgc3RhdHVzID0gTXNpR2V0U3VtbWFyeUluZm9ybWF0aW9uKGRiLT5oLCBOVUxMLCBjb3VudCwgJnJlc3VsdCk7CiAgICBpZiAoc3RhdHVzICE9IEVSUk9SX1NVQ0NFU1MpCglyZXR1cm4gbXNpZXJyb3Ioc3RhdHVzKTsKCiAgICBvcmVzdWx0ID0gUHlPYmplY3RfTkVXKHN0cnVjdCBtc2lvYmosICZzdW1tYXJ5X1R5cGUpOwogICAgaWYgKCFyZXN1bHQpIHsKCU1zaUNsb3NlSGFuZGxlKHJlc3VsdCk7CglyZXR1cm4gTlVMTDsKICAgIH0KCiAgICBvcmVzdWx0LT5oID0gcmVzdWx0OwogICAgcmV0dXJuIChQeU9iamVjdCopb3Jlc3VsdDsKfQoKc3RhdGljIFB5TWV0aG9kRGVmIGRiX21ldGhvZHNbXSA9IHsKICAgIHsgIk9wZW5WaWV3IiwgKFB5Q0Z1bmN0aW9uKW1zaWRiX29wZW52aWV3LCBNRVRIX1ZBUkFSR1MsIAoJUHlEb2NfU1RSKCJPcGVuVmlldyhzcWwpIC0+IHZpZXdvYmpcbldyYXBzIE1zaURhdGFiYXNlT3BlblZpZXciKX0sCiAgICB7ICJDb21taXQiLCAoUHlDRnVuY3Rpb24pbXNpZGJfY29tbWl0LCBNRVRIX05PQVJHUywKCVB5RG9jX1NUUigiQ29tbWl0KCkgLT4gTm9uZVxuV3JhcHMgTXNpRGF0YWJhc2VDb21taXQiKX0sCiAgICB7ICJHZXRTdW1tYXJ5SW5mb3JtYXRpb24iLCAoUHlDRnVuY3Rpb24pbXNpZGJfZ2V0c3VtbWFyeWluZm9ybWF0aW9uLCBNRVRIX1ZBUkFSR1MsIAoJUHlEb2NfU1RSKCJHZXRTdW1tYXJ5SW5mb3JtYXRpb24odXBkYXRlQ291bnQpIC0+IHZpZXdvYmpcbldyYXBzIE1zaUdldFN1bW1hcnlJbmZvcm1hdGlvbiIpfSwKICAgIHsgTlVMTCwgTlVMTCB9Cn07CgpzdGF0aWMgUHlUeXBlT2JqZWN0IG1zaWRiX1R5cGUgPSB7CglQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKCTAsCQkJLypvYl9zaXplKi8KCSJfbXNpLkRhdGFiYXNlIiwJCS8qdHBfbmFtZSovCglzaXplb2YobXNpb2JqKSwJLyp0cF9iYXNpY3NpemUqLwoJMCwJCQkvKnRwX2l0ZW1zaXplKi8KCS8qIG1ldGhvZHMgKi8KCShkZXN0cnVjdG9yKW1zaW9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwoJMCwJCQkvKnRwX3ByaW50Ki8KCTAsCQkJLyp0cF9nZXRhdHRyKi8KCTAsCQkJLyp0cF9zZXRhdHRyKi8KCTAsCQkJLyp0cF9jb21wYXJlKi8KCTAsCQkJLyp0cF9yZXByKi8KCTAsCQkJLyp0cF9hc19udW1iZXIqLwoJMCwJCQkvKnRwX2FzX3NlcXVlbmNlKi8KCTAsCQkJLyp0cF9hc19tYXBwaW5nKi8KCTAsCQkJLyp0cF9oYXNoKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NhbGwqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc3RyKi8KICAgICAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwvKnRwX2dldGF0dHJvKi8KICAgICAgICBQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwvKnRwX3NldGF0dHJvKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX2J1ZmZlciovCiAgICAgICAgUHlfVFBGTEFHU19ERUZBVUxULCAgICAgLyp0cF9mbGFncyovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kb2MqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfdHJhdmVyc2UqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY2xlYXIqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcmljaGNvbXBhcmUqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfd2Vha2xpc3RvZmZzZXQqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlciovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVybmV4dCovCiAgICAgICAgZGJfbWV0aG9kcywgICAgICAgICAgICAgLyp0cF9tZXRob2RzKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX21lbWJlcnMqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0c2V0Ki8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2Jhc2UqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGljdCovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kZXNjcl9nZXQqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGVzY3Jfc2V0Ki8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2RpY3RvZmZzZXQqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaW5pdCovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hbGxvYyovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9uZXcqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZnJlZSovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pc19nYyovCn07CgpzdGF0aWMgUHlPYmplY3QqIG1zaW9wZW5kYihQeU9iamVjdCAqb2JqLCBQeU9iamVjdCAqYXJncykKewogICAgaW50IHN0YXR1czsKICAgIGNoYXIgKnBhdGg7CiAgICBpbnQgcGVyc2lzdDsKICAgIE1TSUhBTkRMRSBoOwogICAgbXNpb2JqICpyZXN1bHQ7CiAgICAKICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic2k6TVNJT3BlbkRhdGFiYXNlIiwgJnBhdGgsICZwZXJzaXN0KSkKCXJldHVybiBOVUxMOwoKCXN0YXR1cyA9IE1zaU9wZW5EYXRhYmFzZShwYXRoLCAoTFBDU1RSKXBlcnNpc3QsICZoKTsKICAgIGlmIChzdGF0dXMgIT0gRVJST1JfU1VDQ0VTUykKCXJldHVybiBtc2llcnJvcihzdGF0dXMpOwoKICAgIHJlc3VsdCA9IFB5T2JqZWN0X05FVyhzdHJ1Y3QgbXNpb2JqLCAmbXNpZGJfVHlwZSk7CiAgICBpZiAoIXJlc3VsdCkgewoJTXNpQ2xvc2VIYW5kbGUoaCk7CglyZXR1cm4gTlVMTDsKICAgIH0KICAgIHJlc3VsdC0+aCA9IGg7CiAgICByZXR1cm4gKFB5T2JqZWN0KilyZXN1bHQ7Cn0KCnN0YXRpYyBQeU9iamVjdCoKY3JlYXRlcmVjb3JkKFB5T2JqZWN0ICpvLCBQeU9iamVjdCAqYXJncykKewogICAgaW50IGNvdW50OwogICAgTVNJSEFORExFIGg7CgogICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOkNyZWF0ZVJlY29yZCIsICZjb3VudCkpCglyZXR1cm4gTlVMTDsKICAgIAogICAgaCA9IE1zaUNyZWF0ZVJlY29yZChjb3VudCk7CiAgICBpZiAoaCA9PSAwKQoJcmV0dXJuIG1zaWVycm9yKDApOwoKICAgIHJldHVybiByZWNvcmRfbmV3KGgpOwp9CgoKc3RhdGljIFB5TWV0aG9kRGVmIG1zaV9tZXRob2RzW10gPSB7CiAgICAgICAgeyJVdWlkQ3JlYXRlIiwgKFB5Q0Z1bmN0aW9uKXV1aWRjcmVhdGUsIE1FVEhfTk9BUkdTLAoJCVB5RG9jX1NUUigiVXVpZENyZWF0ZSgpIC0+IHN0cmluZyIpfSwKCXsiRkNJQ3JlYXRlIiwJKFB5Q0Z1bmN0aW9uKWZjaWNyZWF0ZSwJTUVUSF9WQVJBUkdTLAoJCVB5RG9jX1NUUigiZmNpY3JlYXRlKGNhYm5hbWUsZmlsZXMpIC0+IE5vbmUiKX0sCgl7Ik9wZW5EYXRhYmFzZSIsIChQeUNGdW5jdGlvbiltc2lvcGVuZGIsIE1FVEhfVkFSQVJHUywKCVB5RG9jX1NUUigiT3BlbkRhdGFiYXNlKG5hbWUsIGZsYWdzKSAtPiBkYm9ialxuV3JhcHMgTXNpT3BlbkRhdGFiYXNlIil9LAoJeyJDcmVhdGVSZWNvcmQiLCAoUHlDRnVuY3Rpb24pY3JlYXRlcmVjb3JkLCBNRVRIX1ZBUkFSR1MsCglQeURvY19TVFIoIk9wZW5EYXRhYmFzZShuYW1lLCBmbGFncykgLT4gZGJvYmpcbldyYXBzIE1zaUNyZWF0ZVJlY29yZCIpfSwKCXtOVUxMLAkJTlVMTH0JCS8qIHNlbnRpbmVsICovCn07CgpzdGF0aWMgY2hhciBtc2lfZG9jW10gPSAiRG9jdW1lbnRhdGlvbiI7CgpQeU1PRElOSVRfRlVOQwppbml0X21zaSh2b2lkKQp7CiAgICBQeU9iamVjdCAqbTsKCiAgICBtID0gUHlfSW5pdE1vZHVsZTMoIl9tc2kiLCBtc2lfbWV0aG9kcywgbXNpX2RvYyk7CiAgICBpZiAobSA9PSBOVUxMKQoJcmV0dXJuOwoKICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJNU0lEQk9QRU5fQ1JFQVRFRElSRUNUIiwgKGludClNU0lEQk9QRU5fQ1JFQVRFRElSRUNUKTsKICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJNU0lEQk9QRU5fQ1JFQVRFIiwgKGludClNU0lEQk9QRU5fQ1JFQVRFKTsKICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJNU0lEQk9QRU5fRElSRUNUIiwgKGludClNU0lEQk9QRU5fRElSRUNUKTsKICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJNU0lEQk9QRU5fUkVBRE9OTFkiLCAoaW50KU1TSURCT1BFTl9SRUFET05MWSk7CiAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTVNJREJPUEVOX1RSQU5TQUNUIiwgKGludClNU0lEQk9QRU5fVFJBTlNBQ1QpOwogICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk1TSURCT1BFTl9QQVRDSEZJTEUiLCAoaW50KU1TSURCT1BFTl9QQVRDSEZJTEUpOwoKICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJNU0lDT0xJTkZPX05BTUVTIiwgTVNJQ09MSU5GT19OQU1FUyk7CiAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTVNJQ09MSU5GT19UWVBFUyIsIE1TSUNPTElORk9fVFlQRVMpOwoKICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJNU0lNT0RJRllfU0VFSyIsIE1TSU1PRElGWV9TRUVLKTsKICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJNU0lNT0RJRllfUkVGUkVTSCIsIE1TSU1PRElGWV9SRUZSRVNIKTsKICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJNU0lNT0RJRllfSU5TRVJUIiwgTVNJTU9ESUZZX0lOU0VSVCk7CiAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTVNJTU9ESUZZX1VQREFURSIsIE1TSU1PRElGWV9VUERBVEUpOwogICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk1TSU1PRElGWV9BU1NJR04iLCBNU0lNT0RJRllfQVNTSUdOKTsKICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJNU0lNT0RJRllfUkVQTEFDRSIsIE1TSU1PRElGWV9SRVBMQUNFKTsKICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJNU0lNT0RJRllfTUVSR0UiLCBNU0lNT0RJRllfTUVSR0UpOwogICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk1TSU1PRElGWV9ERUxFVEUiLCBNU0lNT0RJRllfREVMRVRFKTsKICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJNU0lNT0RJRllfSU5TRVJUX1RFTVBPUkFSWSIsIE1TSU1PRElGWV9JTlNFUlRfVEVNUE9SQVJZKTsKICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJNU0lNT0RJRllfVkFMSURBVEUiLCBNU0lNT0RJRllfVkFMSURBVEUpOwogICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk1TSU1PRElGWV9WQUxJREFURV9ORVciLCBNU0lNT0RJRllfVkFMSURBVEVfTkVXKTsKICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJNU0lNT0RJRllfVkFMSURBVEVfRklFTEQiLCBNU0lNT0RJRllfVkFMSURBVEVfRklFTEQpOwogICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk1TSU1PRElGWV9WQUxJREFURV9ERUxFVEUiLCBNU0lNT0RJRllfVkFMSURBVEVfREVMRVRFKTsKCiAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUElEX0NPREVQQUdFIiwgUElEX0NPREVQQUdFKTsKICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJQSURfVElUTEUiLCBQSURfVElUTEUpOwogICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlBJRF9TVUJKRUNUIiwgUElEX1NVQkpFQ1QpOwogICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlBJRF9BVVRIT1IiLCBQSURfQVVUSE9SKTsKICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJQSURfS0VZV09SRFMiLCBQSURfS0VZV09SRFMpOwogICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlBJRF9DT01NRU5UUyIsIFBJRF9DT01NRU5UUyk7CiAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUElEX1RFTVBMQVRFIiwgUElEX1RFTVBMQVRFKTsKICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJQSURfTEFTVEFVVEhPUiIsIFBJRF9MQVNUQVVUSE9SKTsKICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJQSURfUkVWTlVNQkVSIiwgUElEX1JFVk5VTUJFUik7CiAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUElEX0xBU1RQUklOVEVEIiwgUElEX0xBU1RQUklOVEVEKTsKICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJQSURfQ1JFQVRFX0RUTSIsIFBJRF9DUkVBVEVfRFRNKTsKICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJQSURfTEFTVFNBVkVfRFRNIiwgUElEX0xBU1RTQVZFX0RUTSk7CiAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUElEX1BBR0VDT1VOVCIsIFBJRF9QQUdFQ09VTlQpOwogICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlBJRF9XT1JEQ09VTlQiLCBQSURfV09SRENPVU5UKTsKICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJQSURfQ0hBUkNPVU5UIiwgUElEX0NIQVJDT1VOVCk7CiAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUElEX0FQUE5BTUUiLCBQSURfQVBQTkFNRSk7CiAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUElEX1NFQ1VSSVRZIiwgUElEX1NFQ1VSSVRZKTsKCiAgICBNU0lFcnJvciA9IFB5RXJyX05ld0V4Y2VwdGlvbiAoIl9tc2kuTVNJRXJyb3IiLCBOVUxMLCBOVUxMKTsKICAgIGlmICghTVNJRXJyb3IpCglyZXR1cm47CiAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIk1TSUVycm9yIiwgTVNJRXJyb3IpOwp9Cg==