LyogSGVscGVyIGxpYnJhcnkgZm9yIE1TSSBjcmVhdGlvbiB3aXRoIFB5dGhvbi4KICogQ29weXJpZ2h0IChDKSAyMDA1IE1hcnRpbiB2LiBM9ndpcwogKiBMaWNlbnNlZCB0byBQU0YgdW5kZXIgYSBjb250cmlidXRvciBhZ3JlZW1lbnQuCiAqLwoKI2luY2x1ZGUgPFB5dGhvbi5oPgojaW5jbHVkZSA8ZmNpLmg+CiNpbmNsdWRlIDxmY250bC5oPgojaW5jbHVkZSA8d2luZG93cy5oPgojaW5jbHVkZSA8bXNpLmg+CiNpbmNsdWRlIDxtc2lxdWVyeS5oPgojaW5jbHVkZSA8bXNpZGVmcy5oPgojaW5jbHVkZSA8cnBjLmg+CgpzdGF0aWMgUHlPYmplY3QgKk1TSUVycm9yOwoKc3RhdGljIFB5T2JqZWN0Kgp1dWlkY3JlYXRlKFB5T2JqZWN0KiBvYmosIFB5T2JqZWN0KmFyZ3MpCnsKICAgIFVVSUQgcmVzdWx0OwogICAgdW5zaWduZWQgc2hvcnQgKmNyZXN1bHQ7CiAgICBQeU9iamVjdCAqb3Jlc3VsdDsKCiAgICAvKiBNYXkgcmV0dXJuIG9rLCBsb2NhbCBvbmx5LCBhbmQgbm8gYWRkcmVzcy4KICAgICAgIEZvciBsb2NhbCBvbmx5LCB0aGUgZG9jdW1lbnRhdGlvbiBzYXlzIHdlIHN0aWxsIGdldCBhIHV1aWQuCiAgICAgICBGb3IgUlBDX1NfVVVJRF9OT19BRERSRVNTLCBpdCdzIG5vdCBjbGVhciB3aGV0aGVyIHdlIGNhbgogICAgICAgdXNlIHRoZSByZXN1bHQuICovCiAgICBpZiAoVXVpZENyZWF0ZSgmcmVzdWx0KSA9PSBSUENfU19VVUlEX05PX0FERFJFU1MpIHsKICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciwgInByb2Nlc3NpbmcgJ25vIGFkZHJlc3MnIHJlc3VsdCIpOwogICAgICAgIHJldHVybiBOVUxMOwogICAgfQoKICAgIGlmIChVdWlkVG9TdHJpbmdXKCZyZXN1bHQsICZjcmVzdWx0KSA9PSBSUENfU19PVVRfT0ZfTUVNT1JZKSB7CiAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX01lbW9yeUVycm9yLCAib3V0IG9mIG1lbW9yeSBpbiB1dWlkZ2VuIik7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CgogICAgb3Jlc3VsdCA9IFB5VW5pY29kZV9Gcm9tVW5pY29kZShjcmVzdWx0LCB3Y3NsZW4oY3Jlc3VsdCkpOwogICAgUnBjU3RyaW5nRnJlZVcoJmNyZXN1bHQpOwogICAgcmV0dXJuIG9yZXN1bHQ7Cgp9CgovKiBGQ0kgY2FsbGJhY2sgZnVuY3Rpb25zICovCgpzdGF0aWMgRk5GQ0lBTExPQyhjYl9hbGxvYykKewogICAgcmV0dXJuIG1hbGxvYyhjYik7Cn0KCnN0YXRpYyBGTkZDSUZSRUUoY2JfZnJlZSkKewogICAgZnJlZShtZW1vcnkpOwp9CgpzdGF0aWMgRk5GQ0lPUEVOKGNiX29wZW4pCnsKICAgIGludCByZXN1bHQgPSBfb3Blbihwc3pGaWxlLCBvZmxhZywgcG1vZGUpOwogICAgaWYgKHJlc3VsdCA9PSAtMSkKICAgICAgICAqZXJyID0gZXJybm87CiAgICByZXR1cm4gcmVzdWx0Owp9CgpzdGF0aWMgRk5GQ0lSRUFEKGNiX3JlYWQpCnsKICAgIFVJTlQgcmVzdWx0ID0gKFVJTlQpX3JlYWQoaGYsIG1lbW9yeSwgY2IpOwogICAgaWYgKHJlc3VsdCAhPSBjYikKICAgICAgICAqZXJyID0gZXJybm87CiAgICByZXR1cm4gcmVzdWx0Owp9CgpzdGF0aWMgRk5GQ0lXUklURShjYl93cml0ZSkKewogICAgVUlOVCByZXN1bHQgPSAoVUlOVClfd3JpdGUoaGYsIG1lbW9yeSwgY2IpOwogICAgaWYgKHJlc3VsdCAhPSBjYikKICAgICAgICAqZXJyID0gZXJybm87CiAgICByZXR1cm4gcmVzdWx0Owp9CgpzdGF0aWMgRk5GQ0lDTE9TRShjYl9jbG9zZSkKewogICAgaW50IHJlc3VsdCA9IF9jbG9zZShoZik7CiAgICBpZiAocmVzdWx0ICE9IDApCiAgICAgICAgKmVyciA9IGVycm5vOwogICAgcmV0dXJuIHJlc3VsdDsKfQoKc3RhdGljIEZORkNJU0VFSyhjYl9zZWVrKQp7CiAgICBsb25nIHJlc3VsdCA9IChsb25nKV9sc2VlayhoZiwgZGlzdCwgc2Vla3R5cGUpOwogICAgaWYgKHJlc3VsdCA9PSAtMSkKICAgICAgICAqZXJyID0gZXJybm87CiAgICByZXR1cm4gcmVzdWx0Owp9CgpzdGF0aWMgRk5GQ0lERUxFVEUoY2JfZGVsZXRlKQp7CiAgICBpbnQgcmVzdWx0ID0gcmVtb3ZlKHBzekZpbGUpOwogICAgaWYgKHJlc3VsdCAhPSAwKQogICAgICAgICplcnIgPSBlcnJubzsKICAgIHJldHVybiByZXN1bHQ7Cn0KCnN0YXRpYyBGTkZDSUZJTEVQTEFDRUQoY2JfZmlsZXBsYWNlZCkKewogICAgcmV0dXJuIDA7Cn0KCnN0YXRpYyBGTkZDSUdFVFRFTVBGSUxFKGNiX2dldHRlbXBmaWxlKQp7CiAgICBjaGFyICpuYW1lID0gX3RlbXBuYW0oIiIsICJ0bXAiKTsKICAgIGlmICgobmFtZSAhPSBOVUxMKSAmJiAoKGludClzdHJsZW4obmFtZSkgPCBjYlRlbXBOYW1lKSkgewogICAgICAgIHN0cmNweShwc3pUZW1wTmFtZSwgbmFtZSk7CiAgICAgICAgZnJlZShuYW1lKTsKICAgICAgICByZXR1cm4gVFJVRTsKICAgIH0KCiAgICBpZiAobmFtZSkgZnJlZShuYW1lKTsKICAgIHJldHVybiBGQUxTRTsKfQoKc3RhdGljIEZORkNJU1RBVFVTKGNiX3N0YXR1cykKewogICAgaWYgKHB2KSB7CiAgICAgICAgUHlPYmplY3QgKnJlc3VsdCA9IFB5T2JqZWN0X0NhbGxNZXRob2QocHYsICJzdGF0dXMiLCAiaWlpIiwgdHlwZVN0YXR1cywgY2IxLCBjYjIpOwogICAgICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOwogICAgfQogICAgcmV0dXJuIDA7Cn0KCnN0YXRpYyBGTkZDSUdFVE5FWFRDQUJJTkVUKGNiX2dldG5leHRjYWJpbmV0KQp7CiAgICBpZiAocHYpIHsKICAgICAgICBQeU9iamVjdCAqcmVzdWx0ID0gUHlPYmplY3RfQ2FsbE1ldGhvZChwdiwgImdldG5leHRjYWJpbmV0IiwgImkiLCBwY2NhYi0+aUNhYik7CiAgICAgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQogICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgaWYgKCFQeUJ5dGVzX0NoZWNrKHJlc3VsdCkpIHsKICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKICAgICAgICAgICAgICAgICJJbmNvcnJlY3QgcmV0dXJuIHR5cGUgJXMgZnJvbSBnZXRuZXh0Y2FiaW5ldCIsCiAgICAgICAgICAgICAgICByZXN1bHQtPm9iX3R5cGUtPnRwX25hbWUpOwogICAgICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgIH0KICAgICAgICBzdHJuY3B5KHBjY2FiLT5zekNhYiwgUHlCeXRlc19Bc1N0cmluZyhyZXN1bHQpLCBzaXplb2YocGNjYWItPnN6Q2FiKSk7CiAgICAgICAgcmV0dXJuIFRSVUU7CiAgICB9CiAgICByZXR1cm4gRkFMU0U7Cn0KCnN0YXRpYyBGTkZDSUdFVE9QRU5JTkZPKGNiX2dldG9wZW5pbmZvKQp7CiAgICBCWV9IQU5ETEVfRklMRV9JTkZPUk1BVElPTiBiaGZpOwogICAgRklMRVRJTUUgZmlsZXRpbWU7CiAgICBIQU5ETEUgaGFuZGxlOwoKICAgIC8qIE5lZWQgV2luMzIgaGFuZGxlIHRvIGdldCB0aW1lIHN0YW1wcyAqLwogICAgaGFuZGxlID0gQ3JlYXRlRmlsZShwc3pOYW1lLCBHRU5FUklDX1JFQUQsIEZJTEVfU0hBUkVfUkVBRCwgTlVMTCwKICAgICAgICBPUEVOX0VYSVNUSU5HLCBGSUxFX0FUVFJJQlVURV9OT1JNQUwsIE5VTEwpOwogICAgaWYgKGhhbmRsZSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkKICAgICAgICByZXR1cm4gLTE7CgogICAgaWYgKEdldEZpbGVJbmZvcm1hdGlvbkJ5SGFuZGxlKGhhbmRsZSwgJmJoZmkpID09IEZBTFNFKQogICAgewogICAgICAgIENsb3NlSGFuZGxlKGhhbmRsZSk7CiAgICAgICAgcmV0dXJuIC0xOwogICAgfQoKICAgIEZpbGVUaW1lVG9Mb2NhbEZpbGVUaW1lKCZiaGZpLmZ0TGFzdFdyaXRlVGltZSwgJmZpbGV0aW1lKTsKICAgIEZpbGVUaW1lVG9Eb3NEYXRlVGltZSgmZmlsZXRpbWUsIHBkYXRlLCBwdGltZSk7CgogICAgKnBhdHRyaWJzID0gKGludCkoYmhmaS5kd0ZpbGVBdHRyaWJ1dGVzICYKICAgICAgICAoX0FfUkRPTkxZIHwgX0FfU1lTVEVNIHwgX0FfSElEREVOIHwgX0FfQVJDSCkpOwoKICAgIENsb3NlSGFuZGxlKGhhbmRsZSk7CgogICAgcmV0dXJuIF9vcGVuKHBzek5hbWUsIF9PX1JET05MWSB8IF9PX0JJTkFSWSk7Cn0KCnN0YXRpYyBQeU9iamVjdCogZmNpY3JlYXRlKFB5T2JqZWN0KiBvYmosIFB5T2JqZWN0KiBhcmdzKQp7CiAgICBjaGFyICpjYWJuYW1lLCAqcDsKICAgIFB5T2JqZWN0ICpmaWxlczsKICAgIENDQUIgY2NhYjsKICAgIEhGQ0kgaGZjaTsKICAgIEVSRiBlcmY7CiAgICBQeV9zc2l6ZV90IGk7CgoKICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic086RkNJQ3JlYXRlIiwgJmNhYm5hbWUsICZmaWxlcykpCiAgICAgICAgcmV0dXJuIE5VTEw7CgogICAgaWYgKCFQeUxpc3RfQ2hlY2soZmlsZXMpKSB7CiAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIkZDSUNyZWF0ZSBleHBlY3RzIGEgbGlzdCIpOwogICAgICAgIHJldHVybiBOVUxMOwogICAgfQoKICAgIGNjYWIuY2IgPSBJTlRfTUFYOyAvKiBubyBuZWVkIHRvIHNwbGl0IENBQiBpbnRvIG11bHRpcGxlIG1lZGlhICovCiAgICBjY2FiLmNiRm9sZGVyVGhyZXNoID0gMTAwMDAwMDsgLyogZmx1c2ggZGlyZWN0b3J5IGFmdGVyIHRoaXMgbWFueSBieXRlcyAqLwogICAgY2NhYi5jYlJlc2VydmVDRkRhdGEgPSAwOwogICAgY2NhYi5jYlJlc2VydmVDRkZvbGRlciA9IDA7CiAgICBjY2FiLmNiUmVzZXJ2ZUNGSGVhZGVyID0gMDsKCiAgICBjY2FiLmlDYWIgPSAxOwogICAgY2NhYi5pRGlzayA9IDE7CgogICAgY2NhYi5zZXRJRCA9IDA7CiAgICBjY2FiLnN6RGlza1swXSA9ICdcMCc7CgogICAgZm9yIChpID0gMCwgcCA9IGNhYm5hbWU7ICpwOyBwID0gQ2hhck5leHQocCkpCiAgICAgICAgaWYgKCpwID09ICdcXCcgfHwgKnAgPT0gJy8nKQogICAgICAgICAgICBpID0gcCAtIGNhYm5hbWUgKyAxOwoKICAgIGlmIChpID49IHNpemVvZihjY2FiLnN6Q2FiUGF0aCkgfHwKICAgICAgICBzdHJsZW4oY2FibmFtZStpKSA+PSBzaXplb2YoY2NhYi5zekNhYikpIHsKICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgInBhdGggbmFtZSB0b28gbG9uZyIpOwogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgIGlmIChpID4gMCkgewogICAgICAgIG1lbWNweShjY2FiLnN6Q2FiUGF0aCwgY2FibmFtZSwgaSk7CiAgICAgICAgY2NhYi5zekNhYlBhdGhbaV0gPSAnXDAnOwogICAgICAgIHN0cmNweShjY2FiLnN6Q2FiLCBjYWJuYW1lK2kpOwogICAgfSBlbHNlIHsKICAgICAgICBzdHJjcHkoY2NhYi5zekNhYlBhdGgsICIuXFwiKTsKICAgICAgICBzdHJjcHkoY2NhYi5zekNhYiwgY2FibmFtZSk7CiAgICB9CgogICAgaGZjaSA9IEZDSUNyZWF0ZSgmZXJmLCBjYl9maWxlcGxhY2VkLCBjYl9hbGxvYywgY2JfZnJlZSwKICAgICAgICBjYl9vcGVuLCBjYl9yZWFkLCBjYl93cml0ZSwgY2JfY2xvc2UsIGNiX3NlZWssIGNiX2RlbGV0ZSwKICAgICAgICBjYl9nZXR0ZW1wZmlsZSwgJmNjYWIsIE5VTEwpOwoKICAgIGlmIChoZmNpID09IE5VTEwpIHsKICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwgIkZDSSBlcnJvciAlZCIsIGVyZi5lcmZPcGVyKTsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KCiAgICBmb3IgKGk9MDsgaSA8IFB5TGlzdF9HRVRfU0laRShmaWxlcyk7IGkrKykgewogICAgICAgIFB5T2JqZWN0ICppdGVtID0gUHlMaXN0X0dFVF9JVEVNKGZpbGVzLCBpKTsKICAgICAgICBjaGFyICpmaWxlbmFtZSwgKmNhYm5hbWU7CiAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGl0ZW0sICJzcyIsICZmaWxlbmFtZSwgJmNhYm5hbWUpKQogICAgICAgICAgICBnb3RvIGVycjsKICAgICAgICBpZiAoIUZDSUFkZEZpbGUoaGZjaSwgZmlsZW5hbWUsIGNhYm5hbWUsIEZBTFNFLAogICAgICAgICAgICBjYl9nZXRuZXh0Y2FiaW5ldCwgY2Jfc3RhdHVzLCBjYl9nZXRvcGVuaW5mbywKICAgICAgICAgICAgdGNvbXBUWVBFX01TWklQKSkKICAgICAgICAgICAgZ290byBlcnI7CiAgICB9CgogICAgaWYgKCFGQ0lGbHVzaENhYmluZXQoaGZjaSwgRkFMU0UsIGNiX2dldG5leHRjYWJpbmV0LCBjYl9zdGF0dXMpKQogICAgICAgIGdvdG8gZXJyOwoKICAgIGlmICghRkNJRGVzdHJveShoZmNpKSkKICAgICAgICBnb3RvIGVycjsKCiAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CiAgICByZXR1cm4gUHlfTm9uZTsKZXJyOgogICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsICJGQ0kgZXJyb3IgJWQiLCBlcmYuZXJmT3Blcik7IC8qIFhYWCBiZXR0ZXIgZXJyb3IgdHlwZSAqLwogICAgRkNJRGVzdHJveShoZmNpKTsKICAgIHJldHVybiBOVUxMOwp9Cgp0eXBlZGVmIHN0cnVjdCBtc2lvYmp7CiAgICBQeU9iamVjdF9IRUFECiAgICBNU0lIQU5ETEUgaDsKfW1zaW9iajsKCnN0YXRpYyB2b2lkCm1zaW9ial9kZWFsbG9jKG1zaW9iaiogbXNpZGIpCnsKICAgIE1zaUNsb3NlSGFuZGxlKG1zaWRiLT5oKTsKICAgIG1zaWRiLT5oID0gMDsKfQoKc3RhdGljIFB5T2JqZWN0Kgptc2lvYmpfY2xvc2UobXNpb2JqKiBtc2lkYiwgUHlPYmplY3QgKmFyZ3MpCnsKICAgIE1zaUNsb3NlSGFuZGxlKG1zaWRiLT5oKTsKICAgIG1zaWRiLT5oID0gMDsKICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKICAgIHJldHVybiBQeV9Ob25lOwp9CgpzdGF0aWMgUHlPYmplY3QqCm1zaWVycm9yKGludCBzdGF0dXMpCnsKICAgIGludCBjb2RlOwogICAgY2hhciBidWZbMjAwMF07CiAgICBjaGFyICpyZXMgPSBidWY7CiAgICBEV09SRCBzaXplID0gc2l6ZW9mKGJ1Zik7CiAgICBNU0lIQU5ETEUgZXJyID0gTXNpR2V0TGFzdEVycm9yUmVjb3JkKCk7CgogICAgaWYgKGVyciA9PSAwKSB7CiAgICAgICAgc3dpdGNoKHN0YXR1cykgewogICAgICAgIGNhc2UgRVJST1JfQUNDRVNTX0RFTklFRDoKICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKE1TSUVycm9yLCAiYWNjZXNzIGRlbmllZCIpOwogICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICBjYXNlIEVSUk9SX0ZVTkNUSU9OX0ZBSUxFRDoKICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKE1TSUVycm9yLCAiZnVuY3Rpb24gZmFpbGVkIik7CiAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgIGNhc2UgRVJST1JfSU5WQUxJRF9EQVRBOgogICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoTVNJRXJyb3IsICJpbnZhbGlkIGRhdGEiKTsKICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgY2FzZSBFUlJPUl9JTlZBTElEX0hBTkRMRToKICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKE1TSUVycm9yLCAiaW52YWxpZCBoYW5kbGUiKTsKICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgY2FzZSBFUlJPUl9JTlZBTElEX1NUQVRFOgogICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoTVNJRXJyb3IsICJpbnZhbGlkIHN0YXRlIik7CiAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgIGNhc2UgRVJST1JfSU5WQUxJRF9QQVJBTUVURVI6CiAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhNU0lFcnJvciwgImludmFsaWQgcGFyYW1ldGVyIik7CiAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChNU0lFcnJvciwgInVua25vd24gZXJyb3IgJXgiLCBzdGF0dXMpOwogICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICB9CiAgICB9CgogICAgY29kZSA9IE1zaVJlY29yZEdldEludGVnZXIoZXJyLCAxKTsgLyogWFhYIGNvZGUgKi8KICAgIGlmIChNc2lGb3JtYXRSZWNvcmQoMCwgZXJyLCByZXMsICZzaXplKSA9PSBFUlJPUl9NT1JFX0RBVEEpIHsKICAgICAgICByZXMgPSBtYWxsb2Moc2l6ZSsxKTsKICAgICAgICBNc2lGb3JtYXRSZWNvcmQoMCwgZXJyLCByZXMsICZzaXplKTsKICAgICAgICByZXNbc2l6ZV09J1wwJzsKICAgIH0KICAgIE1zaUNsb3NlSGFuZGxlKGVycik7CiAgICBQeUVycl9TZXRTdHJpbmcoTVNJRXJyb3IsIHJlcyk7CiAgICBpZiAocmVzICE9IGJ1ZikKICAgICAgICBmcmVlKHJlcyk7CiAgICByZXR1cm4gTlVMTDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiBSZWNvcmQgb2JqZWN0cyAqKioqKioqKioqKioqKioqKioqKioqLwoKc3RhdGljIFB5T2JqZWN0KgpyZWNvcmRfZ2V0ZmllbGRjb3VudChtc2lvYmoqIHJlY29yZCwgUHlPYmplY3QqIGFyZ3MpCnsKICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmcoTXNpUmVjb3JkR2V0RmllbGRDb3VudChyZWNvcmQtPmgpKTsKfQoKc3RhdGljIFB5T2JqZWN0KgpyZWNvcmRfZ2V0aW50ZWdlcihtc2lvYmoqIHJlY29yZCwgUHlPYmplY3QqIGFyZ3MpCnsKICAgIHVuc2lnbmVkIGludCBmaWVsZDsKICAgIGludCBzdGF0dXM7CgogICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJJOkdldEludGVnZXIiLCAmZmllbGQpKQogICAgICAgIHJldHVybiBOVUxMOwogICAgc3RhdHVzID0gTXNpUmVjb3JkR2V0SW50ZWdlcihyZWNvcmQtPmgsIGZpZWxkKTsKICAgIGlmIChzdGF0dXMgPT0gTVNJX05VTExfSU5URUdFUil7CiAgICAgICAgUHlFcnJfU2V0U3RyaW5nKE1TSUVycm9yLCAiY291bGQgbm90IGNvbnZlcnQgcmVjb3JkIGZpZWxkIHRvIGludGVnZXIiKTsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmcoKGxvbmcpIHN0YXR1cyk7Cn0KCnN0YXRpYyBQeU9iamVjdCoKcmVjb3JkX2dldHN0cmluZyhtc2lvYmoqIHJlY29yZCwgUHlPYmplY3QqIGFyZ3MpCnsKICAgIHVuc2lnbmVkIGludCBmaWVsZDsKICAgIHVuc2lnbmVkIGludCBzdGF0dXM7CiAgICBXQ0hBUiBidWZbMjAwMF07CiAgICBXQ0hBUiAqcmVzID0gYnVmOwogICAgRFdPUkQgc2l6ZSA9IHNpemVvZihidWYpOwogICAgUHlPYmplY3QqIHN0cmluZzsKCiAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIkk6R2V0U3RyaW5nIiwgJmZpZWxkKSkKICAgICAgICByZXR1cm4gTlVMTDsKICAgIHN0YXR1cyA9IE1zaVJlY29yZEdldFN0cmluZ1cocmVjb3JkLT5oLCBmaWVsZCwgcmVzLCAmc2l6ZSk7CiAgICBpZiAoc3RhdHVzID09IEVSUk9SX01PUkVfREFUQSkgewogICAgICAgIHJlcyA9IChXQ0hBUiopIG1hbGxvYygoc2l6ZSArIDEpKnNpemVvZihXQ0hBUikpOwogICAgICAgIGlmIChyZXMgPT0gTlVMTCkKICAgICAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CiAgICAgICAgc3RhdHVzID0gTXNpUmVjb3JkR2V0U3RyaW5nVyhyZWNvcmQtPmgsIGZpZWxkLCByZXMsICZzaXplKTsKICAgIH0KICAgIGlmIChzdGF0dXMgIT0gRVJST1JfU1VDQ0VTUykKICAgICAgICByZXR1cm4gbXNpZXJyb3IoKGludCkgc3RhdHVzKTsKICAgIHN0cmluZyA9IFB5VW5pY29kZV9Gcm9tVW5pY29kZShyZXMsIHNpemUpOwogICAgaWYgKGJ1ZiAhPSByZXMpCiAgICAgICAgZnJlZShyZXMpOwogICAgcmV0dXJuIHN0cmluZzsKfQoKc3RhdGljIFB5T2JqZWN0KgpyZWNvcmRfY2xlYXJkYXRhKG1zaW9iaiogcmVjb3JkLCBQeU9iamVjdCAqYXJncykKewogICAgaW50IHN0YXR1cyA9IE1zaVJlY29yZENsZWFyRGF0YShyZWNvcmQtPmgpOwogICAgaWYgKHN0YXR1cyAhPSBFUlJPUl9TVUNDRVNTKQogICAgICAgIHJldHVybiBtc2llcnJvcihzdGF0dXMpOwoKICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKICAgIHJldHVybiBQeV9Ob25lOwp9CgpzdGF0aWMgUHlPYmplY3QqCnJlY29yZF9zZXRzdHJpbmcobXNpb2JqKiByZWNvcmQsIFB5T2JqZWN0ICphcmdzKQp7CiAgICBpbnQgc3RhdHVzOwogICAgaW50IGZpZWxkOwogICAgUHlfVU5JQ09ERSAqZGF0YTsKCiAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIml1OlNldFN0cmluZyIsICZmaWVsZCwgJmRhdGEpKQogICAgICAgIHJldHVybiBOVUxMOwoKICAgIGlmICgoc3RhdHVzID0gTXNpUmVjb3JkU2V0U3RyaW5nVyhyZWNvcmQtPmgsIGZpZWxkLCBkYXRhKSkgIT0gRVJST1JfU1VDQ0VTUykKICAgICAgICByZXR1cm4gbXNpZXJyb3Ioc3RhdHVzKTsKCiAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CiAgICByZXR1cm4gUHlfTm9uZTsKfQoKc3RhdGljIFB5T2JqZWN0KgpyZWNvcmRfc2V0c3RyZWFtKG1zaW9iaiogcmVjb3JkLCBQeU9iamVjdCAqYXJncykKewogICAgaW50IHN0YXR1czsKICAgIGludCBmaWVsZDsKICAgIFB5X1VOSUNPREUgKmRhdGE7CgogICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpdTpTZXRTdHJlYW0iLCAmZmllbGQsICZkYXRhKSkKICAgICAgICByZXR1cm4gTlVMTDsKCiAgICBpZiAoKHN0YXR1cyA9IE1zaVJlY29yZFNldFN0cmVhbVcocmVjb3JkLT5oLCBmaWVsZCwgZGF0YSkpICE9IEVSUk9SX1NVQ0NFU1MpCiAgICAgICAgcmV0dXJuIG1zaWVycm9yKHN0YXR1cyk7CgogICAgUHlfSU5DUkVGKFB5X05vbmUpOwogICAgcmV0dXJuIFB5X05vbmU7Cn0KCnN0YXRpYyBQeU9iamVjdCoKcmVjb3JkX3NldGludGVnZXIobXNpb2JqKiByZWNvcmQsIFB5T2JqZWN0ICphcmdzKQp7CiAgICBpbnQgc3RhdHVzOwogICAgaW50IGZpZWxkOwogICAgaW50IGRhdGE7CgogICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpaTpTZXRJbnRlZ2VyIiwgJmZpZWxkLCAmZGF0YSkpCiAgICAgICAgcmV0dXJuIE5VTEw7CgogICAgaWYgKChzdGF0dXMgPSBNc2lSZWNvcmRTZXRJbnRlZ2VyKHJlY29yZC0+aCwgZmllbGQsIGRhdGEpKSAhPSBFUlJPUl9TVUNDRVNTKQogICAgICAgIHJldHVybiBtc2llcnJvcihzdGF0dXMpOwoKICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKICAgIHJldHVybiBQeV9Ob25lOwp9CgoKCnN0YXRpYyBQeU1ldGhvZERlZiByZWNvcmRfbWV0aG9kc1tdID0gewogICAgeyAiR2V0RmllbGRDb3VudCIsIChQeUNGdW5jdGlvbilyZWNvcmRfZ2V0ZmllbGRjb3VudCwgTUVUSF9OT0FSR1MsCiAgICAgICAgUHlEb2NfU1RSKCJHZXRGaWVsZENvdW50KCkgLT4gaW50XG5XcmFwcyBNc2lSZWNvcmRHZXRGaWVsZENvdW50Iil9LAogICAgeyAiR2V0SW50ZWdlciIsIChQeUNGdW5jdGlvbilyZWNvcmRfZ2V0aW50ZWdlciwgTUVUSF9WQVJBUkdTLAogICAgUHlEb2NfU1RSKCJHZXRJbnRlZ2VyKGZpZWxkKSAtPiBpbnRcbldyYXBzIE1zaVJlY29yZEdldEludGVnZXIiKX0sCiAgICB7ICJHZXRTdHJpbmciLCAoUHlDRnVuY3Rpb24pcmVjb3JkX2dldHN0cmluZywgTUVUSF9WQVJBUkdTLAogICAgUHlEb2NfU1RSKCJHZXRTdHJpbmcoZmllbGQpIC0+IHN0cmluZ1xuV3JhcHMgTXNpUmVjb3JkR2V0U3RyaW5nIil9LAogICAgeyAiU2V0U3RyaW5nIiwgKFB5Q0Z1bmN0aW9uKXJlY29yZF9zZXRzdHJpbmcsIE1FVEhfVkFSQVJHUywKICAgICAgICBQeURvY19TVFIoIlNldFN0cmluZyhmaWVsZCxzdHIpIC0+IE5vbmVcbldyYXBzIE1zaVJlY29yZFNldFN0cmluZyIpfSwKICAgIHsgIlNldFN0cmVhbSIsIChQeUNGdW5jdGlvbilyZWNvcmRfc2V0c3RyZWFtLCBNRVRIX1ZBUkFSR1MsCiAgICAgICAgUHlEb2NfU1RSKCJTZXRTdHJlYW0oZmllbGQsZmlsZW5hbWUpIC0+IE5vbmVcbldyYXBzIE1zaVJlY29yZFNldEludGVnZXIiKX0sCiAgICB7ICJTZXRJbnRlZ2VyIiwgKFB5Q0Z1bmN0aW9uKXJlY29yZF9zZXRpbnRlZ2VyLCBNRVRIX1ZBUkFSR1MsCiAgICAgICAgUHlEb2NfU1RSKCJTZXRJbnRlZ2VyKGZpZWxkLGludCkgLT4gTm9uZVxuV3JhcHMgTXNpUmVjb3JkU2V0SW50ZWdlciIpfSwKICAgIHsgIkNsZWFyRGF0YSIsIChQeUNGdW5jdGlvbilyZWNvcmRfY2xlYXJkYXRhLCBNRVRIX05PQVJHUywKICAgICAgICBQeURvY19TVFIoIkNsZWFyRGF0YSgpIC0+IGludFxuV3JhcHMgTXNpUmVjb3JkR0NsZWFyRGF0YSIpfSwKICAgIHsgTlVMTCwgTlVMTCB9Cn07CgpzdGF0aWMgUHlUeXBlT2JqZWN0IHJlY29yZF9UeXBlID0gewogICAgICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQogICAgICAgICJfbXNpLlJlY29yZCIsICAgICAgICAgIC8qdHBfbmFtZSovCiAgICAgICAgc2l6ZW9mKG1zaW9iaiksIC8qdHBfYmFzaWNzaXplKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2l0ZW1zaXplKi8KICAgICAgICAvKiBtZXRob2RzICovCiAgICAgICAgKGRlc3RydWN0b3IpbXNpb2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9wcmludCovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9nZXRhdHRyKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHIqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcmVzZXJ2ZWQqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcmVwciovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19udW1iZXIqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfc2VxdWVuY2UqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbWFwcGluZyovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9oYXNoKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NhbGwqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc3RyKi8KICAgICAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwvKnRwX2dldGF0dHJvKi8KICAgICAgICBQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwvKnRwX3NldGF0dHJvKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX2J1ZmZlciovCiAgICAgICAgUHlfVFBGTEFHU19ERUZBVUxULCAgICAgLyp0cF9mbGFncyovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kb2MqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfdHJhdmVyc2UqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY2xlYXIqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcmljaGNvbXBhcmUqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfd2Vha2xpc3RvZmZzZXQqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlciovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVybmV4dCovCiAgICAgICAgcmVjb3JkX21ldGhvZHMsICAgICAgICAgICAvKnRwX21ldGhvZHMqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfbWVtYmVycyovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9nZXRzZXQqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYmFzZSovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kaWN0Ki8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2Rlc2NyX2dldCovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kZXNjcl9zZXQqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGljdG9mZnNldCovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pbml0Ki8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FsbG9jKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX25ldyovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9mcmVlKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2lzX2djKi8KfTsKCnN0YXRpYyBQeU9iamVjdCoKcmVjb3JkX25ldyhNU0lIQU5ETEUgaCkKewogICAgbXNpb2JqICpyZXN1bHQgPSBQeU9iamVjdF9ORVcoc3RydWN0IG1zaW9iaiwgJnJlY29yZF9UeXBlKTsKCiAgICBpZiAoIXJlc3VsdCkgewogICAgICAgIE1zaUNsb3NlSGFuZGxlKGgpOwogICAgICAgIHJldHVybiBOVUxMOwogICAgfQoKICAgIHJlc3VsdC0+aCA9IGg7CiAgICByZXR1cm4gKFB5T2JqZWN0KilyZXN1bHQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKiogU3VtbWFyeUluZm9ybWF0aW9uIG9iamVjdHMgKioqKioqKioqKioqKiovCgpzdGF0aWMgUHlPYmplY3QqCnN1bW1hcnlfZ2V0cHJvcGVydHkobXNpb2JqKiBzaSwgUHlPYmplY3QgKmFyZ3MpCnsKICAgIGludCBzdGF0dXM7CiAgICBpbnQgZmllbGQ7CiAgICBQeU9iamVjdCAqcmVzdWx0OwogICAgVUlOVCB0eXBlOwogICAgSU5UIGl2YWw7CiAgICBGSUxFVElNRSBmdmFsOwogICAgY2hhciBzYnVmWzEwMDBdOwogICAgY2hhciAqc3ZhbCA9IHNidWY7CiAgICBEV09SRCBzc2l6ZSA9IHNpemVvZihzdmFsKTsKCiAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImk6R2V0UHJvcGVydHkiLCAmZmllbGQpKQogICAgICAgIHJldHVybiBOVUxMOwoKICAgIHN0YXR1cyA9IE1zaVN1bW1hcnlJbmZvR2V0UHJvcGVydHkoc2ktPmgsIGZpZWxkLCAmdHlwZSwgJml2YWwsCiAgICAgICAgJmZ2YWwsIHN2YWwsICZzc2l6ZSk7CiAgICBpZiAoc3RhdHVzID09IEVSUk9SX01PUkVfREFUQSkgewogICAgICAgIHN2YWwgPSBtYWxsb2Moc3NpemUpOwogICAgICAgIHN0YXR1cyA9IE1zaVN1bW1hcnlJbmZvR2V0UHJvcGVydHkoc2ktPmgsIGZpZWxkLCAmdHlwZSwgJml2YWwsCiAgICAgICAgICAgICZmdmFsLCBzdmFsLCAmc3NpemUpOwogICAgfQoKICAgIHN3aXRjaCh0eXBlKSB7CiAgICAgICAgY2FzZSBWVF9JMjogY2FzZSBWVF9JNDoKICAgICAgICAgICAgcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZyhpdmFsKTsKICAgICAgICBjYXNlIFZUX0ZJTEVUSU1FOgogICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciwgIkZJTEVUSU1FIHJlc3VsdCIpOwogICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICBjYXNlIFZUX0xQU1RSOgogICAgICAgICAgICByZXN1bHQgPSBQeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKHN2YWwsIHNzaXplKTsKICAgICAgICAgICAgaWYgKHN2YWwgIT0gc2J1ZikKICAgICAgICAgICAgICAgIGZyZWUoc3ZhbCk7CiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICBQeUVycl9Gb3JtYXQoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciwgInJlc3VsdCBvZiB0eXBlICVkIiwgdHlwZSk7CiAgICByZXR1cm4gTlVMTDsKfQoKc3RhdGljIFB5T2JqZWN0KgpzdW1tYXJ5X2dldHByb3BlcnR5Y291bnQobXNpb2JqKiBzaSwgUHlPYmplY3QgKmFyZ3MpCnsKICAgIGludCBzdGF0dXM7CiAgICBVSU5UIHJlc3VsdDsKCiAgICBzdGF0dXMgPSBNc2lTdW1tYXJ5SW5mb0dldFByb3BlcnR5Q291bnQoc2ktPmgsICZyZXN1bHQpOwogICAgaWYgKHN0YXR1cyAhPSBFUlJPUl9TVUNDRVNTKQogICAgICAgIHJldHVybiBtc2llcnJvcihzdGF0dXMpOwoKICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmcocmVzdWx0KTsKfQoKc3RhdGljIFB5T2JqZWN0KgpzdW1tYXJ5X3NldHByb3BlcnR5KG1zaW9iaiogc2ksIFB5T2JqZWN0ICphcmdzKQp7CiAgICBpbnQgc3RhdHVzOwogICAgaW50IGZpZWxkOwogICAgUHlPYmplY3QqIGRhdGE7CgogICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpTzpTZXRQcm9wZXJ0eSIsICZmaWVsZCwgJmRhdGEpKQogICAgICAgIHJldHVybiBOVUxMOwoKICAgIGlmIChQeVVuaWNvZGVfQ2hlY2soZGF0YSkpIHsKICAgICAgICBzdGF0dXMgPSBNc2lTdW1tYXJ5SW5mb1NldFByb3BlcnR5VyhzaS0+aCwgZmllbGQsIFZUX0xQU1RSLAogICAgICAgICAgICAwLCBOVUxMLCBQeVVuaWNvZGVfQXNVbmljb2RlKGRhdGEpKTsKICAgIH0gZWxzZSBpZiAoUHlMb25nX0NoZWNrRXhhY3QoZGF0YSkpIHsKICAgICAgICBsb25nIHZhbHVlID0gUHlMb25nX0FzTG9uZyhkYXRhKTsKICAgICAgICBpZiAodmFsdWUgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICB9CiAgICAgICAgc3RhdHVzID0gTXNpU3VtbWFyeUluZm9TZXRQcm9wZXJ0eShzaS0+aCwgZmllbGQsIFZUX0k0LAogICAgICAgICAgICB2YWx1ZSwgTlVMTCwgTlVMTCk7CiAgICB9IGVsc2UgewogICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJ1bnN1cHBvcnRlZCB0eXBlIik7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CgogICAgaWYgKHN0YXR1cyAhPSBFUlJPUl9TVUNDRVNTKQogICAgICAgIHJldHVybiBtc2llcnJvcihzdGF0dXMpOwoKICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKICAgIHJldHVybiBQeV9Ob25lOwp9CgoKc3RhdGljIFB5T2JqZWN0KgpzdW1tYXJ5X3BlcnNpc3QobXNpb2JqKiBzaSwgUHlPYmplY3QgKmFyZ3MpCnsKICAgIGludCBzdGF0dXM7CgogICAgc3RhdHVzID0gTXNpU3VtbWFyeUluZm9QZXJzaXN0KHNpLT5oKTsKICAgIGlmIChzdGF0dXMgIT0gRVJST1JfU1VDQ0VTUykKICAgICAgICByZXR1cm4gbXNpZXJyb3Ioc3RhdHVzKTsKICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKICAgIHJldHVybiBQeV9Ob25lOwp9CgpzdGF0aWMgUHlNZXRob2REZWYgc3VtbWFyeV9tZXRob2RzW10gPSB7CiAgICB7ICJHZXRQcm9wZXJ0eSIsIChQeUNGdW5jdGlvbilzdW1tYXJ5X2dldHByb3BlcnR5LCBNRVRIX1ZBUkFSR1MsCiAgICAgICAgUHlEb2NfU1RSKCJHZXRQcm9wZXJ0eShwcm9waWQpIC0+IHZhbHVlXG5XcmFwcyBNc2lTdW1tYXJ5SW5mb0dldFByb3BlcnR5Iil9LAogICAgeyAiR2V0UHJvcGVydHlDb3VudCIsIChQeUNGdW5jdGlvbilzdW1tYXJ5X2dldHByb3BlcnR5Y291bnQsIE1FVEhfTk9BUkdTLAogICAgICAgIFB5RG9jX1NUUigiR2V0UHJvcGVydHkoKSAtPiBpbnRcbldyYXBzIE1zaVN1bW1hcnlJbmZvR2V0UHJvcGVydHlDb3VudCIpfSwKICAgIHsgIlNldFByb3BlcnR5IiwgKFB5Q0Z1bmN0aW9uKXN1bW1hcnlfc2V0cHJvcGVydHksIE1FVEhfVkFSQVJHUywKICAgICAgICBQeURvY19TVFIoIlNldFByb3BlcnR5KHZhbHVlKSAtPiBOb25lXG5XcmFwcyBNc2lTdW1tYXJ5SW5mb1Byb3BlcnR5Iil9LAogICAgeyAiUGVyc2lzdCIsIChQeUNGdW5jdGlvbilzdW1tYXJ5X3BlcnNpc3QsIE1FVEhfTk9BUkdTLAogICAgICAgIFB5RG9jX1NUUigiUGVyc2lzdCgpIC0+IE5vbmVcbldyYXBzIE1zaVN1bW1hcnlJbmZvUGVyc2lzdCIpfSwKICAgIHsgTlVMTCwgTlVMTCB9Cn07CgpzdGF0aWMgUHlUeXBlT2JqZWN0IHN1bW1hcnlfVHlwZSA9IHsKICAgICAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKICAgICAgICAiX21zaS5TdW1tYXJ5SW5mb3JtYXRpb24iLCAgICAgICAgICAgICAgLyp0cF9uYW1lKi8KICAgICAgICBzaXplb2YobXNpb2JqKSwgLyp0cF9iYXNpY3NpemUqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlbXNpemUqLwogICAgICAgIC8qIG1ldGhvZHMgKi8KICAgICAgICAoZGVzdHJ1Y3Rvciltc2lvYmpfZGVhbGxvYywgLyp0cF9kZWFsbG9jKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX3ByaW50Ki8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2dldGF0dHIqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc2V0YXR0ciovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9yZXNlcnZlZCovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9yZXByKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX251bWJlciovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19zZXF1ZW5jZSovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19tYXBwaW5nKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2hhc2gqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY2FsbCovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zdHIqLwogICAgICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLC8qdHBfZ2V0YXR0cm8qLwogICAgICAgIFB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyLC8qdHBfc2V0YXR0cm8qLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfYnVmZmVyKi8KICAgICAgICBQeV9UUEZMQUdTX0RFRkFVTFQsICAgICAvKnRwX2ZsYWdzKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2RvYyovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF90cmF2ZXJzZSovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jbGVhciovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9yaWNoY29tcGFyZSovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF93ZWFrbGlzdG9mZnNldCovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVyKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2l0ZXJuZXh0Ki8KICAgICAgICBzdW1tYXJ5X21ldGhvZHMsICAgICAgICAvKnRwX21ldGhvZHMqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfbWVtYmVycyovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9nZXRzZXQqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYmFzZSovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kaWN0Ki8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2Rlc2NyX2dldCovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kZXNjcl9zZXQqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGljdG9mZnNldCovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pbml0Ki8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FsbG9jKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX25ldyovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9mcmVlKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2lzX2djKi8KfTsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKiogVmlldyBvYmplY3RzICoqKioqKioqKioqKioqLwoKc3RhdGljIFB5T2JqZWN0Kgp2aWV3X2V4ZWN1dGUobXNpb2JqICp2aWV3LCBQeU9iamVjdCphcmdzKQp7CiAgICBpbnQgc3RhdHVzOwogICAgTVNJSEFORExFIHBhcmFtcyA9IDA7CiAgICBQeU9iamVjdCAqb3BhcmFtcyA9IFB5X05vbmU7CgogICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPOkV4ZWN1dGUiLCAmb3BhcmFtcykpCiAgICAgICAgcmV0dXJuIE5VTEw7CgogICAgaWYgKG9wYXJhbXMgIT0gUHlfTm9uZSkgewogICAgICAgIGlmIChvcGFyYW1zLT5vYl90eXBlICE9ICZyZWNvcmRfVHlwZSkgewogICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiRXhlY3V0ZSBhcmd1bWVudCBtdXN0IGJlIGEgcmVjb3JkIik7CiAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgIH0KICAgICAgICBwYXJhbXMgPSAoKG1zaW9iaiopb3BhcmFtcyktPmg7CiAgICB9CgogICAgc3RhdHVzID0gTXNpVmlld0V4ZWN1dGUodmlldy0+aCwgcGFyYW1zKTsKICAgIGlmIChzdGF0dXMgIT0gRVJST1JfU1VDQ0VTUykKICAgICAgICByZXR1cm4gbXNpZXJyb3Ioc3RhdHVzKTsKCiAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CiAgICByZXR1cm4gUHlfTm9uZTsKfQoKc3RhdGljIFB5T2JqZWN0Kgp2aWV3X2ZldGNoKG1zaW9iaiAqdmlldywgUHlPYmplY3QqYXJncykKewogICAgaW50IHN0YXR1czsKICAgIE1TSUhBTkRMRSByZXN1bHQ7CgogICAgaWYgKChzdGF0dXMgPSBNc2lWaWV3RmV0Y2godmlldy0+aCwgJnJlc3VsdCkpICE9IEVSUk9SX1NVQ0NFU1MpCiAgICAgICAgcmV0dXJuIG1zaWVycm9yKHN0YXR1cyk7CgogICAgcmV0dXJuIHJlY29yZF9uZXcocmVzdWx0KTsKfQoKc3RhdGljIFB5T2JqZWN0Kgp2aWV3X2dldGNvbHVtbmluZm8obXNpb2JqICp2aWV3LCBQeU9iamVjdCAqYXJncykKewogICAgaW50IHN0YXR1czsKICAgIGludCBraW5kOwogICAgTVNJSEFORExFIHJlc3VsdDsKCiAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImk6R2V0Q29sdW1uSW5mbyIsICZraW5kKSkKICAgICAgICByZXR1cm4gTlVMTDsKCiAgICBpZiAoKHN0YXR1cyA9IE1zaVZpZXdHZXRDb2x1bW5JbmZvKHZpZXctPmgsIGtpbmQsICZyZXN1bHQpKSAhPSBFUlJPUl9TVUNDRVNTKQogICAgICAgIHJldHVybiBtc2llcnJvcihzdGF0dXMpOwoKICAgIHJldHVybiByZWNvcmRfbmV3KHJlc3VsdCk7Cn0KCnN0YXRpYyBQeU9iamVjdCoKdmlld19tb2RpZnkobXNpb2JqICp2aWV3LCBQeU9iamVjdCAqYXJncykKewogICAgaW50IGtpbmQ7CiAgICBQeU9iamVjdCAqZGF0YTsKICAgIGludCBzdGF0dXM7CgogICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpTzpNb2RpZnkiLCAma2luZCwgJmRhdGEpKQogICAgICAgIHJldHVybiBOVUxMOwoKICAgIGlmIChkYXRhLT5vYl90eXBlICE9ICZyZWNvcmRfVHlwZSkgewogICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJNb2RpZnkgZXhwZWN0cyBhIHJlY29yZCBvYmplY3QiKTsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KCiAgICBpZiAoKHN0YXR1cyA9IE1zaVZpZXdNb2RpZnkodmlldy0+aCwga2luZCwgKChtc2lvYmoqKWRhdGEpLT5oKSkgIT0gRVJST1JfU1VDQ0VTUykKICAgICAgICByZXR1cm4gbXNpZXJyb3Ioc3RhdHVzKTsKCiAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CiAgICByZXR1cm4gUHlfTm9uZTsKfQoKc3RhdGljIFB5T2JqZWN0Kgp2aWV3X2Nsb3NlKG1zaW9iaiAqdmlldywgUHlPYmplY3QqYXJncykKewogICAgaW50IHN0YXR1czsKCiAgICBpZiAoKHN0YXR1cyA9IE1zaVZpZXdDbG9zZSh2aWV3LT5oKSkgIT0gRVJST1JfU1VDQ0VTUykKICAgICAgICByZXR1cm4gbXNpZXJyb3Ioc3RhdHVzKTsKCiAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CiAgICByZXR1cm4gUHlfTm9uZTsKfQoKc3RhdGljIFB5TWV0aG9kRGVmIHZpZXdfbWV0aG9kc1tdID0gewogICAgeyAiRXhlY3V0ZSIsIChQeUNGdW5jdGlvbil2aWV3X2V4ZWN1dGUsIE1FVEhfVkFSQVJHUywKICAgICAgICBQeURvY19TVFIoIkV4ZWN1dGUocGFyYW1zPU5vbmUpIC0+IE5vbmVcbldyYXBzIE1zaVZpZXdFeGVjdXRlIil9LAogICAgeyAiR2V0Q29sdW1uSW5mbyIsIChQeUNGdW5jdGlvbil2aWV3X2dldGNvbHVtbmluZm8sIE1FVEhfVkFSQVJHUywKICAgICAgICBQeURvY19TVFIoIkdldENvbHVtbkluZm8oKSAtPiByZXN1bHRcbldyYXBzIE1zaUdldENvbHVtbkluZm8iKX0sCiAgICB7ICJGZXRjaCIsIChQeUNGdW5jdGlvbil2aWV3X2ZldGNoLCBNRVRIX05PQVJHUywKICAgICAgICBQeURvY19TVFIoIkZldGNoKCkgLT4gcmVzdWx0XG5XcmFwcyBNc2lWaWV3RmV0Y2giKX0sCiAgICB7ICJNb2RpZnkiLCAoUHlDRnVuY3Rpb24pdmlld19tb2RpZnksIE1FVEhfVkFSQVJHUywKICAgICAgICBQeURvY19TVFIoIk1vZGlmeShtb2RlLHJlY29yZCkgLT4gTm9uZVxuV3JhcHMgTXNpVmlld01vZGlmeSIpfSwKICAgIHsgIkNsb3NlIiwgKFB5Q0Z1bmN0aW9uKXZpZXdfY2xvc2UsIE1FVEhfTk9BUkdTLAogICAgICAgIFB5RG9jX1NUUigiQ2xvc2UoKSAtPiByZXN1bHRcbldyYXBzIE1zaVZpZXdDbG9zZSIpfSwKICAgIHsgTlVMTCwgTlVMTCB9Cn07CgpzdGF0aWMgUHlUeXBlT2JqZWN0IG1zaXZpZXdfVHlwZSA9IHsKICAgICAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKICAgICAgICAiX21zaS5WaWV3IiwgICAgICAgICAgICAvKnRwX25hbWUqLwogICAgICAgIHNpemVvZihtc2lvYmopLCAvKnRwX2Jhc2ljc2l6ZSovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVtc2l6ZSovCiAgICAgICAgLyogbWV0aG9kcyAqLwogICAgICAgIChkZXN0cnVjdG9yKW1zaW9ial9kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcHJpbnQqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0YXR0ciovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRyKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX3Jlc2VydmVkKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX3JlcHIqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbnVtYmVyKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX3NlcXVlbmNlKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX21hcHBpbmcqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaGFzaCovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jYWxsKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX3N0ciovCiAgICAgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsLyp0cF9nZXRhdHRybyovCiAgICAgICAgUHlPYmplY3RfR2VuZXJpY1NldEF0dHIsLyp0cF9zZXRhdHRybyovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19idWZmZXIqLwogICAgICAgIFB5X1RQRkxBR1NfREVGQVVMVCwgICAgIC8qdHBfZmxhZ3MqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZG9jKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX3RyYXZlcnNlKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NsZWFyKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX3JpY2hjb21wYXJlKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2l0ZXIqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlcm5leHQqLwogICAgICAgIHZpZXdfbWV0aG9kcywgICAgICAgICAgIC8qdHBfbWV0aG9kcyovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9tZW1iZXJzKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2dldHNldCovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9iYXNlKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2RpY3QqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGVzY3JfZ2V0Ki8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2Rlc2NyX3NldCovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kaWN0b2Zmc2V0Ki8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2luaXQqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYWxsb2MqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfbmV3Ki8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2ZyZWUqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXNfZ2MqLwp9OwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiBEYXRhYmFzZSBvYmplY3RzICoqKioqKioqKioqKioqLwoKc3RhdGljIFB5T2JqZWN0Kgptc2lkYl9vcGVudmlldyhtc2lvYmogKm1zaWRiLCBQeU9iamVjdCAqYXJncykKewogICAgaW50IHN0YXR1czsKICAgIGNoYXIgKnNxbDsKICAgIE1TSUhBTkRMRSBoVmlldzsKICAgIG1zaW9iaiAqcmVzdWx0OwoKICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiczpPcGVuVmlldyIsICZzcWwpKQogICAgICAgIHJldHVybiBOVUxMOwoKICAgIGlmICgoc3RhdHVzID0gTXNpRGF0YWJhc2VPcGVuVmlldyhtc2lkYi0+aCwgc3FsLCAmaFZpZXcpKSAhPSBFUlJPUl9TVUNDRVNTKQogICAgICAgIHJldHVybiBtc2llcnJvcihzdGF0dXMpOwoKICAgIHJlc3VsdCA9IFB5T2JqZWN0X05FVyhzdHJ1Y3QgbXNpb2JqLCAmbXNpdmlld19UeXBlKTsKICAgIGlmICghcmVzdWx0KSB7CiAgICAgICAgTXNpQ2xvc2VIYW5kbGUoaFZpZXcpOwogICAgICAgIHJldHVybiBOVUxMOwogICAgfQoKICAgIHJlc3VsdC0+aCA9IGhWaWV3OwogICAgcmV0dXJuIChQeU9iamVjdCopcmVzdWx0Owp9CgpzdGF0aWMgUHlPYmplY3QqCm1zaWRiX2NvbW1pdChtc2lvYmogKm1zaWRiLCBQeU9iamVjdCAqYXJncykKewogICAgaW50IHN0YXR1czsKCiAgICBpZiAoKHN0YXR1cyA9IE1zaURhdGFiYXNlQ29tbWl0KG1zaWRiLT5oKSkgIT0gRVJST1JfU1VDQ0VTUykKICAgICAgICByZXR1cm4gbXNpZXJyb3Ioc3RhdHVzKTsKCiAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CiAgICByZXR1cm4gUHlfTm9uZTsKfQoKc3RhdGljIFB5T2JqZWN0Kgptc2lkYl9nZXRzdW1tYXJ5aW5mb3JtYXRpb24obXNpb2JqICpkYiwgUHlPYmplY3QgKmFyZ3MpCnsKICAgIGludCBzdGF0dXM7CiAgICBpbnQgY291bnQ7CiAgICBNU0lIQU5ETEUgcmVzdWx0OwogICAgbXNpb2JqICpvcmVzdWx0OwoKICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTpHZXRTdW1tYXJ5SW5mb3JtYXRpb24iLCAmY291bnQpKQogICAgICAgIHJldHVybiBOVUxMOwoKICAgIHN0YXR1cyA9IE1zaUdldFN1bW1hcnlJbmZvcm1hdGlvbihkYi0+aCwgTlVMTCwgY291bnQsICZyZXN1bHQpOwogICAgaWYgKHN0YXR1cyAhPSBFUlJPUl9TVUNDRVNTKQogICAgICAgIHJldHVybiBtc2llcnJvcihzdGF0dXMpOwoKICAgIG9yZXN1bHQgPSBQeU9iamVjdF9ORVcoc3RydWN0IG1zaW9iaiwgJnN1bW1hcnlfVHlwZSk7CiAgICBpZiAoIXJlc3VsdCkgewogICAgICAgIE1zaUNsb3NlSGFuZGxlKHJlc3VsdCk7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CgogICAgb3Jlc3VsdC0+aCA9IHJlc3VsdDsKICAgIHJldHVybiAoUHlPYmplY3QqKW9yZXN1bHQ7Cn0KCnN0YXRpYyBQeU1ldGhvZERlZiBkYl9tZXRob2RzW10gPSB7CiAgICB7ICJPcGVuVmlldyIsIChQeUNGdW5jdGlvbiltc2lkYl9vcGVudmlldywgTUVUSF9WQVJBUkdTLAogICAgICAgIFB5RG9jX1NUUigiT3BlblZpZXcoc3FsKSAtPiB2aWV3b2JqXG5XcmFwcyBNc2lEYXRhYmFzZU9wZW5WaWV3Iil9LAogICAgeyAiQ29tbWl0IiwgKFB5Q0Z1bmN0aW9uKW1zaWRiX2NvbW1pdCwgTUVUSF9OT0FSR1MsCiAgICAgICAgUHlEb2NfU1RSKCJDb21taXQoKSAtPiBOb25lXG5XcmFwcyBNc2lEYXRhYmFzZUNvbW1pdCIpfSwKICAgIHsgIkdldFN1bW1hcnlJbmZvcm1hdGlvbiIsIChQeUNGdW5jdGlvbiltc2lkYl9nZXRzdW1tYXJ5aW5mb3JtYXRpb24sIE1FVEhfVkFSQVJHUywKICAgICAgICBQeURvY19TVFIoIkdldFN1bW1hcnlJbmZvcm1hdGlvbih1cGRhdGVDb3VudCkgLT4gdmlld29ialxuV3JhcHMgTXNpR2V0U3VtbWFyeUluZm9ybWF0aW9uIil9LAogICAgeyBOVUxMLCBOVUxMIH0KfTsKCnN0YXRpYyBQeVR5cGVPYmplY3QgbXNpZGJfVHlwZSA9IHsKICAgICAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKICAgICAgICAiX21zaS5EYXRhYmFzZSIsICAgICAgICAgICAgICAgIC8qdHBfbmFtZSovCiAgICAgICAgc2l6ZW9mKG1zaW9iaiksIC8qdHBfYmFzaWNzaXplKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2l0ZW1zaXplKi8KICAgICAgICAvKiBtZXRob2RzICovCiAgICAgICAgKGRlc3RydWN0b3IpbXNpb2JqX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9wcmludCovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9nZXRhdHRyKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHIqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcmVzZXJ2ZWQqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcmVwciovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19udW1iZXIqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfc2VxdWVuY2UqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbWFwcGluZyovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9oYXNoKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NhbGwqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc3RyKi8KICAgICAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwvKnRwX2dldGF0dHJvKi8KICAgICAgICBQeU9iamVjdF9HZW5lcmljU2V0QXR0ciwvKnRwX3NldGF0dHJvKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX2J1ZmZlciovCiAgICAgICAgUHlfVFBGTEFHU19ERUZBVUxULCAgICAgLyp0cF9mbGFncyovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kb2MqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfdHJhdmVyc2UqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY2xlYXIqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcmljaGNvbXBhcmUqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfd2Vha2xpc3RvZmZzZXQqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlciovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVybmV4dCovCiAgICAgICAgZGJfbWV0aG9kcywgICAgICAgICAgICAgLyp0cF9tZXRob2RzKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX21lbWJlcnMqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0c2V0Ki8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2Jhc2UqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGljdCovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kZXNjcl9nZXQqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGVzY3Jfc2V0Ki8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2RpY3RvZmZzZXQqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaW5pdCovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hbGxvYyovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9uZXcqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZnJlZSovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pc19nYyovCn07CgpzdGF0aWMgUHlPYmplY3QqIG1zaW9wZW5kYihQeU9iamVjdCAqb2JqLCBQeU9iamVjdCAqYXJncykKewogICAgaW50IHN0YXR1czsKICAgIGNoYXIgKnBhdGg7CiAgICBpbnQgcGVyc2lzdDsKICAgIE1TSUhBTkRMRSBoOwogICAgbXNpb2JqICpyZXN1bHQ7CgogICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzaTpNU0lPcGVuRGF0YWJhc2UiLCAmcGF0aCwgJnBlcnNpc3QpKQogICAgICAgIHJldHVybiBOVUxMOwoKICAgICAgICBzdGF0dXMgPSBNc2lPcGVuRGF0YWJhc2UocGF0aCwgKExQQ1NUUilwZXJzaXN0LCAmaCk7CiAgICBpZiAoc3RhdHVzICE9IEVSUk9SX1NVQ0NFU1MpCiAgICAgICAgcmV0dXJuIG1zaWVycm9yKHN0YXR1cyk7CgogICAgcmVzdWx0ID0gUHlPYmplY3RfTkVXKHN0cnVjdCBtc2lvYmosICZtc2lkYl9UeXBlKTsKICAgIGlmICghcmVzdWx0KSB7CiAgICAgICAgTXNpQ2xvc2VIYW5kbGUoaCk7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CiAgICByZXN1bHQtPmggPSBoOwogICAgcmV0dXJuIChQeU9iamVjdCopcmVzdWx0Owp9CgpzdGF0aWMgUHlPYmplY3QqCmNyZWF0ZXJlY29yZChQeU9iamVjdCAqbywgUHlPYmplY3QgKmFyZ3MpCnsKICAgIGludCBjb3VudDsKICAgIE1TSUhBTkRMRSBoOwoKICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTpDcmVhdGVSZWNvcmQiLCAmY291bnQpKQogICAgICAgIHJldHVybiBOVUxMOwoKICAgIGggPSBNc2lDcmVhdGVSZWNvcmQoY291bnQpOwogICAgaWYgKGggPT0gMCkKICAgICAgICByZXR1cm4gbXNpZXJyb3IoMCk7CgogICAgcmV0dXJuIHJlY29yZF9uZXcoaCk7Cn0KCgpzdGF0aWMgUHlNZXRob2REZWYgbXNpX21ldGhvZHNbXSA9IHsKICAgICAgICB7IlV1aWRDcmVhdGUiLCAoUHlDRnVuY3Rpb24pdXVpZGNyZWF0ZSwgTUVUSF9OT0FSR1MsCiAgICAgICAgICAgICAgICBQeURvY19TVFIoIlV1aWRDcmVhdGUoKSAtPiBzdHJpbmciKX0sCiAgICAgICAgeyJGQ0lDcmVhdGUiLCAgIChQeUNGdW5jdGlvbilmY2ljcmVhdGUsIE1FVEhfVkFSQVJHUywKICAgICAgICAgICAgICAgIFB5RG9jX1NUUigiZmNpY3JlYXRlKGNhYm5hbWUsZmlsZXMpIC0+IE5vbmUiKX0sCiAgICAgICAgeyJPcGVuRGF0YWJhc2UiLCAoUHlDRnVuY3Rpb24pbXNpb3BlbmRiLCBNRVRIX1ZBUkFSR1MsCiAgICAgICAgUHlEb2NfU1RSKCJPcGVuRGF0YWJhc2UobmFtZSwgZmxhZ3MpIC0+IGRib2JqXG5XcmFwcyBNc2lPcGVuRGF0YWJhc2UiKX0sCiAgICAgICAgeyJDcmVhdGVSZWNvcmQiLCAoUHlDRnVuY3Rpb24pY3JlYXRlcmVjb3JkLCBNRVRIX1ZBUkFSR1MsCiAgICAgICAgUHlEb2NfU1RSKCJPcGVuRGF0YWJhc2UobmFtZSwgZmxhZ3MpIC0+IGRib2JqXG5XcmFwcyBNc2lDcmVhdGVSZWNvcmQiKX0sCiAgICAgICAge05VTEwsICAgICAgICAgIE5VTEx9ICAgICAgICAgICAvKiBzZW50aW5lbCAqLwp9OwoKc3RhdGljIGNoYXIgbXNpX2RvY1tdID0gIkRvY3VtZW50YXRpb24iOwoKCnN0YXRpYyBzdHJ1Y3QgUHlNb2R1bGVEZWYgX21zaW1vZHVsZSA9IHsKICAgICAgICBQeU1vZHVsZURlZl9IRUFEX0lOSVQsCiAgICAgICAgIl9tc2kiLAogICAgICAgIG1zaV9kb2MsCiAgICAgICAgLTEsCiAgICAgICAgbXNpX21ldGhvZHMsCiAgICAgICAgTlVMTCwKICAgICAgICBOVUxMLAogICAgICAgIE5VTEwsCiAgICAgICAgTlVMTAp9OwoKUHlNT0RJTklUX0ZVTkMKUHlJbml0X19tc2kodm9pZCkKewogICAgUHlPYmplY3QgKm07CgogICAgbSA9IFB5TW9kdWxlX0NyZWF0ZSgmX21zaW1vZHVsZSk7CiAgICBpZiAobSA9PSBOVUxMKQogICAgICAgIHJldHVybiBOVUxMOwoKICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJNU0lEQk9QRU5fQ1JFQVRFRElSRUNUIiwgKGludClNU0lEQk9QRU5fQ1JFQVRFRElSRUNUKTsKICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJNU0lEQk9QRU5fQ1JFQVRFIiwgKGludClNU0lEQk9QRU5fQ1JFQVRFKTsKICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJNU0lEQk9QRU5fRElSRUNUIiwgKGludClNU0lEQk9QRU5fRElSRUNUKTsKICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJNU0lEQk9QRU5fUkVBRE9OTFkiLCAoaW50KU1TSURCT1BFTl9SRUFET05MWSk7CiAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTVNJREJPUEVOX1RSQU5TQUNUIiwgKGludClNU0lEQk9QRU5fVFJBTlNBQ1QpOwogICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk1TSURCT1BFTl9QQVRDSEZJTEUiLCAoaW50KU1TSURCT1BFTl9QQVRDSEZJTEUpOwoKICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJNU0lDT0xJTkZPX05BTUVTIiwgTVNJQ09MSU5GT19OQU1FUyk7CiAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTVNJQ09MSU5GT19UWVBFUyIsIE1TSUNPTElORk9fVFlQRVMpOwoKICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJNU0lNT0RJRllfU0VFSyIsIE1TSU1PRElGWV9TRUVLKTsKICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJNU0lNT0RJRllfUkVGUkVTSCIsIE1TSU1PRElGWV9SRUZSRVNIKTsKICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJNU0lNT0RJRllfSU5TRVJUIiwgTVNJTU9ESUZZX0lOU0VSVCk7CiAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTVNJTU9ESUZZX1VQREFURSIsIE1TSU1PRElGWV9VUERBVEUpOwogICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk1TSU1PRElGWV9BU1NJR04iLCBNU0lNT0RJRllfQVNTSUdOKTsKICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJNU0lNT0RJRllfUkVQTEFDRSIsIE1TSU1PRElGWV9SRVBMQUNFKTsKICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJNU0lNT0RJRllfTUVSR0UiLCBNU0lNT0RJRllfTUVSR0UpOwogICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk1TSU1PRElGWV9ERUxFVEUiLCBNU0lNT0RJRllfREVMRVRFKTsKICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJNU0lNT0RJRllfSU5TRVJUX1RFTVBPUkFSWSIsIE1TSU1PRElGWV9JTlNFUlRfVEVNUE9SQVJZKTsKICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJNU0lNT0RJRllfVkFMSURBVEUiLCBNU0lNT0RJRllfVkFMSURBVEUpOwogICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk1TSU1PRElGWV9WQUxJREFURV9ORVciLCBNU0lNT0RJRllfVkFMSURBVEVfTkVXKTsKICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJNU0lNT0RJRllfVkFMSURBVEVfRklFTEQiLCBNU0lNT0RJRllfVkFMSURBVEVfRklFTEQpOwogICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk1TSU1PRElGWV9WQUxJREFURV9ERUxFVEUiLCBNU0lNT0RJRllfVkFMSURBVEVfREVMRVRFKTsKCiAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUElEX0NPREVQQUdFIiwgUElEX0NPREVQQUdFKTsKICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJQSURfVElUTEUiLCBQSURfVElUTEUpOwogICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlBJRF9TVUJKRUNUIiwgUElEX1NVQkpFQ1QpOwogICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlBJRF9BVVRIT1IiLCBQSURfQVVUSE9SKTsKICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJQSURfS0VZV09SRFMiLCBQSURfS0VZV09SRFMpOwogICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlBJRF9DT01NRU5UUyIsIFBJRF9DT01NRU5UUyk7CiAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUElEX1RFTVBMQVRFIiwgUElEX1RFTVBMQVRFKTsKICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJQSURfTEFTVEFVVEhPUiIsIFBJRF9MQVNUQVVUSE9SKTsKICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJQSURfUkVWTlVNQkVSIiwgUElEX1JFVk5VTUJFUik7CiAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUElEX0xBU1RQUklOVEVEIiwgUElEX0xBU1RQUklOVEVEKTsKICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJQSURfQ1JFQVRFX0RUTSIsIFBJRF9DUkVBVEVfRFRNKTsKICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJQSURfTEFTVFNBVkVfRFRNIiwgUElEX0xBU1RTQVZFX0RUTSk7CiAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUElEX1BBR0VDT1VOVCIsIFBJRF9QQUdFQ09VTlQpOwogICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIlBJRF9XT1JEQ09VTlQiLCBQSURfV09SRENPVU5UKTsKICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJQSURfQ0hBUkNPVU5UIiwgUElEX0NIQVJDT1VOVCk7CiAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUElEX0FQUE5BTUUiLCBQSURfQVBQTkFNRSk7CiAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiUElEX1NFQ1VSSVRZIiwgUElEX1NFQ1VSSVRZKTsKCiAgICBNU0lFcnJvciA9IFB5RXJyX05ld0V4Y2VwdGlvbiAoIl9tc2kuTVNJRXJyb3IiLCBOVUxMLCBOVUxMKTsKICAgIGlmICghTVNJRXJyb3IpCiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIk1TSUVycm9yIiwgTVNJRXJyb3IpOwogICAgcmV0dXJuIG07Cn0K