ZGlmZiAtLWdpdCBhL01vZHVsZXMvX2xvY2FsZW1vZHVsZS5jIGIvTW9kdWxlcy9fbG9jYWxlbW9kdWxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRhMjJmMwotLS0gL2Rldi9udWxsCisrKyBiL01vZHVsZXMvX2xvY2FsZW1vZHVsZS5jCkBAIC0wLDAgKzEsMzU1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0NvcHlyaWdodCAoQykgMTk5NyBNYXJ0aW4gdm9uIEz2d2lzCisKK1Blcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kIGl0cworZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLAorcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKworVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIG5vIHdhcnJhbnR5LiBVc2UgYXQgeW91ciBvd24gcmlzay4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxsb2NhbGUuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlICJQeXRob24uaCIKKworc3RhdGljIGNoYXIgbG9jYWxlX19kb2NfX1tdPSJTdXBwb3J0IGZvciBQT1NJWCBsb2NhbGVzLiI7CisKK3N0YXRpYyBQeU9iamVjdCAqRXJyb3I7CisKKy8qIHN1cHBvcnQgZnVuY3Rpb25zIGZvciBmb3JtYXR0aW5nIGZsb2F0aW5nIHBvaW50IG51bWJlcnMgKi8KKworc3RhdGljIGNoYXIgc2V0bG9jYWxlX19kb2NfX1tdPQorIihpbnRlZ2VyLHN0cmluZz1Ob25lKSAtPiBzdHJpbmcuIEFjdGl2YXRlcy9xdWVyaWVzIGxvY2FsZSBwcm9jZXNzaW5nLiIKKzsKKworLyogdG8gcmVjb3JkIHRoZSBMQ19OVU1FUklDIHNldHRpbmdzICovCitzdGF0aWMgUHlPYmplY3QqIGdyb3VwaW5nPTA7CitzdGF0aWMgUHlPYmplY3QqIHRob3VzYW5kc19zZXA9MDsKK3N0YXRpYyBQeU9iamVjdCogZGVjaW1hbF9wb2ludD0wOworLyogaWYgbm9uLW51bGwsIGluZGljYXRlcyB0aGF0IExDX05VTUVSSUMgaXMgZGlmZmVyZW50IGZyb20gIkMiICovCitzdGF0aWMgY2hhciogc2F2ZWRfbnVtZXJpYz0wOworCisvKiB0aGUgZ3JvdXBpbmcgaXMgdGVybWluYXRlZCBieSBlaXRoZXIgMCBvciBDSEFSX01BWCAqLworc3RhdGljIFB5T2JqZWN0KgorY29weV9ncm91cGluZyhzKQorICBjaGFyKiBzOworeworICBpbnQgaTsKKyAgUHlPYmplY3QgKnJlc3VsdCwqdmFsPTA7CisgIGlmKHNbMF09PSdcMCcpCisgICAgIC8qIGVtcHR5IHN0cmluZzogbm8gZ3JvdXBpbmcgYXQgYWxsICovCisgICAgIHJldHVybiBQeUxpc3RfTmV3KDApOworICBmb3IoaT0wO3NbaV0hPSdcMCcgJiYgc1tpXSE9Q0hBUl9NQVg7aSsrKQorICAgICAvKiBub3RoaW5nICovOworICByZXN1bHQgPSBQeUxpc3RfTmV3KGkrMSk7CisgIGlmKCFyZXN1bHQpcmV0dXJuIE5VTEw7CisgIGk9LTE7CisgIGRveworICAgIGkrKzsKKyAgICB2YWw9UHlJbnRfRnJvbUxvbmcoc1tpXSk7CisgICAgaWYoIXZhbClicmVhazsKKyAgICBpZihQeUxpc3RfU2V0SXRlbShyZXN1bHQsaSx2YWwpKXsKKyAgICAgIFB5X0RFQ1JFRih2YWwpOworICAgICAgdmFsPTA7CisgICAgICBicmVhazsKKyAgICB9CisgIH13aGlsZShzW2ldIT0nXDAnICYmIHNbaV0hPUNIQVJfTUFYKTsKKyAgaWYoIXZhbCl7CisgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIHZvaWQKK2ZpeHVwX3VsY2FzZSgpCit7CisgIFB5T2JqZWN0ICptb2RzLCpzdHJvcCwqc3RyaW5nLCp1bG87CisgIHVuc2lnbmVkIGNoYXIgdWxbMjU2XTsKKyAgaW50IG4sYzsKKworICAvKiBmaW5kaW5nIHN5cy5tb2R1bGVzICovCisgIG1vZHM9UHlJbXBvcnRfR2V0TW9kdWxlRGljdCgpOworICBpZighbW9kcylyZXR1cm47CisgIC8qIGZpbmRpbmcgdGhlIG1vZHVsZSAqLworICBzdHJpbmc9UHlEaWN0X0dldEl0ZW1TdHJpbmcobW9kcywic3RyaW5nIik7CisgIGlmKHN0cmluZykKKyAgICAgc3RyaW5nPVB5TW9kdWxlX0dldERpY3Qoc3RyaW5nKTsKKyAgc3Ryb3A9UHlEaWN0X0dldEl0ZW1TdHJpbmcobW9kcywic3Ryb3AiKTsKKyAgaWYoc3Ryb3ApCisgICAgIHN0cm9wPVB5TW9kdWxlX0dldERpY3Qoc3Ryb3ApOworICBpZighc3RyaW5nICYmICFzdHJvcClyZXR1cm47CisgIC8qIGNyZWF0ZSB1cHBlcmNhc2UgKi8KKyAgbiA9IDA7CisgIGZvciAoYyA9IDA7IGMgPCAyNTY7IGMrKykgeworICAgIGlmIChpc3VwcGVyKGMpKQorICAgICAgIHVsW24rK10gPSBjOworICB9CisgIHVsbz1QeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSh1bCxuKTsKKyAgaWYoIXVsbylyZXR1cm47CisgIGlmKHN0cmluZykKKyAgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoc3RyaW5nLCJ1cHBlcmNhc2UiLHVsbyk7CisgIGlmKHN0cm9wKQorICAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhzdHJvcCwidXBwZXJjYXNlIix1bG8pOworICBQeV9ERUNSRUYodWxvKTsKKyAgLyogY3JlYXRlIGxvd2VyY2FzZSAqLworICBuID0gMDsKKyAgZm9yIChjID0gMDsgYyA8IDI1NjsgYysrKSB7CisgICAgaWYgKGlzbG93ZXIoYykpCisgICAgICAgdWxbbisrXSA9IGM7CisgIH0KKyAgdWxvPVB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHVsLG4pOworICBpZighdWxvKXJldHVybjsKKyAgaWYoc3RyaW5nKQorICAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhzdHJpbmcsImxvd2VyY2FzZSIsdWxvKTsKKyAgaWYoc3Ryb3ApCisgICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKHN0cm9wLCJsb3dlcmNhc2UiLHVsbyk7CisgIFB5X0RFQ1JFRih1bG8pOworICAvKiBjcmVhdGUgbGV0dGVycyAqLworICBuID0gMDsKKyAgZm9yIChjID0gMDsgYyA8IDI1NjsgYysrKSB7CisgICAgaWYgKGlzYWxwaGEoYykpCisgICAgICAgdWxbbisrXSA9IGM7CisgIH0KKyAgdWxvPVB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHVsLG4pOworICBpZighdWxvKXJldHVybjsKKyAgaWYoc3RyaW5nKQorICAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhzdHJpbmcsImxldHRlcnMiLHVsbyk7CisgIFB5X0RFQ1JFRih1bG8pOworfQorICAKKworc3RhdGljIFB5T2JqZWN0KgorUHlMb2NhbGVfc2V0bG9jYWxlKHNlbGYsYXJncykKKyAgUHlPYmplY3QgKnNlbGY7CisgIFB5T2JqZWN0ICphcmdzOworeworICBpbnQgY2F0ZWdvcnk7CisgIGNoYXIgKmxvY2FsZT0wLCpyZXN1bHQ7CisgIFB5T2JqZWN0ICpyZXN1bHRfb2JqZWN0OworICBzdHJ1Y3QgbGNvbnYgKmxjOworICBpZighUHlBcmdfUGFyc2VUdXBsZShhcmdzLCJpfHoiLCZjYXRlZ29yeSwmbG9jYWxlKSlyZXR1cm4gMDsKKyAgaWYobG9jYWxlKXsKKyAgICAvKiBzZXQgbG9jYWxlICovCisgICAgcmVzdWx0PXNldGxvY2FsZShjYXRlZ29yeSxsb2NhbGUpOworICAgIGlmKCFyZXN1bHQpeworICAgICAgLyogb3BlcmF0aW9uIGZhaWxlZCwgbm8gc2V0dGluZyB3YXMgY2hhbmdlZCAqLworICAgICAgUHlFcnJfU2V0U3RyaW5nKEVycm9yLCJsb2NhbGUgc2V0dGluZyBub3Qgc3VwcG9ydGVkIik7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmVzdWx0X29iamVjdD1QeVN0cmluZ19Gcm9tU3RyaW5nKHJlc3VsdCk7CisgICAgaWYoIXJlc3VsdClyZXR1cm4gTlVMTDsKKyAgICAvKiByZWNvcmQgY2hhbmdlcyB0byBMQ19OVU1FUklDICovCisgICAgaWYoY2F0ZWdvcnk9PUxDX05VTUVSSUMgfHwgY2F0ZWdvcnk9PUxDX0FMTCl7CisgICAgICBpZihzdHJjbXAobG9jYWxlLCJDIik9PTAgfHwgc3RyY21wKGxvY2FsZSwiUE9TSVgiKT09MCl7CisgICAgICAgIC8qIHVzZXIganVzdCBhc2tlZCBmb3IgZGVmYXVsdCBudW1lcmljIGxvY2FsZSAqLworICAgICAgICBpZihzYXZlZF9udW1lcmljKWZyZWUoc2F2ZWRfbnVtZXJpYyk7CisgICAgICAgIHNhdmVkX251bWVyaWM9MDsKKyAgICAgIH1lbHNleworICAgICAgICAvKiByZW1lbWJlciB2YWx1ZXMgKi8KKyAgICAgICAgbGM9bG9jYWxlY29udigpOworICAgICAgICBQeV9YREVDUkVGKGdyb3VwaW5nKTsKKyAgICAgICAgZ3JvdXBpbmc9Y29weV9ncm91cGluZyhsYy0+Z3JvdXBpbmcpOworICAgICAgICBQeV9YREVDUkVGKHRob3VzYW5kc19zZXApOworICAgICAgICB0aG91c2FuZHNfc2VwPVB5U3RyaW5nX0Zyb21TdHJpbmcobGMtPnRob3VzYW5kc19zZXApOworICAgICAgICBQeV9YREVDUkVGKGRlY2ltYWxfcG9pbnQpOworICAgICAgICBkZWNpbWFsX3BvaW50PVB5U3RyaW5nX0Zyb21TdHJpbmcobGMtPmRlY2ltYWxfcG9pbnQpOworICAgICAgICBzYXZlZF9udW1lcmljID0gc3RyZHVwKGxvY2FsZSk7CisKKyAgICAgICAgLyogcmVzdG9yZSB0byAiQyIgKi8KKyAgICAgICAgc2V0bG9jYWxlKExDX05VTUVSSUMsIkMiKTsKKyAgICAgIH0KKyAgICB9CisgICAgLyogcmVjb3JkIGNoYW5nZXMgdG8gTENfQ1RZUEUgKi8KKyAgICBpZihjYXRlZ29yeT09TENfQ1RZUEUgfHwgY2F0ZWdvcnk9PUxDX0FMTCkKKyAgICAgICBmaXh1cF91bGNhc2UoKTsKKyAgICAvKiB0aGluZ3MgdGhhdCBnb3Qgd3JvbmcgdXAgdG8gaGVyZSBhcmUgaWdub3JlZCAqLworICAgIFB5RXJyX0NsZWFyKCk7CisgIH1lbHNleworICAgIC8qIGdldCBsb2NhbGUgKi8KKyAgICAvKiByZXN0b3JlIExDX05VTUVSSUMgZmlyc3QsIGlmIGFwcHJvcHJpYXRlICovCisgICAgaWYoc2F2ZWRfbnVtZXJpYykKKyAgICAgICBzZXRsb2NhbGUoTENfTlVNRVJJQyxzYXZlZF9udW1lcmljKTsKKyAgICByZXN1bHQ9c2V0bG9jYWxlKGNhdGVnb3J5LE5VTEwpOworICAgIGlmKCFyZXN1bHQpeworICAgICAgUHlFcnJfU2V0U3RyaW5nKEVycm9yLCJsb2NhbGUgcXVlcnkgZmFpbGVkIik7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmVzdWx0X29iamVjdD1QeVN0cmluZ19Gcm9tU3RyaW5nKHJlc3VsdCk7CisgICAgLyogcmVzdG9yZSBiYWNrIHRvICJDIiAqLworICAgIGlmKHNhdmVkX251bWVyaWMpCisgICAgICAgc2V0bG9jYWxlKExDX05VTUVSSUMsIkMiKTsKKyAgfQorICByZXR1cm4gcmVzdWx0X29iamVjdDsKK30KKworc3RhdGljIGNoYXIgbG9jYWxlY29udl9fZG9jX19bXT0KKyIoKSAtPiBkaWN0LiBSZXR1cm5zIG51bWVyaWMgYW5kIG1vbmV0YXJ5IGxvY2FsZS1zcGVjaWZpYyBwYXJhbWV0ZXJzLiIKKzsKKworc3RhdGljIFB5T2JqZWN0KgorUHlMb2NhbGVfbG9jYWxlY29udihzZWxmLGFyZ3MpCisgIFB5T2JqZWN0ICpzZWxmOworICBQeU9iamVjdCAqYXJnczsKK3sKKyAgUHlPYmplY3QqIHJlc3VsdDsKKyAgc3RydWN0IGxjb252ICpsOworICBQeU9iamVjdCAqeDsKKyAgaWYoIVB5QXJnX05vQXJncyhhcmdzKSlyZXR1cm4gMDsKKyAgcmVzdWx0ID0gUHlEaWN0X05ldygpOworICBpZighcmVzdWx0KXJldHVybiAwOworICAvKiBpZiBMQ19OVU1FUklDIGlzIGRpZmZlcmVudCBpbiB0aGUgQyBsaWJyYXJ5LCB1c2Ugc2F2ZWQgdmFsdWUgKi8KKyAgbCA9IGxvY2FsZWNvbnYoKTsKKyAgLyogaG9wZWZ1bGx5LCB0aGUgbG9jYWxlY29udiByZXN1bHQgc3Vydml2ZXMgdGhlIEMgbGlicmFyeSBjYWxscworICAgICBpbnZvbHZlZCBoZXJlaW4gKi8KKyNkZWZpbmUgUkVTVUxUX1NUUklORyhzKSBcCisgIHg9UHlTdHJpbmdfRnJvbVN0cmluZyhsLT5zKTtpZigheClnb3RvIGZhaWxlZDtQeURpY3RfU2V0SXRlbVN0cmluZyhyZXN1bHQsI3MseCk7UHlfWERFQ1JFRih4KQorI2RlZmluZSBSRVNVTFRfSU5UKGkpIFwKKyAgeD1QeUludF9Gcm9tTG9uZyhsLT5pKTtpZigheClnb3RvIGZhaWxlZDtQeURpY3RfU2V0SXRlbVN0cmluZyhyZXN1bHQsI2kseCk7UHlfWERFQ1JFRih4KQorCisgICAgLyogTnVtZXJpYyBpbmZvcm1hdGlvbiAqLworICBpZihzYXZlZF9udW1lcmljKXsKKyAgICAvKiBjYW5ub3QgdXNlIGxvY2FsZWNvbnYgcmVzdWx0cyAqLworICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKHJlc3VsdCwiZGVjaW1hbF9wb2ludCIsZGVjaW1hbF9wb2ludCk7CisgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcocmVzdWx0LCJncm91cGluZyIsZ3JvdXBpbmcpOworICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKHJlc3VsdCwidGhvdXNhbmRzX3NlcCIsdGhvdXNhbmRzX3NlcCk7CisgIH1lbHNleworICAgIFJFU1VMVF9TVFJJTkcoZGVjaW1hbF9wb2ludCk7CisgICAgUkVTVUxUX1NUUklORyh0aG91c2FuZHNfc2VwKTsKKyAgICB4PWNvcHlfZ3JvdXBpbmcobC0+Z3JvdXBpbmcpOworICAgIGlmKCF4KWdvdG8gZmFpbGVkOworICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKHJlc3VsdCwiZ3JvdXBpbmciLHgpOworICAgIFB5X1hERUNSRUYoeCk7CisgIH0KKworICAvKiBNb25ldGFyeSBpbmZvcm1hdGlvbiAqLworICBSRVNVTFRfU1RSSU5HKGludF9jdXJyX3N5bWJvbCk7CisgIFJFU1VMVF9TVFJJTkcoY3VycmVuY3lfc3ltYm9sKTsKKyAgUkVTVUxUX1NUUklORyhtb25fZGVjaW1hbF9wb2ludCk7CisgIFJFU1VMVF9TVFJJTkcobW9uX3Rob3VzYW5kc19zZXApOworICB4PWNvcHlfZ3JvdXBpbmcobC0+bW9uX2dyb3VwaW5nKTsKKyAgaWYoIXgpZ290byBmYWlsZWQ7CisgIFB5RGljdF9TZXRJdGVtU3RyaW5nKHJlc3VsdCwibW9uX2dyb3VwaW5nIix4KTsKKyAgUHlfWERFQ1JFRih4KTsKKyAgUkVTVUxUX1NUUklORyhwb3NpdGl2ZV9zaWduKTsKKyAgUkVTVUxUX1NUUklORyhuZWdhdGl2ZV9zaWduKTsKKyAgUkVTVUxUX0lOVChpbnRfZnJhY19kaWdpdHMpOworICBSRVNVTFRfSU5UKGZyYWNfZGlnaXRzKTsKKyAgUkVTVUxUX0lOVChwX2NzX3ByZWNlZGVzKTsKKyAgUkVTVUxUX0lOVChwX3NlcF9ieV9zcGFjZSk7CisgIFJFU1VMVF9JTlQobl9jc19wcmVjZWRlcyk7CisgIFJFU1VMVF9JTlQobl9zZXBfYnlfc3BhY2UpOworICBSRVNVTFRfSU5UKHBfc2lnbl9wb3NuKTsKKyAgUkVTVUxUX0lOVChuX3NpZ25fcG9zbik7CisKKyAgcmV0dXJuIHJlc3VsdDsKKyBmYWlsZWQ6CisgIFB5X1hERUNSRUYocmVzdWx0KTsKKyAgUHlfWERFQ1JFRih4KTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBjaGFyIHN0cmNvbGxfX2RvY19fW109Cisic3RyaW5nLHN0cmluZyAtPiBpbnQuIENvbXBhcmVzIHR3byBzdHJpbmdzIGFjY29yZGluZyB0byB0aGUgbG9jYWxlLiIKKzsKKworc3RhdGljIFB5T2JqZWN0KgorUHlMb2NhbGVfc3RyY29sbChzZWxmLGFyZ3MpCisgIFB5T2JqZWN0ICpzZWxmOworICBQeU9iamVjdCAqYXJnczsKK3sKKyAgY2hhciAqczEsKnMyOworICBpZighUHlBcmdfUGFyc2VUdXBsZShhcmdzLCJzcyIsJnMxLCZzMikpCisgICAgIHJldHVybiBOVUxMOworICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoc3RyY29sbChzMSxzMikpOworfQorCitzdGF0aWMgY2hhciBzdHJ4ZnJtX19kb2NfX1tdPQorInN0cmluZyAtPiBzdHJpbmcuIFJldHVybnMgYSBzdHJpbmcgdGhhdCBiZWhhdmVzIGZvciBjbXAgbG9jYWxlLWF3YXJlLiIKKzsKKworc3RhdGljIFB5T2JqZWN0KgorUHlMb2NhbGVfc3RyeGZybShzZWxmLGFyZ3MpCisgIFB5T2JqZWN0KiBzZWxmOworICBQeU9iamVjdCogYXJnczsKK3sKKyAgY2hhciAqcywqYnVmOworICBpbnQgbjEsbjI7CisgIFB5T2JqZWN0ICpyZXN1bHQ7CisgIGlmKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsInMiLCZzKSkKKyAgICAgcmV0dXJuIE5VTEw7CisgIC8qIGFzc3VtZSBubyBjaGFuZ2UgaW4gc2l6ZSwgZmlyc3QgKi8KKyAgbjE9c3RybGVuKHMpKzE7CisgIGJ1Zj1QeV9NYWxsb2MobjEpOworICBpZighYnVmKXJldHVybiBOVUxMOworICBuMj1zdHJ4ZnJtKGJ1ZixzLG4xKTsKKyAgaWYobjI+bjEpeworICAgIC8qIG1vcmUgc3BhY2UgbmVlZGVkICovCisgICAgYnVmPVB5X1JlYWxsb2MoYnVmLG4yKTsKKyAgICBpZighYnVmKXJldHVybiBOVUxMOworICAgIHN0cnhmcm0oYnVmLHMsbjIpOworICB9CisgIHJlc3VsdD1QeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7CisgIFB5X0ZyZWUoYnVmKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIHN0cnVjdCBQeU1ldGhvZERlZiBQeUxvY2FsZV9NZXRob2RzW10gPSB7CisgIHsic2V0bG9jYWxlIiwoUHlDRnVuY3Rpb24pUHlMb2NhbGVfc2V0bG9jYWxlLDEsc2V0bG9jYWxlX19kb2NfX30sCisgIHsibG9jYWxlY29udiIsKFB5Q0Z1bmN0aW9uKVB5TG9jYWxlX2xvY2FsZWNvbnYsMCxsb2NhbGVjb252X19kb2NfX30sCisgIHsic3RyY29sbCIsKFB5Q0Z1bmN0aW9uKVB5TG9jYWxlX3N0cmNvbGwsMSxzdHJjb2xsX19kb2NfX30sCisgIHsic3RyeGZybSIsKFB5Q0Z1bmN0aW9uKVB5TG9jYWxlX3N0cnhmcm0sMSxzdHJ4ZnJtX19kb2NfX30sCisgIHtOVUxMLCBOVUxMfQorfTsKKwordm9pZAoraW5pdF9sb2NhbGUoKQoreworICBQeU9iamVjdCAqbSwqZCwqeDsKKyAgbT1QeV9Jbml0TW9kdWxlKCJfbG9jYWxlIixQeUxvY2FsZV9NZXRob2RzKTsKKyAgZCA9IFB5TW9kdWxlX0dldERpY3QobSk7CisgIHg9UHlJbnRfRnJvbUxvbmcoTENfQ1RZUEUpOworICBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCJMQ19DVFlQRSIseCk7CisgIFB5X1hERUNSRUYoeCk7CisKKyAgeD1QeUludF9Gcm9tTG9uZyhMQ19USU1FKTsKKyAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwiTENfVElNRSIseCk7CisgIFB5X1hERUNSRUYoeCk7CisKKyAgeD1QeUludF9Gcm9tTG9uZyhMQ19DT0xMQVRFKTsKKyAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwiTENfQ09MTEFURSIseCk7CisgIFB5X1hERUNSRUYoeCk7CisKKyAgeD1QeUludF9Gcm9tTG9uZyhMQ19NT05FVEFSWSk7CisgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsIkxDX01PTkVUQVJZIix4KTsKKyAgUHlfWERFQ1JFRih4KTsKKworICB4PVB5SW50X0Zyb21Mb25nKExDX01FU1NBR0VTKTsKKyAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwiTENfTUVTU0FHRVMiLHgpOworICBQeV9YREVDUkVGKHgpOworCisgIHg9UHlJbnRfRnJvbUxvbmcoTENfTlVNRVJJQyk7CisgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsIkxDX05VTUVSSUMiLHgpOworICBQeV9YREVDUkVGKHgpOworCisgIHg9UHlJbnRfRnJvbUxvbmcoTENfQUxMKTsKKyAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwiTENfQUxMIix4KTsKKyAgUHlfWERFQ1JFRih4KTsKKworICB4PVB5SW50X0Zyb21Mb25nKENIQVJfTUFYKTsKKyAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwiQ0hBUl9NQVgiLHgpOworICBQeV9YREVDUkVGKHgpOworCisgIEVycm9yID0gUHlFcnJfTmV3RXhjZXB0aW9uKCJsb2NhbGUuRXJyb3IiLCBOVUxMLCBOVUxMKTsKKyAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkVycm9yIiwgRXJyb3IpOworCisgIHg9UHlTdHJpbmdfRnJvbVN0cmluZyhsb2NhbGVfX2RvY19fKTsKKyAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwiX19kb2NfXyIseCk7CisgIFB5X1hERUNSRUYoeCk7CisKKyAgaWYoUHlFcnJfT2NjdXJyZWQoKSkKKyAgICBQeV9GYXRhbEVycm9yKCJDYW4ndCBpbml0aWFsaXplIG1vZHVsZSBsb2NhbGUiKTsKK30K