ZGlmZiAtLWdpdCBhL2FwL2xpYi9saWJhbXQvTWFrZWZpbGUgYi9hcC9saWIvbGliYW10L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4ODU0NjcKLS0tIC9kZXYvbnVsbAorKysgYi9hcC9saWIvbGliYW10L01ha2VmaWxlCkBAIC0wLDAgKzEsMzcgQEAKKyMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjIGluY2x1ZGUgWlRFIGxpYnJhcnkgbWFrZWZpbGUKKyMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitpbmNsdWRlICQoQ09NTU9OX01LKQorCisjIyMjIyMjIyMjIyMjI1VTRVIgQ09NSVpFIEJFR0lOIyMjIyMjIyMjIyMjIyMjIworTElCX1NUQVRJQyA9IGxpYmFtdC5hCitMSUJfU0hBUkVEID0gbGliYW10LnNvCisKK09CSlMgPSBhbXRudi5vCisKK0NGTEFHUyArPSAtZworI0xERkxBR1MgKz0gLWxwdGhyZWFkCisjIyMjIyMjIyMjIyMjI1VTRVIgQ09NSVpFIEVORCMjIyMjIyMjIyMjIyMjIyMjIworCitDRkxBR1MgKz0gLUkkKEFQUF9ESVIpL2luY2x1ZGUKK0NGTEFHUyArPSAtSSQoVE9QRElSKS9wdWIvcHJvamVjdC8kKENISVBfTkFNRSkvaW5jbHVkZS9udgorQ0ZMQUdTICs9IC1JJChMSU5VWF9ESVIpL2luY2x1ZGUKK0NGTEFHUyArPSAtSS8kKFRPUERJUikvcHViL3Byb2plY3QvJChDSElQX05BTUUpL2luY2x1ZGUvZHJ2CitDRkxBR1MgKz0gLUkvJChDUF9ST09UX0RJUikvcHMvZHJpdmVyL2luYy9taXNjCitDRkxBR1MgKz0gLWZQSUMKK0xERkxBR1MgKz0gLXNoYXJlZAorCithbGw6ICQoTElCX1NUQVRJQykgJChMSUJfU0hBUkVEKQorCiskKExJQl9TVEFUSUMpIDogJChPQkpTKQorCSQoQVIpIHJjcyAkKExJQl9TVEFUSUMpICQoT0JKUykKKworJChMSUJfU0hBUkVEKTogJChPQkpTKQorCSQoQ0MpICQoTERGTEFHUykgLW8gJEAgJF4KKworcm9tZnM6CisJJChST01GU0lOU1QpICQoTElCX1NIQVJFRCkgL2xpYi8kKExJQl9TSEFSRUQpCisKK2NsZWFuOgorCS0kKFJNKSAqLmEgKi5vICouc28gJChMSUJfU0hBUkVEKSAkKExJQl9TVEFUSUMpICQoT0JKUykKKwpkaWZmIC0tZ2l0IGEvYXAvbGliL2xpYmFtdC9hbXRudi5jIGIvYXAvbGliL2xpYmFtdC9hbXRudi5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmMxZDgxZmIKLS0tIC9kZXYvbnVsbAorKysgYi9hcC9saWIvbGliYW10L2FtdG52LmMKQEAgLTAsMCArMSw2ODkgQEAKKy8qKgorICogCisgKiBAZmlsZSAgICAgIGFtdG52LmMKKyAqIEBicmllZiAgICAgCisgKiAgICAgICAgICAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZUTS4KKyAqICAgICAgICAgICAgQU1UxKO/6U5WstnX973Tv9oKKyAqICAgICAgICAgICAgCisgKiBAZGV0YWlscyAgIAorICogQGF1dGhvciAgICBUb29scyBUZWFtLgorICogQGVtYWlsICAgICAKKyAqIEBjb3B5cmlnaHQgQ29weXJpZ2h0IChDKSAyMDEzIFNhbmVjaGlwcyBUZWNobm9sb2d5IENvLiwgTHRkLgorICogQHdhcm5pbmcgICAKKyAqIEBkYXRlICAgICAgMjAxOS8wMi8wMgorICogQHZlcnNpb24gICAxLjEKKyAqIEBwcmUgICAgICAgCisgKiBAcG9zdCAgICAgIAorICogICAgICAgICAgICAKKyAqIEBwYXIgICAgICAgCisgKiBDaGFuZ2UgSGlzdG9yeSA6CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIGRhdGUgICAgICAgIHZlcnNpb24gIGF1dGhvciAgICAgICAgIGRlc2NyaXB0aW9uCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIDIwMTgvMDQvMjggIDEuMCAgICAgIGxpdS54aW4gICAgICAgIENyZWF0ZSBmaWxlCisgKiAyMDE5LzAyLzAyICAxLjEgICAgICBqaWFuZy5mZW5nbGluICDQ3rjE16LKzbe9yr3OqmRveHlnZW4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogCisgKiAKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSAiYW10bnYuaCIKKyNpbmNsdWRlICJsaWJjcG52LmgiCisjaW5jbHVkZSAiY2ZnX2FwaS5oIgorI2luY2x1ZGUgIk52UGFyYW1fZHJ2LmgiCisKKy8qKgorICogyKu+1rHkwb+2qNLlCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBVSU5UMzIgICBkd01zZ0lEOworICAgIFVJTlQzMiAgIGR3QWRkcmVzczsKKyAgICBVSU5UMzIgICBkd1NpemU7Cit9IFRfekFNVF9Db21tTnZfSW5mbzsKKworY29uc3QgVF96QU1UX0NvbW1Odl9JbmZvIGdfYW10Q29tbU52Q2ZnW10gPQoreworICAgIHsgQUJJTUVJX05WUEFSQU0sICAgICAgICAgT1NfRkxBU0hfQU1UX0NPTU1fUk9fSU1FSV9BRERSRVNTLCAgICAgICAgT1NfRkxBU0hfQU1UX0NPTU1fUk9fSU1FSV9TSVpFICAgICAgICAgIH0sCisgICAgeyBBQklNRUlTVl9OVlBBUkFNLCAgICAgICBPU19GTEFTSF9BTVRfQ09NTV9ST19JTUVJU1ZfQUREUkVTUywgICAgICBPU19GTEFTSF9BTVRfQ09NTV9ST19JTUVJU1ZfU0laRSAgICAgICAgfSwKKyAgICB7IEFCQk9SRE5VbV9OVlBBUkFNLCAgICAgIE9TX0ZMQVNIX0FNVF9DT01NX1JPX0JPQVJETk5VTV9BRERSRVNTLCAgIE9TX0ZMQVNIX0FNVF9DT01NX1JPX0JPQVJETk5VTV9TSVpFICAgICB9LAorICAgIHsgQUJNU0VSSUFMTlVNX05WUEFSQU0sICAgT1NfRkxBU0hfQU1UX0NPTU1fUk9fTVNlcmlhbE51bV9BRERSRVNTLCAgT1NfRkxBU0hfQU1UX0NPTU1fUk9fTVNlcmlhbE51bV9TSVpFICAgIH0sCisgICAgeyBBQlZBTElERkxBR19OVlBBUkFNLCAgICBPU19GTEFTSF9BTVRfQ09NTV9ST19WYWxpZEZsYWdfQUREUkVTUywgICBPU19GTEFTSF9BTVRfQ09NTV9ST19WYWxpZEZsYWdfU0laRSAgICAgfSwKKyAgICB7IEFCTUFDX0lOVF9OVlBBUkFNLCAgICAgIE9TX0ZMQVNIX0FNVF9DT01NX1JPX0ludGVybmFsTUFDX0FERFJFU1MsIE9TX0ZMQVNIX0FNVF9DT01NX1JPX0ludGVybmFsTUFDX1NJWkUgICB9LAorICAgIHsgQUJNQUNfRVhUX05WUEFSQU0sICAgICAgT1NfRkxBU0hfQU1UX0NPTU1fUk9fRXh0ZXJuYWxNQUNfQUREUkVTUywgT1NfRkxBU0hfQU1UX0NPTU1fUk9fRXh0ZXJuYWxNQUNfU0laRSAgIH0sCisgICAgeyBBQk1BQ19XSUZJX05WUEFSQU0sICAgICBPU19GTEFTSF9BTVRfQ09NTV9ST19XSUZJTUFDX0FERFJFU1MsICAgICBPU19GTEFTSF9BTVRfQ09NTV9ST19XSUZJTUFDX1NJWkUgICAgICAgfSwKKyAgICB7IEFCTlZfVkVSU0lPTl9OVlBBUkFNLCAgIE9TX0ZMQVNIX0FNVF9DT01NX1JPX052VmVyc2lvbl9BRERSRVNTLCAgIE9TX0ZMQVNIX0FNVF9DT01NX1JPX052VmVyc2lvbl9TSVpFICAgICB9LAorICAgIHsgQUJURVNUSU5GT19OVlBBUkFNLCAgICAgT1NfRkxBU0hfQU1UX0NPTU1fUk9fVGVzdEluZm9fQUREUkVTUywgICAgT1NfRkxBU0hfQU1UX0NPTU1fUk9fVGVzdEluZm9fU0laRSAgICAgIH0sCisgICAgeyBBQlNPRlRWRVJTSU9OX05WUEFSQU0sICBPU19GTEFTSF9BTVRfQ09NTV9ST19TT0ZUVkVSU0lPTl9BRERSRVNTLCBPU19GTEFTSF9BTVRfQ09NTV9ST19TT0ZUVkVSU0lPTl9TSVpFICAgfSwKKyAgICB7IEFCTkVUX1Y0S0VZX05WUEFSQU0sICAgIE9TX0ZMQVNIX0FNVF9DT01NX1JPX1Y0S2V5X0FERFJFU1MsICAgICAgIE9TX0ZMQVNIX0FNVF9DT01NX1JPX1Y0S2V5X1NJWkUgICAgICAgICB9LAorICAgIHsgQUJTQUxFX1NUQVRFX05WUEFSQU0sICAgT1NfRkxBU0hfQU1UX0NPTU1fUk9fU2FsZVN0YXRlX0FERFJFU1MsICAgT1NfRkxBU0hfQU1UX0NPTU1fUk9fU2FsZVN0YXRlX1NJWkUgICAgIH0sCisgICAgeyBBQkJBTkRCSVRNQVBfTlZQQVJBTSwgICBPU19GTEFTSF9BTVRfQ09NTV9ST19CQU5EQklUTUFQX0FERFJFU1MsICBPU19GTEFTSF9BTVRfQ09NTV9ST19CQU5EQklUTUFQX1NJWkUgICAgfSwKKyAgICB7IEFCTUFDX0VUSF9OVlBBUkFNLCAgICAgIE9TX0ZMQVNIX0FNVF9DT01NX1JPX0VUSE1BQ19BRERSRVNTLCAgICAgIE9TX0ZMQVNIX0FNVF9DT01NX1JPX0VUSE1BQ19TSVpFICAgICAgICB9LAorICAgIHsgQUJORVRfTENPS0tFWV9OVlBBUkFNLCAgT1NfRkxBU0hfQU1UX0NPTU1fUk9fTG9ja0tleV9BRERSRVNTLCAgICAgT1NfRkxBU0hfQU1UX0NPTU1fUk9fTG9ja0tleV9TSVpFICAgICAgIH0sCisgICAgeyBBQk1BQ19XSUZJMl9OVlBBUkFNLCAgICBPU19GTEFTSF9BTVRfQ09NTV9ST19XSUZJTUFDMl9BRERSRVNTLCAgICBPU19GTEFTSF9BTVRfQ09NTV9ST19XSUZJTUFDMl9TSVpFICAgICAgfSwKKyAgICB7IEFCTUFDX1VTQk1BQ19OVlBBUkFNLCAgIE9TX0ZMQVNIX0FNVF9DT01NX1JPX1VTQk1BQ19BRERSRVNTLCAgICAgIE9TX0ZMQVNIX0FNVF9DT01NX1JPX1VTQk1BQ19TSVpFICAgICAgICB9LAorICAgIHsgQUJNQUNfR01BQ19OVlBBUkFNLCAgICAgT1NfRkxBU0hfQU1UX0NPTU1fUk9fR01BQ19BRERSRVNTLCAgICAgICAgT1NfRkxBU0hfQU1UX0NPTU1fUk9fR01BQ19TSVpFICAgICAgICAgIH0sCisgICAgeyBBQkZFQVRVUkVfS0VZX01ENV9OVlBBUkFNLAkgIE9TX0ZMQVNIX0FNVF9DT01NX1JPX0ZFQVRVUkVfS0VZX01ENV9BRERSRVNTLAlPU19GTEFTSF9BTVRfQ09NTV9ST19GRUFUVVJFX0tFWV9NRDVfU0laRX0sCisgICAgeyBBQkFVVEhfS0VZX05WUEFSQU0sICAgICBPU19GTEFTSF9BTVRfQ09NTV9ST19BVVRIX0tFWV9BRERSRVNTLCAgICAgICAgT1NfRkxBU0hfQU1UX0NPTU1fUk9fQVVUSF9LRVlfU0laRSAgfSwKKyAgICB7IEFCU09GVERPR19DSVBIRVJfVEVYVF9OVlBBUkFNLCAgICAgT1NfRkxBU0hfQU1UX0NPTU1fUk9fU09GVERPR19DSVBIRVJfVEVYVF9BRERSRVNTLCAgIE9TX0ZMQVNIX0FNVF9DT01NX1JPX1NPRlRET0dfQ0lQSEVSX1RFWFRfU0laRSAgfSwKKyAgICB7IEFCR0JEQVRBX05WUEFSQU0sICAgICAgIE9TX0ZMQVNIX0FNVF9DT01NX1JPX0dCREFUQV9BRERSRVNTLCAgICAgIE9TX0ZMQVNIX0FNVF9DT01NX1JPX0dCREFUQV9TSVpFICAgICAgICB9LAorfTsKKworU0lOVDMyIEdldEJpdE9mZnNldChTSU5UMzIgdGVzdEl0ZW0pCit7CisgICAgcmV0dXJuIDIgKiAoMyAtICh0ZXN0SXRlbSAlIDQpKTsKK30KKworLyoqCisgKiBAYnJpZWYg0LRudnJvCisgKiBAcGFyYW0gZHdTdGFydCBudsbwyry12Na3xqvSxiwwIH4gMk0tMSBieXRlcworICogQHBhcmFtIGR3TGVuIG52s6S2yCwxIH4gMk0gYnl0ZXMKKyAqIEBwYXJhbSBmcm9tILT90LTI67XEyv2+3QorICogQHJldHVybiAwILPJuaYgIAorICogQHJldHVybiAtMSDKp7DcCisgKiBAbm90ZSAgIAorICogQHdhcm5pbmcgCisgKi8KK3Vuc2lnbmVkIGludCBhbXRfbnZyb193cml0ZSh1bnNpZ25lZCBpbnQgZHdTdGFydCwgdW5zaWduZWQgaW50IGR3TGVuLCB1bnNpZ25lZCBjaGFyICpmcm9tKQoreworICAgIFVJTlQzMiAgcmV0Q29kZSA9IENQTlZfRVJST1I7CisKKyAgICAvKtXiwO/K18/ItffTw8f9tq+907/at8W/qrbU1ru2wcf40/LQtLLZ1/e1xM/e1sYqLworCS8qYW10xKPKvc/Co6x6dGVfYW1006bTw8bwwLTWrrrz0tG+rbnSs8m/ydC0tcTByyovCisJaWYoIWlzX2FtdF9tb2RlKCkpIAorCXsKKwkgICAgcmV0Q29kZSA9IGNwbnZfQ2hhbmdlRnNQYXJ0aXRpb25BdHRyKEZTX05WUk9GUywgMSk7CisJICAgIGlmKENQTlZfT0sgIT0gcmV0Q29kZSkKKwkgICAgeworCSAgICAgICAgcmV0dXJuIHJldENvZGU7CisJICAgIH0KKwl9CisKKyAgICByZXRDb2RlID0gY3Budl9Odkl0ZW1Xcml0ZU52cm8oZHdTdGFydCwgZnJvbSwgZHdMZW4pOworICAgIGlmKENQTlZfT0sgIT0gcmV0Q29kZSkKKyAgICB7CisgICAgICAgIHJldHVybiByZXRDb2RlOworICAgIH0KKworICAgIGNwbnZfRnNHY1dhaXQoRlNfTlZST0ZTKTsKKwlpZighaXNfYW10X21vZGUoKSkgCisJeworCSAgICByZXRDb2RlID0gY3Budl9DaGFuZ2VGc1BhcnRpdGlvbkF0dHIoRlNfTlZST0ZTLCAwKTsKKwkgICAgaWYoQ1BOVl9PSyAhPSByZXRDb2RlKQorCSAgICB7CisJICAgICAgICByZXR1cm4gcmV0Q29kZTsKKwkgICAgfQorCX0KKwlyZXR1cm4gcmV0Q29kZTsKK30KKworLyoqCisgKiBAYnJpZWYgtsFudnJvCisgKiBAcGFyYW0gZHdTdGFydCBudsbwyry12Na3xqvSxiwwIH4gMk0tMSBieXRlcworICogQHBhcmFtIGR3TGVuIG52s6S2yCwxIH4gMk0gYnl0ZXMKKyAqIEBwYXJhbSB0byC2wbP2tcTK/b7dCisgKiBAcmV0dXJuIDAgs8m5piAgCisgKiBAcmV0dXJuIC0xIMqnsNwKKyAqIEBub3RlICAgCisgKiBAd2FybmluZyAKKyAqLwordW5zaWduZWQgaW50IGFtdF9udnJvX3JlYWQodW5zaWduZWQgaW50IGR3U3RhcnQsIHVuc2lnbmVkIGludCBkd0xlbiwgdW5zaWduZWQgY2hhciAqdG8pCit7CisgICAgdW5zaWduZWQgaW50IHJldCA9IENQTlZfRVJST1I7CisgICAgdW5zaWduZWQgaW50IG1heF9sZW5ndGggPSBPU19GTEFTSF9ST19OVlJBTV9TSVpFICsgT1NfRkxBU0hfUk9XX05WUkFNX1NJWkU7CisgICAgCisgICAgaWYgKGR3U3RhcnQgPj0gbWF4X2xlbmd0aCB8fCBkd0xlbiA+IG1heF9sZW5ndGggfHwgKGR3U3RhcnQgKyBkd0xlbikgPiBtYXhfbGVuZ3RoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICAKKyAgICByZXQgPSBjcG52X052SXRlbVJlYWQoZHdTdGFydCwgdG8sIGR3TGVuKTsKKyAgICAKKyAgICBpZihyZXQgPT0gIENQTlZfRVJST1IpCisgICAgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworfQorCisvKioKKyAqIEBicmllZiDQtNK7z+5OVlJPyv2+3QorICogQHBhcmFtIG52UGFyYW0guMNOVs/uwODQzQorICogQHBhcmFtIE52SXRlbURhdGEgtP3QtMjryv2+3bXEtdjWtworICogQHBhcmFtIE52SXRlbUxlbiDK/b7ds6S2yAorICogQHJldHVybiAwILPJuaYgIAorICogQHJldHVybiAtMSDKp7DcCisgKiBAbm90ZSAgIAorICogQHdhcm5pbmcgCisgKi8KK2ludCAgYW10X3dyaXRlX252X2l0ZW0oTnZQYXJhbV9BTVQgbnZQYXJhbSwgVUlOVDggKk52SXRlbURhdGEsIFVJTlQzMiBOdkl0ZW1MZW4pCit7CisgICAgVUlOVDMyICByZXRDb2RlID0gQ1BOVl9FUlJPUjsKKyAgICBVSU5UMzIgIGkgPSAwOworCisgICAgaWYgKG52UGFyYW0gPj0gTUFYQUJOVlBBUkFNX05WUEFSQU0gfHwgTlVMTCA9PSBOdkl0ZW1EYXRhIHx8IE52SXRlbUxlbiA9PSAwKQorICAgIHsKKyAgICAgICAgcmV0dXJuICAtMTsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgKHNpemVvZihnX2FtdENvbW1OdkNmZykgLyBzaXplb2YgKGdfYW10Q29tbU52Q2ZnWzBdKSk7IGkrKykKKyAgICB7CisgICAgICAgIGlmICggbnZQYXJhbSA9PSBnX2FtdENvbW1OdkNmZ1tpXS5kd01zZ0lEICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKE52SXRlbUxlbiA+IGdfYW10Q29tbU52Q2ZnW2ldLmR3U2l6ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBOdkl0ZW1MZW4gPSBnX2FtdENvbW1OdkNmZ1tpXS5kd1NpemU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldENvZGUgPSBhbXRfbnZyb193cml0ZShnX2FtdENvbW1OdkNmZ1tpXS5kd0FkZHJlc3MsIE52SXRlbUxlbiwgTnZJdGVtRGF0YSk7CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgICAgICAgICAgCisgICAgaWYgKHJldENvZGUgIT0gQ1BOVl9PSykKKyAgICB7CisgICAgICAgIGFzc2VydCgwKTsKKyAgICB9CisgICAgcmV0dXJuICAwOworfQorCisvKioKKyAqIEBicmllZiC2wbP20rvP7k5WUk/K/b7dCisgKiBAcGFyYW0gbnZQYXJhbSAguMNOVs/uwODQzQorICogQHBhcmFtIE52SXRlbURhdGEgtsGz9rXEyv2+3QorICogQHBhcmFtIE52SXRlbUxlbiAgyv2+3bOktsgKKyAqIEByZXR1cm4gMCCzybmmICAKKyAqIEByZXR1cm4gLTEgyqew3AorICogQG5vdGUgICAKKyAqIEB3YXJuaW5nIAorICovCitpbnQgYW10X3JlYWRfbnZfaXRlbShOdlBhcmFtX0FNVCBudlBhcmFtLFVJTlQ4ICpOdkl0ZW1EYXRhLCBVSU5UMzIgTnZJdGVtTGVuKQoreworICAgIFVJTlQzMiAgcmV0Q29kZSA9IENQTlZfRVJST1I7CisgICAgVUlOVDMyICBpID0gMDsKKworICAgIC8vICB6T3NzX1ByaW50ZigweDdmLCAweDIsIlt6UFNfTnZBTVRJdGVtUmVhZF1udlBhcmFtIGlzICVkIGFuZCBOdkl0ZW1MZW4gaXMgJWRcbiIsbnZQYXJhbSxOdkl0ZW1MZW4pOworICAgIGlmIChudlBhcmFtID49IE1BWEFCTlZQQVJBTV9OVlBBUkFNIHx8IE5VTEwgPT0gTnZJdGVtRGF0YSB8fCBOdkl0ZW1MZW4gPT0gMCkKKyAgICB7CisgICAgICAgIHJldHVybiAgLTE7CisgICAgfQorCisgICAvKiBpZiAoQUJCQU5EQklUTUFQX05WUEFSQU0gPT0gbnZQYXJhbSkKKyAgICB7CisgICAgICAgIEJZVEUgYmFuZF9iaXRfbWFwX2ZsYWcgPSAwOworICAgICAgICB6UFNfTnZBTUZsYWdzVEl0ZW1SZWFkKEJBTkRfQklUX01BUF9GTEFHLCAmYmFuZF9iaXRfbWFwX2ZsYWcpOworCisgICAgICAgIGlmIChiYW5kX2JpdF9tYXBfZmxhZyAhPSAnMScpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldENvZGUgPSB6UHNfTnZDaGVja0JhbmRCaXRtYXAoTnZJdGVtRGF0YSwgTnZJdGVtTGVuKTsKKworICAgICAgICAgICAgcmV0dXJuIHJldENvZGU7CisgICAgICAgIH0KKyAgICB9Ki8KKyAgICBmb3IgKGkgPSAwOyBpIDwgKHNpemVvZihnX2FtdENvbW1OdkNmZykgLyBzaXplb2YgKGdfYW10Q29tbU52Q2ZnWzBdKSk7IGkrKykKKyAgICB7CisgICAgICAgIGlmICggbnZQYXJhbSA9PSBnX2FtdENvbW1OdkNmZ1tpXS5kd01zZ0lEICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKE52SXRlbUxlbiA+IGdfYW10Q29tbU52Q2ZnW2ldLmR3U2l6ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBOdkl0ZW1MZW4gPSBnX2FtdENvbW1OdkNmZ1tpXS5kd1NpemU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXRDb2RlID0gY3Budl9Odkl0ZW1SZWFkKGdfYW10Q29tbU52Q2ZnW2ldLmR3QWRkcmVzcywgTnZJdGVtRGF0YSwgTnZJdGVtTGVuKTsKKyAgICAgICAgICAgIGJyZWFrOyAgICAgICAgCisgICAgICAgIH0KKyAgICB9CisgICAgaWYocmV0Q29kZSA9PSBDUE5WX0VSUk9SKQorICAgIHsKKyAgICAgICAgIHJldHVybiAgLTE7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgICByZXR1cm4gIDA7CisgICAgfQorfQorCisvKioKKyAqIEBicmllZiDQtMn6svqy4srUserWvs67CisgKiBAcGFyYW0gbnZQYXJhbSAgyfqy+rLiytSx6ta+zrvP7sO2vtnWtQorICogQHBhcmFtIE52SXRlbURhdGEgtP3QtMjryv2+3QorICogQHJldHVybiAwILPJuaYgIAorICogQHJldHVybiAtMSDKp7DcCisgKiBAbm90ZSAgIAorICogQHdhcm5pbmcgCisgKi8KK2ludCBhbXRfd3JpdGVfdGVzdF9mbGFnX2l0ZW0oTnZQYXJhbV9BTVRGbGFncyBudlBhcmFtLFVJTlQ4ICpOdkl0ZW1EYXRhKQoreworICAgIFVJTlQzMiByZXRDb2RlID0gQ1BOVl9FUlJPUjsKKyAgICBVSU5UMzIgQU1URmxhZ0FkZHJlc3MgPSAwOworICAgIEJZVEUgICBwVGVzdEluZm9CdWZbMV07CisgICAgQllURSAgICpwQnl0ZTsKKyAgICBpbnQgYnl0ZUluZGV4ID0gMDsKKworICAgIGlmIChudlBhcmFtID49IE1BWEFNVEZBTEdTX05WUEFSQU0pCisgICAgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIG1lbXNldChwVGVzdEluZm9CdWYsIDAsIHNpemVvZihwVGVzdEluZm9CdWYpKTsKKyAgICBieXRlSW5kZXggPSBudlBhcmFtLzQ7IC8v0qrQtLXEserWvs67z+C21NPaserWvs67yte12Na3tcTGq9LGCisgICAgQU1URmxhZ0FkZHJlc3MgPSBPU19GTEFTSF9BTVRfQ09NTV9ST19UZXN0SW5mb19BRERSRVNTICsgYnl0ZUluZGV4OworCisgICAgLyrK18/IvatOVtbQtcTE2sjdtsG1vXBUZXN0SW5mb0J1ZtbQKi8KKyAgICByZXRDb2RlID0gY3Budl9Odkl0ZW1SZWFkKEFNVEZsYWdBZGRyZXNzICwgcFRlc3RJbmZvQnVmLDEpOworICAgIGlmIChDUE5WX0VSUk9SID09cmV0Q29kZSApCisgICAgeworICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgLyrQ3rjEz+DTprXEserWvs67Ki8KKyAgICBwQnl0ZSA9IHBUZXN0SW5mb0J1ZiA7CisgICAgKnBCeXRlICY9IH4oMHgwMyA8PCBHZXRCaXRPZmZzZXQobnZQYXJhbSkpOworICAgICpwQnl0ZSB8PSAoKk52SXRlbURhdGEtMHgzMCkgPDwgR2V0Qml0T2Zmc2V0KG52UGFyYW0pOworICAgIAorCisgICAgLyrQ3rjE1q6689C0yOsqLworICAgIHJldENvZGUgPSBhbXRfbnZyb193cml0ZShBTVRGbGFnQWRkcmVzcywgMSwgcFRlc3RJbmZvQnVmKTsKKworICAgIGlmIChDUE5WX0VSUk9SID09cmV0Q29kZSApCisgICAgeworICAgICAgICBhc3NlcnQoMCk7CisgICAgfQorICAgIHJldHVybiAgMDsKK30KKworLyoqCisgKiBAYnJpZWYgtsHJ+rL6suLK1LHq1r7OuworICogQHBhcmFtIG52UGFyYW0gIMn6svqy4srUserWvs67z+7Dtr7Z1rUKKyAqIEBwYXJhbSBOdkl0ZW1EYXRhILbBs/a1xMr9vt0KKyAqIEByZXR1cm4gMCCzybmmICAKKyAqIEByZXR1cm4gLTEgyqew3AorICogQG5vdGUgICAKKyAqIEB3YXJuaW5nIAorICovCitpbnQgYW10X3JlYWRfdGVzdF9mbGFnX2l0ZW0oTnZQYXJhbV9BTVRGbGFncyBudlBhcmFtLFVJTlQ4ICpOdkl0ZW1EYXRhKQoreworICAgIFVJTlQzMiByZXRDb2RlID0gQ1BOVl9FUlJPUjsKKyAgICBVSU5UMzIgQU1URmxhZ0FkZHJlc3MgPSAwOworICAgIEJZVEUgICBwVGVzdEluZm9CdWZbMV07CisgICAgQllURSBieXRlVmFsID0gMDsKKyAgICBCWVRFIGJ5dGVSZXQgPSAwOworICAgIGludCBieXRlSW5kZXggPSAwOworCisgICAgaWYgKG52UGFyYW0gPj0gTUFYQU1URkFMR1NfTlZQQVJBTSkKKyAgICB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgCisgICAgYnl0ZUluZGV4ID0gbnZQYXJhbS80OyAvL9KqtsG1xLHq1r7Ou8/gttTT2rHq1r7Ou8rXtdjWt7XExqvSxgorICAgIEFNVEZsYWdBZGRyZXNzID0gT1NfRkxBU0hfQU1UX0NPTU1fUk9fVGVzdEluZm9fQUREUkVTUyArIGJ5dGVJbmRleDsKKyAgICAvKsrXz8i9q05W1tC1xMTayN22wbW9cFRlc3RJbmZvQnVm1tAqLworICAgIHJldENvZGUgPSBjcG52X052SXRlbVJlYWQoQU1URmxhZ0FkZHJlc3MscFRlc3RJbmZvQnVmLCAxKTsKKyAgICBpZiAoQ1BOVl9FUlJPUiA9PXJldENvZGUgKQorICAgIHsKKyAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIC8qtsHIobbU06a1xGJpdM67Ki8KKyAgCisgICAgYnl0ZVZhbCA9KCAoKnBUZXN0SW5mb0J1ZiApID4+IEdldEJpdE9mZnNldChudlBhcmFtKSkgJiAweDAzOworICAgIAorICAgIHN3aXRjaCAoYnl0ZVZhbCkKKyAgICB7CisgICAgY2FzZSAwOgorICAgICAgICBieXRlUmV0ID0gMHgzMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgICBieXRlUmV0ID0gMHgzMTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgICBieXRlUmV0ID0gMHgzMjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzOgorICAgICAgICBieXRlUmV0ID0gMHgzMzsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIAorICAgIG1lbWNweShOdkl0ZW1EYXRhLCAmYnl0ZVJldCwgc2l6ZW9mKGJ5dGVSZXQpKTsKKyAgICAjaWYgMAorICAgIGlmIChDUE5WX0VSUk9SID09cmV0Q29kZSApCisgICAgeworICAgICAgICBhc3NlcnQoMCk7CisgICAgfQorICAgICNlbmRpZgorICAgIHJldHVybiAwOworfQorCisvKioKKyAqIEBicmllZiBOVlJP08O7p9fUtqjS5cf40/K2wbqvyv0KKyAqIEBwYXJhbSBkd1N0YXJ0IG52xvDKvLXY1rfGq9LGLDAgfiAxMDIzCisgKiBAcGFyYW0gZHdMZW4gbnazpLbILDEgfiAxMDI0IGJ5dGVzCisgKiBAcGFyYW0gZnJvbSC0/dC0yOu1xMr9vt0KKyAqIEByZXR1cm4gMCCzybmmICAKKyAqIEByZXR1cm4gLTEgyqew3AorICogQG5vdGUgICAKKyAqIEB3YXJuaW5nIAorICovCisgaW50IGFtdF9udnJvX3VzZXJfd3JpdGUoVUlOVDMyIGR3U3RhcnQsIFVJTlQzMiBkd0xlbiwgVUlOVDgqIGZyb20pCisgeworICAgIHVuc2lnbmVkIGludCAgcmV0ID0gQ1BOVl9FUlJPUjsKKyAgICAKKyAgICBpZiAoZHdTdGFydCA+PSBPU19GTEFTSF9BTVRfQ09NTV9ST19VU0VSX0RFRklORV9TSVpFIHx8IGR3TGVuID4gT1NfRkxBU0hfQU1UX0NPTU1fUk9fVVNFUl9ERUZJTkVfU0laRSB8fCAoZHdTdGFydCArIGR3TGVuKSA+IE9TX0ZMQVNIX0FNVF9DT01NX1JPX1VTRVJfREVGSU5FX1NJWkUpCisgICAgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgcmV0ID0gYW10X252cm9fd3JpdGUoZHdTdGFydCArIE9TX0ZMQVNIX0FNVF9DT01NX1JPX1VTRVJfREVGSU5FX0FERFJFU1MsIGR3TGVuLCBmcm9tKTsKKworICAgIGNwbnZfRnNHY1dhaXQoRlNfTlZST0ZTKTsKKyAgICAgICAgIAorICAgIGlmKHJldCA9PSBDUE5WX0VSUk9SKQorICAgIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgCisgfQorCisvKioKKyAqIEBicmllZiBOVlJP08O7p9fUtqjS5cf40/LQtLqvyv0KKyAqIEBwYXJhbSBkd1N0YXJ0IG52xvDKvLXY1rfGq9LGLDAgfiAxMDIzCisgKiBAcGFyYW0gZHdMZW4gbnazpLbILDEgfiAxMDI0IGJ5dGVzCisgKiBAcGFyYW0gZnJvbSC2wbP2tcTK/b7dCisgKiBAcmV0dXJuIDAgs8m5piAgCisgKiBAcmV0dXJuIC0xIMqnsNwKKyAqIEBub3RlICAgCisgKiBAd2FybmluZyAKKyAqLworaW50IGFtdF9udnJvX3VzZXJfcmVhZChVSU5UMzIgZHdTdGFydCwgVUlOVDMyIGR3TGVuLCBVSU5UOCogdG8pCit7CisgICAgdW5zaWduZWQgaW50IHJldCA9IENQTlZfRVJST1I7CisgICAgCisgICAgaWYgKGR3U3RhcnQgPj0gT1NfRkxBU0hfQU1UX0NPTU1fUk9fVVNFUl9ERUZJTkVfU0laRSB8fCBkd0xlbiA+IE9TX0ZMQVNIX0FNVF9DT01NX1JPX1VTRVJfREVGSU5FX1NJWkUgfHwgKGR3U3RhcnQgKyBkd0xlbikgPiBPU19GTEFTSF9BTVRfQ09NTV9ST19VU0VSX0RFRklORV9TSVpFKQorICAgIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICAKKyAgICByZXQgPSBjcG52X052SXRlbVJlYWQoZHdTdGFydCArIE9TX0ZMQVNIX0FNVF9DT01NX1JPX1VTRVJfREVGSU5FX0FERFJFU1MsIHRvLGR3TGVuKTsKKyAgICAKKyAgICBpZihyZXQgPT0gIENQTlZfRVJST1IpCisgICAgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KK30KKworLyoqCisgKiBAYnJpZWYgTlZST7LOv7zJ6LzG19S2qNLlx/jT8tC0uq/K/QorICogQHBhcmFtIGR3U3RhcnQgbnbG8Mq8tdjWt8ar0sYsMCB+IDEwMjMKKyAqIEBwYXJhbSBkd0xlbiBudrOktsgsMSB+IDEwMjQgYnl0ZXMKKyAqIEBwYXJhbSBmcm9tILT90LTI67XEyv2+3QorICogQHJldHVybiAwILPJuaYgIAorICogQHJldHVybiAtMSDKp7DcCisgKiBAbm90ZSAgIAorICogQHdhcm5pbmcgCisgKi8KK2ludCBhbXRfbnZyb19yZWZfd3JpdGUoVUlOVDMyIGR3U3RhcnQsIFVJTlQzMiBkd0xlbiwgVUlOVDgqIGZyb20pCit7CisgICAgdW5zaWduZWQgaW50IHJldCA9IENQTlZfRVJST1I7CisgICAgCisgICAgaWYgKGR3U3RhcnQgPj0gT1NfRkxBU0hfQU1UX0NPTU1fUk9fUkVGX0RFRklORV9TSVpFIHx8IGR3TGVuID4gT1NfRkxBU0hfQU1UX0NPTU1fUk9fUkVGX0RFRklORV9TSVpFIHx8IChkd1N0YXJ0ICsgZHdMZW4pID4gT1NfRkxBU0hfQU1UX0NPTU1fUk9fUkVGX0RFRklORV9TSVpFKQorICAgIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHJldCA9IGFtdF9udnJvX3dyaXRlKGR3U3RhcnQgKyBPU19GTEFTSF9BTVRfQ09NTV9ST19SRUZfREVGSU5FX0FERFJFU1MsIGR3TGVuLCBmcm9tKTsKKyAgICAKKyAgICBpZihyZXQgPT0gIENQTlZfRVJST1IpCisgICAgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KK30KKworLyoqCisgKiBAYnJpZWYgTlZST7LOv7zJ6LzG19S2qNLlx/jT8rbBuq/K/QorICogQHBhcmFtIGR3U3RhcnQgbnbG8Mq8tdjWt8ar0sYsMCB+IDEwMjMKKyAqIEBwYXJhbSBkd0xlbiBudrOktsgsMSB+IDEwMjQgYnl0ZXMKKyAqIEBwYXJhbSB0byC2wbP2tcTK/b7dCisgKiBAcmV0dXJuIDAgs8m5piAgCisgKiBAcmV0dXJuIC0xIMqnsNwKKyAqIEBub3RlICAgCisgKiBAd2FybmluZyAKKyAqLworaW50IGFtdF9udnJvX3JlZl9yZWFkKFVJTlQzMiBkd1N0YXJ0LCBVSU5UMzIgZHdMZW4sIFVJTlQ4KiB0bykKK3sKKyAgICB1bnNpZ25lZCBpbnQgIHJldCA9IENQTlZfRVJST1I7CisgICAgCisgICAgaWYgKGR3U3RhcnQgPj0gT1NfRkxBU0hfQU1UX0NPTU1fUk9fUkVGX0RFRklORV9TSVpFIHx8IGR3TGVuID4gT1NfRkxBU0hfQU1UX0NPTU1fUk9fUkVGX0RFRklORV9TSVpFIHx8IChkd1N0YXJ0ICsgZHdMZW4pID4gT1NfRkxBU0hfQU1UX0NPTU1fUk9fUkVGX0RFRklORV9TSVpFKQorICAgIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICAKKyAgICByZXQgPSBjcG52X052SXRlbVJlYWQoZHdTdGFydCArIE9TX0ZMQVNIX0FNVF9DT01NX1JPX1JFRl9ERUZJTkVfQUREUkVTUywgdG8sZHdMZW4pOworICAgIAorICAgIGlmKHJldCA9PSAgQ1BOVl9FUlJPUikKKyAgICB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorfQorCisKKyAvKioKKyAqIEBicmllZiDTptPDsuPF0LbPtbHHsMrHt/HKx2FtdMSjyr0KKyAqIEBwYXJhbSAKKyAqIEByZXR1cm4gMSBhbXTEo8q9CisgKiBAcmV0dXJuIDAgbm9ybWFsxKPKvQorICogQG5vdGUgICAKKyAqIEB3YXJuaW5nIAorICovCitpbnQgaXNfYW10X21vZGUodm9pZCkKK3sKKyAgICBjaGFyIHZlck1vZGVbNF0gPSB7MH07CisgICAgaW50IHJldCA9IDA7CisKKyAgICByZXQgPSBzY19jZmdfZ2V0KCJ2ZXJfbW9kZSIsIHZlck1vZGUsIHNpemVvZih2ZXJNb2RlKSk7CisgICAgaWYoIXN0cm5jbXAodmVyTW9kZSwgIjAiLCBzdHJsZW4oIjAiKSkpCisgICAgeworICAgICAgICByZXQgPSAxOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXQgPSAwOworICAgIH0KKwkKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIEBicmllZiDJ6NbDYm9vdMb0tq/Eo8q9CisgKiBAcGFyYW0gYm9vdG1vZGUgMrj219a92rXEserKtjogCisgKiAgICAgICAgICAgICAgezB4NTQsMHgwMH0gOiB1c2VyLAorICogICAgICAgICAgICAgIHsweDU0LDB4MDF9IDogZGVidWcsCisgKiAgICAgICAgICAgICAgezB4NTQsMHgwMn0gOiBmYWN0b3J5LAorICogICAgICAgICAgICAgIHsweDU0LDB4NER9IDogYW10LAorICogQHJldHVybiAwILPJuaYgIAorICogQHJldHVybiAtMSDKp7DcCisgKiBAbm90ZSAgIAorICogQHdhcm5pbmcgCisgKi8KK3Vuc2lnbmVkIGludCBhbXRfc2V0X2Jvb3Rtb2RlKHVuc2lnbmVkIGNoYXIgIGJvb3Rtb2RlW10pCit7CisgICAgdW5zaWduZWQgaW50ICByZXQgPSBDUE5WX09LOworCisgICAgaWYoQ1BOVl9FUlJPUiA9PSBjcG52X0NoYW5nZUZzUGFydGl0aW9uQXR0cihGU19JTUFHRUZTLCAxKSkKKyAgICB7CisgICAgICAgIHByaW50ZigiY3Budl9DaGFuZ2VGc1BhcnRpdGlvbkF0dHIgZmFpbGVkXHJcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldCA9IGNwbnZfTnZJdGVtV3JpdGUoT1NfRkxBU0hfVFNQX1JXX05PTkZBQ19PRkZTRVRfRlJPTV9OViwgYm9vdG1vZGUsIDIpOworICAgIGlmKENQTlZfRVJST1IgPT0gcmV0KQorICAgIHsKKyAgICAgICAgcHJpbnRmKCJjcG52X052SXRlbVdyaXRlIGJvb3Rtb2RlIGZhaWwgIVxuIik7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIAorICAgIGNwbnZfTnZJdGVtV3JpdGVGYWN0b3J5KE9TX0ZMQVNIX1RTUF9SV19OT05GQUNfT0ZGU0VUX0ZST01fTlYsIGJvb3Rtb2RlLCAyKTsKKyAgICByZXQgPSBjcG52X052cmFtRmx1c2goKTsKKyAgICBpZihDUE5WX0VSUk9SID09IHJldCkKKyAgICB7CisgICAgICAgIHByaW50ZigiY3Budl9OdnJhbUZsdXNoIGJvb3Rtb2RlIGZhaWwgIVxuIik7CisgICAgfQorICAgIAorICAgIGNwbnZfRnNHY1dhaXQoRlNfSU1BR0VGUyk7CisgICAgaWYoQ1BOVl9FUlJPUiA9PSBjcG52X0NoYW5nZUZzUGFydGl0aW9uQXR0cihGU19JTUFHRUZTLCAwKSkKKyAgICB7CisgICAgICAgIHByaW50ZigiY3Budl9DaGFuZ2VGc1BhcnRpdGlvbkF0dHIgZmFpbGVkXHJcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKwordW5zaWduZWQgaW50IGFtdF9zZXRfYmF0ZGV0X2ZsYWcoaW50IGJhdGRldF92YWx1ZSkKK3sKKwl1bnNpZ25lZCBpbnQgIHJldCA9IENQTlZfT0s7CisKKyAgICBpZihDUE5WX0VSUk9SID09IGNwbnZfQ2hhbmdlRnNQYXJ0aXRpb25BdHRyKEZTX0lNQUdFRlMsIDEpKQorICAgIHsKKyAgICAgICAgcHJpbnRmKCJjcG52X0NoYW5nZUZzUGFydGl0aW9uQXR0ciBmYWlsZWRcclxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0ID0gY3Budl9Odkl0ZW1Xcml0ZShEUlZfUEVSSV9OVl9BRERSLCh1bnNpZ25lZCBjaGFyKikmYmF0ZGV0X3ZhbHVlLDEpOworICAgIGlmKENQTlZfRVJST1IgPT0gcmV0KQorICAgIHsKKyAgICAgICAgcHJpbnRmKCJjcG52X052SXRlbVdyaXRlIGJhdGRldF92YWx1ZSBmYWlsICFcbiIpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICAKKyAgICBjcG52X052SXRlbVdyaXRlRmFjdG9yeShEUlZfUEVSSV9OVl9BRERSLCAodW5zaWduZWQgY2hhciopJmJhdGRldF92YWx1ZSwxKTsKKyAgICByZXQgPSBjcG52X052cmFtRmx1c2goKTsKKyAgICBpZihDUE5WX0VSUk9SID09IHJldCkKKyAgICB7CisgICAgICAgIHByaW50ZigiY3Budl9OdnJhbUZsdXNoIGJhdGRldF92YWx1ZSBmYWlsICFcbiIpOworICAgIH0KKyAgICAKKyAgICBjcG52X0ZzR2NXYWl0KEZTX0lNQUdFRlMpOworICAgIGlmKENQTlZfRVJST1IgPT0gY3Budl9DaGFuZ2VGc1BhcnRpdGlvbkF0dHIoRlNfSU1BR0VGUywgMCkpCisgICAgeworICAgICAgICBwcmludGYoImNwbnZfQ2hhbmdlRnNQYXJ0aXRpb25BdHRyIGZhaWxlZFxyXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK3Vuc2lnbmVkIGludCBhbXRfZ2V0X2JhdGRldF9mbGFnKGludCAqcGJhdGRldF92YWx1ZSkKK3sKKwl1bnNpZ25lZCBpbnQgcmV0Q29kZT0gQ1BOVl9FUlJPUjsKKyAgIAorICAgIHJldENvZGUgPWNwbnZfTnZJdGVtUmVhZChEUlZfUEVSSV9OVl9BRERSLCAodW5zaWduZWQgY2hhciAqKXBiYXRkZXRfdmFsdWUsIDEpOworCisJcmV0dXJuIHJldENvZGU7CisgICAgCit9CisKK3Vuc2lnbmVkIGludCBhbXRfc2V0X2FtdF9hdG1vZGUodW5zaWduZWQgY2hhciAgYm9vdG1vZGVbXSx1bnNpZ25lZCBjaGFyICBhdG1vZGVbXSkKK3sKKwkgdW5zaWduZWQgaW50ICByZXQgPSBDUE5WX09LOworCisgICAgaWYoQ1BOVl9FUlJPUiA9PSBjcG52X0NoYW5nZUZzUGFydGl0aW9uQXR0cihGU19JTUFHRUZTLCAxKSkKKyAgICB7CisgICAgICAgIHByaW50ZigiY3Budl9DaGFuZ2VGc1BhcnRpdGlvbkF0dHIgZmFpbGVkXHJcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldCA9IGNwbnZfTnZJdGVtV3JpdGUoT1NfRkxBU0hfVFNQX1JXX05PTkZBQ19PRkZTRVRfRlJPTV9OViwgYm9vdG1vZGUsIDIpOworICAgIGlmKENQTlZfRVJST1IgPT0gcmV0KQorICAgIHsKKyAgICAgICAgcHJpbnRmKCJjcG52X052SXRlbVdyaXRlIGJvb3Rtb2RlIGZhaWwgIVxuIik7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIGNwbnZfTnZJdGVtV3JpdGVGYWN0b3J5KE9TX0ZMQVNIX1RTUF9SV19OT05GQUNfT0ZGU0VUX0ZST01fTlYsIGJvb3Rtb2RlLCAyKTsKKwkKKyAgICByZXQgPSBjcG52X052SXRlbVdyaXRlKE9TX0ZMQVNIX1RTUF9SV19OT05GQUNfQVRfTU9ERV9BRERSLCBhdG1vZGUsIDIpOworICAgIGlmKENQTlZfRVJST1IgPT0gcmV0KQorICAgIHsKKyAgICAgICAgcHJpbnRmKCJjcG52X052SXRlbVdyaXRlIGF0IG1vZGUgZmFpbCAhXG4iKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgY3Budl9Odkl0ZW1Xcml0ZUZhY3RvcnkoT1NfRkxBU0hfVFNQX1JXX05PTkZBQ19BVF9NT0RFX0FERFIsIGF0bW9kZSwgMik7CisgICAgcmV0ID0gY3Budl9OdnJhbUZsdXNoKCk7CisgICAgaWYoQ1BOVl9FUlJPUiA9PSByZXQpCisgICAgeworICAgICAgICBwcmludGYoImNwbnZfTnZyYW1GbHVzaCBmYWlsICFcbiIpOworICAgIH0KKyAgICAKKyAgICBjcG52X0ZzR2NXYWl0KEZTX0lNQUdFRlMpOworICAgIGlmKENQTlZfRVJST1IgPT0gY3Budl9DaGFuZ2VGc1BhcnRpdGlvbkF0dHIoRlNfSU1BR0VGUywgMCkpCisgICAgeworICAgICAgICBwcmludGYoImNwbnZfQ2hhbmdlRnNQYXJ0aXRpb25BdHRyIGZhaWxlZFxyXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHJldHVybiByZXQ7CisKK30KKwordW5zaWduZWQgaW50IGlzX2FtdF9hdG1vZGUoKQoreworCXVuc2lnbmVkIGludCAgcmV0ID0gQ1BOVl9PSzsKKwl1bnNpZ25lZCBjaGFyICBtb2RlWzRdID0gezB9OworCisgICAgcmV0ID0gY3Budl9Odkl0ZW1SZWFkKE9TX0ZMQVNIX1RTUF9SV19OT05GQUNfQkFTRV9BRERSLCBtb2RlLCAyKTsKKyAgICBpZihDUE5WX0VSUk9SID09IHJldCkKKyAgICB7CisgICAgICAgIHByaW50ZigiY3Budl9Odkl0ZW1SZWFkIGF0IG1vZGUgZmFpbCAhXG4iKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisJCisJcmV0ID0gY3Budl9Odkl0ZW1SZWFkKE9TX0ZMQVNIX1RTUF9SV19OT05GQUNfQVRfTU9ERV9BRERSLCBtb2RlKzIsIDIpOworICAgIGlmKENQTlZfRVJST1IgPT0gcmV0KQorICAgIHsKKyAgICAgICAgcHJpbnRmKCJjcG52X052SXRlbVJlYWQgYXQgbW9kZSBmYWlsICFcbiIpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworCXByaW50ZigibW9kZVswXSA9ICV4LG1vZGVbMV0gPSAleCxtb2RlWzJdID0gJXgsbW9kZVszXSA9ICV4IVxuIixtb2RlWzBdLG1vZGVbMV0sbW9kZVsyXSxtb2RlWzNdKTsKKworCWlmKChtb2RlWzBdID09IDB4NTQpJiYobW9kZVsxXSA9PSAweDREKSYmKG1vZGVbMl0gPT0gMHg0MSkmJihtb2RlWzNdID09IDB4NTQpKQorCXsKKwkgICAgcHJpbnRmKCJtb2RlID0gMVxuIik7CisJCXJldHVybiAxOworCX0KKwllbHNlCisJeworCSAgICBwcmludGYoIm1vZGUgPSAwXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCit9CisKKworCisKKwpkaWZmIC0tZ2l0IGEvYXAvbGliL2xpYmFtdC9hbXRudi5oIGIvYXAvbGliL2xpYmFtdC9hbXRudi5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjcyOTBhNGQKLS0tIC9kZXYvbnVsbAorKysgYi9hcC9saWIvbGliYW10L2FtdG52LmgKQEAgLTAsMCArMSwyMTcgQEAKKy8qKg0KKyAqIA0KKyAqIEBmaWxlICAgICAgYW10bnYuaA0KKyAqIEBicmllZiAgICAgDQorICogICAgICAgICAgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBGVE0uDQorICogICAgICAgICAgICBBTVTEo7/pTlay2df3vdO/2g0KKyAqICAgICAgICAgICAgDQorICogQGRldGFpbHMgICANCisgKiBAYXV0aG9yICAgIFRvb2xzIFRlYW0uDQorICogQGVtYWlsICAgICANCisgKiBAY29weXJpZ2h0IENvcHlyaWdodCAoQykgMjAxMyBTYW5lY2hpcHMgVGVjaG5vbG9neSBDby4sIEx0ZC4NCisgKiBAd2FybmluZyAgIA0KKyAqIEBkYXRlICAgICAgMjAxOS8wMi8wMg0KKyAqIEB2ZXJzaW9uICAgMS4xDQorICogQHByZSAgICAgICANCisgKiBAcG9zdCAgICAgIA0KKyAqICAgICAgICAgICAgDQorICogQHBhciAgICAgICANCisgKiBDaGFuZ2UgSGlzdG9yeSA6DQorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorICogZGF0ZSAgICAgICAgdmVyc2lvbiAgYXV0aG9yICAgICAgICAgZGVzY3JpcHRpb24NCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisgKiAyMDE4LzA0LzI4ICAxLjAgICAgICBsaXUueGluICAgICAgICBDcmVhdGUgZmlsZQ0KKyAqIDIwMTkvMDIvMDIgIDEuMSAgICAgIGppYW5nLmZlbmdsaW4gINDeuMTXosrNt73Kvc6qZG94eWdlbg0KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKyAqIA0KKyAqIA0KKyAqLw0KKw0KKyNpZm5kZWYgX19BTVROVl9IDQorI2RlZmluZSBfX0FNVE5WX0gNCisjaW5jbHVkZSAib3NfdHlwZV9kZWYuaCINCisjaW5jbHVkZSAiUk9OdlBhcmFtX0FNVC5oIg0KKyNpbmNsdWRlICJSV052Q29uZmlnLmgiDQorDQorDQorLyoqDQorICogQGJyaWVmINC0bnZybw0KKyAqIEBwYXJhbSBkd1N0YXJ0IG52xvDKvLXY1rfGq9LGLDAgfiAyTS0xIGJ5dGVzDQorICogQHBhcmFtIGR3TGVuIG52s6S2yCwxIH4gMk0gYnl0ZXMNCisgKiBAcGFyYW0gZnJvbSC0/dC0yOu1xMr9vt0NCisgKiBAcmV0dXJuIDAgs8m5piAgDQorICogQHJldHVybiAtMSDKp7DcDQorICogQG5vdGUgICANCisgKiBAd2FybmluZyANCisgKi8NCit1bnNpZ25lZCBpbnQgYW10X252cm9fd3JpdGUodW5zaWduZWQgaW50IGR3U3RhcnQsIHVuc2lnbmVkIGludCBkd0xlbiwgdW5zaWduZWQgY2hhciAqZnJvbSk7DQorDQorLyoqDQorICogQGJyaWVmILbBbnZybw0KKyAqIEBwYXJhbSBkd1N0YXJ0IG52xvDKvLXY1rfGq9LGLDAgfiAyTS0xIGJ5dGVzDQorICogQHBhcmFtIGR3TGVuIG52s6S2yCwxIH4gMk0gYnl0ZXMNCisgKiBAcGFyYW0gdG8gtsGz9rXEyv2+3Q0KKyAqIEByZXR1cm4gMCCzybmmICANCisgKiBAcmV0dXJuIC0xIMqnsNwNCisgKiBAbm90ZSAgIA0KKyAqIEB3YXJuaW5nIA0KKyAqLw0KK3Vuc2lnbmVkIGludCBhbXRfbnZyb19yZWFkKHVuc2lnbmVkIGludCBkd1N0YXJ0LCB1bnNpZ25lZCBpbnQgZHdMZW4sIHVuc2lnbmVkIGNoYXIgKnRvKTsNCisNCisvKioNCisgKiBAYnJpZWYg0LTSu8/uTlZST8r9vt0NCisgKiBAcGFyYW0gbnZQYXJhbSC4w05Wz+7A4NDNDQorICogQHBhcmFtIE52SXRlbURhdGEgtP3QtMjryv2+3bXEtdjWtw0KKyAqIEBwYXJhbSBOdkl0ZW1MZW4gyv2+3bOktsgNCisgKiBAcmV0dXJuIDAgs8m5piAgDQorICogQHJldHVybiAtMSDKp7DcDQorICogQG5vdGUgICANCisgKiBAd2FybmluZyANCisgKi8NCitpbnQgIGFtdF93cml0ZV9udl9pdGVtKE52UGFyYW1fQU1UIG52UGFyYW0sIFVJTlQ4ICpOdkl0ZW1EYXRhLCBVSU5UMzIgTnZJdGVtTGVuKTsNCisNCisvKioNCisgKiBAYnJpZWYgtsGz9tK7z+5OVlJPyv2+3Q0KKyAqIEBwYXJhbSBudlBhcmFtICC4w05Wz+7A4NDNDQorICogQHBhcmFtIE52SXRlbURhdGEgtsGz9rXEyv2+3Q0KKyAqIEBwYXJhbSBOdkl0ZW1MZW4gIMr9vt2zpLbIDQorICogQHJldHVybiAwILPJuaYgIA0KKyAqIEByZXR1cm4gLTEgyqew3A0KKyAqIEBub3RlICAgDQorICogQHdhcm5pbmcgDQorICovDQoraW50ICBhbXRfcmVhZF9udl9pdGVtKE52UGFyYW1fQU1UIG52UGFyYW0sVUlOVDggKk52SXRlbURhdGEsIFVJTlQzMiBOdkl0ZW1MZW4pOw0KKw0KKy8qKg0KKyAqIEBicmllZiDQtMn6svqy4srUserWvs67DQorICogQHBhcmFtIG52UGFyYW0gIMn6svqy4srUserWvs67z+7Dtr7Z1rUNCisgKiBAcGFyYW0gTnZJdGVtRGF0YSC0/dC0yOvK/b7dDQorICogQHJldHVybiAwILPJuaYgIA0KKyAqIEByZXR1cm4gLTEgyqew3A0KKyAqIEBub3RlICAgDQorICogQHdhcm5pbmcgDQorICovDQoraW50ICBhbXRfd3JpdGVfdGVzdF9mbGFnX2l0ZW0oTnZQYXJhbV9BTVRGbGFncyBudlBhcmFtLFVJTlQ4ICpOdkl0ZW1EYXRhKTsNCisNCisvKioNCisgKiBAYnJpZWYgtsHJ+rL6suLK1LHq1r7Ouw0KKyAqIEBwYXJhbSBudlBhcmFtICDJ+rL6suLK1LHq1r7Ou8/uw7a+2da1DQorICogQHBhcmFtIE52SXRlbURhdGEgtsGz9rXEyv2+3Q0KKyAqIEByZXR1cm4gMCCzybmmICANCisgKiBAcmV0dXJuIC0xIMqnsNwNCisgKiBAbm90ZSAgIA0KKyAqIEB3YXJuaW5nIA0KKyAqLw0KK2ludCAgYW10X3JlYWRfdGVzdF9mbGFnX2l0ZW0oTnZQYXJhbV9BTVRGbGFncyBudlBhcmFtLFVJTlQ4ICpOdkl0ZW1EYXRhKTsNCisNCisvKioNCisgKiBAYnJpZWYgTlZST9PDu6fX1Lao0uXH+NPytsG6r8r9DQorICogQHBhcmFtIGR3U3RhcnQgbnbG8Mq8tdjWt8ar0sYsMCB+IDEwMjMNCisgKiBAcGFyYW0gZHdMZW4gbnazpLbILDEgfiAxMDI0IGJ5dGVzDQorICogQHBhcmFtIGZyb20gtP3QtMjrtcTK/b7dDQorICogQHJldHVybiAwILPJuaYgIA0KKyAqIEByZXR1cm4gLTEgyqew3A0KKyAqIEBub3RlICAgDQorICogQHdhcm5pbmcgDQorICovDQoraW50ICBhbXRfbnZyb191c2VyX3dyaXRlKFVJTlQzMiBkd1N0YXJ0LCBVSU5UMzIgZHdMZW4sIFVJTlQ4KiBmcm9tKTsNCisNCisvKioNCisgKiBAYnJpZWYgTlZST9PDu6fX1Lao0uXH+NPy0LS6r8r9DQorICogQHBhcmFtIGR3U3RhcnQgbnbG8Mq8tdjWt8ar0sYsMCB+IDEwMjMNCisgKiBAcGFyYW0gZHdMZW4gbnazpLbILDEgfiAxMDI0IGJ5dGVzDQorICogQHBhcmFtIGZyb20gtsGz9rXEyv2+3Q0KKyAqIEByZXR1cm4gMCCzybmmICANCisgKiBAcmV0dXJuIC0xIMqnsNwNCisgKiBAbm90ZSAgIA0KKyAqIEB3YXJuaW5nIA0KKyAqLw0KK2ludCAgYW10X252cm9fdXNlcl9yZWFkKFVJTlQzMiBkd1N0YXJ0LCBVSU5UMzIgZHdMZW4sIFVJTlQ4KiB0byk7DQorDQorLyoqDQorICogQGJyaWVmIE5WUk+yzr+8yei8xtfUtqjS5cf40/LQtLqvyv0NCisgKiBAcGFyYW0gZHdTdGFydCBudsbwyry12Na3xqvSxiwwIH4gMTAyMw0KKyAqIEBwYXJhbSBkd0xlbiBudrOktsgsMSB+IDEwMjQgYnl0ZXMNCisgKiBAcGFyYW0gZnJvbSC0/dC0yOu1xMr9vt0NCisgKiBAcmV0dXJuIDAgs8m5piAgDQorICogQHJldHVybiAtMSDKp7DcDQorICogQG5vdGUgICANCisgKiBAd2FybmluZyANCisgKi8NCitpbnQgYW10X252cm9fcmVmX3dyaXRlKFVJTlQzMiBkd1N0YXJ0LCBVSU5UMzIgZHdMZW4sIFVJTlQ4KiBmcm9tKTsNCisNCisvKioNCisgKiBAYnJpZWYgTlZST7LOv7zJ6LzG19S2qNLlx/jT8rbBuq/K/Q0KKyAqIEBwYXJhbSBkd1N0YXJ0IG52xvDKvLXY1rfGq9LGLDAgfiAxMDIzDQorICogQHBhcmFtIGR3TGVuIG52s6S2yCwxIH4gMTAyNCBieXRlcw0KKyAqIEBwYXJhbSB0byC2wbP2tcTK/b7dDQorICogQHJldHVybiAwILPJuaYgIA0KKyAqIEByZXR1cm4gLTEgyqew3A0KKyAqIEBub3RlICAgDQorICogQHdhcm5pbmcgDQorICovDQoraW50IGFtdF9udnJvX3JlZl9yZWFkKFVJTlQzMiBkd1N0YXJ0LCBVSU5UMzIgZHdMZW4sIFVJTlQ4KiB0byk7DQorDQorLyoqDQorKiBAYnJpZWYg06bTw7LjxdC2z7Wxx7DKx7fxysdhbXTEo8q9DQorKiBAcGFyYW0gDQorKiBAcmV0dXJuIDEgYW10xKPKvQ0KKyogQHJldHVybiAwIG5vcm1hbMSjyr0NCisqIEBub3RlICAgDQorKiBAd2FybmluZyANCisqLw0KK2ludCBpc19hbXRfbW9kZSh2b2lkKTsNCisNCisvKioNCisgKiBAYnJpZWYgyejWw2Jvb3TG9LavxKPKvQ0KKyAqIEBwYXJhbSBib290bW9kZSAyuPbX1r3atcSx6sq2OiANCisgKiAgICAgICAgICAgICAgezB4NTQsMHgwMH0gOiB1c2VyLA0KKyAqICAgICAgICAgICAgICB7MHg1NCwweDAxfSA6IGRlYnVnLA0KKyAqICAgICAgICAgICAgICB7MHg1NCwweDAyfSA6IGZhY3RvcnksDQorICogICAgICAgICAgICAgIHsweDU0LDB4NER9IDogYW10LA0KKyAqIEByZXR1cm4gMCCzybmmICANCisgKiBAcmV0dXJuIC0xIMqnsNwNCisgKiBAbm90ZSAgIA0KKyAqIEB3YXJuaW5nIA0KKyAqLw0KK3Vuc2lnbmVkIGludCBhbXRfc2V0X2Jvb3Rtb2RlKHVuc2lnbmVkIGNoYXIgIGJvb3Rtb2RlW10pOw0KKw0KKy8qKg0KKyAqIEBicmllZiDJ6NbDteez2LzssuKx6ta+zrsNCisgKiBAcGFyYW0gYmF0ZGV0X3ZhbHVlILXns9i87LLiserWvg0KKyAqICAgICAgICAgICAgIDAgOiC/qrv6sru87LLiteez2CwNCisgKiAgICAgICAgICAgICAxIDogv6q7+rzssuK157PYDQorICogQHJldHVybiAwILPJuaYgIA0KKyAqIEByZXR1cm4gLTEgyqew3A0KKyAqIEBub3RlICAgDQorICogQHdhcm5pbmcgDQorICovDQordW5zaWduZWQgaW50IGFtdF9zZXRfYmF0ZGV0X2ZsYWcoaW50IGJhdGRldF92YWx1ZSk7DQorDQorLyoqDQorICogQGJyaWVmILbBteez2LzssuKx6ta+zrsNCisgKiBAcGFyYW0gcGJhdGRldF92YWx1ZSC2wbP2tcS157PYvOyy4rHq1r4NCisgKiBAcmV0dXJuIDAgs8m5piAgDQorICogQHJldHVybiAtMSDKp7DcDQorICogQG5vdGUgICANCisgKiBAd2FybmluZyANCisgKi8NCit1bnNpZ25lZCBpbnQgYW10X2dldF9iYXRkZXRfZmxhZyhpbnQgKnBiYXRkZXRfdmFsdWUpOw0KKw0KKy8qKg0KKyAqIEBicmllZiDJ6NbDYW10xKPKvc/CveLO9kFUw/zB7rHq1r4NCisgKiBAcGFyYW0gYm9vdG1vZGUgMrj219a92rXEserKtjogDQorICogICAgICAgICAgICAgIHsweDQxLDB4NTR9IDogYW10xKPKvc/CveLO9kFUw/zB7g0KKyAqIEByZXR1cm4gMCCzybmmICANCisgKiBAcmV0dXJuIC0xIMqnsNwNCisgKiBAbm90ZSAgIA0KKyAqIEB3YXJuaW5nIA0KKyAqLw0KK3Vuc2lnbmVkIGludCBhbXRfc2V0X2FtdF9hdG1vZGUodW5zaWduZWQgY2hhciAgYm9vdG1vZGVbXSx1bnNpZ25lZCBjaGFyICBhdG1vZGVbXSk7DQordW5zaWduZWQgaW50IGlzX2FtdF9hdG1vZGUoKTsNCisNCisNCisNCisNCisNCisjZW5kaWYgLy8gX19BTVROVl9IDQo=