LyogRHJvcCBpbiByZXBsYWNlbWVudCBmb3IgaGVhcHEucHkKCkMgaW1wbGVtZW50YXRpb24gZGVyaXZlZCBkaXJlY3RseSBmcm9tIGhlYXBxLnB5IGluIFB5Mi4zCndoaWNoIHdhcyB3cml0dGVuIGJ5IEtldmluIE8nQ29ubm9yLCBhdWdtZW50ZWQgYnkgVGltIFBldGVycywKYW5ub3RhdGVkIGJ5IEZyYW7Dp29pcyBQaW5hcmQsIGFuZCBjb252ZXJ0ZWQgdG8gQyBieSBSYXltb25kIEhldHRpbmdlci4KCiovCgojaW5jbHVkZSAiUHl0aG9uLmgiCgovKiBPbGRlciBpbXBsZW1lbnRhdGlvbnMgb2YgaGVhcHEgdXNlZCBQeV9MRSBmb3IgY29tcGFyaXNvbnMuICBOb3csIGl0IHVzZXMKICAgUHlfTFQgc28gaXQgd2lsbCBtYXRjaCBtaW4oKSwgc29ydGVkKCksIGFuZCBiaXNlY3QoKS4gIFVuZm9ydHVuYXRlbHksIHNvbWUKICAgY2xpZW50IGNvZGUgKFR3aXN0ZWQgZm9yIGV4YW1wbGUpIHJlbGllZCBvbiBQeV9MRSwgc28gdGhpcyBsaXR0bGUgZnVuY3Rpb24KICAgcmVzdG9yZXMgY29tcGF0aWJpbGl0eSBieSB0cnlpbmcgYm90aC4KKi8Kc3RhdGljIGludApjbXBfbHQoUHlPYmplY3QgKngsIFB5T2JqZWN0ICp5KQp7CiAgICBpbnQgY21wOwogICAgc3RhdGljIFB5T2JqZWN0ICpsdCA9IE5VTEw7CgogICAgaWYgKGx0ID09IE5VTEwpIHsKICAgICAgICBsdCA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIl9fbHRfXyIpOwogICAgICAgIGlmIChsdCA9PSBOVUxMKQogICAgICAgICAgICByZXR1cm4gLTE7CiAgICB9CiAgICBpZiAoUHlPYmplY3RfSGFzQXR0cih4LCBsdCkpCiAgICAgICAgcmV0dXJuIFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbCh4LCB5LCBQeV9MVCk7CiAgICBjbXAgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woeSwgeCwgUHlfTEUpOwogICAgaWYgKGNtcCAhPSAtMSkKICAgICAgICBjbXAgPSAxIC0gY21wOwogICAgcmV0dXJuIGNtcDsKfQoKc3RhdGljIGludApfc2lmdGRvd24oUHlMaXN0T2JqZWN0ICpoZWFwLCBQeV9zc2l6ZV90IHN0YXJ0cG9zLCBQeV9zc2l6ZV90IHBvcykKewogICAgUHlPYmplY3QgKm5ld2l0ZW0sICpwYXJlbnQ7CiAgICBQeV9zc2l6ZV90IHBhcmVudHBvcywgc2l6ZTsKICAgIGludCBjbXA7CgogICAgYXNzZXJ0KFB5TGlzdF9DaGVjayhoZWFwKSk7CiAgICBzaXplID0gUHlMaXN0X0dFVF9TSVpFKGhlYXApOwogICAgaWYgKHBvcyA+PSBzaXplKSB7CiAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsICJpbmRleCBvdXQgb2YgcmFuZ2UiKTsKICAgICAgICByZXR1cm4gLTE7CiAgICB9CgogICAgLyogRm9sbG93IHRoZSBwYXRoIHRvIHRoZSByb290LCBtb3ZpbmcgcGFyZW50cyBkb3duIHVudGlsIGZpbmRpbmcKICAgICAgIGEgcGxhY2UgbmV3aXRlbSBmaXRzLiAqLwogICAgbmV3aXRlbSA9IFB5TGlzdF9HRVRfSVRFTShoZWFwLCBwb3MpOwogICAgd2hpbGUgKHBvcyA+IHN0YXJ0cG9zKSB7CiAgICAgICAgcGFyZW50cG9zID0gKHBvcyAtIDEpID4+IDE7CiAgICAgICAgcGFyZW50ID0gUHlMaXN0X0dFVF9JVEVNKGhlYXAsIHBhcmVudHBvcyk7CiAgICAgICAgY21wID0gY21wX2x0KG5ld2l0ZW0sIHBhcmVudCk7CiAgICAgICAgaWYgKGNtcCA9PSAtMSkKICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIGlmIChzaXplICE9IFB5TGlzdF9HRVRfU0laRShoZWFwKSkgewogICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImxpc3QgY2hhbmdlZCBzaXplIGR1cmluZyBpdGVyYXRpb24iKTsKICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIH0KICAgICAgICBpZiAoY21wID09IDApCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIHBhcmVudCA9IFB5TGlzdF9HRVRfSVRFTShoZWFwLCBwYXJlbnRwb3MpOwogICAgICAgIG5ld2l0ZW0gPSBQeUxpc3RfR0VUX0lURU0oaGVhcCwgcG9zKTsKICAgICAgICBQeUxpc3RfU0VUX0lURU0oaGVhcCwgcGFyZW50cG9zLCBuZXdpdGVtKTsKICAgICAgICBQeUxpc3RfU0VUX0lURU0oaGVhcCwgcG9zLCBwYXJlbnQpOwogICAgICAgIHBvcyA9IHBhcmVudHBvczsKICAgIH0KICAgIHJldHVybiAwOwp9CgpzdGF0aWMgaW50Cl9zaWZ0dXAoUHlMaXN0T2JqZWN0ICpoZWFwLCBQeV9zc2l6ZV90IHBvcykKewogICAgUHlfc3NpemVfdCBzdGFydHBvcywgZW5kcG9zLCBjaGlsZHBvcywgcmlnaHRwb3MsIGxpbWl0OwogICAgUHlPYmplY3QgKnRtcDEsICp0bXAyOwogICAgaW50IGNtcDsKCiAgICBhc3NlcnQoUHlMaXN0X0NoZWNrKGhlYXApKTsKICAgIGVuZHBvcyA9IFB5TGlzdF9HRVRfU0laRShoZWFwKTsKICAgIHN0YXJ0cG9zID0gcG9zOwogICAgaWYgKHBvcyA+PSBlbmRwb3MpIHsKICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwgImluZGV4IG91dCBvZiByYW5nZSIpOwogICAgICAgIHJldHVybiAtMTsKICAgIH0KCiAgICAvKiBCdWJibGUgdXAgdGhlIHNtYWxsZXIgY2hpbGQgdW50aWwgaGl0dGluZyBhIGxlYWYuICovCiAgICBsaW1pdCA9IGVuZHBvcyAvIDI7ICAgICAgICAgIC8qIHNtYWxsZXN0IHBvcyB0aGF0IGhhcyBubyBjaGlsZCAqLwogICAgd2hpbGUgKHBvcyA8IGxpbWl0KSB7CiAgICAgICAgLyogU2V0IGNoaWxkcG9zIHRvIGluZGV4IG9mIHNtYWxsZXIgY2hpbGQuICAgKi8KICAgICAgICBjaGlsZHBvcyA9IDIqcG9zICsgMTsgICAgLyogbGVmdG1vc3QgY2hpbGQgcG9zaXRpb24gICovCiAgICAgICAgcmlnaHRwb3MgPSBjaGlsZHBvcyArIDE7CiAgICAgICAgaWYgKHJpZ2h0cG9zIDwgZW5kcG9zKSB7CiAgICAgICAgICAgIGNtcCA9IGNtcF9sdCgKICAgICAgICAgICAgICAgIFB5TGlzdF9HRVRfSVRFTShoZWFwLCBjaGlsZHBvcyksCiAgICAgICAgICAgICAgICBQeUxpc3RfR0VUX0lURU0oaGVhcCwgcmlnaHRwb3MpKTsKICAgICAgICAgICAgaWYgKGNtcCA9PSAtMSkKICAgICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgICAgaWYgKGNtcCA9PSAwKQogICAgICAgICAgICAgICAgY2hpbGRwb3MgPSByaWdodHBvczsKICAgICAgICAgICAgaWYgKGVuZHBvcyAhPSBQeUxpc3RfR0VUX1NJWkUoaGVhcCkpIHsKICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxpc3QgY2hhbmdlZCBzaXplIGR1cmluZyBpdGVyYXRpb24iKTsKICAgICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKiBNb3ZlIHRoZSBzbWFsbGVyIGNoaWxkIHVwLiAqLwogICAgICAgIHRtcDEgPSBQeUxpc3RfR0VUX0lURU0oaGVhcCwgY2hpbGRwb3MpOwogICAgICAgIHRtcDIgPSBQeUxpc3RfR0VUX0lURU0oaGVhcCwgcG9zKTsKICAgICAgICBQeUxpc3RfU0VUX0lURU0oaGVhcCwgY2hpbGRwb3MsIHRtcDIpOwogICAgICAgIFB5TGlzdF9TRVRfSVRFTShoZWFwLCBwb3MsIHRtcDEpOwogICAgICAgIHBvcyA9IGNoaWxkcG9zOwogICAgfQogICAgLyogQnViYmxlIGl0IHVwIHRvIGl0cyBmaW5hbCByZXN0aW5nIHBsYWNlIChieSBzaWZ0aW5nIGl0cyBwYXJlbnRzIGRvd24pLiAqLwogICAgcmV0dXJuIF9zaWZ0ZG93bihoZWFwLCBzdGFydHBvcywgcG9zKTsKfQoKc3RhdGljIFB5T2JqZWN0ICoKaGVhcHB1c2goUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQp7CiAgICBQeU9iamVjdCAqaGVhcCwgKml0ZW07CgogICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiaGVhcHB1c2giLCAyLCAyLCAmaGVhcCwgJml0ZW0pKQogICAgICAgIHJldHVybiBOVUxMOwoKICAgIGlmICghUHlMaXN0X0NoZWNrKGhlYXApKSB7CiAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImhlYXAgYXJndW1lbnQgbXVzdCBiZSBhIGxpc3QiKTsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KCiAgICBpZiAoUHlMaXN0X0FwcGVuZChoZWFwLCBpdGVtKSA9PSAtMSkKICAgICAgICByZXR1cm4gTlVMTDsKCiAgICBpZiAoX3NpZnRkb3duKChQeUxpc3RPYmplY3QgKiloZWFwLCAwLCBQeUxpc3RfR0VUX1NJWkUoaGVhcCktMSkgPT0gLTEpCiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CiAgICByZXR1cm4gUHlfTm9uZTsKfQoKUHlEb2NfU1RSVkFSKGhlYXBwdXNoX2RvYywKImhlYXBwdXNoKGhlYXAsIGl0ZW0pIC0+IE5vbmUuIFB1c2ggaXRlbSBvbnRvIGhlYXAsIG1haW50YWluaW5nIHRoZSBoZWFwIGludmFyaWFudC4iKTsKCnN0YXRpYyBQeU9iamVjdCAqCmhlYXBwb3AoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpoZWFwKQp7CiAgICBQeU9iamVjdCAqbGFzdGVsdCwgKnJldHVybml0ZW07CiAgICBQeV9zc2l6ZV90IG47CgogICAgaWYgKCFQeUxpc3RfQ2hlY2soaGVhcCkpIHsKICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiaGVhcCBhcmd1bWVudCBtdXN0IGJlIGEgbGlzdCIpOwogICAgICAgIHJldHVybiBOVUxMOwogICAgfQoKICAgIC8qICMgcmFpc2VzIGFwcHJvcHJpYXRlIEluZGV4RXJyb3IgaWYgaGVhcCBpcyBlbXB0eSAqLwogICAgbiA9IFB5TGlzdF9HRVRfU0laRShoZWFwKTsKICAgIGlmIChuID09IDApIHsKICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwgImluZGV4IG91dCBvZiByYW5nZSIpOwogICAgICAgIHJldHVybiBOVUxMOwogICAgfQoKICAgIGxhc3RlbHQgPSBQeUxpc3RfR0VUX0lURU0oaGVhcCwgbi0xKSA7CiAgICBQeV9JTkNSRUYobGFzdGVsdCk7CiAgICBQeUxpc3RfU2V0U2xpY2UoaGVhcCwgbi0xLCBuLCBOVUxMKTsKICAgIG4tLTsKCiAgICBpZiAoIW4pCiAgICAgICAgcmV0dXJuIGxhc3RlbHQ7CiAgICByZXR1cm5pdGVtID0gUHlMaXN0X0dFVF9JVEVNKGhlYXAsIDApOwogICAgUHlMaXN0X1NFVF9JVEVNKGhlYXAsIDAsIGxhc3RlbHQpOwogICAgaWYgKF9zaWZ0dXAoKFB5TGlzdE9iamVjdCAqKWhlYXAsIDApID09IC0xKSB7CiAgICAgICAgUHlfREVDUkVGKHJldHVybml0ZW0pOwogICAgICAgIHJldHVybiBOVUxMOwogICAgfQogICAgcmV0dXJuIHJldHVybml0ZW07Cn0KClB5RG9jX1NUUlZBUihoZWFwcG9wX2RvYywKIlBvcCB0aGUgc21hbGxlc3QgaXRlbSBvZmYgdGhlIGhlYXAsIG1haW50YWluaW5nIHRoZSBoZWFwIGludmFyaWFudC4iKTsKCnN0YXRpYyBQeU9iamVjdCAqCmhlYXByZXBsYWNlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKewogICAgUHlPYmplY3QgKmhlYXAsICppdGVtLCAqcmV0dXJuaXRlbTsKCiAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJoZWFwcmVwbGFjZSIsIDIsIDIsICZoZWFwLCAmaXRlbSkpCiAgICAgICAgcmV0dXJuIE5VTEw7CgogICAgaWYgKCFQeUxpc3RfQ2hlY2soaGVhcCkpIHsKICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiaGVhcCBhcmd1bWVudCBtdXN0IGJlIGEgbGlzdCIpOwogICAgICAgIHJldHVybiBOVUxMOwogICAgfQoKICAgIGlmIChQeUxpc3RfR0VUX1NJWkUoaGVhcCkgPCAxKSB7CiAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0luZGV4RXJyb3IsICJpbmRleCBvdXQgb2YgcmFuZ2UiKTsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KCiAgICByZXR1cm5pdGVtID0gUHlMaXN0X0dFVF9JVEVNKGhlYXAsIDApOwogICAgUHlfSU5DUkVGKGl0ZW0pOwogICAgUHlMaXN0X1NFVF9JVEVNKGhlYXAsIDAsIGl0ZW0pOwogICAgaWYgKF9zaWZ0dXAoKFB5TGlzdE9iamVjdCAqKWhlYXAsIDApID09IC0xKSB7CiAgICAgICAgUHlfREVDUkVGKHJldHVybml0ZW0pOwogICAgICAgIHJldHVybiBOVUxMOwogICAgfQogICAgcmV0dXJuIHJldHVybml0ZW07Cn0KClB5RG9jX1NUUlZBUihoZWFwcmVwbGFjZV9kb2MsCiJoZWFwcmVwbGFjZShoZWFwLCBpdGVtKSAtPiB2YWx1ZS4gUG9wIGFuZCByZXR1cm4gdGhlIGN1cnJlbnQgc21hbGxlc3QgdmFsdWUsIGFuZCBhZGQgdGhlIG5ldyBpdGVtLlxuXApcblwKVGhpcyBpcyBtb3JlIGVmZmljaWVudCB0aGFuIGhlYXBwb3AoKSBmb2xsb3dlZCBieSBoZWFwcHVzaCgpLCBhbmQgY2FuIGJlXG5cCm1vcmUgYXBwcm9wcmlhdGUgd2hlbiB1c2luZyBhIGZpeGVkLXNpemUgaGVhcC4gIE5vdGUgdGhhdCB0aGUgdmFsdWVcblwKcmV0dXJuZWQgbWF5IGJlIGxhcmdlciB0aGFuIGl0ZW0hICBUaGF0IGNvbnN0cmFpbnMgcmVhc29uYWJsZSB1c2VzIG9mXG5cCnRoaXMgcm91dGluZSB1bmxlc3Mgd3JpdHRlbiBhcyBwYXJ0IG9mIGEgY29uZGl0aW9uYWwgcmVwbGFjZW1lbnQ6XG5cblwKICAgIGlmIGl0ZW0gPiBoZWFwWzBdOlxuXAogICAgICAgIGl0ZW0gPSBoZWFwcmVwbGFjZShoZWFwLCBpdGVtKVxuIik7CgpzdGF0aWMgUHlPYmplY3QgKgpoZWFwcHVzaHBvcChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCnsKICAgIFB5T2JqZWN0ICpoZWFwLCAqaXRlbSwgKnJldHVybml0ZW07CiAgICBpbnQgY21wOwoKICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgImhlYXBwdXNocG9wIiwgMiwgMiwgJmhlYXAsICZpdGVtKSkKICAgICAgICByZXR1cm4gTlVMTDsKCiAgICBpZiAoIVB5TGlzdF9DaGVjayhoZWFwKSkgewogICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJoZWFwIGFyZ3VtZW50IG11c3QgYmUgYSBsaXN0Iik7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CgogICAgaWYgKFB5TGlzdF9HRVRfU0laRShoZWFwKSA8IDEpIHsKICAgICAgICBQeV9JTkNSRUYoaXRlbSk7CiAgICAgICAgcmV0dXJuIGl0ZW07CiAgICB9CgogICAgY21wID0gY21wX2x0KFB5TGlzdF9HRVRfSVRFTShoZWFwLCAwKSwgaXRlbSk7CiAgICBpZiAoY21wID09IC0xKQogICAgICAgIHJldHVybiBOVUxMOwogICAgaWYgKGNtcCA9PSAwKSB7CiAgICAgICAgUHlfSU5DUkVGKGl0ZW0pOwogICAgICAgIHJldHVybiBpdGVtOwogICAgfQoKICAgIGlmIChQeUxpc3RfR0VUX1NJWkUoaGVhcCkgPT0gMCkgewogICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLCAiaW5kZXggb3V0IG9mIHJhbmdlIik7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CgogICAgcmV0dXJuaXRlbSA9IFB5TGlzdF9HRVRfSVRFTShoZWFwLCAwKTsKICAgIFB5X0lOQ1JFRihpdGVtKTsKICAgIFB5TGlzdF9TRVRfSVRFTShoZWFwLCAwLCBpdGVtKTsKICAgIGlmIChfc2lmdHVwKChQeUxpc3RPYmplY3QgKiloZWFwLCAwKSA9PSAtMSkgewogICAgICAgIFB5X0RFQ1JFRihyZXR1cm5pdGVtKTsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KICAgIHJldHVybiByZXR1cm5pdGVtOwp9CgpQeURvY19TVFJWQVIoaGVhcHB1c2hwb3BfZG9jLAoiaGVhcHB1c2hwb3AoaGVhcCwgaXRlbSkgLT4gdmFsdWUuIFB1c2ggaXRlbSBvbiB0aGUgaGVhcCwgdGhlbiBwb3AgYW5kIHJldHVybiB0aGUgc21hbGxlc3QgaXRlbVxuXApmcm9tIHRoZSBoZWFwLiBUaGUgY29tYmluZWQgYWN0aW9uIHJ1bnMgbW9yZSBlZmZpY2llbnRseSB0aGFuXG5cCmhlYXBwdXNoKCkgZm9sbG93ZWQgYnkgYSBzZXBhcmF0ZSBjYWxsIHRvIGhlYXBwb3AoKS4iKTsKCnN0YXRpYyBQeU9iamVjdCAqCmhlYXBpZnkoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpoZWFwKQp7CiAgICBQeV9zc2l6ZV90IGksIG47CgogICAgaWYgKCFQeUxpc3RfQ2hlY2soaGVhcCkpIHsKICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiaGVhcCBhcmd1bWVudCBtdXN0IGJlIGEgbGlzdCIpOwogICAgICAgIHJldHVybiBOVUxMOwogICAgfQoKICAgIG4gPSBQeUxpc3RfR0VUX1NJWkUoaGVhcCk7CiAgICAvKiBUcmFuc2Zvcm0gYm90dG9tLXVwLiAgVGhlIGxhcmdlc3QgaW5kZXggdGhlcmUncyBhbnkgcG9pbnQgdG8KICAgICAgIGxvb2tpbmcgYXQgaXMgdGhlIGxhcmdlc3Qgd2l0aCBhIGNoaWxkIGluZGV4IGluLXJhbmdlLCBzbyBtdXN0CiAgICAgICBoYXZlIDIqaSArIDEgPCBuLCBvciBpIDwgKG4tMSkvMi4gIElmIG4gaXMgZXZlbiA9IDIqaiwgdGhpcyBpcwogICAgICAgKDIqai0xKS8yID0gai0xLzIgc28gai0xIGlzIHRoZSBsYXJnZXN0LCB3aGljaCBpcyBuLy8yIC0gMS4gIElmCiAgICAgICBuIGlzIG9kZCA9IDIqaisxLCB0aGlzIGlzICgyKmorMS0xKS8yID0gaiBzbyBqLTEgaXMgdGhlIGxhcmdlc3QsCiAgICAgICBhbmQgdGhhdCdzIGFnYWluIG4vLzItMS4KICAgICovCiAgICBmb3IgKGk9bi8yLTEgOyBpPj0wIDsgaS0tKQogICAgICAgIGlmKF9zaWZ0dXAoKFB5TGlzdE9iamVjdCAqKWhlYXAsIGkpID09IC0xKQogICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKICAgIHJldHVybiBQeV9Ob25lOwp9CgpQeURvY19TVFJWQVIoaGVhcGlmeV9kb2MsCiJUcmFuc2Zvcm0gbGlzdCBpbnRvIGEgaGVhcCwgaW4tcGxhY2UsIGluIE8obGVuKGhlYXApKSB0aW1lLiIpOwoKc3RhdGljIFB5T2JqZWN0ICoKbmxhcmdlc3QoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQp7CiAgICBQeU9iamVjdCAqaGVhcD1OVUxMLCAqZWxlbSwgKml0ZXJhYmxlLCAqc29sLCAqaXQsICpvbGRlbGVtOwogICAgUHlfc3NpemVfdCBpLCBuOwogICAgaW50IGNtcDsKCiAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIm5POm5sYXJnZXN0IiwgJm4sICZpdGVyYWJsZSkpCiAgICAgICAgcmV0dXJuIE5VTEw7CgogICAgaXQgPSBQeU9iamVjdF9HZXRJdGVyKGl0ZXJhYmxlKTsKICAgIGlmIChpdCA9PSBOVUxMKQogICAgICAgIHJldHVybiBOVUxMOwoKICAgIGhlYXAgPSBQeUxpc3RfTmV3KDApOwogICAgaWYgKGhlYXAgPT0gTlVMTCkKICAgICAgICBnb3RvIGZhaWw7CgogICAgZm9yIChpPTAgOyBpPG4gOyBpKysgKXsKICAgICAgICBlbGVtID0gUHlJdGVyX05leHQoaXQpOwogICAgICAgIGlmIChlbGVtID09IE5VTEwpIHsKICAgICAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCiAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIGdvdG8gc29ydGl0OwogICAgICAgIH0KICAgICAgICBpZiAoUHlMaXN0X0FwcGVuZChoZWFwLCBlbGVtKSA9PSAtMSkgewogICAgICAgICAgICBQeV9ERUNSRUYoZWxlbSk7CiAgICAgICAgICAgIGdvdG8gZmFpbDsKICAgICAgICB9CiAgICAgICAgUHlfREVDUkVGKGVsZW0pOwogICAgfQogICAgaWYgKFB5TGlzdF9HRVRfU0laRShoZWFwKSA9PSAwKQogICAgICAgIGdvdG8gc29ydGl0OwoKICAgIGZvciAoaT1uLzItMSA7IGk+PTAgOyBpLS0pCiAgICAgICAgaWYoX3NpZnR1cCgoUHlMaXN0T2JqZWN0ICopaGVhcCwgaSkgPT0gLTEpCiAgICAgICAgICAgIGdvdG8gZmFpbDsKCiAgICBzb2wgPSBQeUxpc3RfR0VUX0lURU0oaGVhcCwgMCk7CiAgICB3aGlsZSAoMSkgewogICAgICAgIGVsZW0gPSBQeUl0ZXJfTmV4dChpdCk7CiAgICAgICAgaWYgKGVsZW0gPT0gTlVMTCkgewogICAgICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgZ290byBzb3J0aXQ7CiAgICAgICAgfQogICAgICAgIGNtcCA9IGNtcF9sdChzb2wsIGVsZW0pOwogICAgICAgIGlmIChjbXAgPT0gLTEpIHsKICAgICAgICAgICAgUHlfREVDUkVGKGVsZW0pOwogICAgICAgICAgICBnb3RvIGZhaWw7CiAgICAgICAgfQogICAgICAgIGlmIChjbXAgPT0gMCkgewogICAgICAgICAgICBQeV9ERUNSRUYoZWxlbSk7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBvbGRlbGVtID0gUHlMaXN0X0dFVF9JVEVNKGhlYXAsIDApOwogICAgICAgIFB5TGlzdF9TRVRfSVRFTShoZWFwLCAwLCBlbGVtKTsKICAgICAgICBQeV9ERUNSRUYob2xkZWxlbSk7CiAgICAgICAgaWYgKF9zaWZ0dXAoKFB5TGlzdE9iamVjdCAqKWhlYXAsIDApID09IC0xKQogICAgICAgICAgICBnb3RvIGZhaWw7CiAgICAgICAgc29sID0gUHlMaXN0X0dFVF9JVEVNKGhlYXAsIDApOwogICAgfQpzb3J0aXQ6CiAgICBpZiAoUHlMaXN0X1NvcnQoaGVhcCkgPT0gLTEpCiAgICAgICAgZ290byBmYWlsOwogICAgaWYgKFB5TGlzdF9SZXZlcnNlKGhlYXApID09IC0xKQogICAgICAgIGdvdG8gZmFpbDsKICAgIFB5X0RFQ1JFRihpdCk7CiAgICByZXR1cm4gaGVhcDsKCmZhaWw6CiAgICBQeV9ERUNSRUYoaXQpOwogICAgUHlfWERFQ1JFRihoZWFwKTsKICAgIHJldHVybiBOVUxMOwp9CgpQeURvY19TVFJWQVIobmxhcmdlc3RfZG9jLAoiRmluZCB0aGUgbiBsYXJnZXN0IGVsZW1lbnRzIGluIGEgZGF0YXNldC5cblwKXG5cCkVxdWl2YWxlbnQgdG86ICBzb3J0ZWQoaXRlcmFibGUsIHJldmVyc2U9VHJ1ZSlbOm5dXG4iKTsKCnN0YXRpYyBpbnQKX3NpZnRkb3dubWF4KFB5TGlzdE9iamVjdCAqaGVhcCwgUHlfc3NpemVfdCBzdGFydHBvcywgUHlfc3NpemVfdCBwb3MpCnsKICAgIFB5T2JqZWN0ICpuZXdpdGVtLCAqcGFyZW50OwogICAgaW50IGNtcDsKICAgIFB5X3NzaXplX3QgcGFyZW50cG9zOwoKICAgIGFzc2VydChQeUxpc3RfQ2hlY2soaGVhcCkpOwogICAgaWYgKHBvcyA+PSBQeUxpc3RfR0VUX1NJWkUoaGVhcCkpIHsKICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwgImluZGV4IG91dCBvZiByYW5nZSIpOwogICAgICAgIHJldHVybiAtMTsKICAgIH0KCiAgICBuZXdpdGVtID0gUHlMaXN0X0dFVF9JVEVNKGhlYXAsIHBvcyk7CiAgICBQeV9JTkNSRUYobmV3aXRlbSk7CiAgICAvKiBGb2xsb3cgdGhlIHBhdGggdG8gdGhlIHJvb3QsIG1vdmluZyBwYXJlbnRzIGRvd24gdW50aWwgZmluZGluZwogICAgICAgYSBwbGFjZSBuZXdpdGVtIGZpdHMuICovCiAgICB3aGlsZSAocG9zID4gc3RhcnRwb3MpewogICAgICAgIHBhcmVudHBvcyA9IChwb3MgLSAxKSA+PiAxOwogICAgICAgIHBhcmVudCA9IFB5TGlzdF9HRVRfSVRFTShoZWFwLCBwYXJlbnRwb3MpOwogICAgICAgIGNtcCA9IGNtcF9sdChwYXJlbnQsIG5ld2l0ZW0pOwogICAgICAgIGlmIChjbXAgPT0gLTEpIHsKICAgICAgICAgICAgUHlfREVDUkVGKG5ld2l0ZW0pOwogICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgfQogICAgICAgIGlmIChjbXAgPT0gMCkKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgUHlfSU5DUkVGKHBhcmVudCk7CiAgICAgICAgUHlfREVDUkVGKFB5TGlzdF9HRVRfSVRFTShoZWFwLCBwb3MpKTsKICAgICAgICBQeUxpc3RfU0VUX0lURU0oaGVhcCwgcG9zLCBwYXJlbnQpOwogICAgICAgIHBvcyA9IHBhcmVudHBvczsKICAgIH0KICAgIFB5X0RFQ1JFRihQeUxpc3RfR0VUX0lURU0oaGVhcCwgcG9zKSk7CiAgICBQeUxpc3RfU0VUX0lURU0oaGVhcCwgcG9zLCBuZXdpdGVtKTsKICAgIHJldHVybiAwOwp9CgpzdGF0aWMgaW50Cl9zaWZ0dXBtYXgoUHlMaXN0T2JqZWN0ICpoZWFwLCBQeV9zc2l6ZV90IHBvcykKewogICAgUHlfc3NpemVfdCBzdGFydHBvcywgZW5kcG9zLCBjaGlsZHBvcywgcmlnaHRwb3MsIGxpbWl0OwogICAgaW50IGNtcDsKICAgIFB5T2JqZWN0ICpuZXdpdGVtLCAqdG1wOwoKICAgIGFzc2VydChQeUxpc3RfQ2hlY2soaGVhcCkpOwogICAgZW5kcG9zID0gUHlMaXN0X0dFVF9TSVpFKGhlYXApOwogICAgc3RhcnRwb3MgPSBwb3M7CiAgICBpZiAocG9zID49IGVuZHBvcykgewogICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLCAiaW5kZXggb3V0IG9mIHJhbmdlIik7CiAgICAgICAgcmV0dXJuIC0xOwogICAgfQogICAgbmV3aXRlbSA9IFB5TGlzdF9HRVRfSVRFTShoZWFwLCBwb3MpOwogICAgUHlfSU5DUkVGKG5ld2l0ZW0pOwoKICAgIC8qIEJ1YmJsZSB1cCB0aGUgc21hbGxlciBjaGlsZCB1bnRpbCBoaXR0aW5nIGEgbGVhZi4gKi8KICAgIGxpbWl0ID0gZW5kcG9zIC8gMjsgICAgICAgICAgLyogc21hbGxlc3QgcG9zIHRoYXQgaGFzIG5vIGNoaWxkICovCiAgICB3aGlsZSAocG9zIDwgbGltaXQpIHsKICAgICAgICAvKiBTZXQgY2hpbGRwb3MgdG8gaW5kZXggb2Ygc21hbGxlciBjaGlsZC4gICAqLwogICAgICAgIGNoaWxkcG9zID0gMipwb3MgKyAxOyAgICAvKiBsZWZ0bW9zdCBjaGlsZCBwb3NpdGlvbiAgKi8KICAgICAgICByaWdodHBvcyA9IGNoaWxkcG9zICsgMTsKICAgICAgICBpZiAocmlnaHRwb3MgPCBlbmRwb3MpIHsKICAgICAgICAgICAgY21wID0gY21wX2x0KAogICAgICAgICAgICAgICAgUHlMaXN0X0dFVF9JVEVNKGhlYXAsIHJpZ2h0cG9zKSwKICAgICAgICAgICAgICAgIFB5TGlzdF9HRVRfSVRFTShoZWFwLCBjaGlsZHBvcykpOwogICAgICAgICAgICBpZiAoY21wID09IC0xKSB7CiAgICAgICAgICAgICAgICBQeV9ERUNSRUYobmV3aXRlbSk7CiAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGNtcCA9PSAwKQogICAgICAgICAgICAgICAgY2hpbGRwb3MgPSByaWdodHBvczsKICAgICAgICB9CiAgICAgICAgLyogTW92ZSB0aGUgc21hbGxlciBjaGlsZCB1cC4gKi8KICAgICAgICB0bXAgPSBQeUxpc3RfR0VUX0lURU0oaGVhcCwgY2hpbGRwb3MpOwogICAgICAgIFB5X0lOQ1JFRih0bXApOwogICAgICAgIFB5X0RFQ1JFRihQeUxpc3RfR0VUX0lURU0oaGVhcCwgcG9zKSk7CiAgICAgICAgUHlMaXN0X1NFVF9JVEVNKGhlYXAsIHBvcywgdG1wKTsKICAgICAgICBwb3MgPSBjaGlsZHBvczsKICAgIH0KCiAgICAvKiBUaGUgbGVhZiBhdCBwb3MgaXMgZW1wdHkgbm93LiAgUHV0IG5ld2l0ZW0gdGhlcmUsIGFuZCBidWJibGUKICAgICAgIGl0IHVwIHRvIGl0cyBmaW5hbCByZXN0aW5nIHBsYWNlIChieSBzaWZ0aW5nIGl0cyBwYXJlbnRzIGRvd24pLiAqLwogICAgUHlfREVDUkVGKFB5TGlzdF9HRVRfSVRFTShoZWFwLCBwb3MpKTsKICAgIFB5TGlzdF9TRVRfSVRFTShoZWFwLCBwb3MsIG5ld2l0ZW0pOwogICAgcmV0dXJuIF9zaWZ0ZG93bm1heChoZWFwLCBzdGFydHBvcywgcG9zKTsKfQoKc3RhdGljIFB5T2JqZWN0ICoKbnNtYWxsZXN0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKewogICAgUHlPYmplY3QgKmhlYXA9TlVMTCwgKmVsZW0sICppdGVyYWJsZSwgKmxvcywgKml0LCAqb2xkZWxlbTsKICAgIFB5X3NzaXplX3QgaSwgbjsKICAgIGludCBjbXA7CgogICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJuTzpuc21hbGxlc3QiLCAmbiwgJml0ZXJhYmxlKSkKICAgICAgICByZXR1cm4gTlVMTDsKCiAgICBpdCA9IFB5T2JqZWN0X0dldEl0ZXIoaXRlcmFibGUpOwogICAgaWYgKGl0ID09IE5VTEwpCiAgICAgICAgcmV0dXJuIE5VTEw7CgogICAgaGVhcCA9IFB5TGlzdF9OZXcoMCk7CiAgICBpZiAoaGVhcCA9PSBOVUxMKQogICAgICAgIGdvdG8gZmFpbDsKCiAgICBmb3IgKGk9MCA7IGk8biA7IGkrKyApewogICAgICAgIGVsZW0gPSBQeUl0ZXJfTmV4dChpdCk7CiAgICAgICAgaWYgKGVsZW0gPT0gTlVMTCkgewogICAgICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgZ290byBzb3J0aXQ7CiAgICAgICAgfQogICAgICAgIGlmIChQeUxpc3RfQXBwZW5kKGhlYXAsIGVsZW0pID09IC0xKSB7CiAgICAgICAgICAgIFB5X0RFQ1JFRihlbGVtKTsKICAgICAgICAgICAgZ290byBmYWlsOwogICAgICAgIH0KICAgICAgICBQeV9ERUNSRUYoZWxlbSk7CiAgICB9CiAgICBuID0gUHlMaXN0X0dFVF9TSVpFKGhlYXApOwogICAgaWYgKG4gPT0gMCkKICAgICAgICBnb3RvIHNvcnRpdDsKCiAgICBmb3IgKGk9bi8yLTEgOyBpPj0wIDsgaS0tKQogICAgICAgIGlmKF9zaWZ0dXBtYXgoKFB5TGlzdE9iamVjdCAqKWhlYXAsIGkpID09IC0xKQogICAgICAgICAgICBnb3RvIGZhaWw7CgogICAgbG9zID0gUHlMaXN0X0dFVF9JVEVNKGhlYXAsIDApOwogICAgd2hpbGUgKDEpIHsKICAgICAgICBlbGVtID0gUHlJdGVyX05leHQoaXQpOwogICAgICAgIGlmIChlbGVtID09IE5VTEwpIHsKICAgICAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCiAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIGdvdG8gc29ydGl0OwogICAgICAgIH0KICAgICAgICBjbXAgPSBjbXBfbHQoZWxlbSwgbG9zKTsKICAgICAgICBpZiAoY21wID09IC0xKSB7CiAgICAgICAgICAgIFB5X0RFQ1JFRihlbGVtKTsKICAgICAgICAgICAgZ290byBmYWlsOwogICAgICAgIH0KICAgICAgICBpZiAoY21wID09IDApIHsKICAgICAgICAgICAgUHlfREVDUkVGKGVsZW0pOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CgogICAgICAgIG9sZGVsZW0gPSBQeUxpc3RfR0VUX0lURU0oaGVhcCwgMCk7CiAgICAgICAgUHlMaXN0X1NFVF9JVEVNKGhlYXAsIDAsIGVsZW0pOwogICAgICAgIFB5X0RFQ1JFRihvbGRlbGVtKTsKICAgICAgICBpZiAoX3NpZnR1cG1heCgoUHlMaXN0T2JqZWN0ICopaGVhcCwgMCkgPT0gLTEpCiAgICAgICAgICAgIGdvdG8gZmFpbDsKICAgICAgICBsb3MgPSBQeUxpc3RfR0VUX0lURU0oaGVhcCwgMCk7CiAgICB9Cgpzb3J0aXQ6CiAgICBpZiAoUHlMaXN0X1NvcnQoaGVhcCkgPT0gLTEpCiAgICAgICAgZ290byBmYWlsOwogICAgUHlfREVDUkVGKGl0KTsKICAgIHJldHVybiBoZWFwOwoKZmFpbDoKICAgIFB5X0RFQ1JFRihpdCk7CiAgICBQeV9YREVDUkVGKGhlYXApOwogICAgcmV0dXJuIE5VTEw7Cn0KClB5RG9jX1NUUlZBUihuc21hbGxlc3RfZG9jLAoiRmluZCB0aGUgbiBzbWFsbGVzdCBlbGVtZW50cyBpbiBhIGRhdGFzZXQuXG5cClxuXApFcXVpdmFsZW50IHRvOiAgc29ydGVkKGl0ZXJhYmxlKVs6bl1cbiIpOwoKc3RhdGljIFB5TWV0aG9kRGVmIGhlYXBxX21ldGhvZHNbXSA9IHsKICAgIHsiaGVhcHB1c2giLCAgICAgICAgKFB5Q0Z1bmN0aW9uKWhlYXBwdXNoLAogICAgICAgIE1FVEhfVkFSQVJHUywgICAgICAgICAgIGhlYXBwdXNoX2RvY30sCiAgICB7ImhlYXBwdXNocG9wIiwgICAgIChQeUNGdW5jdGlvbiloZWFwcHVzaHBvcCwKICAgICAgICBNRVRIX1ZBUkFSR1MsICAgICAgICAgICBoZWFwcHVzaHBvcF9kb2N9LAogICAgeyJoZWFwcG9wIiwgICAgICAgICAoUHlDRnVuY3Rpb24paGVhcHBvcCwKICAgICAgICBNRVRIX08sICAgICAgICAgICAgICAgICBoZWFwcG9wX2RvY30sCiAgICB7ImhlYXByZXBsYWNlIiwgICAgIChQeUNGdW5jdGlvbiloZWFwcmVwbGFjZSwKICAgICAgICBNRVRIX1ZBUkFSR1MsICAgICAgICAgICBoZWFwcmVwbGFjZV9kb2N9LAogICAgeyJoZWFwaWZ5IiwgICAgICAgICAoUHlDRnVuY3Rpb24paGVhcGlmeSwKICAgICAgICBNRVRIX08sICAgICAgICAgICAgICAgICBoZWFwaWZ5X2RvY30sCiAgICB7Im5sYXJnZXN0IiwgICAgICAgIChQeUNGdW5jdGlvbilubGFyZ2VzdCwKICAgICAgICBNRVRIX1ZBUkFSR1MsICAgICAgICAgICBubGFyZ2VzdF9kb2N9LAogICAgeyJuc21hbGxlc3QiLCAgICAgICAoUHlDRnVuY3Rpb24pbnNtYWxsZXN0LAogICAgICAgIE1FVEhfVkFSQVJHUywgICAgICAgICAgIG5zbWFsbGVzdF9kb2N9LAogICAge05VTEwsICAgICAgICAgICAgICBOVUxMfSAgICAgICAgICAgLyogc2VudGluZWwgKi8KfTsKClB5RG9jX1NUUlZBUihtb2R1bGVfZG9jLAoiSGVhcCBxdWV1ZSBhbGdvcml0aG0gKGEuay5hLiBwcmlvcml0eSBxdWV1ZSkuXG5cClxuXApIZWFwcyBhcmUgYXJyYXlzIGZvciB3aGljaCBhW2tdIDw9IGFbMiprKzFdIGFuZCBhW2tdIDw9IGFbMiprKzJdIGZvclxuXAphbGwgaywgY291bnRpbmcgZWxlbWVudHMgZnJvbSAwLiAgRm9yIHRoZSBzYWtlIG9mIGNvbXBhcmlzb24sXG5cCm5vbi1leGlzdGluZyBlbGVtZW50cyBhcmUgY29uc2lkZXJlZCB0byBiZSBpbmZpbml0ZS4gIFRoZSBpbnRlcmVzdGluZ1xuXApwcm9wZXJ0eSBvZiBhIGhlYXAgaXMgdGhhdCBhWzBdIGlzIGFsd2F5cyBpdHMgc21hbGxlc3QgZWxlbWVudC5cblwKXG5cClVzYWdlOlxuXApcblwKaGVhcCA9IFtdICAgICAgICAgICAgIyBjcmVhdGVzIGFuIGVtcHR5IGhlYXBcblwKaGVhcHB1c2goaGVhcCwgaXRlbSkgIyBwdXNoZXMgYSBuZXcgaXRlbSBvbiB0aGUgaGVhcFxuXAppdGVtID0gaGVhcHBvcChoZWFwKSAjIHBvcHMgdGhlIHNtYWxsZXN0IGl0ZW0gZnJvbSB0aGUgaGVhcFxuXAppdGVtID0gaGVhcFswXSAgICAgICAjIHNtYWxsZXN0IGl0ZW0gb24gdGhlIGhlYXAgd2l0aG91dCBwb3BwaW5nIGl0XG5cCmhlYXBpZnkoeCkgICAgICAgICAgICMgdHJhbnNmb3JtcyBsaXN0IGludG8gYSBoZWFwLCBpbi1wbGFjZSwgaW4gbGluZWFyIHRpbWVcblwKaXRlbSA9IGhlYXByZXBsYWNlKGhlYXAsIGl0ZW0pICMgcG9wcyBhbmQgcmV0dXJucyBzbWFsbGVzdCBpdGVtLCBhbmQgYWRkc1xuXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBuZXcgaXRlbTsgdGhlIGhlYXAgc2l6ZSBpcyB1bmNoYW5nZWRcblwKXG5cCk91ciBBUEkgZGlmZmVycyBmcm9tIHRleHRib29rIGhlYXAgYWxnb3JpdGhtcyBhcyBmb2xsb3dzOlxuXApcblwKLSBXZSB1c2UgMC1iYXNlZCBpbmRleGluZy4gIFRoaXMgbWFrZXMgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZVxuXAogIGluZGV4IGZvciBhIG5vZGUgYW5kIHRoZSBpbmRleGVzIGZvciBpdHMgY2hpbGRyZW4gc2xpZ2h0bHkgbGVzc1xuXAogIG9idmlvdXMsIGJ1dCBpcyBtb3JlIHN1aXRhYmxlIHNpbmNlIFB5dGhvbiB1c2VzIDAtYmFzZWQgaW5kZXhpbmcuXG5cClxuXAotIE91ciBoZWFwcG9wKCkgbWV0aG9kIHJldHVybnMgdGhlIHNtYWxsZXN0IGl0ZW0sIG5vdCB0aGUgbGFyZ2VzdC5cblwKXG5cClRoZXNlIHR3byBtYWtlIGl0IHBvc3NpYmxlIHRvIHZpZXcgdGhlIGhlYXAgYXMgYSByZWd1bGFyIFB5dGhvbiBsaXN0XG5cCndpdGhvdXQgc3VycHJpc2VzOiBoZWFwWzBdIGlzIHRoZSBzbWFsbGVzdCBpdGVtLCBhbmQgaGVhcC5zb3J0KClcblwKbWFpbnRhaW5zIHRoZSBoZWFwIGludmFyaWFudCFcbiIpOwoKClB5RG9jX1NUUlZBUihfX2Fib3V0X18sCiJIZWFwIHF1ZXVlc1xuXApcblwKW2V4cGxhbmF0aW9uIGJ5IEZyYW7nb2lzIFBpbmFyZF1cblwKXG5cCkhlYXBzIGFyZSBhcnJheXMgZm9yIHdoaWNoIGFba10gPD0gYVsyKmsrMV0gYW5kIGFba10gPD0gYVsyKmsrMl0gZm9yXG5cCmFsbCBrLCBjb3VudGluZyBlbGVtZW50cyBmcm9tIDAuICBGb3IgdGhlIHNha2Ugb2YgY29tcGFyaXNvbixcblwKbm9uLWV4aXN0aW5nIGVsZW1lbnRzIGFyZSBjb25zaWRlcmVkIHRvIGJlIGluZmluaXRlLiAgVGhlIGludGVyZXN0aW5nXG5cCnByb3BlcnR5IG9mIGEgaGVhcCBpcyB0aGF0IGFbMF0gaXMgYWx3YXlzIGl0cyBzbWFsbGVzdCBlbGVtZW50LlxuIgoiXG5cClRoZSBzdHJhbmdlIGludmFyaWFudCBhYm92ZSBpcyBtZWFudCB0byBiZSBhbiBlZmZpY2llbnQgbWVtb3J5XG5cCnJlcHJlc2VudGF0aW9uIGZvciBhIHRvdXJuYW1lbnQuICBUaGUgbnVtYmVycyBiZWxvdyBhcmUgYGsnLCBub3QgYVtrXTpcblwKXG5cCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMFxuXApcblwKICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDJcblwKXG5cCiAgICAgICAgICAzICAgICAgICAgICAgICAgNCAgICAgICAgICAgICAgICA1ICAgICAgICAgICAgICAgNlxuXApcblwKICAgICAgNyAgICAgICA4ICAgICAgIDkgICAgICAgMTAgICAgICAxMSAgICAgIDEyICAgICAgMTMgICAgICAxNFxuXApcblwKICAgIDE1IDE2ICAgMTcgMTggICAxOSAyMCAgIDIxIDIyICAgMjMgMjQgICAyNSAyNiAgIDI3IDI4ICAgMjkgMzBcblwKXG5cClxuXApJbiB0aGUgdHJlZSBhYm92ZSwgZWFjaCBjZWxsIGBrJyBpcyB0b3BwaW5nIGAyKmsrMScgYW5kIGAyKmsrMicuICBJblxuXAphIHVzdWFsIGJpbmFyeSB0b3VybmFtZW50IHdlIHNlZSBpbiBzcG9ydHMsIGVhY2ggY2VsbCBpcyB0aGUgd2lubmVyXG5cCm92ZXIgdGhlIHR3byBjZWxscyBpdCB0b3BzLCBhbmQgd2UgY2FuIHRyYWNlIHRoZSB3aW5uZXIgZG93biB0aGUgdHJlZVxuXAp0byBzZWUgYWxsIG9wcG9uZW50cyBzL2hlIGhhZC4gIEhvd2V2ZXIsIGluIG1hbnkgY29tcHV0ZXIgYXBwbGljYXRpb25zXG5cCm9mIHN1Y2ggdG91cm5hbWVudHMsIHdlIGRvIG5vdCBuZWVkIHRvIHRyYWNlIHRoZSBoaXN0b3J5IG9mIGEgd2lubmVyLlxuXApUbyBiZSBtb3JlIG1lbW9yeSBlZmZpY2llbnQsIHdoZW4gYSB3aW5uZXIgaXMgcHJvbW90ZWQsIHdlIHRyeSB0b1xuXApyZXBsYWNlIGl0IGJ5IHNvbWV0aGluZyBlbHNlIGF0IGEgbG93ZXIgbGV2ZWwsIGFuZCB0aGUgcnVsZSBiZWNvbWVzXG5cCnRoYXQgYSBjZWxsIGFuZCB0aGUgdHdvIGNlbGxzIGl0IHRvcHMgY29udGFpbiB0aHJlZSBkaWZmZXJlbnQgaXRlbXMsXG5cCmJ1dCB0aGUgdG9wIGNlbGwgXCJ3aW5zXCIgb3ZlciB0aGUgdHdvIHRvcHBlZCBjZWxscy5cbiIKIlxuXApJZiB0aGlzIGhlYXAgaW52YXJpYW50IGlzIHByb3RlY3RlZCBhdCBhbGwgdGltZSwgaW5kZXggMCBpcyBjbGVhcmx5XG5cCnRoZSBvdmVyYWxsIHdpbm5lci4gIFRoZSBzaW1wbGVzdCBhbGdvcml0aG1pYyB3YXkgdG8gcmVtb3ZlIGl0IGFuZFxuXApmaW5kIHRoZSBcIm5leHRcIiB3aW5uZXIgaXMgdG8gbW92ZSBzb21lIGxvc2VyIChsZXQncyBzYXkgY2VsbCAzMCBpbiB0aGVcblwKZGlhZ3JhbSBhYm92ZSkgaW50byB0aGUgMCBwb3NpdGlvbiwgYW5kIHRoZW4gcGVyY29sYXRlIHRoaXMgbmV3IDAgZG93blxuXAp0aGUgdHJlZSwgZXhjaGFuZ2luZyB2YWx1ZXMsIHVudGlsIHRoZSBpbnZhcmlhbnQgaXMgcmUtZXN0YWJsaXNoZWQuXG5cClRoaXMgaXMgY2xlYXJseSBsb2dhcml0aG1pYyBvbiB0aGUgdG90YWwgbnVtYmVyIG9mIGl0ZW1zIGluIHRoZSB0cmVlLlxuXApCeSBpdGVyYXRpbmcgb3ZlciBhbGwgaXRlbXMsIHlvdSBnZXQgYW4gTyhuIGxuIG4pIHNvcnQuXG4iCiJcblwKQSBuaWNlIGZlYXR1cmUgb2YgdGhpcyBzb3J0IGlzIHRoYXQgeW91IGNhbiBlZmZpY2llbnRseSBpbnNlcnQgbmV3XG5cCml0ZW1zIHdoaWxlIHRoZSBzb3J0IGlzIGdvaW5nIG9uLCBwcm92aWRlZCB0aGF0IHRoZSBpbnNlcnRlZCBpdGVtcyBhcmVcblwKbm90IFwiYmV0dGVyXCIgdGhhbiB0aGUgbGFzdCAwJ3RoIGVsZW1lbnQgeW91IGV4dHJhY3RlZC4gIFRoaXMgaXNcblwKZXNwZWNpYWxseSB1c2VmdWwgaW4gc2ltdWxhdGlvbiBjb250ZXh0cywgd2hlcmUgdGhlIHRyZWUgaG9sZHMgYWxsXG5cCmluY29taW5nIGV2ZW50cywgYW5kIHRoZSBcIndpblwiIGNvbmRpdGlvbiBtZWFucyB0aGUgc21hbGxlc3Qgc2NoZWR1bGVkXG5cCnRpbWUuICBXaGVuIGFuIGV2ZW50IHNjaGVkdWxlIG90aGVyIGV2ZW50cyBmb3IgZXhlY3V0aW9uLCB0aGV5IGFyZVxuXApzY2hlZHVsZWQgaW50byB0aGUgZnV0dXJlLCBzbyB0aGV5IGNhbiBlYXNpbHkgZ28gaW50byB0aGUgaGVhcC4gIFNvLCBhXG5cCmhlYXAgaXMgYSBnb29kIHN0cnVjdHVyZSBmb3IgaW1wbGVtZW50aW5nIHNjaGVkdWxlcnMgKHRoaXMgaXMgd2hhdCBJXG5cCnVzZWQgZm9yIG15IE1JREkgc2VxdWVuY2VyIDotKS5cbiIKIlxuXApWYXJpb3VzIHN0cnVjdHVyZXMgZm9yIGltcGxlbWVudGluZyBzY2hlZHVsZXJzIGhhdmUgYmVlbiBleHRlbnNpdmVseVxuXApzdHVkaWVkLCBhbmQgaGVhcHMgYXJlIGdvb2QgZm9yIHRoaXMsIGFzIHRoZXkgYXJlIHJlYXNvbmFibHkgc3BlZWR5LFxuXAp0aGUgc3BlZWQgaXMgYWxtb3N0IGNvbnN0YW50LCBhbmQgdGhlIHdvcnN0IGNhc2UgaXMgbm90IG11Y2ggZGlmZmVyZW50XG5cCnRoYW4gdGhlIGF2ZXJhZ2UgY2FzZS4gIEhvd2V2ZXIsIHRoZXJlIGFyZSBvdGhlciByZXByZXNlbnRhdGlvbnMgd2hpY2hcblwKYXJlIG1vcmUgZWZmaWNpZW50IG92ZXJhbGwsIHlldCB0aGUgd29yc3QgY2FzZXMgbWlnaHQgYmUgdGVycmlibGUuXG4iCiJcblwKSGVhcHMgYXJlIGFsc28gdmVyeSB1c2VmdWwgaW4gYmlnIGRpc2sgc29ydHMuICBZb3UgbW9zdCBwcm9iYWJseSBhbGxcblwKa25vdyB0aGF0IGEgYmlnIHNvcnQgaW1wbGllcyBwcm9kdWNpbmcgXCJydW5zXCIgKHdoaWNoIGFyZSBwcmUtc29ydGVkXG5cCnNlcXVlbmNlcywgd2hpY2ggc2l6ZSBpcyB1c3VhbGx5IHJlbGF0ZWQgdG8gdGhlIGFtb3VudCBvZiBDUFUgbWVtb3J5KSxcblwKZm9sbG93ZWQgYnkgYSBtZXJnaW5nIHBhc3NlcyBmb3IgdGhlc2UgcnVucywgd2hpY2ggbWVyZ2luZyBpcyBvZnRlblxuXAp2ZXJ5IGNsZXZlcmx5IG9yZ2FuaXNlZFsxXS4gIEl0IGlzIHZlcnkgaW1wb3J0YW50IHRoYXQgdGhlIGluaXRpYWxcblwKc29ydCBwcm9kdWNlcyB0aGUgbG9uZ2VzdCBydW5zIHBvc3NpYmxlLiAgVG91cm5hbWVudHMgYXJlIGEgZ29vZCB3YXlcblwKdG8gdGhhdC4gIElmLCB1c2luZyBhbGwgdGhlIG1lbW9yeSBhdmFpbGFibGUgdG8gaG9sZCBhIHRvdXJuYW1lbnQsIHlvdVxuXApyZXBsYWNlIGFuZCBwZXJjb2xhdGUgaXRlbXMgdGhhdCBoYXBwZW4gdG8gZml0IHRoZSBjdXJyZW50IHJ1biwgeW91J2xsXG5cCnByb2R1Y2UgcnVucyB3aGljaCBhcmUgdHdpY2UgdGhlIHNpemUgb2YgdGhlIG1lbW9yeSBmb3IgcmFuZG9tIGlucHV0LFxuXAphbmQgbXVjaCBiZXR0ZXIgZm9yIGlucHV0IGZ1enppbHkgb3JkZXJlZC5cbiIKIlxuXApNb3Jlb3ZlciwgaWYgeW91IG91dHB1dCB0aGUgMCd0aCBpdGVtIG9uIGRpc2sgYW5kIGdldCBhbiBpbnB1dCB3aGljaFxuXAptYXkgbm90IGZpdCBpbiB0aGUgY3VycmVudCB0b3VybmFtZW50IChiZWNhdXNlIHRoZSB2YWx1ZSBcIndpbnNcIiBvdmVyXG5cCnRoZSBsYXN0IG91dHB1dCB2YWx1ZSksIGl0IGNhbm5vdCBmaXQgaW4gdGhlIGhlYXAsIHNvIHRoZSBzaXplIG9mIHRoZVxuXApoZWFwIGRlY3JlYXNlcy4gIFRoZSBmcmVlZCBtZW1vcnkgY291bGQgYmUgY2xldmVybHkgcmV1c2VkIGltbWVkaWF0ZWx5XG5cCmZvciBwcm9ncmVzc2l2ZWx5IGJ1aWxkaW5nIGEgc2Vjb25kIGhlYXAsIHdoaWNoIGdyb3dzIGF0IGV4YWN0bHkgdGhlXG5cCnNhbWUgcmF0ZSB0aGUgZmlyc3QgaGVhcCBpcyBtZWx0aW5nLiAgV2hlbiB0aGUgZmlyc3QgaGVhcCBjb21wbGV0ZWx5XG5cCnZhbmlzaGVzLCB5b3Ugc3dpdGNoIGhlYXBzIGFuZCBzdGFydCBhIG5ldyBydW4uICBDbGV2ZXIgYW5kIHF1aXRlXG5cCmVmZmVjdGl2ZSFcblwKXG5cCkluIGEgd29yZCwgaGVhcHMgYXJlIHVzZWZ1bCBtZW1vcnkgc3RydWN0dXJlcyB0byBrbm93LiAgSSB1c2UgdGhlbSBpblxuXAphIGZldyBhcHBsaWNhdGlvbnMsIGFuZCBJIHRoaW5rIGl0IGlzIGdvb2QgdG8ga2VlcCBhIGBoZWFwJyBtb2R1bGVcblwKYXJvdW5kLiA6LSlcbiIKIlxuXAotLS0tLS0tLS0tLS0tLS0tLS0tLVxuXApbMV0gVGhlIGRpc2sgYmFsYW5jaW5nIGFsZ29yaXRobXMgd2hpY2ggYXJlIGN1cnJlbnQsIG5vd2FkYXlzLCBhcmVcblwKbW9yZSBhbm5veWluZyB0aGFuIGNsZXZlciwgYW5kIHRoaXMgaXMgYSBjb25zZXF1ZW5jZSBvZiB0aGUgc2Vla2luZ1xuXApjYXBhYmlsaXRpZXMgb2YgdGhlIGRpc2tzLiAgT24gZGV2aWNlcyB3aGljaCBjYW5ub3Qgc2VlaywgbGlrZSBiaWdcblwKdGFwZSBkcml2ZXMsIHRoZSBzdG9yeSB3YXMgcXVpdGUgZGlmZmVyZW50LCBhbmQgb25lIGhhZCB0byBiZSB2ZXJ5XG5cCmNsZXZlciB0byBlbnN1cmUgKGZhciBpbiBhZHZhbmNlKSB0aGF0IGVhY2ggdGFwZSBtb3ZlbWVudCB3aWxsIGJlIHRoZVxuXAptb3N0IGVmZmVjdGl2ZSBwb3NzaWJsZSAodGhhdCBpcywgd2lsbCBiZXN0IHBhcnRpY2lwYXRlIGF0XG5cClwicHJvZ3Jlc3NpbmdcIiB0aGUgbWVyZ2UpLiAgU29tZSB0YXBlcyB3ZXJlIGV2ZW4gYWJsZSB0byByZWFkXG5cCmJhY2t3YXJkcywgYW5kIHRoaXMgd2FzIGFsc28gdXNlZCB0byBhdm9pZCB0aGUgcmV3aW5kaW5nIHRpbWUuXG5cCkJlbGlldmUgbWUsIHJlYWwgZ29vZCB0YXBlIHNvcnRzIHdlcmUgcXVpdGUgc3BlY3RhY3VsYXIgdG8gd2F0Y2ghXG5cCkZyb20gYWxsIHRpbWVzLCBzb3J0aW5nIGhhcyBhbHdheXMgYmVlbiBhIEdyZWF0IEFydCEgOi0pXG4iKTsKClB5TU9ESU5JVF9GVU5DCmluaXRfaGVhcHEodm9pZCkKewogICAgUHlPYmplY3QgKm07CgogICAgbSA9IFB5X0luaXRNb2R1bGUzKCJfaGVhcHEiLCBoZWFwcV9tZXRob2RzLCBtb2R1bGVfZG9jKTsKICAgIGlmIChtID09IE5VTEwpCiAgICAgICAgcmV0dXJuOwogICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJfX2Fib3V0X18iLCBQeVN0cmluZ19Gcm9tU3RyaW5nKF9fYWJvdXRfXykpOwp9Cgo=