ZGlmZiAtLWdpdCBhL29wZW5nbC9saWJHTEVTX0NNL2dsX3dyYXBwZXIuY3BwIGIvb3BlbmdsL2xpYkdMRVNfQ00vZ2xfd3JhcHBlci5jcHAKaW5kZXggNWRhNGY5YS4uM2I3ZjQ1ZSAxMDA2NDQKLS0tIGEvb3BlbmdsL2xpYkdMRVNfQ00vZ2xfd3JhcHBlci5jcHAKKysrIGIvb3BlbmdsL2xpYkdMRVNfQ00vZ2xfd3JhcHBlci5jcHAKQEAgLTM3Myw2ICszNzMsNyBAQAogCiBzdGF0aWMgc3A8R1BVUmV2b2tlUmVxdWVzdGVyPiBnUmV2b2tlckNhbGxiYWNrOwogCisKIHN0YXRpYyByZXF1ZXN0X2dwdV90KiBncHVfYWNxdWlyZSh2b2lkKiB1c2VyKQogewogICAgIHNwPElTdXJmYWNlQ29tcG9zZXI+IHNlcnZlciggZ2V0U3VyZmFjZUZsaW5nZXIoKSApOwpAQCAtMzgzLDcgKzM4NCwxMCBAQAogICAgIH0KICAgICAKICAgICBJU3VyZmFjZUNvbXBvc2VyOjpncHVfaW5mb190IGluZm87Ci0gICAgZ1Jldm9rZXJDYWxsYmFjayA9IG5ldyBHUFVSZXZva2VSZXF1ZXN0ZXIoKTsKKyAgICAKKyAgICBpZiAoZ1Jldm9rZXJDYWxsYmFjayA9PSAwKQorICAgICAgICBnUmV2b2tlckNhbGxiYWNrID0gbmV3IEdQVVJldm9rZVJlcXVlc3RlcigpOworCiAgICAgc3RhdHVzX3QgZXJyID0gc2VydmVyLT5yZXF1ZXN0R1BVKGdSZXZva2VyQ2FsbGJhY2ssICZpbmZvKTsKICAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7CiAgICAgICAgIExPR0QoInJlcXVlc3RHUFUgcmV0dXJuZWQgJWQiLCBlcnIpOwpAQCAtNTQ5LDYgKzU1MywyMSBAQAogICAgIHJldHVybiAtMTsKIH0KIAorc3RhdGljIEVHTGludCBjb25maWdUb1VuaXF1ZUlkKGVnbF9kaXNwbGF5X3QgY29uc3QqIGRwLCBpbnQgaSwgaW50IGluZGV4KSAKK3sKKyAgICAvLyBOT1RFOiB0aGlzIG1hcHBpbmcgd29ya3Mgb25seSBpZiB3ZSBoYXZlIG5vIG1vcmUgdGhhbiB0d28gRUdMaW1wbAorICAgIHJldHVybiAoaT4wID8gZHAtPm51bUNvbmZpZ3NbMF0gOiAwKSArIGluZGV4OworfQorCitzdGF0aWMgdm9pZCB1bmlxdWVJZFRvQ29uZmlnKGVnbF9kaXNwbGF5X3QgY29uc3QqIGRwLCBFR0xpbnQgY29uZmlnSWQsCisgICAgICAgIGludCYgaSwgaW50JiBpbmRleCkgCit7CisgICAgLy8gTk9URTogdGhpcyBtYXBwaW5nIHdvcmtzIG9ubHkgaWYgd2UgaGF2ZSBubyBtb3JlIHRoYW4gdHdvIEVHTGltcGwKKyAgICBzaXplX3QgbnVtQ29uZmlncyA9IGRwLT5udW1Db25maWdzWzBdOworICAgIGkgPSBjb25maWdJZCAvIG51bUNvbmZpZ3M7CisgICAgaW5kZXggPSBjb25maWdJZCAlIG51bUNvbmZpZ3M7Cit9CisKIHN0YXRpYyBpbnQgY21wX2NvbmZpZ3MoY29uc3Qgdm9pZCogYSwgY29uc3Qgdm9pZCAqYikKIHsKICAgICBFR0xDb25maWcgYzAgPSAqKEVHTENvbmZpZyBjb25zdCAqKWE7CkBAIC01NTcsNyArNTc2LDcgQEAKIH0KIAogc3RhdGljIGNoYXIgY29uc3QgKiBjb25zdCBnVmVuZG9yU3RyaW5nICAgICA9ICJBbmRyb2lkIjsKLXN0YXRpYyBjaGFyIGNvbnN0ICogY29uc3QgZ1ZlcnNpb25TdHJpbmcgICAgPSAiMS4yIEFuZHJvaWQgTUVUQS1FR0wiOworc3RhdGljIGNoYXIgY29uc3QgKiBjb25zdCBnVmVyc2lvblN0cmluZyAgICA9ICIxLjMgQW5kcm9pZCBNRVRBLUVHTCI7CiBzdGF0aWMgY2hhciBjb25zdCAqIGNvbnN0IGdDbGllbnRBcGlTdHJpbmcgID0gIk9wZW5HTCBFUyI7CiAKIHN0cnVjdCBleHRlbnRpb25fbWFwX3QgewpAQCAtODM0LDcgKzg1MywxMyBAQAogICAgICAgICBwcm9wZXJ0eV9nZXQoImRlYnVnLmVnbC5odyIsIHZhbHVlLCAiMSIpOwogICAgICAgICBpZiAoYXRvaSh2YWx1ZSkgIT0gMCkgewogICAgICAgICAgICAgY254LT5ob29rcyA9ICZnSG9va3NbSU1QTF9IQVJEV0FSRV07Ci0gICAgICAgICAgICBjbngtPmRzbyA9IGxvYWRfZHJpdmVyKCJsaWJoZ2wuc28iLCBjbngtPmhvb2tzKTsKKyAgICAgICAgICAgIHByb3BlcnR5X2dldCgiZGVidWcuZWdsLnByb2ZpbGVyIiwgdmFsdWUsICIwIik7CisgICAgICAgICAgICBpZiAoYXRvaSh2YWx1ZSkgPT0gMCkgeworICAgICAgICAgICAgICAgIGNueC0+ZHNvID0gbG9hZF9kcml2ZXIoImxpYmhnbC5zbyIsIGNueC0+aG9va3MpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBMT0dXKCJVc2luZyBpbnN0cnVtZW50ZWQgaC93IE9wZW5HTCBFUyBsaWJyYXJ5Iik7CisgICAgICAgICAgICAgICAgY254LT5kc28gPSBsb2FkX2RyaXZlcigibGliaGdsZC5zbyIsIGNueC0+aG9va3MpOworICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgTE9HRCgiM0QgaGFyZHdhcmUgYWNjZWxlcmF0aW9uIGlzIGRpc2FibGVkIik7CiAgICAgICAgIH0KQEAgLTg2NCw2ICs4ODksOCBAQAogICAgICAgICAKICAgICAgICAgZC0+ZHB5c1tJTVBMX0hBUkRXQVJFXSA9IGNueC0+aG9va3MtPmVnbC5lZ2xHZXREaXNwbGF5KGRpc3BsYXkpOwogICAgICAgICBpZiAoZC0+ZHB5c1tJTVBMX0hBUkRXQVJFXSA9PSBFR0xfTk9fRElTUExBWSkgeworICAgICAgICAgICAgTE9HRSgiaC93IGFjY2VsZXJhdGVkIGVnbEdldERpc3BsYXkoKSBmYWlsZWQgKCVzKSIsCisgICAgICAgICAgICAgICAgICAgIGVnbF9zdHJlcnJvcihjbngtPmhvb2tzLT5lZ2wuZWdsR2V0RXJyb3IoKSkpOwogICAgICAgICAgICAgZGxjbG9zZSgodm9pZCopY254LT5kc28pOwogICAgICAgICAgICAgY254LT5kc28gPSAwOwogICAgICAgICAgICAgLy8gaW4gY2FzZSBvZiBmYWlsdXJlLCB3ZSB3YW50IHRvIG1ha2Ugc3VyZSB3ZSBkb24ndCB0cnkgYWdhaW4KQEAgLTkwMCw3ICs5MjcsMTAgQEAKICAgICAgICAgZWdsX2Nvbm5lY3Rpb25fdCogY29uc3QgY254ID0gJmdFR0xJbXBsW2ldOwogICAgICAgICBjbngtPm1ham9yID0gLTE7CiAgICAgICAgIGNueC0+bWlub3IgPSAtMTsKLSAgICAgICAgaWYgKGNueC0+ZHNvICYmIGNueC0+aG9va3MtPmVnbC5lZ2xJbml0aWFsaXplKAorICAgICAgICBpZiAoIWNueC0+ZHNvKSAKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIGlmIChjbngtPmhvb2tzLT5lZ2wuZWdsSW5pdGlhbGl6ZSgKICAgICAgICAgICAgICAgICBkcC0+ZHB5c1tpXSwgJmNueC0+bWFqb3IsICZjbngtPm1pbm9yKSkgewogCiAgICAgICAgICAgICAvL0xPR0QoImluaXRpYWxpemVkICVkIGRweT0lcCwgdmVyPSVkLiVkLCBjbng9JXAiLApAQCAtOTEyLDEwICs5NDIsMTAgQEAKICAgICAgICAgICAgIGRwLT5xdWVyeVN0cmluZ1tpXS52ZXJzaW9uID0KICAgICAgICAgICAgICAgICBjbngtPmhvb2tzLT5lZ2wuZWdsUXVlcnlTdHJpbmcoZHAtPmRweXNbaV0sIEVHTF9WRVJTSU9OKTsKICAgICAgICAgICAgIGRwLT5xdWVyeVN0cmluZ1tpXS5leHRlbnNpb25zID0gc3RyZHVwKAotICAgICAgICAgICAgICAgIGNueC0+aG9va3MtPmVnbC5lZ2xRdWVyeVN0cmluZyhkcC0+ZHB5c1tpXSwgRUdMX0VYVEVOU0lPTlMpKTsKKyAgICAgICAgICAgICAgICAgICAgY254LT5ob29rcy0+ZWdsLmVnbFF1ZXJ5U3RyaW5nKGRwLT5kcHlzW2ldLCBFR0xfRVhURU5TSU9OUykpOwogICAgICAgICAgICAgZHAtPnF1ZXJ5U3RyaW5nW2ldLmNsaWVudEFwaSA9CiAgICAgICAgICAgICAgICAgY254LT5ob29rcy0+ZWdsLmVnbFF1ZXJ5U3RyaW5nKGRwLT5kcHlzW2ldLCBFR0xfQ0xJRU5UX0FQSVMpOwotICAgICAgICAgICAgCisKICAgICAgICAgICAgIC8vIER5bmFtaWNhbGx5IGluc2VydCBleHRlbnNpb25zIHdlIGtub3cgYWJvdXQKICAgICAgICAgICAgIGlmIChjbngtPmhvb2tzLT5lZ2wuZWdsU3dhcFJlY3RhbmdsZUFORFJPSUQpCiAgICAgICAgICAgICAgICAgYWRkX2V4dGVuc2lvbihkcCwgZHAtPnF1ZXJ5U3RyaW5nW2ldLmV4dGVuc2lvbnMsCkBAIC05MjQsMTIgKzk1NCwxNSBAQAogICAgICAgICAgICAgaWYgKGNueC0+aG9va3MtPmVnbC5lZ2xRdWVyeVN0cmluZ0NvbmZpZ0FORFJPSUQpCiAgICAgICAgICAgICAgICAgYWRkX2V4dGVuc2lvbihkcCwgZHAtPnF1ZXJ5U3RyaW5nW2ldLmV4dGVuc2lvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAiRUdMX0FORFJPSURfcXVlcnlfc3RyaW5nX2NvbmZpZyIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTE9HRCgiJWQ6IGVnbEluaXRpYWxpemUoKSBmYWlsZWQgKCVzKSIsIAorICAgICAgICAgICAgICAgICAgICBpLCBlZ2xfc3RyZXJyb3IoY254LT5ob29rcy0+ZWdsLmVnbEdldEVycm9yKCkpKTsKICAgICAgICAgfQogICAgIH0KLSAgICAgICAgICAgIAorCiAgICAgLy8gQnVpbGQgdGhlIGV4dGVuc2lvbiBsaXN0IHRoYXQgZGVwZW5kcyBvbiB0aGUgY3VycmVudCBjb25maWcuCiAgICAgLy8gSXQgaXMgdGhlIGludGVyc2VjdGlvbiBvZiBvdXIgZXh0ZW5zaW9uIGxpc3QgYW5kIHRoZQotICAgIC8vIHVuZGVybGF5aW5nIEVHTCdzIGV4dGVuc2lvbnMgbGlzdAorICAgIC8vIHVuZGVybHlpbmcgRUdMJ3MgZXh0ZW5zaW9ucyBsaXN0CiAgICAgRUdMQm9vbGVhbiByZXMgPSBFR0xfRkFMU0U7CiAgICAgZm9yIChpbnQgaT0wIDsgaTwyIDsgaSsrKSB7CiAgICAgICAgIGVnbF9jb25uZWN0aW9uX3QqIGNvbnN0IGNueCA9ICZnRUdMSW1wbFtpXTsKQEAgLTk1MSwxMCArOTg0LDEwIEBACiAgICAgICAgICAgICB9IHdoaWxlICgqcCk7CiAgICAgICAgICAgICBmcmVlKCh2b2lkKilvdXJfZXh0ZW5zaW9uc19vcmcpOwogCi0gICAgICAgICAgICAvLyByZW1vdmUgdGhlIHRyYWlsbGluZyB3aGl0ZSBzcGFjZQorICAgICAgICAgICAgLy8gcmVtb3ZlIHRoZSB0cmFpbGluZyB3aGl0ZSBzcGFjZQogICAgICAgICAgICAgaWYgKGV4dGVuc2lvbnNfY29uZmlnWzBdICE9IDApIHsKICAgICAgICAgICAgICAgICBzaXplX3QgbCA9IHN0cmxlbihleHRlbnNpb25zX2NvbmZpZykgLSAxOyAvLyBuZXcgc2l6ZQotICAgICAgICAgICAgICAgIGV4dGVuc2lvbnNfY29uZmlnW2xdID0gMDsgLy8gcmVtb3ZlIHRoZSB0cmFpbGxpbmcgd2hpdGUgc3BhY2UKKyAgICAgICAgICAgICAgICBleHRlbnNpb25zX2NvbmZpZ1tsXSA9IDA7IC8vIHJlbW92ZSB0aGUgdHJhaWxpbmcgd2hpdGUgc3BhY2UKICAgICAgICAgICAgICAgICBleHRlbnNpb25zX2NvbmZpZyA9IChjaGFyKilyZWFsbG9jKGV4dGVuc2lvbnNfY29uZmlnLCBsKzEpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBleHRlbnNpb25zX2NvbmZpZyA9IChjaGFyKilyZWFsbG9jKGV4dGVuc2lvbnNfY29uZmlnLCAxKTsKQEAgLTEwNjUsMTUgKzEwOTgsNzQgQEAKICAgICAgICAgcmV0dXJuIEVHTF9UUlVFOwogICAgIH0KIAorICAgIEVHTGludCBuOwogICAgIEVHTEJvb2xlYW4gcmVzID0gRUdMX0ZBTFNFOwogICAgICpudW1fY29uZmlnID0gMDsKKworICAgIAorICAgIC8vIEl0IGlzIHVuZm9ydHVuYXRlLCBidXQgd2UgbmVlZCB0byByZW1hcCB0aGUgRUdMX0NPTkZJR19JRHMsIAorICAgIC8vIHRvIGRvICB0aGlzLCB3ZSBoYXZlIHRvIGdvIHRocm91Z2ggdGhlIGF0dHJpYl9saXN0IGFycmF5IG9uY2UKKyAgICAvLyB0byBmaWd1cmUgb3V0IGJvdGggaXRzIHNpemUgYW5kIGlmIGl0IGNvbnRhaW5zIGFuIEVHTF9DT05GSUdfSUQKKyAgICAvLyBrZXkuIElmIHNvLCB0aGUgZnVsbCBhcnJheSBpcyBjb3BpZWQgYW5kIHBhdGNoZWQuCisgICAgLy8gTk9URTogd2UgYXNzdW1lIHRoYXQgdGhlcmUgY2FuIGJlIG9ubHkgb25lIG9jY3VycmVuY2UKKyAgICAvLyBvZiBFR0xfQ09ORklHX0lELgorICAgIAorICAgIEVHTGludCBwYXRjaF9pbmRleCA9IC0xOworICAgIEdMaW50IGF0dHI7CisgICAgc2l6ZV90IHNpemUgPSAwOworICAgIHdoaWxlICgoYXR0cj1hdHRyaWJfbGlzdFtzaXplXSkpIHsKKyAgICAgICAgaWYgKGF0dHIgPT0gRUdMX0NPTkZJR19JRCkKKyAgICAgICAgICAgIHBhdGNoX2luZGV4ID0gc2l6ZTsKKyAgICAgICAgc2l6ZSArPSAyOworICAgIH0KKyAgICBpZiAocGF0Y2hfaW5kZXggPj0gMCkgeworICAgICAgICBzaXplICs9IDI7IC8vIHdlIG5lZWQgY29weSB0aGUgc2VudGluZWwgYXMgd2VsbAorICAgICAgICBFR0xpbnQqIG5ld19saXN0ID0gKEVHTGludCopbWFsbG9jKHNpemUqc2l6ZW9mKEVHTGludCkpOworICAgICAgICBpZiAobmV3X2xpc3QgPT0gMCkKKyAgICAgICAgICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX0FMTE9DLCBFR0xfRkFMU0UpOworICAgICAgICBtZW1jcHkobmV3X2xpc3QsIGF0dHJpYl9saXN0LCBzaXplKnNpemVvZihFR0xpbnQpKTsKKworICAgICAgICAvLyBwYXRjaCB0aGUgcmVxdWVzdGVkIEVHTF9DT05GSUdfSUQKKyAgICAgICAgaW50IGksIGluZGV4OworICAgICAgICBFR0xpbnQmIGNvbmZpZ0lkKG5ld19saXN0W3BhdGNoX2luZGV4KzFdKTsKKyAgICAgICAgdW5pcXVlSWRUb0NvbmZpZyhkcCwgY29uZmlnSWQsIGksIGluZGV4KTsKKyAgICAgICAgCisgICAgICAgIGVnbF9jb25uZWN0aW9uX3QqIGNvbnN0IGNueCA9ICZnRUdMSW1wbFtpXTsKKyAgICAgICAgaWYgKGNueC0+ZHNvKSB7CisgICAgICAgICAgICBjbngtPmhvb2tzLT5lZ2wuZWdsR2V0Q29uZmlnQXR0cmliKAorICAgICAgICAgICAgICAgICAgICBkcC0+ZHB5c1tpXSwgZHAtPmNvbmZpZ3NbaV1baW5kZXhdLCAKKyAgICAgICAgICAgICAgICAgICAgRUdMX0NPTkZJR19JRCwgJmNvbmZpZ0lkKTsKKworICAgICAgICAgICAgLy8gYW5kIHN3aXRjaCB0byB0aGUgbmV3IGxpc3QKKyAgICAgICAgICAgIGF0dHJpYl9saXN0ID0gY29uc3RfY2FzdDxjb25zdCBFR0xpbnQgKj4obmV3X2xpc3QpOworCisgICAgICAgICAgICAvLyBBdCB0aGlzIHBvaW50LCB0aGUgb25seSBjb25maWd1cmF0aW9uIHRoYXQgY2FuIG1hdGNoIGlzCisgICAgICAgICAgICAvLyBkcC0+Y29uZmlnc1tpXVtpbmRleF0sIGhvd2V2ZXIsIHdlIGRvbid0IGtub3cgaWYgaXQgd291bGQgYmUKKyAgICAgICAgICAgIC8vIHJlamVjdGVkIGJlY2F1c2Ugb2YgdGhlIG90aGVyIGF0dHJpYnV0ZXMsIHNvIHdlIGRvIGhhdmUgdG8gY2FsbAorICAgICAgICAgICAgLy8gY254LT5ob29rcy0+ZWdsLmVnbENob29zZUNvbmZpZygpIC0tIGJ1dCB3ZSBkb24ndCBoYXZlIHRvIGxvb3AKKyAgICAgICAgICAgIC8vIHRocm91Z2ggYWxsIHRoZSBFR0xpbXBsW10uCisgICAgICAgICAgICAvLyBXZSBhbHNvIGtub3cgd2UgY2FuIG9ubHkgZ2V0IGEgc2luZ2xlIGNvbmZpZyBiYWNrLCBhbmQgd2Uga25vdworICAgICAgICAgICAgLy8gd2hpY2ggb25lLgorCisgICAgICAgICAgICByZXMgPSBjbngtPmhvb2tzLT5lZ2wuZWdsQ2hvb3NlQ29uZmlnKAorICAgICAgICAgICAgICAgICAgICBkcC0+ZHB5c1tpXSwgYXR0cmliX2xpc3QsIGNvbmZpZ3MsIGNvbmZpZ19zaXplLCAmbik7CisgICAgICAgICAgICBpZiAocmVzICYmIG4+MCkgeworICAgICAgICAgICAgICAgIC8vIG4gaGFzIHRvIGJlIDAgb3IgMSwgYnkgY29uc3RydWN0aW9uLCBhbmQgd2UgYWxyZWFkeSBrbm93CisgICAgICAgICAgICAgICAgLy8gd2hpY2ggY29uZmlnIGl0IHdpbGwgcmV0dXJuIChzaW5jZSB0aGVyZSBjYW4gYmUgb25seSBvbmUpLgorICAgICAgICAgICAgICAgIGNvbmZpZ3NbMF0gPSBNQUtFX0NPTkZJRyhpLCBpbmRleCk7CisgICAgICAgICAgICAgICAgKm51bV9jb25maWcgPSAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZnJlZShjb25zdF9jYXN0PEVHTGludCAqPihhdHRyaWJfbGlzdCkpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKwogICAgIGZvciAoaW50IGk9MCA7IGk8MiA7IGkrKykgewogICAgICAgICBlZ2xfY29ubmVjdGlvbl90KiBjb25zdCBjbnggPSAmZ0VHTEltcGxbaV07CiAgICAgICAgIGlmIChjbngtPmRzbykgewotICAgICAgICAgICAgRUdMaW50IG47CiAgICAgICAgICAgICBpZiAoY254LT5ob29rcy0+ZWdsLmVnbENob29zZUNvbmZpZygKLSAgICAgICAgICAgICAgICAgICAgZHAtPmRweXNbaV0sIGF0dHJpYl9saXN0LCBjb25maWdzLCBjb25maWdfc2l6ZSwgJm4pKQotICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBkcC0+ZHB5c1tpXSwgYXR0cmliX2xpc3QsIGNvbmZpZ3MsIGNvbmZpZ19zaXplLCAmbikpIHsKICAgICAgICAgICAgICAgICAvLyBub3cgd2UgbmVlZCB0byBjb252ZXJ0IHRoZXNlIGNsaWVudCBFR0xDb25maWcgdG8gb3VyCiAgICAgICAgICAgICAgICAgLy8gaW50ZXJuYWwgRUdMQ29uZmlnIGZvcm1hdC4gVGhpcyBpcyBkb25lIGluIE8obiBsb2cgbikuCiAgICAgICAgICAgICAgICAgZm9yIChpbnQgaj0wIDsgajxuIDsgaisrKSB7CkBAIC0xMTAyLDYgKzExOTQsMTMgQEAKICAgICBpbnQgaT0wLCBpbmRleD0wOwogICAgIGVnbF9jb25uZWN0aW9uX3QqIGNueCA9IHZhbGlkYXRlX2Rpc3BsYXlfY29uZmlnKGRweSwgY29uZmlnLCBkcCwgaSwgaW5kZXgpOwogICAgIGlmICghY254KSByZXR1cm4gRUdMX0ZBTFNFOworICAgIAorICAgIGlmIChhdHRyaWJ1dGUgPT0gRUdMX0NPTkZJR19JRCkgeworICAgICAgICAvLyBFR0xfQ09ORklHX0lEcyBtdXN0IGJlIHVuaXF1ZSwganVzdCB1c2UgdGhlIG9yZGVyIG9mIHRoZSBzZWxlY3RlZAorICAgICAgICAvLyBFR0xDb25maWcuCisgICAgICAgICp2YWx1ZSA9IGNvbmZpZ1RvVW5pcXVlSWQoZHAsIGksIGluZGV4KTsKKyAgICAgICAgcmV0dXJuIEVHTF9UUlVFOworICAgIH0KICAgICByZXR1cm4gY254LT5ob29rcy0+ZWdsLmVnbEdldENvbmZpZ0F0dHJpYigKICAgICAgICAgICAgIGRwLT5kcHlzW2ldLCBkcC0+Y29uZmlnc1tpXVtpbmRleF0sIGF0dHJpYnV0ZSwgdmFsdWUpOwogfQpkaWZmIC0tZ2l0IGEvb3BlbmdsL2xpYmFnbC9UZXh0dXJlT2JqZWN0TWFuYWdlci5jcHAgYi9vcGVuZ2wvbGliYWdsL1RleHR1cmVPYmplY3RNYW5hZ2VyLmNwcAppbmRleCAxMmZhZTYzLi5jZTMxODU0IDEwMDY0NAotLS0gYS9vcGVuZ2wvbGliYWdsL1RleHR1cmVPYmplY3RNYW5hZ2VyLmNwcAorKysgYi9vcGVuZ2wvbGliYWdsL1RleHR1cmVPYmplY3RNYW5hZ2VyLmNwcApAQCAtMTI5LDcgKzEyOSw3IEBACiAgICAgLy8gc28gZm9yIG5vdywgd2UganVzdCBsb29zZSBpdC4KICAgICBtZW1zZXQoY3JvcF9yZWN0LCAwLCBzaXplb2YoY3JvcF9yZWN0KSk7CiAKLSAgICAvLyBpdCB3b3VsZCBiZSBuaWNlIGlkIHdlIGNvdWxkIGtlZXAgdGhlIGdlbmVyYXRlX21pcG1hcCBmbGFnCisgICAgLy8gaXQgd291bGQgYmUgbmljZSBpZiB3ZSBjb3VsZCBrZWVwIHRoZSBnZW5lcmF0ZV9taXBtYXAgZmxhZywKICAgICAvLyB3ZSB3b3VsZCBoYXZlIHRvIGdlbmVyYXRlIHRoZW0gcmlnaHQgbm93IHRob3VnaC4KICAgICBnZW5lcmF0ZV9taXBtYXAgPSBHTF9GQUxTRTsKIApAQCAtMjg2LDcgKzI4Niw3IEBACiAKIHZvaWQgRUdMU3VyZmFjZU1hbmFnZXI6OmRlbGV0ZVRleHR1cmVzKEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICp0b2tlbnMpCiB7Ci0gICAgLy8gZnJlZSBhbGwgdGV4dXJlcworICAgIC8vIGZyZWUgYWxsIHRleHR1cmVzCiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBmb3IgKEdMc2l6ZWkgaT0wIDsgaTxuIDsgaSsrKSB7CiAgICAgICAgIGNvbnN0IEdMdWludCB0KCp0b2tlbnMrKyk7CmRpZmYgLS1naXQgYS9vcGVuZ2wvbGliYWdsL2FycmF5LmNwcCBiL29wZW5nbC9saWJhZ2wvYXJyYXkuY3BwCmluZGV4IDFmNjc1N2QuLjhmYTc1NjYgMTAwNjQ0Ci0tLSBhL29wZW5nbC9saWJhZ2wvYXJyYXkuY3BwCisrKyBiL29wZW5nbC9saWJhZ2wvYXJyYXkuY3BwCkBAIC0xMTE2LDggKzExMTYsOCBAQAogICAgIGlmIChlbmFibGVzICYgR0dMX0VOQUJMRV9UTVVTKSB7IC8vIG5lZWRzIHRleHR1cmUgdHJhbnNmb3JtcwogICAgICAgICB3YW50IHw9IHRyYW5zZm9ybV9zdGF0ZV90OjpURVhUVVJFOwogICAgIH0KLSAgICBpZiAoYy0+Y2xpcFBsYW5lcy5lbmFibGUpIHsgLy8gbmVlZHMgZXllIGNvb3JkcwotICAgICAgICB3YW50IHw9IHRyYW5zZm9ybV9zdGF0ZV90OjpNT0RFTFZJRVc7CisgICAgaWYgKGMtPmNsaXBQbGFuZXMuZW5hYmxlIHx8IChlbmFibGVzICYgR0dMX0VOQUJMRV9GT0cpKSB7IAorICAgICAgICB3YW50IHw9IHRyYW5zZm9ybV9zdGF0ZV90OjpNT0RFTFZJRVc7IC8vIG5lZWRzIGV5ZSBjb29yZHMKICAgICB9CiAgICAgb2dsZXNfdmFsaWRhdGVfdHJhbnNmb3JtKGMsIHdhbnQpOwogCmRpZmYgLS1naXQgYS9vcGVuZ2wvbGliYWdsL2VnbC5jcHAgYi9vcGVuZ2wvbGliYWdsL2VnbC5jcHAKaW5kZXggODU0YTQ5ZS4uM2U4ZGNhOSAxMDA2NDQKLS0tIGEvb3BlbmdsL2xpYmFnbC9lZ2wuY3BwCisrKyBiL29wZW5nbC9saWJhZ2wvZWdsLmNwcApAQCAtMzYsNiArMzYsNyBAQAogI2luY2x1ZGUgPEdMRVMvZWdsLmg+CiAKICNpbmNsdWRlIDxwaXhlbGZsaW5nZXIvZm9ybWF0Lmg+CisjaW5jbHVkZSA8cGl4ZWxmbGluZ2VyL3BpeGVsZmxpbmdlci5oPgogCiAjaW5jbHVkZSAiY29udGV4dC5oIgogI2luY2x1ZGUgInN0YXRlLmgiCkBAIC01Nyw3ICs1OCw3IEBACiAjaWZuZGVmIEhBVkVfQU5EUk9JRF9PUwogbmFtZXNwYWNlIGdsIHsKIHB0aHJlYWRfa2V5X3QgZ0dMS2V5ID0gLTE7Ci19OyAvLyBuYW1zcGFjZSBnbAorfTsgLy8gbmFtZXNwYWNlIGdsCiAjZW5kaWYKIAogdGVtcGxhdGU8dHlwZW5hbWUgVD4KQEAgLTE1Niw3ICsxNTcsNyBAQAogZWdsX3N1cmZhY2VfdDo6ZWdsX3N1cmZhY2VfdChFR0xEaXNwbGF5IGRweSwKICAgICAgICAgRUdMQ29uZmlnIGNvbmZpZywKICAgICAgICAgaW50MzJfdCBkZXB0aEZvcm1hdCkKLSAgICA6IG1hZ2ljKDB4MzE0MTUyNjUpLCBkcHkoZHB5KSwgY29uZmlnKGNvbmZpZyksIGN0eCgwKQorICAgIDogbWFnaWMoTUFHSUMpLCBkcHkoZHB5KSwgY29uZmlnKGNvbmZpZyksIGN0eCgwKQogewogICAgIGRlcHRoLnZlcnNpb24gPSBzaXplb2YoR0dMU3VyZmFjZSk7CiAgICAgZGVwdGguZGF0YSA9IDA7CkBAIC0yNDAsNyArMjQxLDcgQEAKIHsKICAgICB1aW50MzJfdCBmbGFncyA9IG5hdGl2ZVdpbmRvdy0+c3dhcEJ1ZmZlcnMobmF0aXZlV2luZG93KTsKICAgICBpZiAoZmxhZ3MgJiBFR0xfTkFUSVZFU19GTEFHX1NJWkVfQ0hBTkdFRCkgewotICAgICAgICAvLyBUT0RPOiB3ZSBwcm9iYWx5IHNob3VsZCByZXNldCB0aGUgc3dhcCByZWN0IGhlcmUKKyAgICAgICAgLy8gVE9ETzogd2UgcHJvYmFibHkgc2hvdWxkIHJlc2V0IHRoZSBzd2FwIHJlY3QgaGVyZQogICAgICAgICAvLyBpZiB0aGUgd2luZG93IHNpemUgaGFzIGNoYW5nZWQKICAgICAgICAgLy8gICAgd2luZG93LT5zZXRTd2FwUmVjdGFuZ2xlKFJlY3QoaW5mby53LCBpbmZvLmgpKTsKICAgICAgICAgaWYgKGRlcHRoLmRhdGEpIHsKQEAgLTQwMiwxMiArNDAzLDEzIEBACiB7CiAgICAgc2l6ZV90IHNpemUgPSB3Kmg7CiAgICAgc3dpdGNoIChmKSB7Ci0gICAgY2FzZSBHR0xfUElYRUxfRk9STUFUX1JHQl81NjU6ICAgICAgc2l6ZSAqPSAyOyBicmVhazsKLSAgICBjYXNlIEdHTF9QSVhFTF9GT1JNQVRfUkdCQV84ODg4OiAgICBzaXplICo9IDQ7IGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIExPR0UoImluY29tcGF0aWJsZSBwaXhlbCBmb3JtYXQgZm9yIHBidWZmZXIgKGZvcm1hdD0lZCkiLCBmKTsKLSAgICAgICAgcGJ1ZmZlci5kYXRhID0gMDsKLSAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgR0dMX1BJWEVMX0ZPUk1BVF9BXzg6ICAgICAgICAgIHNpemUgKj0gMTsgYnJlYWs7CisgICAgICAgIGNhc2UgR0dMX1BJWEVMX0ZPUk1BVF9SR0JfNTY1OiAgICAgIHNpemUgKj0gMjsgYnJlYWs7CisgICAgICAgIGNhc2UgR0dMX1BJWEVMX0ZPUk1BVF9SR0JBXzg4ODg6ICAgIHNpemUgKj0gNDsgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBMT0dFKCJpbmNvbXBhdGlibGUgcGl4ZWwgZm9ybWF0IGZvciBwYnVmZmVyIChmb3JtYXQ9JWQpIiwgZik7CisgICAgICAgICAgICBwYnVmZmVyLmRhdGEgPSAwOworICAgICAgICAgICAgYnJlYWs7CiAgICAgfQogICAgIHBidWZmZXIudmVyc2lvbiA9IHNpemVvZihHR0xTdXJmYWNlKTsKICAgICBwYnVmZmVyLndpZHRoICAgPSB3OwpAQCAtNDg4LDI4ICs0OTAsMjggQEAKIH07CiAKIHN0YXRpYyBjb25zdCBleHRlbnRpb25fbWFwX3QgZ0V4dGVudGlvbk1hcFtdID0gewotICAgIHsgImVnbFN3YXBSZWN0YW5nbGVBTkRST0lEIiwgICAgICAgICAgICAodm9pZCgqKSgpKSZlZ2xTd2FwUmVjdGFuZ2xlQU5EUk9JRCB9LAotICAgIHsgImdsRHJhd1RleHNPRVMiLCAgICAgICAgICAgICAgICAgICAgICAodm9pZCgqKSgpKSZnbERyYXdUZXhzT0VTIH0sCi0gICAgeyAiZ2xEcmF3VGV4aU9FUyIsICAgICAgICAgICAgICAgICAgICAgICh2b2lkKCopKCkpJmdsRHJhd1RleGlPRVMgfSwKLSAgICB7ICJnbERyYXdUZXhmT0VTIiwgICAgICAgICAgICAgICAgICAgICAgKHZvaWQoKikoKSkmZ2xEcmF3VGV4Zk9FUyB9LAotICAgIHsgImdsRHJhd1RleHhPRVMiLCAgICAgICAgICAgICAgICAgICAgICAodm9pZCgqKSgpKSZnbERyYXdUZXh4T0VTIH0sCi0gICAgeyAiZ2xEcmF3VGV4c3ZPRVMiLCAgICAgICAgICAgICAgICAgICAgICh2b2lkKCopKCkpJmdsRHJhd1RleHN2T0VTIH0sCi0gICAgeyAiZ2xEcmF3VGV4aXZPRVMiLCAgICAgICAgICAgICAgICAgICAgICh2b2lkKCopKCkpJmdsRHJhd1RleGl2T0VTIH0sCi0gICAgeyAiZ2xEcmF3VGV4ZnZPRVMiLCAgICAgICAgICAgICAgICAgICAgICh2b2lkKCopKCkpJmdsRHJhd1RleGZ2T0VTIH0sCi0gICAgeyAiZ2xEcmF3VGV4eHZPRVMiLCAgICAgICAgICAgICAgICAgICAgICh2b2lkKCopKCkpJmdsRHJhd1RleHh2T0VTIH0sCi0gICAgeyAiZ2xRdWVyeU1hdHJpeHhPRVMiLCAgICAgICAgICAgICAgICAgICh2b2lkKCopKCkpJmdsUXVlcnlNYXRyaXh4T0VTIH0sCi0gICAgeyAiZ2xDbGlwUGxhbmVmIiwgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKCopKCkpJmdsQ2xpcFBsYW5lZiB9LAotICAgIHsgImdsQ2xpcFBsYW5leCIsICAgICAgICAgICAgICAgICAgICAgICAodm9pZCgqKSgpKSZnbENsaXBQbGFuZXggfSwKLSAgICB7ICJnbEJpbmRCdWZmZXIiLCAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQoKikoKSkmZ2xCaW5kQnVmZmVyIH0sCi0gICAgeyAiZ2xCdWZmZXJEYXRhIiwgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKCopKCkpJmdsQnVmZmVyRGF0YSB9LAotICAgIHsgImdsQnVmZmVyU3ViRGF0YSIsICAgICAgICAgICAgICAgICAgICAodm9pZCgqKSgpKSZnbEJ1ZmZlclN1YkRhdGEgfSwKLSAgICB7ICJnbERlbGV0ZUJ1ZmZlcnMiLCAgICAgICAgICAgICAgICAgICAgKHZvaWQoKikoKSkmZ2xEZWxldGVCdWZmZXJzIH0sCi0gICAgeyAiZ2xHZW5CdWZmZXJzIiwgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKCopKCkpJmdsR2VuQnVmZmVycyB9LAorICAgIHsgImVnbFN3YXBSZWN0YW5nbGVBTkRST0lEIiwgICAgKHZvaWQoKikoKSkmZWdsU3dhcFJlY3RhbmdsZUFORFJPSUQgfSwKKyAgICB7ICJnbERyYXdUZXhzT0VTIiwgICAgICAgICAgICAgICh2b2lkKCopKCkpJmdsRHJhd1RleHNPRVMgfSwKKyAgICB7ICJnbERyYXdUZXhpT0VTIiwgICAgICAgICAgICAgICh2b2lkKCopKCkpJmdsRHJhd1RleGlPRVMgfSwKKyAgICB7ICJnbERyYXdUZXhmT0VTIiwgICAgICAgICAgICAgICh2b2lkKCopKCkpJmdsRHJhd1RleGZPRVMgfSwKKyAgICB7ICJnbERyYXdUZXh4T0VTIiwgICAgICAgICAgICAgICh2b2lkKCopKCkpJmdsRHJhd1RleHhPRVMgfSwKKyAgICB7ICJnbERyYXdUZXhzdk9FUyIsICAgICAgICAgICAgICh2b2lkKCopKCkpJmdsRHJhd1RleHN2T0VTIH0sCisgICAgeyAiZ2xEcmF3VGV4aXZPRVMiLCAgICAgICAgICAgICAodm9pZCgqKSgpKSZnbERyYXdUZXhpdk9FUyB9LAorICAgIHsgImdsRHJhd1RleGZ2T0VTIiwgICAgICAgICAgICAgKHZvaWQoKikoKSkmZ2xEcmF3VGV4ZnZPRVMgfSwKKyAgICB7ICJnbERyYXdUZXh4dk9FUyIsICAgICAgICAgICAgICh2b2lkKCopKCkpJmdsRHJhd1RleHh2T0VTIH0sCisgICAgeyAiZ2xRdWVyeU1hdHJpeHhPRVMiLCAgICAgICAgICAodm9pZCgqKSgpKSZnbFF1ZXJ5TWF0cml4eE9FUyB9LAorICAgIHsgImdsQ2xpcFBsYW5lZiIsICAgICAgICAgICAgICAgKHZvaWQoKikoKSkmZ2xDbGlwUGxhbmVmIH0sCisgICAgeyAiZ2xDbGlwUGxhbmV4IiwgICAgICAgICAgICAgICAodm9pZCgqKSgpKSZnbENsaXBQbGFuZXggfSwKKyAgICB7ICJnbEJpbmRCdWZmZXIiLCAgICAgICAgICAgICAgICh2b2lkKCopKCkpJmdsQmluZEJ1ZmZlciB9LAorICAgIHsgImdsQnVmZmVyRGF0YSIsICAgICAgICAgICAgICAgKHZvaWQoKikoKSkmZ2xCdWZmZXJEYXRhIH0sCisgICAgeyAiZ2xCdWZmZXJTdWJEYXRhIiwgICAgICAgICAgICAodm9pZCgqKSgpKSZnbEJ1ZmZlclN1YkRhdGEgfSwKKyAgICB7ICJnbERlbGV0ZUJ1ZmZlcnMiLCAgICAgICAgICAgICh2b2lkKCopKCkpJmdsRGVsZXRlQnVmZmVycyB9LAorICAgIHsgImdsR2VuQnVmZmVycyIsICAgICAgICAgICAgICAgKHZvaWQoKikoKSkmZ2xHZW5CdWZmZXJzIH0sCiB9OwogCiAvKiAKICAqIEluIHRoZSBsaXN0cyBiZWxvdywgYXR0cmlidXRlcyBuYW1lcyBNVVNUIGJlIHNvcnRlZC4KLSAqIEFkZGl0aW5uYWx5LCBhbGwgY29uZmlncyBtdXN0IGJlIHNvcnRlZCBhY2NvcmRpbmcgdG8KKyAqIEFkZGl0aW9uYWxseSwgYWxsIGNvbmZpZ3MgbXVzdCBiZSBzb3J0ZWQgYWNjb3JkaW5nIHRvCiAgKiB0aGUgRUdMIHNwZWNpZmljYXRpb24uCiAgKi8KIApAQCAtNTE3LDkgKzUxOSwxMCBAQAogICAgICAgICB7IEVHTF9TVEVOQ0lMX1NJWkUsICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgIHsgRUdMX0NPTkZJR19DQVZFQVQsICAgICAgICAgICAgICBFR0xfU0xPV19DT05GSUcgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgeyBFR0xfTEVWRUwsICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgICAgICB7IEVHTF9NQVhfUEJVRkZFUl9IRUlHSFQsICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCi0gICAgICAgIHsgRUdMX01BWF9QQlVGRkVSX1BJWEVMUywgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICAgICAgeyBFR0xfTUFYX1BCVUZGRVJfV0lEVEgsICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICB7IEVHTF9NQVhfUEJVRkZFUl9IRUlHSFQsICAgICAgICAgR0dMX01BWF9WSUVXUE9SVF9ESU1TICAgICAgICAgICAgIH0sCisgICAgICAgIHsgRUdMX01BWF9QQlVGRkVSX1BJWEVMUywgICAgICAgICAKKyAgICAgICAgICAgICAgICBHR0xfTUFYX1ZJRVdQT1JUX0RJTVMqR0dMX01BWF9WSUVXUE9SVF9ESU1TICAgICAgICAgICAgICAgICB9LAorICAgICAgICB7IEVHTF9NQVhfUEJVRkZFUl9XSURUSCwgICAgICAgICAgR0dMX01BWF9WSUVXUE9SVF9ESU1TICAgICAgICAgICAgIH0sCiAgICAgICAgIHsgRUdMX05BVElWRV9SRU5ERVJBQkxFLCAgICAgICAgICBFR0xfVFJVRSAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgeyBFR0xfTkFUSVZFX1ZJU1VBTF9JRCwgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICB7IEVHTF9OQVRJVkVfVklTVUFMX1RZUEUsICAgICAgICAgR0dMX1BJWEVMX0ZPUk1BVF9SR0JfNTY1ICAgICAgICAgIH0sCkBAIC01MzYsNDkgKzUzOSw3MiBAQAogfTsKIAogLy8gVGhlc2UgY29uZmlncyBjYW4gb3ZlcnJpZGUgdGhlIGJhc2UgYXR0cmlidXRlIGxpc3QKKy8vIE5PVEU6IHdoZW4gYWRkaW5nIGEgY29uZmlnIGhlcmUsIGRvbid0IGZvcmdldCB0byB1cGRhdGUgZWdsQ3JlYXRlKlN1cmZhY2UoKQogCiBzdGF0aWMgY29uZmlnX3BhaXJfdCBjb25zdCBjb25maWdfMF9hdHRyaWJ1dGVfbGlzdFtdID0gewotICAgICAgICB7IEVHTF9CVUZGRVJfU0laRSwgICAgICAgIDE2IH0sCi0gICAgICAgIHsgRUdMX0FMUEhBX1NJWkUsICAgICAgICAgIDAgfSwKLSAgICAgICAgeyBFR0xfQkxVRV9TSVpFLCAgICAgICAgICAgNSB9LAotICAgICAgICB7IEVHTF9HUkVFTl9TSVpFLCAgICAgICAgICA2IH0sCi0gICAgICAgIHsgRUdMX1JFRF9TSVpFLCAgICAgICAgICAgIDUgfSwKLSAgICAgICAgeyBFR0xfREVQVEhfU0laRSwgICAgICAgICAgMCB9LAotICAgICAgICB7IEVHTF9DT05GSUdfSUQsICAgICAgICAgICAwIH0sCi0gICAgICAgIHsgRUdMX1NVUkZBQ0VfVFlQRSwgICAgICAgIEVHTF9XSU5ET1dfQklUIHwgRUdMX1BJWE1BUF9CSVQgfSwKKyAgICAgICAgeyBFR0xfQlVGRkVSX1NJWkUsICAgICAxNiB9LAorICAgICAgICB7IEVHTF9BTFBIQV9TSVpFLCAgICAgICAwIH0sCisgICAgICAgIHsgRUdMX0JMVUVfU0laRSwgICAgICAgIDUgfSwKKyAgICAgICAgeyBFR0xfR1JFRU5fU0laRSwgICAgICAgNiB9LAorICAgICAgICB7IEVHTF9SRURfU0laRSwgICAgICAgICA1IH0sCisgICAgICAgIHsgRUdMX0RFUFRIX1NJWkUsICAgICAgIDAgfSwKKyAgICAgICAgeyBFR0xfQ09ORklHX0lELCAgICAgICAgMCB9LAorICAgICAgICB7IEVHTF9TVVJGQUNFX1RZUEUsICAgICBFR0xfV0lORE9XX0JJVHxFR0xfUEJVRkZFUl9CSVR8RUdMX1BJWE1BUF9CSVQgfSwKIH07CiAKIHN0YXRpYyBjb25maWdfcGFpcl90IGNvbnN0IGNvbmZpZ18xX2F0dHJpYnV0ZV9saXN0W10gPSB7Ci0gICAgICAgIHsgRUdMX0JVRkZFUl9TSVpFLCAgICAgICAgMTYgfSwKLSAgICAgICAgeyBFR0xfQUxQSEFfU0laRSwgICAgICAgICAgMCB9LAotICAgICAgICB7IEVHTF9CTFVFX1NJWkUsICAgICAgICAgICA1IH0sCi0gICAgICAgIHsgRUdMX0dSRUVOX1NJWkUsICAgICAgICAgIDYgfSwKLSAgICAgICAgeyBFR0xfUkVEX1NJWkUsICAgICAgICAgICAgNSB9LAotICAgICAgICB7IEVHTF9ERVBUSF9TSVpFLCAgICAgICAgIDE2IH0sCi0gICAgICAgIHsgRUdMX0NPTkZJR19JRCwgICAgICAgICAgIDEgfSwKLSAgICAgICAgeyBFR0xfU1VSRkFDRV9UWVBFLCAgICAgICAgRUdMX1dJTkRPV19CSVQgfCBFR0xfUElYTUFQX0JJVCB9LAorICAgICAgICB7IEVHTF9CVUZGRVJfU0laRSwgICAgIDE2IH0sCisgICAgICAgIHsgRUdMX0FMUEhBX1NJWkUsICAgICAgIDAgfSwKKyAgICAgICAgeyBFR0xfQkxVRV9TSVpFLCAgICAgICAgNSB9LAorICAgICAgICB7IEVHTF9HUkVFTl9TSVpFLCAgICAgICA2IH0sCisgICAgICAgIHsgRUdMX1JFRF9TSVpFLCAgICAgICAgIDUgfSwKKyAgICAgICAgeyBFR0xfREVQVEhfU0laRSwgICAgICAxNiB9LAorICAgICAgICB7IEVHTF9DT05GSUdfSUQsICAgICAgICAxIH0sCisgICAgICAgIHsgRUdMX1NVUkZBQ0VfVFlQRSwgICAgIEVHTF9XSU5ET1dfQklUfEVHTF9QQlVGRkVSX0JJVHxFR0xfUElYTUFQX0JJVCB9LAogfTsKIAogc3RhdGljIGNvbmZpZ19wYWlyX3QgY29uc3QgY29uZmlnXzJfYXR0cmlidXRlX2xpc3RbXSA9IHsKLSAgICAgICAgeyBFR0xfQlVGRkVSX1NJWkUsICAgICAgICAzMiB9LAotICAgICAgICB7IEVHTF9BTFBIQV9TSVpFLCAgICAgICAgICA4IH0sCi0gICAgICAgIHsgRUdMX0JMVUVfU0laRSwgICAgICAgICAgIDggfSwKLSAgICAgICAgeyBFR0xfR1JFRU5fU0laRSwgICAgICAgICAgOCB9LAotICAgICAgICB7IEVHTF9SRURfU0laRSwgICAgICAgICAgICA4IH0sCi0gICAgICAgIHsgRUdMX0RFUFRIX1NJWkUsICAgICAgICAgIDAgfSwKLSAgICAgICAgeyBFR0xfQ09ORklHX0lELCAgICAgICAgICAgMiB9LAotICAgICAgICB7IEVHTF9TVVJGQUNFX1RZUEUsICAgICAgICBFR0xfV0lORE9XX0JJVCB8IEVHTF9QSVhNQVBfQklUIH0sCisgICAgICAgIHsgRUdMX0JVRkZFUl9TSVpFLCAgICAgMzIgfSwKKyAgICAgICAgeyBFR0xfQUxQSEFfU0laRSwgICAgICAgOCB9LAorICAgICAgICB7IEVHTF9CTFVFX1NJWkUsICAgICAgICA4IH0sCisgICAgICAgIHsgRUdMX0dSRUVOX1NJWkUsICAgICAgIDggfSwKKyAgICAgICAgeyBFR0xfUkVEX1NJWkUsICAgICAgICAgOCB9LAorICAgICAgICB7IEVHTF9ERVBUSF9TSVpFLCAgICAgICAwIH0sCisgICAgICAgIHsgRUdMX0NPTkZJR19JRCwgICAgICAgIDIgfSwKKyAgICAgICAgeyBFR0xfU1VSRkFDRV9UWVBFLCAgICAgRUdMX1dJTkRPV19CSVR8RUdMX1BCVUZGRVJfQklUfEVHTF9QSVhNQVBfQklUIH0sCiB9OwogCiBzdGF0aWMgY29uZmlnX3BhaXJfdCBjb25zdCBjb25maWdfM19hdHRyaWJ1dGVfbGlzdFtdID0gewotICAgICAgICB7IEVHTF9CVUZGRVJfU0laRSwgICAgICAgIDMyIH0sCi0gICAgICAgIHsgRUdMX0FMUEhBX1NJWkUsICAgICAgICAgIDggfSwKLSAgICAgICAgeyBFR0xfQkxVRV9TSVpFLCAgICAgICAgICAgOCB9LAotICAgICAgICB7IEVHTF9HUkVFTl9TSVpFLCAgICAgICAgICA4IH0sCi0gICAgICAgIHsgRUdMX1JFRF9TSVpFLCAgICAgICAgICAgIDggfSwKLSAgICAgICAgeyBFR0xfREVQVEhfU0laRSwgICAgICAgICAxNiB9LAotICAgICAgICB7IEVHTF9DT05GSUdfSUQsICAgICAgICAgICAzIH0sCi0gICAgICAgIHsgRUdMX1NVUkZBQ0VfVFlQRSwgICAgICAgIEVHTF9XSU5ET1dfQklUIHwgRUdMX1BJWE1BUF9CSVQgfSwKKyAgICAgICAgeyBFR0xfQlVGRkVSX1NJWkUsICAgICAzMiB9LAorICAgICAgICB7IEVHTF9BTFBIQV9TSVpFLCAgICAgICA4IH0sCisgICAgICAgIHsgRUdMX0JMVUVfU0laRSwgICAgICAgIDggfSwKKyAgICAgICAgeyBFR0xfR1JFRU5fU0laRSwgICAgICAgOCB9LAorICAgICAgICB7IEVHTF9SRURfU0laRSwgICAgICAgICA4IH0sCisgICAgICAgIHsgRUdMX0RFUFRIX1NJWkUsICAgICAgMTYgfSwKKyAgICAgICAgeyBFR0xfQ09ORklHX0lELCAgICAgICAgMyB9LAorICAgICAgICB7IEVHTF9TVVJGQUNFX1RZUEUsICAgICBFR0xfV0lORE9XX0JJVHxFR0xfUEJVRkZFUl9CSVR8RUdMX1BJWE1BUF9CSVQgfSwKK307CisKK3N0YXRpYyBjb25maWdfcGFpcl90IGNvbnN0IGNvbmZpZ180X2F0dHJpYnV0ZV9saXN0W10gPSB7CisgICAgICAgIHsgRUdMX0JVRkZFUl9TSVpFLCAgICAgIDggfSwKKyAgICAgICAgeyBFR0xfQUxQSEFfU0laRSwgICAgICAgOCB9LAorICAgICAgICB7IEVHTF9CTFVFX1NJWkUsICAgICAgICAwIH0sCisgICAgICAgIHsgRUdMX0dSRUVOX1NJWkUsICAgICAgIDAgfSwKKyAgICAgICAgeyBFR0xfUkVEX1NJWkUsICAgICAgICAgMCB9LAorICAgICAgICB7IEVHTF9ERVBUSF9TSVpFLCAgICAgICAwIH0sCisgICAgICAgIHsgRUdMX0NPTkZJR19JRCwgICAgICAgIDQgfSwKKyAgICAgICAgeyBFR0xfU1VSRkFDRV9UWVBFLCAgICAgRUdMX1dJTkRPV19CSVR8RUdMX1BCVUZGRVJfQklUfEVHTF9QSVhNQVBfQklUIH0sCit9OworCitzdGF0aWMgY29uZmlnX3BhaXJfdCBjb25zdCBjb25maWdfNV9hdHRyaWJ1dGVfbGlzdFtdID0geworICAgICAgICB7IEVHTF9CVUZGRVJfU0laRSwgICAgICA4IH0sCisgICAgICAgIHsgRUdMX0FMUEhBX1NJWkUsICAgICAgIDggfSwKKyAgICAgICAgeyBFR0xfQkxVRV9TSVpFLCAgICAgICAgMCB9LAorICAgICAgICB7IEVHTF9HUkVFTl9TSVpFLCAgICAgICAwIH0sCisgICAgICAgIHsgRUdMX1JFRF9TSVpFLCAgICAgICAgIDAgfSwKKyAgICAgICAgeyBFR0xfREVQVEhfU0laRSwgICAgICAxNiB9LAorICAgICAgICB7IEVHTF9DT05GSUdfSUQsICAgICAgICA1IH0sCisgICAgICAgIHsgRUdMX1NVUkZBQ0VfVFlQRSwgICAgIEVHTF9XSU5ET1dfQklUfEVHTF9QQlVGRkVSX0JJVHxFR0xfUElYTUFQX0JJVCB9LAogfTsKIAogc3RhdGljIGNvbmZpZ3NfdCBjb25zdCBnQ29uZmlnc1tdID0gewpAQCAtNTg2LDYgKzYxMiw4IEBACiAgICAgICAgIHsgY29uZmlnXzFfYXR0cmlidXRlX2xpc3QsIE5FTEVNKGNvbmZpZ18xX2F0dHJpYnV0ZV9saXN0KSB9LAogICAgICAgICB7IGNvbmZpZ18yX2F0dHJpYnV0ZV9saXN0LCBORUxFTShjb25maWdfMl9hdHRyaWJ1dGVfbGlzdCkgfSwKICAgICAgICAgeyBjb25maWdfM19hdHRyaWJ1dGVfbGlzdCwgTkVMRU0oY29uZmlnXzNfYXR0cmlidXRlX2xpc3QpIH0sCisgICAgICAgIHsgY29uZmlnXzRfYXR0cmlidXRlX2xpc3QsIE5FTEVNKGNvbmZpZ180X2F0dHJpYnV0ZV9saXN0KSB9LAorICAgICAgICB7IGNvbmZpZ181X2F0dHJpYnV0ZV9saXN0LCBORUxFTShjb25maWdfNV9hdHRyaWJ1dGVfbGlzdCkgfSwKIH07CiAKIHN0YXRpYyBjb25maWdfbWFuYWdlbWVudF90IGNvbnN0IGdDb25maWdNYW5hZ2VtZW50W10gPSB7CkBAIC02NjksNyArNjk3LDcgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIGF0dHJpYnV0ZSBub250IGZvdW5kLiB0aGlzIHNob3VsZCBORVZFUiBoYXBwZW4uCisgICAgICAgICAgICAvLyBhdHRyaWJ1dGUgbm90IGZvdW5kLiB0aGlzIHNob3VsZCBORVZFUiBoYXBwZW4uCiAgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICAvLyBlcnJvciwgdGhpcyBhdHRyaWJ1dGUgZG9lc24ndCBleGlzdApAQCAtNzc5LDExICs4MDcsMTkgQEAKICAgICAgICAgcGl4ZWxGb3JtYXQgPSBHR0xfUElYRUxfRk9STUFUX1JHQkFfODg4ODsgCiAgICAgICAgIGRlcHRoRm9ybWF0ID0gR0dMX1BJWEVMX0ZPUk1BVF9aXzE2OwogICAgICAgICBicmVhazsKKyAgICBjYXNlIDQ6CisgICAgICAgIHBpeGVsRm9ybWF0ID0gR0dMX1BJWEVMX0ZPUk1BVF9BXzg7IAorICAgICAgICBkZXB0aEZvcm1hdCA9IDA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNToKKyAgICAgICAgcGl4ZWxGb3JtYXQgPSBHR0xfUElYRUxfRk9STUFUX0FfODsgCisgICAgICAgIGRlcHRoRm9ybWF0ID0gR0dMX1BJWEVMX0ZPUk1BVF9aXzE2OworICAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgogICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9NQVRDSCwgRUdMX05PX1NVUkZBQ0UpOwogICAgIH0KIAotICAgIC8vIFhYWDogd2UgZG9uJ3QgaGF2ZSBhY2Nlc3MgdG8gdGhlIHBpeGVsRm9ybWF0IGhlcmUganVzdCB5ZXQuCisgICAgLy8gRklYTUU6IHdlIGRvbid0IGhhdmUgYWNjZXNzIHRvIHRoZSBwaXhlbEZvcm1hdCBoZXJlIGp1c3QgeWV0LgogICAgIC8vIChpdCdzIHBvc3NpYmxlIHRoYXQgdGhlIHN1cmZhY2UgaXMgbm90IGZ1bGx5IGluaXRpYWxpemVkKQogICAgIC8vIG1heWJlIHRoaXMgc2hvdWxkIGJlIGRvbmUgYWZ0ZXIgdGhlIHBhZ2UtZmxpcAogICAgIC8vaWYgKEVHTGludChpbmZvLmZvcm1hdCkgIT0gcGl4ZWxGb3JtYXQpCkBAIC04NDAsNiArODc2LDE0IEBACiAgICAgICAgIHBpeGVsRm9ybWF0ID0gR0dMX1BJWEVMX0ZPUk1BVF9SR0JBXzg4ODg7IAogICAgICAgICBkZXB0aEZvcm1hdCA9IEdHTF9QSVhFTF9GT1JNQVRfWl8xNjsKICAgICAgICAgYnJlYWs7CisgICAgY2FzZSA0OgorICAgICAgICBwaXhlbEZvcm1hdCA9IEdHTF9QSVhFTF9GT1JNQVRfQV84OyAKKyAgICAgICAgZGVwdGhGb3JtYXQgPSAwOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDU6CisgICAgICAgIHBpeGVsRm9ybWF0ID0gR0dMX1BJWEVMX0ZPUk1BVF9BXzg7IAorICAgICAgICBkZXB0aEZvcm1hdCA9IEdHTF9QSVhFTF9GT1JNQVRfWl8xNjsKKyAgICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKICAgICAgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfTUFUQ0gsIEVHTF9OT19TVVJGQUNFKTsKICAgICB9CkBAIC04OTYsNiArOTQwLDE0IEBACiAgICAgICAgIHBpeGVsRm9ybWF0ID0gR0dMX1BJWEVMX0ZPUk1BVF9SR0JBXzg4ODg7IAogICAgICAgICBkZXB0aEZvcm1hdCA9IEdHTF9QSVhFTF9GT1JNQVRfWl8xNjsKICAgICAgICAgYnJlYWs7CisgICAgY2FzZSA0OgorICAgICAgICBwaXhlbEZvcm1hdCA9IEdHTF9QSVhFTF9GT1JNQVRfQV84OyAKKyAgICAgICAgZGVwdGhGb3JtYXQgPSAwOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDU6CisgICAgICAgIHBpeGVsRm9ybWF0ID0gR0dMX1BJWEVMX0ZPUk1BVF9BXzg7IAorICAgICAgICBkZXB0aEZvcm1hdCA9IEdHTF9QSVhFTF9GT1JNQVRfWl8xNjsKKyAgICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKICAgICAgICAgcmV0dXJuIHNldEVycm9yKEVHTF9CQURfTUFUQ0gsIEVHTF9OT19TVVJGQUNFKTsKICAgICB9CkBAIC05NzksNyArMTAzMSw3IEBACiAgICAgRUdMQm9vbGVhbiByZXMgPSBFR0xfVFJVRTsKICAgICBlZ2xfZGlzcGxheV90JiBkID0gZWdsX2Rpc3BsYXlfdDo6Z2V0X2Rpc3BsYXkoZHB5KTsKICAgICBpZiAoYW5kcm9pZF9hdG9taWNfZGVjKCZkLmluaXRpYWxpemVkKSA9PSAxKSB7Ci0gICAgICAgIC8vIFRPRE86IGRlc3Ryb3kgYWxsIHJlc291cmNlcyAoc3VyZmFjZXMsIGNvbnRleHRlcywgZXRjLi4uKQorICAgICAgICAvLyBUT0RPOiBkZXN0cm95IGFsbCByZXNvdXJjZXMgKHN1cmZhY2VzLCBjb250ZXh0cywgZXRjLi4uKQogICAgICAgICAvL3B0aHJlYWRfbXV0ZXhfbG9jaygmZ0luaXRNdXRleCk7CiAgICAgICAgIC8vcHRocmVhZF9tdXRleF91bmxvY2soJmdJbml0TXV0ZXgpOwogICAgIH0KQEAgLTExMDUsMTEgKzExNTcsNyBAQAogRUdMU3VyZmFjZSBlZ2xDcmVhdGVQYnVmZmVyU3VyZmFjZSggRUdMRGlzcGxheSBkcHksIEVHTENvbmZpZyBjb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFR0xpbnQgKmF0dHJpYl9saXN0KQogewotICAgIC8vIG5vbmUgb2Ygb3VyIGNvbmZpZ3Mgc3VwcG9ydCBwYnVmZmVycwotICAgIC8vIChpbiBmYWN0IGl0J3Mgd29ya2luZyBidXQgc2luY2Ugd2UgY2FuJ3QgdXNlIHRoZW0gYXMgCi0gICAgLy8gdGV4dHVyZXMgeWV0LCBpdCdzIG5vdCB1c2VmdWwgYXQgYWxsKQotICAgIC8vY3JlYXRlUGJ1ZmZlclN1cmZhY2UoZHB5LCBjb25maWcsIGF0dHJpYl9saXN0KTsKLSAgICByZXR1cm4gRUdMX05PX1NVUkZBQ0U7CisgICAgcmV0dXJuIGNyZWF0ZVBidWZmZXJTdXJmYWNlKGRweSwgY29uZmlnLCBhdHRyaWJfbGlzdCk7CiB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKIEVHTEJvb2xlYW4gZWdsRGVzdHJveVN1cmZhY2UoRUdMRGlzcGxheSBkcHksIEVHTFN1cmZhY2UgZWdsU3VyZmFjZSkKQEAgLTEyMzEsNiArMTI3OSwxMyBAQAogICAgIH0KIAogICAgIEVHTENvbnRleHQgY3VycmVudF9jdHggPSBFR0xfTk9fQ09OVEVYVDsKKyAgICAKKyAgICBpZiAoKHJlYWQgPT0gRUdMX05PX1NVUkZBQ0UgJiYgZHJhdyA9PSBFR0xfTk9fU1VSRkFDRSkgJiYgKGN0eCAhPSBFR0xfTk9fQ09OVEVYVCkpCisgICAgICAgIHJldHVybiBzZXRFcnJvcihFR0xfQkFEX01BVENILCBFR0xfRkFMU0UpOworCisgICAgaWYgKChyZWFkICE9IEVHTF9OT19TVVJGQUNFIHx8IGRyYXcgIT0gRUdMX05PX1NVUkZBQ0UpICYmIChjdHggPT0gRUdMX05PX0NPTlRFWFQpKQorICAgICAgICByZXR1cm4gc2V0RXJyb3IoRUdMX0JBRF9NQVRDSCwgRUdMX0ZBTFNFKTsKKwogICAgIGlmIChjdHggPT0gRUdMX05PX0NPTlRFWFQpIHsKICAgICAgICAgLy8gaWYgd2UncmUgZGV0YWNoaW5nLCB3ZSBuZWVkIHRoZSBjdXJyZW50IGNvbnRleHQKICAgICAgICAgY3VycmVudF9jdHggPSAoRUdMQ29udGV4dClnZXRHbFRocmVhZFNwZWNpZmljKCk7CkBAIC0xNDg2LDcgKzE1NDEsNyBAQAogfQogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBBbmRyb2lkIGV4dGVudGlvbnMKKy8vIEFuZHJvaWQgZXh0ZW5zaW9ucwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiB2b2lkICgqZWdsR2V0UHJvY0FkZHJlc3MgKGNvbnN0IGNoYXIgKnByb2NuYW1lKSkoKQpkaWZmIC0tZ2l0IGEvb3BlbmdsL2xpYmFnbC9saWdodC5jcHAgYi9vcGVuZ2wvbGliYWdsL2xpZ2h0LmNwcAppbmRleCA4NzcyNWNiLi4yNWM0MWQwIDEwMDY0NAotLS0gYS9vcGVuZ2wvbGliYWdsL2xpZ2h0LmNwcAorKysgYi9vcGVuZ2wvbGliYWdsL2xpZ2h0LmNwcApAQCAtMTE3LDExICsxMTcsMTEgQEAKIH0KIAogc3RhdGljIEdMZml4ZWQgZm9nX2xpbmVhcihvZ2xlc19jb250ZXh0X3QqIGMsIEdMZml4ZWQgeikgewotICAgIHJldHVybiBjbGFtcEYoZ2dsTXVseCgoYy0+Zm9nLmVuZCAtIHopLCBjLT5mb2cuaW52RW5kTWludXNTdGFydCkpOworICAgIHJldHVybiBjbGFtcEYoZ2dsTXVseCgoYy0+Zm9nLmVuZCAtICgoejwwKT8tejp6KSksIGMtPmZvZy5pbnZFbmRNaW51c1N0YXJ0KSk7CiB9CiAKIHN0YXRpYyBHTGZpeGVkIGZvZ19leHAob2dsZXNfY29udGV4dF90KiBjLCBHTGZpeGVkIHopIHsKLSAgICBjb25zdCBmbG9hdCBlID0gZml4ZWRUb0Zsb2F0KGdnbE11bHgoYy0+Zm9nLmRlbnNpdHksIHopKTsKKyAgICBjb25zdCBmbG9hdCBlID0gZml4ZWRUb0Zsb2F0KGdnbE11bHgoYy0+Zm9nLmRlbnNpdHksICgoejwwKT8tejp6KSkpOwogICAgIHJldHVybiBjbGFtcEYoZ2dsRmxvYXRUb0ZpeGVkKGZhc3RleHBmKC1lKSkpOwogfQogCkBAIC01NTYsMTEgKzU1NiwxMSBAQAogICAgICAgICBvZ2xlc19lcnJvcihjLCBHTF9JTlZBTElEX1ZBTFVFKTsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBHTF9GT0dfU1RBUlQ6Ci0gICAgICAgIGMtPmZvZy5zdGFydCA9IGdnbENsYW1weChwYXJhbSk7CisgICAgICAgIGMtPmZvZy5zdGFydCA9IHBhcmFtOwogICAgICAgICBjLT5mb2cuaW52RW5kTWludXNTdGFydCA9IGdnbFJlY2lwKGMtPmZvZy5lbmQgLSBjLT5mb2cuc3RhcnQpOwogICAgICAgICBicmVhazsKICAgICBjYXNlIEdMX0ZPR19FTkQ6Ci0gICAgICAgIGMtPmZvZy5lbmQgPSBnZ2xDbGFtcHgocGFyYW0pOworICAgICAgICBjLT5mb2cuZW5kID0gcGFyYW07CiAgICAgICAgIGMtPmZvZy5pbnZFbmRNaW51c1N0YXJ0ID0gZ2dsUmVjaXAoYy0+Zm9nLmVuZCAtIGMtPmZvZy5zdGFydCk7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgR0xfRk9HX01PREU6CmRpZmYgLS1naXQgYS9vcGVuZ2wvbGliYWdsL21hdHJpeC5jcHAgYi9vcGVuZ2wvbGliYWdsL21hdHJpeC5jcHAKaW5kZXggNDQxZGEzOC4uZjE3NWNkYSAxMDA2NDQKLS0tIGEvb3BlbmdsL2xpYmFnbC9tYXRyaXguY3BwCisrKyBiL29wZW5nbC9saWJhZ2wvbWF0cml4LmNwcApAQCAtOTgsOCArOTgsOSBAQAogICAgIGMtPmFycmF5cy5wZXJzcGVjdGl2ZSA9IChjLT5jbGlwUGxhbmVzLmVuYWJsZSkgPwogICAgICAgICBvZ2xlc192ZXJ0ZXhfY2xpcEFsbFBlcnNwZWN0aXZlM0QgOiBvZ2xlc192ZXJ0ZXhfcGVyc3BlY3RpdmUzRDsKICAgICBpZiAoZW5hYmxlcyAmIChHR0xfRU5BQkxFX0RFUFRIX1RFU1R8R0dMX0VOQUJMRV9GT0cpKSB7Ci0gICAgICAgIGMtPmFycmF5cy5wZXJzcGVjdGl2ZSA9IChjLT5jbGlwUGxhbmVzLmVuYWJsZSkgPwotICAgICAgICAgICAgb2dsZXNfdmVydGV4X2NsaXBBbGxQZXJzcGVjdGl2ZTNEWiA6IG9nbGVzX3ZlcnRleF9wZXJzcGVjdGl2ZTNEWjsKKyAgICAgICAgYy0+YXJyYXlzLnBlcnNwZWN0aXZlID0gb2dsZXNfdmVydGV4X3BlcnNwZWN0aXZlM0RaOworICAgICAgICBpZiAoYy0+Y2xpcFBsYW5lcy5lbmFibGUgfHwgKGVuYWJsZXMmR0dMX0VOQUJMRV9GT0cpKQorICAgICAgICAgICAgYy0+YXJyYXlzLnBlcnNwZWN0aXZlID0gb2dsZXNfdmVydGV4X2NsaXBBbGxQZXJzcGVjdGl2ZTNEWjsKICAgICB9CiAgICAgaWYgKChjLT5hcnJheXMudmVydGV4LnNpemUgIT0gNCkgJiYKICAgICAgICAgKGMtPnRyYW5zZm9ybXMubXZwNC5mbGFncyAmIHRyYW5zZm9ybV90OjpGTEFHU18yRF9QUk9KRUNUSU9OKSkgewpkaWZmIC0tZ2l0IGEvb3BlbmdsL2xpYmFnbC9wcmltaXRpdmVzLmNwcCBiL29wZW5nbC9saWJhZ2wvcHJpbWl0aXZlcy5jcHAKaW5kZXggMjBlOGQzNy4uZjE2NGMwMiAxMDA2NDQKLS0tIGEvb3BlbmdsL2xpYmFnbC9wcmltaXRpdmVzLmNwcAorKysgYi9vcGVuZ2wvbGliYWdsL3ByaW1pdGl2ZXMuY3BwCkBAIC0xMzMsNyArMTMzLDcgQEAKIHsKICAgICBpZiAoISh2LT5mbGFncyAmIHZlcnRleF90OjpMSVQpKSB7CiAgICAgICAgIHYtPmZsYWdzIHw9IHZlcnRleF90OjpMSVQ7Ci0gICAgICAgIHYtPmZvZyA9IGMtPmZvZy5mb2coYywgdi0+d2luZG93LnopOworICAgICAgICB2LT5mb2cgPSBjLT5mb2cuZm9nKGMsIHYtPmV5ZS56KTsKICAgICAgICAgY29uc3QgR0x2b2lkKiBjcCA9IGMtPmFycmF5cy5jb2xvci5lbGVtZW50KAogICAgICAgICAgICAgICAgIHYtPmluZGV4ICYgdmVydGV4X2NhY2hlX3Q6OklOREVYX01BU0spOwogICAgICAgICBjLT5hcnJheXMuY29sb3IuZmV0Y2goYywgdi0+Y29sb3IudiwgY3ApOwpAQCAtMTQ0LDE0ICsxNDQsMTQgQEAKIHsKICAgICBpZiAoISh2LT5mbGFncyAmIHZlcnRleF90OjpMSVQpKSB7CiAgICAgICAgIHYtPmZsYWdzIHw9IHZlcnRleF90OjpMSVQ7Ci0gICAgICAgIHYtPmZvZyA9IGMtPmZvZy5mb2coYywgdi0+d2luZG93LnopOworICAgICAgICB2LT5mb2cgPSBjLT5mb2cuZm9nKGMsIHYtPmV5ZS56KTsKICAgICB9CiB9CiBzdGF0aWMgaW5saW5lCiB2b2lkIGxpZ2h0VmVydGV4U21vb3RoRm9nKG9nbGVzX2NvbnRleHRfdCogYywgdmVydGV4X3QqIHYpCiB7CiAgICAgaWYgKCEodi0+ZmxhZ3MgJiB2ZXJ0ZXhfdDo6TElUKSkgewotICAgICAgICB2LT5mb2cgPSBjLT5mb2cuZm9nKGMsIHYtPndpbmRvdy56KTsKKyAgICAgICAgdi0+Zm9nID0gYy0+Zm9nLmZvZyhjLCB2LT5leWUueik7CiAgICAgICAgIGMtPmxpZ2h0aW5nLmxpZ2h0VmVydGV4KGMsIHYpOwogICAgIH0KIH0KQEAgLTI0MywxMiArMjQzLDIwIEBACiAgICAgbV9hcmVhID0gbV9keDAxKm1fZHkwMiArICgtbV9keTEwKSptX2R4MjA7CiB9CiAKK3ZvaWQgY29tcHV0ZV9pdGVyYXRvcnNfdDo6aW5pdExpbmUoCisgICAgICAgIHZlcnRleF90IGNvbnN0KiB2MCwgdmVydGV4X3QgY29uc3QqIHYxKQoreworICAgIG1fZHgwMSA9IG1fZHkwMiA9IHYxLT53aW5kb3cueCAtIHYwLT53aW5kb3cueDsKKyAgICBtX2R5MTAgPSBtX2R4MjAgPSB2MC0+d2luZG93LnkgLSB2MS0+d2luZG93Lnk7CisgICAgbV9hcmVhID0gbV9keDAxKm1fZHkwMiArICgtbV9keTEwKSptX2R4MjA7Cit9CisKIHZvaWQgY29tcHV0ZV9pdGVyYXRvcnNfdDo6aW5pdExlcnAodmVydGV4X3QgY29uc3QqIHYwLCB1aW50MzJfdCBlbmFibGVzKQogewogICAgIG1feDAgPSB2MC0+d2luZG93Lng7CiAgICAgbV95MCA9IHYwLT53aW5kb3cueTsKICAgICBjb25zdCBHR0xjb29yZCBhcmVhID0gKG1fYXJlYSArIFRSSV9IQUxGKSA+PiBUUklfRlJBQ1RJT05fQklUUzsKLSAgICBjb25zdCBHR0xjb29yZCBtaW5BcmVhID0gMjsgLy8gY2Fubm90IGJlIGludmVyc2VkCisgICAgY29uc3QgR0dMY29vcmQgbWluQXJlYSA9IDI7IC8vIGNhbm5vdCBiZSBpbnZlcnRlZAogICAgIC8vIHRyaWFuZ2xlcyB3aXRoIGFuIGFyZWEgc21hbGxlciB0aGFuIDEuMCBhcmUgbm90IHNtb290aC1zaGFkZWQKIAogICAgIGludCBxPTAsIHM9MCwgZD0wOwpAQCAtMzM2LDYgKzM0NCwyMCBAQAogICAgIGl0WzJdID0gZGNkeTsKIH0KIAordm9pZCBjb21wdXRlX2l0ZXJhdG9yc190OjppdGVyYXRvcnMwMDMyKGludDY0X3QqIGl0LAorICAgICAgICBpbnQzMl90IGMwLCBpbnQzMl90IGMxLCBpbnQzMl90IGMyKSBjb25zdAoreworICAgIGNvbnN0IGludCBzID0gbV9hcmVhX3NjYWxlIC0gMTY7CisgICAgaW50MzJfdCBkYzAxID0gKGMxIC0gYzApPj5zOworICAgIGludDMyX3QgZGMwMiA9IChjMiAtIGMwKT4+czsKKyAgICAvLyAxNi4xNiB4IDE2LjE2ID09IDMyLjMyCisgICAgaW50NjRfdCBkY2R4ID0gZ2dsTXVsaWkoZGMwMSwgbV9keTAyKSArIGdnbE11bGlpKGRjMDIsIG1fZHkxMCk7CisgICAgaW50NjRfdCBkY2R5ID0gZ2dsTXVsaWkoZGMwMiwgbV9keDAxKSArIGdnbE11bGlpKGRjMDEsIG1fZHgyMCk7CisgICAgaXRbIDBdID0gKGMwPDwxNikgLSAoKGRjZHgqbV94MCArIGRjZHkqbV95MCk+PjQpOworICAgIGl0WyAxXSA9IGRjZHg7CisgICAgaXRbIDJdID0gZGNkeTsKK30KKwogI2lmIGRlZmluZWQoX19hcm1fXykgJiYgIWRlZmluZWQoX190aHVtYl9fKQogaW5saW5lIHZvaWQgY29tcHV0ZV9pdGVyYXRvcnNfdDo6aXRlcmF0b3JzMDAzMihpbnQzMl90KiBpdCwKICAgICAgICAgaW50MzJfdCBjMCwgaW50MzJfdCBjMSwgaW50MzJfdCBjMikgY29uc3QKQEAgLTM0NiwxNiArMzY4LDExIEBACiB2b2lkIGNvbXB1dGVfaXRlcmF0b3JzX3Q6Oml0ZXJhdG9yczAwMzIoaW50MzJfdCogaXQsCiAgICAgICAgIGludDMyX3QgYzAsIGludDMyX3QgYzEsIGludDMyX3QgYzIpIGNvbnN0CiB7Ci0gICAgY29uc3QgaW50IHMgPSBtX2FyZWFfc2NhbGUgLSAxNjsKLSAgICBpbnQzMl90IGRjMDEgPSAoYzEgLSBjMCk+PnM7Ci0gICAgaW50MzJfdCBkYzAyID0gKGMyIC0gYzApPj5zOwotICAgIC8vIDE2LjE2IHggMTYuMTYgPT0gMzIuMzIKLSAgICBpbnQ2NF90IGRjZHggPSBnZ2xNdWxpaShkYzAxLCBtX2R5MDIpICsgZ2dsTXVsaWkoZGMwMiwgbV9keTEwKTsKLSAgICBpbnQ2NF90IGRjZHkgPSBnZ2xNdWxpaShkYzAyLCBtX2R4MDEpICsgZ2dsTXVsaWkoZGMwMSwgbV9keDIwKTsKLSAgICBpbnQzMl90IGMgPSAoYzA8PDE2KSAtICgoZGNkeCptX3gwICsgZGNkeSptX3kwKT4+NCk7Ci0gICAgaXRbIDBdID0gYzsKLSAgICBpdFsgMV0gPSBkY2R4OwotICAgIGl0WyAyXSA9IGRjZHk7CisgICAgaW50NjRfdCBpdDY0WzNdOworICAgIGl0ZXJhdG9yczAwMzIoaXQsIGMwLCBjMSwgYzIpOworICAgIGl0WzBdID0gaXQ2NFswXTsKKyAgICBpdFsxXSA9IGl0NjRbMV07CisgICAgaXRbMl0gPSBpdDY0WzJdOwogfQogI2VuZGlmCiAKQEAgLTQ1NCw3ICs0NzEsNyBAQAogICAgICAgICAgICAgYy0+YXJyYXlzLmNvbG9yLmZldGNoKGMsIHYtPmNvbG9yLnYsIGNwKTsKICAgICAgICAgfQogICAgICAgICBpZiAoZW5hYmxlcyAmIEdHTF9FTkFCTEVfRk9HKSB7Ci0gICAgICAgICAgICB2LT5mb2cgPSBjLT5mb2cuZm9nKGMsIHYtPndpbmRvdy56KTsKKyAgICAgICAgICAgIHYtPmZvZyA9IGMtPmZvZy5mb2coYywgdi0+ZXllLnopOwogICAgICAgICB9CiAgICAgfQogCkBAIC01MTQsMjIgKzUzMSwxMiBAQAogCiB2b2lkIHByaW1pdGl2ZV9saW5lKG9nbGVzX2NvbnRleHRfdCogYywgdmVydGV4X3QqIHYwLCB2ZXJ0ZXhfdCogdjEpCiB7Ci0gICAgLy8gVGhpcyBpcyBhIGNoZWV6eSBpbXBsZW1lbnRhdGlvbiBvZiBsaW5lIGRyYXdpbmcgdGhhdAotICAgIC8vIHVzZXMgMiB0cmlhbmdsZXMgcGVyIGxpbmUuIAotICAgIC8vIFRoYXQgc2FpZCwgaG93IG9mdGVuIGxpbmUgZHJhd2luZyBpcyB1c2VkPwotCiAgICAgLy8gZ2V0IHRleHR1cmUgY29vcmRpbmF0ZXMKICAgICBmZXRjaF90ZXhjb29yZChjLCB2MCwgdjEsIHYxKTsKIAogICAgIC8vIGxpZ2h0L3NoYWRlIHRoZSB2ZXJ0aWNlcyBmaXJzdCAodGhleSdyZSBjb3BpZWQgYmVsb3cpCiAgICAgYy0+bGlnaHRpbmcubGlnaHRUcmlhbmdsZShjLCB2MCwgdjEsIHYxKTsKIAotICAgIHZlcnRleF90IHZbNF07Ci0gICAgdlswXSA9ICp2MDsKLSAgICB2WzFdID0gKnYxOwotICAgIHYwID0gJnZbMF07Ci0gICAgdjEgPSAmdlsxXTsKLQogICAgIC8vIGNsaXAgdGhlIGxpbmUgaWYgbmVlZGVkCiAgICAgaWYgKGdnbF91bmxpa2VseSgodjAtPmZsYWdzIHwgdjEtPmZsYWdzKSAmIHZlcnRleF90OjpDTElQX0FMTCkpIHsKICAgICAgICAgdW5zaWduZWQgaW50IGNvdW50ID0gY2xpcF9saW5lKGMsIHYwLCB2MSk7CkBAIC01NDYsOCArNTUzLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHR0xfRU5BQkxFX0RFUFRIX1RFU1Q7CiAKICAgICBpZiAoZ2dsX3VubGlrZWx5KGVuYWJsZXMgJiBtYXNrKSkgewotICAgICAgICBjLT5sZXJwLmluaXRUcmlhbmdsZSh2MCwgdjEsIHYxKTsKLSAgICAgICAgbGVycF90cmlhbmdsZShjLCB2MCwgdjEsIHYxKTsKKyAgICAgICAgYy0+bGVycC5pbml0TGluZSh2MCwgdjEpOworICAgICAgICBsZXJwX3RyaWFuZ2xlKGMsIHYwLCB2MSwgdjApOwogICAgIH0KIAogICAgIC8vIHJlbmRlciBvdXIgbGluZQpAQCAtNjU0LDE3ICs2NjEsMjYgQEAKICAgICAgICAgY29uc3QgaW50MzJfdCB2MHogPSBjbGFtcFoodjAtPndpbmRvdy56KTsKICAgICAgICAgY29uc3QgaW50MzJfdCB2MXogPSBjbGFtcFoodjEtPndpbmRvdy56KTsKICAgICAgICAgY29uc3QgaW50MzJfdCB2MnogPSBjbGFtcFoodjItPndpbmRvdy56KTsKLSAgICAgICAgbGVycC5pdGVyYXRvcnMwMDMyKGl0eiwgdjB6LCB2MXosIHYyeik7CiAgICAgICAgIGlmIChnZ2xfdW5saWtlbHkoYy0+cG9seWdvbk9mZnNldC5lbmFibGUpKSB7CisgICAgICAgICAgICBjb25zdCBpbnQzMl90IHVuaXRzID0gKGMtPnBvbHlnb25PZmZzZXQudW5pdHMgPDwgMTYpOwogICAgICAgICAgICAgY29uc3QgR0xmaXhlZCBmYWN0b3IgPSBjLT5wb2x5Z29uT2Zmc2V0LmZhY3RvcjsKLSAgICAgICAgICAgIGNvbnN0IEdMZml4ZWQgdW5pdHMgPSBjLT5wb2x5Z29uT2Zmc2V0LnVuaXRzOwotICAgICAgICAgICAgaW50MzJfdCBtYXhEZXB0aFNsb3BlID0gbWF4KGFicyhpdHpbMV0pLCBhYnMoaXR6WzJdKSk7Ci0gICAgICAgICAgICBpbnQzMl90IG9mZnNldCA9IChpbnQ2NF90KG1heERlcHRoU2xvcGUpKmZhY3RvciArCi0gICAgICAgICAgICAgICAgICAgIChpbnQ2NF90KHVuaXRzKSA8PCAxNikpID4+IDE2OwotICAgICAgICAgICAgaXR6WzBdICs9IG9mZnNldDsgLy8gWFhYOiB0aGlzIGNhbiBjYXVzZSBvdmVyZmxvd3MKKyAgICAgICAgICAgIGlmIChmYWN0b3IpIHsKKyAgICAgICAgICAgICAgICBpbnQ2NF90IGl0ejY0WzNdOworICAgICAgICAgICAgICAgIGxlcnAuaXRlcmF0b3JzMDAzMihpdHo2NCwgdjB6LCB2MXosIHYyeik7CisgICAgICAgICAgICAgICAgaW50NjRfdCBtYXhEZXB0aFNsb3BlID0gbWF4KGl0ejY0WzFdLCBpdHo2NFsyXSk7CisgICAgICAgICAgICAgICAgaXR6WzBdID0gdWludDMyX3QoaXR6NjRbMF0pIAorICAgICAgICAgICAgICAgICAgICAgICAgKyB1aW50MzJfdCgobWF4RGVwdGhTbG9wZSpmYWN0b3IpPj4xNikgKyB1bml0czsKKyAgICAgICAgICAgICAgICBpdHpbMV0gPSB1aW50MzJfdChpdHo2NFsxXSk7CisgICAgICAgICAgICAgICAgaXR6WzJdID0gdWludDMyX3QoaXR6NjRbMl0pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBsZXJwLml0ZXJhdG9yczAwMzIoaXR6LCB2MHosIHYxeiwgdjJ6KTsKKyAgICAgICAgICAgICAgICBpdHpbMF0gKz0gdW5pdHM7IAorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbGVycC5pdGVyYXRvcnMwMDMyKGl0eiwgdjB6LCB2MXosIHYyeik7CiAgICAgICAgIH0KICAgICAgICAgYy0+cmFzdGVyaXplci5wcm9jcy56R3JhZDN4dihjLCBpdHopOwotICAgIH0KKyAgICB9ICAgIAogCiAgICAgaWYgKGdnbF91bmxpa2VseShlbmFibGVzICYgR0dMX0VOQUJMRV9GT0cpKSB7CiAgICAgICAgIEdMZml4ZWQgaXRmWzNdOwpAQCAtODgwLDExICs4OTYsMTEgQEAKICAgICAgICAgICAgICAgICB2ZXJ0ZXhfdCoqIG91dHB1dCA9IG92bDsKICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgb2MgPSAwOwogICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzZW50aW5lbCA9IDA7Ci0gICAgICAgICAgICAgICAgLy8gcHJldmlvdXMgdmVydGljZSwgY29tcHV0ZSBkaXN0YW5jZSB0byB0aGUgcGxhbmUKKyAgICAgICAgICAgICAgICAvLyBwcmV2aW91cyB2ZXJ0ZXgsIGNvbXB1dGUgZGlzdGFuY2UgdG8gdGhlIHBsYW5lCiAgICAgICAgICAgICAgICAgdmVydGV4X3QqIHMgPSBpdmxbaWMtMV07CiAgICAgICAgICAgICAgICAgY29uc3QgdmVjNF90JiBlcXVhdGlvbiA9IGMtPmNsaXBQbGFuZXMucGxhbmVbcGxhbmVdLmVxdWF0aW9uOwogICAgICAgICAgICAgICAgIEdMZml4ZWQgc2QgPSBkb3Q0KGVxdWF0aW9uLnYsIHMtPmV5ZS52KTsKLSAgICAgICAgICAgICAgICAvLyBjbGlwIGVhY2ggdmVydGljZSBhZ2FpbnN0IHRoaXMgcGxhbmUuLi4KKyAgICAgICAgICAgICAgICAvLyBjbGlwIGVhY2ggdmVydGV4IGFnYWluc3QgdGhpcyBwbGFuZS4uLgogICAgICAgICAgICAgICAgIGZvciAodW5zaWduZWQgaW50IGk9MCA7IGk8aWMgOyBpKyspIHsgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgdmVydGV4X3QqIHAgPSBpdmxbaV07CiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdMZml4ZWQgcGQgPSBkb3Q0KGVxdWF0aW9uLnYsIHAtPmV5ZS52KTsKQEAgLTk0NiwxMCArOTYyLDEwIEBACiAgICAgICAgICAgICAgICAgdmVydGV4X3QqKiBvdXRwdXQgPSBvdmw7CiAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG9jID0gMDsKICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc2VudGluZWwgPSAwOwotICAgICAgICAgICAgICAgIC8vIHByZXZpb3VzIHZlcnRpY2UsIGNvbXB1dGUgZGlzdGFuY2UgdG8gdGhlIHBsYW5lCisgICAgICAgICAgICAgICAgLy8gcHJldmlvdXMgdmVydGV4LCBjb21wdXRlIGRpc3RhbmNlIHRvIHRoZSBwbGFuZQogICAgICAgICAgICAgICAgIHZlcnRleF90KiBzID0gaXZsW2ljLTFdOwogICAgICAgICAgICAgICAgIEdMZml4ZWQgc2QgPSBmcnVzdHVtUGxhbmVEaXN0KHBsYW5lLCBzLT5jbGlwKTsKLSAgICAgICAgICAgICAgICAvLyBjbGlwIGVhY2ggdmVydGljZSBhZ2FpbnN0IHRoaXMgcGxhbmUuLi4KKyAgICAgICAgICAgICAgICAvLyBjbGlwIGVhY2ggdmVydGV4IGFnYWluc3QgdGhpcyBwbGFuZS4uLgogICAgICAgICAgICAgICAgIGZvciAodW5zaWduZWQgaW50IGk9MCA7IGk8aWMgOyBpKyspIHsgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgdmVydGV4X3QqIHAgPSBpdmxbaV07CiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdMZml4ZWQgcGQgPSBmcnVzdHVtUGxhbmVEaXN0KHBsYW5lLCBwLT5jbGlwKTsKZGlmZiAtLWdpdCBhL29wZW5nbC9saWJhZ2wvdmVydGV4LmNwcCBiL29wZW5nbC9saWJhZ2wvdmVydGV4LmNwcAppbmRleCA1YmNjOWRjLi5kYWQwNGQ2IDEwMDY0NAotLS0gYS9vcGVuZ2wvbGliYWdsL3ZlcnRleC5jcHAKKysrIGIvb3BlbmdsL2xpYmFnbC92ZXJ0ZXguY3BwCkBAIC05OSw3ICs5OSw3IEBACiAgICAgYy0+YXJyYXlzLmN1bGwgJj0gY2xpcDsKIAogICAgIGlmIChnZ2xfbGlrZWx5KCFjbGlwKSkgewotICAgICAgICAvLyBpZiB0aGUgdmVydGljZSBpcyBjbGlwcGVkLCB3ZSBkb24ndCBkbyB0aGUgcGVyc3BlY3RpdmUKKyAgICAgICAgLy8gaWYgdGhlIHZlcnRleCBpcyBjbGlwcGVkLCB3ZSBkb24ndCBkbyB0aGUgcGVyc3BlY3RpdmUKICAgICAgICAgLy8gZGl2aWRlLCBzaW5jZSB3ZSBkb24ndCBuZWVkIGl0cyB3aW5kb3cgY29vcmRpbmF0ZXMuCiAgICAgICAgIHBlcnNwZWN0aXZlKGMsIHYsIGVuYWJsZXMpOwogICAgIH0KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9BbmRyb2lkLm1rIGIvb3BlbmdsL3Rlc3RzL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTA1M2U3ZAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy9BbmRyb2lkLm1rCkBAIC0wLDAgKzEgQEAKK2luY2x1ZGUgJChjYWxsIGFsbC1zdWJkaXItbWFrZWZpbGVzKQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvQW5kcm9pZC5tayBiL29wZW5nbC90ZXN0cy9hbmdlbGVzL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE2NzNjYgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy9hbmdlbGVzL0FuZHJvaWQubWsKQEAgLTAsMCArMSwxNyBAQAorIyBDb3B5cmlnaHQgMjAwNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9TUkNfRklMRVM6PSBhcHAtbGludXguYyBkZW1vLmMuYXJtCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYkdMRVNfQ00gbGlidWkKK0xPQ0FMX01PRFVMRTo9IGFuZ2VsZXMKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCitpbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKKworCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKK0xPQ0FMX1NSQ19GSUxFUzo9IGdwdXN0YXRlLmMKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliR0xFU19DTQorTE9DQUxfTU9EVUxFOj0gZ3B1c3RhdGUKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCitpbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9hbmdlbGVzL01PRFVMRV9MSUNFTlNFX0JTRF9PUl9MR1BMIGIvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvTU9EVUxFX0xJQ0VOU0VfQlNEX09SX0xHUEwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy9hbmdlbGVzL01PRFVMRV9MSUNFTlNFX0JTRF9PUl9MR1BMCmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9SRUFETUUudHh0IGIvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvUkVBRE1FLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGI4YTRhCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvUkVBRE1FLnR4dApAQCAtMCwwICsxLDc3IEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCitTYW4gQW5nZWxlcyBPYnNlcnZhdGlvbiBPcGVuR0wgRVMgdmVyc2lvbiBleGFtcGxlDQorQ29weXJpZ2h0IDIwMDQtMjAwNSBKZXRybyBMYXVoYQ0KK1dlYjogaHR0cDovL2lraS5maS9qZXRyby8NCitTZWUgZmlsZSBsaWNlbnNlLnR4dCBmb3IgbGljZW5zaW5nIGluZm9ybWF0aW9uLg0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KK1RoaXMgaXMgYW4gT3BlbkdMIEVTIHBvcnQgb2YgdGhlIHNtYWxsIHNlbGYtcnVubmluZyBkZW1vbnN0cmF0aW9uDQorY2FsbGVkICJTYW4gQW5nZWxlcyBPYnNlcnZhdGlvbiIsIHdoaWNoIHdhcyBmaXJzdCBwcmVzZW50ZWQgaW4gdGhlDQorQXNzZW1ibHknMjAwNCBldmVudC4gSXQgd29uIHRoZSBmaXJzdCBwbGFjZSBpbiB0aGUgNCBLQiBpbnRybw0KK2NvbXBldGl0aW9uIGNhdGVnb3J5Lg0KKw0KK1RoZSBkZW1vbnN0cmF0aW9uIGZlYXR1cmVzIGEgc2lnaHRzZWVpbmcgb2YgYSBmdXR1cmlzdGljIGNpdHkNCitoYXZpbmcgbWFueSBkaWZmZXJlbnQga2luZCBvZiBidWlsZGluZ3MgYW5kIGl0ZW1zLiBFdmVyeXRoaW5nIGlzDQorZmxhdCBzaGFkZWQgd2l0aCB0aHJlZSBkaWZmZXJlbnQgbGlnaHRzLg0KKw0KK1RoZSBvcmlnaW5hbCB2ZXJzaW9uIHdhcyBtYWRlIGZvciBkZXNrdG9wIHdpdGggT3BlbkdMLiBJdCB3YXMNCituYXR1cmFsbHkgaGVhdmlseSBzaXplIG9wdGltaXplZCBpbiBvcmRlciB0byBmaXQgaXQgaW4gdGhlIHNpemUNCitsaW1pdC4gRm9yIHRoaXMgT3BlbkdMIEVTIHZlcnNpb24gZXhhbXBsZSBtdWNoIG9mIHRoZSBjb2RlIGlzDQorY2xlYW5lZCB1cCBhbmQgdGhlIHNvdW5kIGlzIHJlbW92ZWQuIEFsc28gZGV0YWlsIGxldmVsIGlzIGxvd2VyZWQsDQorYWx0aG91Z2ggaXQgc3RpbGwgY29udGFpbnMgb3ZlciA2MDAwMCBmYWNlcy4NCisNCitUaGUgV2luMzIgKDIwMDAvWFApIGJpbmFyeSBwYWNrYWdlIG9mIG9yaWdpbmFsIHZlcnNpb24gaXMNCithdmFpbGFibGUgZnJvbSB0aGlzIGFkZHJlc3M6IGh0dHA6Ly9qZXQucm8vZmlsZXMvYW5nZWxlcy56aXANCisNCitGaXJzdCB2ZXJzaW9uIG9mIHRoaXMgT3BlbkdMIEVTIHBvcnQgd2FzIHN1Ym1pdHRlZCB0byB0aGUgS2hyb25vcw0KK09wZW5HTCBFUyBDb2RpbmcgQ2hhbGxlbmdlIGhlbGQgaW4gMjAwNC0yMDA1Lg0KKw0KK0FzIGEgY29kZSBleGFtcGxlLCB0aGlzIHNvdXJjZSBzaG93cyB0aGUgZm9sbG93aW5nOg0KKyAgKiBIb3cgdG8gY3JlYXRlIGEgbWluaW1hbCBhbmQgcG9ydGFibGUgYWQgaG9jIGZyYW1ld29yaw0KKyAgICBmb3Igc21hbGwgdGVzdGluZy9kZW1vbnN0cmF0aW9uIHByb2dyYW1zLiBUaGlzIGZyYW1ld29yaw0KKyAgICBjb21waWxlcyBmb3IgYm90aCBkZXNrdG9wIGFuZCBQb2NrZXRQQyBXaW4zMiBlbnZpcm9ubWVudCwNCisgICAgYW5kIGEgc2VwYXJhdGUgc291cmNlIGlzIGluY2x1ZGVkIGZvciBMaW51eCB3aXRoIFgxMS4NCisgICogSG93IHRvIGR5bmFtaWNhbGx5IGZpbmQgYW5kIHVzZSB0aGUgT3BlbkdMIEVTIERMTCBvcg0KKyAgICBzaGFyZWQgb2JqZWN0LCBzbyB0aGF0IHRoZSBsaWJyYXJ5IGlzIG5vdCBuZWVkZWQgYXQNCisgICAgdGhlIGNvbXBpbGUvbGluayBzdGFnZS4NCisgICogSG93IHRvIHVzZSB0aGUgYmFzaWMgZmVhdHVyZXMgb2YgT3BlbkdMIEVTIDEuMC8xLjENCisgICAgQ29tbW9uIExpdGUsIHN1Y2ggYXMgdmVydGV4IGFycmF5cywgY29sb3IgYXJyYXlzIGFuZA0KKyAgICBsaWdodGluZy4NCisgICogSG93IHRvIGNyZWF0ZSBhIHNlbGYgY29udGFpbmVkIHNtYWxsIGRlbW9uc3RyYXRpb24NCisgICAgYXBwbGljYXRpb24gd2l0aCBvYmplY3RzIGdlbmVyYXRlZCB1c2luZyBwcm9jZWR1cmFsDQorICAgIGFsZ29yaXRobXMuDQorDQorQXMgdGhlIG9yaWdpbmFsIHZlcnNpb24gd2FzIG9wdGltaXplZCBmb3Igc2l6ZSBpbnN0ZWFkIG9mDQorcGVyZm9ybWFuY2UsIHRoYXQgaG9sZHMgdHJ1ZSBmb3IgdGhpcyBPcGVuR0wgRVMgdmVyc2lvbiBhcw0KK3dlbGwuIFRodXMgdGhlIHBlcmZvcm1hbmNlIGNvdWxkIGJlIHNpZ25pZmljYW50bHkgaW5jcmVhc2VkLA0KK2ZvciBleGFtcGxlIGJ5IGNoYW5naW5nIHRoZSBjb2RlIHRvIHVzZSBnbERyYXdFbGVtZW50cw0KK2luc3RlYWQgb2YgZ2xEcmF3QXJyYXlzLiBUaGUgY29kZSB1c2VzIG9ubHkgT3BlbkdMIEVTIDEuMA0KK0NvbW1vbiBMaXRlIC1sZXZlbCBmdW5jdGlvbiBjYWxscyB3aXRob3V0IGFueSBleHRlbnNpb25zLg0KKw0KK1RoZSByZWZlcmVuY2UgT3BlbkdMIEVTIGltcGxlbWVudGF0aW9ucyB1c2VkIGZvciB0aGlzIGFwcGxpY2F0aW9uOg0KKyAgKiBIeWJyaWQncyBPcGVuR0wgRVMgQVBJIEltcGxlbWVudGF0aW9uIChHZXJiZXJhKSB2ZXJzaW9uIDIuMC40DQorICAgIFByZWJ1aWx0IFdpbjMyIFBDIGV4ZWN1dGFibGU6IFNhbk9HTEVTLUdlcmJlcmEuZXhlDQorICAqIFBvd2VyVlIgTUJYIFNESywgT3BlbkdMIEVTIFdpbmRvd3MgUEMgRW11bGF0aW9uIHZlcnNpb24gMS4wNC4xNC4wMTcwDQorICAgIFByZWJ1aWx0IFdpbjMyIFBDIGV4ZWN1dGFibGU6IFNhbk9HTEVTLVBWUlNESy5leGUNCisNCitOb3RlIHRoYXQgRElTQUJMRV9JTVBPUlRHTCBwcmVwcm9jZXNzb3IgbWFjcm8gY2FuIGJlIHVzZWQNCit0byBzcGVjaWZ5IG5vdCB0byB1c2UgZHluYW1pYyBydW50aW1lIGJpbmRpbmcgb2YgdGhlIGxpYnJhcnkuDQorWW91IGFsc28gbmVlZCB0byBkZWZpbmUgcHJlcHJvY2Vzc29yIG1hY3JvIFBWUlNESyB0byBjb21waWxlDQordGhlIHNvdXJjZSB3aXRoIFBvd2VyVlIgT3BlbkdMIEVTIFNESy4NCisNCitUaGUgZGVtbyBhcHBsaWNhdGlvbiBpcyBicmllZmx5IHRlc3RlZCB3aXRoIGEgZmV3IG90aGVyIE9wZW5HTCBFUw0KK2ltcGxlbWVudGF0aW9ucyBhcyB3ZWxsIChlLmcuIFZpbmNlbnQsIEdMRVNvbkdMIG9uIExpbnV4LCBEZWxsDQorQXhpbSBYNTB2KS4gTW9zdCBvZiB0aGVzZSBvdGhlciBpbXBsZW1lbnRhdGlvbnMgcmVuZGVyZWQgdGhlIGRlbW8NCitlcnJvbmVvdXNseSBpbiBzb21lIGFzcGVjdC4gVGhpcyBtYXkgaW5kaWNhdGUgdGhhdCB0aGUgZGVtbyBzb3VyY2UNCitjb3VsZCBzdGlsbCBoYXZlIHNvbWUgd29yayB0byBkbyB3aXRoIGNvbXBhdGliaWxpdHkgYW5kIGNvcnJlY3QNCitBUEkgdXNhZ2UsIGFsdGhvdWdoIHRoZSBub24tY29uZm9ybWluZyBpbXBsZW1lbnRhdGlvbnMgYXJlIG1vc3QNCitwcm9iYWJseSB1bmZpbmlzaGVkIGFzIHdlbGwuDQorDQorVGhhbmtzIGFuZCBBY2tub3dsZWRnZW1lbnRzOg0KKw0KKyogVG9uaSBM9m5uYmVyZyAoIUN1YmUpIGNyZWF0ZWQgdGhlIG11c2ljIGZvciBvcmlnaW5hbCB2ZXJzaW9uLCB3aGljaA0KKyAgaXMgbm90IGZlYXR1cmVkIGluIHRoaXMgT3BlbkdMIEVTIHBvcnQuDQorKiBTYXJhIEthcGxpIChzdCBSYW5hKSBmb3IgYWRkaXRpb25hbCBjYW1lcmEgd29yay4NCisqIFBhdWwgQm91cmtlIGZvciBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3VwZXJzaGFwZXMuDQorDQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvYXBwLWxpbnV4LmMgYi9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9hcHAtbGludXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDM5ZWIyCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvYXBwLWxpbnV4LmMKQEAgLTAsMCArMSwyMjIgQEAKKy8qIFNhbiBBbmdlbGVzIE9ic2VydmF0aW9uIE9wZW5HTCBFUyB2ZXJzaW9uIGV4YW1wbGUKKyAqIENvcHlyaWdodCAyMDA0LTIwMDUgSmV0cm8gTGF1aGEKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBXZWI6IGh0dHA6Ly9pa2kuZmkvamV0cm8vCisgKgorICogVGhpcyBzb3VyY2UgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIEVJVEhFUjoKKyAqICAgKDEpIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAorICogICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiBUaGUgdGV4dCBvZiB0aGUgR05VIExlc3NlcgorICogICAgICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCB3aXRoIHRoaXMgc291cmNlIGluIHRoZQorICogICAgICAgZmlsZSBMSUNFTlNFLUxHUEwudHh0LgorICogICAoMikgVGhlIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgaXMgaW5jbHVkZWQgd2l0aCB0aGlzIHNvdXJjZSBpbgorICogICAgICAgdGhlIGZpbGUgTElDRU5TRS1CU0QudHh0LgorICoKKyAqIFRoaXMgc291cmNlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIGZpbGVzCisgKiBMSUNFTlNFLUxHUEwudHh0IGFuZCBMSUNFTlNFLUJTRC50eHQgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAkSWQ6IGFwcC1saW51eC5jLHYgMS40IDIwMDUvMDIvMDggMTg6NDI6NDggdG9uaWMgRXhwICQKKyAqICRSZXZpc2lvbjogMS40ICQKKyAqCisgKiBQYXJ0cyBvZiB0aGlzIHNvdXJjZSBmaWxlIGlzIGJhc2VkIG9uIHRlc3QvZXhhbXBsZSBjb2RlIGZyb20KKyAqIEdMRVNvbkdMIGltcGxlbWVudGF0aW9uIGJ5IERhdmlkIEJseXRoZS4gSGVyZSBpcyBjb3B5IG9mIHRoZQorICogbGljZW5zZSBub3RpY2UgZnJvbSB0aGF0IHNvdXJjZToKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgIERhdmlkIEJseXRoZSAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorICogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKKyAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBEQVZJRCBCTFlUSEUgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorCisjaW5jbHVkZSA8R0xFUy9lZ2wuaD4KKworI2luY2x1ZGUgImFwcC5oIgorCisKK2ludCBnQXBwQWxpdmUgPSAxOworCitzdGF0aWMgY29uc3QgY2hhciBzQXBwTmFtZVtdID0KKyAgICAiU2FuIEFuZ2VsZXMgT2JzZXJ2YXRpb24gT3BlbkdMIEVTIHZlcnNpb24gZXhhbXBsZSAoTGludXgpIjsKKworc3RhdGljIGludCBzV2luZG93V2lkdGggPSBXSU5ET1dfREVGQVVMVF9XSURUSDsKK3N0YXRpYyBpbnQgc1dpbmRvd0hlaWdodCA9IFdJTkRPV19ERUZBVUxUX0hFSUdIVDsKK3N0YXRpYyBFR0xEaXNwbGF5IHNFZ2xEaXNwbGF5ID0gRUdMX05PX0RJU1BMQVk7CitzdGF0aWMgRUdMQ29udGV4dCBzRWdsQ29udGV4dCA9IEVHTF9OT19DT05URVhUOworc3RhdGljIEVHTFN1cmZhY2Ugc0VnbFN1cmZhY2UgPSBFR0xfTk9fU1VSRkFDRTsKKworY29uc3QgY2hhciAqZWdsX3N0cmVycm9yKHVuc2lnbmVkIGVycikKK3sKKyAgICBzd2l0Y2goZXJyKXsKKyAgICBjYXNlIEVHTF9TVUNDRVNTOiByZXR1cm4gIlNVQ0NFU1MiOworICAgIGNhc2UgRUdMX05PVF9JTklUSUFMSVpFRDogcmV0dXJuICJOT1QgSU5JVElBTElaRUQiOworICAgIGNhc2UgRUdMX0JBRF9BQ0NFU1M6IHJldHVybiAiQkFEIEFDQ0VTUyI7CisgICAgY2FzZSBFR0xfQkFEX0FMTE9DOiByZXR1cm4gIkJBRCBBTExPQyI7CisgICAgY2FzZSBFR0xfQkFEX0FUVFJJQlVURTogcmV0dXJuICJCQURfQVRUUklCVVRFIjsKKyAgICBjYXNlIEVHTF9CQURfQ09ORklHOiByZXR1cm4gIkJBRCBDT05GSUciOworICAgIGNhc2UgRUdMX0JBRF9DT05URVhUOiByZXR1cm4gIkJBRCBDT05URVhUIjsKKyAgICBjYXNlIEVHTF9CQURfQ1VSUkVOVF9TVVJGQUNFOiByZXR1cm4gIkJBRCBDVVJSRU5UIFNVUkZBQ0UiOworICAgIGNhc2UgRUdMX0JBRF9ESVNQTEFZOiByZXR1cm4gIkJBRCBESVNQTEFZIjsKKyAgICBjYXNlIEVHTF9CQURfTUFUQ0g6IHJldHVybiAiQkFEIE1BVENIIjsKKyAgICBjYXNlIEVHTF9CQURfTkFUSVZFX1BJWE1BUDogcmV0dXJuICJCQUQgTkFUSVZFIFBJWE1BUCI7CisgICAgY2FzZSBFR0xfQkFEX05BVElWRV9XSU5ET1c6IHJldHVybiAiQkFEIE5BVElWRSBXSU5ET1ciOworICAgIGNhc2UgRUdMX0JBRF9QQVJBTUVURVI6IHJldHVybiAiQkFEIFBBUkFNRVRFUiI7CisgICAgY2FzZSBFR0xfQkFEX1NVUkZBQ0U6IHJldHVybiAiQkFEX1NVUkZBQ0UiOworLy8gICAgY2FzZSBFR0xfQ09OVEVYVF9MT1NUOiByZXR1cm4gIkNPTlRFWFQgTE9TVCI7CisgICAgZGVmYXVsdDogcmV0dXJuICJVTktOT1dOIjsKKyAgICB9Cit9CisKK3ZvaWQgZWdsX2Vycm9yKGNvbnN0IGNoYXIgKm5hbWUpCit7CisgICAgdW5zaWduZWQgZXJyID0gZWdsR2V0RXJyb3IoKTsKKyAgICBpZihlcnIgIT0gRUdMX1NVQ0NFU1MpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsIiVzKCk6IGVnbCBlcnJvciAweCV4ICglcylcbiIsIAorICAgICAgICAgICAgICAgIG5hbWUsIGVyciwgZWdsX3N0cmVycm9yKGVycikpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgY2hlY2tHTEVycm9ycygpCit7CisgICAgR0xlbnVtIGVycm9yID0gZ2xHZXRFcnJvcigpOworICAgIGlmIChlcnJvciAhPSBHTF9OT19FUlJPUikKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJHTCBFcnJvcjogMHglMDR4XG4iLCAoaW50KWVycm9yKTsKK30KKworCitzdGF0aWMgdm9pZCBjaGVja0VHTEVycm9ycygpCit7CisgICAgRUdMaW50IGVycm9yID0gZWdsR2V0RXJyb3IoKTsKKyAgICAvLyBHTEVTb25HTCBzZWVtcyB0byBiZSByZXR1cm5pbmcgMCB3aGVuIHRoZXJlIGlzIG5vIGVycm9ycz8KKyAgICBpZiAoZXJyb3IgJiYgZXJyb3IgIT0gRUdMX1NVQ0NFU1MpCisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRUdMIEVycm9yOiAweCUwNHhcbiIsIChpbnQpZXJyb3IpOworfQorCitzdGF0aWMgaW50IGluaXRHcmFwaGljcygpCit7CisgICAgRUdMaW50IHNfY29uZmlnQXR0cmlic1tdID0geworICAgICAgICAgRUdMX1JFRF9TSVpFLCAgICAgICA1LAorICAgICAgICAgRUdMX0dSRUVOX1NJWkUsICAgICA2LAorICAgICAgICAgRUdMX0JMVUVfU0laRSwgICAgICA1LAorICNpZiAxCisgICAgICAgICBFR0xfREVQVEhfU0laRSwgICAgIDE2LAorICAgICAgICAgRUdMX1NURU5DSUxfU0laRSwgICAwLAorICNlbHNlCisgICAgICAgICBFR0xfQUxQSEFfU0laRSwgICAgIEVHTF9ET05UX0NBUkUsCisgICAgICAgICBFR0xfREVQVEhfU0laRSwgICAgIEVHTF9ET05UX0NBUkUsCisgICAgICAgICBFR0xfU1RFTkNJTF9TSVpFLCAgIEVHTF9ET05UX0NBUkUsCisgICAgICAgICBFR0xfU1VSRkFDRV9UWVBFLCAgIEVHTF9ET05UX0NBUkUsCisgI2VuZGlmCisgICAgICAgICBFR0xfTk9ORQorICAgICB9OworICAgICAKKyAgICAgRUdMaW50IG51bUNvbmZpZ3MgPSAtMTsKKyAgICAgRUdMaW50IG1ham9yVmVyc2lvbjsKKyAgICAgRUdMaW50IG1pbm9yVmVyc2lvbjsKKyAgICAgRUdMQ29uZmlnIGNvbmZpZzsKKyAgICAgRUdMQ29udGV4dCBjb250ZXh0OworICAgICBFR0xTdXJmYWNlIHN1cmZhY2U7CisgICAgIAorICAgICBFR0xEaXNwbGF5IGRweTsKKworICAgICBkcHkgPSBlZ2xHZXREaXNwbGF5KEVHTF9ERUZBVUxUX0RJU1BMQVkpOworICAgICBlZ2xfZXJyb3IoImVnbEdldERpc3BsYXkiKTsKKyAgICAgZnByaW50ZihzdGRlcnIsImRweSA9IDB4JTA4eFxuIiwgKHVuc2lnbmVkKSBkcHkpOworICAgICAKKyAgICAgZWdsSW5pdGlhbGl6ZShkcHksICZtYWpvclZlcnNpb24sICZtaW5vclZlcnNpb24pOworICAgICBlZ2xfZXJyb3IoImVnbEluaXRpYWxpemUiKTsKKworICAgICBlZ2xHZXRDb25maWdzKGRweSwgTlVMTCwgMCwgJm51bUNvbmZpZ3MpOworICAgICBlZ2xfZXJyb3IoImVnbEdldENvbmZpZ3MiKTsKKyAgICAgZnByaW50ZihzdGRlcnIsIm51bSBjb25maWdzICVkXG4iLCBudW1Db25maWdzKTsKKyAgICAgCisgICAgIGVnbENob29zZUNvbmZpZyhkcHksIHNfY29uZmlnQXR0cmlicywgJmNvbmZpZywgMSwgJm51bUNvbmZpZ3MpOworICAgICBlZ2xfZXJyb3IoImVnbENob29zZUNvbmZpZyIpOworCisgICAgIHN1cmZhY2UgPSBlZ2xDcmVhdGVXaW5kb3dTdXJmYWNlKGRweSwgY29uZmlnLAorICAgICAgICAgICAgIGFuZHJvaWRfY3JlYXRlRGlzcGxheVN1cmZhY2UoKSwgTlVMTCk7CisgICAgIGVnbF9lcnJvcigiZWdsTWFwV2luZG93U3VyZmFjZSIpOworCisgICAgIGZwcmludGYoc3RkZXJyLCJzdXJmYWNlID0gJXBcbiIsIHN1cmZhY2UpOworCisgICAgIGNvbnRleHQgPSBlZ2xDcmVhdGVDb250ZXh0KGRweSwgY29uZmlnLCBOVUxMLCBOVUxMKTsKKyAgICAgZWdsX2Vycm9yKCJlZ2xDcmVhdGVDb250ZXh0Iik7CisgICAgIGZwcmludGYoc3RkZXJyLCJjb250ZXh0ID0gJXBcbiIsIGNvbnRleHQpOworICAgICAKKyAgICAgZWdsTWFrZUN1cnJlbnQoZHB5LCBzdXJmYWNlLCBzdXJmYWNlLCBjb250ZXh0KTsgICAKKyAgICAgZWdsX2Vycm9yKCJlZ2xNYWtlQ3VycmVudCIpOworCisgICAgIGVnbFF1ZXJ5U3VyZmFjZShkcHksIHN1cmZhY2UsIEVHTF9XSURUSCwgJnNXaW5kb3dXaWR0aCk7CisgICAgIGVnbFF1ZXJ5U3VyZmFjZShkcHksIHN1cmZhY2UsIEVHTF9IRUlHSFQsICZzV2luZG93SGVpZ2h0KTsKKworICAgIHNFZ2xEaXNwbGF5ID0gZHB5OworICAgIHNFZ2xTdXJmYWNlID0gc3VyZmFjZTsKKyAgICBzRWdsQ29udGV4dCA9IGNvbnRleHQ7CisKKyAgICByZXR1cm4gRUdMX1RSVUU7Cit9CisKKworc3RhdGljIHZvaWQgZGVpbml0R3JhcGhpY3MoKQoreworICAgIGVnbE1ha2VDdXJyZW50KHNFZ2xEaXNwbGF5LCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICBlZ2xEZXN0cm95Q29udGV4dChzRWdsRGlzcGxheSwgc0VnbENvbnRleHQpOworICAgIGVnbERlc3Ryb3lTdXJmYWNlKHNFZ2xEaXNwbGF5LCBzRWdsU3VyZmFjZSk7CisgICAgZWdsVGVybWluYXRlKHNFZ2xEaXNwbGF5KTsKK30KKworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICAgIC8vIG5vdCByZWZlcmVuY2VkOgorICAgIGFyZ2MgPSBhcmdjOworICAgIGFyZ3YgPSBhcmd2OworCisgICAgaWYgKCFpbml0R3JhcGhpY3MoKSkKKyAgICB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiR3JhcGhpY3MgaW5pdGlhbGl6YXRpb24gZmFpbGVkLlxuIik7CisgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICAgfQorCisgICAgYXBwSW5pdCgpOworICAgIAorICAgIHdoaWxlIChnQXBwQWxpdmUpCisgICAgeworICAgICAgICBzdHJ1Y3QgdGltZXZhbCB0aW1lTm93OworCisgICAgICAgIGlmIChnQXBwQWxpdmUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdldHRpbWVvZmRheSgmdGltZU5vdywgTlVMTCk7CisgICAgICAgICAgICBhcHBSZW5kZXIodGltZU5vdy50dl9zZWMgKiAxMDAwICsgdGltZU5vdy50dl91c2VjIC8gMTAwMCwKKyAgICAgICAgICAgICAgICAgICAgICBzV2luZG93V2lkdGgsIHNXaW5kb3dIZWlnaHQpOworICAgICAgICAgICAgY2hlY2tHTEVycm9ycygpOworICAgICAgICAgICAgZWdsU3dhcEJ1ZmZlcnMoc0VnbERpc3BsYXksIHNFZ2xTdXJmYWNlKTsKKyAgICAgICAgICAgIGNoZWNrRUdMRXJyb3JzKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBhcHBEZWluaXQoKTsKKyAgICBkZWluaXRHcmFwaGljcygpOworCisgICAgcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9hbmdlbGVzL2FwcC5oIGIvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvYXBwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBlYmQzNQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy9hbmdlbGVzL2FwcC5oCkBAIC0wLDAgKzEsNTYgQEAKKy8qIFNhbiBBbmdlbGVzIE9ic2VydmF0aW9uIE9wZW5HTCBFUyB2ZXJzaW9uIGV4YW1wbGUKKyAqIENvcHlyaWdodCAyMDA0LTIwMDUgSmV0cm8gTGF1aGEKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBXZWI6IGh0dHA6Ly9pa2kuZmkvamV0cm8vCisgKgorICogVGhpcyBzb3VyY2UgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIEVJVEhFUjoKKyAqICAgKDEpIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiAgICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAorICogICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiBUaGUgdGV4dCBvZiB0aGUgR05VIExlc3NlcgorICogICAgICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCB3aXRoIHRoaXMgc291cmNlIGluIHRoZQorICogICAgICAgZmlsZSBMSUNFTlNFLUxHUEwudHh0LgorICogICAoMikgVGhlIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgaXMgaW5jbHVkZWQgd2l0aCB0aGlzIHNvdXJjZSBpbgorICogICAgICAgdGhlIGZpbGUgTElDRU5TRS1CU0QudHh0LgorICoKKyAqIFRoaXMgc291cmNlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIGZpbGVzCisgKiBMSUNFTlNFLUxHUEwudHh0IGFuZCBMSUNFTlNFLUJTRC50eHQgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAkSWQ6IGFwcC5oLHYgMS4xNCAyMDA1LzAyLzA2IDIxOjEzOjU0IHRvbmljIEV4cCAkCisgKiAkUmV2aXNpb246IDEuMTQgJAorICovCisKKyNpZm5kZWYgQVBQX0hfSU5DTFVERUQKKyNkZWZpbmUgQVBQX0hfSU5DTFVERUQKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKworI2RlZmluZSBXSU5ET1dfREVGQVVMVF9XSURUSCAgICA2NDAKKyNkZWZpbmUgV0lORE9XX0RFRkFVTFRfSEVJR0hUICAgNDgwCisKKyNkZWZpbmUgV0lORE9XX0JQUCAgICAgICAgICAgICAgMTYKKworCisvLyBUaGUgc2ltcGxlIGZyYW1ld29yayBleHBlY3RzIHRoZSBhcHBsaWNhdGlvbiBjb2RlIHRvIGRlZmluZSB0aGVzZSBmdW5jdGlvbnMuCitleHRlcm4gdm9pZCBhcHBJbml0KCk7CitleHRlcm4gdm9pZCBhcHBEZWluaXQoKTsKK2V4dGVybiB2b2lkIGFwcFJlbmRlcihsb25nIHRpY2ssIGludCB3aWR0aCwgaW50IGhlaWdodCk7CisKKy8qIFZhbHVlIGlzIG5vbi16ZXJvIHdoZW4gYXBwbGljYXRpb24gaXMgYWxpdmUsIGFuZCAwIHdoZW4gaXQgaXMgY2xvc2luZy4KKyAqIERlZmluZWQgYnkgdGhlIGFwcGxpY2F0aW9uIGZyYW1ld29yay4KKyAqLworZXh0ZXJuIGludCBnQXBwQWxpdmU7CisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworCisjZW5kaWYgLy8gIUFQUF9IX0lOQ0xVREVECmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9jYW1zLmggYi9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9jYW1zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmIxYWNiMwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy9hbmdlbGVzL2NhbXMuaApAQCAtMCwwICsxLDY1IEBACisvKiBTYW4gQW5nZWxlcyBPYnNlcnZhdGlvbiBPcGVuR0wgRVMgdmVyc2lvbiBleGFtcGxlCisgKiBDb3B5cmlnaHQgMjAwNC0yMDA1IEpldHJvIExhdWhhCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogV2ViOiBodHRwOi8vaWtpLmZpL2pldHJvLworICoKKyAqIFRoaXMgc291cmNlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBFSVRIRVI6CisgKiAgICgxKSBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gVGhlIHRleHQgb2YgdGhlIEdOVSBMZXNzZXIKKyAqICAgICAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgd2l0aCB0aGlzIHNvdXJjZSBpbiB0aGUKKyAqICAgICAgIGZpbGUgTElDRU5TRS1MR1BMLnR4dC4KKyAqICAgKDIpIFRoZSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGlzIGluY2x1ZGVkIHdpdGggdGhpcyBzb3VyY2UgaW4KKyAqICAgICAgIHRoZSBmaWxlIExJQ0VOU0UtQlNELnR4dC4KKyAqCisgKiBUaGlzIHNvdXJjZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBmaWxlcworICogTElDRU5TRS1MR1BMLnR4dCBhbmQgTElDRU5TRS1CU0QudHh0IGZvciBtb3JlIGRldGFpbHMuCisgKgorICogJElkOiBjYW1zLmgsdiAxLjcgMjAwNS8wMS8zMSAyMjoxNToxNSB0b25pYyBFeHAgJAorICogJFJldmlzaW9uOiAxLjcgJAorICovCisKKyNpZm5kZWYgQ0FNU19IX0lOQ0xVREVECisjZGVmaW5lIENBTVNfSF9JTkNMVURFRAorCisKKy8qIExlbmd0aCBpbiBtaWxsaXNlY29uZHMgb2Ygb25lIGNhbWVyYSB0cmFjayBiYXNlIHVuaXQuCisgKiBUaGUgdmFsdWUgb3JpZ2luYXRlcyBmcm9tIHRoZSBtdXNpYyBzeW5jaHJvbml6YXRpb24uCisgKi8KKyNkZWZpbmUgQ0FNVFJBQ0tfTEVOICAgIDU0NDIKKworCisvLyBDYW1lcmEgdHJhY2sgZGVmaW5pdGlvbiBmb3Igb25lIGNhbWVyYSB0cnVja2luZyBzaG90LgordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICAvKiBGaXZlIHBhcmFtZXRlcnMgb2Ygc3JjWzVdIGFuZCBkZXN0WzVdOgorICAgICAqIGV5ZVgsIGV5ZVksIGV5ZVosIHZpZXdBbmdsZSwgdmlld0hlaWdodE9mZnMKKyAgICAgKi8KKyAgICBzaG9ydCBzcmNbNV0sIGRlc3RbNV07CisgICAgdW5zaWduZWQgY2hhciBkaXN0OyAgICAgLy8gaWYgPjAsIGNhbSByb3RhdGVzIGFyb3VuZCBleWUgeHkgb24gZGlzdCAqIDAuMQorICAgIHVuc2lnbmVkIGNoYXIgbGVuOyAgICAgIC8vIGxlbmd0aCBtdWx0aXBsaWVyCit9IENBTVRSQUNLOworCitzdGF0aWMgQ0FNVFJBQ0sgc0NhbVRyYWNrc1tdID0KK3sKKyAgICB7IHsgNDUwMCwgMjcwMCwgMTAwLCA3MCwgLTMwIH0sIHsgNTAsIDUwLCAtOTAsIC0xMDAsIDAgfSwgMjAsIDEgfSwKKyAgICB7IHsgLTE0NDgsIDQyOTQsIDI1LCAzNjMsIDAgfSwgeyAtMTM2LCAyMDIsIDEyNSwgLTk4LCAxMDAgfSwgMCwgMSB9LAorICAgIHsgeyAxNDM3LCA0OTMwLCAyMDAsIC0yNzUsIC0yMCB9LCB7IDE2ODQsIDAsIDAsIDksIDAgfSwgMCwgMSB9LAorICAgIHsgeyAxODAwLCAzNjA5LCAyMDAsIDAsIDY3NSB9LCB7IDAsIDAsIDAsIDMwMCwgMCB9LCAwLCAxIH0sCisgICAgeyB7IDkyMywgOTk2LCA1MCwgMjMzNiwgLTgwIH0sIHsgMCwgLTIwLCAtNTAsIDAsIDE3MCB9LCAwLCAxIH0sCisgICAgeyB7IC0xNjYzLCAtNDMsIDYwMCwgMjE3MCwgMCB9LCB7IDIwLCAwLCAtNjAwLCAwLCAxMDAgfSwgMCwgMSB9LAorICAgIHsgeyAxMDQ5LCAtMTQyMCwgMTc1LCAyMTExLCAtMTcgfSwgeyAwLCAwLCAwLCAtMzM0LCAwIH0sIDAsIDIgfSwKKyAgICB7IHsgMCwgMCwgNTAsIDMwMCwgMjUgfSwgeyAwLCAwLCAwLCAzMDAsIDAgfSwgNzAsIDIgfSwKKyAgICB7IHsgLTQ3MywgLTk1MywgMzUwMCwgLTM1MywgLTM1MCB9LCB7IDAsIDAsIC0yODAwLCAwLCAwIH0sIDAsIDIgfSwKKyAgICB7IHsgMTkxLCAxOTM4LCAzNSwgMTEzOSwgLTE3IH0sIHsgMTIwNSwgLTI5MDksIDAsIDAsIDAgfSwgMCwgMiB9LAorICAgIHsgeyAtMTQ0OSwgLTI3MDAsIDE1MCwgMCwgMCB9LCB7IDAsIDIwMDAsIDAsIDAsIDAgfSwgMCwgMiB9LAorICAgIHsgeyA1MjczLCA0OTkyLCA2NTAsIDM3MywgLTUwIH0sIHsgLTQ1OTgsIC0zMDcyLCAwLCAwLCAwIH0sIDAsIDIgfSwKKyAgICB7IHsgMzIyMywgLTMyODIsIDEwNzUsIC0zOTMsIC0yNSB9LCB7IDE2NDksIC0xNjQ5LCAwLCAwLCAwIH0sIDAsIDIgfQorfTsKKyNkZWZpbmUgQ0FNVFJBQ0tfQ09VTlQgKHNpemVvZihjYW1UcmFja3MpIC8gc2l6ZW9mKGNhbVRyYWNrc1swXSkpCisKKworI2VuZGlmIC8vICFDQU1TX0hfSU5DTFVERUQKZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9hbmdlbGVzL2RlbW8uYyBiL29wZW5nbC90ZXN0cy9hbmdlbGVzL2RlbW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDJmMzk4Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvZGVtby5jCkBAIC0wLDAgKzEsNzkyIEBACisvKiBTYW4gQW5nZWxlcyBPYnNlcnZhdGlvbiBPcGVuR0wgRVMgdmVyc2lvbiBleGFtcGxlCisgKiBDb3B5cmlnaHQgMjAwNC0yMDA1IEpldHJvIExhdWhhCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogV2ViOiBodHRwOi8vaWtpLmZpL2pldHJvLworICoKKyAqIFRoaXMgc291cmNlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiBFSVRIRVI6CisgKiAgICgxKSBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogICAgICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKKyAqICAgICAgIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gVGhlIHRleHQgb2YgdGhlIEdOVSBMZXNzZXIKKyAqICAgICAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgd2l0aCB0aGlzIHNvdXJjZSBpbiB0aGUKKyAqICAgICAgIGZpbGUgTElDRU5TRS1MR1BMLnR4dC4KKyAqICAgKDIpIFRoZSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGlzIGluY2x1ZGVkIHdpdGggdGhpcyBzb3VyY2UgaW4KKyAqICAgICAgIHRoZSBmaWxlIExJQ0VOU0UtQlNELnR4dC4KKyAqCisgKiBUaGlzIHNvdXJjZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBmaWxlcworICogTElDRU5TRS1MR1BMLnR4dCBhbmQgTElDRU5TRS1CU0QudHh0IGZvciBtb3JlIGRldGFpbHMuCisgKgorICogJElkOiBkZW1vLmMsdiAxLjEwIDIwMDUvMDIvMDggMjA6NTQ6MzkgdG9uaWMgRXhwICQKKyAqICRSZXZpc2lvbjogMS4xMCAkCisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxmbG9hdC5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorCisjaW5jbHVkZSA8R0xFUy9nbC5oPgorCisjaW5jbHVkZSAiYXBwLmgiCisjaW5jbHVkZSAic2hhcGVzLmgiCisjaW5jbHVkZSAiY2Ftcy5oIgorCisKKy8vIFRvdGFsIHJ1biBsZW5ndGggaXMgMjAgKiBjYW1lcmEgdHJhY2sgYmFzZSB1bml0IGxlbmd0aCAoc2VlIGNhbXMuaCkuCisjZGVmaW5lIFJVTl9MRU5HVEggICgyMCAqIENBTVRSQUNLX0xFTikKKyN1bmRlZiBQSQorI2RlZmluZSBQSSAzLjE0MTU5MjY1MzU4OTc5MzJmCisjZGVmaW5lIFJBTkRPTV9VSU5UX01BWCA2NTUzNQorCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHNSYW5kb21TZWVkID0gMDsKKworc3RhdGljIHZvaWQgc2VlZFJhbmRvbSh1bnNpZ25lZCBsb25nIHNlZWQpCit7CisgICAgc1JhbmRvbVNlZWQgPSBzZWVkOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyByYW5kb21VSW50KCkKK3sKKyAgICBzUmFuZG9tU2VlZCA9IHNSYW5kb21TZWVkICogMHgzNDNmZCArIDB4MjY5ZWMzOworICAgIHJldHVybiBzUmFuZG9tU2VlZCA+PiAxNjsKK30KKworCisvLyBDYXBwZWQgY29udmVyc2lvbiBmcm9tIGZsb2F0IHRvIGZpeGVkLgorc3RhdGljIGxvbmcgZmxvYXRUb0ZpeGVkKGZsb2F0IHZhbHVlKQoreworICAgIGlmICh2YWx1ZSA8IC0zMjc2OCkgdmFsdWUgPSAtMzI3Njg7CisgICAgaWYgKHZhbHVlID4gMzI3NjcpIHZhbHVlID0gMzI3Njc7CisgICAgcmV0dXJuIChsb25nKSh2YWx1ZSAqIDY1NTM2KTsKK30KKworI2RlZmluZSBGSVhFRCh2YWx1ZSkgZmxvYXRUb0ZpeGVkKHZhbHVlKQorCisKKy8vIERlZmluaXRpb24gb2Ygb25lIEdMIG9iamVjdCBpbiB0aGlzIGRlbW8uCit0eXBlZGVmIHN0cnVjdCB7CisgICAgLyogVmVydGV4IGFycmF5IGFuZCBjb2xvciBhcnJheSBhcmUgZW5hYmxlZCBmb3IgYWxsIG9iamVjdHMsIHNvIHRoZWlyCisgICAgICogcG9pbnRlcnMgbXVzdCBhbHdheXMgYmUgdmFsaWQgYW5kIG5vbi1OVUxMLiBOb3JtYWwgYXJyYXkgaXMgbm90CisgICAgICogdXNlZCBieSB0aGUgZ3JvdW5kIHBsYW5lLCBzbyB3aGVuIGl0cyBwb2ludGVyIGlzIE5VTEwgdGhlbiBub3JtYWwKKyAgICAgKiBhcnJheSB1c2FnZSBpcyBkaXNhYmxlZC4KKyAgICAgKgorICAgICAqIFZlcnRleCBhcnJheSBpcyBzdXBwb3NlZCB0byB1c2UgR0xfRklYRUQgZGF0YXR5cGUgYW5kIHN0cmlkZSAwCisgICAgICogKGkuZS4gdGlnaHRseSBwYWNrZWQgYXJyYXkpLiBDb2xvciBhcnJheSBpcyBzdXBwb3NlZCB0byBoYXZlIDQKKyAgICAgKiBjb21wb25lbnRzIHBlciBjb2xvciB3aXRoIEdMX1VOU0lHTkVEX0JZVEUgZGF0YXR5cGUgYW5kIHN0cmlkZSAwLgorICAgICAqIE5vcm1hbCBhcnJheSBpcyBzdXBwb3NlZCB0byB1c2UgR0xfRklYRUQgZGF0YXR5cGUgYW5kIHN0cmlkZSAwLgorICAgICAqLworICAgIEdMZml4ZWQgKnZlcnRleEFycmF5OworICAgIEdMdWJ5dGUgKmNvbG9yQXJyYXk7CisgICAgR0xmaXhlZCAqbm9ybWFsQXJyYXk7CisgICAgR0xpbnQgdmVydGV4Q29tcG9uZW50czsKKyAgICBHTHNpemVpIGNvdW50OworfSBHTE9CSkVDVDsKKworCitzdGF0aWMgbG9uZyBzU3RhcnRUaWNrID0gMDsKK3N0YXRpYyBsb25nIHNUaWNrID0gMDsKKworc3RhdGljIGludCBzQ3VycmVudENhbVRyYWNrID0gMDsKK3N0YXRpYyBsb25nIHNDdXJyZW50Q2FtVHJhY2tTdGFydFRpY2sgPSAwOworc3RhdGljIGxvbmcgc05leHRDYW1UcmFja1N0YXJ0VGljayA9IDB4N2ZmZmZmZmY7CisKK3N0YXRpYyBHTE9CSkVDVCAqc1N1cGVyU2hhcGVPYmplY3RzW1NVUEVSU0hBUEVfQ09VTlRdID0geyBOVUxMIH07CitzdGF0aWMgR0xPQkpFQ1QgKnNHcm91bmRQbGFuZSA9IE5VTEw7CisKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGZsb2F0IHgsIHksIHo7Cit9IFZFQ1RPUjM7CisKKworc3RhdGljIHZvaWQgZnJlZUdMT2JqZWN0KEdMT0JKRUNUICpvYmplY3QpCit7CisgICAgaWYgKG9iamVjdCA9PSBOVUxMKQorICAgICAgICByZXR1cm47CisgICAgZnJlZShvYmplY3QtPm5vcm1hbEFycmF5KTsKKyAgICBmcmVlKG9iamVjdC0+Y29sb3JBcnJheSk7CisgICAgZnJlZShvYmplY3QtPnZlcnRleEFycmF5KTsKKyAgICBmcmVlKG9iamVjdCk7Cit9CisKKworc3RhdGljIEdMT0JKRUNUICogbmV3R0xPYmplY3QobG9uZyB2ZXJ0aWNlcywgaW50IHZlcnRleENvbXBvbmVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdXNlTm9ybWFsQXJyYXkpCit7CisgICAgR0xPQkpFQ1QgKnJlc3VsdDsKKyAgICByZXN1bHQgPSAoR0xPQkpFQ1QgKiltYWxsb2Moc2l6ZW9mKEdMT0JKRUNUKSk7CisgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXN1bHQtPmNvdW50ID0gdmVydGljZXM7CisgICAgcmVzdWx0LT52ZXJ0ZXhDb21wb25lbnRzID0gdmVydGV4Q29tcG9uZW50czsKKyAgICByZXN1bHQtPnZlcnRleEFycmF5ID0gKEdMZml4ZWQgKiltYWxsb2ModmVydGljZXMgKiB2ZXJ0ZXhDb21wb25lbnRzICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEdMZml4ZWQpKTsKKyAgICByZXN1bHQtPmNvbG9yQXJyYXkgPSAoR0x1Ynl0ZSAqKW1hbGxvYyh2ZXJ0aWNlcyAqIDQgKiBzaXplb2YoR0x1Ynl0ZSkpOworICAgIGlmICh1c2VOb3JtYWxBcnJheSkKKyAgICB7CisgICAgICAgIHJlc3VsdC0+bm9ybWFsQXJyYXkgPSAoR0xmaXhlZCAqKW1hbGxvYyh2ZXJ0aWNlcyAqIDMgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEdMZml4ZWQpKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICByZXN1bHQtPm5vcm1hbEFycmF5ID0gTlVMTDsKKyAgICBpZiAocmVzdWx0LT52ZXJ0ZXhBcnJheSA9PSBOVUxMIHx8CisgICAgICAgIHJlc3VsdC0+Y29sb3JBcnJheSA9PSBOVUxMIHx8CisgICAgICAgICh1c2VOb3JtYWxBcnJheSAmJiByZXN1bHQtPm5vcm1hbEFycmF5ID09IE5VTEwpKQorICAgIHsKKyAgICAgICAgZnJlZUdMT2JqZWN0KHJlc3VsdCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCisKK3N0YXRpYyB2b2lkIGRyYXdHTE9iamVjdChHTE9CSkVDVCAqb2JqZWN0KQoreworICAgIGFzc2VydChvYmplY3QgIT0gTlVMTCk7CisKKyAgICBnbFZlcnRleFBvaW50ZXIob2JqZWN0LT52ZXJ0ZXhDb21wb25lbnRzLCBHTF9GSVhFRCwKKyAgICAgICAgICAgICAgICAgICAgMCwgb2JqZWN0LT52ZXJ0ZXhBcnJheSk7CisgICAgZ2xDb2xvclBvaW50ZXIoNCwgR0xfVU5TSUdORURfQllURSwgMCwgb2JqZWN0LT5jb2xvckFycmF5KTsKKworICAgIC8vIEFscmVhZHkgZG9uZSBpbiBpbml0aWFsaXphdGlvbjoKKyAgICAvL2dsRW5hYmxlQ2xpZW50U3RhdGUoR0xfVkVSVEVYX0FSUkFZKTsKKyAgICAvL2dsRW5hYmxlQ2xpZW50U3RhdGUoR0xfQ09MT1JfQVJSQVkpOworCisgICAgaWYgKG9iamVjdC0+bm9ybWFsQXJyYXkpCisgICAgeworICAgICAgICBnbE5vcm1hbFBvaW50ZXIoR0xfRklYRUQsIDAsIG9iamVjdC0+bm9ybWFsQXJyYXkpOworICAgICAgICBnbEVuYWJsZUNsaWVudFN0YXRlKEdMX05PUk1BTF9BUlJBWSk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgZ2xEaXNhYmxlQ2xpZW50U3RhdGUoR0xfTk9STUFMX0FSUkFZKTsKKyAgICBnbERyYXdBcnJheXMoR0xfVFJJQU5HTEVTLCAwLCBvYmplY3QtPmNvdW50KTsKK30KKworCitzdGF0aWMgdm9pZCB2ZWN0b3IzU3ViKFZFQ1RPUjMgKmRlc3QsIFZFQ1RPUjMgKnYxLCBWRUNUT1IzICp2MikKK3sKKyAgICBkZXN0LT54ID0gdjEtPnggLSB2Mi0+eDsKKyAgICBkZXN0LT55ID0gdjEtPnkgLSB2Mi0+eTsKKyAgICBkZXN0LT56ID0gdjEtPnogLSB2Mi0+ejsKK30KKworCitzdGF0aWMgdm9pZCBzdXBlclNoYXBlTWFwKFZFQ1RPUjMgKnBvaW50LCBmbG9hdCByMSwgZmxvYXQgcjIsIGZsb2F0IHQsIGZsb2F0IHApCit7CisgICAgLy8gc3BoZXJlLW1hcHBpbmcgb2Ygc3VwZXJzaGFwZSBwYXJhbWV0ZXJzCisgICAgcG9pbnQtPnggPSAoZmxvYXQpKGNvcyh0KSAqIGNvcyhwKSAvIHIxIC8gcjIpOworICAgIHBvaW50LT55ID0gKGZsb2F0KShzaW4odCkgKiBjb3MocCkgLyByMSAvIHIyKTsKKyAgICBwb2ludC0+eiA9IChmbG9hdCkoc2luKHApIC8gcjIpOworfQorCisKK3N0YXRpYyBmbG9hdCBzc0Z1bmMoY29uc3QgZmxvYXQgdCwgY29uc3QgZmxvYXQgKnApCit7CisgICAgcmV0dXJuIChmbG9hdCkocG93KHBvdyhmYWJzKGNvcyhwWzBdICogdCAvIDQpKSAvIHBbMV0sIHBbNF0pICsKKyAgICAgICAgICAgICAgICAgICAgICAgcG93KGZhYnMoc2luKHBbMF0gKiB0IC8gNCkpIC8gcFsyXSwgcFs1XSksIDEgLyBwWzNdKSk7Cit9CisKKworLy8gQ3JlYXRlcyBhbmQgcmV0dXJucyBhIHN1cGVyc2hhcGUgb2JqZWN0LgorLy8gQmFzZWQgb24gUGF1bCBCb3Vya2UncyBQT1YtUmF5IGltcGxlbWVudGF0aW9uLgorLy8gaHR0cDovL2FzdHJvbm9teS5zd2luLmVkdS5hdS9+cGJvdXJrZS9wb3ZyYXkvc3VwZXJzaGFwZS8KK3N0YXRpYyBHTE9CSkVDVCAqIGNyZWF0ZVN1cGVyU2hhcGUoY29uc3QgZmxvYXQgKnBhcmFtcykKK3sKKyAgICBjb25zdCBpbnQgcmVzb2wxID0gKGludClwYXJhbXNbU1VQRVJTSEFQRV9QQVJBTVMgLSAzXTsKKyAgICBjb25zdCBpbnQgcmVzb2wyID0gKGludClwYXJhbXNbU1VQRVJTSEFQRV9QQVJBTVMgLSAyXTsKKyAgICAvLyBsYXRpdHVkZSAwIHRvIHBpLzIgZm9yIG5vIG1pcnJvcmVkIGJvdHRvbQorICAgIC8vIChsYXRpdHVkZUJlZ2luPT0wIGZvciAtcGkvMiB0byBwaS8yIG9yaWdpbmFsbHkpCisgICAgY29uc3QgaW50IGxhdGl0dWRlQmVnaW4gPSByZXNvbDIgLyA0OworICAgIGNvbnN0IGludCBsYXRpdHVkZUVuZCA9IHJlc29sMiAvIDI7ICAgIC8vIG5vbi1pbmNsdXNpdmUKKyAgICBjb25zdCBpbnQgbG9uZ2l0dWRlQ291bnQgPSByZXNvbDE7CisgICAgY29uc3QgaW50IGxhdGl0dWRlQ291bnQgPSBsYXRpdHVkZUVuZCAtIGxhdGl0dWRlQmVnaW47CisgICAgY29uc3QgbG9uZyB0cmlhbmdsZUNvdW50ID0gbG9uZ2l0dWRlQ291bnQgKiBsYXRpdHVkZUNvdW50ICogMjsKKyAgICBjb25zdCBsb25nIHZlcnRpY2VzID0gdHJpYW5nbGVDb3VudCAqIDM7CisgICAgR0xPQkpFQ1QgKnJlc3VsdDsKKyAgICBmbG9hdCBiYXNlQ29sb3JbM107CisgICAgaW50IGEsIGxvbmdpdHVkZSwgbGF0aXR1ZGU7CisgICAgbG9uZyBjdXJyZW50VmVydGV4LCBjdXJyZW50UXVhZDsKKworICAgIHJlc3VsdCA9IG5ld0dMT2JqZWN0KHZlcnRpY2VzLCAzLCAxKTsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgZm9yIChhID0gMDsgYSA8IDM7ICsrYSkKKyAgICAgICAgYmFzZUNvbG9yW2FdID0gKChyYW5kb21VSW50KCkgJSAxNTUpICsgMTAwKSAvIDI1NS5mOworCisgICAgY3VycmVudFF1YWQgPSAwOworICAgIGN1cnJlbnRWZXJ0ZXggPSAwOworCisgICAgLy8gbG9uZ2l0dWRlIC1waSB0byBwaQorICAgIGZvciAobG9uZ2l0dWRlID0gMDsgbG9uZ2l0dWRlIDwgbG9uZ2l0dWRlQ291bnQ7ICsrbG9uZ2l0dWRlKQorICAgIHsKKworICAgICAgICAvLyBsYXRpdHVkZSAwIHRvIHBpLzIKKyAgICAgICAgZm9yIChsYXRpdHVkZSA9IGxhdGl0dWRlQmVnaW47IGxhdGl0dWRlIDwgbGF0aXR1ZGVFbmQ7ICsrbGF0aXR1ZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZsb2F0IHQxID0gLVBJICsgbG9uZ2l0dWRlICogMiAqIFBJIC8gcmVzb2wxOworICAgICAgICAgICAgZmxvYXQgdDIgPSAtUEkgKyAobG9uZ2l0dWRlICsgMSkgKiAyICogUEkgLyByZXNvbDE7CisgICAgICAgICAgICBmbG9hdCBwMSA9IC1QSSAvIDIgKyBsYXRpdHVkZSAqIDIgKiBQSSAvIHJlc29sMjsKKyAgICAgICAgICAgIGZsb2F0IHAyID0gLVBJIC8gMiArIChsYXRpdHVkZSArIDEpICogMiAqIFBJIC8gcmVzb2wyOworICAgICAgICAgICAgZmxvYXQgcjAsIHIxLCByMiwgcjM7CisKKyAgICAgICAgICAgIHIwID0gc3NGdW5jKHQxLCBwYXJhbXMpOworICAgICAgICAgICAgcjEgPSBzc0Z1bmMocDEsICZwYXJhbXNbNl0pOworICAgICAgICAgICAgcjIgPSBzc0Z1bmModDIsIHBhcmFtcyk7CisgICAgICAgICAgICByMyA9IHNzRnVuYyhwMiwgJnBhcmFtc1s2XSk7CisKKyAgICAgICAgICAgIGlmIChyMCAhPSAwICYmIHIxICE9IDAgJiYgcjIgIT0gMCAmJiByMyAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFZFQ1RPUjMgcGEsIHBiLCBwYywgcGQ7CisgICAgICAgICAgICAgICAgVkVDVE9SMyB2MSwgdjIsIG47CisgICAgICAgICAgICAgICAgZmxvYXQgY2E7CisgICAgICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICAgICAgLy9mbG9hdCBsZW5TcSwgaW52TGVuU3E7CisKKyAgICAgICAgICAgICAgICBzdXBlclNoYXBlTWFwKCZwYSwgcjAsIHIxLCB0MSwgcDEpOworICAgICAgICAgICAgICAgIHN1cGVyU2hhcGVNYXAoJnBiLCByMiwgcjEsIHQyLCBwMSk7CisgICAgICAgICAgICAgICAgc3VwZXJTaGFwZU1hcCgmcGMsIHIyLCByMywgdDIsIHAyKTsKKyAgICAgICAgICAgICAgICBzdXBlclNoYXBlTWFwKCZwZCwgcjAsIHIzLCB0MSwgcDIpOworCisgICAgICAgICAgICAgICAgLy8ga2x1ZGdlIHRvIHNldCBsb3dlciBlZGdlIG9mIHRoZSBvYmplY3QgdG8gZml4ZWQgbGV2ZWwKKyAgICAgICAgICAgICAgICBpZiAobGF0aXR1ZGUgPT0gbGF0aXR1ZGVCZWdpbiArIDEpCisgICAgICAgICAgICAgICAgICAgIHBhLnogPSBwYi56ID0gMDsKKworICAgICAgICAgICAgICAgIHZlY3RvcjNTdWIoJnYxLCAmcGIsICZwYSk7CisgICAgICAgICAgICAgICAgdmVjdG9yM1N1YigmdjIsICZwZCwgJnBhKTsKKworICAgICAgICAgICAgICAgIC8vIENhbGN1bGF0ZSBub3JtYWwgd2l0aCBjcm9zcyBwcm9kdWN0LgorICAgICAgICAgICAgICAgIC8qICAgaSAgICBqICAgIGsgICAgICBpICAgIGoKKyAgICAgICAgICAgICAgICAgKiB2MS54IHYxLnkgdjEueiB8IHYxLnggdjEueQorICAgICAgICAgICAgICAgICAqIHYyLnggdjIueSB2Mi56IHwgdjIueCB2Mi55CisgICAgICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgICAgICBuLnggPSB2MS55ICogdjIueiAtIHYxLnogKiB2Mi55OworICAgICAgICAgICAgICAgIG4ueSA9IHYxLnogKiB2Mi54IC0gdjEueCAqIHYyLno7CisgICAgICAgICAgICAgICAgbi56ID0gdjEueCAqIHYyLnkgLSB2MS55ICogdjIueDsKKworICAgICAgICAgICAgICAgIC8qIFByZS1ub3JtYWxpemF0aW9uIG9mIHRoZSBub3JtYWxzIGlzIGRpc2FibGVkIGhlcmUgYmVjYXVzZQorICAgICAgICAgICAgICAgICAqIHRoZXkgd2lsbCBiZSBub3JtYWxpemVkIGFueXdheSBsYXRlciBkdWUgdG8gYXV0b21hdGljCisgICAgICAgICAgICAgICAgICogbm9ybWFsaXphdGlvbiAoR0xfTk9STUFMSVpFKS4gSXQgaXMgZW5hYmxlZCBiZWNhdXNlIHRoZQorICAgICAgICAgICAgICAgICAqIG9iamVjdHMgYXJlIHNjYWxlZCB3aXRoIGdsU2NhbGUuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICBsZW5TcSA9IG4ueCAqIG4ueCArIG4ueSAqIG4ueSArIG4ueiAqIG4uejsKKyAgICAgICAgICAgICAgICBpbnZMZW5TcSA9IChmbG9hdCkoMSAvIHNxcnQobGVuU3EpKTsKKyAgICAgICAgICAgICAgICBuLnggKj0gaW52TGVuU3E7CisgICAgICAgICAgICAgICAgbi55ICo9IGludkxlblNxOworICAgICAgICAgICAgICAgIG4ueiAqPSBpbnZMZW5TcTsKKyAgICAgICAgICAgICAgICAqLworCisgICAgICAgICAgICAgICAgY2EgPSBwYS56ICsgMC41ZjsKKworICAgICAgICAgICAgICAgIGZvciAoaSA9IGN1cnJlbnRWZXJ0ZXggKiAzOworICAgICAgICAgICAgICAgICAgICAgaSA8IChjdXJyZW50VmVydGV4ICsgNikgKiAzOworICAgICAgICAgICAgICAgICAgICAgaSArPSAzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LT5ub3JtYWxBcnJheVtpXSA9IEZJWEVEKG4ueCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC0+bm9ybWFsQXJyYXlbaSArIDFdID0gRklYRUQobi55KTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LT5ub3JtYWxBcnJheVtpICsgMl0gPSBGSVhFRChuLnopOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3IgKGkgPSBjdXJyZW50VmVydGV4ICogNDsKKyAgICAgICAgICAgICAgICAgICAgIGkgPCAoY3VycmVudFZlcnRleCArIDYpICogNDsKKyAgICAgICAgICAgICAgICAgICAgIGkgKz0gNCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCBhLCBjb2xvclszXTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChhID0gMDsgYSA8IDM7ICsrYSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JbYV0gPSAoaW50KShjYSAqIGJhc2VDb2xvclthXSAqIDI1NSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29sb3JbYV0gPiAyNTUpIGNvbG9yW2FdID0gMjU1OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC0+Y29sb3JBcnJheVtpXSA9IChHTHVieXRlKWNvbG9yWzBdOworICAgICAgICAgICAgICAgICAgICByZXN1bHQtPmNvbG9yQXJyYXlbaSArIDFdID0gKEdMdWJ5dGUpY29sb3JbMV07CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC0+Y29sb3JBcnJheVtpICsgMl0gPSAoR0x1Ynl0ZSljb2xvclsyXTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LT5jb2xvckFycmF5W2kgKyAzXSA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJlc3VsdC0+dmVydGV4QXJyYXlbY3VycmVudFZlcnRleCAqIDNdID0gRklYRUQocGEueCk7CisgICAgICAgICAgICAgICAgcmVzdWx0LT52ZXJ0ZXhBcnJheVtjdXJyZW50VmVydGV4ICogMyArIDFdID0gRklYRUQocGEueSk7CisgICAgICAgICAgICAgICAgcmVzdWx0LT52ZXJ0ZXhBcnJheVtjdXJyZW50VmVydGV4ICogMyArIDJdID0gRklYRUQocGEueik7CisgICAgICAgICAgICAgICAgKytjdXJyZW50VmVydGV4OworICAgICAgICAgICAgICAgIHJlc3VsdC0+dmVydGV4QXJyYXlbY3VycmVudFZlcnRleCAqIDNdID0gRklYRUQocGIueCk7CisgICAgICAgICAgICAgICAgcmVzdWx0LT52ZXJ0ZXhBcnJheVtjdXJyZW50VmVydGV4ICogMyArIDFdID0gRklYRUQocGIueSk7CisgICAgICAgICAgICAgICAgcmVzdWx0LT52ZXJ0ZXhBcnJheVtjdXJyZW50VmVydGV4ICogMyArIDJdID0gRklYRUQocGIueik7CisgICAgICAgICAgICAgICAgKytjdXJyZW50VmVydGV4OworICAgICAgICAgICAgICAgIHJlc3VsdC0+dmVydGV4QXJyYXlbY3VycmVudFZlcnRleCAqIDNdID0gRklYRUQocGQueCk7CisgICAgICAgICAgICAgICAgcmVzdWx0LT52ZXJ0ZXhBcnJheVtjdXJyZW50VmVydGV4ICogMyArIDFdID0gRklYRUQocGQueSk7CisgICAgICAgICAgICAgICAgcmVzdWx0LT52ZXJ0ZXhBcnJheVtjdXJyZW50VmVydGV4ICogMyArIDJdID0gRklYRUQocGQueik7CisgICAgICAgICAgICAgICAgKytjdXJyZW50VmVydGV4OworICAgICAgICAgICAgICAgIHJlc3VsdC0+dmVydGV4QXJyYXlbY3VycmVudFZlcnRleCAqIDNdID0gRklYRUQocGIueCk7CisgICAgICAgICAgICAgICAgcmVzdWx0LT52ZXJ0ZXhBcnJheVtjdXJyZW50VmVydGV4ICogMyArIDFdID0gRklYRUQocGIueSk7CisgICAgICAgICAgICAgICAgcmVzdWx0LT52ZXJ0ZXhBcnJheVtjdXJyZW50VmVydGV4ICogMyArIDJdID0gRklYRUQocGIueik7CisgICAgICAgICAgICAgICAgKytjdXJyZW50VmVydGV4OworICAgICAgICAgICAgICAgIHJlc3VsdC0+dmVydGV4QXJyYXlbY3VycmVudFZlcnRleCAqIDNdID0gRklYRUQocGMueCk7CisgICAgICAgICAgICAgICAgcmVzdWx0LT52ZXJ0ZXhBcnJheVtjdXJyZW50VmVydGV4ICogMyArIDFdID0gRklYRUQocGMueSk7CisgICAgICAgICAgICAgICAgcmVzdWx0LT52ZXJ0ZXhBcnJheVtjdXJyZW50VmVydGV4ICogMyArIDJdID0gRklYRUQocGMueik7CisgICAgICAgICAgICAgICAgKytjdXJyZW50VmVydGV4OworICAgICAgICAgICAgICAgIHJlc3VsdC0+dmVydGV4QXJyYXlbY3VycmVudFZlcnRleCAqIDNdID0gRklYRUQocGQueCk7CisgICAgICAgICAgICAgICAgcmVzdWx0LT52ZXJ0ZXhBcnJheVtjdXJyZW50VmVydGV4ICogMyArIDFdID0gRklYRUQocGQueSk7CisgICAgICAgICAgICAgICAgcmVzdWx0LT52ZXJ0ZXhBcnJheVtjdXJyZW50VmVydGV4ICogMyArIDJdID0gRklYRUQocGQueik7CisgICAgICAgICAgICAgICAgKytjdXJyZW50VmVydGV4OworICAgICAgICAgICAgfSAvLyByMCAmJiByMSAmJiByMiAmJiByMworICAgICAgICAgICAgKytjdXJyZW50UXVhZDsKKyAgICAgICAgfSAvLyBsYXRpdHVkZQorICAgIH0gLy8gbG9uZ2l0dWRlCisKKyAgICAvLyBTZXQgbnVtYmVyIG9mIHZlcnRpY2VzIGluIG9iamVjdCB0byB0aGUgYWN0dWFsIGFtb3VudCBjcmVhdGVkLgorICAgIHJlc3VsdC0+Y291bnQgPSBjdXJyZW50VmVydGV4OworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworCitzdGF0aWMgR0xPQkpFQ1QgKiBjcmVhdGVHcm91bmRQbGFuZSgpCit7CisgICAgY29uc3QgaW50IHNjYWxlID0gNDsKKyAgICBjb25zdCBpbnQgeUJlZ2luID0gLTE1LCB5RW5kID0gMTU7ICAgIC8vIGVuZHMgYXJlIG5vbi1pbmNsdXNpdmUKKyAgICBjb25zdCBpbnQgeEJlZ2luID0gLTE1LCB4RW5kID0gMTU7CisgICAgY29uc3QgbG9uZyB0cmlhbmdsZUNvdW50ID0gKHlFbmQgLSB5QmVnaW4pICogKHhFbmQgLSB4QmVnaW4pICogMjsKKyAgICBjb25zdCBsb25nIHZlcnRpY2VzID0gdHJpYW5nbGVDb3VudCAqIDM7CisgICAgR0xPQkpFQ1QgKnJlc3VsdDsKKyAgICBpbnQgeCwgeTsKKyAgICBsb25nIGN1cnJlbnRWZXJ0ZXgsIGN1cnJlbnRRdWFkOworCisgICAgcmVzdWx0ID0gbmV3R0xPYmplY3QodmVydGljZXMsIDIsIDApOworICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBjdXJyZW50UXVhZCA9IDA7CisgICAgY3VycmVudFZlcnRleCA9IDA7CisKKyAgICBmb3IgKHkgPSB5QmVnaW47IHkgPCB5RW5kOyArK3kpCisgICAgeworICAgICAgICBmb3IgKHggPSB4QmVnaW47IHggPCB4RW5kOyArK3gpCisgICAgICAgIHsKKyAgICAgICAgICAgIEdMdWJ5dGUgY29sb3I7CisgICAgICAgICAgICBpbnQgaSwgYTsKKyAgICAgICAgICAgIGNvbG9yID0gKEdMdWJ5dGUpKChyYW5kb21VSW50KCkgJiAweDVmKSArIDgxKTsgIC8vIDEwMSAxMTExCisgICAgICAgICAgICBmb3IgKGkgPSBjdXJyZW50VmVydGV4ICogNDsgaSA8IChjdXJyZW50VmVydGV4ICsgNikgKiA0OyBpICs9IDQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmVzdWx0LT5jb2xvckFycmF5W2ldID0gY29sb3I7CisgICAgICAgICAgICAgICAgcmVzdWx0LT5jb2xvckFycmF5W2kgKyAxXSA9IGNvbG9yOworICAgICAgICAgICAgICAgIHJlc3VsdC0+Y29sb3JBcnJheVtpICsgMl0gPSBjb2xvcjsKKyAgICAgICAgICAgICAgICByZXN1bHQtPmNvbG9yQXJyYXlbaSArIDNdID0gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQXhpcyBiaXRzIGZvciBxdWFkIHRyaWFuZ2xlczoKKyAgICAgICAgICAgIC8vIHg6IDAxMTEwMCAoMHgxYyksIHk6IDExMDAwMSAoMHgzMSkgIChjbG9ja3dpc2UpCisgICAgICAgICAgICAvLyB4OiAwMDExMTAgKDB4MGUpLCB5OiAxMDAwMTEgKDB4MjMpICAoY291bnRlci1jbG9ja3dpc2UpCisgICAgICAgICAgICBmb3IgKGEgPSAwOyBhIDwgNjsgKythKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbnN0IGludCB4bSA9IHggKyAoKDB4MWMgPj4gYSkgJiAxKTsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgeW0gPSB5ICsgKCgweDMxID4+IGEpICYgMSk7CisgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgbSA9IChmbG9hdCkoY29zKHhtICogMikgKiBzaW4oeW0gKiA0KSAqIDAuNzVmKTsKKyAgICAgICAgICAgICAgICByZXN1bHQtPnZlcnRleEFycmF5W2N1cnJlbnRWZXJ0ZXggKiAyXSA9CisgICAgICAgICAgICAgICAgICAgIEZJWEVEKHhtICogc2NhbGUgKyBtKTsKKyAgICAgICAgICAgICAgICByZXN1bHQtPnZlcnRleEFycmF5W2N1cnJlbnRWZXJ0ZXggKiAyICsgMV0gPQorICAgICAgICAgICAgICAgICAgICBGSVhFRCh5bSAqIHNjYWxlICsgbSk7CisgICAgICAgICAgICAgICAgKytjdXJyZW50VmVydGV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgKytjdXJyZW50UXVhZDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCisKK3N0YXRpYyB2b2lkIGRyYXdHcm91bmRQbGFuZSgpCit7CisgICAgZ2xEaXNhYmxlKEdMX0NVTExfRkFDRSk7CisgICAgZ2xEaXNhYmxlKEdMX0RFUFRIX1RFU1QpOworICAgIGdsRW5hYmxlKEdMX0JMRU5EKTsKKyAgICBnbEJsZW5kRnVuYyhHTF9aRVJPLCBHTF9TUkNfQ09MT1IpOworICAgIGdsRGlzYWJsZShHTF9MSUdIVElORyk7CisKKyAgICBkcmF3R0xPYmplY3Qoc0dyb3VuZFBsYW5lKTsKKworICAgIGdsRW5hYmxlKEdMX0xJR0hUSU5HKTsKKyAgICBnbERpc2FibGUoR0xfQkxFTkQpOworICAgIGdsRW5hYmxlKEdMX0RFUFRIX1RFU1QpOworfQorCisKK3N0YXRpYyB2b2lkIGRyYXdGYWRlUXVhZCgpCit7CisgICAgc3RhdGljIGNvbnN0IEdMZml4ZWQgcXVhZFZlcnRpY2VzW10gPSB7CisgICAgICAgIC0weDEwMDAwLCAtMHgxMDAwMCwKKyAgICAgICAgIDB4MTAwMDAsIC0weDEwMDAwLAorICAgICAgICAtMHgxMDAwMCwgIDB4MTAwMDAsCisgICAgICAgICAweDEwMDAwLCAtMHgxMDAwMCwKKyAgICAgICAgIDB4MTAwMDAsICAweDEwMDAwLAorICAgICAgICAtMHgxMDAwMCwgIDB4MTAwMDAKKyAgICB9OworCisgICAgY29uc3QgaW50IGJlZ2luRmFkZSA9IHNUaWNrIC0gc0N1cnJlbnRDYW1UcmFja1N0YXJ0VGljazsKKyAgICBjb25zdCBpbnQgZW5kRmFkZSA9IHNOZXh0Q2FtVHJhY2tTdGFydFRpY2sgLSBzVGljazsKKyAgICBjb25zdCBpbnQgbWluRmFkZSA9IGJlZ2luRmFkZSA8IGVuZEZhZGUgPyBiZWdpbkZhZGUgOiBlbmRGYWRlOworCisgICAgaWYgKG1pbkZhZGUgPCAxMDI0KQorICAgIHsKKyAgICAgICAgY29uc3QgR0xmaXhlZCBmYWRlQ29sb3IgPSBtaW5GYWRlIDw8IDY7CisgICAgICAgIGdsQ29sb3I0eChmYWRlQ29sb3IsIGZhZGVDb2xvciwgZmFkZUNvbG9yLCAwKTsKKworICAgICAgICBnbERpc2FibGUoR0xfREVQVEhfVEVTVCk7CisgICAgICAgIGdsRW5hYmxlKEdMX0JMRU5EKTsKKyAgICAgICAgZ2xCbGVuZEZ1bmMoR0xfWkVSTywgR0xfU1JDX0NPTE9SKTsKKyAgICAgICAgZ2xEaXNhYmxlKEdMX0xJR0hUSU5HKTsKKworICAgICAgICBnbE1hdHJpeE1vZGUoR0xfTU9ERUxWSUVXKTsKKyAgICAgICAgZ2xMb2FkSWRlbnRpdHkoKTsKKworICAgICAgICBnbE1hdHJpeE1vZGUoR0xfUFJPSkVDVElPTik7CisgICAgICAgIGdsTG9hZElkZW50aXR5KCk7CisKKyAgICAgICAgZ2xEaXNhYmxlQ2xpZW50U3RhdGUoR0xfQ09MT1JfQVJSQVkpOworICAgICAgICBnbERpc2FibGVDbGllbnRTdGF0ZShHTF9OT1JNQUxfQVJSQVkpOworICAgICAgICBnbFZlcnRleFBvaW50ZXIoMiwgR0xfRklYRUQsIDAsIHF1YWRWZXJ0aWNlcyk7CisgICAgICAgIGdsRHJhd0FycmF5cyhHTF9UUklBTkdMRVMsIDAsIDYpOworCisgICAgICAgIGdsRW5hYmxlQ2xpZW50U3RhdGUoR0xfQ09MT1JfQVJSQVkpOworCisgICAgICAgIGdsTWF0cml4TW9kZShHTF9NT0RFTFZJRVcpOworCisgICAgICAgIGdsRW5hYmxlKEdMX0xJR0hUSU5HKTsKKyAgICAgICAgZ2xEaXNhYmxlKEdMX0JMRU5EKTsKKyAgICAgICAgZ2xFbmFibGUoR0xfREVQVEhfVEVTVCk7CisgICAgfQorfQorCisKKy8vIENhbGxlZCBmcm9tIHRoZSBhcHAgZnJhbWV3b3JrLgordm9pZCBhcHBJbml0KCkKK3sKKyAgICBpbnQgYTsKKworICAgIGdsRW5hYmxlKEdMX05PUk1BTElaRSk7CisgICAgZ2xFbmFibGUoR0xfREVQVEhfVEVTVCk7CisgICAgZ2xEaXNhYmxlKEdMX0NVTExfRkFDRSk7CisgICAgZ2xTaGFkZU1vZGVsKEdMX0ZMQVQpOworCisgICAgZ2xFbmFibGUoR0xfTElHSFRJTkcpOworICAgIGdsRW5hYmxlKEdMX0xJR0hUMCk7CisgICAgZ2xFbmFibGUoR0xfTElHSFQxKTsKKyAgICBnbEVuYWJsZShHTF9MSUdIVDIpOworCisgICAgZ2xFbmFibGVDbGllbnRTdGF0ZShHTF9WRVJURVhfQVJSQVkpOworICAgIGdsRW5hYmxlQ2xpZW50U3RhdGUoR0xfQ09MT1JfQVJSQVkpOworCisgICAgc2VlZFJhbmRvbSgxNSk7CisKKyAgICBmb3IgKGEgPSAwOyBhIDwgU1VQRVJTSEFQRV9DT1VOVDsgKythKQorICAgIHsKKyAgICAgICAgc1N1cGVyU2hhcGVPYmplY3RzW2FdID0gY3JlYXRlU3VwZXJTaGFwZShzU3VwZXJTaGFwZVBhcmFtc1thXSk7CisgICAgICAgIGFzc2VydChzU3VwZXJTaGFwZU9iamVjdHNbYV0gIT0gTlVMTCk7CisgICAgfQorICAgIHNHcm91bmRQbGFuZSA9IGNyZWF0ZUdyb3VuZFBsYW5lKCk7CisgICAgYXNzZXJ0KHNHcm91bmRQbGFuZSAhPSBOVUxMKTsKK30KKworCisvLyBDYWxsZWQgZnJvbSB0aGUgYXBwIGZyYW1ld29yay4KK3ZvaWQgYXBwRGVpbml0KCkKK3sKKyAgICBpbnQgYTsKKyAgICBmb3IgKGEgPSAwOyBhIDwgU1VQRVJTSEFQRV9DT1VOVDsgKythKQorICAgICAgICBmcmVlR0xPYmplY3Qoc1N1cGVyU2hhcGVPYmplY3RzW2FdKTsKKyAgICBmcmVlR0xPYmplY3Qoc0dyb3VuZFBsYW5lKTsKK30KKworCitzdGF0aWMgdm9pZCBnbHVQZXJzcGVjdGl2ZShHTGZsb2F0IGZvdnksIEdMZmxvYXQgYXNwZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xmbG9hdCB6TmVhciwgR0xmbG9hdCB6RmFyKQoreworICAgIEdMZmxvYXQgeG1pbiwgeG1heCwgeW1pbiwgeW1heDsKKworICAgIHltYXggPSB6TmVhciAqIChHTGZsb2F0KXRhbihmb3Z5ICogUEkgLyAzNjApOworICAgIHltaW4gPSAteW1heDsKKyAgICB4bWluID0geW1pbiAqIGFzcGVjdDsKKyAgICB4bWF4ID0geW1heCAqIGFzcGVjdDsKKworICAgIGdsRnJ1c3R1bXgoKEdMZml4ZWQpKHhtaW4gKiA2NTUzNiksIChHTGZpeGVkKSh4bWF4ICogNjU1MzYpLAorICAgICAgICAgICAgICAgKEdMZml4ZWQpKHltaW4gKiA2NTUzNiksIChHTGZpeGVkKSh5bWF4ICogNjU1MzYpLAorICAgICAgICAgICAgICAgKEdMZml4ZWQpKHpOZWFyICogNjU1MzYpLCAoR0xmaXhlZCkoekZhciAqIDY1NTM2KSk7Cit9CisKKworc3RhdGljIHZvaWQgcHJlcGFyZUZyYW1lKGludCB3aWR0aCwgaW50IGhlaWdodCkKK3sKKyAgICBnbFZpZXdwb3J0KDAsIDAsIHdpZHRoLCBoZWlnaHQpOworCisgICAgZ2xDbGVhckNvbG9yeCgoR0xmaXhlZCkoMC4xZiAqIDY1NTM2KSwKKyAgICAgICAgICAgICAgICAgIChHTGZpeGVkKSgwLjJmICogNjU1MzYpLAorICAgICAgICAgICAgICAgICAgKEdMZml4ZWQpKDAuM2YgKiA2NTUzNiksIDB4MTAwMDApOworICAgIGdsQ2xlYXIoR0xfREVQVEhfQlVGRkVSX0JJVCB8IEdMX0NPTE9SX0JVRkZFUl9CSVQpOworCisgICAgZ2xNYXRyaXhNb2RlKEdMX1BST0pFQ1RJT04pOworICAgIGdsTG9hZElkZW50aXR5KCk7CisgICAgZ2x1UGVyc3BlY3RpdmUoNDUsIChmbG9hdCl3aWR0aCAvIGhlaWdodCwgMC41ZiwgMTUwKTsKKworICAgIGdsTWF0cml4TW9kZShHTF9NT0RFTFZJRVcpOworCisgICAgZ2xMb2FkSWRlbnRpdHkoKTsKK30KKworCitzdGF0aWMgdm9pZCBjb25maWd1cmVMaWdodEFuZE1hdGVyaWFsKCkKK3sKKyAgICBzdGF0aWMgR0xmaXhlZCBsaWdodDBQb3NpdGlvbltdID0geyAtMHg0MDAwMCwgMHgxMDAwMCwgMHgxMDAwMCwgMCB9OworICAgIHN0YXRpYyBHTGZpeGVkIGxpZ2h0MERpZmZ1c2VbXSA9IHsgMHgxMDAwMCwgMHg2NjY2LCAwLCAweDEwMDAwIH07CisgICAgc3RhdGljIEdMZml4ZWQgbGlnaHQxUG9zaXRpb25bXSA9IHsgMHgxMDAwMCwgLTB4MjAwMDAsIC0weDEwMDAwLCAwIH07CisgICAgc3RhdGljIEdMZml4ZWQgbGlnaHQxRGlmZnVzZVtdID0geyAweDExZWIsIDB4MjNkNywgMHg1OTk5LCAweDEwMDAwIH07CisgICAgc3RhdGljIEdMZml4ZWQgbGlnaHQyUG9zaXRpb25bXSA9IHsgLTB4MTAwMDAsIDAsIC0weDQwMDAwLCAwIH07CisgICAgc3RhdGljIEdMZml4ZWQgbGlnaHQyRGlmZnVzZVtdID0geyAweDExZWIsIDB4MmI4NSwgMHgyM2Q3LCAweDEwMDAwIH07CisgICAgc3RhdGljIEdMZml4ZWQgbWF0ZXJpYWxTcGVjdWxhcltdID0geyAweDEwMDAwLCAweDEwMDAwLCAweDEwMDAwLCAweDEwMDAwIH07CisKKyAgICBnbExpZ2h0eHYoR0xfTElHSFQwLCBHTF9QT1NJVElPTiwgbGlnaHQwUG9zaXRpb24pOworICAgIGdsTGlnaHR4dihHTF9MSUdIVDAsIEdMX0RJRkZVU0UsIGxpZ2h0MERpZmZ1c2UpOworICAgIGdsTGlnaHR4dihHTF9MSUdIVDEsIEdMX1BPU0lUSU9OLCBsaWdodDFQb3NpdGlvbik7CisgICAgZ2xMaWdodHh2KEdMX0xJR0hUMSwgR0xfRElGRlVTRSwgbGlnaHQxRGlmZnVzZSk7CisgICAgZ2xMaWdodHh2KEdMX0xJR0hUMiwgR0xfUE9TSVRJT04sIGxpZ2h0MlBvc2l0aW9uKTsKKyAgICBnbExpZ2h0eHYoR0xfTElHSFQyLCBHTF9ESUZGVVNFLCBsaWdodDJEaWZmdXNlKTsKKyAgICBnbE1hdGVyaWFseHYoR0xfRlJPTlRfQU5EX0JBQ0ssIEdMX1NQRUNVTEFSLCBtYXRlcmlhbFNwZWN1bGFyKTsKKworICAgIGdsTWF0ZXJpYWx4KEdMX0ZST05UX0FORF9CQUNLLCBHTF9TSElOSU5FU1MsIDYwIDw8IDE2KTsKKyAgICBnbEVuYWJsZShHTF9DT0xPUl9NQVRFUklBTCk7Cit9CisKKworc3RhdGljIHZvaWQgZHJhd01vZGVscyhmbG9hdCB6U2NhbGUpCit7CisgICAgY29uc3QgaW50IHRyYW5zbGF0aW9uU2NhbGUgPSA5OworICAgIGludCB4LCB5OworCisgICAgc2VlZFJhbmRvbSg5KTsKKworICAgIGdsU2NhbGV4KDEgPDwgMTYsIDEgPDwgMTYsIChHTGZpeGVkKSh6U2NhbGUgKiA2NTUzNikpOworCisgICAgZm9yICh5ID0gLTU7IHkgPD0gNTsgKyt5KQorICAgIHsKKyAgICAgICAgZm9yICh4ID0gLTU7IHggPD0gNTsgKyt4KQorICAgICAgICB7CisgICAgICAgICAgICBmbG9hdCBidWlsZGluZ1NjYWxlOworICAgICAgICAgICAgR0xmaXhlZCBmaXhlZFNjYWxlOworCisgICAgICAgICAgICBpbnQgY3VyU2hhcGUgPSByYW5kb21VSW50KCkgJSBTVVBFUlNIQVBFX0NPVU5UOworICAgICAgICAgICAgYnVpbGRpbmdTY2FsZSA9IHNTdXBlclNoYXBlUGFyYW1zW2N1clNoYXBlXVtTVVBFUlNIQVBFX1BBUkFNUyAtIDFdOworICAgICAgICAgICAgZml4ZWRTY2FsZSA9IChHTGZpeGVkKShidWlsZGluZ1NjYWxlICogNjU1MzYpOworCisgICAgICAgICAgICBnbFB1c2hNYXRyaXgoKTsKKyAgICAgICAgICAgIGdsVHJhbnNsYXRleCgoeCAqIHRyYW5zbGF0aW9uU2NhbGUpICogNjU1MzYsCisgICAgICAgICAgICAgICAgICAgICAgICAgKHkgKiB0cmFuc2xhdGlvblNjYWxlKSAqIDY1NTM2LAorICAgICAgICAgICAgICAgICAgICAgICAgIDApOworICAgICAgICAgICAgZ2xSb3RhdGV4KChHTGZpeGVkKSgocmFuZG9tVUludCgpICUgMzYwKSA8PCAxNiksIDAsIDAsIDEgPDwgMTYpOworICAgICAgICAgICAgZ2xTY2FsZXgoZml4ZWRTY2FsZSwgZml4ZWRTY2FsZSwgZml4ZWRTY2FsZSk7CisKKyAgICAgICAgICAgIGRyYXdHTE9iamVjdChzU3VwZXJTaGFwZU9iamVjdHNbY3VyU2hhcGVdKTsKKyAgICAgICAgICAgIGdsUG9wTWF0cml4KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKHggPSAtMjsgeCA8PSAyOyArK3gpCisgICAgeworICAgICAgICBjb25zdCBpbnQgc2hpcFNjYWxlMTAwID0gdHJhbnNsYXRpb25TY2FsZSAqIDUwMDsKKyAgICAgICAgY29uc3QgaW50IG9mZnMxMDAgPSB4ICogc2hpcFNjYWxlMTAwICsgKHNUaWNrICUgc2hpcFNjYWxlMTAwKTsKKyAgICAgICAgZmxvYXQgb2ZmcyA9IG9mZnMxMDAgKiAwLjAxZjsKKyAgICAgICAgR0xmaXhlZCBmaXhlZE9mZnMgPSAoR0xmaXhlZCkob2ZmcyAqIDY1NTM2KTsKKyAgICAgICAgZ2xQdXNoTWF0cml4KCk7CisgICAgICAgIGdsVHJhbnNsYXRleChmaXhlZE9mZnMsIC00ICogNjU1MzYsIDIgPDwgMTYpOworICAgICAgICBkcmF3R0xPYmplY3Qoc1N1cGVyU2hhcGVPYmplY3RzW1NVUEVSU0hBUEVfQ09VTlQgLSAxXSk7CisgICAgICAgIGdsUG9wTWF0cml4KCk7CisgICAgICAgIGdsUHVzaE1hdHJpeCgpOworICAgICAgICBnbFRyYW5zbGF0ZXgoLTQgKiA2NTUzNiwgZml4ZWRPZmZzLCA0IDw8IDE2KTsKKyAgICAgICAgZ2xSb3RhdGV4KDkwIDw8IDE2LCAwLCAwLCAxIDw8IDE2KTsKKyAgICAgICAgZHJhd0dMT2JqZWN0KHNTdXBlclNoYXBlT2JqZWN0c1tTVVBFUlNIQVBFX0NPVU5UIC0gMV0pOworICAgICAgICBnbFBvcE1hdHJpeCgpOworICAgIH0KK30KKworCisvKiBGb2xsb3dpbmcgZ2x1TG9va0F0IGltcGxlbWVudGF0aW9uIGlzIGFkYXB0ZWQgZnJvbSB0aGUKKyAqIE1lc2EgM0QgR3JhcGhpY3MgbGlicmFyeS4gaHR0cDovL3d3dy5tZXNhM2Qub3JnCisgKi8KK3N0YXRpYyB2b2lkIGdsdUxvb2tBdChHTGZsb2F0IGV5ZXgsIEdMZmxvYXQgZXlleSwgR0xmbG9hdCBleWV6LAorCSAgICAgICAgICAgICAgR0xmbG9hdCBjZW50ZXJ4LCBHTGZsb2F0IGNlbnRlcnksIEdMZmxvYXQgY2VudGVyeiwKKwkgICAgICAgICAgICAgIEdMZmxvYXQgdXB4LCBHTGZsb2F0IHVweSwgR0xmbG9hdCB1cHopCit7CisgICAgR0xmbG9hdCBtWzE2XTsKKyAgICBHTGZsb2F0IHhbM10sIHlbM10sIHpbM107CisgICAgR0xmbG9hdCBtYWc7CisKKyAgICAvKiBNYWtlIHJvdGF0aW9uIG1hdHJpeCAqLworCisgICAgLyogWiB2ZWN0b3IgKi8KKyAgICB6WzBdID0gZXlleCAtIGNlbnRlcng7CisgICAgelsxXSA9IGV5ZXkgLSBjZW50ZXJ5OworICAgIHpbMl0gPSBleWV6IC0gY2VudGVyejsKKyAgICBtYWcgPSAoZmxvYXQpc3FydCh6WzBdICogelswXSArIHpbMV0gKiB6WzFdICsgelsyXSAqIHpbMl0pOworICAgIGlmIChtYWcpIHsJCQkvKiBtcGljaGxlciwgMTk5NTA1MTUgKi8KKyAgICAgICAgelswXSAvPSBtYWc7CisgICAgICAgIHpbMV0gLz0gbWFnOworICAgICAgICB6WzJdIC89IG1hZzsKKyAgICB9CisKKyAgICAvKiBZIHZlY3RvciAqLworICAgIHlbMF0gPSB1cHg7CisgICAgeVsxXSA9IHVweTsKKyAgICB5WzJdID0gdXB6OworCisgICAgLyogWCB2ZWN0b3IgPSBZIGNyb3NzIFogKi8KKyAgICB4WzBdID0geVsxXSAqIHpbMl0gLSB5WzJdICogelsxXTsKKyAgICB4WzFdID0gLXlbMF0gKiB6WzJdICsgeVsyXSAqIHpbMF07CisgICAgeFsyXSA9IHlbMF0gKiB6WzFdIC0geVsxXSAqIHpbMF07CisKKyAgICAvKiBSZWNvbXB1dGUgWSA9IFogY3Jvc3MgWCAqLworICAgIHlbMF0gPSB6WzFdICogeFsyXSAtIHpbMl0gKiB4WzFdOworICAgIHlbMV0gPSAtelswXSAqIHhbMl0gKyB6WzJdICogeFswXTsKKyAgICB5WzJdID0gelswXSAqIHhbMV0gLSB6WzFdICogeFswXTsKKworICAgIC8qIG1waWNobGVyLCAxOTk1MDUxNSAqLworICAgIC8qIGNyb3NzIHByb2R1Y3QgZ2l2ZXMgYXJlYSBvZiBwYXJhbGxlbG9ncmFtLCB3aGljaCBpcyA8IDEuMCBmb3IKKyAgICAgKiBub24tcGVycGVuZGljdWxhciB1bml0LWxlbmd0aCB2ZWN0b3JzOyBzbyBub3JtYWxpemUgeCwgeSBoZXJlCisgICAgICovCisKKyAgICBtYWcgPSAoZmxvYXQpc3FydCh4WzBdICogeFswXSArIHhbMV0gKiB4WzFdICsgeFsyXSAqIHhbMl0pOworICAgIGlmIChtYWcpIHsKKyAgICAgICAgeFswXSAvPSBtYWc7CisgICAgICAgIHhbMV0gLz0gbWFnOworICAgICAgICB4WzJdIC89IG1hZzsKKyAgICB9CisKKyAgICBtYWcgPSAoZmxvYXQpc3FydCh5WzBdICogeVswXSArIHlbMV0gKiB5WzFdICsgeVsyXSAqIHlbMl0pOworICAgIGlmIChtYWcpIHsKKyAgICAgICAgeVswXSAvPSBtYWc7CisgICAgICAgIHlbMV0gLz0gbWFnOworICAgICAgICB5WzJdIC89IG1hZzsKKyAgICB9CisKKyNkZWZpbmUgTShyb3csY29sKSAgbVtjb2wqNCtyb3ddCisgICAgTSgwLCAwKSA9IHhbMF07CisgICAgTSgwLCAxKSA9IHhbMV07CisgICAgTSgwLCAyKSA9IHhbMl07CisgICAgTSgwLCAzKSA9IDAuMDsKKyAgICBNKDEsIDApID0geVswXTsKKyAgICBNKDEsIDEpID0geVsxXTsKKyAgICBNKDEsIDIpID0geVsyXTsKKyAgICBNKDEsIDMpID0gMC4wOworICAgIE0oMiwgMCkgPSB6WzBdOworICAgIE0oMiwgMSkgPSB6WzFdOworICAgIE0oMiwgMikgPSB6WzJdOworICAgIE0oMiwgMykgPSAwLjA7CisgICAgTSgzLCAwKSA9IDAuMDsKKyAgICBNKDMsIDEpID0gMC4wOworICAgIE0oMywgMikgPSAwLjA7CisgICAgTSgzLCAzKSA9IDEuMDsKKyN1bmRlZiBNCisgICAgeworICAgICAgICBpbnQgYTsKKyAgICAgICAgR0xmaXhlZCBmaXhlZE1bMTZdOworICAgICAgICBmb3IgKGEgPSAwOyBhIDwgMTY7ICsrYSkKKyAgICAgICAgICAgIGZpeGVkTVthXSA9IChHTGZpeGVkKShtW2FdICogNjU1MzYpOworICAgICAgICBnbE11bHRNYXRyaXh4KGZpeGVkTSk7CisgICAgfQorCisgICAgLyogVHJhbnNsYXRlIEV5ZSB0byBPcmlnaW4gKi8KKyAgICBnbFRyYW5zbGF0ZXgoKEdMZml4ZWQpKC1leWV4ICogNjU1MzYpLAorICAgICAgICAgICAgICAgICAoR0xmaXhlZCkoLWV5ZXkgKiA2NTUzNiksCisgICAgICAgICAgICAgICAgIChHTGZpeGVkKSgtZXlleiAqIDY1NTM2KSk7Cit9CisKKworc3RhdGljIHZvaWQgY2FtVHJhY2soKQoreworICAgIGZsb2F0IGxlcnBbNV07CisgICAgZmxvYXQgZVgsIGVZLCBlWiwgY1gsIGNZLCBjWjsKKyAgICBmbG9hdCB0cmFja1BvczsKKyAgICBDQU1UUkFDSyAqY2FtOworICAgIGxvbmcgY3VycmVudENhbVRpY2s7CisgICAgaW50IGE7CisKKyAgICBpZiAoc05leHRDYW1UcmFja1N0YXJ0VGljayA8PSBzVGljaykKKyAgICB7CisgICAgICAgICsrc0N1cnJlbnRDYW1UcmFjazsKKyAgICAgICAgc0N1cnJlbnRDYW1UcmFja1N0YXJ0VGljayA9IHNOZXh0Q2FtVHJhY2tTdGFydFRpY2s7CisgICAgfQorICAgIHNOZXh0Q2FtVHJhY2tTdGFydFRpY2sgPSBzQ3VycmVudENhbVRyYWNrU3RhcnRUaWNrICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc0NhbVRyYWNrc1tzQ3VycmVudENhbVRyYWNrXS5sZW4gKiBDQU1UUkFDS19MRU47CisKKyAgICBjYW0gPSAmc0NhbVRyYWNrc1tzQ3VycmVudENhbVRyYWNrXTsKKyAgICBjdXJyZW50Q2FtVGljayA9IHNUaWNrIC0gc0N1cnJlbnRDYW1UcmFja1N0YXJ0VGljazsKKyAgICB0cmFja1BvcyA9IChmbG9hdCljdXJyZW50Q2FtVGljayAvIChDQU1UUkFDS19MRU4gKiBjYW0tPmxlbik7CisKKyAgICBmb3IgKGEgPSAwOyBhIDwgNTsgKythKQorICAgICAgICBsZXJwW2FdID0gKGNhbS0+c3JjW2FdICsgY2FtLT5kZXN0W2FdICogdHJhY2tQb3MpICogMC4wMWY7CisKKyAgICBpZiAoY2FtLT5kaXN0KQorICAgIHsKKyAgICAgICAgZmxvYXQgZGlzdCA9IGNhbS0+ZGlzdCAqIDAuMWY7CisgICAgICAgIGNYID0gbGVycFswXTsKKyAgICAgICAgY1kgPSBsZXJwWzFdOworICAgICAgICBjWiA9IGxlcnBbMl07CisgICAgICAgIGVYID0gY1ggLSAoZmxvYXQpY29zKGxlcnBbM10pICogZGlzdDsKKyAgICAgICAgZVkgPSBjWSAtIChmbG9hdClzaW4obGVycFszXSkgKiBkaXN0OworICAgICAgICBlWiA9IGNaIC0gbGVycFs0XTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZVggPSBsZXJwWzBdOworICAgICAgICBlWSA9IGxlcnBbMV07CisgICAgICAgIGVaID0gbGVycFsyXTsKKyAgICAgICAgY1ggPSBlWCArIChmbG9hdCljb3MobGVycFszXSk7CisgICAgICAgIGNZID0gZVkgKyAoZmxvYXQpc2luKGxlcnBbM10pOworICAgICAgICBjWiA9IGVaICsgbGVycFs0XTsKKyAgICB9CisgICAgZ2x1TG9va0F0KGVYLCBlWSwgZVosIGNYLCBjWSwgY1osIDAsIDAsIDEpOworfQorCisKKy8vIENhbGxlZCBmcm9tIHRoZSBhcHAgZnJhbWV3b3JrLgorLyogVGhlIHRpY2sgaXMgY3VycmVudCB0aW1lIGluIG1pbGxpc2Vjb25kcywgd2lkdGggYW5kIGhlaWdodAorICogYXJlIHRoZSBpbWFnZSBkaW1lbnNpb25zIHRvIGJlIHJlbmRlcmVkLgorICovCit2b2lkIGFwcFJlbmRlcihsb25nIHRpY2ssIGludCB3aWR0aCwgaW50IGhlaWdodCkKK3sKKyAgICBpZiAoc1N0YXJ0VGljayA9PSAwKQorICAgICAgICBzU3RhcnRUaWNrID0gdGljazsKKyAgICBpZiAoIWdBcHBBbGl2ZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gQWN0dWFsIHRpY2sgdmFsdWUgaXMgImJsdXJyZWQiIGEgbGl0dGxlIGJpdC4KKyAgICBzVGljayA9IChzVGljayArIHRpY2sgLSBzU3RhcnRUaWNrKSA+PiAxOworCisgICAgLy8gVGVybWluYXRlIGFwcGxpY2F0aW9uIGFmdGVyIHJ1bm5pbmcgdGhyb3VnaCB0aGUgZGVtb25zdHJhdGlvbiBvbmNlLgorICAgIGlmIChzVGljayA+PSBSVU5fTEVOR1RIKQorICAgIHsKKyAgICAgICAgZ0FwcEFsaXZlID0gMDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIFByZXBhcmUgT3BlbkdMIEVTIGZvciByZW5kZXJpbmcgb2YgdGhlIGZyYW1lLgorICAgIHByZXBhcmVGcmFtZSh3aWR0aCwgaGVpZ2h0KTsKKworICAgIC8vIFVwZGF0ZSB0aGUgY2FtZXJhIHBvc2l0aW9uIGFuZCBzZXQgdGhlIGxvb2thdC4KKyAgICBjYW1UcmFjaygpOworCisgICAgLy8gQ29uZmlndXJlIGVudmlyb25tZW50LgorICAgIGNvbmZpZ3VyZUxpZ2h0QW5kTWF0ZXJpYWwoKTsKKworICAgIC8vIERyYXcgdGhlIHJlZmxlY3Rpb24gYnkgZHJhd2luZyBtb2RlbHMgd2l0aCBuZWdhdGVkIFotYXhpcy4KKyAgICBnbFB1c2hNYXRyaXgoKTsKKyAgICBkcmF3TW9kZWxzKC0xKTsKKyAgICBnbFBvcE1hdHJpeCgpOworCisgICAgLy8gQmxlbmQgdGhlIGdyb3VuZCBwbGFuZSB0byB0aGUgd2luZG93LgorICAgIGRyYXdHcm91bmRQbGFuZSgpOworCisgICAgLy8gRHJhdyBhbGwgdGhlIG1vZGVscyBub3JtYWxseS4KKyAgICBkcmF3TW9kZWxzKDEpOworCisgICAgLy8gRHJhdyBmYWRlIHF1YWQgb3ZlciB3aG9sZSB3aW5kb3cgKHdoZW4gY2hhbmdpbmcgY2FtZXJhcykuCisgICAgZHJhd0ZhZGVRdWFkKCk7Cit9CmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9ncHVzdGF0ZS5jIGIvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvZ3B1c3RhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzU0MGM5Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvZ3B1c3RhdGUuYwpAQCAtMCwwICsxLDM5IEBACisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKworc3RhdGljIHZvaWQgKm1hcF9tZW1vcnkoY29uc3QgY2hhciAqZm4sIHVuc2lnbmVkIGJhc2UsIHVuc2lnbmVkIHNpemUpCit7CisgICAgaW50IGZkOworICAgIHZvaWQgKnB0cjsKKyAgICAKKyAgICBmZCA9IG9wZW4oZm4sIE9fUkRXUiB8IE9fU1lOQyk7CisgICAgaWYoZmQgPCAwKSB7CisgICAgICAgIHBlcnJvcigiY2Fubm90IG9wZW4gJXMgZm9yIG1hcHBpbmciKTsKKyAgICAgICAgcmV0dXJuIE1BUF9GQUlMRUQ7CisgICAgfQorCisgICAgcHRyID0gbW1hcCgwLCBzaXplLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLAorICAgICAgICAgICAgICAgTUFQX1NIQVJFRCwgZmQsIGJhc2UpOworICAgIGNsb3NlKGZkKTsKKyAgICAKKyAgICBpZihwdHIgPT0gTUFQX0ZBSUxFRCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwiY2Fubm90IG1hcCAlcyAoQCUwOHgsJTA4eClcbiIsIGZuLCBiYXNlLCBzaXplKTsKKyAgICB9CisgICAgcmV0dXJuIHB0cjsgICAgCit9CisKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KQoreworICAgIHZvaWQgKmdycF9yZWdzID0gbWFwX21lbW9yeSgiL2Rldi9odzNkIiwgMCwgMTAyNCAqIDEwMjQpOworICAgIHByaW50ZigiR1BVIGJhc2UgbWFwcGVkIGF0ICVwXG4iLCBncnBfcmVncyk7CisgICAgaW50IHN0YXRlX29mZnNldCA9IDB4MTAxNDA7CisgICAgcHJpbnRmKCJHUFUgc3RhdGUgPSAlMDhseFxuIiwKKyAgICAgICAgICAgICooKGxvbmcqKSgoY2hhciopZ3JwX3JlZ3MgKyBzdGF0ZV9vZmZzZXQpKSAgKTsKKworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvaW5jbHVkZS9HTEVTL2VnbC5oIGIvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvaW5jbHVkZS9HTEVTL2VnbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkZjg0MTAKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9pbmNsdWRlL0dMRVMvZWdsLmgKQEAgLTAsMCArMSwyMjkgQEAKKyNpZm5kZWYgX19lZ2xfaF8KKyNkZWZpbmUgX19lZ2xfaF8KKworLyoKKyoqIExpY2Vuc2UgQXBwbGljYWJpbGl0eS4gRXhjZXB0IHRvIHRoZSBleHRlbnQgcG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZQorKiogbWFkZSBzdWJqZWN0IHRvIGFuIGFsdGVybmF0aXZlIGxpY2Vuc2UgYXMgcGVybWl0dGVkIGluIHRoZSBTR0kgRnJlZQorKiogU29mdHdhcmUgTGljZW5zZSBCLCBWZXJzaW9uIDEuMCAodGhlICJMaWNlbnNlIiksIHRoZSBjb250ZW50cyBvZiB0aGlzCisqKiBmaWxlIGFyZSBzdWJqZWN0IG9ubHkgdG8gdGhlIHByb3Zpc2lvbnMgb2YgdGhlIExpY2Vuc2UuIFlvdSBtYXkgbm90IHVzZQorKiogdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weQorKiogb2YgdGhlIExpY2Vuc2UgYXQgU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgYXR0bjogTGVnYWwgU2VydmljZXMsIDE2MDAKKyoqIEFtcGhpdGhlYXRyZSBQYXJrd2F5LCBNb3VudGFpbiBWaWV3LCBDQSA5NDA0My0xMzUxLCBvciBhdDoKKyoqCisqKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvRnJlZUIKKyoqCisqKiBOb3RlIHRoYXQsIGFzIHByb3ZpZGVkIGluIHRoZSBMaWNlbnNlLCB0aGUgU29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyoqICJBUyBJUyIgYmFzaXMsIHdpdGggQUxMIEVYUFJFU1MgQU5EIElNUExJRUQgV0FSUkFOVElFUyBBTkQgQ09ORElUSU9OUworKiogRElTQ0xBSU1FRCwgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIEFOWSBJTVBMSUVEIFdBUlJBTlRJRVMgQU5ECisqKiBDT05ESVRJT05TIE9GIE1FUkNIQU5UQUJJTElUWSwgU0FUSVNGQUNUT1JZIFFVQUxJVFksIEZJVE5FU1MgRk9SIEEKKyoqIFBBUlRJQ1VMQVIgUFVSUE9TRSwgQU5EIE5PTi1JTkZSSU5HRU1FTlQuCisqKgorKiogT3JpZ2luYWwgQ29kZS4gVGhlIE9yaWdpbmFsIENvZGUgaXM6IE9wZW5HTCBTYW1wbGUgSW1wbGVtZW50YXRpb24sCisqKiBWZXJzaW9uIDEuMi4xLCByZWxlYXNlZCBKYW51YXJ5IDI2LCAyMDAwLCBkZXZlbG9wZWQgYnkgU2lsaWNvbiBHcmFwaGljcywKKyoqIEluYy4gVGhlIE9yaWdpbmFsIENvZGUgaXMgQ29weXJpZ2h0IChjKSAxOTkxLTIwMDQgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorKiogQ29weXJpZ2h0IGluIGFueSBwb3J0aW9ucyBjcmVhdGVkIGJ5IHRoaXJkIHBhcnRpZXMgaXMgYXMgaW5kaWNhdGVkCisqKiBlbHNld2hlcmUgaGVyZWluLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorKioKKyoqIEFkZGl0aW9uYWwgTm90aWNlIFByb3Zpc2lvbnM6IFRoZSBhcHBsaWNhdGlvbiBwcm9ncmFtbWluZyBpbnRlcmZhY2VzCisqKiBlc3RhYmxpc2hlZCBieSBTR0kgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgT3JpZ2luYWwgQ29kZSBhcmUgVGhlCisqKiBPcGVuR0woUikgR3JhcGhpY3MgU3lzdGVtOiBBIFNwZWNpZmljYXRpb24gKFZlcnNpb24gMS4yLjEpLCByZWxlYXNlZAorKiogQXByaWwgMSwgMTk5OTsgVGhlIE9wZW5HTChSKSBHcmFwaGljcyBTeXN0ZW0gVXRpbGl0eSBMaWJyYXJ5IChWZXJzaW9uCisqKiAxLjMpLCByZWxlYXNlZCBOb3ZlbWJlciA0LCAxOTk4OyBhbmQgT3BlbkdMKFIpIEdyYXBoaWNzIHdpdGggdGhlIFgKKyoqIFdpbmRvdyBTeXN0ZW0oUikgKFZlcnNpb24gMS4zKSwgcmVsZWFzZWQgT2N0b2JlciAxOSwgMTk5OC4gVGhpcyBzb2Z0d2FyZQorKiogd2FzIGNyZWF0ZWQgdXNpbmcgdGhlIE9wZW5HTChSKSB2ZXJzaW9uIDEuMi4xIFNhbXBsZSBJbXBsZW1lbnRhdGlvbgorKiogcHVibGlzaGVkIGJ5IFNHSSwgYnV0IGhhcyBub3QgYmVlbiBpbmRlcGVuZGVudGx5IHZlcmlmaWVkIGFzIGJlaW5nCisqKiBjb21wbGlhbnQgd2l0aCB0aGUgT3BlbkdMKFIpIHZlcnNpb24gMS4yLjEgU3BlY2lmaWNhdGlvbi4KKyovCisKKyNpbmNsdWRlIDxHTEVTL2dsLmg+CisjaW5jbHVkZSA8R0xFUy9lZ2x0eXBlcy5oPgorCisvKgorKiogZWdsdHlwZXMuaCBpcyBwbGF0Zm9ybSBkZXBlbmRlbnQuIEl0IGRlZmluZXM6CisqKgorKiogICAgIC0gRUdMIHR5cGVzIGFuZCByZXNvdXJjZXMKKyoqICAgICAtIE5hdGl2ZSB0eXBlcworKiogICAgIC0gRUdMIGFuZCBuYXRpdmUgaGFuZGxlIHZhbHVlcworKioKKyoqIEVHTCB0eXBlcyBhbmQgcmVzb3VyY2VzIGFyZSB0byBiZSB0eXBlZGVmJ2VkIHdpdGggYXBwcm9wcmlhdGUgcGxhdGZvcm0KKyoqIGRlcGVuZGVudCByZXNvdXJjZSBoYW5kbGUgdHlwZXMuIEVHTGludCBtdXN0IGJlIGFuIGludGVnZXIgb2YgYXQgbGVhc3QKKyoqIDMyLWJpdC4KKyoqCisqKiBOYXRpdmVEaXNwbGF5VHlwZSwgTmF0aXZlV2luZG93VHlwZSBhbmQgTmF0aXZlUGl4bWFwVHlwZSBhcmUgdG8gYmUKKyoqIHJlcGxhY2VkIHdpdGggY29ycmVzcG9uZGluZyB0eXBlcyBvZiB0aGUgbmF0aXZlIHdpbmRvdyBzeXN0ZW0gaW4gZWdsLmguCisqKgorKiogRUdMIGFuZCBuYXRpdmUgaGFuZGxlIHZhbHVlcyBtdXN0IG1hdGNoIHRoZWlyIHR5cGVzLgorKioKKyoqIEV4YW1wbGUgZWdsdHlwZXMuaDoKKyovCisKKyNpZiAwCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxuYXRpdmVfd2luZG93X3N5c3RlbS5oPgorCisvKgorKiogVHlwZXMgYW5kIHJlc291cmNlcworKi8KK3R5cGVkZWYgaW50IEVHTEJvb2xlYW47Cit0eXBlZGVmIGludDMyX3QgRUdMaW50OwordHlwZWRlZiB2b2lkICpFR0xEaXNwbGF5OwordHlwZWRlZiB2b2lkICpFR0xDb25maWc7Cit0eXBlZGVmIHZvaWQgKkVHTFN1cmZhY2U7Cit0eXBlZGVmIHZvaWQgKkVHTENvbnRleHQ7CisKKy8qCisqKiBFR0wgYW5kIG5hdGl2ZSBoYW5kbGUgdmFsdWVzCisqLworI2RlZmluZSBFR0xfREVGQVVMVF9ESVNQTEFZICgoTmF0aXZlRGlzcGxheVR5cGUpMCkKKyNkZWZpbmUgRUdMX05PX0NPTlRFWFQgKChFR0xDb250ZXh0KTApCisjZGVmaW5lIEVHTF9OT19ESVNQTEFZICgoRUdMRGlzcGxheSkwKQorI2RlZmluZSBFR0xfTk9fU1VSRkFDRSAoKEVHTFN1cmZhY2UpMCkKKworI2VuZGlmCisKKy8qCisqKiBWZXJzaW9uaW5nIGFuZCBleHRlbnNpb25zCisqLworI2RlZmluZSBFR0xfVkVSU0lPTl8xXzAJCSAgICAgICAxCisKKy8qCisqKiBCb29sZWFuCisqLworI2RlZmluZSBFR0xfRkFMU0UJCSAgICAgICAwCisjZGVmaW5lIEVHTF9UUlVFCQkgICAgICAgMQorCisvKgorKiogRXJyb3JzCisqLworI2RlZmluZSBFR0xfU1VDQ0VTUwkJICAgICAgIDB4MzAwMAorI2RlZmluZSBFR0xfTk9UX0lOSVRJQUxJWkVECSAgICAgICAweDMwMDEKKyNkZWZpbmUgRUdMX0JBRF9BQ0NFU1MJCSAgICAgICAweDMwMDIKKyNkZWZpbmUgRUdMX0JBRF9BTExPQwkJICAgICAgIDB4MzAwMworI2RlZmluZSBFR0xfQkFEX0FUVFJJQlVURQkgICAgICAgMHgzMDA0CisjZGVmaW5lIEVHTF9CQURfQ09ORklHCQkgICAgICAgMHgzMDA1CisjZGVmaW5lIEVHTF9CQURfQ09OVEVYVAkJICAgICAgIDB4MzAwNgorI2RlZmluZSBFR0xfQkFEX0NVUlJFTlRfU1VSRkFDRSAgICAgICAgMHgzMDA3CisjZGVmaW5lIEVHTF9CQURfRElTUExBWQkJICAgICAgIDB4MzAwOAorI2RlZmluZSBFR0xfQkFEX01BVENICQkgICAgICAgMHgzMDA5CisjZGVmaW5lIEVHTF9CQURfTkFUSVZFX1BJWE1BUAkgICAgICAgMHgzMDBBCisjZGVmaW5lIEVHTF9CQURfTkFUSVZFX1dJTkRPVwkgICAgICAgMHgzMDBCCisjZGVmaW5lIEVHTF9CQURfUEFSQU1FVEVSCSAgICAgICAweDMwMEMKKyNkZWZpbmUgRUdMX0JBRF9TVVJGQUNFCQkgICAgICAgMHgzMDBECisvKiAweDMwMEUgLSAweDMwMUYgcmVzZXJ2ZWQgZm9yIGFkZGl0aW9uYWwgZXJyb3JzLiAqLworCisvKgorKiogQ29uZmlnIGF0dHJpYnV0ZXMKKyovCisjZGVmaW5lIEVHTF9CVUZGRVJfU0laRQkJICAgICAgIDB4MzAyMAorI2RlZmluZSBFR0xfQUxQSEFfU0laRQkJICAgICAgIDB4MzAyMQorI2RlZmluZSBFR0xfQkxVRV9TSVpFCQkgICAgICAgMHgzMDIyCisjZGVmaW5lIEVHTF9HUkVFTl9TSVpFCQkgICAgICAgMHgzMDIzCisjZGVmaW5lIEVHTF9SRURfU0laRQkJICAgICAgIDB4MzAyNAorI2RlZmluZSBFR0xfREVQVEhfU0laRQkJICAgICAgIDB4MzAyNQorI2RlZmluZSBFR0xfU1RFTkNJTF9TSVpFCSAgICAgICAweDMwMjYKKyNkZWZpbmUgRUdMX0NPTkZJR19DQVZFQVQJICAgICAgIDB4MzAyNworI2RlZmluZSBFR0xfQ09ORklHX0lECQkgICAgICAgMHgzMDI4CisjZGVmaW5lIEVHTF9MRVZFTAkJICAgICAgIDB4MzAyOQorI2RlZmluZSBFR0xfTUFYX1BCVUZGRVJfSEVJR0hUCSAgICAgICAweDMwMkEKKyNkZWZpbmUgRUdMX01BWF9QQlVGRkVSX1BJWEVMUwkgICAgICAgMHgzMDJCCisjZGVmaW5lIEVHTF9NQVhfUEJVRkZFUl9XSURUSAkgICAgICAgMHgzMDJDCisjZGVmaW5lIEVHTF9OQVRJVkVfUkVOREVSQUJMRQkgICAgICAgMHgzMDJECisjZGVmaW5lIEVHTF9OQVRJVkVfVklTVUFMX0lECSAgICAgICAweDMwMkUKKyNkZWZpbmUgRUdMX05BVElWRV9WSVNVQUxfVFlQRQkgICAgICAgMHgzMDJGCisvKiNkZWZpbmUgRUdMX1BSRVNFUlZFRF9SRVNPVVJDRVMJIDB4MzAzMCovCisjZGVmaW5lIEVHTF9TQU1QTEVTCQkgICAgICAgMHgzMDMxCisjZGVmaW5lIEVHTF9TQU1QTEVfQlVGRkVSUwkgICAgICAgMHgzMDMyCisjZGVmaW5lIEVHTF9TVVJGQUNFX1RZUEUJICAgICAgIDB4MzAzMworI2RlZmluZSBFR0xfVFJBTlNQQVJFTlRfVFlQRQkgICAgICAgMHgzMDM0CisjZGVmaW5lIEVHTF9UUkFOU1BBUkVOVF9CTFVFX1ZBTFVFICAgICAweDMwMzUKKyNkZWZpbmUgRUdMX1RSQU5TUEFSRU5UX0dSRUVOX1ZBTFVFICAgIDB4MzAzNgorI2RlZmluZSBFR0xfVFJBTlNQQVJFTlRfUkVEX1ZBTFVFICAgICAgMHgzMDM3CisKKy8qCisqKiBDb25maWcgYXR0cmlidXRlIGFuZCB2YWx1ZQorKi8KKyNkZWZpbmUgRUdMX05PTkUJCSAgICAgICAweDMwMzgKKy8qIDB4MzAzOSAtIDB4MzA0RiByZXNlcnZlZCBmb3IgYWRkaXRpb25hbCBjb25maWcgYXR0cmlidXRlcy4gKi8KKworLyoKKyoqIENvbmZpZyB2YWx1ZXMKKyovCisjZGVmaW5lIEVHTF9ET05UX0NBUkUJCSAgICAgICAoKEVHTGludCkgLTEpCisjZGVmaW5lIEVHTF9QQlVGRkVSX0JJVAkJICAgICAgIDB4MDEKKyNkZWZpbmUgRUdMX1BJWE1BUF9CSVQJCSAgICAgICAweDAyCisjZGVmaW5lIEVHTF9XSU5ET1dfQklUCQkgICAgICAgMHgwNAorI2RlZmluZSBFR0xfU0xPV19DT05GSUcJCSAgICAgICAweDMwNTAKKyNkZWZpbmUgRUdMX05PTl9DT05GT1JNQU5UX0NPTkZJRyAgICAgIDB4MzA1MQorI2RlZmluZSBFR0xfVFJBTlNQQVJFTlRfUkdCCSAgICAgICAweDMwNTIKKworLyoKKyoqIFN0cmluZyBuYW1lcworKi8KKyNkZWZpbmUgRUdMX1ZFTkRPUgkJICAgICAgIDB4MzA1MworI2RlZmluZSBFR0xfVkVSU0lPTgkJICAgICAgIDB4MzA1NAorI2RlZmluZSBFR0xfRVhURU5TSU9OUwkJICAgICAgIDB4MzA1NQorCisvKgorKiogU3VyZmFjZSBhdHRyaWJ1dGVzCisqLworI2RlZmluZSBFR0xfSEVJR0hUCQkgICAgICAgMHgzMDU2CisjZGVmaW5lIEVHTF9XSURUSAkJICAgICAgIDB4MzA1NworI2RlZmluZSBFR0xfTEFSR0VTVF9QQlVGRkVSCSAgICAgICAweDMwNTgKKworLyoKKyoqIEN1cnJlbnQgc3VyZmFjZXMKKyovCisjZGVmaW5lIEVHTF9EUkFXCQkgICAgICAgMHgzMDU5CisjZGVmaW5lIEVHTF9SRUFECQkgICAgICAgMHgzMDVBCisKKy8qCisqKiBFbmdpbmVzCisqLworI2RlZmluZSBFR0xfQ09SRV9OQVRJVkVfRU5HSU5FCSAgICAgICAweDMwNUIKKworLyogMHgzMDVDLTB4M0ZGRkYgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgKi8KKworLyoKKyoqIEZ1bmN0aW9ucworKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworR0xBUEkgRUdMaW50IEFQSUVOVFJZIGVnbEdldEVycm9yICh2b2lkKTsKKworR0xBUEkgRUdMRGlzcGxheSBBUElFTlRSWSBlZ2xHZXREaXNwbGF5IChOYXRpdmVEaXNwbGF5VHlwZSBkaXNwbGF5KTsKK0dMQVBJIEVHTEJvb2xlYW4gQVBJRU5UUlkgZWdsSW5pdGlhbGl6ZSAoRUdMRGlzcGxheSBkcHksIEVHTGludCAqbWFqb3IsIEVHTGludCAqbWlub3IpOworR0xBUEkgRUdMQm9vbGVhbiBBUElFTlRSWSBlZ2xUZXJtaW5hdGUgKEVHTERpc3BsYXkgZHB5KTsKK0dMQVBJIGNvbnN0IGNoYXIgKiBBUElFTlRSWSBlZ2xRdWVyeVN0cmluZyAoRUdMRGlzcGxheSBkcHksIEVHTGludCBuYW1lKTsKK0dMQVBJIHZvaWQgKCogQVBJRU5UUlkgZWdsR2V0UHJvY0FkZHJlc3MgKGNvbnN0IGNoYXIgKnByb2NuYW1lKSkoKTsKKworR0xBUEkgRUdMQm9vbGVhbiBBUElFTlRSWSBlZ2xHZXRDb25maWdzIChFR0xEaXNwbGF5IGRweSwgRUdMQ29uZmlnICpjb25maWdzLCBFR0xpbnQgY29uZmlnX3NpemUsIEVHTGludCAqbnVtX2NvbmZpZyk7CitHTEFQSSBFR0xCb29sZWFuIEFQSUVOVFJZIGVnbENob29zZUNvbmZpZyAoRUdMRGlzcGxheSBkcHksIGNvbnN0IEVHTGludCAqYXR0cmliX2xpc3QsIEVHTENvbmZpZyAqY29uZmlncywgRUdMaW50IGNvbmZpZ19zaXplLCBFR0xpbnQgKm51bV9jb25maWcpOworR0xBUEkgRUdMQm9vbGVhbiBBUElFTlRSWSBlZ2xHZXRDb25maWdBdHRyaWIgKEVHTERpc3BsYXkgZHB5LCBFR0xDb25maWcgY29uZmlnLCBFR0xpbnQgYXR0cmlidXRlLCBFR0xpbnQgKnZhbHVlKTsKKworR0xBUEkgRUdMU3VyZmFjZSBBUElFTlRSWSBlZ2xDcmVhdGVXaW5kb3dTdXJmYWNlIChFR0xEaXNwbGF5IGRweSwgRUdMQ29uZmlnIGNvbmZpZywgTmF0aXZlV2luZG93VHlwZSB3aW5kb3csIGNvbnN0IEVHTGludCAqYXR0cmliX2xpc3QpOworR0xBUEkgRUdMU3VyZmFjZSBBUElFTlRSWSBlZ2xDcmVhdGVQaXhtYXBTdXJmYWNlIChFR0xEaXNwbGF5IGRweSwgRUdMQ29uZmlnIGNvbmZpZywgTmF0aXZlUGl4bWFwVHlwZSBwaXhtYXAsIGNvbnN0IEVHTGludCAqYXR0cmliX2xpc3QpOworR0xBUEkgRUdMU3VyZmFjZSBBUElFTlRSWSBlZ2xDcmVhdGVQYnVmZmVyU3VyZmFjZSAoRUdMRGlzcGxheSBkcHksIEVHTENvbmZpZyBjb25maWcsIGNvbnN0IEVHTGludCAqYXR0cmliX2xpc3QpOworR0xBUEkgRUdMQm9vbGVhbiBBUElFTlRSWSBlZ2xEZXN0cm95U3VyZmFjZSAoRUdMRGlzcGxheSBkcHksIEVHTFN1cmZhY2Ugc3VyZmFjZSk7CitHTEFQSSBFR0xCb29sZWFuIEFQSUVOVFJZIGVnbFF1ZXJ5U3VyZmFjZSAoRUdMRGlzcGxheSBkcHksIEVHTFN1cmZhY2Ugc3VyZmFjZSwgRUdMaW50IGF0dHJpYnV0ZSwgRUdMaW50ICp2YWx1ZSk7CisKK0dMQVBJIEVHTENvbnRleHQgQVBJRU5UUlkgZWdsQ3JlYXRlQ29udGV4dCAoRUdMRGlzcGxheSBkcHksIEVHTENvbmZpZyBjb25maWcsIEVHTENvbnRleHQgc2hhcmVfbGlzdCwgY29uc3QgRUdMaW50ICphdHRyaWJfbGlzdCk7CitHTEFQSSBFR0xCb29sZWFuIEFQSUVOVFJZIGVnbERlc3Ryb3lDb250ZXh0IChFR0xEaXNwbGF5IGRweSwgRUdMQ29udGV4dCBjdHgpOworR0xBUEkgRUdMQm9vbGVhbiBBUElFTlRSWSBlZ2xNYWtlQ3VycmVudCAoRUdMRGlzcGxheSBkcHksIEVHTFN1cmZhY2UgZHJhdywgRUdMU3VyZmFjZSByZWFkLCBFR0xDb250ZXh0IGN0eCk7CitHTEFQSSBFR0xDb250ZXh0IEFQSUVOVFJZIGVnbEdldEN1cnJlbnRDb250ZXh0ICh2b2lkKTsKK0dMQVBJIEVHTFN1cmZhY2UgQVBJRU5UUlkgZWdsR2V0Q3VycmVudFN1cmZhY2UgKEVHTGludCByZWFkZHJhdyk7CitHTEFQSSBFR0xEaXNwbGF5IEFQSUVOVFJZIGVnbEdldEN1cnJlbnREaXNwbGF5ICh2b2lkKTsKK0dMQVBJIEVHTEJvb2xlYW4gQVBJRU5UUlkgZWdsUXVlcnlDb250ZXh0IChFR0xEaXNwbGF5IGRweSwgRUdMQ29udGV4dCBjdHgsIEVHTGludCBhdHRyaWJ1dGUsIEVHTGludCAqdmFsdWUpOworCitHTEFQSSBFR0xCb29sZWFuIEFQSUVOVFJZIGVnbFdhaXRHTCAodm9pZCk7CitHTEFQSSBFR0xCb29sZWFuIEFQSUVOVFJZIGVnbFdhaXROYXRpdmUgKEVHTGludCBlbmdpbmUpOworR0xBUEkgRUdMQm9vbGVhbiBBUElFTlRSWSBlZ2xTd2FwQnVmZmVycyAoRUdMRGlzcGxheSBkcHksIEVHTFN1cmZhY2UgZHJhdyk7CitHTEFQSSBFR0xCb29sZWFuIEFQSUVOVFJZIGVnbENvcHlCdWZmZXJzIChFR0xEaXNwbGF5IGRweSwgRUdMU3VyZmFjZSBzdXJmYWNlLCBOYXRpdmVQaXhtYXBUeXBlIHRhcmdldCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX19lZ2xfaF8gKi8KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9hbmdlbGVzL2luY2x1ZGUvR0xFUy9lZ2x0eXBlcy5oIGIvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvaW5jbHVkZS9HTEVTL2VnbHR5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRiMzZjOQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy9hbmdlbGVzL2luY2x1ZGUvR0xFUy9lZ2x0eXBlcy5oCkBAIC0wLDAgKzEsMjAgQEAKKy8qCisqKiBUeXBlcyBhbmQgcmVzb3VyY2VzCisqLwordHlwZWRlZiBpbnQgRUdMQm9vbGVhbjsKK3R5cGVkZWYgbG9uZyBFR0xpbnQ7Cit0eXBlZGVmIHZvaWQgKkVHTERpc3BsYXk7Cit0eXBlZGVmIHZvaWQgKkVHTENvbmZpZzsKK3R5cGVkZWYgdm9pZCAqRUdMU3VyZmFjZTsKK3R5cGVkZWYgdm9pZCAqRUdMQ29udGV4dDsKK3R5cGVkZWYgdm9pZCAqTmF0aXZlRGlzcGxheVR5cGU7Cit0eXBlZGVmIHZvaWQgKk5hdGl2ZVdpbmRvd1R5cGU7Cit0eXBlZGVmIHZvaWQgKk5hdGl2ZVBpeG1hcFR5cGU7CisKKy8qCisqKiBFR0wgYW5kIG5hdGl2ZSBoYW5kbGUgdmFsdWVzCisqLworI2RlZmluZSBFR0xfREVGQVVMVF9ESVNQTEFZICgoTmF0aXZlRGlzcGxheVR5cGUpMCkKKyNkZWZpbmUgRUdMX05PX0NPTlRFWFQgKChFR0xDb250ZXh0KTApCisjZGVmaW5lIEVHTF9OT19ESVNQTEFZICgoRUdMRGlzcGxheSkwKQorI2RlZmluZSBFR0xfTk9fU1VSRkFDRSAoKEVHTFN1cmZhY2UpMCkKZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy9hbmdlbGVzL2luY2x1ZGUvR0xFUy9nbC5oIGIvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvaW5jbHVkZS9HTEVTL2dsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE1NDgyMgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy9hbmdlbGVzL2luY2x1ZGUvR0xFUy9nbC5oCkBAIC0wLDAgKzEsNTg0IEBACisjaWZuZGVmIF9fZ2xfaF8KKyNkZWZpbmUgX19nbF9oXworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qCisqKiBMaWNlbnNlIEFwcGxpY2FiaWxpdHkuIEV4Y2VwdCB0byB0aGUgZXh0ZW50IHBvcnRpb25zIG9mIHRoaXMgZmlsZSBhcmUKKyoqIG1hZGUgc3ViamVjdCB0byBhbiBhbHRlcm5hdGl2ZSBsaWNlbnNlIGFzIHBlcm1pdHRlZCBpbiB0aGUgU0dJIEZyZWUKKyoqIFNvZnR3YXJlIExpY2Vuc2UgQiwgVmVyc2lvbiAxLjAgKHRoZSAiTGljZW5zZSIpLCB0aGUgY29udGVudHMgb2YgdGhpcworKiogZmlsZSBhcmUgc3ViamVjdCBvbmx5IHRvIHRoZSBwcm92aXNpb25zIG9mIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG5vdCB1c2UKKyoqIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkKKyoqIG9mIHRoZSBMaWNlbnNlIGF0IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIGF0dG46IExlZ2FsIFNlcnZpY2VzLCAxNjAwCisqKiBBbXBoaXRoZWF0cmUgUGFya3dheSwgTW91bnRhaW4gVmlldywgQ0EgOTQwNDMtMTM1MSwgb3IgYXQ6CisqKiAKKyoqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9GcmVlQgorKiogCisqKiBOb3RlIHRoYXQsIGFzIHByb3ZpZGVkIGluIHRoZSBMaWNlbnNlLCB0aGUgU29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyoqICJBUyBJUyIgYmFzaXMsIHdpdGggQUxMIEVYUFJFU1MgQU5EIElNUExJRUQgV0FSUkFOVElFUyBBTkQgQ09ORElUSU9OUworKiogRElTQ0xBSU1FRCwgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIEFOWSBJTVBMSUVEIFdBUlJBTlRJRVMgQU5ECisqKiBDT05ESVRJT05TIE9GIE1FUkNIQU5UQUJJTElUWSwgU0FUSVNGQUNUT1JZIFFVQUxJVFksIEZJVE5FU1MgRk9SIEEKKyoqIFBBUlRJQ1VMQVIgUFVSUE9TRSwgQU5EIE5PTi1JTkZSSU5HRU1FTlQuCisqKiAKKyoqIE9yaWdpbmFsIENvZGUuIFRoZSBPcmlnaW5hbCBDb2RlIGlzOiBPcGVuR0wgU2FtcGxlIEltcGxlbWVudGF0aW9uLAorKiogVmVyc2lvbiAxLjIuMSwgcmVsZWFzZWQgSmFudWFyeSAyNiwgMjAwMCwgZGV2ZWxvcGVkIGJ5IFNpbGljb24gR3JhcGhpY3MsCisqKiBJbmMuIFRoZSBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoYykgMTk5MS0yMDAwIFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyoqIENvcHlyaWdodCBpbiBhbnkgcG9ydGlvbnMgY3JlYXRlZCBieSB0aGlyZCBwYXJ0aWVzIGlzIGFzIGluZGljYXRlZAorKiogZWxzZXdoZXJlIGhlcmVpbi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyoqIAorKiogQWRkaXRpb25hbCBOb3RpY2UgUHJvdmlzaW9uczogVGhlIGFwcGxpY2F0aW9uIHByb2dyYW1taW5nIGludGVyZmFjZXMKKyoqIGVzdGFibGlzaGVkIGJ5IFNHSSBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBPcmlnaW5hbCBDb2RlIGFyZSBUaGUKKyoqIE9wZW5HTChSKSBHcmFwaGljcyBTeXN0ZW06IEEgU3BlY2lmaWNhdGlvbiAoVmVyc2lvbiAxLjIuMSksIHJlbGVhc2VkCisqKiBBcHJpbCAxLCAxOTk5OyBUaGUgT3BlbkdMKFIpIEdyYXBoaWNzIFN5c3RlbSBVdGlsaXR5IExpYnJhcnkgKFZlcnNpb24KKyoqIDEuMyksIHJlbGVhc2VkIE5vdmVtYmVyIDQsIDE5OTg7IGFuZCBPcGVuR0woUikgR3JhcGhpY3Mgd2l0aCB0aGUgWAorKiogV2luZG93IFN5c3RlbShSKSAoVmVyc2lvbiAxLjMpLCByZWxlYXNlZCBPY3RvYmVyIDE5LCAxOTk4LiBUaGlzIHNvZnR3YXJlCisqKiB3YXMgY3JlYXRlZCB1c2luZyB0aGUgT3BlbkdMKFIpIHZlcnNpb24gMS4yLjEgU2FtcGxlIEltcGxlbWVudGF0aW9uCisqKiBwdWJsaXNoZWQgYnkgU0dJLCBidXQgaGFzIG5vdCBiZWVuIGluZGVwZW5kZW50bHkgdmVyaWZpZWQgYXMgYmVpbmcKKyoqIGNvbXBsaWFudCB3aXRoIHRoZSBPcGVuR0woUikgdmVyc2lvbiAxLjIuMSBTcGVjaWZpY2F0aW9uLgorKi8KKworI2lmIGRlZmluZWQoX1dJTjMyKSAmJiAhZGVmaW5lZChBUElFTlRSWSkgJiYgIWRlZmluZWQoX19DWUdXSU5fXykKKyNkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTiAxCisjaW5jbHVkZSA8d2luZG93cy5oPgorI2VuZGlmCisKKyNpZm5kZWYgQVBJRU5UUlkKKyNkZWZpbmUgQVBJRU5UUlkKKyNlbmRpZgorI2lmbmRlZiBHTEFQSQorI2RlZmluZSBHTEFQSSBleHRlcm4KKyNlbmRpZgorCit0eXBlZGVmIHVuc2lnbmVkIGludCBHTGVudW07Cit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgR0xib29sZWFuOwordHlwZWRlZiB1bnNpZ25lZCBpbnQgR0xiaXRmaWVsZDsKK3R5cGVkZWYgc2lnbmVkIGNoYXIgR0xieXRlOwordHlwZWRlZiBzaG9ydCBHTHNob3J0OwordHlwZWRlZiBpbnQgR0xpbnQ7Cit0eXBlZGVmIGludCBHTHNpemVpOwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIEdMdWJ5dGU7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IEdMdXNob3J0OwordHlwZWRlZiB1bnNpZ25lZCBpbnQgR0x1aW50OwordHlwZWRlZiBmbG9hdCBHTGZsb2F0OwordHlwZWRlZiBmbG9hdCBHTGNsYW1wZjsKK3R5cGVkZWYgdm9pZCBHTHZvaWQ7Cit0eXBlZGVmIGludCBHTGludHB0ckFSQjsKK3R5cGVkZWYgaW50IEdMc2l6ZWlwdHJBUkI7Cit0eXBlZGVmIGludCBHTGZpeGVkOwordHlwZWRlZiBpbnQgR0xjbGFtcHg7CisvKiBJbnRlcm5hbCBjb252ZW5pZW5jZSB0eXBlZGVmcyAqLwordHlwZWRlZiB2b2lkICgqX0dMZnVuY3B0cikoKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEV4dGVuc2lvbnMgKi8KKyNkZWZpbmUgR0xfT0VTX1ZFUlNJT05fMV8wICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgR0xfT0VTX3JlYWRfZm9ybWF0ICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgR0xfT0VTX2NvbXByZXNzZWRfcGFsZXR0ZWRfdGV4dHVyZSAxCisKKy8qIENsZWFyQnVmZmVyTWFzayAqLworI2RlZmluZSBHTF9ERVBUSF9CVUZGRVJfQklUICAgICAgICAgICAgICAgMHgwMDAwMDEwMAorI2RlZmluZSBHTF9TVEVOQ0lMX0JVRkZFUl9CSVQgICAgICAgICAgICAgMHgwMDAwMDQwMAorI2RlZmluZSBHTF9DT0xPUl9CVUZGRVJfQklUICAgICAgICAgICAgICAgMHgwMDAwNDAwMAorCisvKiBCb29sZWFuICovCisjZGVmaW5lIEdMX0ZBTFNFICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEdMX1RSVUUgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisKKy8qIEJlZ2luTW9kZSAqLworI2RlZmluZSBHTF9QT0lOVFMgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwCisjZGVmaW5lIEdMX0xJTkVTICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEKKyNkZWZpbmUgR0xfTElORV9MT09QICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBHTF9MSU5FX1NUUklQICAgICAgICAgICAgICAgICAgICAgMHgwMDAzCisjZGVmaW5lIEdMX1RSSUFOR0xFUyAgICAgICAgICAgICAgICAgICAgICAweDAwMDQKKyNkZWZpbmUgR0xfVFJJQU5HTEVfU1RSSVAgICAgICAgICAgICAgICAgIDB4MDAwNQorI2RlZmluZSBHTF9UUklBTkdMRV9GQU4gICAgICAgICAgICAgICAgICAgMHgwMDA2CisKKy8qIEFscGhhRnVuY3Rpb24gKi8KKyNkZWZpbmUgR0xfTkVWRVIgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMAorI2RlZmluZSBHTF9MRVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAxCisjZGVmaW5lIEdMX0VRVUFMICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDIKKyNkZWZpbmUgR0xfTEVRVUFMICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMworI2RlZmluZSBHTF9HUkVBVEVSICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjA0CisjZGVmaW5lIEdMX05PVEVRVUFMICAgICAgICAgICAgICAgICAgICAgICAweDAyMDUKKyNkZWZpbmUgR0xfR0VRVUFMICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwNgorI2RlZmluZSBHTF9BTFdBWVMgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjA3CisKKy8qIEJsZW5kaW5nRmFjdG9yRGVzdCAqLworI2RlZmluZSBHTF9aRVJPICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBHTF9PTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBHTF9TUkNfQ09MT1IgICAgICAgICAgICAgICAgICAgICAgMHgwMzAwCisjZGVmaW5lIEdMX09ORV9NSU5VU19TUkNfQ09MT1IgICAgICAgICAgICAweDAzMDEKKyNkZWZpbmUgR0xfU1JDX0FMUEhBICAgICAgICAgICAgICAgICAgICAgIDB4MDMwMgorI2RlZmluZSBHTF9PTkVfTUlOVVNfU1JDX0FMUEhBICAgICAgICAgICAgMHgwMzAzCisjZGVmaW5lIEdMX0RTVF9BTFBIQSAgICAgICAgICAgICAgICAgICAgICAweDAzMDQKKyNkZWZpbmUgR0xfT05FX01JTlVTX0RTVF9BTFBIQSAgICAgICAgICAgIDB4MDMwNQorCisvKiBCbGVuZGluZ0ZhY3RvclNyYyAqLworLyogICAgICBHTF9aRVJPICovCisvKiAgICAgIEdMX09ORSAqLworI2RlZmluZSBHTF9EU1RfQ09MT1IgICAgICAgICAgICAgICAgICAgICAgMHgwMzA2CisjZGVmaW5lIEdMX09ORV9NSU5VU19EU1RfQ09MT1IgICAgICAgICAgICAweDAzMDcKKyNkZWZpbmUgR0xfU1JDX0FMUEhBX1NBVFVSQVRFICAgICAgICAgICAgIDB4MDMwOAorLyogICAgICBHTF9TUkNfQUxQSEEgKi8KKy8qICAgICAgR0xfT05FX01JTlVTX1NSQ19BTFBIQSAqLworLyogICAgICBHTF9EU1RfQUxQSEEgKi8KKy8qICAgICAgR0xfT05FX01JTlVTX0RTVF9BTFBIQSAqLworCisvKiBDb2xvck1hdGVyaWFsRmFjZSAqLworLyogICAgICBHTF9GUk9OVF9BTkRfQkFDSyAqLworCisvKiBDb2xvck1hdGVyaWFsUGFyYW1ldGVyICovCisvKiAgICAgIEdMX0FNQklFTlRfQU5EX0RJRkZVU0UgKi8KKworLyogQ29sb3JQb2ludGVyVHlwZSAqLworLyogICAgICBHTF9VTlNJR05FRF9CWVRFICovCisvKiAgICAgIEdMX0ZMT0FUICovCisvKiAgICAgIEdMX0ZJWEVEICovCisKKy8qIEN1bGxGYWNlTW9kZSAqLworI2RlZmluZSBHTF9GUk9OVCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNDA0CisjZGVmaW5lIEdMX0JBQ0sgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA0MDUKKyNkZWZpbmUgR0xfRlJPTlRfQU5EX0JBQ0sgICAgICAgICAgICAgICAgIDB4MDQwOAorCisvKiBEZXB0aEZ1bmN0aW9uICovCisvKiAgICAgIEdMX05FVkVSICovCisvKiAgICAgIEdMX0xFU1MgKi8KKy8qICAgICAgR0xfRVFVQUwgKi8KKy8qICAgICAgR0xfTEVRVUFMICovCisvKiAgICAgIEdMX0dSRUFURVIgKi8KKy8qICAgICAgR0xfTk9URVFVQUwgKi8KKy8qICAgICAgR0xfR0VRVUFMICovCisvKiAgICAgIEdMX0FMV0FZUyAqLworCisvKiBFbmFibGVDYXAgKi8KKyNkZWZpbmUgR0xfRk9HICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEI2MAorI2RlZmluZSBHTF9MSUdIVElORyAgICAgICAgICAgICAgICAgICAgICAgMHgwQjUwCisjZGVmaW5lIEdMX1RFWFRVUkVfMkQgICAgICAgICAgICAgICAgICAgICAweDBERTEKKyNkZWZpbmUgR0xfQ1VMTF9GQUNFICAgICAgICAgICAgICAgICAgICAgIDB4MEI0NAorI2RlZmluZSBHTF9BTFBIQV9URVNUICAgICAgICAgICAgICAgICAgICAgMHgwQkMwCisjZGVmaW5lIEdMX0JMRU5EICAgICAgICAgICAgICAgICAgICAgICAgICAweDBCRTIKKyNkZWZpbmUgR0xfQ09MT1JfTE9HSUNfT1AgICAgICAgICAgICAgICAgIDB4MEJGMgorI2RlZmluZSBHTF9ESVRIRVIgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQkQwCisjZGVmaW5lIEdMX1NURU5DSUxfVEVTVCAgICAgICAgICAgICAgICAgICAweDBCOTAKKyNkZWZpbmUgR0xfREVQVEhfVEVTVCAgICAgICAgICAgICAgICAgICAgIDB4MEI3MQorLyogICAgICBHTF9MSUdIVDAgKi8KKy8qICAgICAgR0xfTElHSFQxICovCisvKiAgICAgIEdMX0xJR0hUMiAqLworLyogICAgICBHTF9MSUdIVDMgKi8KKy8qICAgICAgR0xfTElHSFQ0ICovCisvKiAgICAgIEdMX0xJR0hUNSAqLworLyogICAgICBHTF9MSUdIVDYgKi8KKy8qICAgICAgR0xfTElHSFQ3ICovCisjZGVmaW5lIEdMX1BPSU5UX1NNT09USCAgICAgICAgICAgICAgICAgICAweDBCMTAKKyNkZWZpbmUgR0xfTElORV9TTU9PVEggICAgICAgICAgICAgICAgICAgIDB4MEIyMAorI2RlZmluZSBHTF9TQ0lTU09SX1RFU1QgICAgICAgICAgICAgICAgICAgMHgwQzExCisjZGVmaW5lIEdMX0NPTE9SX01BVEVSSUFMICAgICAgICAgICAgICAgICAweDBCNTcKKyNkZWZpbmUgR0xfTk9STUFMSVpFICAgICAgICAgICAgICAgICAgICAgIDB4MEJBMQorI2RlZmluZSBHTF9SRVNDQUxFX05PUk1BTCAgICAgICAgICAgICAgICAgMHg4MDNBCisjZGVmaW5lIEdMX1BPTFlHT05fT0ZGU0VUX0ZJTEwgICAgICAgICAgICAweDgwMzcKKyNkZWZpbmUgR0xfVkVSVEVYX0FSUkFZICAgICAgICAgICAgICAgICAgIDB4ODA3NAorI2RlZmluZSBHTF9OT1JNQUxfQVJSQVkgICAgICAgICAgICAgICAgICAgMHg4MDc1CisjZGVmaW5lIEdMX0NPTE9SX0FSUkFZICAgICAgICAgICAgICAgICAgICAweDgwNzYKKyNkZWZpbmUgR0xfVEVYVFVSRV9DT09SRF9BUlJBWSAgICAgICAgICAgIDB4ODA3OAorI2RlZmluZSBHTF9NVUxUSVNBTVBMRSAgICAgICAgICAgICAgICAgICAgMHg4MDlECisjZGVmaW5lIEdMX1NBTVBMRV9BTFBIQV9UT19DT1ZFUkFHRSAgICAgICAweDgwOUUKKyNkZWZpbmUgR0xfU0FNUExFX0FMUEhBX1RPX09ORSAgICAgICAgICAgIDB4ODA5RgorI2RlZmluZSBHTF9TQU1QTEVfQ09WRVJBR0UgICAgICAgICAgICAgICAgMHg4MEEwCisKKy8qIEVycm9yQ29kZSAqLworI2RlZmluZSBHTF9OT19FUlJPUiAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBHTF9JTlZBTElEX0VOVU0gICAgICAgICAgICAgICAgICAgMHgwNTAwCisjZGVmaW5lIEdMX0lOVkFMSURfVkFMVUUgICAgICAgICAgICAgICAgICAweDA1MDEKKyNkZWZpbmUgR0xfSU5WQUxJRF9PUEVSQVRJT04gICAgICAgICAgICAgIDB4MDUwMgorI2RlZmluZSBHTF9TVEFDS19PVkVSRkxPVyAgICAgICAgICAgICAgICAgMHgwNTAzCisjZGVmaW5lIEdMX1NUQUNLX1VOREVSRkxPVyAgICAgICAgICAgICAgICAweDA1MDQKKyNkZWZpbmUgR0xfT1VUX09GX01FTU9SWSAgICAgICAgICAgICAgICAgIDB4MDUwNQorCisvKiBGb2dNb2RlICovCisvKiAgICAgIEdMX0xJTkVBUiAqLworI2RlZmluZSBHTF9FWFAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwODAwCisjZGVmaW5lIEdMX0VYUDIgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA4MDEKKworLyogRm9nUGFyYW1ldGVyICovCisjZGVmaW5lIEdMX0ZPR19ERU5TSVRZICAgICAgICAgICAgICAgICAgICAweDBCNjIKKyNkZWZpbmUgR0xfRk9HX1NUQVJUICAgICAgICAgICAgICAgICAgICAgIDB4MEI2MworI2RlZmluZSBHTF9GT0dfRU5EICAgICAgICAgICAgICAgICAgICAgICAgMHgwQjY0CisjZGVmaW5lIEdMX0ZPR19NT0RFICAgICAgICAgICAgICAgICAgICAgICAweDBCNjUKKyNkZWZpbmUgR0xfRk9HX0NPTE9SICAgICAgICAgICAgICAgICAgICAgIDB4MEI2NgorCisvKiBGcm9udEZhY2VEaXJlY3Rpb24gKi8KKyNkZWZpbmUgR0xfQ1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDkwMAorI2RlZmluZSBHTF9DQ1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOTAxCisKKy8qIEdldFBOYW1lICovCisjZGVmaW5lIEdMX1NNT09USF9QT0lOVF9TSVpFX1JBTkdFICAgICAgICAweDBCMTIKKyNkZWZpbmUgR0xfU01PT1RIX0xJTkVfV0lEVEhfUkFOR0UgICAgICAgIDB4MEIyMgorI2RlZmluZSBHTF9BTElBU0VEX1BPSU5UX1NJWkVfUkFOR0UgICAgICAgMHg4NDZECisjZGVmaW5lIEdMX0FMSUFTRURfTElORV9XSURUSF9SQU5HRSAgICAgICAweDg0NkUKKyNkZWZpbmUgR0xfSU1QTEVNRU5UQVRJT05fQ09MT1JfUkVBRF9UWVBFX09FUyAweDhCOUEKKyNkZWZpbmUgR0xfSU1QTEVNRU5UQVRJT05fQ09MT1JfUkVBRF9GT1JNQVRfT0VTIDB4OEI5QgorI2RlZmluZSBHTF9NQVhfTElHSFRTICAgICAgICAgICAgICAgICAgICAgMHgwRDMxCisjZGVmaW5lIEdMX01BWF9URVhUVVJFX1NJWkUgICAgICAgICAgICAgICAweDBEMzMKKyNkZWZpbmUgR0xfTUFYX01PREVMVklFV19TVEFDS19ERVBUSCAgICAgIDB4MEQzNgorI2RlZmluZSBHTF9NQVhfUFJPSkVDVElPTl9TVEFDS19ERVBUSCAgICAgMHgwRDM4CisjZGVmaW5lIEdMX01BWF9URVhUVVJFX1NUQUNLX0RFUFRIICAgICAgICAweDBEMzkKKyNkZWZpbmUgR0xfTUFYX1ZJRVdQT1JUX0RJTVMgICAgICAgICAgICAgIDB4MEQzQQorI2RlZmluZSBHTF9NQVhfRUxFTUVOVFNfVkVSVElDRVMgICAgICAgICAgMHg4MEU4CisjZGVmaW5lIEdMX01BWF9FTEVNRU5UU19JTkRJQ0VTICAgICAgICAgICAweDgwRTkKKyNkZWZpbmUgR0xfTUFYX1RFWFRVUkVfVU5JVFMgICAgICAgICAgICAgIDB4ODRFMgorI2RlZmluZSBHTF9OVU1fQ09NUFJFU1NFRF9URVhUVVJFX0ZPUk1BVFMgMHg4NkEyCisjZGVmaW5lIEdMX0NPTVBSRVNTRURfVEVYVFVSRV9GT1JNQVRTICAgICAweDg2QTMKKyNkZWZpbmUgR0xfU1VCUElYRUxfQklUUyAgICAgICAgICAgICAgICAgIDB4MEQ1MAorI2RlZmluZSBHTF9SRURfQklUUyAgICAgICAgICAgICAgICAgICAgICAgMHgwRDUyCisjZGVmaW5lIEdMX0dSRUVOX0JJVFMgICAgICAgICAgICAgICAgICAgICAweDBENTMKKyNkZWZpbmUgR0xfQkxVRV9CSVRTICAgICAgICAgICAgICAgICAgICAgIDB4MEQ1NAorI2RlZmluZSBHTF9BTFBIQV9CSVRTICAgICAgICAgICAgICAgICAgICAgMHgwRDU1CisjZGVmaW5lIEdMX0RFUFRIX0JJVFMgICAgICAgICAgICAgICAgICAgICAweDBENTYKKyNkZWZpbmUgR0xfU1RFTkNJTF9CSVRTICAgICAgICAgICAgICAgICAgIDB4MEQ1NworCisvKiBIaW50TW9kZSAqLworI2RlZmluZSBHTF9ET05UX0NBUkUgICAgICAgICAgICAgICAgICAgICAgMHgxMTAwCisjZGVmaW5lIEdMX0ZBU1RFU1QgICAgICAgICAgICAgICAgICAgICAgICAweDExMDEKKyNkZWZpbmUgR0xfTklDRVNUICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTEwMgorCisvKiBIaW50VGFyZ2V0ICovCisjZGVmaW5lIEdMX1BFUlNQRUNUSVZFX0NPUlJFQ1RJT05fSElOVCAgICAweDBDNTAKKyNkZWZpbmUgR0xfUE9JTlRfU01PT1RIX0hJTlQgICAgICAgICAgICAgIDB4MEM1MQorI2RlZmluZSBHTF9MSU5FX1NNT09USF9ISU5UICAgICAgICAgICAgICAgMHgwQzUyCisjZGVmaW5lIEdMX1BPTFlHT05fU01PT1RIX0hJTlQgICAgICAgICAgICAweDBDNTMKKyNkZWZpbmUgR0xfRk9HX0hJTlQgICAgICAgICAgICAgICAgICAgICAgIDB4MEM1NAorCisvKiBMaWdodE1vZGVsUGFyYW1ldGVyICovCisjZGVmaW5lIEdMX0xJR0hUX01PREVMX0FNQklFTlQgICAgICAgICAgICAweDBCNTMKKyNkZWZpbmUgR0xfTElHSFRfTU9ERUxfVFdPX1NJREUgICAgICAgICAgIDB4MEI1MgorCisvKiBMaWdodFBhcmFtZXRlciAqLworI2RlZmluZSBHTF9BTUJJRU5UICAgICAgICAgICAgICAgICAgICAgICAgMHgxMjAwCisjZGVmaW5lIEdMX0RJRkZVU0UgICAgICAgICAgICAgICAgICAgICAgICAweDEyMDEKKyNkZWZpbmUgR0xfU1BFQ1VMQVIgICAgICAgICAgICAgICAgICAgICAgIDB4MTIwMgorI2RlZmluZSBHTF9QT1NJVElPTiAgICAgICAgICAgICAgICAgICAgICAgMHgxMjAzCisjZGVmaW5lIEdMX1NQT1RfRElSRUNUSU9OICAgICAgICAgICAgICAgICAweDEyMDQKKyNkZWZpbmUgR0xfU1BPVF9FWFBPTkVOVCAgICAgICAgICAgICAgICAgIDB4MTIwNQorI2RlZmluZSBHTF9TUE9UX0NVVE9GRiAgICAgICAgICAgICAgICAgICAgMHgxMjA2CisjZGVmaW5lIEdMX0NPTlNUQU5UX0FUVEVOVUFUSU9OICAgICAgICAgICAweDEyMDcKKyNkZWZpbmUgR0xfTElORUFSX0FUVEVOVUFUSU9OICAgICAgICAgICAgIDB4MTIwOAorI2RlZmluZSBHTF9RVUFEUkFUSUNfQVRURU5VQVRJT04gICAgICAgICAgMHgxMjA5CisKKy8qIERhdGFUeXBlICovCisjZGVmaW5lIEdMX0JZVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE0MDAKKyNkZWZpbmUgR0xfVU5TSUdORURfQllURSAgICAgICAgICAgICAgICAgIDB4MTQwMQorI2RlZmluZSBHTF9TSE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNDAyCisjZGVmaW5lIEdMX1VOU0lHTkVEX1NIT1JUICAgICAgICAgICAgICAgICAweDE0MDMKKyNkZWZpbmUgR0xfRkxPQVQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTQwNgorI2RlZmluZSBHTF9GSVhFRCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNDBDCisKKy8qIExvZ2ljT3AgKi8KKyNkZWZpbmUgR0xfQ0xFQVIgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTUwMAorI2RlZmluZSBHTF9BTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNTAxCisjZGVmaW5lIEdMX0FORF9SRVZFUlNFICAgICAgICAgICAgICAgICAgICAweDE1MDIKKyNkZWZpbmUgR0xfQ09QWSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTUwMworI2RlZmluZSBHTF9BTkRfSU5WRVJURUQgICAgICAgICAgICAgICAgICAgMHgxNTA0CisjZGVmaW5lIEdMX05PT1AgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE1MDUKKyNkZWZpbmUgR0xfWE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTUwNgorI2RlZmluZSBHTF9PUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNTA3CisjZGVmaW5lIEdMX05PUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE1MDgKKyNkZWZpbmUgR0xfRVFVSVYgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTUwOQorI2RlZmluZSBHTF9JTlZFUlQgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNTBBCisjZGVmaW5lIEdMX09SX1JFVkVSU0UgICAgICAgICAgICAgICAgICAgICAweDE1MEIKKyNkZWZpbmUgR0xfQ09QWV9JTlZFUlRFRCAgICAgICAgICAgICAgICAgIDB4MTUwQworI2RlZmluZSBHTF9PUl9JTlZFUlRFRCAgICAgICAgICAgICAgICAgICAgMHgxNTBECisjZGVmaW5lIEdMX05BTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE1MEUKKyNkZWZpbmUgR0xfU0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTUwRgorCisvKiBNYXRlcmlhbEZhY2UgKi8KKy8qICAgICAgR0xfRlJPTlRfQU5EX0JBQ0sgKi8KKworLyogTWF0ZXJpYWxQYXJhbWV0ZXIgKi8KKyNkZWZpbmUgR0xfRU1JU1NJT04gICAgICAgICAgICAgICAgICAgICAgIDB4MTYwMAorI2RlZmluZSBHTF9TSElOSU5FU1MgICAgICAgICAgICAgICAgICAgICAgMHgxNjAxCisjZGVmaW5lIEdMX0FNQklFTlRfQU5EX0RJRkZVU0UgICAgICAgICAgICAweDE2MDIKKy8qICAgICAgR0xfQU1CSUVOVCAqLworLyogICAgICBHTF9ESUZGVVNFICovCisvKiAgICAgIEdMX1NQRUNVTEFSICovCisKKy8qIE1hdHJpeE1vZGUgKi8KKyNkZWZpbmUgR0xfTU9ERUxWSUVXICAgICAgICAgICAgICAgICAgICAgIDB4MTcwMAorI2RlZmluZSBHTF9QUk9KRUNUSU9OICAgICAgICAgICAgICAgICAgICAgMHgxNzAxCisjZGVmaW5lIEdMX1RFWFRVUkUgICAgICAgICAgICAgICAgICAgICAgICAweDE3MDIKKworLyogTm9ybWFsUG9pbnRlclR5cGUgKi8KKy8qICAgICAgR0xfQllURSAqLworLyogICAgICBHTF9TSE9SVCAqLworLyogICAgICBHTF9GTE9BVCAqLworLyogICAgICBHTF9GSVhFRCAqLworCisvKiBQaXhlbEZvcm1hdCAqLworI2RlZmluZSBHTF9BTFBIQSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxOTA2CisjZGVmaW5lIEdMX1JHQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE5MDcKKyNkZWZpbmUgR0xfUkdCQSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTkwOAorI2RlZmluZSBHTF9MVU1JTkFOQ0UgICAgICAgICAgICAgICAgICAgICAgMHgxOTA5CisjZGVmaW5lIEdMX0xVTUlOQU5DRV9BTFBIQSAgICAgICAgICAgICAgICAweDE5MEEKKworLyogUGl4ZWxTdG9yZVBhcmFtZXRlciAqLworI2RlZmluZSBHTF9VTlBBQ0tfQUxJR05NRU5UICAgICAgICAgICAgICAgMHgwQ0Y1CisjZGVmaW5lIEdMX1BBQ0tfQUxJR05NRU5UICAgICAgICAgICAgICAgICAweDBEMDUKKworLyogUGl4ZWxUeXBlICovCisvKiAgICAgIEdMX1VOU0lHTkVEX0JZVEUgKi8KKyNkZWZpbmUgR0xfVU5TSUdORURfU0hPUlRfNF80XzRfNCAgICAgICAgIDB4ODAzMworI2RlZmluZSBHTF9VTlNJR05FRF9TSE9SVF81XzVfNV8xICAgICAgICAgMHg4MDM0CisjZGVmaW5lIEdMX1VOU0lHTkVEX1NIT1JUXzVfNl81ICAgICAgICAgICAweDgzNjMKKworLyogU2hhZGluZ01vZGVsICovCisjZGVmaW5lIEdMX0ZMQVQgICAgICAgICAgICAgICAgICAgICAgICAgICAweDFEMDAKKyNkZWZpbmUgR0xfU01PT1RIICAgICAgICAgICAgICAgICAgICAgICAgIDB4MUQwMQorCisvKiBTdGVuY2lsRnVuY3Rpb24gKi8KKy8qICAgICAgR0xfTkVWRVIgKi8KKy8qICAgICAgR0xfTEVTUyAqLworLyogICAgICBHTF9FUVVBTCAqLworLyogICAgICBHTF9MRVFVQUwgKi8KKy8qICAgICAgR0xfR1JFQVRFUiAqLworLyogICAgICBHTF9OT1RFUVVBTCAqLworLyogICAgICBHTF9HRVFVQUwgKi8KKy8qICAgICAgR0xfQUxXQVlTICovCisKKy8qIFN0ZW5jaWxPcCAqLworLyogICAgICBHTF9aRVJPICovCisjZGVmaW5lIEdMX0tFRVAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDFFMDAKKyNkZWZpbmUgR0xfUkVQTEFDRSAgICAgICAgICAgICAgICAgICAgICAgIDB4MUUwMQorI2RlZmluZSBHTF9JTkNSICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxRTAyCisjZGVmaW5lIEdMX0RFQ1IgICAgICAgICAgICAgICAgICAgICAgICAgICAweDFFMDMKKy8qICAgICAgR0xfSU5WRVJUICovCisKKy8qIFN0cmluZ05hbWUgKi8KKyNkZWZpbmUgR0xfVkVORE9SICAgICAgICAgICAgICAgICAgICAgICAgIDB4MUYwMAorI2RlZmluZSBHTF9SRU5ERVJFUiAgICAgICAgICAgICAgICAgICAgICAgMHgxRjAxCisjZGVmaW5lIEdMX1ZFUlNJT04gICAgICAgICAgICAgICAgICAgICAgICAweDFGMDIKKyNkZWZpbmUgR0xfRVhURU5TSU9OUyAgICAgICAgICAgICAgICAgICAgIDB4MUYwMworCisvKiBUZXhDb29yZFBvaW50ZXJUeXBlICovCisvKiAgICAgIEdMX1NIT1JUICovCisvKiAgICAgIEdMX0ZMT0FUICovCisvKiAgICAgIEdMX0ZJWEVEICovCisvKiAgICAgIEdMX0JZVEUgKi8KKworLyogVGV4dHVyZUVudk1vZGUgKi8KKyNkZWZpbmUgR0xfTU9EVUxBVEUgICAgICAgICAgICAgICAgICAgICAgIDB4MjEwMAorI2RlZmluZSBHTF9ERUNBTCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMTAxCisvKiAgICAgIEdMX0JMRU5EICovCisjZGVmaW5lIEdMX0FERCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDQKKy8qICAgICAgR0xfUkVQTEFDRSAqLworCisvKiBUZXh0dXJlRW52UGFyYW1ldGVyICovCisjZGVmaW5lIEdMX1RFWFRVUkVfRU5WX01PREUgICAgICAgICAgICAgICAweDIyMDAKKyNkZWZpbmUgR0xfVEVYVFVSRV9FTlZfQ09MT1IgICAgICAgICAgICAgIDB4MjIwMQorCisvKiBUZXh0dXJlRW52VGFyZ2V0ICovCisjZGVmaW5lIEdMX1RFWFRVUkVfRU5WICAgICAgICAgICAgICAgICAgICAweDIzMDAKKworLyogVGV4dHVyZU1hZ0ZpbHRlciAqLworI2RlZmluZSBHTF9ORUFSRVNUICAgICAgICAgICAgICAgICAgICAgICAgMHgyNjAwCisjZGVmaW5lIEdMX0xJTkVBUiAgICAgICAgICAgICAgICAgICAgICAgICAweDI2MDEKKworLyogVGV4dHVyZU1pbkZpbHRlciAqLworLyogICAgICBHTF9ORUFSRVNUICovCisvKiAgICAgIEdMX0xJTkVBUiAqLworI2RlZmluZSBHTF9ORUFSRVNUX01JUE1BUF9ORUFSRVNUICAgICAgICAgMHgyNzAwCisjZGVmaW5lIEdMX0xJTkVBUl9NSVBNQVBfTkVBUkVTVCAgICAgICAgICAweDI3MDEKKyNkZWZpbmUgR0xfTkVBUkVTVF9NSVBNQVBfTElORUFSICAgICAgICAgIDB4MjcwMgorI2RlZmluZSBHTF9MSU5FQVJfTUlQTUFQX0xJTkVBUiAgICAgICAgICAgMHgyNzAzCisKKy8qIFRleHR1cmVQYXJhbWV0ZXJOYW1lICovCisjZGVmaW5lIEdMX1RFWFRVUkVfTUFHX0ZJTFRFUiAgICAgICAgICAgICAweDI4MDAKKyNkZWZpbmUgR0xfVEVYVFVSRV9NSU5fRklMVEVSICAgICAgICAgICAgIDB4MjgwMQorI2RlZmluZSBHTF9URVhUVVJFX1dSQVBfUyAgICAgICAgICAgICAgICAgMHgyODAyCisjZGVmaW5lIEdMX1RFWFRVUkVfV1JBUF9UICAgICAgICAgICAgICAgICAweDI4MDMKKworLyogVGV4dHVyZVRhcmdldCAqLworLyogICAgICBHTF9URVhUVVJFXzJEICovCisKKy8qIFRleHR1cmVVbml0ICovCisjZGVmaW5lIEdMX1RFWFRVUkUwICAgICAgICAgICAgICAgICAgICAgICAweDg0QzAKKyNkZWZpbmUgR0xfVEVYVFVSRTEgICAgICAgICAgICAgICAgICAgICAgIDB4ODRDMQorI2RlZmluZSBHTF9URVhUVVJFMiAgICAgICAgICAgICAgICAgICAgICAgMHg4NEMyCisjZGVmaW5lIEdMX1RFWFRVUkUzICAgICAgICAgICAgICAgICAgICAgICAweDg0QzMKKyNkZWZpbmUgR0xfVEVYVFVSRTQgICAgICAgICAgICAgICAgICAgICAgIDB4ODRDNAorI2RlZmluZSBHTF9URVhUVVJFNSAgICAgICAgICAgICAgICAgICAgICAgMHg4NEM1CisjZGVmaW5lIEdMX1RFWFRVUkU2ICAgICAgICAgICAgICAgICAgICAgICAweDg0QzYKKyNkZWZpbmUgR0xfVEVYVFVSRTcgICAgICAgICAgICAgICAgICAgICAgIDB4ODRDNworI2RlZmluZSBHTF9URVhUVVJFOCAgICAgICAgICAgICAgICAgICAgICAgMHg4NEM4CisjZGVmaW5lIEdMX1RFWFRVUkU5ICAgICAgICAgICAgICAgICAgICAgICAweDg0QzkKKyNkZWZpbmUgR0xfVEVYVFVSRTEwICAgICAgICAgICAgICAgICAgICAgIDB4ODRDQQorI2RlZmluZSBHTF9URVhUVVJFMTEgICAgICAgICAgICAgICAgICAgICAgMHg4NENCCisjZGVmaW5lIEdMX1RFWFRVUkUxMiAgICAgICAgICAgICAgICAgICAgICAweDg0Q0MKKyNkZWZpbmUgR0xfVEVYVFVSRTEzICAgICAgICAgICAgICAgICAgICAgIDB4ODRDRAorI2RlZmluZSBHTF9URVhUVVJFMTQgICAgICAgICAgICAgICAgICAgICAgMHg4NENFCisjZGVmaW5lIEdMX1RFWFRVUkUxNSAgICAgICAgICAgICAgICAgICAgICAweDg0Q0YKKyNkZWZpbmUgR0xfVEVYVFVSRTE2ICAgICAgICAgICAgICAgICAgICAgIDB4ODREMAorI2RlZmluZSBHTF9URVhUVVJFMTcgICAgICAgICAgICAgICAgICAgICAgMHg4NEQxCisjZGVmaW5lIEdMX1RFWFRVUkUxOCAgICAgICAgICAgICAgICAgICAgICAweDg0RDIKKyNkZWZpbmUgR0xfVEVYVFVSRTE5ICAgICAgICAgICAgICAgICAgICAgIDB4ODREMworI2RlZmluZSBHTF9URVhUVVJFMjAgICAgICAgICAgICAgICAgICAgICAgMHg4NEQ0CisjZGVmaW5lIEdMX1RFWFRVUkUyMSAgICAgICAgICAgICAgICAgICAgICAweDg0RDUKKyNkZWZpbmUgR0xfVEVYVFVSRTIyICAgICAgICAgICAgICAgICAgICAgIDB4ODRENgorI2RlZmluZSBHTF9URVhUVVJFMjMgICAgICAgICAgICAgICAgICAgICAgMHg4NEQ3CisjZGVmaW5lIEdMX1RFWFRVUkUyNCAgICAgICAgICAgICAgICAgICAgICAweDg0RDgKKyNkZWZpbmUgR0xfVEVYVFVSRTI1ICAgICAgICAgICAgICAgICAgICAgIDB4ODREOQorI2RlZmluZSBHTF9URVhUVVJFMjYgICAgICAgICAgICAgICAgICAgICAgMHg4NERBCisjZGVmaW5lIEdMX1RFWFRVUkUyNyAgICAgICAgICAgICAgICAgICAgICAweDg0REIKKyNkZWZpbmUgR0xfVEVYVFVSRTI4ICAgICAgICAgICAgICAgICAgICAgIDB4ODREQworI2RlZmluZSBHTF9URVhUVVJFMjkgICAgICAgICAgICAgICAgICAgICAgMHg4NERECisjZGVmaW5lIEdMX1RFWFRVUkUzMCAgICAgICAgICAgICAgICAgICAgICAweDg0REUKKyNkZWZpbmUgR0xfVEVYVFVSRTMxICAgICAgICAgICAgICAgICAgICAgIDB4ODRERgorCisvKiBUZXh0dXJlV3JhcE1vZGUgKi8KKyNkZWZpbmUgR0xfUkVQRUFUICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjkwMQorI2RlZmluZSBHTF9DTEFNUF9UT19FREdFICAgICAgICAgICAgICAgICAgMHg4MTJGCisKKy8qIFBpeGVsSW50ZXJuYWxGb3JtYXQgKi8KKyNkZWZpbmUgR0xfUEFMRVRURTRfUkdCOF9PRVMgICAgICAgICAgICAgIDB4OEI5MAorI2RlZmluZSBHTF9QQUxFVFRFNF9SR0JBOF9PRVMgICAgICAgICAgICAgMHg4QjkxCisjZGVmaW5lIEdMX1BBTEVUVEU0X1I1X0c2X0I1X09FUyAgICAgICAgICAweDhCOTIKKyNkZWZpbmUgR0xfUEFMRVRURTRfUkdCQTRfT0VTICAgICAgICAgICAgIDB4OEI5MworI2RlZmluZSBHTF9QQUxFVFRFNF9SR0I1X0ExX09FUyAgICAgICAgICAgMHg4Qjk0CisjZGVmaW5lIEdMX1BBTEVUVEU4X1JHQjhfT0VTICAgICAgICAgICAgICAweDhCOTUKKyNkZWZpbmUgR0xfUEFMRVRURThfUkdCQThfT0VTICAgICAgICAgICAgIDB4OEI5NgorI2RlZmluZSBHTF9QQUxFVFRFOF9SNV9HNl9CNV9PRVMgICAgICAgICAgMHg4Qjk3CisjZGVmaW5lIEdMX1BBTEVUVEU4X1JHQkE0X09FUyAgICAgICAgICAgICAweDhCOTgKKyNkZWZpbmUgR0xfUEFMRVRURThfUkdCNV9BMV9PRVMgICAgICAgICAgIDB4OEI5OQorCisvKiBWZXJ0ZXhQb2ludGVyVHlwZSAqLworLyogICAgICBHTF9TSE9SVCAqLworLyogICAgICBHTF9GTE9BVCAqLworLyogICAgICBHTF9GSVhFRCAqLworLyogICAgICBHTF9CWVRFICovCisKKy8qIExpZ2h0TmFtZSAqLworI2RlZmluZSBHTF9MSUdIVDAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwCisjZGVmaW5lIEdMX0xJR0hUMSAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDEKKyNkZWZpbmUgR0xfTElHSFQyICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMgorI2RlZmluZSBHTF9MSUdIVDMgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAzCisjZGVmaW5lIEdMX0xJR0hUNCAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDQKKyNkZWZpbmUgR0xfTElHSFQ1ICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwNQorI2RlZmluZSBHTF9MSUdIVDYgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDA2CisjZGVmaW5lIEdMX0xJR0hUNyAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDcKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEFjdGl2ZVRleHR1cmUgKEdMZW51bSB0ZXh0dXJlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xBbHBoYUZ1bmMgKEdMZW51bSBmdW5jLCBHTGNsYW1wZiByZWYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEFscGhhRnVuY3ggKEdMZW51bSBmdW5jLCBHTGNsYW1weCByZWYpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEJpbmRUZXh0dXJlIChHTGVudW0gdGFyZ2V0LCBHTHVpbnQgdGV4dHVyZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQmxlbmRGdW5jIChHTGVudW0gc2ZhY3RvciwgR0xlbnVtIGRmYWN0b3IpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENsZWFyIChHTGJpdGZpZWxkIG1hc2spOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENsZWFyQ29sb3IgKEdMY2xhbXBmIHJlZCwgR0xjbGFtcGYgZ3JlZW4sIEdMY2xhbXBmIGJsdWUsIEdMY2xhbXBmIGFscGhhKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDbGVhckNvbG9yeCAoR0xjbGFtcHggcmVkLCBHTGNsYW1weCBncmVlbiwgR0xjbGFtcHggYmx1ZSwgR0xjbGFtcHggYWxwaGEpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENsZWFyRGVwdGhmIChHTGNsYW1wZiBkZXB0aCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ2xlYXJEZXB0aHggKEdMY2xhbXB4IGRlcHRoKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDbGVhclN0ZW5jaWwgKEdMaW50IHMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENsaWVudEFjdGl2ZVRleHR1cmUgKEdMZW51bSB0ZXh0dXJlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb2xvcjRmIChHTGZsb2F0IHJlZCwgR0xmbG9hdCBncmVlbiwgR0xmbG9hdCBibHVlLCBHTGZsb2F0IGFscGhhKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb2xvcjR4IChHTGZpeGVkIHJlZCwgR0xmaXhlZCBncmVlbiwgR0xmaXhlZCBibHVlLCBHTGZpeGVkIGFscGhhKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb2xvck1hc2sgKEdMYm9vbGVhbiByZWQsIEdMYm9vbGVhbiBncmVlbiwgR0xib29sZWFuIGJsdWUsIEdMYm9vbGVhbiBhbHBoYSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29sb3JQb2ludGVyIChHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlcik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsQ29tcHJlc3NlZFRleEltYWdlMkQgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGVudW0gaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGludCBib3JkZXIsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQgKmRhdGEpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvbXByZXNzZWRUZXhTdWJJbWFnZTJEIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMZW51bSBmb3JtYXQsIEdMc2l6ZWkgaW1hZ2VTaXplLCBjb25zdCBHTHZvaWQgKmRhdGEpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbENvcHlUZXhJbWFnZTJEIChHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xpbnQgYm9yZGVyKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDb3B5VGV4U3ViSW1hZ2UyRCAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xDdWxsRmFjZSAoR0xlbnVtIG1vZGUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbERlbGV0ZVRleHR1cmVzIChHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqdGV4dHVyZXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbERlcHRoRnVuYyAoR0xlbnVtIGZ1bmMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbERlcHRoTWFzayAoR0xib29sZWFuIGZsYWcpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbERlcHRoUmFuZ2VmIChHTGNsYW1wZiB6TmVhciwgR0xjbGFtcGYgekZhcik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRGVwdGhSYW5nZXggKEdMY2xhbXB4IHpOZWFyLCBHTGNsYW1weCB6RmFyKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEaXNhYmxlIChHTGVudW0gY2FwKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEaXNhYmxlQ2xpZW50U3RhdGUgKEdMZW51bSBhcnJheSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRHJhd0FycmF5cyAoR0xlbnVtIG1vZGUsIEdMaW50IGZpcnN0LCBHTHNpemVpIGNvdW50KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xEcmF3RWxlbWVudHMgKEdMZW51bSBtb2RlLCBHTHNpemVpIGNvdW50LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICppbmRpY2VzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xFbmFibGUgKEdMZW51bSBjYXApOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEVuYWJsZUNsaWVudFN0YXRlIChHTGVudW0gYXJyYXkpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZpbmlzaCAodm9pZCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRmx1c2ggKHZvaWQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZvZ2YgKEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRm9nZnYgKEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xGb2d4IChHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZvZ3h2IChHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRnJvbnRGYWNlIChHTGVudW0gbW9kZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsRnJ1c3R1bWYgKEdMZmxvYXQgbGVmdCwgR0xmbG9hdCByaWdodCwgR0xmbG9hdCBib3R0b20sIEdMZmxvYXQgdG9wLCBHTGZsb2F0IHpOZWFyLCBHTGZsb2F0IHpGYXIpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEZydXN0dW14IChHTGZpeGVkIGxlZnQsIEdMZml4ZWQgcmlnaHQsIEdMZml4ZWQgYm90dG9tLCBHTGZpeGVkIHRvcCwgR0xmaXhlZCB6TmVhciwgR0xmaXhlZCB6RmFyKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZW5UZXh0dXJlcyAoR0xzaXplaSBuLCBHTHVpbnQgKnRleHR1cmVzKTsKK0dMQVBJIEdMZW51bSBBUElFTlRSWSBnbEdldEVycm9yICh2b2lkKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xHZXRJbnRlZ2VydiAoR0xlbnVtIHBuYW1lLCBHTGludCAqcGFyYW1zKTsKK0dMQVBJIGNvbnN0IEdMdWJ5dGUgKiBBUElFTlRSWSBnbEdldFN0cmluZyAoR0xlbnVtIG5hbWUpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbEhpbnQgKEdMZW51bSB0YXJnZXQsIEdMZW51bSBtb2RlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xMaWdodE1vZGVsZiAoR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xMaWdodE1vZGVsZnYgKEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xMaWdodE1vZGVseCAoR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xMaWdodE1vZGVseHYgKEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xMaWdodGYgKEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xMaWdodGZ2IChHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xMaWdodHggKEdMZW51bSBsaWdodCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xMaWdodHh2IChHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xMaW5lV2lkdGggKEdMZmxvYXQgd2lkdGgpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbExpbmVXaWR0aHggKEdMZml4ZWQgd2lkdGgpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbExvYWRJZGVudGl0eSAodm9pZCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTG9hZE1hdHJpeGYgKGNvbnN0IEdMZmxvYXQgKm0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbExvYWRNYXRyaXh4IChjb25zdCBHTGZpeGVkICptKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xMb2dpY09wIChHTGVudW0gb3Bjb2RlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNYXRlcmlhbGYgKEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE1hdGVyaWFsZnYgKEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTWF0ZXJpYWx4IChHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNYXRlcmlhbHh2IChHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE1hdHJpeE1vZGUgKEdMZW51bSBtb2RlKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0TWF0cml4ZiAoY29uc3QgR0xmbG9hdCAqbSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTXVsdE1hdHJpeHggKGNvbnN0IEdMZml4ZWQgKm0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE11bHRpVGV4Q29vcmQ0ZiAoR0xlbnVtIHRhcmdldCwgR0xmbG9hdCBzLCBHTGZsb2F0IHQsIEdMZmxvYXQgciwgR0xmbG9hdCBxKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xNdWx0aVRleENvb3JkNHggKEdMZW51bSB0YXJnZXQsIEdMZml4ZWQgcywgR0xmaXhlZCB0LCBHTGZpeGVkIHIsIEdMZml4ZWQgcSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsTm9ybWFsM2YgKEdMZmxvYXQgbngsIEdMZmxvYXQgbnksIEdMZmxvYXQgbnopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbE5vcm1hbDN4IChHTGZpeGVkIG54LCBHTGZpeGVkIG55LCBHTGZpeGVkIG56KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xOb3JtYWxQb2ludGVyIChHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlcik7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsT3J0aG9mIChHTGZsb2F0IGxlZnQsIEdMZmxvYXQgcmlnaHQsIEdMZmxvYXQgYm90dG9tLCBHTGZsb2F0IHRvcCwgR0xmbG9hdCB6TmVhciwgR0xmbG9hdCB6RmFyKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xPcnRob3ggKEdMZml4ZWQgbGVmdCwgR0xmaXhlZCByaWdodCwgR0xmaXhlZCBib3R0b20sIEdMZml4ZWQgdG9wLCBHTGZpeGVkIHpOZWFyLCBHTGZpeGVkIHpGYXIpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFBpeGVsU3RvcmVpIChHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQb2ludFNpemUgKEdMZmxvYXQgc2l6ZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUG9pbnRTaXpleCAoR0xmaXhlZCBzaXplKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQb2x5Z29uT2Zmc2V0IChHTGZsb2F0IGZhY3RvciwgR0xmbG9hdCB1bml0cyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsUG9seWdvbk9mZnNldHggKEdMZml4ZWQgZmFjdG9yLCBHTGZpeGVkIHVuaXRzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xQb3BNYXRyaXggKHZvaWQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFB1c2hNYXRyaXggKHZvaWQpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFJlYWRQaXhlbHMgKEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgR0x2b2lkICpwaXhlbHMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFJvdGF0ZWYgKEdMZmxvYXQgYW5nbGUsIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFJvdGF0ZXggKEdMZml4ZWQgYW5nbGUsIEdMZml4ZWQgeCwgR0xmaXhlZCB5LCBHTGZpeGVkIHopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNhbXBsZUNvdmVyYWdlIChHTGNsYW1wZiB2YWx1ZSwgR0xib29sZWFuIGludmVydCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2FtcGxlQ292ZXJhZ2V4IChHTGNsYW1weCB2YWx1ZSwgR0xib29sZWFuIGludmVydCk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU2NhbGVmIChHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTY2FsZXggKEdMZml4ZWQgeCwgR0xmaXhlZCB5LCBHTGZpeGVkIHopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFNjaXNzb3IgKEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0KTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTaGFkZU1vZGVsIChHTGVudW0gbW9kZSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsU3RlbmNpbEZ1bmMgKEdMZW51bSBmdW5jLCBHTGludCByZWYsIEdMdWludCBtYXNrKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xTdGVuY2lsTWFzayAoR0x1aW50IG1hc2spOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFN0ZW5jaWxPcCAoR0xlbnVtIGZhaWwsIEdMZW51bSB6ZmFpbCwgR0xlbnVtIHpwYXNzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXhDb29yZFBvaW50ZXIgKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXhFbnZmIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleEVudmZ2IChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4RW52eCAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXhFbnZ4diAoR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleEltYWdlMkQgKEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMaW50IGJvcmRlciwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqcGl4ZWxzKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xUZXhQYXJhbWV0ZXJmIChHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0pOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRleFBhcmFtZXRlcnggKEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSk7CitHTEFQSSB2b2lkIEFQSUVOVFJZIGdsVGV4U3ViSW1hZ2UyRCAoR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgY29uc3QgR0x2b2lkICpwaXhlbHMpOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRyYW5zbGF0ZWYgKEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFRyYW5zbGF0ZXggKEdMZml4ZWQgeCwgR0xmaXhlZCB5LCBHTGZpeGVkIHopOworR0xBUEkgdm9pZCBBUElFTlRSWSBnbFZlcnRleFBvaW50ZXIgKEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyKTsKK0dMQVBJIHZvaWQgQVBJRU5UUlkgZ2xWaWV3cG9ydCAoR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX19nbF9oXyAqLwpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvbGljZW5zZS1CU0QudHh0IGIvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvbGljZW5zZS1CU0QudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5MjRlM2MKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9saWNlbnNlLUJTRC50eHQKQEAgLTAsMCArMSwzNCBAQAorVGhpcyBpcyB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm9yIHRoZSAiU2FuIEFuZ2VsZXMgT2JzZXJ2YXRpb24iDQorT3BlbkdMIEVTIHZlcnNpb24gZXhhbXBsZSBzb3VyY2UgY29kZQ0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KK1NhbiBBbmdlbGVzIE9ic2VydmF0aW9uIE9wZW5HTCBFUyB2ZXJzaW9uIGV4YW1wbGUNCitDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNSwgSmV0cm8gTGF1aGENCitBbGwgcmlnaHRzIHJlc2VydmVkLg0KKw0KK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dA0KK21vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucw0KK2FyZSBtZXQ6DQorDQorICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQNCisgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQorICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQNCisgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4NCisgICAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlDQorICAgICAgZGlzdHJpYnV0aW9uLg0KKyAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIHNvZnR3YXJlIHByb2R1Y3QncyBjb3B5cmlnaHQgb3duZXIgbm9yDQorICAgICAgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlDQorICAgICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuDQorICAgICAgcGVybWlzc2lvbi4NCisNCitUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTDQorIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QNCitMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1INCitBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVA0KK09XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLA0KK1NQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRA0KK1RPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1INCitQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GDQorTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcNCitORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMNCitTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9saWNlbnNlLUxHUEwudHh0IGIvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvbGljZW5zZS1MR1BMLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWUzZjVhCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvbGljZW5zZS1MR1BMLnR4dApAQCAtMCwwICsxLDUwNCBAQAorCQkgIEdOVSBMRVNTRVIgR0VORVJBTCBQVUJMSUMgTElDRU5TRQorCQkgICAgICAgVmVyc2lvbiAyLjEsIEZlYnJ1YXJ5IDE5OTkKKworIENvcHlyaWdodCAoQykgMTk5MSwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgICAgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorIEV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcworIG9mIHRoaXMgbGljZW5zZSBkb2N1bWVudCwgYnV0IGNoYW5naW5nIGl0IGlzIG5vdCBhbGxvd2VkLgorCitbVGhpcyBpcyB0aGUgZmlyc3QgcmVsZWFzZWQgdmVyc2lvbiBvZiB0aGUgTGVzc2VyIEdQTC4gIEl0IGFsc28gY291bnRzCisgYXMgdGhlIHN1Y2Nlc3NvciBvZiB0aGUgR05VIExpYnJhcnkgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMiwgaGVuY2UKKyB0aGUgdmVyc2lvbiBudW1iZXIgMi4xLl0KKworCQkJICAgIFByZWFtYmxlCisKKyAgVGhlIGxpY2Vuc2VzIGZvciBtb3N0IHNvZnR3YXJlIGFyZSBkZXNpZ25lZCB0byB0YWtlIGF3YXkgeW91cgorZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIGl0LiAgQnkgY29udHJhc3QsIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKK0xpY2Vuc2VzIGFyZSBpbnRlbmRlZCB0byBndWFyYW50ZWUgeW91ciBmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UKK2ZyZWUgc29mdHdhcmUtLXRvIG1ha2Ugc3VyZSB0aGUgc29mdHdhcmUgaXMgZnJlZSBmb3IgYWxsIGl0cyB1c2Vycy4KKworICBUaGlzIGxpY2Vuc2UsIHRoZSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgYXBwbGllcyB0byBzb21lCitzcGVjaWFsbHkgZGVzaWduYXRlZCBzb2Z0d2FyZSBwYWNrYWdlcy0tdHlwaWNhbGx5IGxpYnJhcmllcy0tb2YgdGhlCitGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIG90aGVyIGF1dGhvcnMgd2hvIGRlY2lkZSB0byB1c2UgaXQuICBZb3UKK2NhbiB1c2UgaXQgdG9vLCBidXQgd2Ugc3VnZ2VzdCB5b3UgZmlyc3QgdGhpbmsgY2FyZWZ1bGx5IGFib3V0IHdoZXRoZXIKK3RoaXMgbGljZW5zZSBvciB0aGUgb3JkaW5hcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyB0aGUgYmV0dGVyCitzdHJhdGVneSB0byB1c2UgaW4gYW55IHBhcnRpY3VsYXIgY2FzZSwgYmFzZWQgb24gdGhlIGV4cGxhbmF0aW9ucyBiZWxvdy4KKworICBXaGVuIHdlIHNwZWFrIG9mIGZyZWUgc29mdHdhcmUsIHdlIGFyZSByZWZlcnJpbmcgdG8gZnJlZWRvbSBvZiB1c2UsCitub3QgcHJpY2UuICBPdXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZXMgYXJlIGRlc2lnbmVkIHRvIG1ha2Ugc3VyZSB0aGF0Cit5b3UgaGF2ZSB0aGUgZnJlZWRvbSB0byBkaXN0cmlidXRlIGNvcGllcyBvZiBmcmVlIHNvZnR3YXJlIChhbmQgY2hhcmdlCitmb3IgdGhpcyBzZXJ2aWNlIGlmIHlvdSB3aXNoKTsgdGhhdCB5b3UgcmVjZWl2ZSBzb3VyY2UgY29kZSBvciBjYW4gZ2V0CitpdCBpZiB5b3Ugd2FudCBpdDsgdGhhdCB5b3UgY2FuIGNoYW5nZSB0aGUgc29mdHdhcmUgYW5kIHVzZSBwaWVjZXMgb2YKK2l0IGluIG5ldyBmcmVlIHByb2dyYW1zOyBhbmQgdGhhdCB5b3UgYXJlIGluZm9ybWVkIHRoYXQgeW91IGNhbiBkbwordGhlc2UgdGhpbmdzLgorCisgIFRvIHByb3RlY3QgeW91ciByaWdodHMsIHdlIG5lZWQgdG8gbWFrZSByZXN0cmljdGlvbnMgdGhhdCBmb3JiaWQKK2Rpc3RyaWJ1dG9ycyB0byBkZW55IHlvdSB0aGVzZSByaWdodHMgb3IgdG8gYXNrIHlvdSB0byBzdXJyZW5kZXIgdGhlc2UKK3JpZ2h0cy4gIFRoZXNlIHJlc3RyaWN0aW9ucyB0cmFuc2xhdGUgdG8gY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIGZvcgoreW91IGlmIHlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgbGlicmFyeSBvciBpZiB5b3UgbW9kaWZ5IGl0LgorCisgIEZvciBleGFtcGxlLCBpZiB5b3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlIGxpYnJhcnksIHdoZXRoZXIgZ3JhdGlzCitvciBmb3IgYSBmZWUsIHlvdSBtdXN0IGdpdmUgdGhlIHJlY2lwaWVudHMgYWxsIHRoZSByaWdodHMgdGhhdCB3ZSBnYXZlCit5b3UuICBZb3UgbXVzdCBtYWtlIHN1cmUgdGhhdCB0aGV5LCB0b28sIHJlY2VpdmUgb3IgY2FuIGdldCB0aGUgc291cmNlCitjb2RlLiAgSWYgeW91IGxpbmsgb3RoZXIgY29kZSB3aXRoIHRoZSBsaWJyYXJ5LCB5b3UgbXVzdCBwcm92aWRlCitjb21wbGV0ZSBvYmplY3QgZmlsZXMgdG8gdGhlIHJlY2lwaWVudHMsIHNvIHRoYXQgdGhleSBjYW4gcmVsaW5rIHRoZW0KK3dpdGggdGhlIGxpYnJhcnkgYWZ0ZXIgbWFraW5nIGNoYW5nZXMgdG8gdGhlIGxpYnJhcnkgYW5kIHJlY29tcGlsaW5nCitpdC4gIEFuZCB5b3UgbXVzdCBzaG93IHRoZW0gdGhlc2UgdGVybXMgc28gdGhleSBrbm93IHRoZWlyIHJpZ2h0cy4KKworICBXZSBwcm90ZWN0IHlvdXIgcmlnaHRzIHdpdGggYSB0d28tc3RlcCBtZXRob2Q6ICgxKSB3ZSBjb3B5cmlnaHQgdGhlCitsaWJyYXJ5LCBhbmQgKDIpIHdlIG9mZmVyIHlvdSB0aGlzIGxpY2Vuc2UsIHdoaWNoIGdpdmVzIHlvdSBsZWdhbAorcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZC9vciBtb2RpZnkgdGhlIGxpYnJhcnkuCisKKyAgVG8gcHJvdGVjdCBlYWNoIGRpc3RyaWJ1dG9yLCB3ZSB3YW50IHRvIG1ha2UgaXQgdmVyeSBjbGVhciB0aGF0Cit0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhlIGZyZWUgbGlicmFyeS4gIEFsc28sIGlmIHRoZSBsaWJyYXJ5IGlzCittb2RpZmllZCBieSBzb21lb25lIGVsc2UgYW5kIHBhc3NlZCBvbiwgdGhlIHJlY2lwaWVudHMgc2hvdWxkIGtub3cKK3RoYXQgd2hhdCB0aGV5IGhhdmUgaXMgbm90IHRoZSBvcmlnaW5hbCB2ZXJzaW9uLCBzbyB0aGF0IHRoZSBvcmlnaW5hbAorYXV0aG9yJ3MgcmVwdXRhdGlvbiB3aWxsIG5vdCBiZSBhZmZlY3RlZCBieSBwcm9ibGVtcyB0aGF0IG1pZ2h0IGJlCitpbnRyb2R1Y2VkIGJ5IG90aGVycy4KKwwKKyAgRmluYWxseSwgc29mdHdhcmUgcGF0ZW50cyBwb3NlIGEgY29uc3RhbnQgdGhyZWF0IHRvIHRoZSBleGlzdGVuY2Ugb2YKK2FueSBmcmVlIHByb2dyYW0uICBXZSB3aXNoIHRvIG1ha2Ugc3VyZSB0aGF0IGEgY29tcGFueSBjYW5ub3QKK2VmZmVjdGl2ZWx5IHJlc3RyaWN0IHRoZSB1c2VycyBvZiBhIGZyZWUgcHJvZ3JhbSBieSBvYnRhaW5pbmcgYQorcmVzdHJpY3RpdmUgbGljZW5zZSBmcm9tIGEgcGF0ZW50IGhvbGRlci4gIFRoZXJlZm9yZSwgd2UgaW5zaXN0IHRoYXQKK2FueSBwYXRlbnQgbGljZW5zZSBvYnRhaW5lZCBmb3IgYSB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5IG11c3QgYmUKK2NvbnNpc3RlbnQgd2l0aCB0aGUgZnVsbCBmcmVlZG9tIG9mIHVzZSBzcGVjaWZpZWQgaW4gdGhpcyBsaWNlbnNlLgorCisgIE1vc3QgR05VIHNvZnR3YXJlLCBpbmNsdWRpbmcgc29tZSBsaWJyYXJpZXMsIGlzIGNvdmVyZWQgYnkgdGhlCitvcmRpbmFyeSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIFRoaXMgbGljZW5zZSwgdGhlIEdOVSBMZXNzZXIKK0dlbmVyYWwgUHVibGljIExpY2Vuc2UsIGFwcGxpZXMgdG8gY2VydGFpbiBkZXNpZ25hdGVkIGxpYnJhcmllcywgYW5kCitpcyBxdWl0ZSBkaWZmZXJlbnQgZnJvbSB0aGUgb3JkaW5hcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIFdlIHVzZQordGhpcyBsaWNlbnNlIGZvciBjZXJ0YWluIGxpYnJhcmllcyBpbiBvcmRlciB0byBwZXJtaXQgbGlua2luZyB0aG9zZQorbGlicmFyaWVzIGludG8gbm9uLWZyZWUgcHJvZ3JhbXMuCisKKyAgV2hlbiBhIHByb2dyYW0gaXMgbGlua2VkIHdpdGggYSBsaWJyYXJ5LCB3aGV0aGVyIHN0YXRpY2FsbHkgb3IgdXNpbmcKK2Egc2hhcmVkIGxpYnJhcnksIHRoZSBjb21iaW5hdGlvbiBvZiB0aGUgdHdvIGlzIGxlZ2FsbHkgc3BlYWtpbmcgYQorY29tYmluZWQgd29yaywgYSBkZXJpdmF0aXZlIG9mIHRoZSBvcmlnaW5hbCBsaWJyYXJ5LiAgVGhlIG9yZGluYXJ5CitHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHRoZXJlZm9yZSBwZXJtaXRzIHN1Y2ggbGlua2luZyBvbmx5IGlmIHRoZQorZW50aXJlIGNvbWJpbmF0aW9uIGZpdHMgaXRzIGNyaXRlcmlhIG9mIGZyZWVkb20uICBUaGUgTGVzc2VyIEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIHBlcm1pdHMgbW9yZSBsYXggY3JpdGVyaWEgZm9yIGxpbmtpbmcgb3RoZXIgY29kZSB3aXRoCit0aGUgbGlicmFyeS4KKworICBXZSBjYWxsIHRoaXMgbGljZW5zZSB0aGUgIkxlc3NlciIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBiZWNhdXNlIGl0Citkb2VzIExlc3MgdG8gcHJvdGVjdCB0aGUgdXNlcidzIGZyZWVkb20gdGhhbiB0aGUgb3JkaW5hcnkgR2VuZXJhbAorUHVibGljIExpY2Vuc2UuICBJdCBhbHNvIHByb3ZpZGVzIG90aGVyIGZyZWUgc29mdHdhcmUgZGV2ZWxvcGVycyBMZXNzCitvZiBhbiBhZHZhbnRhZ2Ugb3ZlciBjb21wZXRpbmcgbm9uLWZyZWUgcHJvZ3JhbXMuICBUaGVzZSBkaXNhZHZhbnRhZ2VzCithcmUgdGhlIHJlYXNvbiB3ZSB1c2UgdGhlIG9yZGluYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1hbnkKK2xpYnJhcmllcy4gIEhvd2V2ZXIsIHRoZSBMZXNzZXIgbGljZW5zZSBwcm92aWRlcyBhZHZhbnRhZ2VzIGluIGNlcnRhaW4KK3NwZWNpYWwgY2lyY3Vtc3RhbmNlcy4KKworICBGb3IgZXhhbXBsZSwgb24gcmFyZSBvY2Nhc2lvbnMsIHRoZXJlIG1heSBiZSBhIHNwZWNpYWwgbmVlZCB0bworZW5jb3VyYWdlIHRoZSB3aWRlc3QgcG9zc2libGUgdXNlIG9mIGEgY2VydGFpbiBsaWJyYXJ5LCBzbyB0aGF0IGl0IGJlY29tZXMKK2EgZGUtZmFjdG8gc3RhbmRhcmQuICBUbyBhY2hpZXZlIHRoaXMsIG5vbi1mcmVlIHByb2dyYW1zIG11c3QgYmUKK2FsbG93ZWQgdG8gdXNlIHRoZSBsaWJyYXJ5LiAgQSBtb3JlIGZyZXF1ZW50IGNhc2UgaXMgdGhhdCBhIGZyZWUKK2xpYnJhcnkgZG9lcyB0aGUgc2FtZSBqb2IgYXMgd2lkZWx5IHVzZWQgbm9uLWZyZWUgbGlicmFyaWVzLiAgSW4gdGhpcworY2FzZSwgdGhlcmUgaXMgbGl0dGxlIHRvIGdhaW4gYnkgbGltaXRpbmcgdGhlIGZyZWUgbGlicmFyeSB0byBmcmVlCitzb2Z0d2FyZSBvbmx5LCBzbyB3ZSB1c2UgdGhlIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorCisgIEluIG90aGVyIGNhc2VzLCBwZXJtaXNzaW9uIHRvIHVzZSBhIHBhcnRpY3VsYXIgbGlicmFyeSBpbiBub24tZnJlZQorcHJvZ3JhbXMgZW5hYmxlcyBhIGdyZWF0ZXIgbnVtYmVyIG9mIHBlb3BsZSB0byB1c2UgYSBsYXJnZSBib2R5IG9mCitmcmVlIHNvZnR3YXJlLiAgRm9yIGV4YW1wbGUsIHBlcm1pc3Npb24gdG8gdXNlIHRoZSBHTlUgQyBMaWJyYXJ5IGluCitub24tZnJlZSBwcm9ncmFtcyBlbmFibGVzIG1hbnkgbW9yZSBwZW9wbGUgdG8gdXNlIHRoZSB3aG9sZSBHTlUKK29wZXJhdGluZyBzeXN0ZW0sIGFzIHdlbGwgYXMgaXRzIHZhcmlhbnQsIHRoZSBHTlUvTGludXggb3BlcmF0aW5nCitzeXN0ZW0uCisKKyAgQWx0aG91Z2ggdGhlIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIExlc3MgcHJvdGVjdGl2ZSBvZiB0aGUKK3VzZXJzJyBmcmVlZG9tLCBpdCBkb2VzIGVuc3VyZSB0aGF0IHRoZSB1c2VyIG9mIGEgcHJvZ3JhbSB0aGF0IGlzCitsaW5rZWQgd2l0aCB0aGUgTGlicmFyeSBoYXMgdGhlIGZyZWVkb20gYW5kIHRoZSB3aGVyZXdpdGhhbCB0byBydW4KK3RoYXQgcHJvZ3JhbSB1c2luZyBhIG1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIExpYnJhcnkuCisKKyAgVGhlIHByZWNpc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQKK21vZGlmaWNhdGlvbiBmb2xsb3cuICBQYXkgY2xvc2UgYXR0ZW50aW9uIHRvIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gYQorIndvcmsgYmFzZWQgb24gdGhlIGxpYnJhcnkiIGFuZCBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgbGlicmFyeSIuICBUaGUKK2Zvcm1lciBjb250YWlucyBjb2RlIGRlcml2ZWQgZnJvbSB0aGUgbGlicmFyeSwgd2hlcmVhcyB0aGUgbGF0dGVyIG11c3QKK2JlIGNvbWJpbmVkIHdpdGggdGhlIGxpYnJhcnkgaW4gb3JkZXIgdG8gcnVuLgorDAorCQkgIEdOVSBMRVNTRVIgR0VORVJBTCBQVUJMSUMgTElDRU5TRQorICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIENPUFlJTkcsIERJU1RSSUJVVElPTiBBTkQgTU9ESUZJQ0FUSU9OCisKKyAgMC4gVGhpcyBMaWNlbnNlIEFncmVlbWVudCBhcHBsaWVzIHRvIGFueSBzb2Z0d2FyZSBsaWJyYXJ5IG9yIG90aGVyCitwcm9ncmFtIHdoaWNoIGNvbnRhaW5zIGEgbm90aWNlIHBsYWNlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlciBvcgorb3RoZXIgYXV0aG9yaXplZCBwYXJ0eSBzYXlpbmcgaXQgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZgordGhpcyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoYWxzbyBjYWxsZWQgInRoaXMgTGljZW5zZSIpLgorRWFjaCBsaWNlbnNlZSBpcyBhZGRyZXNzZWQgYXMgInlvdSIuCisKKyAgQSAibGlicmFyeSIgbWVhbnMgYSBjb2xsZWN0aW9uIG9mIHNvZnR3YXJlIGZ1bmN0aW9ucyBhbmQvb3IgZGF0YQorcHJlcGFyZWQgc28gYXMgdG8gYmUgY29udmVuaWVudGx5IGxpbmtlZCB3aXRoIGFwcGxpY2F0aW9uIHByb2dyYW1zCisod2hpY2ggdXNlIHNvbWUgb2YgdGhvc2UgZnVuY3Rpb25zIGFuZCBkYXRhKSB0byBmb3JtIGV4ZWN1dGFibGVzLgorCisgIFRoZSAiTGlicmFyeSIsIGJlbG93LCByZWZlcnMgdG8gYW55IHN1Y2ggc29mdHdhcmUgbGlicmFyeSBvciB3b3JrCit3aGljaCBoYXMgYmVlbiBkaXN0cmlidXRlZCB1bmRlciB0aGVzZSB0ZXJtcy4gIEEgIndvcmsgYmFzZWQgb24gdGhlCitMaWJyYXJ5IiBtZWFucyBlaXRoZXIgdGhlIExpYnJhcnkgb3IgYW55IGRlcml2YXRpdmUgd29yayB1bmRlcgorY29weXJpZ2h0IGxhdzogdGhhdCBpcyB0byBzYXksIGEgd29yayBjb250YWluaW5nIHRoZSBMaWJyYXJ5IG9yIGEKK3BvcnRpb24gb2YgaXQsIGVpdGhlciB2ZXJiYXRpbSBvciB3aXRoIG1vZGlmaWNhdGlvbnMgYW5kL29yIHRyYW5zbGF0ZWQKK3N0cmFpZ2h0Zm9yd2FyZGx5IGludG8gYW5vdGhlciBsYW5ndWFnZS4gIChIZXJlaW5hZnRlciwgdHJhbnNsYXRpb24gaXMKK2luY2x1ZGVkIHdpdGhvdXQgbGltaXRhdGlvbiBpbiB0aGUgdGVybSAibW9kaWZpY2F0aW9uIi4pCisKKyAgIlNvdXJjZSBjb2RlIiBmb3IgYSB3b3JrIG1lYW5zIHRoZSBwcmVmZXJyZWQgZm9ybSBvZiB0aGUgd29yayBmb3IKK21ha2luZyBtb2RpZmljYXRpb25zIHRvIGl0LiAgRm9yIGEgbGlicmFyeSwgY29tcGxldGUgc291cmNlIGNvZGUgbWVhbnMKK2FsbCB0aGUgc291cmNlIGNvZGUgZm9yIGFsbCBtb2R1bGVzIGl0IGNvbnRhaW5zLCBwbHVzIGFueSBhc3NvY2lhdGVkCitpbnRlcmZhY2UgZGVmaW5pdGlvbiBmaWxlcywgcGx1cyB0aGUgc2NyaXB0cyB1c2VkIHRvIGNvbnRyb2wgY29tcGlsYXRpb24KK2FuZCBpbnN0YWxsYXRpb24gb2YgdGhlIGxpYnJhcnkuCisKKyAgQWN0aXZpdGllcyBvdGhlciB0aGFuIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQgbW9kaWZpY2F0aW9uIGFyZSBub3QKK2NvdmVyZWQgYnkgdGhpcyBMaWNlbnNlOyB0aGV5IGFyZSBvdXRzaWRlIGl0cyBzY29wZS4gIFRoZSBhY3Qgb2YKK3J1bm5pbmcgYSBwcm9ncmFtIHVzaW5nIHRoZSBMaWJyYXJ5IGlzIG5vdCByZXN0cmljdGVkLCBhbmQgb3V0cHV0IGZyb20KK3N1Y2ggYSBwcm9ncmFtIGlzIGNvdmVyZWQgb25seSBpZiBpdHMgY29udGVudHMgY29uc3RpdHV0ZSBhIHdvcmsgYmFzZWQKK29uIHRoZSBMaWJyYXJ5IChpbmRlcGVuZGVudCBvZiB0aGUgdXNlIG9mIHRoZSBMaWJyYXJ5IGluIGEgdG9vbCBmb3IKK3dyaXRpbmcgaXQpLiAgV2hldGhlciB0aGF0IGlzIHRydWUgZGVwZW5kcyBvbiB3aGF0IHRoZSBMaWJyYXJ5IGRvZXMKK2FuZCB3aGF0IHRoZSBwcm9ncmFtIHRoYXQgdXNlcyB0aGUgTGlicmFyeSBkb2VzLgorICAKKyAgMS4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZiB0aGUgTGlicmFyeSdzCitjb21wbGV0ZSBzb3VyY2UgY29kZSBhcyB5b3UgcmVjZWl2ZSBpdCwgaW4gYW55IG1lZGl1bSwgcHJvdmlkZWQgdGhhdAoreW91IGNvbnNwaWN1b3VzbHkgYW5kIGFwcHJvcHJpYXRlbHkgcHVibGlzaCBvbiBlYWNoIGNvcHkgYW4KK2FwcHJvcHJpYXRlIGNvcHlyaWdodCBub3RpY2UgYW5kIGRpc2NsYWltZXIgb2Ygd2FycmFudHk7IGtlZXAgaW50YWN0CithbGwgdGhlIG5vdGljZXMgdGhhdCByZWZlciB0byB0aGlzIExpY2Vuc2UgYW5kIHRvIHRoZSBhYnNlbmNlIG9mIGFueQord2FycmFudHk7IGFuZCBkaXN0cmlidXRlIGEgY29weSBvZiB0aGlzIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUKK0xpYnJhcnkuCisKKyAgWW91IG1heSBjaGFyZ2UgYSBmZWUgZm9yIHRoZSBwaHlzaWNhbCBhY3Qgb2YgdHJhbnNmZXJyaW5nIGEgY29weSwKK2FuZCB5b3UgbWF5IGF0IHlvdXIgb3B0aW9uIG9mZmVyIHdhcnJhbnR5IHByb3RlY3Rpb24gaW4gZXhjaGFuZ2UgZm9yIGEKK2ZlZS4KKwwKKyAgMi4gWW91IG1heSBtb2RpZnkgeW91ciBjb3B5IG9yIGNvcGllcyBvZiB0aGUgTGlicmFyeSBvciBhbnkgcG9ydGlvbgorb2YgaXQsIHRodXMgZm9ybWluZyBhIHdvcmsgYmFzZWQgb24gdGhlIExpYnJhcnksIGFuZCBjb3B5IGFuZAorZGlzdHJpYnV0ZSBzdWNoIG1vZGlmaWNhdGlvbnMgb3Igd29yayB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbiAxCithYm92ZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0IGFsbCBvZiB0aGVzZSBjb25kaXRpb25zOgorCisgICAgYSkgVGhlIG1vZGlmaWVkIHdvcmsgbXVzdCBpdHNlbGYgYmUgYSBzb2Z0d2FyZSBsaWJyYXJ5LgorCisgICAgYikgWW91IG11c3QgY2F1c2UgdGhlIGZpbGVzIG1vZGlmaWVkIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCisgICAgc3RhdGluZyB0aGF0IHlvdSBjaGFuZ2VkIHRoZSBmaWxlcyBhbmQgdGhlIGRhdGUgb2YgYW55IGNoYW5nZS4KKworICAgIGMpIFlvdSBtdXN0IGNhdXNlIHRoZSB3aG9sZSBvZiB0aGUgd29yayB0byBiZSBsaWNlbnNlZCBhdCBubworICAgIGNoYXJnZSB0byBhbGwgdGhpcmQgcGFydGllcyB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLgorCisgICAgZCkgSWYgYSBmYWNpbGl0eSBpbiB0aGUgbW9kaWZpZWQgTGlicmFyeSByZWZlcnMgdG8gYSBmdW5jdGlvbiBvciBhCisgICAgdGFibGUgb2YgZGF0YSB0byBiZSBzdXBwbGllZCBieSBhbiBhcHBsaWNhdGlvbiBwcm9ncmFtIHRoYXQgdXNlcworICAgIHRoZSBmYWNpbGl0eSwgb3RoZXIgdGhhbiBhcyBhbiBhcmd1bWVudCBwYXNzZWQgd2hlbiB0aGUgZmFjaWxpdHkKKyAgICBpcyBpbnZva2VkLCB0aGVuIHlvdSBtdXN0IG1ha2UgYSBnb29kIGZhaXRoIGVmZm9ydCB0byBlbnN1cmUgdGhhdCwKKyAgICBpbiB0aGUgZXZlbnQgYW4gYXBwbGljYXRpb24gZG9lcyBub3Qgc3VwcGx5IHN1Y2ggZnVuY3Rpb24gb3IKKyAgICB0YWJsZSwgdGhlIGZhY2lsaXR5IHN0aWxsIG9wZXJhdGVzLCBhbmQgcGVyZm9ybXMgd2hhdGV2ZXIgcGFydCBvZgorICAgIGl0cyBwdXJwb3NlIHJlbWFpbnMgbWVhbmluZ2Z1bC4KKworICAgIChGb3IgZXhhbXBsZSwgYSBmdW5jdGlvbiBpbiBhIGxpYnJhcnkgdG8gY29tcHV0ZSBzcXVhcmUgcm9vdHMgaGFzCisgICAgYSBwdXJwb3NlIHRoYXQgaXMgZW50aXJlbHkgd2VsbC1kZWZpbmVkIGluZGVwZW5kZW50IG9mIHRoZQorICAgIGFwcGxpY2F0aW9uLiAgVGhlcmVmb3JlLCBTdWJzZWN0aW9uIDJkIHJlcXVpcmVzIHRoYXQgYW55CisgICAgYXBwbGljYXRpb24tc3VwcGxpZWQgZnVuY3Rpb24gb3IgdGFibGUgdXNlZCBieSB0aGlzIGZ1bmN0aW9uIG11c3QKKyAgICBiZSBvcHRpb25hbDogaWYgdGhlIGFwcGxpY2F0aW9uIGRvZXMgbm90IHN1cHBseSBpdCwgdGhlIHNxdWFyZQorICAgIHJvb3QgZnVuY3Rpb24gbXVzdCBzdGlsbCBjb21wdXRlIHNxdWFyZSByb290cy4pCisKK1RoZXNlIHJlcXVpcmVtZW50cyBhcHBseSB0byB0aGUgbW9kaWZpZWQgd29yayBhcyBhIHdob2xlLiAgSWYKK2lkZW50aWZpYWJsZSBzZWN0aW9ucyBvZiB0aGF0IHdvcmsgYXJlIG5vdCBkZXJpdmVkIGZyb20gdGhlIExpYnJhcnksCithbmQgY2FuIGJlIHJlYXNvbmFibHkgY29uc2lkZXJlZCBpbmRlcGVuZGVudCBhbmQgc2VwYXJhdGUgd29ya3MgaW4KK3RoZW1zZWx2ZXMsIHRoZW4gdGhpcyBMaWNlbnNlLCBhbmQgaXRzIHRlcm1zLCBkbyBub3QgYXBwbHkgdG8gdGhvc2UKK3NlY3Rpb25zIHdoZW4geW91IGRpc3RyaWJ1dGUgdGhlbSBhcyBzZXBhcmF0ZSB3b3Jrcy4gIEJ1dCB3aGVuIHlvdQorZGlzdHJpYnV0ZSB0aGUgc2FtZSBzZWN0aW9ucyBhcyBwYXJ0IG9mIGEgd2hvbGUgd2hpY2ggaXMgYSB3b3JrIGJhc2VkCitvbiB0aGUgTGlicmFyeSwgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd2hvbGUgbXVzdCBiZSBvbiB0aGUgdGVybXMgb2YKK3RoaXMgTGljZW5zZSwgd2hvc2UgcGVybWlzc2lvbnMgZm9yIG90aGVyIGxpY2Vuc2VlcyBleHRlbmQgdG8gdGhlCitlbnRpcmUgd2hvbGUsIGFuZCB0aHVzIHRvIGVhY2ggYW5kIGV2ZXJ5IHBhcnQgcmVnYXJkbGVzcyBvZiB3aG8gd3JvdGUKK2l0LgorCitUaHVzLCBpdCBpcyBub3QgdGhlIGludGVudCBvZiB0aGlzIHNlY3Rpb24gdG8gY2xhaW0gcmlnaHRzIG9yIGNvbnRlc3QKK3lvdXIgcmlnaHRzIHRvIHdvcmsgd3JpdHRlbiBlbnRpcmVseSBieSB5b3U7IHJhdGhlciwgdGhlIGludGVudCBpcyB0bworZXhlcmNpc2UgdGhlIHJpZ2h0IHRvIGNvbnRyb2wgdGhlIGRpc3RyaWJ1dGlvbiBvZiBkZXJpdmF0aXZlIG9yCitjb2xsZWN0aXZlIHdvcmtzIGJhc2VkIG9uIHRoZSBMaWJyYXJ5LgorCitJbiBhZGRpdGlvbiwgbWVyZSBhZ2dyZWdhdGlvbiBvZiBhbm90aGVyIHdvcmsgbm90IGJhc2VkIG9uIHRoZSBMaWJyYXJ5Cit3aXRoIHRoZSBMaWJyYXJ5IChvciB3aXRoIGEgd29yayBiYXNlZCBvbiB0aGUgTGlicmFyeSkgb24gYSB2b2x1bWUgb2YKK2Egc3RvcmFnZSBvciBkaXN0cmlidXRpb24gbWVkaXVtIGRvZXMgbm90IGJyaW5nIHRoZSBvdGhlciB3b3JrIHVuZGVyCit0aGUgc2NvcGUgb2YgdGhpcyBMaWNlbnNlLgorCisgIDMuIFlvdSBtYXkgb3B0IHRvIGFwcGx5IHRoZSB0ZXJtcyBvZiB0aGUgb3JkaW5hcnkgR05VIEdlbmVyYWwgUHVibGljCitMaWNlbnNlIGluc3RlYWQgb2YgdGhpcyBMaWNlbnNlIHRvIGEgZ2l2ZW4gY29weSBvZiB0aGUgTGlicmFyeS4gIFRvIGRvCit0aGlzLCB5b3UgbXVzdCBhbHRlciBhbGwgdGhlIG5vdGljZXMgdGhhdCByZWZlciB0byB0aGlzIExpY2Vuc2UsIHNvCit0aGF0IHRoZXkgcmVmZXIgdG8gdGhlIG9yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIsCitpbnN0ZWFkIG9mIHRvIHRoaXMgTGljZW5zZS4gIChJZiBhIG5ld2VyIHZlcnNpb24gdGhhbiB2ZXJzaW9uIDIgb2YgdGhlCitvcmRpbmFyeSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBoYXMgYXBwZWFyZWQsIHRoZW4geW91IGNhbiBzcGVjaWZ5Cit0aGF0IHZlcnNpb24gaW5zdGVhZCBpZiB5b3Ugd2lzaC4pICBEbyBub3QgbWFrZSBhbnkgb3RoZXIgY2hhbmdlIGluCit0aGVzZSBub3RpY2VzLgorDAorICBPbmNlIHRoaXMgY2hhbmdlIGlzIG1hZGUgaW4gYSBnaXZlbiBjb3B5LCBpdCBpcyBpcnJldmVyc2libGUgZm9yCit0aGF0IGNvcHksIHNvIHRoZSBvcmRpbmFyeSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcHBsaWVzIHRvIGFsbAorc3Vic2VxdWVudCBjb3BpZXMgYW5kIGRlcml2YXRpdmUgd29ya3MgbWFkZSBmcm9tIHRoYXQgY29weS4KKworICBUaGlzIG9wdGlvbiBpcyB1c2VmdWwgd2hlbiB5b3Ugd2lzaCB0byBjb3B5IHBhcnQgb2YgdGhlIGNvZGUgb2YKK3RoZSBMaWJyYXJ5IGludG8gYSBwcm9ncmFtIHRoYXQgaXMgbm90IGEgbGlicmFyeS4KKworICA0LiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIExpYnJhcnkgKG9yIGEgcG9ydGlvbiBvcgorZGVyaXZhdGl2ZSBvZiBpdCwgdW5kZXIgU2VjdGlvbiAyKSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0KK3VuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIHByb3ZpZGVkIHRoYXQgeW91IGFjY29tcGFueQoraXQgd2l0aCB0aGUgY29tcGxldGUgY29ycmVzcG9uZGluZyBtYWNoaW5lLXJlYWRhYmxlIHNvdXJjZSBjb2RlLCB3aGljaAorbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBvbiBhCittZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2UuCisKKyAgSWYgZGlzdHJpYnV0aW9uIG9mIG9iamVjdCBjb2RlIGlzIG1hZGUgYnkgb2ZmZXJpbmcgYWNjZXNzIHRvIGNvcHkKK2Zyb20gYSBkZXNpZ25hdGVkIHBsYWNlLCB0aGVuIG9mZmVyaW5nIGVxdWl2YWxlbnQgYWNjZXNzIHRvIGNvcHkgdGhlCitzb3VyY2UgY29kZSBmcm9tIHRoZSBzYW1lIHBsYWNlIHNhdGlzZmllcyB0aGUgcmVxdWlyZW1lbnQgdG8KK2Rpc3RyaWJ1dGUgdGhlIHNvdXJjZSBjb2RlLCBldmVuIHRob3VnaCB0aGlyZCBwYXJ0aWVzIGFyZSBub3QKK2NvbXBlbGxlZCB0byBjb3B5IHRoZSBzb3VyY2UgYWxvbmcgd2l0aCB0aGUgb2JqZWN0IGNvZGUuCisKKyAgNS4gQSBwcm9ncmFtIHRoYXQgY29udGFpbnMgbm8gZGVyaXZhdGl2ZSBvZiBhbnkgcG9ydGlvbiBvZiB0aGUKK0xpYnJhcnksIGJ1dCBpcyBkZXNpZ25lZCB0byB3b3JrIHdpdGggdGhlIExpYnJhcnkgYnkgYmVpbmcgY29tcGlsZWQgb3IKK2xpbmtlZCB3aXRoIGl0LCBpcyBjYWxsZWQgYSAid29yayB0aGF0IHVzZXMgdGhlIExpYnJhcnkiLiAgU3VjaCBhCit3b3JrLCBpbiBpc29sYXRpb24sIGlzIG5vdCBhIGRlcml2YXRpdmUgd29yayBvZiB0aGUgTGlicmFyeSwgYW5kCit0aGVyZWZvcmUgZmFsbHMgb3V0c2lkZSB0aGUgc2NvcGUgb2YgdGhpcyBMaWNlbnNlLgorCisgIEhvd2V2ZXIsIGxpbmtpbmcgYSAid29yayB0aGF0IHVzZXMgdGhlIExpYnJhcnkiIHdpdGggdGhlIExpYnJhcnkKK2NyZWF0ZXMgYW4gZXhlY3V0YWJsZSB0aGF0IGlzIGEgZGVyaXZhdGl2ZSBvZiB0aGUgTGlicmFyeSAoYmVjYXVzZSBpdAorY29udGFpbnMgcG9ydGlvbnMgb2YgdGhlIExpYnJhcnkpLCByYXRoZXIgdGhhbiBhICJ3b3JrIHRoYXQgdXNlcyB0aGUKK2xpYnJhcnkiLiAgVGhlIGV4ZWN1dGFibGUgaXMgdGhlcmVmb3JlIGNvdmVyZWQgYnkgdGhpcyBMaWNlbnNlLgorU2VjdGlvbiA2IHN0YXRlcyB0ZXJtcyBmb3IgZGlzdHJpYnV0aW9uIG9mIHN1Y2ggZXhlY3V0YWJsZXMuCisKKyAgV2hlbiBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgTGlicmFyeSIgdXNlcyBtYXRlcmlhbCBmcm9tIGEgaGVhZGVyIGZpbGUKK3RoYXQgaXMgcGFydCBvZiB0aGUgTGlicmFyeSwgdGhlIG9iamVjdCBjb2RlIGZvciB0aGUgd29yayBtYXkgYmUgYQorZGVyaXZhdGl2ZSB3b3JrIG9mIHRoZSBMaWJyYXJ5IGV2ZW4gdGhvdWdoIHRoZSBzb3VyY2UgY29kZSBpcyBub3QuCitXaGV0aGVyIHRoaXMgaXMgdHJ1ZSBpcyBlc3BlY2lhbGx5IHNpZ25pZmljYW50IGlmIHRoZSB3b3JrIGNhbiBiZQorbGlua2VkIHdpdGhvdXQgdGhlIExpYnJhcnksIG9yIGlmIHRoZSB3b3JrIGlzIGl0c2VsZiBhIGxpYnJhcnkuICBUaGUKK3RocmVzaG9sZCBmb3IgdGhpcyB0byBiZSB0cnVlIGlzIG5vdCBwcmVjaXNlbHkgZGVmaW5lZCBieSBsYXcuCisKKyAgSWYgc3VjaCBhbiBvYmplY3QgZmlsZSB1c2VzIG9ubHkgbnVtZXJpY2FsIHBhcmFtZXRlcnMsIGRhdGEKK3N0cnVjdHVyZSBsYXlvdXRzIGFuZCBhY2Nlc3NvcnMsIGFuZCBzbWFsbCBtYWNyb3MgYW5kIHNtYWxsIGlubGluZQorZnVuY3Rpb25zICh0ZW4gbGluZXMgb3IgbGVzcyBpbiBsZW5ndGgpLCB0aGVuIHRoZSB1c2Ugb2YgdGhlIG9iamVjdAorZmlsZSBpcyB1bnJlc3RyaWN0ZWQsIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBpcyBsZWdhbGx5IGEgZGVyaXZhdGl2ZQord29yay4gIChFeGVjdXRhYmxlcyBjb250YWluaW5nIHRoaXMgb2JqZWN0IGNvZGUgcGx1cyBwb3J0aW9ucyBvZiB0aGUKK0xpYnJhcnkgd2lsbCBzdGlsbCBmYWxsIHVuZGVyIFNlY3Rpb24gNi4pCisKKyAgT3RoZXJ3aXNlLCBpZiB0aGUgd29yayBpcyBhIGRlcml2YXRpdmUgb2YgdGhlIExpYnJhcnksIHlvdSBtYXkKK2Rpc3RyaWJ1dGUgdGhlIG9iamVjdCBjb2RlIGZvciB0aGUgd29yayB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbiA2LgorQW55IGV4ZWN1dGFibGVzIGNvbnRhaW5pbmcgdGhhdCB3b3JrIGFsc28gZmFsbCB1bmRlciBTZWN0aW9uIDYsCit3aGV0aGVyIG9yIG5vdCB0aGV5IGFyZSBsaW5rZWQgZGlyZWN0bHkgd2l0aCB0aGUgTGlicmFyeSBpdHNlbGYuCisMCisgIDYuIEFzIGFuIGV4Y2VwdGlvbiB0byB0aGUgU2VjdGlvbnMgYWJvdmUsIHlvdSBtYXkgYWxzbyBjb21iaW5lIG9yCitsaW5rIGEgIndvcmsgdGhhdCB1c2VzIHRoZSBMaWJyYXJ5IiB3aXRoIHRoZSBMaWJyYXJ5IHRvIHByb2R1Y2UgYQord29yayBjb250YWluaW5nIHBvcnRpb25zIG9mIHRoZSBMaWJyYXJ5LCBhbmQgZGlzdHJpYnV0ZSB0aGF0IHdvcmsKK3VuZGVyIHRlcm1zIG9mIHlvdXIgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHRoZSB0ZXJtcyBwZXJtaXQKK21vZGlmaWNhdGlvbiBvZiB0aGUgd29yayBmb3IgdGhlIGN1c3RvbWVyJ3Mgb3duIHVzZSBhbmQgcmV2ZXJzZQorZW5naW5lZXJpbmcgZm9yIGRlYnVnZ2luZyBzdWNoIG1vZGlmaWNhdGlvbnMuCisKKyAgWW91IG11c3QgZ2l2ZSBwcm9taW5lbnQgbm90aWNlIHdpdGggZWFjaCBjb3B5IG9mIHRoZSB3b3JrIHRoYXQgdGhlCitMaWJyYXJ5IGlzIHVzZWQgaW4gaXQgYW5kIHRoYXQgdGhlIExpYnJhcnkgYW5kIGl0cyB1c2UgYXJlIGNvdmVyZWQgYnkKK3RoaXMgTGljZW5zZS4gIFlvdSBtdXN0IHN1cHBseSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlLiAgSWYgdGhlIHdvcmsKK2R1cmluZyBleGVjdXRpb24gZGlzcGxheXMgY29weXJpZ2h0IG5vdGljZXMsIHlvdSBtdXN0IGluY2x1ZGUgdGhlCitjb3B5cmlnaHQgbm90aWNlIGZvciB0aGUgTGlicmFyeSBhbW9uZyB0aGVtLCBhcyB3ZWxsIGFzIGEgcmVmZXJlbmNlCitkaXJlY3RpbmcgdGhlIHVzZXIgdG8gdGhlIGNvcHkgb2YgdGhpcyBMaWNlbnNlLiAgQWxzbywgeW91IG11c3QgZG8gb25lCitvZiB0aGVzZSB0aGluZ3M6CisKKyAgICBhKSBBY2NvbXBhbnkgdGhlIHdvcmsgd2l0aCB0aGUgY29tcGxldGUgY29ycmVzcG9uZGluZworICAgIG1hY2hpbmUtcmVhZGFibGUgc291cmNlIGNvZGUgZm9yIHRoZSBMaWJyYXJ5IGluY2x1ZGluZyB3aGF0ZXZlcgorICAgIGNoYW5nZXMgd2VyZSB1c2VkIGluIHRoZSB3b3JrICh3aGljaCBtdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyCisgICAgU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSk7IGFuZCwgaWYgdGhlIHdvcmsgaXMgYW4gZXhlY3V0YWJsZSBsaW5rZWQKKyAgICB3aXRoIHRoZSBMaWJyYXJ5LCB3aXRoIHRoZSBjb21wbGV0ZSBtYWNoaW5lLXJlYWRhYmxlICJ3b3JrIHRoYXQKKyAgICB1c2VzIHRoZSBMaWJyYXJ5IiwgYXMgb2JqZWN0IGNvZGUgYW5kL29yIHNvdXJjZSBjb2RlLCBzbyB0aGF0IHRoZQorICAgIHVzZXIgY2FuIG1vZGlmeSB0aGUgTGlicmFyeSBhbmQgdGhlbiByZWxpbmsgdG8gcHJvZHVjZSBhIG1vZGlmaWVkCisgICAgZXhlY3V0YWJsZSBjb250YWluaW5nIHRoZSBtb2RpZmllZCBMaWJyYXJ5LiAgKEl0IGlzIHVuZGVyc3Rvb2QKKyAgICB0aGF0IHRoZSB1c2VyIHdobyBjaGFuZ2VzIHRoZSBjb250ZW50cyBvZiBkZWZpbml0aW9ucyBmaWxlcyBpbiB0aGUKKyAgICBMaWJyYXJ5IHdpbGwgbm90IG5lY2Vzc2FyaWx5IGJlIGFibGUgdG8gcmVjb21waWxlIHRoZSBhcHBsaWNhdGlvbgorICAgIHRvIHVzZSB0aGUgbW9kaWZpZWQgZGVmaW5pdGlvbnMuKQorCisgICAgYikgVXNlIGEgc3VpdGFibGUgc2hhcmVkIGxpYnJhcnkgbWVjaGFuaXNtIGZvciBsaW5raW5nIHdpdGggdGhlCisgICAgTGlicmFyeS4gIEEgc3VpdGFibGUgbWVjaGFuaXNtIGlzIG9uZSB0aGF0ICgxKSB1c2VzIGF0IHJ1biB0aW1lIGEKKyAgICBjb3B5IG9mIHRoZSBsaWJyYXJ5IGFscmVhZHkgcHJlc2VudCBvbiB0aGUgdXNlcidzIGNvbXB1dGVyIHN5c3RlbSwKKyAgICByYXRoZXIgdGhhbiBjb3B5aW5nIGxpYnJhcnkgZnVuY3Rpb25zIGludG8gdGhlIGV4ZWN1dGFibGUsIGFuZCAoMikKKyAgICB3aWxsIG9wZXJhdGUgcHJvcGVybHkgd2l0aCBhIG1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIGxpYnJhcnksIGlmCisgICAgdGhlIHVzZXIgaW5zdGFsbHMgb25lLCBhcyBsb25nIGFzIHRoZSBtb2RpZmllZCB2ZXJzaW9uIGlzCisgICAgaW50ZXJmYWNlLWNvbXBhdGlibGUgd2l0aCB0aGUgdmVyc2lvbiB0aGF0IHRoZSB3b3JrIHdhcyBtYWRlIHdpdGguCisKKyAgICBjKSBBY2NvbXBhbnkgdGhlIHdvcmsgd2l0aCBhIHdyaXR0ZW4gb2ZmZXIsIHZhbGlkIGZvciBhdAorICAgIGxlYXN0IHRocmVlIHllYXJzLCB0byBnaXZlIHRoZSBzYW1lIHVzZXIgdGhlIG1hdGVyaWFscworICAgIHNwZWNpZmllZCBpbiBTdWJzZWN0aW9uIDZhLCBhYm92ZSwgZm9yIGEgY2hhcmdlIG5vIG1vcmUKKyAgICB0aGFuIHRoZSBjb3N0IG9mIHBlcmZvcm1pbmcgdGhpcyBkaXN0cmlidXRpb24uCisKKyAgICBkKSBJZiBkaXN0cmlidXRpb24gb2YgdGhlIHdvcmsgaXMgbWFkZSBieSBvZmZlcmluZyBhY2Nlc3MgdG8gY29weQorICAgIGZyb20gYSBkZXNpZ25hdGVkIHBsYWNlLCBvZmZlciBlcXVpdmFsZW50IGFjY2VzcyB0byBjb3B5IHRoZSBhYm92ZQorICAgIHNwZWNpZmllZCBtYXRlcmlhbHMgZnJvbSB0aGUgc2FtZSBwbGFjZS4KKworICAgIGUpIFZlcmlmeSB0aGF0IHRoZSB1c2VyIGhhcyBhbHJlYWR5IHJlY2VpdmVkIGEgY29weSBvZiB0aGVzZQorICAgIG1hdGVyaWFscyBvciB0aGF0IHlvdSBoYXZlIGFscmVhZHkgc2VudCB0aGlzIHVzZXIgYSBjb3B5LgorCisgIEZvciBhbiBleGVjdXRhYmxlLCB0aGUgcmVxdWlyZWQgZm9ybSBvZiB0aGUgIndvcmsgdGhhdCB1c2VzIHRoZQorTGlicmFyeSIgbXVzdCBpbmNsdWRlIGFueSBkYXRhIGFuZCB1dGlsaXR5IHByb2dyYW1zIG5lZWRlZCBmb3IKK3JlcHJvZHVjaW5nIHRoZSBleGVjdXRhYmxlIGZyb20gaXQuICBIb3dldmVyLCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uLAordGhlIG1hdGVyaWFscyB0byBiZSBkaXN0cmlidXRlZCBuZWVkIG5vdCBpbmNsdWRlIGFueXRoaW5nIHRoYXQgaXMKK25vcm1hbGx5IGRpc3RyaWJ1dGVkIChpbiBlaXRoZXIgc291cmNlIG9yIGJpbmFyeSBmb3JtKSB3aXRoIHRoZSBtYWpvcgorY29tcG9uZW50cyAoY29tcGlsZXIsIGtlcm5lbCwgYW5kIHNvIG9uKSBvZiB0aGUgb3BlcmF0aW5nIHN5c3RlbSBvbgord2hpY2ggdGhlIGV4ZWN1dGFibGUgcnVucywgdW5sZXNzIHRoYXQgY29tcG9uZW50IGl0c2VsZiBhY2NvbXBhbmllcwordGhlIGV4ZWN1dGFibGUuCisKKyAgSXQgbWF5IGhhcHBlbiB0aGF0IHRoaXMgcmVxdWlyZW1lbnQgY29udHJhZGljdHMgdGhlIGxpY2Vuc2UKK3Jlc3RyaWN0aW9ucyBvZiBvdGhlciBwcm9wcmlldGFyeSBsaWJyYXJpZXMgdGhhdCBkbyBub3Qgbm9ybWFsbHkKK2FjY29tcGFueSB0aGUgb3BlcmF0aW5nIHN5c3RlbS4gIFN1Y2ggYSBjb250cmFkaWN0aW9uIG1lYW5zIHlvdSBjYW5ub3QKK3VzZSBib3RoIHRoZW0gYW5kIHRoZSBMaWJyYXJ5IHRvZ2V0aGVyIGluIGFuIGV4ZWN1dGFibGUgdGhhdCB5b3UKK2Rpc3RyaWJ1dGUuCisMCisgIDcuIFlvdSBtYXkgcGxhY2UgbGlicmFyeSBmYWNpbGl0aWVzIHRoYXQgYXJlIGEgd29yayBiYXNlZCBvbiB0aGUKK0xpYnJhcnkgc2lkZS1ieS1zaWRlIGluIGEgc2luZ2xlIGxpYnJhcnkgdG9nZXRoZXIgd2l0aCBvdGhlciBsaWJyYXJ5CitmYWNpbGl0aWVzIG5vdCBjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgc3VjaCBhIGNvbWJpbmVkCitsaWJyYXJ5LCBwcm92aWRlZCB0aGF0IHRoZSBzZXBhcmF0ZSBkaXN0cmlidXRpb24gb2YgdGhlIHdvcmsgYmFzZWQgb24KK3RoZSBMaWJyYXJ5IGFuZCBvZiB0aGUgb3RoZXIgbGlicmFyeSBmYWNpbGl0aWVzIGlzIG90aGVyd2lzZQorcGVybWl0dGVkLCBhbmQgcHJvdmlkZWQgdGhhdCB5b3UgZG8gdGhlc2UgdHdvIHRoaW5nczoKKworICAgIGEpIEFjY29tcGFueSB0aGUgY29tYmluZWQgbGlicmFyeSB3aXRoIGEgY29weSBvZiB0aGUgc2FtZSB3b3JrCisgICAgYmFzZWQgb24gdGhlIExpYnJhcnksIHVuY29tYmluZWQgd2l0aCBhbnkgb3RoZXIgbGlicmFyeQorICAgIGZhY2lsaXRpZXMuICBUaGlzIG11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICAgIFNlY3Rpb25zIGFib3ZlLgorCisgICAgYikgR2l2ZSBwcm9taW5lbnQgbm90aWNlIHdpdGggdGhlIGNvbWJpbmVkIGxpYnJhcnkgb2YgdGhlIGZhY3QKKyAgICB0aGF0IHBhcnQgb2YgaXQgaXMgYSB3b3JrIGJhc2VkIG9uIHRoZSBMaWJyYXJ5LCBhbmQgZXhwbGFpbmluZworICAgIHdoZXJlIHRvIGZpbmQgdGhlIGFjY29tcGFueWluZyB1bmNvbWJpbmVkIGZvcm0gb2YgdGhlIHNhbWUgd29yay4KKworICA4LiBZb3UgbWF5IG5vdCBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2UsIGxpbmsgd2l0aCwgb3IgZGlzdHJpYnV0ZQordGhlIExpYnJhcnkgZXhjZXB0IGFzIGV4cHJlc3NseSBwcm92aWRlZCB1bmRlciB0aGlzIExpY2Vuc2UuICBBbnkKK2F0dGVtcHQgb3RoZXJ3aXNlIHRvIGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSwgbGluayB3aXRoLCBvcgorZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSBpcyB2b2lkLCBhbmQgd2lsbCBhdXRvbWF0aWNhbGx5IHRlcm1pbmF0ZSB5b3VyCityaWdodHMgdW5kZXIgdGhpcyBMaWNlbnNlLiAgSG93ZXZlciwgcGFydGllcyB3aG8gaGF2ZSByZWNlaXZlZCBjb3BpZXMsCitvciByaWdodHMsIGZyb20geW91IHVuZGVyIHRoaXMgTGljZW5zZSB3aWxsIG5vdCBoYXZlIHRoZWlyIGxpY2Vuc2VzCit0ZXJtaW5hdGVkIHNvIGxvbmcgYXMgc3VjaCBwYXJ0aWVzIHJlbWFpbiBpbiBmdWxsIGNvbXBsaWFuY2UuCisKKyAgOS4gWW91IGFyZSBub3QgcmVxdWlyZWQgdG8gYWNjZXB0IHRoaXMgTGljZW5zZSwgc2luY2UgeW91IGhhdmUgbm90CitzaWduZWQgaXQuICBIb3dldmVyLCBub3RoaW5nIGVsc2UgZ3JhbnRzIHlvdSBwZXJtaXNzaW9uIHRvIG1vZGlmeSBvcgorZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSBvciBpdHMgZGVyaXZhdGl2ZSB3b3Jrcy4gIFRoZXNlIGFjdGlvbnMgYXJlCitwcm9oaWJpdGVkIGJ5IGxhdyBpZiB5b3UgZG8gbm90IGFjY2VwdCB0aGlzIExpY2Vuc2UuICBUaGVyZWZvcmUsIGJ5Cittb2RpZnlpbmcgb3IgZGlzdHJpYnV0aW5nIHRoZSBMaWJyYXJ5IChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKK0xpYnJhcnkpLCB5b3UgaW5kaWNhdGUgeW91ciBhY2NlcHRhbmNlIG9mIHRoaXMgTGljZW5zZSB0byBkbyBzbywgYW5kCithbGwgaXRzIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpbmcgb3IgbW9kaWZ5aW5nCit0aGUgTGlicmFyeSBvciB3b3JrcyBiYXNlZCBvbiBpdC4KKworICAxMC4gRWFjaCB0aW1lIHlvdSByZWRpc3RyaWJ1dGUgdGhlIExpYnJhcnkgKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQorTGlicmFyeSksIHRoZSByZWNpcGllbnQgYXV0b21hdGljYWxseSByZWNlaXZlcyBhIGxpY2Vuc2UgZnJvbSB0aGUKK29yaWdpbmFsIGxpY2Vuc29yIHRvIGNvcHksIGRpc3RyaWJ1dGUsIGxpbmsgd2l0aCBvciBtb2RpZnkgdGhlIExpYnJhcnkKK3N1YmplY3QgdG8gdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBZb3UgbWF5IG5vdCBpbXBvc2UgYW55IGZ1cnRoZXIKK3Jlc3RyaWN0aW9ucyBvbiB0aGUgcmVjaXBpZW50cycgZXhlcmNpc2Ugb2YgdGhlIHJpZ2h0cyBncmFudGVkIGhlcmVpbi4KK1lvdSBhcmUgbm90IHJlc3BvbnNpYmxlIGZvciBlbmZvcmNpbmcgY29tcGxpYW5jZSBieSB0aGlyZCBwYXJ0aWVzIHdpdGgKK3RoaXMgTGljZW5zZS4KKwwKKyAgMTEuIElmLCBhcyBhIGNvbnNlcXVlbmNlIG9mIGEgY291cnQganVkZ21lbnQgb3IgYWxsZWdhdGlvbiBvZiBwYXRlbnQKK2luZnJpbmdlbWVudCBvciBmb3IgYW55IG90aGVyIHJlYXNvbiAobm90IGxpbWl0ZWQgdG8gcGF0ZW50IGlzc3VlcyksCitjb25kaXRpb25zIGFyZSBpbXBvc2VkIG9uIHlvdSAod2hldGhlciBieSBjb3VydCBvcmRlciwgYWdyZWVtZW50IG9yCitvdGhlcndpc2UpIHRoYXQgY29udHJhZGljdCB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UsIHRoZXkgZG8gbm90CitleGN1c2UgeW91IGZyb20gdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLiAgSWYgeW91IGNhbm5vdAorZGlzdHJpYnV0ZSBzbyBhcyB0byBzYXRpc2Z5IHNpbXVsdGFuZW91c2x5IHlvdXIgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcworTGljZW5zZSBhbmQgYW55IG90aGVyIHBlcnRpbmVudCBvYmxpZ2F0aW9ucywgdGhlbiBhcyBhIGNvbnNlcXVlbmNlIHlvdQorbWF5IG5vdCBkaXN0cmlidXRlIHRoZSBMaWJyYXJ5IGF0IGFsbC4gIEZvciBleGFtcGxlLCBpZiBhIHBhdGVudAorbGljZW5zZSB3b3VsZCBub3QgcGVybWl0IHJveWFsdHktZnJlZSByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgTGlicmFyeSBieQorYWxsIHRob3NlIHdobyByZWNlaXZlIGNvcGllcyBkaXJlY3RseSBvciBpbmRpcmVjdGx5IHRocm91Z2ggeW91LCB0aGVuCit0aGUgb25seSB3YXkgeW91IGNvdWxkIHNhdGlzZnkgYm90aCBpdCBhbmQgdGhpcyBMaWNlbnNlIHdvdWxkIGJlIHRvCityZWZyYWluIGVudGlyZWx5IGZyb20gZGlzdHJpYnV0aW9uIG9mIHRoZSBMaWJyYXJ5LgorCitJZiBhbnkgcG9ydGlvbiBvZiB0aGlzIHNlY3Rpb24gaXMgaGVsZCBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYW55CitwYXJ0aWN1bGFyIGNpcmN1bXN0YW5jZSwgdGhlIGJhbGFuY2Ugb2YgdGhlIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gYXBwbHksCithbmQgdGhlIHNlY3Rpb24gYXMgYSB3aG9sZSBpcyBpbnRlbmRlZCB0byBhcHBseSBpbiBvdGhlciBjaXJjdW1zdGFuY2VzLgorCitJdCBpcyBub3QgdGhlIHB1cnBvc2Ugb2YgdGhpcyBzZWN0aW9uIHRvIGluZHVjZSB5b3UgdG8gaW5mcmluZ2UgYW55CitwYXRlbnRzIG9yIG90aGVyIHByb3BlcnR5IHJpZ2h0IGNsYWltcyBvciB0byBjb250ZXN0IHZhbGlkaXR5IG9mIGFueQorc3VjaCBjbGFpbXM7IHRoaXMgc2VjdGlvbiBoYXMgdGhlIHNvbGUgcHVycG9zZSBvZiBwcm90ZWN0aW5nIHRoZQoraW50ZWdyaXR5IG9mIHRoZSBmcmVlIHNvZnR3YXJlIGRpc3RyaWJ1dGlvbiBzeXN0ZW0gd2hpY2ggaXMKK2ltcGxlbWVudGVkIGJ5IHB1YmxpYyBsaWNlbnNlIHByYWN0aWNlcy4gIE1hbnkgcGVvcGxlIGhhdmUgbWFkZQorZ2VuZXJvdXMgY29udHJpYnV0aW9ucyB0byB0aGUgd2lkZSByYW5nZSBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZAordGhyb3VnaCB0aGF0IHN5c3RlbSBpbiByZWxpYW5jZSBvbiBjb25zaXN0ZW50IGFwcGxpY2F0aW9uIG9mIHRoYXQKK3N5c3RlbTsgaXQgaXMgdXAgdG8gdGhlIGF1dGhvci9kb25vciB0byBkZWNpZGUgaWYgaGUgb3Igc2hlIGlzIHdpbGxpbmcKK3RvIGRpc3RyaWJ1dGUgc29mdHdhcmUgdGhyb3VnaCBhbnkgb3RoZXIgc3lzdGVtIGFuZCBhIGxpY2Vuc2VlIGNhbm5vdAoraW1wb3NlIHRoYXQgY2hvaWNlLgorCitUaGlzIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gbWFrZSB0aG9yb3VnaGx5IGNsZWFyIHdoYXQgaXMgYmVsaWV2ZWQgdG8KK2JlIGEgY29uc2VxdWVuY2Ugb2YgdGhlIHJlc3Qgb2YgdGhpcyBMaWNlbnNlLgorCisgIDEyLiBJZiB0aGUgZGlzdHJpYnV0aW9uIGFuZC9vciB1c2Ugb2YgdGhlIExpYnJhcnkgaXMgcmVzdHJpY3RlZCBpbgorY2VydGFpbiBjb3VudHJpZXMgZWl0aGVyIGJ5IHBhdGVudHMgb3IgYnkgY29weXJpZ2h0ZWQgaW50ZXJmYWNlcywgdGhlCitvcmlnaW5hbCBjb3B5cmlnaHQgaG9sZGVyIHdobyBwbGFjZXMgdGhlIExpYnJhcnkgdW5kZXIgdGhpcyBMaWNlbnNlIG1heSBhZGQKK2FuIGV4cGxpY2l0IGdlb2dyYXBoaWNhbCBkaXN0cmlidXRpb24gbGltaXRhdGlvbiBleGNsdWRpbmcgdGhvc2UgY291bnRyaWVzLAorc28gdGhhdCBkaXN0cmlidXRpb24gaXMgcGVybWl0dGVkIG9ubHkgaW4gb3IgYW1vbmcgY291bnRyaWVzIG5vdCB0aHVzCitleGNsdWRlZC4gIEluIHN1Y2ggY2FzZSwgdGhpcyBMaWNlbnNlIGluY29ycG9yYXRlcyB0aGUgbGltaXRhdGlvbiBhcyBpZgord3JpdHRlbiBpbiB0aGUgYm9keSBvZiB0aGlzIExpY2Vuc2UuCisKKyAgMTMuIFRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gbWF5IHB1Ymxpc2ggcmV2aXNlZCBhbmQvb3IgbmV3Cit2ZXJzaW9ucyBvZiB0aGUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZnJvbSB0aW1lIHRvIHRpbWUuCitTdWNoIG5ldyB2ZXJzaW9ucyB3aWxsIGJlIHNpbWlsYXIgaW4gc3Bpcml0IHRvIHRoZSBwcmVzZW50IHZlcnNpb24sCitidXQgbWF5IGRpZmZlciBpbiBkZXRhaWwgdG8gYWRkcmVzcyBuZXcgcHJvYmxlbXMgb3IgY29uY2VybnMuCisKK0VhY2ggdmVyc2lvbiBpcyBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiAgSWYgdGhlIExpYnJhcnkKK3NwZWNpZmllcyBhIHZlcnNpb24gbnVtYmVyIG9mIHRoaXMgTGljZW5zZSB3aGljaCBhcHBsaWVzIHRvIGl0IGFuZAorImFueSBsYXRlciB2ZXJzaW9uIiwgeW91IGhhdmUgdGhlIG9wdGlvbiBvZiBmb2xsb3dpbmcgdGhlIHRlcm1zIGFuZAorY29uZGl0aW9ucyBlaXRoZXIgb2YgdGhhdCB2ZXJzaW9uIG9yIG9mIGFueSBsYXRlciB2ZXJzaW9uIHB1Ymxpc2hlZCBieQordGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIElmIHRoZSBMaWJyYXJ5IGRvZXMgbm90IHNwZWNpZnkgYQorbGljZW5zZSB2ZXJzaW9uIG51bWJlciwgeW91IG1heSBjaG9vc2UgYW55IHZlcnNpb24gZXZlciBwdWJsaXNoZWQgYnkKK3RoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisMCisgIDE0LiBJZiB5b3Ugd2lzaCB0byBpbmNvcnBvcmF0ZSBwYXJ0cyBvZiB0aGUgTGlicmFyeSBpbnRvIG90aGVyIGZyZWUKK3Byb2dyYW1zIHdob3NlIGRpc3RyaWJ1dGlvbiBjb25kaXRpb25zIGFyZSBpbmNvbXBhdGlibGUgd2l0aCB0aGVzZSwKK3dyaXRlIHRvIHRoZSBhdXRob3IgdG8gYXNrIGZvciBwZXJtaXNzaW9uLiAgRm9yIHNvZnR3YXJlIHdoaWNoIGlzCitjb3B5cmlnaHRlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3cml0ZSB0byB0aGUgRnJlZQorU29mdHdhcmUgRm91bmRhdGlvbjsgd2Ugc29tZXRpbWVzIG1ha2UgZXhjZXB0aW9ucyBmb3IgdGhpcy4gIE91cgorZGVjaXNpb24gd2lsbCBiZSBndWlkZWQgYnkgdGhlIHR3byBnb2FscyBvZiBwcmVzZXJ2aW5nIHRoZSBmcmVlIHN0YXR1cworb2YgYWxsIGRlcml2YXRpdmVzIG9mIG91ciBmcmVlIHNvZnR3YXJlIGFuZCBvZiBwcm9tb3RpbmcgdGhlIHNoYXJpbmcKK2FuZCByZXVzZSBvZiBzb2Z0d2FyZSBnZW5lcmFsbHkuCisKKwkJCSAgICBOTyBXQVJSQU5UWQorCisgIDE1LiBCRUNBVVNFIFRIRSBMSUJSQVJZIElTIExJQ0VOU0VEIEZSRUUgT0YgQ0hBUkdFLCBUSEVSRSBJUyBOTworV0FSUkFOVFkgRk9SIFRIRSBMSUJSQVJZLCBUTyBUSEUgRVhURU5UIFBFUk1JVFRFRCBCWSBBUFBMSUNBQkxFIExBVy4KK0VYQ0VQVCBXSEVOIE9USEVSV0lTRSBTVEFURUQgSU4gV1JJVElORyBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EL09SCitPVEhFUiBQQVJUSUVTIFBST1ZJREUgVEhFIExJQlJBUlkgIkFTIElTIiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWQorS0lORCwgRUlUSEVSIEVYUFJFU1NFRCBPUiBJTVBMSUVELCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCitJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKK1BVUlBPU0UuICBUSEUgRU5USVJFIFJJU0sgQVMgVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRQorTElCUkFSWSBJUyBXSVRIIFlPVS4gIFNIT1VMRCBUSEUgTElCUkFSWSBQUk9WRSBERUZFQ1RJVkUsIFlPVSBBU1NVTUUKK1RIRSBDT1NUIE9GIEFMTCBORUNFU1NBUlkgU0VSVklDSU5HLCBSRVBBSVIgT1IgQ09SUkVDVElPTi4KKworICAxNi4gSU4gTk8gRVZFTlQgVU5MRVNTIFJFUVVJUkVEIEJZIEFQUExJQ0FCTEUgTEFXIE9SIEFHUkVFRCBUTyBJTgorV1JJVElORyBXSUxMIEFOWSBDT1BZUklHSFQgSE9MREVSLCBPUiBBTlkgT1RIRVIgUEFSVFkgV0hPIE1BWSBNT0RJRlkKK0FORC9PUiBSRURJU1RSSUJVVEUgVEhFIExJQlJBUlkgQVMgUEVSTUlUVEVEIEFCT1ZFLCBCRSBMSUFCTEUgVE8gWU9VCitGT1IgREFNQUdFUywgSU5DTFVESU5HIEFOWSBHRU5FUkFMLCBTUEVDSUFMLCBJTkNJREVOVEFMIE9SCitDT05TRVFVRU5USUFMIERBTUFHRVMgQVJJU0lORyBPVVQgT0YgVEhFIFVTRSBPUiBJTkFCSUxJVFkgVE8gVVNFIFRIRQorTElCUkFSWSAoSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBMT1NTIE9GIERBVEEgT1IgREFUQSBCRUlORworUkVOREVSRUQgSU5BQ0NVUkFURSBPUiBMT1NTRVMgU1VTVEFJTkVEIEJZIFlPVSBPUiBUSElSRCBQQVJUSUVTIE9SIEEKK0ZBSUxVUkUgT0YgVEhFIExJQlJBUlkgVE8gT1BFUkFURSBXSVRIIEFOWSBPVEhFUiBTT0ZUV0FSRSksIEVWRU4gSUYKK1NVQ0ggSE9MREVSIE9SIE9USEVSIFBBUlRZIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKK0RBTUFHRVMuCisKKwkJICAgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKKwwKKyAgICAgICAgICAgSG93IHRvIEFwcGx5IFRoZXNlIFRlcm1zIHRvIFlvdXIgTmV3IExpYnJhcmllcworCisgIElmIHlvdSBkZXZlbG9wIGEgbmV3IGxpYnJhcnksIGFuZCB5b3Ugd2FudCBpdCB0byBiZSBvZiB0aGUgZ3JlYXRlc3QKK3Bvc3NpYmxlIHVzZSB0byB0aGUgcHVibGljLCB3ZSByZWNvbW1lbmQgbWFraW5nIGl0IGZyZWUgc29mdHdhcmUgdGhhdAorZXZlcnlvbmUgY2FuIHJlZGlzdHJpYnV0ZSBhbmQgY2hhbmdlLiAgWW91IGNhbiBkbyBzbyBieSBwZXJtaXR0aW5nCityZWRpc3RyaWJ1dGlvbiB1bmRlciB0aGVzZSB0ZXJtcyAob3IsIGFsdGVybmF0aXZlbHksIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKK29yZGluYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UpLgorCisgIFRvIGFwcGx5IHRoZXNlIHRlcm1zLCBhdHRhY2ggdGhlIGZvbGxvd2luZyBub3RpY2VzIHRvIHRoZSBsaWJyYXJ5LiAgSXQgaXMKK3NhZmVzdCB0byBhdHRhY2ggdGhlbSB0byB0aGUgc3RhcnQgb2YgZWFjaCBzb3VyY2UgZmlsZSB0byBtb3N0IGVmZmVjdGl2ZWx5Citjb252ZXkgdGhlIGV4Y2x1c2lvbiBvZiB3YXJyYW50eTsgYW5kIGVhY2ggZmlsZSBzaG91bGQgaGF2ZSBhdCBsZWFzdCB0aGUKKyJjb3B5cmlnaHQiIGxpbmUgYW5kIGEgcG9pbnRlciB0byB3aGVyZSB0aGUgZnVsbCBub3RpY2UgaXMgZm91bmQuCisKKyAgICA8b25lIGxpbmUgdG8gZ2l2ZSB0aGUgbGlicmFyeSdzIG5hbWUgYW5kIGEgYnJpZWYgaWRlYSBvZiB3aGF0IGl0IGRvZXMuPgorICAgIENvcHlyaWdodCAoQykgPHllYXI+ICA8bmFtZSBvZiBhdXRob3I+CisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKworQWxzbyBhZGQgaW5mb3JtYXRpb24gb24gaG93IHRvIGNvbnRhY3QgeW91IGJ5IGVsZWN0cm9uaWMgYW5kIHBhcGVyIG1haWwuCisKK1lvdSBzaG91bGQgYWxzbyBnZXQgeW91ciBlbXBsb3llciAoaWYgeW91IHdvcmsgYXMgYSBwcm9ncmFtbWVyKSBvciB5b3VyCitzY2hvb2wsIGlmIGFueSwgdG8gc2lnbiBhICJjb3B5cmlnaHQgZGlzY2xhaW1lciIgZm9yIHRoZSBsaWJyYXJ5LCBpZgorbmVjZXNzYXJ5LiAgSGVyZSBpcyBhIHNhbXBsZTsgYWx0ZXIgdGhlIG5hbWVzOgorCisgIFlveW9keW5lLCBJbmMuLCBoZXJlYnkgZGlzY2xhaW1zIGFsbCBjb3B5cmlnaHQgaW50ZXJlc3QgaW4gdGhlCisgIGxpYnJhcnkgYEZyb2InIChhIGxpYnJhcnkgZm9yIHR3ZWFraW5nIGtub2JzKSB3cml0dGVuIGJ5IEphbWVzIFJhbmRvbSBIYWNrZXIuCisKKyAgPHNpZ25hdHVyZSBvZiBUeSBDb29uPiwgMSBBcHJpbCAxOTkwCisgIFR5IENvb24sIFByZXNpZGVudCBvZiBWaWNlCisKK1RoYXQncyBhbGwgdGhlcmUgaXMgdG8gaXQhCisKKwpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvbGljZW5zZS50eHQgYi9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9saWNlbnNlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjA4NDFlCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvbGljZW5zZS50eHQKQEAgLTAsMCArMSwxOSBAQAorU2FuIEFuZ2VsZXMgT2JzZXJ2YXRpb24gT3BlbkdMIEVTIHZlcnNpb24gZXhhbXBsZQ0KK0NvcHlyaWdodCAyMDA0LTIwMDUgSmV0cm8gTGF1aGENCitBbGwgcmlnaHRzIHJlc2VydmVkLg0KK1dlYjogaHR0cDovL2lraS5maS9qZXRyby8NCisNCitUaGlzIHNvdXJjZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3INCittb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIEVJVEhFUjoNCisgICgxKSBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQ0KKyAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0DQorICAgICAgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiBUaGUgdGV4dCBvZiB0aGUgR05VIExlc3Nlcg0KKyAgICAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgd2l0aCB0aGlzIHNvdXJjZSBpbiB0aGUNCisgICAgICBmaWxlIExJQ0VOU0UtTEdQTC50eHQuDQorICAoMikgVGhlIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgaXMgaW5jbHVkZWQgd2l0aCB0aGlzIHNvdXJjZSBpbg0KKyAgICAgIHRoZSBmaWxlIExJQ0VOU0UtQlNELnR4dC4NCisNCitUaGlzIHNvdXJjZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLA0KK2J1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mDQorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIGZpbGVzDQorTElDRU5TRS1MR1BMLnR4dCBhbmQgTElDRU5TRS1CU0QudHh0IGZvciBtb3JlIGRldGFpbHMuDQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvc2hhcGVzLmggYi9vcGVuZ2wvdGVzdHMvYW5nZWxlcy9zaGFwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWZmYWU4Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL2FuZ2VsZXMvc2hhcGVzLmgKQEAgLTAsMCArMSw1OSBAQAorLyogU2FuIEFuZ2VsZXMgT2JzZXJ2YXRpb24gT3BlbkdMIEVTIHZlcnNpb24gZXhhbXBsZQorICogQ29weXJpZ2h0IDIwMDQtMjAwNSBKZXRybyBMYXVoYQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIFdlYjogaHR0cDovL2lraS5maS9qZXRyby8KKyAqCisgKiBUaGlzIHNvdXJjZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgRUlUSEVSOgorICogICAoMSkgVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqICAgICAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CisgKiAgICAgICB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uIFRoZSB0ZXh0IG9mIHRoZSBHTlUgTGVzc2VyCisgKiAgICAgICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIHdpdGggdGhpcyBzb3VyY2UgaW4gdGhlCisgKiAgICAgICBmaWxlIExJQ0VOU0UtTEdQTC50eHQuCisgKiAgICgyKSBUaGUgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBpcyBpbmNsdWRlZCB3aXRoIHRoaXMgc291cmNlIGluCisgKiAgICAgICB0aGUgZmlsZSBMSUNFTlNFLUJTRC50eHQuCisgKgorICogVGhpcyBzb3VyY2UgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgZmlsZXMKKyAqIExJQ0VOU0UtTEdQTC50eHQgYW5kIExJQ0VOU0UtQlNELnR4dCBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICRJZDogc2hhcGVzLmgsdiAxLjYgMjAwNS8wMS8zMSAyMjoxNTozMCB0b25pYyBFeHAgJAorICogJFJldmlzaW9uOiAxLjYgJAorICovCisKKyNpZm5kZWYgU0hBUEVTX0hfSU5DTFVERUQKKyNkZWZpbmUgU0hBUEVTX0hfSU5DTFVERUQKKworCisjZGVmaW5lIFNVUEVSU0hBUEVfUEFSQU1TIDE1CisKK3N0YXRpYyBjb25zdCBmbG9hdCBzU3VwZXJTaGFwZVBhcmFtc1tdW1NVUEVSU0hBUEVfUEFSQU1TXSA9Cit7CisgICAgLy8gbSAgYSAgICAgYiAgICAgbjEgICAgICBuMiAgICAgbjMgICAgIG0gICAgIGEgICAgIGIgICAgIG4xICAgICBuMiAgICAgIG4zICAgcmVzMSByZXMyIHNjYWxlICAob3JnLnJlczEscmVzMikKKyAgICB7IDEwLCAxLCAgICAyLCAgICA5MCwgICAgICAxLCAgIC00NSwgICAgOCwgICAgMSwgICAgMSwgICAgLTEsICAgICAxLCAgLTAuNGYsICAgMjAsICAzMCwgMiB9LCAvLyA0MCwgNjAKKyAgICB7IDEwLCAxLCAgICAyLCAgICA5MCwgICAgICAxLCAgIC00NSwgICAgNCwgICAgMSwgICAgMSwgICAgMTAsICAgICAxLCAgLTAuNGYsICAgMjAsICAyMCwgNCB9LCAvLyA0MCwgNDAKKyAgICB7IDEwLCAxLCAgICAyLCAgICA2MCwgICAgICAxLCAgIC0xMCwgICAgNCwgICAgMSwgICAgMSwgICAgLTEsICAgIC0yLCAgLTAuNGYsICAgNDEsICA0MSwgMSB9LCAvLyA4MiwgODIKKyAgICB7ICA2LCAxLCAgICAxLCAgICA2MCwgICAgICAxLCAgIC03MCwgICAgOCwgICAgMSwgICAgMSwgIDAuNGYsICAgICAzLCAgMC4yNWYsICAgMjAsICAyMCwgMSB9LCAvLyA0MCwgNDAKKyAgICB7ICA0LCAxLCAgICAxLCAgICAzMCwgICAgICAxLCAgICAyMCwgICAxMiwgICAgMSwgICAgMSwgIDAuNGYsICAgICAzLCAgMC4yNWYsICAgMTAsICAzMCwgMSB9LCAvLyAyMCwgNjAKKyAgICB7ICA4LCAxLCAgICAxLCAgICAzMCwgICAgICAxLCAgICAtNCwgICAgOCwgICAgMiwgICAgMSwgICAgLTEsICAgICA1LCAgIDAuNWYsICAgMjUsICAyNiwgMSB9LCAvLyA2MCwgNjAKKyAgICB7IDEzLCAxLCAgICAxLCAgICAzMCwgICAgICAxLCAgICAtNCwgICAxMywgICAgMSwgICAgMSwgICAgIDEsICAgICA1LCAgICAgIDEsICAgMzAsICAzMCwgNiB9LCAvLyA2MCwgNjAKKyAgICB7IDEwLCAxLCAxLjFmLCAtMC41ZiwgICAwLjFmLCAgICA3MCwgICA2MCwgICAgMSwgICAgMSwgICAtOTAsICAgICAwLCAtMC4yNWYsICAgMjAsICA2MCwgOCB9LCAvLyA2MCwgMTgwCisgICAgeyAgNywgMSwgICAgMSwgICAgMjAsICAtMC4zZiwgLTMuNWYsICAgIDYsICAgIDEsICAgIDEsICAgIC0xLCAgNC41ZiwgICAwLjVmLCAgIDEwLCAgMjAsIDQgfSwgLy8gNjAsIDgwCisgICAgeyAgNCwgMSwgICAgMSwgICAgMTAsICAgICAxMCwgICAgMTAsICAgIDQsICAgIDEsICAgIDEsICAgIDEwLCAgICAxMCwgICAgIDEwLCAgIDEwLCAgMjAsIDEgfSwgLy8gMjAsIDQwCisgICAgeyAgNCwgMSwgICAgMSwgICAgIDEsICAgICAgMSwgICAgIDEsICAgIDQsICAgIDEsICAgIDEsICAgICAxLCAgICAgMSwgICAgICAxLCAgIDEwLCAgMTAsIDIgfSwgLy8gMTAsIDEwCisgICAgeyAgMSwgMSwgICAgMSwgICAgMzgsIC0wLjI1ZiwgICAgMTksICAgIDQsICAgIDEsICAgIDEsICAgIDEwLCAgICAxMCwgICAgIDEwLCAgIDEwLCAgMTUsIDIgfSwgLy8gMjAsIDQwCisgICAgeyAgMiwgMSwgICAgMSwgIDAuN2YsICAgMC4zZiwgIDAuMmYsICAgIDMsICAgIDEsICAgIDEsICAgMTAwLCAgIDEwMCwgICAgMTAwLCAgIDEwLCAgMjUsIDIgfSwgLy8gMjAsIDUwCisgICAgeyAgNiwgMSwgICAgMSwgICAgIDEsICAgICAgMSwgICAgIDEsICAgIDMsICAgIDEsICAgIDEsICAgICAxLCAgICAgMSwgICAgICAxLCAgIDMwLCAgMzAsIDIgfSwgLy8gNjAsIDYwCisgICAgeyAgMywgMSwgICAgMSwgICAgIDEsICAgICAgMSwgICAgIDEsICAgIDYsICAgIDEsICAgIDEsICAgICAyLCAgICAgMSwgICAgICAxLCAgIDEwLCAgMjAsIDIgfSwgLy8gMjAsIDQwCisgICAgeyAgNiwgMSwgICAgMSwgICAgIDYsICAgNS41ZiwgICAxMDAsICAgIDYsICAgIDEsICAgIDEsICAgIDI1LCAgICAxMCwgICAgIDEwLCAgIDMwLCAgMjAsIDIgfSwgLy8gNjAsIDQwCisgICAgeyAgMywgMSwgICAgMSwgIDAuNWYsICAgMS43ZiwgIDEuN2YsICAgIDIsICAgIDEsICAgIDEsICAgIDEwLCAgICAxMCwgICAgIDEwLCAgIDIwLCAgMjAsIDIgfSwgLy8gNDAsIDQwCisgICAgeyAgNSwgMSwgICAgMSwgIDAuMWYsICAgMS43ZiwgIDEuN2YsICAgIDEsICAgIDEsICAgIDEsICAwLjNmLCAgMC41ZiwgICAwLjVmLCAgIDIwLCAgMjAsIDQgfSwgLy8gNDAsIDQwCisgICAgeyAgMiwgMSwgICAgMSwgICAgIDYsICAgNS41ZiwgICAxMDAsICAgIDYsICAgIDEsICAgIDEsICAgICA0LCAgICAxMCwgICAgIDEwLCAgIDEwLCAgMjIsIDEgfSwgLy8gNDAsIDQwCisgICAgeyAgNiwgMSwgICAgMSwgICAgLTEsICAgICA3MCwgIDAuMWYsICAgIDksICAgIDEsIDAuNWYsICAgLTk4LCAwLjA1ZiwgICAgLTQ1LCAgIDIwLCAgMzAsIDQgfSwgLy8gNjAsIDkxCisgICAgeyAgNiwgMSwgICAgMSwgICAgLTEsICAgICA5MCwgLTAuMWYsICAgIDcsICAgIDEsICAgIDEsICAgIDkwLCAgMS4zZiwgICAgIDM0LCAgIDEzLCAgMTYsIDEgfSwgLy8gMzIsIDYwCit9OworI2RlZmluZSBTVVBFUlNIQVBFX0NPVU5UIChzaXplb2Yoc1N1cGVyU2hhcGVQYXJhbXMpIC8gc2l6ZW9mKHNTdXBlclNoYXBlUGFyYW1zWzBdKSkKKworCisjZW5kaWYgLy8gIVNIQVBFU19IX0lOQ0xVREVECmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvZmlsdGVyL0FuZHJvaWQubWsgYi9vcGVuZ2wvdGVzdHMvZmlsdGVyL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWM0MjUzYwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy9maWx0ZXIvQW5kcm9pZC5tawpAQCAtMCwwICsxLDE2IEBACitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVM6PSBcCisJZmlsdGVyLmMKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCisJbGliY3V0aWxzIFwKKyAgICBsaWJHTEVTX0NNIFwKKyAgICBsaWJ1aQorCitMT0NBTF9NT0RVTEU6PSB0ZXN0LW9wZW5nbC1maWx0ZXIKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKKworaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvZmlsdGVyL2ZpbHRlci5jIGIvb3BlbmdsL3Rlc3RzL2ZpbHRlci9maWx0ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGJhYzA2Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL2ZpbHRlci9maWx0ZXIuYwpAQCAtMCwwICsxLDEyNSBAQAorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlIDxHTEVTL2VnbC5oPgorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpCit7CisgICAgaWYgKGFyZ2MhPTIgJiYgYXJnYyE9MykgeworICAgICAgICBwcmludGYoInVzYWdlOiAlcyA8MC02PiBbcGJ1ZmZlcl1cbiIsIGFyZ3ZbMF0pOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgCisgICAgY29uc3QgaW50IHRlc3QgPSBhdG9pKGFyZ3ZbMV0pOworICAgIGludCB1c2VQYnVmZmVyID0gYXJnYz09MyAmJiAhc3RyY21wKGFyZ3ZbMl0sICJwYnVmZmVyIik7CisgICAgRUdMaW50IHNfY29uZmlnQXR0cmlic1tdID0geworICAgICAgICAgRUdMX1NVUkZBQ0VfVFlQRSwgRUdMX1BCVUZGRVJfQklUfEVHTF9XSU5ET1dfQklULAorICAgICAgICAgRUdMX1JFRF9TSVpFLCAgICAgICA1LAorICAgICAgICAgRUdMX0dSRUVOX1NJWkUsICAgICA2LAorICAgICAgICAgRUdMX0JMVUVfU0laRSwgICAgICA1LAorICAgICAgICAgRUdMX05PTkUKKyAgICAgfTsKKyAgICAgCisgICAgIEVHTGludCBudW1Db25maWdzID0gLTE7CisgICAgIEVHTGludCBtYWpvclZlcnNpb247CisgICAgIEVHTGludCBtaW5vclZlcnNpb247CisgICAgIEVHTENvbmZpZyBjb25maWc7CisgICAgIEVHTENvbnRleHQgY29udGV4dDsKKyAgICAgRUdMU3VyZmFjZSBzdXJmYWNlOworICAgICBFR0xpbnQgdywgaDsKKyAgICAgCisgICAgIEVHTERpc3BsYXkgZHB5OworCisgICAgIGRweSA9IGVnbEdldERpc3BsYXkoRUdMX0RFRkFVTFRfRElTUExBWSk7CisgICAgIGVnbEluaXRpYWxpemUoZHB5LCAmbWFqb3JWZXJzaW9uLCAmbWlub3JWZXJzaW9uKTsKKyAgICAgZWdsQ2hvb3NlQ29uZmlnKGRweSwgc19jb25maWdBdHRyaWJzLCAmY29uZmlnLCAxLCAmbnVtQ29uZmlncyk7CisgICAgIGlmICghdXNlUGJ1ZmZlcikgeworICAgICAgICAgc3VyZmFjZSA9IGVnbENyZWF0ZVdpbmRvd1N1cmZhY2UoZHB5LCBjb25maWcsCisgICAgICAgICAgICAgICAgIGFuZHJvaWRfY3JlYXRlRGlzcGxheVN1cmZhY2UoKSwgTlVMTCk7CisgICAgIH0gZWxzZSB7CisgICAgICAgICBwcmludGYoInVzaW5nIHBidWZmZXJcbiIpOworICAgICAgICAgRUdMaW50IGF0dHJpYnNbXSA9IHsgRUdMX1dJRFRILCAzMjAsIEVHTF9IRUlHSFQsIDQ4MCwgRUdMX05PTkUgfTsKKyAgICAgICAgIHN1cmZhY2UgPSBlZ2xDcmVhdGVQYnVmZmVyU3VyZmFjZShkcHksIGNvbmZpZywgYXR0cmlicyk7CisgICAgIH0KKyAgICAgY29udGV4dCA9IGVnbENyZWF0ZUNvbnRleHQoZHB5LCBjb25maWcsIE5VTEwsIE5VTEwpOworICAgICBlZ2xNYWtlQ3VycmVudChkcHksIHN1cmZhY2UsIHN1cmZhY2UsIGNvbnRleHQpOyAgIAorICAgICBlZ2xRdWVyeVN1cmZhY2UoZHB5LCBzdXJmYWNlLCBFR0xfV0lEVEgsICZ3KTsKKyAgICAgZWdsUXVlcnlTdXJmYWNlKGRweSwgc3VyZmFjZSwgRUdMX0hFSUdIVCwgJmgpOworICAgICBHTGludCBkaW0gPSB3PGggPyB3IDogaDsKKworICAgICBnbENsZWFyKEdMX0NPTE9SX0JVRkZFUl9CSVQpOworCisgICAgIEdMaW50IGNyb3BbNF0gPSB7IDAsIDQsIDQsIC00IH07CisgICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgMCk7CisgICAgIGdsVGV4UGFyYW1ldGVyaXYoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9DUk9QX1JFQ1RfT0VTLCBjcm9wKTsKKyAgICAgZ2xUZXhQYXJhbWV0ZXJ4KEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUFHX0ZJTFRFUiwgR0xfTElORUFSKTsKKyAgICAgZ2xUZXhQYXJhbWV0ZXJ4KEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiwgR0xfTElORUFSKTsKKyAgICAgZ2xUZXhFbnZ4KEdMX1RFWFRVUkVfRU5WLCBHTF9URVhUVVJFX0VOVl9NT0RFLCBHTF9SRVBMQUNFKTsKKyAgICAgZ2xFbmFibGUoR0xfVEVYVFVSRV8yRCk7CisgICAgIGdsQ29sb3I0ZigxLDEsMSwxKTsKKworICAgICAvLyBwYWNraW5nIGlzIGFsd2F5cyA0CisgICAgIHVpbnQ4X3QgdDhbXSAgPSB7IAorICAgICAgICAgICAgIDB4MDAsIDB4NTUsIDB4MDAsIDB4NTUsIAorICAgICAgICAgICAgIDB4QUEsIDB4RkYsIDB4QUEsIDB4RkYsCisgICAgICAgICAgICAgMHgwMCwgMHg1NSwgMHgwMCwgMHg1NSwgCisgICAgICAgICAgICAgMHhBQSwgMHhGRiwgMHhBQSwgMHhGRiAgfTsKKworICAgICB1aW50MTZfdCB0MTZbXSAgPSB7IAorICAgICAgICAgICAgIDB4MDAwMCwgMHg1NTU1LCAweDAwMDAsIDB4NTU1NSwgCisgICAgICAgICAgICAgMHhBQUFBLCAweEZGRkYsIDB4QUFBQSwgMHhGRkZGLAorICAgICAgICAgICAgIDB4MDAwMCwgMHg1NTU1LCAweDAwMDAsIDB4NTU1NSwgCisgICAgICAgICAgICAgMHhBQUFBLCAweEZGRkYsIDB4QUFBQSwgMHhGRkZGICB9OworCisgICAgIHVpbnQxNl90IHQ1NTUxW10gID0geyAKKyAgICAgICAgICAgICAweDAwMDAsIDB4RkZGRiwgMHgwMDAwLCAweEZGRkYsIAorICAgICAgICAgICAgIDB4RkZGRiwgMHgwMDAwLCAweEZGRkYsIDB4MDAwMCwKKyAgICAgICAgICAgICAweDAwMDAsIDB4RkZGRiwgMHgwMDAwLCAweEZGRkYsIAorICAgICAgICAgICAgIDB4RkZGRiwgMHgwMDAwLCAweEZGRkYsIDB4MDAwMCAgfTsKKworICAgICB1aW50MzJfdCB0MzJbXSAgPSB7IAorICAgICAgICAgICAgIDB4RkYwMDAwMDAsIDB4RkYwMDAwRkYsIDB4RkYwMEZGMDAsIDB4RkZGRjAwMDAsIAorICAgICAgICAgICAgIDB4RkYwMEZGMDAsIDB4RkZGRjAwMDAsIDB4RkYwMDAwMDAsIDB4RkYwMDAwRkYsIAorICAgICAgICAgICAgIDB4RkYwMEZGRkYsIDB4RkYwMEZGMDAsIDB4MDBGRjAwRkYsIDB4RkZGRkZGMDAsIAorICAgICAgICAgICAgIDB4RkYwMDAwMDAsIDB4RkZGRjAwRkYsIDB4RkYwMEZGRkYsIDB4RkZGRkZGRkYKKyAgICAgfTsKKworICAgICBzd2l0Y2godGVzdCkgCisgICAgIHsKKyAgICAgY2FzZSAxOgorICAgICAgICAgZ2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIEdMX0xVTUlOQU5DRSwKKyAgICAgICAgICAgICAgICAgNCwgNCwgMCwgR0xfTFVNSU5BTkNFLCBHTF9VTlNJR05FRF9CWVRFLCB0OCk7CisgICAgICAgICBicmVhazsKKyAgICAgY2FzZSAyOgorICAgICAgICAgZ2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIEdMX1JHQiwKKyAgICAgICAgICAgICAgICAgNCwgNCwgMCwgR0xfUkdCLCBHTF9VTlNJR05FRF9TSE9SVF81XzZfNSwgdDE2KTsKKyAgICAgICAgIGJyZWFrOworICAgICBjYXNlIDM6CisgICAgICAgICBnbFRleEltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwgR0xfUkdCQSwKKyAgICAgICAgICAgICAgICAgNCwgNCwgMCwgR0xfUkdCQSwgR0xfVU5TSUdORURfU0hPUlRfNF80XzRfNCwgdDE2KTsKKyAgICAgICAgIGJyZWFrOworICAgICBjYXNlIDQ6CisgICAgICAgICBnbFRleEltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwgR0xfTFVNSU5BTkNFX0FMUEhBLAorICAgICAgICAgICAgICAgICA0LCA0LCAwLCBHTF9MVU1JTkFOQ0VfQUxQSEEsIEdMX1VOU0lHTkVEX0JZVEUsIHQxNik7CisgICAgICAgICBicmVhazsKKyAgICAgY2FzZSA1OgorICAgICAgICAgZ2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIEdMX1JHQkEsCisgICAgICAgICAgICAgICAgIDQsIDQsIDAsIEdMX1JHQkEsIEdMX1VOU0lHTkVEX1NIT1JUXzVfNV81XzEsIHQ1NTUxKTsKKyAgICAgICAgIGJyZWFrOworICAgICBjYXNlIDY6CisgICAgICAgICBnbFRleEltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwgR0xfUkdCQSwKKyAgICAgICAgICAgICAgICAgNCwgNCwgMCwgR0xfUkdCQSwgR0xfVU5TSUdORURfQllURSwgdDMyKTsKKyAgICAgICAgIGJyZWFrOworICAgICB9CisKKyAgICAgZ2xEcmF3VGV4aU9FUygwLCAwLCAwLCBkaW0sIGRpbSk7CisKKyAgICAgaWYgKCF1c2VQYnVmZmVyKSB7CisgICAgICAgICBlZ2xTd2FwQnVmZmVycyhkcHksIHN1cmZhY2UpOworICAgICB9IGVsc2UgeworICAgICAgICAgZ2xGaW5pc2goKTsKKyAgICAgfQorICAgICAKKyAgICAgZWdsVGVybWluYXRlKGRweSk7CisgICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2ZpbmlzaC9BbmRyb2lkLm1rIGIvb3BlbmdsL3Rlc3RzL2ZpbmlzaC9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3Yjk1ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvZmluaXNoL0FuZHJvaWQubWsKQEAgLTAsMCArMSwxNiBAQAorTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTOj0gXAorCWZpbmlzaC5jCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAorCWxpYmN1dGlscyBcCisgICAgbGliR0xFU19DTSBcCisgICAgbGlidWkKKworTE9DQUxfTU9EVUxFOj0gdGVzdC1vcGVuZ2wtZmluaXNoCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCisKK2luY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL2ZpbmlzaC9maW5pc2guYyBiL29wZW5nbC90ZXN0cy9maW5pc2gvZmluaXNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FmZTIyNwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy9maW5pc2gvZmluaXNoLmMKQEAgLTAsMCArMSwyMjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8c2NoZWQuaD4KKyNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KKworI2luY2x1ZGUgPEdMRVMvZWdsLmg+CisKK2xvbmcgbG9uZyBzeXN0ZW1UaW1lKCkKK3sKKyAgICBzdHJ1Y3QgdGltZXNwZWMgdDsKKyAgICB0LnR2X3NlYyA9IHQudHZfbnNlYyA9IDA7CisgICAgY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsICZ0KTsKKyAgICByZXR1cm4gKGxvbmcgbG9uZykodC50dl9zZWMpKjEwMDAwMDAwMDBMTCArIHQudHZfbnNlYzsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KQoreworICAgIEVHTGludCBzX2NvbmZpZ0F0dHJpYnNbXSA9IHsKKyAgICAgICAgIEVHTF9SRURfU0laRSwgICAgICAgNSwKKyAgICAgICAgIEVHTF9HUkVFTl9TSVpFLCAgICAgNiwKKyAgICAgICAgIEVHTF9CTFVFX1NJWkUsICAgICAgNSwKKyAgICAgICAgIEVHTF9OT05FCisgICAgIH07CisgICAgIAorICAgICBFR0xpbnQgbnVtQ29uZmlncyA9IC0xOworICAgICBFR0xpbnQgbWFqb3JWZXJzaW9uOworICAgICBFR0xpbnQgbWlub3JWZXJzaW9uOworICAgICBFR0xDb25maWcgY29uZmlnOworICAgICBFR0xDb250ZXh0IGNvbnRleHQ7CisgICAgIEVHTFN1cmZhY2Ugc3VyZmFjZTsKKyAgICAgRUdMaW50IHcsIGg7CisgICAgIAorICAgICBFR0xEaXNwbGF5IGRweTsKKworICAgICBkcHkgPSBlZ2xHZXREaXNwbGF5KEVHTF9ERUZBVUxUX0RJU1BMQVkpOworICAgICBlZ2xJbml0aWFsaXplKGRweSwgJm1ham9yVmVyc2lvbiwgJm1pbm9yVmVyc2lvbik7CisgICAgIGVnbENob29zZUNvbmZpZyhkcHksIHNfY29uZmlnQXR0cmlicywgJmNvbmZpZywgMSwgJm51bUNvbmZpZ3MpOworICAgICBzdXJmYWNlID0gZWdsQ3JlYXRlV2luZG93U3VyZmFjZShkcHksIGNvbmZpZywgCisgICAgICAgICAgICAgYW5kcm9pZF9jcmVhdGVEaXNwbGF5U3VyZmFjZSgpLCBOVUxMKTsKKyAgICAgY29udGV4dCA9IGVnbENyZWF0ZUNvbnRleHQoZHB5LCBjb25maWcsIE5VTEwsIE5VTEwpOworICAgICBlZ2xNYWtlQ3VycmVudChkcHksIHN1cmZhY2UsIHN1cmZhY2UsIGNvbnRleHQpOyAgIAorICAgICBlZ2xRdWVyeVN1cmZhY2UoZHB5LCBzdXJmYWNlLCBFR0xfV0lEVEgsICZ3KTsKKyAgICAgZWdsUXVlcnlTdXJmYWNlKGRweSwgc3VyZmFjZSwgRUdMX0hFSUdIVCwgJmgpOworICAgICBHTGludCBkaW0gPSB3PGggPyB3IDogaDsKKworICAgICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIDApOworICAgICBnbFRleFBhcmFtZXRlcngoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NQUdfRklMVEVSLCBHTF9ORUFSRVNUKTsKKyAgICAgZ2xUZXhQYXJhbWV0ZXJ4KEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiwgR0xfTkVBUkVTVCk7CisgICAgIGdsVGV4RW52eChHTF9URVhUVVJFX0VOViwgR0xfVEVYVFVSRV9FTlZfTU9ERSwgR0xfUkVQTEFDRSk7CisgICAgIGdsRW5hYmxlKEdMX1RFWFRVUkVfMkQpOworICAgICBnbENvbG9yNGYoMSwxLDEsMSk7CisgICAgIGdsRGlzYWJsZShHTF9ESVRIRVIpOworICAgICBnbFNoYWRlTW9kZWwoR0xfRkxBVCk7CisKKyAgICAgbG9uZyBsb25nIG5vdywgdDsKKyAgICAgaW50IGk7CisKKyAgICAgY2hhciogdGV4ZWxzID0gbWFsbG9jKDUxMio1MTIqMik7CisgICAgIG1lbXNldCh0ZXhlbHMsMHhGRiw1MTIqNTEyKjIpOworICAgICAKKyAgICAgZ2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIEdMX1JHQiwKKyAgICAgICAgICAgICA1MTIsIDUxMiwgMCwgR0xfUkdCLCBHTF9VTlNJR05FRF9TSE9SVF81XzZfNSwgdGV4ZWxzKTsKKworICAgICBjaGFyKiBkc3QgPSBtYWxsb2MoMzIwKjQ4MCoyKTsKKyAgICAgbWVtc2V0KGRzdCwgMCwgMzIwKjQ4MCoyKTsKKyAgICAgcHJpbnRmKCIzMDcyMDAgYnl0ZXMgbWVtY3B5XG4iKTsKKyAgICAgZm9yIChpPTAgOyBpPDQgOyBpKyspIHsKKyAgICAgICAgIG5vdyA9IHN5c3RlbVRpbWUoKTsKKyAgICAgICAgIG1lbWNweShkc3QsIHRleGVscywgMzIwKjQ4MCoyKTsKKyAgICAgICAgIHQgPSBzeXN0ZW1UaW1lKCk7CisgICAgICAgICBwcmludGYoIm1lbWNweSgpIHRpbWUgPSAlbGx1IHVzXG4iLCAodC1ub3cpLzEwMDApOworICAgICAgICAgZmZsdXNoKHN0ZG91dCk7CisgICAgIH0KKyAgICAgZnJlZShkc3QpOworCisgICAgIGZyZWUodGV4ZWxzKTsKKworICAgICBzZXRwcmlvcml0eShQUklPX1BST0NFU1MsIDAsIC0yMCk7CisgICAgIAorICAgICBwcmludGYoIjUxMng1MTIgdW5tb2RpZmllZCB0ZXh0dXJlLCA1MTJ4NTEyIGJsaXQ6XG4iKTsKKyAgICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUKTsKKyAgICAgZm9yIChpPTAgOyBpPDQgOyBpKyspIHsKKyAgICAgICAgIEdMaW50IGNyb3BbNF0gPSB7IDAsIDUxMiwgNTEyLCAtNTEyIH07CisgICAgICAgICBnbFRleFBhcmFtZXRlcml2KEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfQ1JPUF9SRUNUX09FUywgY3JvcCk7CisgICAgICAgICBub3cgPSBzeXN0ZW1UaW1lKCk7CisgICAgICAgICBnbERyYXdUZXhpT0VTKDAsIDAsIDAsIDUxMiwgNTEyKTsKKyAgICAgICAgIGdsRmluaXNoKCk7CisgICAgICAgICB0ID0gc3lzdGVtVGltZSgpOworICAgICAgICAgcHJpbnRmKCJnbEZpbmlzaCgpIHRpbWUgPSAlbGx1IHVzXG4iLCAodC1ub3cpLzEwMDApOworICAgICAgICAgZmZsdXNoKHN0ZG91dCk7CisgICAgICAgICBlZ2xTd2FwQnVmZmVycyhkcHksIHN1cmZhY2UpOworICAgICB9CisgICAgIAorICAgICBwcmludGYoIjUxMng1MTIgdW5tb2RpZmllZCB0ZXh0dXJlLCAxeDEgYmxpdDpcbiIpOworICAgICBnbENsZWFyKEdMX0NPTE9SX0JVRkZFUl9CSVQpOworICAgICBmb3IgKGk9MCA7IGk8NCA7IGkrKykgeworICAgICAgICAgR0xpbnQgY3JvcFs0XSA9IHsgMCwgMSwgMSwgLTEgfTsKKyAgICAgICAgIGdsVGV4UGFyYW1ldGVyaXYoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9DUk9QX1JFQ1RfT0VTLCBjcm9wKTsKKyAgICAgICAgIG5vdyA9IHN5c3RlbVRpbWUoKTsKKyAgICAgICAgIGdsRHJhd1RleGlPRVMoMCwgMCwgMCwgMSwgMSk7CisgICAgICAgICBnbEZpbmlzaCgpOworICAgICAgICAgdCA9IHN5c3RlbVRpbWUoKTsKKyAgICAgICAgIHByaW50ZigiZ2xGaW5pc2goKSB0aW1lID0gJWxsdSB1c1xuIiwgKHQtbm93KS8xMDAwKTsKKyAgICAgICAgIGZmbHVzaChzdGRvdXQpOworICAgICAgICAgZWdsU3dhcEJ1ZmZlcnMoZHB5LCBzdXJmYWNlKTsKKyAgICAgfQorICAgICAKKyAgICAgcHJpbnRmKCI1MTJ4NTEyIHVubW9kaWZpZWQgdGV4dHVyZSwgNTEyeDUxMiBibGl0ICh4Mik6XG4iKTsKKyAgICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUKTsKKyAgICAgZm9yIChpPTAgOyBpPDQgOyBpKyspIHsKKyAgICAgICAgIEdMaW50IGNyb3BbNF0gPSB7IDAsIDUxMiwgNTEyLCAtNTEyIH07CisgICAgICAgICBnbFRleFBhcmFtZXRlcml2KEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfQ1JPUF9SRUNUX09FUywgY3JvcCk7CisgICAgICAgICBub3cgPSBzeXN0ZW1UaW1lKCk7CisgICAgICAgICBnbERyYXdUZXhpT0VTKDAsIDAsIDAsIDUxMiwgNTEyKTsKKyAgICAgICAgIGdsRHJhd1RleGlPRVMoMCwgMCwgMCwgNTEyLCA1MTIpOworICAgICAgICAgZ2xGaW5pc2goKTsKKyAgICAgICAgIHQgPSBzeXN0ZW1UaW1lKCk7CisgICAgICAgICBwcmludGYoImdsRmluaXNoKCkgdGltZSA9ICVsbHUgdXNcbiIsICh0LW5vdykvMTAwMCk7CisgICAgICAgICBmZmx1c2goc3Rkb3V0KTsKKyAgICAgICAgIGVnbFN3YXBCdWZmZXJzKGRweSwgc3VyZmFjZSk7CisgICAgIH0KKworICAgICBwcmludGYoIjUxMng1MTIgdW5tb2RpZmllZCB0ZXh0dXJlLCAxeDEgYmxpdCAoeDIpOlxuIik7CisgICAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7CisgICAgIGZvciAoaT0wIDsgaTw0IDsgaSsrKSB7CisgICAgICAgICBHTGludCBjcm9wWzRdID0geyAwLCAxLCAxLCAtMSB9OworICAgICAgICAgZ2xUZXhQYXJhbWV0ZXJpdihHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX0NST1BfUkVDVF9PRVMsIGNyb3ApOworICAgICAgICAgbm93ID0gc3lzdGVtVGltZSgpOworICAgICAgICAgZ2xEcmF3VGV4aU9FUygwLCAwLCAwLCAxLCAxKTsKKyAgICAgICAgIGdsRHJhd1RleGlPRVMoMCwgMCwgMCwgMSwgMSk7CisgICAgICAgICBnbEZpbmlzaCgpOworICAgICAgICAgdCA9IHN5c3RlbVRpbWUoKTsKKyAgICAgICAgIHByaW50ZigiZ2xGaW5pc2goKSB0aW1lID0gJWxsdSB1c1xuIiwgKHQtbm93KS8xMDAwKTsKKyAgICAgICAgIGZmbHVzaChzdGRvdXQpOworICAgICAgICAgZWdsU3dhcEJ1ZmZlcnMoZHB5LCBzdXJmYWNlKTsKKyAgICAgfQorCisgICAgIAorICAgICBwcmludGYoIjUxMng1MTIgKDF4MSB0ZXhlbCBNT0RJRklFRCB0ZXh0dXJlKSwgNTEyeDUxMiBibGl0OlxuIik7CisgICAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7CisgICAgIGZvciAoaT0wIDsgaTw0IDsgaSsrKSB7CisgICAgICAgICB1aW50MTZfdCBncmVlbiA9IDB4N0UwOworICAgICAgICAgR0xpbnQgY3JvcFs0XSA9IHsgMCwgNTEyLCA1MTIsIC01MTIgfTsKKyAgICAgICAgIGdsVGV4UGFyYW1ldGVyaXYoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9DUk9QX1JFQ1RfT0VTLCBjcm9wKTsKKyAgICAgICAgIGdsVGV4U3ViSW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCAwLCAwLCAxLCAxLCBHTF9SR0IsIEdMX1VOU0lHTkVEX1NIT1JUXzVfNl81LCAmZ3JlZW4pOworICAgICAgICAgbm93ID0gc3lzdGVtVGltZSgpOworICAgICAgICAgZ2xEcmF3VGV4aU9FUygwLCAwLCAwLCA1MTIsIDUxMik7CisgICAgICAgICBnbEZpbmlzaCgpOworICAgICAgICAgdCA9IHN5c3RlbVRpbWUoKTsKKyAgICAgICAgIHByaW50ZigiZ2xGaW5pc2goKSB0aW1lID0gJWxsdSB1c1xuIiwgKHQtbm93KS8xMDAwKTsKKyAgICAgICAgIGZmbHVzaChzdGRvdXQpOworICAgICAgICAgZWdsU3dhcEJ1ZmZlcnMoZHB5LCBzdXJmYWNlKTsKKyAgICAgfQorCisKKyAgICAgaW50MTZfdCB0ZXhlbCA9IDB4RjgwMDsKKyAgICAgZ2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIEdMX1JHQiwKKyAgICAgICAgICAgICAxLCAxLCAwLCBHTF9SR0IsIEdMX1VOU0lHTkVEX1NIT1JUXzVfNl81LCAmdGV4ZWwpOworCisgICAgIHByaW50ZigiMXgxIHVubW9kaWZpZWQgdGV4dHVyZSwgMXgxIGJsaXQ6XG4iKTsKKyAgICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUKTsKKyAgICAgZm9yIChpPTAgOyBpPDQgOyBpKyspIHsKKyAgICAgICAgIEdMaW50IGNyb3BbNF0gPSB7IDAsIDEsIDEsIC0xIH07CisgICAgICAgICBnbFRleFBhcmFtZXRlcml2KEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfQ1JPUF9SRUNUX09FUywgY3JvcCk7CisgICAgICAgICBub3cgPSBzeXN0ZW1UaW1lKCk7CisgICAgICAgICBnbERyYXdUZXhpT0VTKDAsIDAsIDAsIDEsIDEpOworICAgICAgICAgZ2xGaW5pc2goKTsKKyAgICAgICAgIHQgPSBzeXN0ZW1UaW1lKCk7CisgICAgICAgICBwcmludGYoImdsRmluaXNoKCkgdGltZSA9ICVsbHUgdXNcbiIsICh0LW5vdykvMTAwMCk7CisgICAgICAgICBlZ2xTd2FwQnVmZmVycyhkcHksIHN1cmZhY2UpOworICAgICB9CisKKyAgICAgcHJpbnRmKCIxeDEgdW5tb2RpZmllZCB0ZXh0dXJlLCA1MTJ4NTEyIGJsaXQ6XG4iKTsKKyAgICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUKTsKKyAgICAgZm9yIChpPTAgOyBpPDQgOyBpKyspIHsKKyAgICAgICAgIEdMaW50IGNyb3BbNF0gPSB7IDAsIDEsIDEsIC0xIH07CisgICAgICAgICBnbFRleFBhcmFtZXRlcml2KEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfQ1JPUF9SRUNUX09FUywgY3JvcCk7CisgICAgICAgICBub3cgPSBzeXN0ZW1UaW1lKCk7CisgICAgICAgICBnbERyYXdUZXhpT0VTKDAsIDAsIDAsIDUxMiwgNTEyKTsKKyAgICAgICAgIGdsRmluaXNoKCk7CisgICAgICAgICB0ID0gc3lzdGVtVGltZSgpOworICAgICAgICAgcHJpbnRmKCJnbEZpbmlzaCgpIHRpbWUgPSAlbGx1IHVzXG4iLCAodC1ub3cpLzEwMDApOworICAgICAgICAgZmZsdXNoKHN0ZG91dCk7CisgICAgICAgICBlZ2xTd2FwQnVmZmVycyhkcHksIHN1cmZhY2UpOworICAgICB9CisKKyAgICAgcHJpbnRmKCIxeDEgKDF4MSB0ZXhlbCBNT0RJRklFRCB0ZXh0dXJlKSwgNTEyeDUxMiBibGl0OlxuIik7CisgICAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7CisgICAgIGZvciAoaT0wIDsgaTw0IDsgaSsrKSB7CisgICAgICAgICB1aW50MTZfdCBncmVlbiA9IDB4N0UwOworICAgICAgICAgR0xpbnQgY3JvcFs0XSA9IHsgMCwgMSwgMSwgLTEgfTsKKyAgICAgICAgIGdsVGV4UGFyYW1ldGVyaXYoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9DUk9QX1JFQ1RfT0VTLCBjcm9wKTsKKyAgICAgICAgIGdsVGV4U3ViSW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCAwLCAwLCAxLCAxLCBHTF9SR0IsIEdMX1VOU0lHTkVEX1NIT1JUXzVfNl81LCAmZ3JlZW4pOworICAgICAgICAgbm93ID0gc3lzdGVtVGltZSgpOworICAgICAgICAgZ2xEcmF3VGV4aU9FUygwLCAwLCAwLCAxLCAxKTsKKyAgICAgICAgIGdsRmluaXNoKCk7CisgICAgICAgICB0ID0gc3lzdGVtVGltZSgpOworICAgICAgICAgcHJpbnRmKCJnbEZpbmlzaCgpIHRpbWUgPSAlbGx1IHVzXG4iLCAodC1ub3cpLzEwMDApOworICAgICAgICAgZmZsdXNoKHN0ZG91dCk7CisgICAgICAgICBlZ2xTd2FwQnVmZmVycyhkcHksIHN1cmZhY2UpOworICAgICB9CisKKyAgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvc2ZzaW0vQW5kcm9pZC5tayBiL29wZW5nbC90ZXN0cy9zZnNpbS9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhMWEwM2MKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvc2ZzaW0vQW5kcm9pZC5tawpAQCAtMCwwICsxLDE1IEBACitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVM6PSBcCisJZWdsX3N1cmZhY2UuY3BwIFwKKwlzZnNpbS5jCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAorICAgIGxpYkdMRVNfQ00KKworTE9DQUxfTU9EVUxFOj0gdGVzdC1vcGVuZ2wtc2ZzaW0KKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKKworaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCmRpZmYgLS1naXQgYS9vcGVuZ2wvdGVzdHMvc2ZzaW0vZWdsX3N1cmZhY2UuY3BwIGIvb3BlbmdsL3Rlc3RzL3Nmc2ltL2VnbF9zdXJmYWNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDc3N2Y4Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL3Nmc2ltL2VnbF9zdXJmYWNlLmNwcApAQCAtMCwwICsxLDM0NiBAQAorLyogCisgKioKKyAqKiBDb3B5cmlnaHQgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKioKKyAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UgVmVyc2lvbiAyLjAodGhlICJMaWNlbnNlIik7IAorICoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCisgKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorICoqCisgKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyAqKgorICoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyBzb2Z0d2FyZSAKKyAqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTIAorICoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5EIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisgKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisKKyNpbmNsdWRlIDxHTEVTL2VnbC5oPgorCisjaW5jbHVkZSAiZWdsX3N1cmZhY2UuaCIKKworI2RlZmluZSBMT0dJKHguLi4pIGRvIHsgcHJpbnRmKCJJTkZPOiAiIHgpOyB9IHdoaWxlICgwKQorI2RlZmluZSBMT0dXKHguLi4pIGRvIHsgcHJpbnRmKCJXQVJOOiAiIHgpOyB9IHdoaWxlICgwKQorI2RlZmluZSBMT0dFKHguLi4pIGRvIHsgcHJpbnRmKCJFUlI6ICIgeCk7IH0gd2hpbGUgKDApCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworZWdsX25hdGl2ZV93aW5kb3dfdCogYW5kcm9pZF9jcmVhdGVEaXNwbGF5U3VyZmFjZSgpCit7CisgICAgZWdsX25hdGl2ZV93aW5kb3dfdCogcyA9IG5ldyBhbmRyb2lkOjpFR0xEaXNwbGF5U3VyZmFjZSgpOworICAgIHMtPm1lbW9yeV90eXBlID0gTkFUSVZFX01FTU9SWV9UWVBFX0dQVTsKKyAgICByZXR1cm4gczsKK30KKworI2RlZmluZSBMSUtFTFkoIGV4cCApICAgICAgIChfX2J1aWx0aW5fZXhwZWN0KCAoZXhwKSAhPSAwLCB0cnVlICApKQorI2RlZmluZSBVTkxJS0VMWSggZXhwICkgICAgIChfX2J1aWx0aW5fZXhwZWN0KCAoZXhwKSAhPSAwLCBmYWxzZSApKQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCituYW1lc3BhY2UgYW5kcm9pZCB7CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0VHTERpc3BsYXlTdXJmYWNlOjpFR0xEaXNwbGF5U3VyZmFjZSgpCisgICAgOiBFR0xOYXRpdmVTdXJmYWNlPEVHTERpc3BsYXlTdXJmYWNlPigpCit7CisgICAgZWdsX25hdGl2ZV93aW5kb3dfdDo6dmVyc2lvbiA9IHNpemVvZihlZ2xfbmF0aXZlX3dpbmRvd190KTsKKyAgICBlZ2xfbmF0aXZlX3dpbmRvd190OjppZGVudCA9IDA7CisgICAgZWdsX25hdGl2ZV93aW5kb3dfdDo6aW5jUmVmID0gJkVHTERpc3BsYXlTdXJmYWNlOjpob29rX2luY1JlZjsKKyAgICBlZ2xfbmF0aXZlX3dpbmRvd190OjpkZWNSZWYgPSAmRUdMRGlzcGxheVN1cmZhY2U6Omhvb2tfZGVjUmVmOworICAgIGVnbF9uYXRpdmVfd2luZG93X3Q6OnN3YXBCdWZmZXJzID0gJkVHTERpc3BsYXlTdXJmYWNlOjpob29rX3N3YXBCdWZmZXJzOworICAgIGVnbF9uYXRpdmVfd2luZG93X3Q6OnNldFN3YXBSZWN0YW5nbGUgPSAmRUdMRGlzcGxheVN1cmZhY2U6Omhvb2tfc2V0U3dhcFJlY3RhbmdsZTsKKyAgICBlZ2xfbmF0aXZlX3dpbmRvd190OjpuZXh0QnVmZmVyID0gJkVHTERpc3BsYXlTdXJmYWNlOjpob29rX25leHRCdWZmZXI7CisgICAgZWdsX25hdGl2ZV93aW5kb3dfdDo6Y29ubmVjdCA9IDA7CisgICAgZWdsX25hdGl2ZV93aW5kb3dfdDo6ZGlzY29ubmVjdCA9IDA7CisKKyAgICBtRmJbMF0uZGF0YSA9IDA7CisgICAgbUZiWzFdLmRhdGEgPSAwOworICAgIGVnbF9uYXRpdmVfd2luZG93X3Q6OmZkID0gbWFwRnJhbWVCdWZmZXIoKTsKKyAgICBpZiAoZWdsX25hdGl2ZV93aW5kb3dfdDo6ZmQgPj0gMCkgeworICAgICAgICBjb25zdCBmbG9hdCBpbjJtbSA9IDI1LjRmOworICAgICAgICBmbG9hdCByZWZyZXNoUmF0ZSA9IDEwMDAwMDAwMDAwMDAwMDBMTFUgLyAoCisgICAgICAgICAgICAgICAgZmxvYXQoIG1JbmZvLnVwcGVyX21hcmdpbiArIG1JbmZvLmxvd2VyX21hcmdpbiArIG1JbmZvLnlyZXMgKSAKKyAgICAgICAgICAgICAgICAqICggbUluZm8ubGVmdF9tYXJnaW4gICsgbUluZm8ucmlnaHRfbWFyZ2luICsgbUluZm8ueHJlcyApCisgICAgICAgICAgICAgICAgKiBtSW5mby5waXhjbG9jayk7CisKKyAgICAgICAgY29uc3QgR0dMU3VyZmFjZSYgYnVmZmVyID0gbUZiWzEgLSBtSW5kZXhdOworICAgICAgICBlZ2xfbmF0aXZlX3dpbmRvd190Ojp3aWR0aCAgPSBidWZmZXIud2lkdGg7CisgICAgICAgIGVnbF9uYXRpdmVfd2luZG93X3Q6OmhlaWdodCA9IGJ1ZmZlci5oZWlnaHQ7CisgICAgICAgIGVnbF9uYXRpdmVfd2luZG93X3Q6OnN0cmlkZSA9IGJ1ZmZlci5zdHJpZGU7CisgICAgICAgIGVnbF9uYXRpdmVfd2luZG93X3Q6OmZvcm1hdCA9IGJ1ZmZlci5mb3JtYXQ7CisgICAgICAgIGVnbF9uYXRpdmVfd2luZG93X3Q6OmJhc2UgICA9IGludHB0cl90KG1GYlswXS5kYXRhKTsKKyAgICAgICAgZWdsX25hdGl2ZV93aW5kb3dfdDo6b2Zmc2V0ID0KKyAgICAgICAgICAgIGludHB0cl90KGJ1ZmZlci5kYXRhKSAtIGVnbF9uYXRpdmVfd2luZG93X3Q6OmJhc2U7CisgICAgICAgIGVnbF9uYXRpdmVfd2luZG93X3Q6OmZsYWdzICA9IDA7CisgICAgICAgIGVnbF9uYXRpdmVfd2luZG93X3Q6OnhkcGkgPSAobUluZm8ueHJlcyAqIGluMm1tKSAvIG1JbmZvLndpZHRoOworICAgICAgICBlZ2xfbmF0aXZlX3dpbmRvd190Ojp5ZHBpID0gKG1JbmZvLnlyZXMgKiBpbjJtbSkgLyBtSW5mby5oZWlnaHQ7CisgICAgICAgIGVnbF9uYXRpdmVfd2luZG93X3Q6OmZwcyAgPSByZWZyZXNoUmF0ZTsKKyAgICAgICAgZWdsX25hdGl2ZV93aW5kb3dfdDo6bWVtb3J5X3R5cGUgPSBOQVRJVkVfTUVNT1JZX1RZUEVfRkI7CisgICAgICAgIC8vIG5vIGVycm9yLCBzZXQgdGhlIG1hZ2ljIHdvcmQKKyAgICAgICAgZWdsX25hdGl2ZV93aW5kb3dfdDo6bWFnaWMgPSAweDYwMDkxMzsKKyAgICB9CisgICAgbVN3YXBDb3VudCA9IC0xOworICAgIG1QYWdlRmxpcENvdW50ID0gMDsKK30KKworRUdMRGlzcGxheVN1cmZhY2U6On5FR0xEaXNwbGF5U3VyZmFjZSgpCit7CisgICAgbWFnaWMgPSAwOworICAgIGNsb3NlKGVnbF9uYXRpdmVfd2luZG93X3Q6OmZkKTsKKyAgICBtdW5tYXAobUZiWzBdLmRhdGEsIG1TaXplKTsKKyAgICBpZiAoIShtRmxhZ3MgJiBQQUdFX0ZMSVApKQorICAgICAgICBmcmVlKCh2b2lkKiltRmJbMV0uZGF0YSk7Cit9CisKK3ZvaWQgRUdMRGlzcGxheVN1cmZhY2U6Omhvb2tfaW5jUmVmKE5hdGl2ZVdpbmRvd1R5cGUgd2luZG93KSB7CisgICAgRUdMRGlzcGxheVN1cmZhY2UqIHRoYXQgPSBzdGF0aWNfY2FzdDxFR0xEaXNwbGF5U3VyZmFjZSo+KHdpbmRvdyk7CisgICAgdGhhdC0+aW5jU3Ryb25nKHRoYXQpOworfQordm9pZCBFR0xEaXNwbGF5U3VyZmFjZTo6aG9va19kZWNSZWYoTmF0aXZlV2luZG93VHlwZSB3aW5kb3cpIHsKKyAgICBFR0xEaXNwbGF5U3VyZmFjZSogdGhhdCA9IHN0YXRpY19jYXN0PEVHTERpc3BsYXlTdXJmYWNlKj4od2luZG93KTsKKyAgICB0aGF0LT5kZWNTdHJvbmcodGhhdCk7Cit9Cit1aW50MzJfdCBFR0xEaXNwbGF5U3VyZmFjZTo6aG9va19zd2FwQnVmZmVycyhOYXRpdmVXaW5kb3dUeXBlIHdpbmRvdykgeworICAgIEVHTERpc3BsYXlTdXJmYWNlKiB0aGF0ID0gc3RhdGljX2Nhc3Q8RUdMRGlzcGxheVN1cmZhY2UqPih3aW5kb3cpOworICAgIHJldHVybiB0aGF0LT5zd2FwQnVmZmVycygpOworfQordWludDMyX3QgRUdMRGlzcGxheVN1cmZhY2U6Omhvb2tfbmV4dEJ1ZmZlcihOYXRpdmVXaW5kb3dUeXBlIHdpbmRvdykgeworICAgIEVHTERpc3BsYXlTdXJmYWNlKiB0aGF0ID0gc3RhdGljX2Nhc3Q8RUdMRGlzcGxheVN1cmZhY2UqPih3aW5kb3cpOworICAgIHJldHVybiB0aGF0LT5uZXh0QnVmZmVyKCk7Cit9Cit2b2lkIEVHTERpc3BsYXlTdXJmYWNlOjpob29rX3NldFN3YXBSZWN0YW5nbGUoTmF0aXZlV2luZG93VHlwZSB3aW5kb3csCisgICAgICAgIGludCBsLCBpbnQgdCwgaW50IHcsIGludCBoKSB7CisgICAgRUdMRGlzcGxheVN1cmZhY2UqIHRoYXQgPSBzdGF0aWNfY2FzdDxFR0xEaXNwbGF5U3VyZmFjZSo+KHdpbmRvdyk7CisgICAgdGhhdC0+c2V0U3dhcFJlY3RhbmdsZShsLCB0LCB3LCBoKTsKK30KKwordm9pZCBFR0xEaXNwbGF5U3VyZmFjZTo6c2V0U3dhcFJlY3RhbmdsZShpbnQgbCwgaW50IHQsIGludCB3LCBpbnQgaCkKK3sKKyAgICBtSW5mby5yZXNlcnZlZFswXSA9IDB4NTQ0NDUwNTU7IC8vICJVUERUIjsKKyAgICBtSW5mby5yZXNlcnZlZFsxXSA9ICh1aW50MTZfdClsIHwgKCh1aW50MzJfdCl0IDw8IDE2KTsKKyAgICBtSW5mby5yZXNlcnZlZFsyXSA9ICh1aW50MTZfdCkobCt3KSB8ICgodWludDMyX3QpKHQraCkgPDwgMTYpOworfQorCit1aW50MzJfdCBFR0xEaXNwbGF5U3VyZmFjZTo6c3dhcEJ1ZmZlcnMoKQoreworICAgIGlmICghKG1GbGFncyAmIFBBR0VfRkxJUCkpCisgICAgICAgIHJldHVybiAwOworCisgICAgLy8gZG8gdGhlIGFjdHVhbCBmbGlwCisgICAgbUluZGV4ID0gMSAtIG1JbmRleDsKKyAgICBtSW5mby5hY3RpdmF0ZSA9IEZCX0FDVElWQVRFX1ZCTDsKKyAgICBtSW5mby55b2Zmc2V0ID0gbUluZGV4ID8gbUluZm8ueXJlcyA6IDA7CisgICAgaWYgKGlvY3RsKGVnbF9uYXRpdmVfd2luZG93X3Q6OmZkLCBGQklPUFVUX1ZTQ1JFRU5JTkZPLCAmbUluZm8pID09IC0xKSB7CisgICAgICAgIExPR0UoIkZCSU9QVVRfVlNDUkVFTklORk8gZmFpbGVkIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8qCisgICAgICogdGhpcyBpcyBhIG1vbnN0cnVvdXMgaGFjazogQmVjYXVzZSB0aGUgaC93IGFjY2VsZXJhdG9yIGlzIG5vdCBhYmxlCisgICAgICogdG8gcmVuZGVyIGRpcmVjdGx5IGludG8gdGhlIGZyYW1lYnVmZmVyLCB3ZSBuZWVkIHRvIGNvcHkgaXRzCisgICAgICogaW50ZXJuYWwgZnJhbWVidWZmZXIgb3V0IHRvIHRoZSBmYi4gdGhlIGJhc2UgYWRkcmVzcyBvZiB0aGUgaW50ZXJuYWwgZmIKKyAgICAgKiBpcyBnaXZlbiBpbiBvZW1bMF0uIAorICAgICAqIEFsbCB0aGlzIGlzIG5lZWRlZCBvbmx5IGluIHN0YW5kYWxvbmUgbW9kZSwgaW4gU3VyZmFjZUZsaW5nZXIgbW9kZQorICAgICAqIHdlIGNvbnRyb2wgd2hlcmUgdGhlIEdQVSByZW5kZXJzLgorICAgICAqLworICAgIGlmIChlZ2xfbmF0aXZlX3dpbmRvd190OjptZW1vcnlfdHlwZSA9PSBOQVRJVkVfTUVNT1JZX1RZUEVfR1BVICYmIG9lbVswXSkgeworICAgICAgICAvLyBjb3VsZCB1c2UgTURQIGhlcmUsIGJ1dCB0aGF0J3MgdHJpY2t5IGJlY2F1c2Ugd2UgbmVlZAorICAgICAgICAvLyAvZGV2L3BtZW1fZ3B1KiBmaWxlZGVzY3JpcHRvcgorICAgICAgICBjb25zdCBHR0xTdXJmYWNlJiBidWZmZXIgPSBtRmJbbUluZGV4XTsKKyAgICAgICAgbWVtY3B5KCBidWZmZXIuZGF0YSwKKyAgICAgICAgICAgICAgICAodm9pZCopKG9lbVswXSArIGVnbF9uYXRpdmVfd2luZG93X3Q6Om9mZnNldCksCisgICAgICAgICAgICAgICAgYnVmZmVyLnN0cmlkZSpidWZmZXIuaGVpZ2h0KjIpOworICAgIH0KKworICAgIC8vIHVwZGF0ZSB0aGUgYWRkcmVzcyBvZiB0aGUgYnVmZmVyIHRvIGRyYXcgdG8gbmV4dAorICAgIGNvbnN0IEdHTFN1cmZhY2UmIGJ1ZmZlciA9IG1GYlsxIC0gbUluZGV4XTsKKyAgICBlZ2xfbmF0aXZlX3dpbmRvd190OjpvZmZzZXQgPQorICAgICAgICBpbnRwdHJfdChidWZmZXIuZGF0YSkgLSBlZ2xfbmF0aXZlX3dpbmRvd190OjpiYXNlOworCisgICAgbVBhZ2VGbGlwQ291bnQrKzsKKworICAgIC8vIFdlIGRvbid0IHN1cHBvcnQgc2NyZWVuLXNpemUgY2hhbmdlcyBmb3Igbm93CisgICAgcmV0dXJuIDA7Cit9CisKK2ludDMyX3QgRUdMRGlzcGxheVN1cmZhY2U6OmdldFBhZ2VGbGlwQ291bnQoKSBjb25zdAoreworICAgIHJldHVybiBtUGFnZUZsaXBDb3VudDsKK30KKwordWludDMyX3QgRUdMRGlzcGxheVN1cmZhY2U6Om5leHRCdWZmZXIoKQoreworICAgIC8vIHVwZGF0ZSB0aGUgYWRkcmVzcyBvZiB0aGUgYnVmZmVyIHRvIGRyYXcgdG8gbmV4dAorICAgIGNvbnN0IEdHTFN1cmZhY2UmIGJ1ZmZlciA9IG1GYlttSW5kZXhdOworICAgIGVnbF9uYXRpdmVfd2luZG93X3Q6Om9mZnNldCA9CisgICAgICAgIGludHB0cl90KGJ1ZmZlci5kYXRhKSAtIGVnbF9uYXRpdmVfd2luZG93X3Q6OmJhc2U7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBFR0xEaXNwbGF5U3VyZmFjZTo6bWFwRnJhbWVCdWZmZXIoKQoreworICAgIGNoYXIgY29uc3QgKiBjb25zdCBkZXZpY2VfdGVtcGxhdGVbXSA9IHsKKyAgICAgICAgICAgICIvZGV2L2dyYXBoaWNzL2ZiJXUiLAorICAgICAgICAgICAgIi9kZXYvZmIldSIsCisgICAgICAgICAgICAwIH07CisgICAgaW50IGZkID0gLTE7CisgICAgaW50IGk9MDsKKyAgICBjaGFyIG5hbWVbNjRdOworICAgIHdoaWxlICgoZmQ9PS0xKSAmJiBkZXZpY2VfdGVtcGxhdGVbaV0pIHsKKyAgICAgICAgc25wcmludGYobmFtZSwgNjQsIGRldmljZV90ZW1wbGF0ZVtpXSwgMCk7CisgICAgICAgIGZkID0gb3BlbihuYW1lLCBPX1JEV1IsIDApOworICAgICAgICBpKys7CisgICAgfQorICAgIGlmIChmZCA8IDApCisgICAgICAgIHJldHVybiAtZXJybm87CisKKyAgICBzdHJ1Y3QgZmJfZml4X3NjcmVlbmluZm8gZmluZm87CisgICAgaWYgKGlvY3RsKGZkLCBGQklPR0VUX0ZTQ1JFRU5JTkZPLCAmZmluZm8pID09IC0xKQorICAgICAgICByZXR1cm4gLWVycm5vOworCisgICAgc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvIGluZm87CisgICAgaWYgKGlvY3RsKGZkLCBGQklPR0VUX1ZTQ1JFRU5JTkZPLCAmaW5mbykgPT0gLTEpCisgICAgICAgIHJldHVybiAtZXJybm87CisKKyAgICBpbmZvLnJlc2VydmVkWzBdID0gMDsKKyAgICBpbmZvLnJlc2VydmVkWzFdID0gMDsKKyAgICBpbmZvLnJlc2VydmVkWzJdID0gMDsKKyAgICBpbmZvLnhvZmZzZXQgPSAwOworICAgIGluZm8ueW9mZnNldCA9IDA7CisgICAgaW5mby55cmVzX3ZpcnR1YWwgPSBpbmZvLnlyZXMgKiAyOworICAgIGluZm8uYml0c19wZXJfcGl4ZWwgPSAxNjsKKyAgICBpbmZvLmFjdGl2YXRlID0gRkJfQUNUSVZBVEVfTk9XOworCisgICAgdWludDMyX3QgZmxhZ3MgPSBQQUdFX0ZMSVA7CisgICAgaWYgKGlvY3RsKGZkLCBGQklPUFVUX1ZTQ1JFRU5JTkZPLCAmaW5mbykgPT0gLTEpIHsKKyAgICAgICAgaW5mby55cmVzX3ZpcnR1YWwgPSBpbmZvLnlyZXM7CisgICAgICAgIGZsYWdzICY9IH5QQUdFX0ZMSVA7CisgICAgICAgIExPR1coIkZCSU9QVVRfVlNDUkVFTklORk8gZmFpbGVkLCBwYWdlIGZsaXBwaW5nIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICB9CisKKyAgICBpZiAoaW5mby55cmVzX3ZpcnR1YWwgPCBpbmZvLnlyZXMgKiAyKSB7CisgICAgICAgIGluZm8ueXJlc192aXJ0dWFsID0gaW5mby55cmVzOworICAgICAgICBmbGFncyAmPSB+UEFHRV9GTElQOworICAgICAgICBMT0dXKCJwYWdlIGZsaXBwaW5nIG5vdCBzdXBwb3J0ZWQgKHlyZXNfdmlydHVhbD0lZCwgcmVxdWVzdGVkPSVkKSIsCisgICAgICAgICAgICAgICAgaW5mby55cmVzX3ZpcnR1YWwsIGluZm8ueXJlcyoyKTsKKyAgICB9CisKKyAgICBpZiAoaW9jdGwoZmQsIEZCSU9HRVRfVlNDUkVFTklORk8sICZpbmZvKSA9PSAtMSkKKyAgICAgICAgcmV0dXJuIC1lcnJubzsgICAgCisKKyAgICBpbnQgcmVmcmVzaFJhdGUgPSAxMDAwMDAwMDAwMDAwMDAwTExVIC8gCisgICAgKAorICAgICAgICAgICAgdWludDY0X3QoIGluZm8udXBwZXJfbWFyZ2luICsgaW5mby5sb3dlcl9tYXJnaW4gKyBpbmZvLnlyZXMgKSAKKyAgICAgICAgICAgICogKCBpbmZvLmxlZnRfbWFyZ2luICArIGluZm8ucmlnaHRfbWFyZ2luICsgaW5mby54cmVzICkKKyAgICAgICAgICAgICogaW5mby5waXhjbG9jaworICAgICk7CisKKyAgICBpZiAocmVmcmVzaFJhdGUgPT0gMCkgeworICAgICAgICAvLyBibGVhZ2gsIGJhZCBpbmZvIGZyb20gdGhlIGRyaXZlcgorICAgICAgICByZWZyZXNoUmF0ZSA9IDYwKjEwMDA7ICAvLyA2MCBIegorICAgIH0KKworICAgIGlmIChpbnQoaW5mby53aWR0aCkgPD0gMCB8fCBpbnQoaW5mby5oZWlnaHQpIDw9IDApIHsKKyAgICAgICAgLy8gc3R1cGlkIGRyaXZlciwgZG9lc24ndCByZXR1cm4gdGhhdCBpbmZvcm1hdGlvbgorICAgICAgICAvLyBkZWZhdWx0IHRvIFNvb25lcidzIHNjcmVlbiBzaXplICgxNjAgZHBpKQorICAgICAgICBpbmZvLndpZHRoICA9IDUxOworICAgICAgICBpbmZvLmhlaWdodCA9IDM4OworICAgIH0KKworICAgIGZsb2F0IHhkcGkgPSAoaW5mby54cmVzICogMjUuNGYpIC8gaW5mby53aWR0aDsgCisgICAgZmxvYXQgeWRwaSA9IChpbmZvLnlyZXMgKiAyNS40ZikgLyBpbmZvLmhlaWdodDsKKyAgICBmbG9hdCBmcHMgID0gcmVmcmVzaFJhdGUgLyAxMDAwLjBmOyAKKworICAgIExPR0koICAgInVzaW5nIChmZD0lZClcbiIKKyAgICAgICAgICAgICJpZCAgICAgICAgICAgPSAlc1xuIgorICAgICAgICAgICAgInhyZXMgICAgICAgICA9ICVkIHB4XG4iCisgICAgICAgICAgICAieXJlcyAgICAgICAgID0gJWQgcHhcbiIKKyAgICAgICAgICAgICJ4cmVzX3ZpcnR1YWwgPSAlZCBweFxuIgorICAgICAgICAgICAgInlyZXNfdmlydHVhbCA9ICVkIHB4XG4iCisgICAgICAgICAgICAiYnBwICAgICAgICAgID0gJWRcbiIKKyAgICAgICAgICAgICJyICAgICAgICAgICAgPSAlMnU6JXVcbiIKKyAgICAgICAgICAgICJnICAgICAgICAgICAgPSAlMnU6JXVcbiIKKyAgICAgICAgICAgICJiICAgICAgICAgICAgPSAlMnU6JXVcbiIsCisgICAgICAgICAgICBmZCwKKyAgICAgICAgICAgIGZpbmZvLmlkLAorICAgICAgICAgICAgaW5mby54cmVzLAorICAgICAgICAgICAgaW5mby55cmVzLAorICAgICAgICAgICAgaW5mby54cmVzX3ZpcnR1YWwsCisgICAgICAgICAgICBpbmZvLnlyZXNfdmlydHVhbCwKKyAgICAgICAgICAgIGluZm8uYml0c19wZXJfcGl4ZWwsCisgICAgICAgICAgICBpbmZvLnJlZC5vZmZzZXQsIGluZm8ucmVkLmxlbmd0aCwKKyAgICAgICAgICAgIGluZm8uZ3JlZW4ub2Zmc2V0LCBpbmZvLmdyZWVuLmxlbmd0aCwKKyAgICAgICAgICAgIGluZm8uYmx1ZS5vZmZzZXQsIGluZm8uYmx1ZS5sZW5ndGgKKyAgICApOworCisgICAgTE9HSSggICAid2lkdGggICAgICAgID0gJWQgbW0gKCVmIGRwaSlcbiIKKyAgICAgICAgICAgICJoZWlnaHQgICAgICAgPSAlZCBtbSAoJWYgZHBpKVxuIgorICAgICAgICAgICAgInJlZnJlc2ggcmF0ZSA9ICUuMmYgSHpcbiIsCisgICAgICAgICAgICBpbmZvLndpZHRoLCAgeGRwaSwKKyAgICAgICAgICAgIGluZm8uaGVpZ2h0LCB5ZHBpLAorICAgICAgICAgICAgZnBzCisgICAgKTsKKworICAgIAorICAgIGlmIChpb2N0bChmZCwgRkJJT0dFVF9GU0NSRUVOSU5GTywgJmZpbmZvKSA9PSAtMSkKKyAgICAgICAgcmV0dXJuIC1lcnJubzsKKworICAgIGlmIChmaW5mby5zbWVtX2xlbiA8PSAwKQorICAgICAgICByZXR1cm4gLWVycm5vOworCisgICAgLyoKKyAgICAgKiBPcGVuIGFuZCBtYXAgdGhlIGRpc3BsYXkuCisgICAgICovCisKKyAgICB2b2lkKiBidWZmZXIgID0gKHVpbnQxNl90KikgbW1hcCgKKyAgICAgICAgICAgIDAsIGZpbmZvLnNtZW1fbGVuLAorICAgICAgICAgICAgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKKyAgICAgICAgICAgIE1BUF9TSEFSRUQsCisgICAgICAgICAgICBmZCwgMCk7CisKKyAgICBpZiAoYnVmZmVyID09IE1BUF9GQUlMRUQpCisgICAgICAgIHJldHVybiAtZXJybm87CisKKyAgICAvLyBhdCBsZWFzdCBmb3Igbm93LCBhbHdheXMgY2xlYXIgdGhlIGZiCisgICAgbWVtc2V0KGJ1ZmZlciwgMCwgZmluZm8uc21lbV9sZW4pOworCisgICAgdWludDhfdCogb2Zmc2NyZWVuWzJdOworICAgIG9mZnNjcmVlblswXSA9ICh1aW50OF90KilidWZmZXI7CisgICAgaWYgKGZsYWdzICYgUEFHRV9GTElQKSB7CisgICAgICAgIG9mZnNjcmVlblsxXSA9ICh1aW50OF90KilidWZmZXIgKyBmaW5mby5saW5lX2xlbmd0aCppbmZvLnlyZXM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgb2Zmc2NyZWVuWzFdID0gKHVpbnQ4X3QqKW1hbGxvYyhmaW5mby5zbWVtX2xlbik7CisgICAgICAgIGlmIChvZmZzY3JlZW5bMV0gPT0gMCkgeworICAgICAgICAgICAgbXVubWFwKGJ1ZmZlciwgZmluZm8uc21lbV9sZW4pOworICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtRmxhZ3MgPSBmbGFnczsKKyAgICBtSW5mbyA9IGluZm87CisgICAgbUZpbmZvID0gZmluZm87CisgICAgbVNpemUgPSBmaW5mby5zbWVtX2xlbjsKKyAgICBtSW5kZXggPSAwOworICAgIGZvciAoaW50IGk9MCA7IGk8MiA7IGkrKykgeworICAgICAgICBtRmJbaV0udmVyc2lvbiA9IHNpemVvZihHR0xTdXJmYWNlKTsKKyAgICAgICAgbUZiW2ldLndpZHRoICAgPSBpbmZvLnhyZXM7CisgICAgICAgIG1GYltpXS5oZWlnaHQgID0gaW5mby55cmVzOworICAgICAgICBtRmJbaV0uc3RyaWRlICA9IGZpbmZvLmxpbmVfbGVuZ3RoIC8gKGluZm8uYml0c19wZXJfcGl4ZWwgPj4gMyk7CisgICAgICAgIG1GYltpXS5kYXRhICAgID0gKHVpbnQ4X3QqKShvZmZzY3JlZW5baV0pOworICAgICAgICBtRmJbaV0uZm9ybWF0ICA9IE5BVElWRV9QSVhFTF9GT1JNQVRfUkdCXzU2NTsKKyAgICB9CisgICAgcmV0dXJuIGZkOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL3Nmc2ltL2VnbF9zdXJmYWNlLmggYi9vcGVuZ2wvdGVzdHMvc2ZzaW0vZWdsX3N1cmZhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGE5NGZjCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL3Nmc2ltL2VnbF9zdXJmYWNlLmgKQEAgLTAsMCArMSwxMTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfU0lNX0VHTF9TVVJGQUNFX0gKKyNkZWZpbmUgQU5EUk9JRF9TSU1fRUdMX1NVUkZBQ0VfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPEdMRVMvZWdsbmF0aXZlcy5oPgorCisjaW5jbHVkZSA8bGludXgvZmIuaD4KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHNzaXplX3QgICAgdmVyc2lvbjsgICAgLy8gYWx3YXlzIHNldCB0byBzaXplb2YoR0dMU3VyZmFjZSkKKyAgICB1aW50MzJfdCAgIHdpZHRoOyAgICAgIC8vIHdpZHRoIGluIHBpeGVscworICAgIHVpbnQzMl90ICAgaGVpZ2h0OyAgICAgLy8gaGVpZ2h0IGluIHBpeGVscworICAgIGludDMyX3QgICAgc3RyaWRlOyAgICAgLy8gc3RyaWRlIGluIHBpeGVscworICAgIHVpbnQ4X3QqICAgZGF0YTsgICAgICAgLy8gcG9pbnRlciB0byB0aGUgYml0cworICAgIHVpbnQ4X3QgICAgZm9ybWF0OyAgICAgLy8gcGl4ZWwgZm9ybWF0CisgICAgdWludDhfdCAgICByZnVbM107ICAgICAvLyBtdXN0IGJlIHplcm8KKyAgICB2b2lkKiAgICAgIHJlc2VydmVkOworfSBHR0xTdXJmYWNlOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK25hbWVzcGFjZSBhbmRyb2lkIHsKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0ZW1wbGF0ZSA8Y2xhc3MgVFlQRT4KK2NsYXNzIEVHTE5hdGl2ZVN1cmZhY2UgOiBwdWJsaWMgZWdsX25hdGl2ZV93aW5kb3dfdAoreworcHVibGljOgorICAgIEVHTE5hdGl2ZVN1cmZhY2UoKSA6IG1Db3VudCgwKSB7IAorICAgICAgICBtZW1zZXQoZWdsX25hdGl2ZV93aW5kb3dfdDo6cmVzZXJ2ZWQsIDAsIAorICAgICAgICAgICAgICAgIHNpemVvZihlZ2xfbmF0aXZlX3dpbmRvd190OjpyZXNlcnZlZCkpOworICAgICAgICBtZW1zZXQoZWdsX25hdGl2ZV93aW5kb3dfdDo6cmVzZXJ2ZWRfcHJvYywgMCwgCisgICAgICAgICAgICAgICAgc2l6ZW9mKGVnbF9uYXRpdmVfd2luZG93X3Q6OnJlc2VydmVkX3Byb2MpKTsKKyAgICAgICAgbWVtc2V0KGVnbF9uYXRpdmVfd2luZG93X3Q6Om9lbSwgMCwgCisgICAgICAgICAgICAgICAgc2l6ZW9mKGVnbF9uYXRpdmVfd2luZG93X3Q6Om9lbSkpOworICAgIH0KKyAgICBpbmxpbmUgdm9pZCBpbmNTdHJvbmcodm9pZCopIGNvbnN0IHsKKyAgICAgICAgLyogaW4gYSByZWFsIGltcGxlbWVudGF0aW9uLCB0aGUgaW5jIG11c3QgYmUgYXRvbWljICovCisgICAgICAgIG1Db3VudCsrOworICAgIH0KKyAgICBpbmxpbmUgdm9pZCBkZWNTdHJvbmcodm9pZCopIGNvbnN0IHsKKyAgICAgICAgLyogaW4gYSByZWFsIGltcGxlbWVudGF0aW9uLCB0aGUgZGVjIG11c3QgYmUgYXRvbWljICovCisgICAgICAgIGlmICgtLW1Db3VudCA9PSAxKSB7CisgICAgICAgICAgICAgZGVsZXRlIHN0YXRpY19jYXN0PGNvbnN0IFRZUEUqPih0aGlzKTsKKyAgICAgICAgIH0KKyAgICB9Citwcm90ZWN0ZWQ6CisgICAgRUdMTmF0aXZlU3VyZmFjZSYgb3BlcmF0b3IgPSAoY29uc3QgRUdMTmF0aXZlU3VyZmFjZSYgcmhzKTsKKyAgICBFR0xOYXRpdmVTdXJmYWNlKGNvbnN0IEVHTE5hdGl2ZVN1cmZhY2UmIHJocyk7CisgICAgaW5saW5lIH5FR0xOYXRpdmVTdXJmYWNlKCkgeyB9OworICAgIG11dGFibGUgdm9sYXRpbGUgaW50MzJfdCBtQ291bnQ7Cit9OworCisKK2NsYXNzIEVHTERpc3BsYXlTdXJmYWNlIDogcHVibGljIEVHTE5hdGl2ZVN1cmZhY2U8RUdMRGlzcGxheVN1cmZhY2U+Cit7CitwdWJsaWM6CisgICAgRUdMRGlzcGxheVN1cmZhY2UoKTsKKyAgICB+RUdMRGlzcGxheVN1cmZhY2UoKTsKKworICAgIGludDMyX3QgZ2V0UGFnZUZsaXBDb3VudCgpIGNvbnN0OworCitwcml2YXRlOgorICAgIHN0YXRpYyB2b2lkICAgICAgICAgaG9va19pbmNSZWYoTmF0aXZlV2luZG93VHlwZSB3aW5kb3cpOworICAgIHN0YXRpYyB2b2lkICAgICAgICAgaG9va19kZWNSZWYoTmF0aXZlV2luZG93VHlwZSB3aW5kb3cpOworICAgIHN0YXRpYyB1aW50MzJfdCAgICAgaG9va19zd2FwQnVmZmVycyhOYXRpdmVXaW5kb3dUeXBlIHdpbmRvdyk7CisgICAgc3RhdGljIHZvaWQgICAgICAgICBob29rX3NldFN3YXBSZWN0YW5nbGUoTmF0aXZlV2luZG93VHlwZSB3aW5kb3csIGludCBsLCBpbnQgdCwgaW50IHcsIGludCBoKTsKKyAgICBzdGF0aWMgdWludDMyX3QgICAgIGhvb2tfbmV4dEJ1ZmZlcihOYXRpdmVXaW5kb3dUeXBlIHdpbmRvdyk7CisKKyAgICB1aW50MzJfdCAgICBzd2FwQnVmZmVycygpOworICAgIHVpbnQzMl90ICAgIG5leHRCdWZmZXIoKTsKKyAgICB2b2lkICAgICAgICBzZXRTd2FwUmVjdGFuZ2xlKGludCBsLCBpbnQgdCwgaW50IHcsIGludCBoKTsKKworICAgIGludCAgICBtYXBGcmFtZUJ1ZmZlcigpOworCisgICAgZW51bSB7CisgICAgICAgIFBBR0VfRkxJUCA9IDB4MDAwMDAwMDEKKyAgICB9OworICAgIEdHTFN1cmZhY2UgICAgICAgICAgbUZiWzJdOworICAgIGludCAgICAgICAgICAgICAgICAgbUluZGV4OworICAgIHVpbnQzMl90ICAgICAgICAgICAgbUZsYWdzOworICAgIHNpemVfdCAgICAgICAgICAgICAgbVNpemU7CisgICAgZmJfdmFyX3NjcmVlbmluZm8gICBtSW5mbzsKKyAgICBmYl9maXhfc2NyZWVuaW5mbyAgIG1GaW5mbzsKKyAgICBpbnQzMl90ICAgICAgICAgICAgIG1QYWdlRmxpcENvdW50OworICAgIGludDMyX3QgICAgICAgICAgICAgbVN3YXBDb3VudDsKKyAgICB1aW50MzJfdCAgICAgICAgICAgIG1GZWF0dXJlRmxhZ3M7Cit9OworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2VuZGlmIC8vIEFORFJPSURfU0lNX0VHTF9TVVJGQUNFX0gKKwpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL3Nmc2ltL3Nmc2ltLmMgYi9vcGVuZ2wvdGVzdHMvc2ZzaW0vc2ZzaW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGJhNDkwCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL3Nmc2ltL3Nmc2ltLmMKQEAgLTAsMCArMSwxMTIgQEAKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSA8R0xFUy9lZ2wuaD4KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KQoreworICAgIGlmIChhcmdjICE9IDIpIHsKKyAgICAgICAgcHJpbnRmKCJ1c2FnZTogJXMgPDAtNj5cbiIsIGFyZ3ZbMF0pOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgCisgICAgY29uc3QgaW50IHRlc3QgPSBhdG9pKGFyZ3ZbMV0pOworCisgICAgRUdMaW50IHNfY29uZmlnQXR0cmlic1tdID0geworICAgICAgICAgRUdMX1JFRF9TSVpFLCAgICAgICA1LAorICAgICAgICAgRUdMX0dSRUVOX1NJWkUsICAgICA2LAorICAgICAgICAgRUdMX0JMVUVfU0laRSwgICAgICA1LAorICAgICAgICAgRUdMX05PTkUKKyAgICAgfTsKKyAgICAgCisgICAgIEVHTGludCBudW1Db25maWdzID0gLTE7CisgICAgIEVHTGludCBtYWpvclZlcnNpb247CisgICAgIEVHTGludCBtaW5vclZlcnNpb247CisgICAgIEVHTENvbmZpZyBjb25maWc7CisgICAgIEVHTENvbnRleHQgY29udGV4dDsKKyAgICAgRUdMU3VyZmFjZSBzdXJmYWNlOworICAgICBFR0xpbnQgdywgaDsKKyAgICAgCisgICAgIEVHTERpc3BsYXkgZHB5OworCisgICAgIGRweSA9IGVnbEdldERpc3BsYXkoRUdMX0RFRkFVTFRfRElTUExBWSk7CisgICAgIGVnbEluaXRpYWxpemUoZHB5LCAmbWFqb3JWZXJzaW9uLCAmbWlub3JWZXJzaW9uKTsKKyAgICAgZWdsQ2hvb3NlQ29uZmlnKGRweSwgc19jb25maWdBdHRyaWJzLCAmY29uZmlnLCAxLCAmbnVtQ29uZmlncyk7CisgICAgIHN1cmZhY2UgPSBlZ2xDcmVhdGVXaW5kb3dTdXJmYWNlKGRweSwgY29uZmlnLAorICAgICAgICAgICAgIGFuZHJvaWRfY3JlYXRlRGlzcGxheVN1cmZhY2UoKSwgTlVMTCk7CisgICAgIGNvbnRleHQgPSBlZ2xDcmVhdGVDb250ZXh0KGRweSwgY29uZmlnLCBOVUxMLCBOVUxMKTsKKyAgICAgZWdsTWFrZUN1cnJlbnQoZHB5LCBzdXJmYWNlLCBzdXJmYWNlLCBjb250ZXh0KTsgICAKKyAgICAgZWdsUXVlcnlTdXJmYWNlKGRweSwgc3VyZmFjZSwgRUdMX1dJRFRILCAmdyk7CisgICAgIGVnbFF1ZXJ5U3VyZmFjZShkcHksIHN1cmZhY2UsIEVHTF9IRUlHSFQsICZoKTsKKyAgICAgR0xpbnQgZGltID0gdzxoID8gdyA6IGg7CisKKyAgICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUKTsKKworICAgICBHTGludCBjcm9wWzRdID0geyAwLCA0LCA0LCAtNCB9OworICAgICBnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIDApOworICAgICBnbFRleFBhcmFtZXRlcml2KEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfQ1JPUF9SRUNUX09FUywgY3JvcCk7CisgICAgIGdsVGV4UGFyYW1ldGVyeChHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01BR19GSUxURVIsIEdMX0xJTkVBUik7CisgICAgIGdsVGV4UGFyYW1ldGVyeChHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01JTl9GSUxURVIsIEdMX0xJTkVBUik7CisgICAgIGdsVGV4RW52eChHTF9URVhUVVJFX0VOViwgR0xfVEVYVFVSRV9FTlZfTU9ERSwgR0xfUkVQTEFDRSk7CisgICAgIGdsRW5hYmxlKEdMX1RFWFRVUkVfMkQpOworICAgICBnbENvbG9yNGYoMSwxLDEsMSk7CisKKyAgICAgLy8gcGFja2luZyBpcyBhbHdheXMgNAorICAgICB1aW50OF90IHQ4W10gID0geyAKKyAgICAgICAgICAgICAweDAwLCAweDU1LCAweDAwLCAweDU1LCAKKyAgICAgICAgICAgICAweEFBLCAweEZGLCAweEFBLCAweEZGLAorICAgICAgICAgICAgIDB4MDAsIDB4NTUsIDB4MDAsIDB4NTUsIAorICAgICAgICAgICAgIDB4QUEsIDB4RkYsIDB4QUEsIDB4RkYgIH07CisKKyAgICAgdWludDE2X3QgdDE2W10gID0geyAKKyAgICAgICAgICAgICAweDAwMDAsIDB4NTU1NSwgMHgwMDAwLCAweDU1NTUsIAorICAgICAgICAgICAgIDB4QUFBQSwgMHhGRkZGLCAweEFBQUEsIDB4RkZGRiwKKyAgICAgICAgICAgICAweDAwMDAsIDB4NTU1NSwgMHgwMDAwLCAweDU1NTUsIAorICAgICAgICAgICAgIDB4QUFBQSwgMHhGRkZGLCAweEFBQUEsIDB4RkZGRiAgfTsKKworICAgICB1aW50MTZfdCB0NTU1MVtdICA9IHsgCisgICAgICAgICAgICAgMHgwMDAwLCAweEZGRkYsIDB4MDAwMCwgMHhGRkZGLCAKKyAgICAgICAgICAgICAweEZGRkYsIDB4MDAwMCwgMHhGRkZGLCAweDAwMDAsCisgICAgICAgICAgICAgMHgwMDAwLCAweEZGRkYsIDB4MDAwMCwgMHhGRkZGLCAKKyAgICAgICAgICAgICAweEZGRkYsIDB4MDAwMCwgMHhGRkZGLCAweDAwMDAgIH07CisKKyAgICAgdWludDMyX3QgdDMyW10gID0geyAKKyAgICAgICAgICAgICAweEZGMDAwMDAwLCAweEZGMDAwMEZGLCAweEZGMDBGRjAwLCAweEZGRkYwMDAwLCAKKyAgICAgICAgICAgICAweEZGMDBGRjAwLCAweEZGRkYwMDAwLCAweEZGMDAwMDAwLCAweEZGMDAwMEZGLCAKKyAgICAgICAgICAgICAweEZGMDBGRkZGLCAweEZGMDBGRjAwLCAweDAwRkYwMEZGLCAweEZGRkZGRjAwLCAKKyAgICAgICAgICAgICAweEZGMDAwMDAwLCAweEZGRkYwMEZGLCAweEZGMDBGRkZGLCAweEZGRkZGRkZGCisgICAgIH07CisKKyAgICAgc3dpdGNoKHRlc3QpIAorICAgICB7CisgICAgIGNhc2UgMToKKyAgICAgICAgIGdsVGV4SW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCBHTF9MVU1JTkFOQ0UsCisgICAgICAgICAgICAgICAgIDQsIDQsIDAsIEdMX0xVTUlOQU5DRSwgR0xfVU5TSUdORURfQllURSwgdDgpOworICAgICAgICAgYnJlYWs7CisgICAgIGNhc2UgMjoKKyAgICAgICAgIGdsVGV4SW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCBHTF9SR0IsCisgICAgICAgICAgICAgICAgIDQsIDQsIDAsIEdMX1JHQiwgR0xfVU5TSUdORURfU0hPUlRfNV82XzUsIHQxNik7CisgICAgICAgICBicmVhazsKKyAgICAgY2FzZSAzOgorICAgICAgICAgZ2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIEdMX1JHQkEsCisgICAgICAgICAgICAgICAgIDQsIDQsIDAsIEdMX1JHQkEsIEdMX1VOU0lHTkVEX1NIT1JUXzRfNF80XzQsIHQxNik7CisgICAgICAgICBicmVhazsKKyAgICAgY2FzZSA0OgorICAgICAgICAgZ2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIEdMX0xVTUlOQU5DRV9BTFBIQSwKKyAgICAgICAgICAgICAgICAgNCwgNCwgMCwgR0xfTFVNSU5BTkNFX0FMUEhBLCBHTF9VTlNJR05FRF9CWVRFLCB0MTYpOworICAgICAgICAgYnJlYWs7CisgICAgIGNhc2UgNToKKyAgICAgICAgIGdsVGV4SW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCBHTF9SR0JBLAorICAgICAgICAgICAgICAgICA0LCA0LCAwLCBHTF9SR0JBLCBHTF9VTlNJR05FRF9TSE9SVF81XzVfNV8xLCB0NTU1MSk7CisgICAgICAgICBicmVhazsKKyAgICAgY2FzZSA2OgorICAgICAgICAgZ2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIEdMX1JHQkEsCisgICAgICAgICAgICAgICAgIDQsIDQsIDAsIEdMX1JHQkEsIEdMX1VOU0lHTkVEX0JZVEUsIHQzMik7CisgICAgICAgICBicmVhazsKKyAgICAgfQorCisgICAgIGdsRHJhd1RleGlPRVMoMCwgMCwgMCwgZGltLCBkaW0pOworCisgICAgIGVnbFN3YXBCdWZmZXJzKGRweSwgc3VyZmFjZSk7CisgICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL3RleHR1cmVzL0FuZHJvaWQubWsgYi9vcGVuZ2wvdGVzdHMvdGV4dHVyZXMvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGM5MDIxCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL3RleHR1cmVzL0FuZHJvaWQubWsKQEAgLTAsMCArMSwxNiBAQAorTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTOj0gXAorCXRleHR1cmVzLmMKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCisJbGliY3V0aWxzIFwKKyAgICBsaWJHTEVTX0NNIFwKKyAgICBsaWJ1aQorCitMT0NBTF9NT0RVTEU6PSB0ZXN0LW9wZW5nbC10ZXh0dXJlcworCitMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cworCitpbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy90ZXh0dXJlcy90ZXh0dXJlcy5jIGIvb3BlbmdsL3Rlc3RzL3RleHR1cmVzL3RleHR1cmVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThlM2JlMQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90ZXN0cy90ZXh0dXJlcy90ZXh0dXJlcy5jCkBAIC0wLDAgKzEsMTA3IEBACisvKgorKioKKyoqIENvcHlyaWdodCAyMDA2LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAorKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSA8R0xFUy9lZ2wuaD4KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KQoreworICAgIEVHTGludCBzX2NvbmZpZ0F0dHJpYnNbXSA9IHsKKyAgICAgICAgIEVHTF9SRURfU0laRSwgICAgICAgNSwKKyAgICAgICAgIEVHTF9HUkVFTl9TSVpFLCAgICAgNiwKKyAgICAgICAgIEVHTF9CTFVFX1NJWkUsICAgICAgNSwKKyAgICAgICAgIEVHTF9OT05FCisgICAgIH07CisgICAgIAorICAgICBFR0xpbnQgbnVtQ29uZmlncyA9IC0xOworICAgICBFR0xpbnQgbWFqb3JWZXJzaW9uOworICAgICBFR0xpbnQgbWlub3JWZXJzaW9uOworICAgICBFR0xDb25maWcgY29uZmlnOworICAgICBFR0xDb250ZXh0IGNvbnRleHQ7CisgICAgIEVHTFN1cmZhY2Ugc3VyZmFjZTsKKyAgICAgRUdMaW50IHcsIGg7CisgICAgIAorICAgICBFR0xEaXNwbGF5IGRweTsKKworICAgICBkcHkgPSBlZ2xHZXREaXNwbGF5KEVHTF9ERUZBVUxUX0RJU1BMQVkpOworICAgICBlZ2xJbml0aWFsaXplKGRweSwgJm1ham9yVmVyc2lvbiwgJm1pbm9yVmVyc2lvbik7CisgICAgIGVnbENob29zZUNvbmZpZyhkcHksIHNfY29uZmlnQXR0cmlicywgJmNvbmZpZywgMSwgJm51bUNvbmZpZ3MpOworICAgICBzdXJmYWNlID0gZWdsQ3JlYXRlV2luZG93U3VyZmFjZShkcHksIGNvbmZpZywKKyAgICAgICAgICAgICBhbmRyb2lkX2NyZWF0ZURpc3BsYXlTdXJmYWNlKCksIE5VTEwpOworICAgICBjb250ZXh0ID0gZWdsQ3JlYXRlQ29udGV4dChkcHksIGNvbmZpZywgTlVMTCwgTlVMTCk7CisgICAgIGVnbE1ha2VDdXJyZW50KGRweSwgc3VyZmFjZSwgc3VyZmFjZSwgY29udGV4dCk7ICAgCisgICAgIGVnbFF1ZXJ5U3VyZmFjZShkcHksIHN1cmZhY2UsIEVHTF9XSURUSCwgJncpOworICAgICBlZ2xRdWVyeVN1cmZhY2UoZHB5LCBzdXJmYWNlLCBFR0xfSEVJR0hULCAmaCk7CisgICAgIEdMaW50IGRpbSA9IHc8aCA/IHcgOiBoOworCisKKyAgICAgR0xpbnQgY3JvcFs0XSA9IHsgMCwgNCwgNCwgLTQgfTsKKyAgICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCAwKTsKKyAgICAgZ2xUZXhQYXJhbWV0ZXJpdihHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX0NST1BfUkVDVF9PRVMsIGNyb3ApOworICAgICBnbFRleFBhcmFtZXRlcngoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NQUdfRklMVEVSLCBHTF9MSU5FQVIpOworICAgICBnbFRleFBhcmFtZXRlcngoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NSU5fRklMVEVSLCBHTF9MSU5FQVIpOworICAgICBnbFRleFBhcmFtZXRlcngoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9XUkFQX1MsIEdMX0NMQU1QX1RPX0VER0UpOworICAgICBnbFRleFBhcmFtZXRlcngoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9XUkFQX1QsIEdMX0NMQU1QX1RPX0VER0UpOworICAgICBnbFRleEVudngoR0xfVEVYVFVSRV9FTlYsIEdMX1RFWFRVUkVfRU5WX01PREUsIEdMX1JFUExBQ0UpOworICAgICBnbEVuYWJsZShHTF9URVhUVVJFXzJEKTsKKyAgICAgZ2xDb2xvcjRmKDEsMSwxLDEpOworCisgICAgIC8vIHBhY2tpbmcgaXMgYWx3YXlzIDQKKyAgICAgdWludDhfdCB0OFtdICA9IHsgCisgICAgICAgICAgICAgMHgwMCwgMHg1NSwgMHgwMCwgMHg1NSwgCisgICAgICAgICAgICAgMHhBQSwgMHhGRiwgMHhBQSwgMHhGRiwKKyAgICAgICAgICAgICAweDAwLCAweDU1LCAweDAwLCAweDU1LCAKKyAgICAgICAgICAgICAweEFBLCAweEZGLCAweEFBLCAweEZGICB9OworCisgICAgIHVpbnQxNl90IHQxNltdICA9IHsgCisgICAgICAgICAgICAgMHgwMDAwLCAweDU1NTUsIDB4MDAwMCwgMHg1NTU1LCAKKyAgICAgICAgICAgICAweEFBQUEsIDB4RkZGRiwgMHhBQUFBLCAweEZGRkYsCisgICAgICAgICAgICAgMHgwMDAwLCAweDU1NTUsIDB4MDAwMCwgMHg1NTU1LCAKKyAgICAgICAgICAgICAweEFBQUEsIDB4RkZGRiwgMHhBQUFBLCAweEZGRkYgIH07CisKKyAgICAgdWludDE2X3QgdDU1NTFbXSAgPSB7IAorICAgICAgICAgICAgIDB4MDAwMCwgMHhGRkZGLCAweDAwMDAsIDB4RkZGRiwgCisgICAgICAgICAgICAgMHhGRkZGLCAweDAwMDAsIDB4RkZGRiwgMHgwMDAwLAorICAgICAgICAgICAgIDB4MDAwMCwgMHhGRkZGLCAweDAwMDAsIDB4RkZGRiwgCisgICAgICAgICAgICAgMHhGRkZGLCAweDAwMDAsIDB4RkZGRiwgMHgwMDAwICB9OworCisgICAgIHVpbnQzMl90IHQzMltdICA9IHsgCisgICAgICAgICAgICAgMHhGRjAwMDAwMCwgMHhGRjAwMDBGRiwgMHhGRjAwRkYwMCwgMHhGRkZGMDAwMCwgCisgICAgICAgICAgICAgMHhGRjAwRkYwMCwgMHhGRkZGMDAwMCwgMHhGRjAwMDAwMCwgMHhGRjAwMDBGRiwgCisgICAgICAgICAgICAgMHhGRjAwRkZGRiwgMHhGRjAwRkYwMCwgMHgwMEZGMDBGRiwgMHhGRkZGRkYwMCwgCisgICAgICAgICAgICAgMHhGRjAwMDAwMCwgMHhGRkZGMDBGRiwgMHhGRjAwRkZGRiwgMHhGRkZGRkZGRgorICAgICB9OworCisKKyAgICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUKTsKKyAgICAgZ2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIEdMX0xVTUlOQU5DRSwgNCwgNCwgMCwgR0xfTFVNSU5BTkNFLCBHTF9VTlNJR05FRF9CWVRFLCB0OCk7CisgICAgIGdsRHJhd1RleGlPRVMoMCwgMCwgMCwgZGltLzIsIGRpbS8yKTsKKworICAgICBnbFRleEltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwgR0xfUkdCLCA0LCA0LCAwLCBHTF9SR0IsIEdMX1VOU0lHTkVEX1NIT1JUXzVfNl81LCB0MTYpOworICAgICBnbERyYXdUZXhpT0VTKGRpbS8yLCAwLCAwLCBkaW0vMiwgZGltLzIpOworCisgICAgIGdsVGV4SW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCBHTF9SR0JBLCA0LCA0LCAwLCBHTF9SR0JBLCBHTF9VTlNJR05FRF9TSE9SVF80XzRfNF80LCB0MTYpOworICAgICBnbERyYXdUZXhpT0VTKDAsIGRpbS8yLCAwLCBkaW0vMiwgZGltLzIpOworCisgICAgIGdsVGV4SW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCBHTF9SR0JBLCA0LCA0LCAwLCBHTF9SR0JBLCBHTF9VTlNJR05FRF9CWVRFLCB0MzIpOworICAgICBnbERyYXdUZXhpT0VTKGRpbS8yLCBkaW0vMiwgMCwgZGltLzIsIGRpbS8yKTsKKworICAgICBlZ2xTd2FwQnVmZmVycyhkcHksIHN1cmZhY2UpOworICAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy90cml0ZXgvQW5kcm9pZC5tayBiL29wZW5nbC90ZXN0cy90cml0ZXgvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWRhYzRjCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rlc3RzL3RyaXRleC9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMTYgQEAKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUzo9IFwKKwl0cml0ZXguYworCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKwlsaWJjdXRpbHMgXAorICAgIGxpYkdMRVNfQ00gXAorICAgIGxpYnVpCisKK0xPQ0FMX01PRFVMRTo9IHRlc3Qtb3BlbmdsLXRyaXRleAorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cworCitpbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKZGlmZiAtLWdpdCBhL29wZW5nbC90ZXN0cy90cml0ZXgvdHJpdGV4LmMgYi9vcGVuZ2wvdGVzdHMvdHJpdGV4L3RyaXRleC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlYmU3ZDQKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdGVzdHMvdHJpdGV4L3RyaXRleC5jCkBAIC0wLDAgKzEsMjcxIEBACisvLyBDYWxscyBnbERyYXdFbGVtZW50cygpIHRoZSBudW1iZXIgb2YgdGltZXMgc3BlY2lmaWVkIGJ5CisvLyBJVEVSQVRJT05TLiBTaG91bGQgZHJhdyBhIGNoZWNrZXJib2FyZCBvbiB0aGUgc2NyZWVuIGFmdGVyCisvLyBhIGZldyBzZWNvbmRzLgorLy8KKy8vIFBvcnRlZCBmcm9tIGEgSmF2YSB2ZXJzaW9uIGJ5IEdvb2dsZS4KKworI2luY2x1ZGUgPEdMRVMvZWdsLmg+DQorI2luY2x1ZGUgPHN0ZGlvLmg+DQorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPG1hdGguaD4KKw0KK0VHTERpc3BsYXkgZWdsRGlzcGxheTsNCitFR0xTdXJmYWNlIGVnbFN1cmZhY2U7DQorRUdMQ29udGV4dCBlZ2xDb250ZXh0Ow0KK0dMdWludCB0ZXh0dXJlOw0KKw0KKyNkZWZpbmUgRklYRURfT05FIDB4MTAwMDAKKyNkZWZpbmUgSVRFUkFUSU9OUyA1MA0KKw0KK2ludCBpbml0X2dsX3N1cmZhY2Uodm9pZCk7DQordm9pZCBmcmVlX2dsX3N1cmZhY2Uodm9pZCk7DQordm9pZCBpbml0X3NjZW5lKHZvaWQpOw0KK3ZvaWQgcmVuZGVyKGludCBxdWFkcyk7DQordm9pZCBjcmVhdGVfdGV4dHVyZSh2b2lkKTsKK2ludCByZWFkVGltZXIodm9pZCk7DQorCitzdGF0aWMgdm9pZCBnbHVMb29rQXQoZmxvYXQgZXllWCwgZmxvYXQgZXllWSwgZmxvYXQgZXllWiwKKyAgICAgICAgZmxvYXQgY2VudGVyWCwgZmxvYXQgY2VudGVyWSwgZmxvYXQgY2VudGVyWiwgZmxvYXQgdXBYLCBmbG9hdCB1cFksCisgICAgICAgIGZsb2F0IHVwWikKK3sKKyAgICAvLyBTZWUgdGhlIE9wZW5HTCBHTFVUIGRvY3VtZW50YXRpb24gZm9yIGdsdUxvb2tBdCBmb3IgYSBkZXNjcmlwdGlvbgorICAgIC8vIG9mIHRoZSBhbGdvcml0aG0uIFdlIGltcGxlbWVudCBpdCBpbiBhIHN0cmFpZ2h0Zm9yd2FyZCB3YXk6CisKKyAgICBmbG9hdCBmeCA9IGNlbnRlclggLSBleWVYOworICAgIGZsb2F0IGZ5ID0gY2VudGVyWSAtIGV5ZVk7CisgICAgZmxvYXQgZnogPSBjZW50ZXJaIC0gZXllWjsKKworICAgIC8vIE5vcm1hbGl6ZSBmCisgICAgZmxvYXQgcmxmID0gMS4wZiAvIHNxcnRmKGZ4KmZ4ICsgZnkqZnkgKyBmeipmeik7CisgICAgZnggKj0gcmxmOworICAgIGZ5ICo9IHJsZjsKKyAgICBmeiAqPSBybGY7CisKKyAgICAvLyBOb3JtYWxpemUgdXAKKyAgICBmbG9hdCBybHVwID0gMS4wZiAvIHNxcnRmKHVwWCp1cFggKyB1cFkqdXBZICsgdXBaKnVwWik7CisgICAgdXBYICo9IHJsdXA7CisgICAgdXBZICo9IHJsdXA7CisgICAgdXBaICo9IHJsdXA7CisKKyAgICAvLyBjb21wdXRlIHMgPSBmIHggdXAgKHggbWVhbnMgImNyb3NzIHByb2R1Y3QiKQorCisgICAgZmxvYXQgc3ggPSBmeSAqIHVwWiAtIGZ6ICogdXBZOworICAgIGZsb2F0IHN5ID0gZnogKiB1cFggLSBmeCAqIHVwWjsKKyAgICBmbG9hdCBzeiA9IGZ4ICogdXBZIC0gZnkgKiB1cFg7CisKKyAgICAvLyBjb21wdXRlIHUgPSBzIHggZgorICAgIGZsb2F0IHV4ID0gc3kgKiBmeiAtIHN6ICogZnk7CisgICAgZmxvYXQgdXkgPSBzeiAqIGZ4IC0gc3ggKiBmejsKKyAgICBmbG9hdCB1eiA9IHN4ICogZnkgLSBzeSAqIGZ4OworCisgICAgZmxvYXQgbVsxNl0gOworICAgIG1bMF0gPSBzeDsKKyAgICBtWzFdID0gdXg7CisgICAgbVsyXSA9IC1meDsKKyAgICBtWzNdID0gMC4wZjsKKworICAgIG1bNF0gPSBzeTsKKyAgICBtWzVdID0gdXk7CisgICAgbVs2XSA9IC1meTsKKyAgICBtWzddID0gMC4wZjsKKworICAgIG1bOF0gPSBzejsKKyAgICBtWzldID0gdXo7CisgICAgbVsxMF0gPSAtZno7CisgICAgbVsxMV0gPSAwLjBmOworCisgICAgbVsxMl0gPSAwLjBmOworICAgIG1bMTNdID0gMC4wZjsKKyAgICBtWzE0XSA9IDAuMGY7CisgICAgbVsxNV0gPSAxLjBmOworCisgICAgZ2xNdWx0TWF0cml4ZihtKTsKKyAgICBnbFRyYW5zbGF0ZWYoLWV5ZVgsIC1leWVZLCAtZXllWik7Cit9CisNCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpDQorew0KKyAgICBpbnQgcTsKKyAgICBpbnQgc3RhcnQsIGVuZDsNCisKKyAgICBwcmludGYoIkluaXRpYWxpemluZyBFR0wuLi5cbiIpOworDQorICAgIGlmKCFpbml0X2dsX3N1cmZhY2UoKSkNCisgICAgew0KKyAgICAgICAgcHJpbnRmKCJHTCBpbml0aWFsaXNhdGlvbiBmYWlsZWQgLSBleGl0aW5nXG4iKTsNCisgICAgICAgIHJldHVybiAwOw0KKyAgICB9DQorDQorICAgIGluaXRfc2NlbmUoKTsNCisNCisgICAgY3JlYXRlX3RleHR1cmUoKTsNCisNCisgICAgcHJpbnRmKCJTdGFydCB0ZXN0Li4uXG4iKTsKKworICAgIHJlbmRlcihhcmdjPT0yID8gYXRvaShhcmd2WzFdKSA6IElURVJBVElPTlMpOw0KKw0KKyAgICBmcmVlX2dsX3N1cmZhY2UoKTsNCisNCisgICAgcmV0dXJuIDA7DQorfQ0KKw0KK2ludCBpbml0X2dsX3N1cmZhY2Uodm9pZCkNCit7DQorICAgIEVHTGludCBudW1Db25maWdzID0gMTsNCisgICAgRUdMQ29uZmlnIG15Q29uZmlnID0gezB9Ow0KKyAgICBFR0xpbnQgYXR0cmliW10gPQ0KKyAgICB7DQorICAgICAgICAgICAgRUdMX0RFUFRIX1NJWkUsICAgICAxNiwNCisgICAgICAgICAgICBFR0xfTk9ORQ0KKyAgICB9Ow0KKw0KKyAgICBpZiAoIChlZ2xEaXNwbGF5ID0gZWdsR2V0RGlzcGxheShFR0xfREVGQVVMVF9ESVNQTEFZKSkgPT0gRUdMX05PX0RJU1BMQVkgKQ0KKyAgICB7DQorICAgICAgICBwcmludGYoImVnbEdldERpc3BsYXkgZmFpbGVkXG4iKTsNCisgICAgICAgIHJldHVybiAwOw0KKyAgICB9DQorDQorICAgIGlmICggZWdsSW5pdGlhbGl6ZShlZ2xEaXNwbGF5LCBOVUxMLCBOVUxMKSAhPSBFR0xfVFJVRSApDQorICAgIHsNCisgICAgICAgIHByaW50ZigiZWdsSW5pdGlhbGl6ZSBmYWlsZWRcbiIpOw0KKyAgICAgICAgcmV0dXJuIDA7DQorICAgIH0NCisNCisgICAgaWYgKCBlZ2xDaG9vc2VDb25maWcoZWdsRGlzcGxheSwgYXR0cmliLCAmbXlDb25maWcsIDEsICZudW1Db25maWdzKSAhPSBFR0xfVFJVRSApDQorICAgIHsNCisgICAgICAgIHByaW50ZigiZWdsQ2hvb3NlQ29uZmlnIGZhaWxlZFxuIik7DQorICAgICAgICByZXR1cm4gMDsNCisgICAgfQ0KKw0KKyAgICBpZiAoIChlZ2xTdXJmYWNlID0gZWdsQ3JlYXRlV2luZG93U3VyZmFjZShlZ2xEaXNwbGF5LCBteUNvbmZpZywKKyAgICAgICAgICAgIGFuZHJvaWRfY3JlYXRlRGlzcGxheVN1cmZhY2UoKSwgMCkpID09IEVHTF9OT19TVVJGQUNFICkNCisgICAgew0KKyAgICAgICAgcHJpbnRmKCJlZ2xDcmVhdGVXaW5kb3dTdXJmYWNlIGZhaWxlZFxuIik7DQorICAgICAgICByZXR1cm4gMDsNCisgICAgfQ0KKw0KKyAgICBpZiAoIChlZ2xDb250ZXh0ID0gZWdsQ3JlYXRlQ29udGV4dChlZ2xEaXNwbGF5LCBteUNvbmZpZywgMCwgMCkpID09IEVHTF9OT19DT05URVhUICkNCisgICAgew0KKyAgICAgICAgcHJpbnRmKCJlZ2xDcmVhdGVDb250ZXh0IGZhaWxlZFxuIik7DQorICAgICAgICByZXR1cm4gMDsNCisgICAgfQ0KKw0KKyAgICBpZiAoIGVnbE1ha2VDdXJyZW50KGVnbERpc3BsYXksIGVnbFN1cmZhY2UsIGVnbFN1cmZhY2UsIGVnbENvbnRleHQpICE9IEVHTF9UUlVFICkNCisgICAgew0KKyAgICAgICAgcHJpbnRmKCJlZ2xNYWtlQ3VycmVudCBmYWlsZWRcbiIpOw0KKyAgICAgICAgcmV0dXJuIDA7DQorICAgIH0NCisNCisgICAgcmV0dXJuIDE7DQorfQ0KKw0KK3ZvaWQgZnJlZV9nbF9zdXJmYWNlKHZvaWQpDQorew0KKyAgICBpZiAoZWdsRGlzcGxheSAhPSBFR0xfTk9fRElTUExBWSkNCisgICAgew0KKyAgICAgICAgZWdsTWFrZUN1cnJlbnQoIEVHTF9OT19ESVNQTEFZLCBFR0xfTk9fU1VSRkFDRSwNCisgICAgICAgICAgICAgICAgRUdMX05PX1NVUkZBQ0UsIEVHTF9OT19DT05URVhUICk7DQorICAgICAgICBlZ2xEZXN0cm95Q29udGV4dCggZWdsRGlzcGxheSwgZWdsQ29udGV4dCApOw0KKyAgICAgICAgZWdsRGVzdHJveVN1cmZhY2UoIGVnbERpc3BsYXksIGVnbFN1cmZhY2UgKTsNCisgICAgICAgIGVnbFRlcm1pbmF0ZSggZWdsRGlzcGxheSApOw0KKyAgICAgICAgZWdsRGlzcGxheSA9IEVHTF9OT19ESVNQTEFZOw0KKyAgICB9DQorfQ0KKw0KK3ZvaWQgaW5pdF9zY2VuZSh2b2lkKQ0KK3sNCisgICAgZ2xEaXNhYmxlKEdMX0RJVEhFUik7CisgICAgZ2xFbmFibGUoR0xfQ1VMTF9GQUNFKTsKKworICAgIGZsb2F0IHJhdGlvID0gMzIwLjBmIC8gNDgwLjBmOworICAgIGdsVmlld3BvcnQoMCwgMCwgMzIwLCA0ODApOworCisgICAgZ2xNYXRyaXhNb2RlKEdMX1BST0pFQ1RJT04pOworICAgIGdsTG9hZElkZW50aXR5KCk7CisgICAgZ2xGcnVzdHVtZigtcmF0aW8sIHJhdGlvLCAtMSwgMSwgMSwgMTApOworCisgICAgZ2xNYXRyaXhNb2RlKEdMX01PREVMVklFVyk7DQorICAgIGdsTG9hZElkZW50aXR5KCk7CisgICAgZ2x1TG9va0F0KAorICAgICAgICAgICAgMCwgMCwgMywgIC8vIGV5ZQorICAgICAgICAgICAgMCwgMCwgMCwgIC8vIGNlbnRlcgorICAgICAgICAgICAgMCwgMSwgMCk7IC8vIHVwCisNCisgICAgZ2xFbmFibGUoR0xfVEVYVFVSRV8yRCk7DQorICAgIGdsRW5hYmxlQ2xpZW50U3RhdGUoR0xfVkVSVEVYX0FSUkFZKTsNCisgICAgZ2xFbmFibGVDbGllbnRTdGF0ZShHTF9URVhUVVJFX0NPT1JEX0FSUkFZKTsKK30NCisNCit2b2lkIGNyZWF0ZV90ZXh0dXJlKHZvaWQpDQorew0KKyAgICBjb25zdCB1bnNpZ25lZCBpbnQgb24gPSAweGZmMDAwMGZmOworICAgIGNvbnN0IHVuc2lnbmVkIGludCBvZmYgPSAweGZmZmZmZmZmOworICAgIGNvbnN0IHVuc2lnbmVkIGludCBwaXhlbHNbXSA9CisgICAgeworICAgICAgICAgICAgb24sIG9mZiwgb24sIG9mZiwgb24sIG9mZiwgb24sIG9mZiwKKyAgICAgICAgICAgIG9mZiwgb24sIG9mZiwgb24sIG9mZiwgb24sIG9mZiwgb24sCisgICAgICAgICAgICBvbiwgb2ZmLCBvbiwgb2ZmLCBvbiwgb2ZmLCBvbiwgb2ZmLAorICAgICAgICAgICAgb2ZmLCBvbiwgb2ZmLCBvbiwgb2ZmLCBvbiwgb2ZmLCBvbiwKKyAgICAgICAgICAgIG9uLCBvZmYsIG9uLCBvZmYsIG9uLCBvZmYsIG9uLCBvZmYsCisgICAgICAgICAgICBvZmYsIG9uLCBvZmYsIG9uLCBvZmYsIG9uLCBvZmYsIG9uLAorICAgICAgICAgICAgb24sIG9mZiwgb24sIG9mZiwgb24sIG9mZiwgb24sIG9mZiwKKyAgICAgICAgICAgIG9mZiwgb24sIG9mZiwgb24sIG9mZiwgb24sIG9mZiwgb24sCisgICAgfTsNCisgICAgZ2xHZW5UZXh0dXJlcygxLCAmdGV4dHVyZSk7DQorICAgIGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgdGV4dHVyZSk7DQorICAgIGdsVGV4SW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCBHTF9SR0JBLCA4LCA4LCAwLCBHTF9SR0JBLCBHTF9VTlNJR05FRF9CWVRFLCBwaXhlbHMpOw0KKyAgICBnbFRleFBhcmFtZXRlcngoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NSU5fRklMVEVSLCBHTF9ORUFSRVNUKTsNCisgICAgZ2xUZXhQYXJhbWV0ZXJ4KEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUFHX0ZJTFRFUiwgR0xfTkVBUkVTVCk7DQorICAgIGdsVGV4RW52eChHTF9URVhUVVJFX0VOViwgR0xfVEVYVFVSRV9FTlZfTU9ERSwgR0xfUkVQTEFDRSk7DQorfQ0KKw0KK3ZvaWQgcmVuZGVyKGludCBxdWFkcykNCit7DQorICAgIGludCBpLCBqOw0KKw0KKyAgICBjb25zdCBHTGZsb2F0IHZlcnRpY2VzW10gPSB7DQorICAgICAgICAgICAgLTEsICAtMSwgIDAsDQorICAgICAgICAgICAgIDEsICAtMSwgIDAsDQorICAgICAgICAgICAgIDEsICAgMSwgIDAsDQorICAgICAgICAgICAgLTEsICAgMSwgIDANCisgICAgfTsNCisNCisgICAgY29uc3QgR0xmaXhlZCB0ZXhDb29yZHNbXSA9IHsNCisgICAgICAgICAgICAwLCAgICAgICAgICAgIDAsDQorICAgICAgICAgICAgRklYRURfT05FLCAgICAwLA0KKyAgICAgICAgICAgIEZJWEVEX09ORSwgICAgRklYRURfT05FLA0KKyAgICAgICAgICAgIDAsICAgICAgICAgICAgRklYRURfT05FDQorICAgIH07DQorDQorICAgIGNvbnN0IEdMdXNob3J0IHRlbXBsYXRlW10gPSB7IDAsIDEsIDIsICAwLCAyLCAzIH07CisKKworICAgIEdMdXNob3J0KiBpbmRpY2VzID0gKEdMdXNob3J0KiltYWxsb2MocXVhZHMqc2l6ZW9mKHRlbXBsYXRlKSk7CisgICAgZm9yIChpPTAgOyBpPHF1YWRzIDsgaSsrKQorICAgICAgICBtZW1jcHkoaW5kaWNlcysoc2l6ZW9mKHRlbXBsYXRlKS9zaXplb2YoaW5kaWNlc1swXSkpKmksIHRlbXBsYXRlLCBzaXplb2YodGVtcGxhdGUpKTsKKw0KKyAgICBnbFZlcnRleFBvaW50ZXIoMywgR0xfRkxPQVQsIDAsIHZlcnRpY2VzKTsNCisgICAgZ2xUZXhDb29yZFBvaW50ZXIoMiwgR0xfRklYRUQsIDAsIHRleENvb3Jkcyk7CisKKyAgICAvLyBtYWtlIHN1cmUgdG8gZG8gYSBjb3VwbGUgZWdsU3dhcEJ1ZmZlcnMgdG8gbWFrZSBzdXJlIHRoZXJlIGFyZQorICAgIC8vIG5vIHByb2JsZW1zIHdpdGggdGhlIHZlcnkgZmlyc3Qgb25lcyAod2hvIGtub3dzKQorICAgIGdsQ2xlYXJDb2xvcigwLjQsIDAuNCwgMC40LCAwLjQpOworICAgIGdsQ2xlYXIoR0xfREVQVEhfQlVGRkVSX0JJVCB8IEdMX0NPTE9SX0JVRkZFUl9CSVQpOworICAgIGVnbFN3YXBCdWZmZXJzKGVnbERpc3BsYXksIGVnbFN1cmZhY2UpOworICAgIGdsQ2xlYXJDb2xvcigwLjYsIDAuNiwgMC42LCAwLjYpOworICAgIGdsQ2xlYXIoR0xfREVQVEhfQlVGRkVSX0JJVCB8IEdMX0NPTE9SX0JVRkZFUl9CSVQpOworICAgIGVnbFN3YXBCdWZmZXJzKGVnbERpc3BsYXksIGVnbFN1cmZhY2UpOworICAgIGdsQ2xlYXJDb2xvcigxLjAsIDEuMCwgMS4wLCAxLjApOworCisgICAgZm9yIChqPTAgOyBqPDEwIDsgaisrKSB7CisgICAgICAgIHByaW50ZigibG9vcCAlZCAvIDEwICglZCBxdWFkcyAvIGxvb3ApXG4iLCBqLCBxdWFkcyk7CisKKyAgICAgICAgaW50IG5lbGVtID0gc2l6ZW9mKHRlbXBsYXRlKS9zaXplb2YodGVtcGxhdGVbMF0pOworICAgICAgICBnbENsZWFyKEdMX0RFUFRIX0JVRkZFUl9CSVQgfCBHTF9DT0xPUl9CVUZGRVJfQklUKTsKKyAgICAgICAgZ2xEcmF3RWxlbWVudHMoR0xfVFJJQU5HTEVTLCBuZWxlbSpxdWFkcywgR0xfVU5TSUdORURfU0hPUlQsIGluZGljZXMpOworICAgICAgICBlZ2xTd2FwQnVmZmVycyhlZ2xEaXNwbGF5LCBlZ2xTdXJmYWNlKTsKKyAgICB9CisKKyAgICBmcmVlKGluZGljZXMpOw0KK30NCisKZGlmZiAtLWdpdCBhL29wZW5nbC90b29scy9nbGdlbi9nZW4gYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vZ2VuCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjFjNDk4NjEKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vZ2VuCkBAIC0wLDAgKzEsOTkgQEAKKyMhL2Jpbi9zaAorcm0gLXJmIG91dCBnZW5lcmF0ZWQKKworbWtkaXIgb3V0Citta2RpciAtcCBvdXQvamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3Mvb3BlbmdsZXMKK21rZGlyIC1wIG91dC9jb20vZ29vZ2xlL2FuZHJvaWQvZ2xlc19qbmkKK21rZGlyIC1wIG91dC9hbmRyb2lkL2dyYXBoaWNzCisKK2VjaG8gInBhY2thZ2UgYW5kcm9pZC5ncmFwaGljczsiID4gb3V0L2FuZHJvaWQvZ3JhcGhpY3MvQ2FudmFzLmphdmEKK2VjaG8gInB1YmxpYyBpbnRlcmZhY2UgQ2FudmFzIHt9IiA+PiBvdXQvYW5kcm9pZC9ncmFwaGljcy9DYW52YXMuamF2YQorCitHTEZJTEU9b3V0L2phdmF4L21pY3JvZWRpdGlvbi9raHJvbm9zL29wZW5nbGVzL0dMLmphdmEKK2NwIHN0dWJzL0dMSGVhZGVyLmphdmEtaWYgJEdMRklMRQorCitHTEdFTl9GSUxFUz0iQ0Z1bmMuamF2YSBDVHlwZS5qYXZhIENvZGVFbWl0dGVyLmphdmEgR2VuZXJhdGVHTC5qYXZhIEpGdW5jLmphdmEgSlR5cGUuamF2YSBKbmlDb2RlRW1pdHRlci5qYXZhIFBhcmFtZXRlckNoZWNrZXIuamF2YSIKKworcHVzaGQgc3JjID4gL2Rldi9udWxsCitqYXZhYyAke0dMR0VOX0ZJTEVTfQorcG9wZCA+IC9kZXYvbnVsbAoramF2YSAtY2xhc3NwYXRoIHNyYyBHZW5lcmF0ZUdMIC1jIGdsc3BlYy0xLjAgZ2xzcGVjLTEuMGV4dCBnbHNwZWMtMS4xIGdsc3BlYy0xLjFleHQgZ2xzcGVjLTEuMWV4dHBhY2sgZ2xzcGVjLWNoZWNrcworCitwdXNoZCBvdXQgPiAvZGV2L251bGwKK21rZGlyIGNsYXNzZXMKK2phdmFjIC1kIGNsYXNzZXMgY29tL2dvb2dsZS9hbmRyb2lkL2dsZXNfam5pL0dMSW1wbC5qYXZhIGphdmF4L21pY3JvZWRpdGlvbi9raHJvbm9zL29wZW5nbGVzL0dMMTAuamF2YSBqYXZheC9taWNyb2VkaXRpb24va2hyb25vcy9vcGVuZ2xlcy9HTDEwRXh0LmphdmEgamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3Mvb3BlbmdsZXMvR0wxMS5qYXZhIGphdmF4L21pY3JvZWRpdGlvbi9raHJvbm9zL29wZW5nbGVzL0dMMTFFeHQuamF2YSBqYXZheC9taWNyb2VkaXRpb24va2hyb25vcy9vcGVuZ2xlcy9HTDExRXh0ZW5zaW9uUGFjay5qYXZhCitwb3BkID4gL2Rldi9udWxsCisKK3JtIC1yZiBnZW5lcmF0ZWQKK21rZGlyIC1wIGdlbmVyYXRlZC9DCitjcCBvdXQvY29tX2dvb2dsZV9hbmRyb2lkX2dsZXNfam5pX0dMSW1wbC5jcHAgZ2VuZXJhdGVkL0MKK2NwIC1yIG91dC9jb20gZ2VuZXJhdGVkCitjcCAtciBvdXQvamF2YXggZ2VuZXJhdGVkCisKK3JtIC1yZiBvdXQKKworIyBjb21fZ29vZ2xlX2FuZHJvaWRfZ2xlc19qbmlfR0xJbXBsLmNwcAoraWYgY21wIC4uLy4uLy4uL2ZyYW1ld29ya3MvYmFzZS9jb3JlL2puaS9jb21fZ29vZ2xlX2FuZHJvaWRfZ2xlc19qbmlfR0xJbXBsLmNwcCBnZW5lcmF0ZWQvQy9jb21fZ29vZ2xlX2FuZHJvaWRfZ2xlc19qbmlfR0xJbXBsLmNwcCA7IHRoZW4KK2VjaG8gY29tX2dvb2dsZV9hbmRyb2lkX2dsZXNfam5pX0dMSW1wbC5jcHAgdW5jaGFuZ2VkCitlbHNlCitlY2hvIFBsZWFzZSBlZGl0IC4uLy4uLy4uL2ZyYW1ld29ya3MvYmFzZS9jb3JlL2puaS9jb21fZ29vZ2xlX2FuZHJvaWRfZ2xlc19qbmlfR0xJbXBsLmNwcAorZWNobyBQbGVhc2UgY3AgZ2VuZXJhdGVkL0MvY29tX2dvb2dsZV9hbmRyb2lkX2dsZXNfam5pX0dMSW1wbC5jcHAgLi4vLi4vLi4vZnJhbWV3b3Jrcy9iYXNlL2NvcmUvam5pCitmaQorCisjIEdMSW1wbC5qYXZhCitpZiBjbXAgLi4vLi4vamF2YS9jb20vZ29vZ2xlL2FuZHJvaWQvZ2xlc19qbmkvR0xJbXBsLmphdmEgZ2VuZXJhdGVkL2NvbS9nb29nbGUvYW5kcm9pZC9nbGVzX2puaS9HTEltcGwuamF2YSA7IHRoZW4KK2VjaG8gR0xJbXBsLmphdmEgdW5jaGFuZ2VkCitlbHNlCitlY2hvIFBsZWFzZSBlZGl0IC4uLy4uL2phdmEvY29tL2dvb2dsZS9hbmRyb2lkL2dsZXNfam5pL0dMSW1wbC5qYXZhCitlY2hvIFBsZWFzZSBjcCBnZW5lcmF0ZWQvY29tL2dvb2dsZS9hbmRyb2lkL2dsZXNfam5pL0dMSW1wbC5qYXZhIC4uLy4uL2phdmEvY29tL2dvb2dsZS9hbmRyb2lkL2dsZXNfam5pCitmaQorCisjIEdMLmphdmEKK2lmIGNtcCAuLi8uLi9qYXZhL2phdmF4L21pY3JvZWRpdGlvbi9raHJvbm9zL29wZW5nbGVzL0dMLmphdmEgZ2VuZXJhdGVkL2phdmF4L21pY3JvZWRpdGlvbi9raHJvbm9zL29wZW5nbGVzL0dMLmphdmEgOyB0aGVuCitlY2hvIEdMLmphdmEgdW5jaGFuZ2VkCitlbHNlCitlY2hvIFBsZWFzZSBlZGl0IC4uLy4uL2phdmEvamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3Mvb3BlbmdsZXMvR0wuamF2YQorZWNobyBQbGVhc2UgY3AgZ2VuZXJhdGVkL2phdmF4L21pY3JvZWRpdGlvbi9raHJvbm9zL29wZW5nbGVzL0dMLmphdmEgLi4vLi4vamF2YS9qYXZheC9taWNyb2VkaXRpb24va2hyb25vcy9vcGVuZ2xlcy9HTC5qYXZhCitmaQorCisjIEdMMTAuamF2YQoraWYgY21wIC4uLy4uL2phdmEvamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3Mvb3BlbmdsZXMvR0wxMC5qYXZhIGdlbmVyYXRlZC9qYXZheC9taWNyb2VkaXRpb24va2hyb25vcy9vcGVuZ2xlcy9HTDEwLmphdmEgOyB0aGVuCitlY2hvIEdMMTAuamF2YSB1bmNoYW5nZWQKK2Vsc2UKK2VjaG8gUGxlYXNlIGVkaXQgLi4vLi4vamF2YS9qYXZheC9taWNyb2VkaXRpb24va2hyb25vcy9vcGVuZ2xlcy9HTDEwLmphdmEKK2VjaG8gUGxlYXNlIGNwIGdlbmVyYXRlZC9qYXZheC9taWNyb2VkaXRpb24va2hyb25vcy9vcGVuZ2xlcy9HTDEwLmphdmEgLi4vLi4vamF2YS9qYXZheC9taWNyb2VkaXRpb24va2hyb25vcy9vcGVuZ2xlcy9HTDEwLmphdmEKK2ZpCisKKyMgR0wxMEV4dC5qYXZhCitpZiBjbXAgLi4vLi4vamF2YS9qYXZheC9taWNyb2VkaXRpb24va2hyb25vcy9vcGVuZ2xlcy9HTDEwRXh0LmphdmEgZ2VuZXJhdGVkL2phdmF4L21pY3JvZWRpdGlvbi9raHJvbm9zL29wZW5nbGVzL0dMMTBFeHQuamF2YSA7IHRoZW4KK2VjaG8gR0wxMEV4dC5qYXZhIHVuY2hhbmdlZAorZWxzZQorZWNobyBQbGVhc2UgZWRpdCAuLi8uLi9qYXZhL2phdmF4L21pY3JvZWRpdGlvbi9raHJvbm9zL29wZW5nbGVzL0dMMTBFeHQuamF2YQorZWNobyBQbGVhc2UgY3AgZ2VuZXJhdGVkL2phdmF4L21pY3JvZWRpdGlvbi9raHJvbm9zL29wZW5nbGVzL0dMMTBFeHQuamF2YSAuLi8uLi9qYXZhL2phdmF4L21pY3JvZWRpdGlvbi9raHJvbm9zL29wZW5nbGVzL0dMMTBFeHQuamF2YQorZmkKKworIyBHTDExLmphdmEKK2lmIGNtcCAuLi8uLi9qYXZhL2phdmF4L21pY3JvZWRpdGlvbi9raHJvbm9zL29wZW5nbGVzL0dMMTEuamF2YSBnZW5lcmF0ZWQvamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3Mvb3BlbmdsZXMvR0wxMS5qYXZhIDsgdGhlbgorZWNobyBHTDExLmphdmEgdW5jaGFuZ2VkCitlbHNlCitlY2hvIFBsZWFzZSBlZGl0IC4uLy4uL2phdmEvamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3Mvb3BlbmdsZXMvR0wxMS5qYXZhCitlY2hvIFBsZWFzZSBjcCBnZW5lcmF0ZWQvamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3Mvb3BlbmdsZXMvR0wxMS5qYXZhIC4uLy4uL2phdmEvamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3Mvb3BlbmdsZXMvR0wxMS5qYXZhCitmaQorCisjIEdMMTFFeHQuamF2YQoraWYgY21wIC4uLy4uL2phdmEvamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3Mvb3BlbmdsZXMvR0wxMUV4dC5qYXZhIGdlbmVyYXRlZC9qYXZheC9taWNyb2VkaXRpb24va2hyb25vcy9vcGVuZ2xlcy9HTDExRXh0LmphdmEgOyB0aGVuCitlY2hvIEdMMTFFeHQuamF2YSB1bmNoYW5nZWQKK2Vsc2UKK2VjaG8gUGxlYXNlIGVkaXQgLi4vLi4vamF2YS9qYXZheC9taWNyb2VkaXRpb24va2hyb25vcy9vcGVuZ2xlcy9HTDExRXh0LmphdmEKK2VjaG8gUGxlYXNlIGNwIGdlbmVyYXRlZC9qYXZheC9taWNyb2VkaXRpb24va2hyb25vcy9vcGVuZ2xlcy9HTDExRXh0LmphdmEgLi4vLi4vamF2YS9qYXZheC9taWNyb2VkaXRpb24va2hyb25vcy9vcGVuZ2xlcy9HTDExRXh0LmphdmEKK2ZpCisKKyMgR0wxMUV4dGVuc2lvblBhY2suamF2YQoraWYgY21wIC4uLy4uL2phdmEvamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3Mvb3BlbmdsZXMvR0wxMUV4dGVuc2lvblBhY2suamF2YSBnZW5lcmF0ZWQvamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3Mvb3BlbmdsZXMvR0wxMUV4dGVuc2lvblBhY2suamF2YSA7IHRoZW4KK2VjaG8gR0wxMUV4dGVuc2lvblBhY2suamF2YSB1bmNoYW5nZWQKK2Vsc2UKK2VjaG8gUGxlYXNlIGVkaXQgLi4vLi4vamF2YS9qYXZheC9taWNyb2VkaXRpb24va2hyb25vcy9vcGVuZ2xlcy9HTDExRXh0ZW5zaW9uUGFjay5qYXZhCitlY2hvIFBsZWFzZSBjcCBnZW5lcmF0ZWQvamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3Mvb3BlbmdsZXMvR0wxMUV4dGVuc2lvblBhY2suamF2YSAuLi8uLi9qYXZhL2phdmF4L21pY3JvZWRpdGlvbi9raHJvbm9zL29wZW5nbGVzL0dMMTFFeHRlbnNpb25QYWNrLmphdmEKK2ZpCisKK3JtIC1yZiBnZW5lcmF0ZWQKZGlmZiAtLWdpdCBhL29wZW5nbC90b29scy9nbGdlbi9nbHNwZWMtMS4wIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL2dsc3BlYy0xLjAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ0MjMyMAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90b29scy9nbGdlbi9nbHNwZWMtMS4wCkBAIC0wLDAgKzEsMTA2IEBACit2b2lkIGdsQWN0aXZlVGV4dHVyZSAoIEdMZW51bSB0ZXh0dXJlICkNCit2b2lkIGdsQWxwaGFGdW5jICggR0xlbnVtIGZ1bmMsIEdMY2xhbXBmIHJlZiApDQordm9pZCBnbEFscGhhRnVuY3ggKCBHTGVudW0gZnVuYywgR0xjbGFtcHggcmVmICkNCit2b2lkIGdsQmluZFRleHR1cmUgKCBHTGVudW0gdGFyZ2V0LCBHTHVpbnQgdGV4dHVyZSApDQordm9pZCBnbEJsZW5kRnVuYyAoIEdMZW51bSBzZmFjdG9yLCBHTGVudW0gZGZhY3RvciApDQordm9pZCBnbENsZWFyICggR0xiaXRmaWVsZCBtYXNrICkNCit2b2lkIGdsQ2xlYXJDb2xvciAoIEdMY2xhbXBmIHJlZCwgR0xjbGFtcGYgZ3JlZW4sIEdMY2xhbXBmIGJsdWUsIEdMY2xhbXBmIGFscGhhICkNCit2b2lkIGdsQ2xlYXJDb2xvcnggKCBHTGNsYW1weCByZWQsIEdMY2xhbXB4IGdyZWVuLCBHTGNsYW1weCBibHVlLCBHTGNsYW1weCBhbHBoYSApDQordm9pZCBnbENsZWFyRGVwdGhmICggR0xjbGFtcGYgZGVwdGggKQ0KK3ZvaWQgZ2xDbGVhckRlcHRoeCAoIEdMY2xhbXB4IGRlcHRoICkNCit2b2lkIGdsQ2xlYXJTdGVuY2lsICggR0xpbnQgcyApDQordm9pZCBnbENsaWVudEFjdGl2ZVRleHR1cmUgKCBHTGVudW0gdGV4dHVyZSApDQordm9pZCBnbENvbG9yNGYgKCBHTGZsb2F0IHJlZCwgR0xmbG9hdCBncmVlbiwgR0xmbG9hdCBibHVlLCBHTGZsb2F0IGFscGhhICkNCit2b2lkIGdsQ29sb3I0eCAoIEdMZml4ZWQgcmVkLCBHTGZpeGVkIGdyZWVuLCBHTGZpeGVkIGJsdWUsIEdMZml4ZWQgYWxwaGEgKQ0KK3ZvaWQgZ2xDb2xvck1hc2sgKCBHTGJvb2xlYW4gcmVkLCBHTGJvb2xlYW4gZ3JlZW4sIEdMYm9vbGVhbiBibHVlLCBHTGJvb2xlYW4gYWxwaGEgKQ0KK3ZvaWQgZ2xDb2xvclBvaW50ZXIgKCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlciApDQordm9pZCBnbENvbXByZXNzZWRUZXhJbWFnZTJEICggR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMZW51bSBpbnRlcm5hbGZvcm1hdCwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQsIEdMaW50IGJvcmRlciwgR0xzaXplaSBpbWFnZVNpemUsIGNvbnN0IEdMdm9pZCAqZGF0YSApDQordm9pZCBnbENvbXByZXNzZWRUZXhTdWJJbWFnZTJEICggR0xlbnVtIHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IHhvZmZzZXQsIEdMaW50IHlvZmZzZXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGVudW0gZm9ybWF0LCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhICkNCit2b2lkIGdsQ29weVRleEltYWdlMkQgKCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTGludCB4LCBHTGludCB5LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xpbnQgYm9yZGVyICkNCit2b2lkIGdsQ29weVRleFN1YkltYWdlMkQgKCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgeG9mZnNldCwgR0xpbnQgeW9mZnNldCwgR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQgKQ0KK3ZvaWQgZ2xDdWxsRmFjZSAoIEdMZW51bSBtb2RlICkNCit2b2lkIGdsRGVsZXRlVGV4dHVyZXMgKCBHTHNpemVpIG4sIGNvbnN0IEdMdWludCAqdGV4dHVyZXMgKQ0KK3ZvaWQgZ2xEZXB0aEZ1bmMgKCBHTGVudW0gZnVuYyApDQordm9pZCBnbERlcHRoTWFzayAoIEdMYm9vbGVhbiBmbGFnICkNCit2b2lkIGdsRGVwdGhSYW5nZWYgKCBHTGNsYW1wZiB6TmVhciwgR0xjbGFtcGYgekZhciApDQordm9pZCBnbERlcHRoUmFuZ2V4ICggR0xjbGFtcHggek5lYXIsIEdMY2xhbXB4IHpGYXIgKQ0KK3ZvaWQgZ2xEaXNhYmxlICggR0xlbnVtIGNhcCApDQordm9pZCBnbERpc2FibGVDbGllbnRTdGF0ZSAoIEdMZW51bSBhcnJheSApDQordm9pZCBnbERyYXdBcnJheXMgKCBHTGVudW0gbW9kZSwgR0xpbnQgZmlyc3QsIEdMc2l6ZWkgY291bnQgKQ0KK3ZvaWQgZ2xEcmF3RWxlbWVudHMgKCBHTGVudW0gbW9kZSwgR0xzaXplaSBjb3VudCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqaW5kaWNlcyApDQordm9pZCBnbEVuYWJsZSAoIEdMZW51bSBjYXAgKQ0KK3ZvaWQgZ2xFbmFibGVDbGllbnRTdGF0ZSAoIEdMZW51bSBhcnJheSApDQordm9pZCBnbEZpbmlzaCAoIHZvaWQgKQ0KK3ZvaWQgZ2xGbHVzaCAoIHZvaWQgKQ0KK3ZvaWQgZ2xGb2dmICggR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtICkNCit2b2lkIGdsRm9nZnYgKCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyApDQordm9pZCBnbEZvZ3ggKCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0gKQ0KK3ZvaWQgZ2xGb2d4diAoIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zICkNCit2b2lkIGdsRnJvbnRGYWNlICggR0xlbnVtIG1vZGUgKQ0KK3ZvaWQgZ2xGcnVzdHVtZiAoIEdMZmxvYXQgbGVmdCwgR0xmbG9hdCByaWdodCwgR0xmbG9hdCBib3R0b20sIEdMZmxvYXQgdG9wLCBHTGZsb2F0IHpOZWFyLCBHTGZsb2F0IHpGYXIgKQ0KK3ZvaWQgZ2xGcnVzdHVteCAoIEdMZml4ZWQgbGVmdCwgR0xmaXhlZCByaWdodCwgR0xmaXhlZCBib3R0b20sIEdMZml4ZWQgdG9wLCBHTGZpeGVkIHpOZWFyLCBHTGZpeGVkIHpGYXIgKQ0KK3ZvaWQgZ2xHZW5UZXh0dXJlcyAoIEdMc2l6ZWkgbiwgR0x1aW50ICp0ZXh0dXJlcyApDQorR0xlbnVtIGdsR2V0RXJyb3IgKCB2b2lkICkNCit2b2lkIGdsR2V0SW50ZWdlcnYgKCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMgKQ0KK2NvbnN0IEdMdWJ5dGUgKiBnbEdldFN0cmluZyAoIEdMZW51bSBuYW1lICkNCit2b2lkIGdsSGludCAoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBtb2RlICkNCit2b2lkIGdsTGlnaHRNb2RlbGYgKCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0gKQ0KK3ZvaWQgZ2xMaWdodE1vZGVsZnYgKCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyApDQordm9pZCBnbExpZ2h0TW9kZWx4ICggR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtICkNCit2b2lkIGdsTGlnaHRNb2RlbHh2ICggR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMgKQ0KK3ZvaWQgZ2xMaWdodGYgKCBHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSApDQordm9pZCBnbExpZ2h0ZnYgKCBHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zICkNCit2b2lkIGdsTGlnaHR4ICggR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgcGFyYW0gKQ0KK3ZvaWQgZ2xMaWdodHh2ICggR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyApDQordm9pZCBnbExpbmVXaWR0aCAoIEdMZmxvYXQgd2lkdGggKQ0KK3ZvaWQgZ2xMaW5lV2lkdGh4ICggR0xmaXhlZCB3aWR0aCApDQordm9pZCBnbExvYWRJZGVudGl0eSAoIHZvaWQgKQ0KK3ZvaWQgZ2xMb2FkTWF0cml4ZiAoIGNvbnN0IEdMZmxvYXQgKm0gKQ0KK3ZvaWQgZ2xMb2FkTWF0cml4eCAoIGNvbnN0IEdMZml4ZWQgKm0gKQ0KK3ZvaWQgZ2xMb2dpY09wICggR0xlbnVtIG9wY29kZSApDQordm9pZCBnbE1hdGVyaWFsZiAoIEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0gKQ0KK3ZvaWQgZ2xNYXRlcmlhbGZ2ICggR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zICkNCit2b2lkIGdsTWF0ZXJpYWx4ICggR0xlbnVtIGZhY2UsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCBwYXJhbSApDQordm9pZCBnbE1hdGVyaWFseHYgKCBHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZpeGVkICpwYXJhbXMgKQ0KK3ZvaWQgZ2xNYXRyaXhNb2RlICggR0xlbnVtIG1vZGUgKQ0KK3ZvaWQgZ2xNdWx0TWF0cml4ZiAoIGNvbnN0IEdMZmxvYXQgKm0gKQ0KK3ZvaWQgZ2xNdWx0TWF0cml4eCAoIGNvbnN0IEdMZml4ZWQgKm0gKQ0KK3ZvaWQgZ2xNdWx0aVRleENvb3JkNGYgKCBHTGVudW0gdGFyZ2V0LCBHTGZsb2F0IHMsIEdMZmxvYXQgdCwgR0xmbG9hdCByLCBHTGZsb2F0IHEgKQ0KK3ZvaWQgZ2xNdWx0aVRleENvb3JkNHggKCBHTGVudW0gdGFyZ2V0LCBHTGZpeGVkIHMsIEdMZml4ZWQgdCwgR0xmaXhlZCByLCBHTGZpeGVkIHEgKQ0KK3ZvaWQgZ2xOb3JtYWwzZiAoIEdMZmxvYXQgbngsIEdMZmxvYXQgbnksIEdMZmxvYXQgbnogKQ0KK3ZvaWQgZ2xOb3JtYWwzeCAoIEdMZml4ZWQgbngsIEdMZml4ZWQgbnksIEdMZml4ZWQgbnogKQ0KK3ZvaWQgZ2xOb3JtYWxQb2ludGVyICggR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCBHTHZvaWQgKnBvaW50ZXIgKQ0KK3ZvaWQgZ2xPcnRob2YgKCBHTGZsb2F0IGxlZnQsIEdMZmxvYXQgcmlnaHQsIEdMZmxvYXQgYm90dG9tLCBHTGZsb2F0IHRvcCwgR0xmbG9hdCB6TmVhciwgR0xmbG9hdCB6RmFyICkNCit2b2lkIGdsT3J0aG94ICggR0xmaXhlZCBsZWZ0LCBHTGZpeGVkIHJpZ2h0LCBHTGZpeGVkIGJvdHRvbSwgR0xmaXhlZCB0b3AsIEdMZml4ZWQgek5lYXIsIEdMZml4ZWQgekZhciApDQordm9pZCBnbFBpeGVsU3RvcmVpICggR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSApDQordm9pZCBnbFBvaW50U2l6ZSAoIEdMZmxvYXQgc2l6ZSApDQordm9pZCBnbFBvaW50U2l6ZXggKCBHTGZpeGVkIHNpemUgKQ0KK3ZvaWQgZ2xQb2x5Z29uT2Zmc2V0ICggR0xmbG9hdCBmYWN0b3IsIEdMZmxvYXQgdW5pdHMgKQ0KK3ZvaWQgZ2xQb2x5Z29uT2Zmc2V0eCAoIEdMZml4ZWQgZmFjdG9yLCBHTGZpeGVkIHVuaXRzICkNCit2b2lkIGdsUG9wTWF0cml4ICggdm9pZCApDQordm9pZCBnbFB1c2hNYXRyaXggKCB2b2lkICkNCit2b2lkIGdsUmVhZFBpeGVscyAoIEdMaW50IHgsIEdMaW50IHksIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGVudW0gZm9ybWF0LCBHTGVudW0gdHlwZSwgR0x2b2lkICpwaXhlbHMgKQ0KK3ZvaWQgZ2xSb3RhdGVmICggR0xmbG9hdCBhbmdsZSwgR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeiApDQordm9pZCBnbFJvdGF0ZXggKCBHTGZpeGVkIGFuZ2xlLCBHTGZpeGVkIHgsIEdMZml4ZWQgeSwgR0xmaXhlZCB6ICkNCit2b2lkIGdsU2FtcGxlQ292ZXJhZ2UgKCBHTGNsYW1wZiB2YWx1ZSwgR0xib29sZWFuIGludmVydCApDQordm9pZCBnbFNhbXBsZUNvdmVyYWdleCAoIEdMY2xhbXB4IHZhbHVlLCBHTGJvb2xlYW4gaW52ZXJ0ICkNCit2b2lkIGdsU2NhbGVmICggR0xmbG9hdCB4LCBHTGZsb2F0IHksIEdMZmxvYXQgeiApDQordm9pZCBnbFNjYWxleCAoIEdMZml4ZWQgeCwgR0xmaXhlZCB5LCBHTGZpeGVkIHogKQ0KK3ZvaWQgZ2xTY2lzc29yICggR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQgKQ0KK3ZvaWQgZ2xTaGFkZU1vZGVsICggR0xlbnVtIG1vZGUgKQ0KK3ZvaWQgZ2xTdGVuY2lsRnVuYyAoIEdMZW51bSBmdW5jLCBHTGludCByZWYsIEdMdWludCBtYXNrICkNCit2b2lkIGdsU3RlbmNpbE1hc2sgKCBHTHVpbnQgbWFzayApDQordm9pZCBnbFN0ZW5jaWxPcCAoIEdMZW51bSBmYWlsLCBHTGVudW0gemZhaWwsIEdMZW51bSB6cGFzcyApDQordm9pZCBnbFRleENvb3JkUG9pbnRlciAoIEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyICkNCit2b2lkIGdsVGV4RW52ZiAoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCBwYXJhbSApDQordm9pZCBnbFRleEVudmZ2ICggR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGZsb2F0ICpwYXJhbXMgKQ0KK3ZvaWQgZ2xUZXhFbnZ4ICggR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtICkNCit2b2lkIGdsVGV4RW52eHYgKCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZml4ZWQgKnBhcmFtcyApDQordm9pZCBnbFRleEltYWdlMkQgKCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xpbnQgaW50ZXJuYWxmb3JtYXQsIEdMc2l6ZWkgd2lkdGgsIEdMc2l6ZWkgaGVpZ2h0LCBHTGludCBib3JkZXIsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0eXBlLCBjb25zdCBHTHZvaWQgKnBpeGVscyApDQordm9pZCBnbFRleFBhcmFtZXRlcmYgKCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgcGFyYW0gKQ0KK3ZvaWQgZ2xUZXhQYXJhbWV0ZXJ4ICggR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtICkNCit2b2lkIGdsVGV4U3ViSW1hZ2UyRCAoIEdMZW51bSB0YXJnZXQsIEdMaW50IGxldmVsLCBHTGludCB4b2Zmc2V0LCBHTGludCB5b2Zmc2V0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHR5cGUsIGNvbnN0IEdMdm9pZCAqcGl4ZWxzICkNCit2b2lkIGdsVHJhbnNsYXRlZiAoIEdMZmxvYXQgeCwgR0xmbG9hdCB5LCBHTGZsb2F0IHogKQ0KK3ZvaWQgZ2xUcmFuc2xhdGV4ICggR0xmaXhlZCB4LCBHTGZpeGVkIHksIEdMZml4ZWQgeiApDQordm9pZCBnbFZlcnRleFBvaW50ZXIgKCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlciApDQordm9pZCBnbFZpZXdwb3J0ICggR0xpbnQgeCwgR0xpbnQgeSwgR0xzaXplaSB3aWR0aCwgR0xzaXplaSBoZWlnaHQgKQ0KZGlmZiAtLWdpdCBhL29wZW5nbC90b29scy9nbGdlbi9nbHNwZWMtMS4wZXh0IGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL2dsc3BlYy0xLjBleHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2QxOTc1OAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90b29scy9nbGdlbi9nbHNwZWMtMS4wZXh0CkBAIC0wLDAgKzEgQEAKK0dMYml0ZmllbGQgZ2xRdWVyeU1hdHJpeHhPRVMgKCBHTGZpeGVkICptYW50aXNzYSwgR0xpbnQgKmV4cG9uZW50ICkNCmRpZmYgLS1naXQgYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vZ2xzcGVjLTEuMSBiL29wZW5nbC90b29scy9nbGdlbi9nbHNwZWMtMS4xCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxNDlhN2YKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vZ2xzcGVjLTEuMQpAQCAtMCwwICsxLDQyIEBACit2b2lkIGdsQmluZEJ1ZmZlciAoIEdMZW51bSB0YXJnZXQsIEdMdWludCBidWZmZXIgKQ0KK3ZvaWQgZ2xCdWZmZXJEYXRhICggR0xlbnVtIHRhcmdldCwgR0xzaXplaXB0ciBzaXplLCBjb25zdCBHTHZvaWQgKmRhdGEsIEdMZW51bSB1c2FnZSApDQordm9pZCBnbEJ1ZmZlclN1YkRhdGEgKCBHTGVudW0gdGFyZ2V0LCBHTGludHB0ciBvZmZzZXQsIEdMc2l6ZWlwdHIgc2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhICkNCit2b2lkIGdsQ2xpcFBsYW5lZiAoIEdMZW51bSBwbGFuZSwgY29uc3QgR0xmbG9hdCAqZXF1YXRpb24gKQ0KK3ZvaWQgZ2xDbGlwUGxhbmV4ICggR0xlbnVtIHBsYW5lLCBjb25zdCBHTGZpeGVkICplcXVhdGlvbiApDQordm9pZCBnbENvbG9yNHViICggR0x1Ynl0ZSByZWQsIEdMdWJ5dGUgZ3JlZW4sIEdMdWJ5dGUgYmx1ZSwgR0x1Ynl0ZSBhbHBoYSApDQordm9pZCBnbENvbG9yUG9pbnRlciAoIEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgR0xpbnQgb2Zmc2V0ICkNCit2b2lkIGdsRGVsZXRlQnVmZmVycyAoIEdMc2l6ZWkgbiwgY29uc3QgR0x1aW50ICpidWZmZXJzICkNCit2b2lkIGdsRHJhd0VsZW1lbnRzICggR0xlbnVtIG1vZGUsIEdMc2l6ZWkgY291bnQsIEdMZW51bSB0eXBlLCBHTGludCBvZmZzZXQgKQ0KK3ZvaWQgZ2xHZW5CdWZmZXJzICggR0xzaXplaSBuLCBHTHVpbnQgKmJ1ZmZlcnMgKQ0KK3ZvaWQgZ2xHZXRCb29sZWFudiAoIEdMZW51bSBwbmFtZSwgR0xib29sZWFuICpwYXJhbXMgKQ0KK3ZvaWQgZ2xHZXRCdWZmZXJQYXJhbWV0ZXJpdiAoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyApDQordm9pZCBnbEdldENsaXBQbGFuZWYgKCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKmVxbiApDQordm9pZCBnbEdldENsaXBQbGFuZXggKCBHTGVudW0gcG5hbWUsIEdMZml4ZWQgKmVxbiApDQordm9pZCBnbEdldEZpeGVkdiAoIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zICkNCit2b2lkIGdsR2V0RmxvYXR2ICggR0xlbnVtIHBuYW1lLCBHTGZsb2F0ICpwYXJhbXMgKQ0KK3ZvaWQgZ2xHZXRMaWdodGZ2ICggR0xlbnVtIGxpZ2h0LCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyApDQordm9pZCBnbEdldExpZ2h0eHYgKCBHTGVudW0gbGlnaHQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zICkNCit2b2lkIGdsR2V0TWF0ZXJpYWxmdiAoIEdMZW51bSBmYWNlLCBHTGVudW0gcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyApDQordm9pZCBnbEdldE1hdGVyaWFseHYgKCBHTGVudW0gZmFjZSwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMgKQ0KK3ZvaWQgZ2xHZXRUZXhFbnZpdiAoIEdMZW51bSBlbnYsIEdMZW51bSBwbmFtZSwgR0xpbnQgKnBhcmFtcyApDQordm9pZCBnbEdldFRleEVudnh2ICggR0xlbnVtIGVudiwgR0xlbnVtIHBuYW1lLCBHTGZpeGVkICpwYXJhbXMgKQ0KK3ZvaWQgZ2xHZXRUZXhQYXJhbWV0ZXJmdiAoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zICkNCit2b2lkIGdsR2V0VGV4UGFyYW1ldGVyaXYgKCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50ICpwYXJhbXMgKQ0KK3ZvaWQgZ2xHZXRUZXhQYXJhbWV0ZXJ4diAoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgR0xmaXhlZCAqcGFyYW1zICkNCitHTGJvb2xlYW4gZ2xJc0J1ZmZlciAoIEdMdWludCBidWZmZXIgKQ0KK0dMYm9vbGVhbiBnbElzRW5hYmxlZCAoIEdMZW51bSBjYXAgKQ0KK0dMYm9vbGVhbiBnbElzVGV4dHVyZSAoIEdMdWludCB0ZXh0dXJlICkNCit2b2lkIGdsTm9ybWFsUG9pbnRlciAoIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgR0xpbnQgb2Zmc2V0ICkNCit2b2lkIGdsUG9pbnRQYXJhbWV0ZXJmICggR0xlbnVtIHBuYW1lLCBHTGZsb2F0IHBhcmFtICkNCit2b2lkIGdsUG9pbnRQYXJhbWV0ZXJmdiAoIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmbG9hdCAqcGFyYW1zICkNCit2b2lkIGdsUG9pbnRQYXJhbWV0ZXJ4ICggR0xlbnVtIHBuYW1lLCBHTGZpeGVkIHBhcmFtICkNCit2b2lkIGdsUG9pbnRQYXJhbWV0ZXJ4diAoIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zICkNCit2b2lkIGdsUG9pbnRTaXplUG9pbnRlck9FUyAoIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyICkNCit2b2lkIGdsVGV4Q29vcmRQb2ludGVyICggR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsIEdMc2l6ZWkgc3RyaWRlLCBHTGludCBvZmZzZXQgKQ0KK3ZvaWQgZ2xUZXhFbnZpICggR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBHTGludCBwYXJhbSApDQordm9pZCBnbFRleEVudml2ICggR0xlbnVtIHRhcmdldCwgR0xlbnVtIHBuYW1lLCBjb25zdCBHTGludCAqcGFyYW1zICkNCit2b2lkIGdsVGV4UGFyYW1ldGVyZnYgKCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMZmxvYXQgKnBhcmFtcyApDQordm9pZCBnbFRleFBhcmFtZXRlcmkgKCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIEdMaW50IHBhcmFtICkNCit2b2lkIGdsVGV4UGFyYW1ldGVyaXYgKCBHTGVudW0gdGFyZ2V0LCBHTGVudW0gcG5hbWUsIGNvbnN0IEdMaW50ICpwYXJhbXMgKQ0KK3ZvaWQgZ2xUZXhQYXJhbWV0ZXJ4diAoIEdMZW51bSB0YXJnZXQsIEdMZW51bSBwbmFtZSwgY29uc3QgR0xmaXhlZCAqcGFyYW1zICkNCit2b2lkIGdsVmVydGV4UG9pbnRlciAoIEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgR0xpbnQgb2Zmc2V0ICkNCmRpZmYgLS1naXQgYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vZ2xzcGVjLTEuMWV4dCBiL29wZW5nbC90b29scy9nbGdlbi9nbHNwZWMtMS4xZXh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjMDhjNzMKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vZ2xzcGVjLTEuMWV4dApAQCAtMCwwICsxLDE2IEBACit2b2lkIGdsQ3VycmVudFBhbGV0dGVNYXRyaXhPRVMgKCBHTHVpbnQgbWF0cml4cGFsZXR0ZWluZGV4ICkNCit2b2lkIGdsRHJhd1RleGZPRVMgKCBHTGZsb2F0IHgsIEdMZmxvYXQgeSwgR0xmbG9hdCB6LCBHTGZsb2F0IHdpZHRoLCBHTGZsb2F0IGhlaWdodCApDQordm9pZCBnbERyYXdUZXhmdk9FUyAoIGNvbnN0IEdMZmxvYXQgKmNvb3JkcyApDQordm9pZCBnbERyYXdUZXhpT0VTICggR0xpbnQgeCwgR0xpbnQgeSwgR0xpbnQgeiwgR0xpbnQgd2lkdGgsIEdMaW50IGhlaWdodCApDQordm9pZCBnbERyYXdUZXhpdk9FUyAoIGNvbnN0IEdMaW50ICpjb29yZHMgKQ0KK3ZvaWQgZ2xEcmF3VGV4c09FUyAoIEdMc2hvcnQgeCwgR0xzaG9ydCB5LCBHTHNob3J0IHosIEdMc2hvcnQgd2lkdGgsIEdMc2hvcnQgaGVpZ2h0ICkNCit2b2lkIGdsRHJhd1RleHN2T0VTICggY29uc3QgR0xzaG9ydCAqY29vcmRzICkNCit2b2lkIGdsRHJhd1RleHhPRVMgKCBHTGZpeGVkIHgsIEdMZml4ZWQgeSwgR0xmaXhlZCB6LCBHTGZpeGVkIHdpZHRoLCBHTGZpeGVkIGhlaWdodCApDQordm9pZCBnbERyYXdUZXh4dk9FUyAoIGNvbnN0IEdMZml4ZWQgKmNvb3JkcyApDQordm9pZCBnbEVuYWJsZSAoIEdMZW51bSBjYXAgKQ0KK3ZvaWQgZ2xFbmFibGVDbGllbnRTdGF0ZSAoIEdMZW51bSBhcnJheSApDQordm9pZCBnbExvYWRQYWxldHRlRnJvbU1vZGVsVmlld01hdHJpeE9FUyAoIHZvaWQgKQ0KK3ZvaWQgZ2xNYXRyaXhJbmRleFBvaW50ZXJPRVMgKCBHTGludCBzaXplLCBHTGVudW0gdHlwZSwgR0xzaXplaSBzdHJpZGUsIGNvbnN0IEdMdm9pZCAqcG9pbnRlciApDQordm9pZCBnbE1hdHJpeEluZGV4UG9pbnRlck9FUyAoIEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgR0xpbnQgb2Zmc2V0ICkNCit2b2lkIGdsV2VpZ2h0UG9pbnRlck9FUyAoIEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgY29uc3QgR0x2b2lkICpwb2ludGVyICkNCit2b2lkIGdsV2VpZ2h0UG9pbnRlck9FUyAoIEdMaW50IHNpemUsIEdMZW51bSB0eXBlLCBHTHNpemVpIHN0cmlkZSwgR0xpbnQgb2Zmc2V0ICkNCmRpZmYgLS1naXQgYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vZ2xzcGVjLTEuMWV4dHBhY2sgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vZ2xzcGVjLTEuMWV4dHBhY2sKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2E5ZTZkMgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90b29scy9nbGdlbi9nbHNwZWMtMS4xZXh0cGFjawpAQCAtMCwwICsxLDM4IEBACit2b2lkIGdsQmluZEZyYW1lYnVmZmVyT0VTICggR0xpbnQgdGFyZ2V0LCBHTGludCBmcmFtZWJ1ZmZlciApCit2b2lkIGdsQmluZFJlbmRlcmJ1ZmZlck9FUyAoIEdMaW50IHRhcmdldCwgR0xpbnQgcmVuZGVyYnVmZmVyICkKK3ZvaWQgZ2xCaW5kVGV4dHVyZSAoIEdMaW50IHRhcmdldCwgR0xpbnQgdGV4dHVyZSApCit2b2lkIGdsQmxlbmRFcXVhdGlvbiAoIEdMaW50IG1vZGUgKQordm9pZCBnbEJsZW5kRXF1YXRpb25TZXBhcmF0ZSAoIEdMaW50IG1vZGVSR0IsIEdMaW50IG1vZGVBbHBoYSApCit2b2lkIGdsQmxlbmRGdW5jU2VwYXJhdGUgKCBHTGludCBzcmNSR0IsIEdMaW50IGRzdFJHQiwgR0xpbnQgc3JjQWxwaGEsIEdMaW50IGRzdEFscGhhICkKK0dMaW50IGdsQ2hlY2tGcmFtZWJ1ZmZlclN0YXR1c09FUyAoIEdMaW50IHRhcmdldCApCit2b2lkIGdsQ29tcHJlc3NlZFRleEltYWdlMkQgKCBHTGVudW0gdGFyZ2V0LCBHTGludCBsZXZlbCwgR0xlbnVtIGludGVybmFsZm9ybWF0LCBHTHNpemVpIHdpZHRoLCBHTHNpemVpIGhlaWdodCwgR0xpbnQgYm9yZGVyLCBHTHNpemVpIGltYWdlU2l6ZSwgY29uc3QgR0x2b2lkICpkYXRhICkKK3ZvaWQgZ2xDb3B5VGV4SW1hZ2UyRCAoIEdMaW50IHRhcmdldCwgR0xpbnQgbGV2ZWwsIEdMaW50IGludGVybmFsZm9ybWF0LCBHTGludCB4LCBHTGludCB5LCBHTGludCB3aWR0aCwgR0xpbnQgaGVpZ2h0LCBHTGludCBib3JkZXIgKQordm9pZCBnbERlbGV0ZUZyYW1lYnVmZmVyc09FUyAoIEdMaW50IG4sIEdMaW50ICpmcmFtZWJ1ZmZlcnMgKQordm9pZCBnbERlbGV0ZVJlbmRlcmJ1ZmZlcnNPRVMgKCBHTGludCBuLCBHTGludCAqcmVuZGVyYnVmZmVycyApCit2b2lkIGdsRW5hYmxlICggR0xpbnQgY2FwICkKK3ZvaWQgZ2xGcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlck9FUyAoIEdMaW50IHRhcmdldCwgR0xpbnQgYXR0YWNobWVudCwgR0xpbnQgcmVuZGVyYnVmZmVydGFyZ2V0LCBHTGludCByZW5kZXJidWZmZXIgKQordm9pZCBnbEZyYW1lYnVmZmVyVGV4dHVyZTJET0VTICggR0xpbnQgdGFyZ2V0LCBHTGludCBhdHRhY2htZW50LCBHTGludCB0ZXh0YXJnZXQsIEdMaW50IHRleHR1cmUsIEdMaW50IGxldmVsICkKK3ZvaWQgZ2xHZW5lcmF0ZU1pcG1hcE9FUyAoIEdMaW50IHRhcmdldCApCit2b2lkIGdsR2VuRnJhbWVidWZmZXJzT0VTICggR0xpbnQgbiwgR0xpbnQgKmZyYW1lYnVmZmVycyApCit2b2lkIGdsR2VuUmVuZGVyYnVmZmVyc09FUyAoIEdMaW50IG4sIEdMaW50ICpyZW5kZXJidWZmZXJzICkKK3ZvaWQgZ2xHZXRGcmFtZWJ1ZmZlckF0dGFjaG1lbnRQYXJhbWV0ZXJpdk9FUyAoIEdMaW50IHRhcmdldCwgR0xpbnQgYXR0YWNobWVudCwgR0xpbnQgcG5hbWUsIEdMaW50ICpwYXJhbXMgKQordm9pZCBnbEdldEludGVnZXJ2ICggR0xpbnQgcG5hbWUsIEdMaW50ICpwYXJhbXMgKQordm9pZCBnbEdldFJlbmRlcmJ1ZmZlclBhcmFtZXRlcml2T0VTICggR0xpbnQgdGFyZ2V0LCBHTGludCBwbmFtZSwgR0xpbnQgKnBhcmFtcyApCit2b2lkIGdsR2V0VGV4R2VuZnYgKCBHTGludCBjb29yZCwgR0xpbnQgcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyApCit2b2lkIGdsR2V0VGV4R2VuaXYgKCBHTGludCBjb29yZCwgR0xpbnQgcG5hbWUsIEdMaW50ICpwYXJhbXMgKQordm9pZCBnbEdldFRleEdlbnh2ICggR0xpbnQgY29vcmQsIEdMaW50IHBuYW1lLCBHTGludCAqcGFyYW1zICkKK0dMYm9vbGVhbiBnbElzRnJhbWVidWZmZXJPRVMgKCBHTGludCBmcmFtZWJ1ZmZlciApCitHTGJvb2xlYW4gZ2xJc1JlbmRlcmJ1ZmZlck9FUyAoIEdMaW50IHJlbmRlcmJ1ZmZlciApCit2b2lkIGdsUmVuZGVyYnVmZmVyU3RvcmFnZU9FUyAoIEdMaW50IHRhcmdldCwgR0xpbnQgaW50ZXJuYWxmb3JtYXQsIEdMaW50IHdpZHRoLCBHTGludCBoZWlnaHQgKQordm9pZCBnbFN0ZW5jaWxPcCAoIEdMaW50IGZhaWwsIEdMaW50IHpmYWlsLCBHTGludCB6cGFzcyApCit2b2lkIGdsVGV4RW52ZiAoIEdMaW50IHRhcmdldCwgR0xpbnQgcG5hbWUsIEdMZmxvYXQgcGFyYW0gKQordm9pZCBnbFRleEVudmZ2ICggR0xpbnQgdGFyZ2V0LCBHTGludCBwbmFtZSwgR0xmbG9hdCAqcGFyYW1zICkKK3ZvaWQgZ2xUZXhFbnZ4ICggR0xpbnQgdGFyZ2V0LCBHTGludCBwbmFtZSwgR0xpbnQgcGFyYW0gKQordm9pZCBnbFRleEVudnh2ICggR0xpbnQgdGFyZ2V0LCBHTGludCBwbmFtZSwgR0xpbnQgKnBhcmFtcyApCit2b2lkIGdsVGV4R2VuZiAoIEdMaW50IGNvb3JkLCBHTGludCBwbmFtZSwgR0xmbG9hdCBwYXJhbSApCit2b2lkIGdsVGV4R2VuZnYgKCBHTGludCBjb29yZCwgR0xpbnQgcG5hbWUsIEdMZmxvYXQgKnBhcmFtcyApCit2b2lkIGdsVGV4R2VuaSAoIEdMaW50IGNvb3JkLCBHTGludCBwbmFtZSwgR0xpbnQgcGFyYW0gKQordm9pZCBnbFRleEdlbml2ICggR0xpbnQgY29vcmQsIEdMaW50IHBuYW1lLCBHTGludCAqcGFyYW1zICkKK3ZvaWQgZ2xUZXhHZW54ICggR0xpbnQgY29vcmQsIEdMaW50IHBuYW1lLCBHTGludCBwYXJhbSApCit2b2lkIGdsVGV4R2VueHYgKCBHTGludCBjb29yZCwgR0xpbnQgcG5hbWUsIEdMaW50ICpwYXJhbXMgKQordm9pZCBnbFRleFBhcmFtZXRlcmYgKCBHTGludCB0YXJnZXQsIEdMaW50IHBuYW1lLCBHTGZsb2F0IHBhcmFtICkKZGlmZiAtLWdpdCBhL29wZW5nbC90b29scy9nbGdlbi9nbHNwZWMtY2hlY2tzIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL2dsc3BlYy1jaGVja3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg0ZWQ2NQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90b29scy9nbGdlbi9nbHNwZWMtY2hlY2tzCkBAIC0wLDAgKzEsNTkgQEAKK2dsQ2xpcFBsYW5lZiBjaGVjayBlcXVhdGlvbiA0DQorZ2xDbGlwUGxhbmV4IGNoZWNrIGVxdWF0aW9uIDQNCitnbERlbGV0ZUJ1ZmZlcnMgY2hlY2sgYnVmZmVycyBuIA0KK2dsRGVsZXRlVGV4dHVyZXMgY2hlY2sgdGV4dHVyZXMgbg0KK2dsRHJhd0VsZW1lbnRzIGNoZWNrX0FJT09CRSBpbmRpY2VzIGNvdW50DQorZ2xGb2cgaWZjaGVjayBwYXJhbXMgMSBwbmFtZSBHTF9GT0dfTU9ERSxHTF9GT0dfREVOU0lUWSxHTF9GT0dfU1RBUlQsR0xfRk9HX0VORCBpZmNoZWNrIHBhcmFtcyA0IHBuYW1lIEdMX0ZPR19DT0xPUg0KK2dsR2VuQnVmZmVycyBjaGVjayBidWZmZXJzIG4NCitnbEdlblRleHR1cmVzIGNoZWNrIHRleHR1cmVzIG4NCitnbEdldENsaXBQbGFuZSBjaGVjayBlcW4gNA0KK2dsR2V0SW50ZWdlcnYgaWZjaGVjayBwYXJhbXMgMSBwbmFtZSBHTF9BTFBIQV9CSVRTLEdMX0FMUEhBX1RFU1RfRlVOQyxHTF9BTFBIQV9URVNUX1JFRixHTF9CTEVORF9EU1QsR0xfQkxVRV9CSVRTLEdMX0NPTE9SX0FSUkFZX0JVRkZFUl9CSU5ESU5HLEdMX0NPTE9SX0FSUkFZX1NJWkUsR0xfQ09MT1JfQVJSQVlfU1RSSURFLEdMX0NPTE9SX0FSUkFZX1RZUEUsR0xfQ1VMTF9GQUNFLEdMX0RFUFRIX0JJVFMsR0xfREVQVEhfQ0xFQVJfVkFMVUUsR0xfREVQVEhfRlVOQyxHTF9ERVBUSF9XUklURU1BU0ssR0xfRk9HX0RFTlNJVFksR0xfRk9HX0VORCxHTF9GT0dfTU9ERSxHTF9GT0dfU1RBUlQsR0xfRlJPTlRfRkFDRSxHTF9HUkVFTl9CSVRTLEdMX0lNUExFTUVOVEFUSU9OX0NPTE9SX1JFQURfRk9STUFUX09FUyxHTF9JTVBMRU1FTlRBVElPTl9DT0xPUl9SRUFEX1RZUEVfT0VTLEdMX0xJR0hUX01PREVMX1RXT19TSURFLEdMX0xJTkVfU01PT1RIX0hJTlQsR0xfTElORV9XSURUSCxHTF9MT0dJQ19PUF9NT0RFLEdMX01BVFJJWF9JTkRFWF9BUlJBWV9CVUZGRVJfQklORElOR19PRVMsR0xfTUFUUklYX0lOREVYX0FSUkFZX1NJWkVfT0VTLEdMX01BVFJJWF9JTkRFWF9BUlJBWV9TVFJJREVfT0VTLEdMX01BVFJJWF9JTkRFWF9BUlJBWV9UWVBFX09FUyxHTF9NQVRSSVhfTU9ERSxHTF9NQVhfQ0xJUF9QTEFORVMsR0xfTUFYX0VMRU1FTlRTX0lORElDRVMsR0xfTUFYX0VMRU1FTlRTX1ZFUlRJQ0VTLEdMX01BWF9MSUdIVFMsR0xfTUFYX01PREVMVklFV19TVEFDS19ERVBUSCxHTF9NQVhfUEFMRVRURV9NQVRSSUNFU19PRVMsR0xfTUFYX1BST0pFQ1RJT05fU1RBQ0tfREVQVEgsR0xfTUFYX1RFWFRVUkVfU0laRSxHTF9NQVhfVEVYVFVSRV9TVEFDS19ERVBUSCxHTF9NQVhfVEVYVFVSRV9VTklUUyxHTF9NQVhfVkVSVEVYX1VOSVRTX09FUyxHTF9NT0RFTFZJRVdfU1RBQ0tfREVQVEgsR0xfTk9STUFMX0FSUkFZX0JVRkZFUl9CSU5ESU5HLEdMX05PUk1BTF9BUlJBWV9TVFJJREUsR0xfTk9STUFMX0FSUkFZX1RZUEUsR0xfTlVNX0NPTVBSRVNTRURfVEVYVFVSRV9GT1JNQVRTLEdMX1BBQ0tfQUxJR05NRU5ULEdMX1BFUlNQRUNUSVZFX0NPUlJFQ1RJT05fSElOVCxHTF9QT0lOVF9TSVpFLEdMX1BPSU5UX1NJWkVfQVJSQVlfQlVGRkVSX0JJTkRJTkdfT0VTLEdMX1BPSU5UX1NJWkVfQVJSQVlfU1RSSURFX09FUyxHTF9QT0lOVF9TSVpFX0FSUkFZX1RZUEVfT0VTLEdMX1BPSU5UX1NNT09USF9ISU5ULEdMX1BPTFlHT05fT0ZGU0VUX0ZBQ1RPUixHTF9QT0xZR09OX09GRlNFVF9VTklUUyxHTF9QUk9KRUNUSU9OX1NUQUNLX0RFUFRILEdMX1JFRF9CSVRTLEdMX1NIQURFX01PREVMLEdMX1NURU5DSUxfQklUUyxHTF9TVEVOQ0lMX0NMRUFSX1ZBTFVFLEdMX1NURU5DSUxfRkFJTCxHTF9TVEVOQ0lMX0ZVTkMsR0xfU1RFTkNJTF9QQVNTX0RFUFRIX0ZBSUwsR0xfU1RFTkNJTF9QQVNTX0RFUFRIX1BBU1MsR0xfU1RFTkNJTF9SRUYsR0xfU1RFTkNJTF9WQUxVRV9NQVNLLEdMX1NURU5DSUxfV1JJVEVNQVNLLEdMX1NVQlBJWEVMX0JJVFMsR0xfVEVYVFVSRV9CSU5ESU5HXzJELEdMX1RFWFRVUkVfQ09PUkRfQVJSQVlfQlVGRkVSX0JJTkRJTkcsR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9TSVpFLEdMX1RFWFRVUkVfQ09PUkRfQVJSQVlfU1RSSURFLEdMX1RFWFRVUkVfQ09PUkRfQVJSQVlfVFlQRSxHTF9URVhUVVJFX1NUQUNLX0RFUFRILEdMX1VOUEFDS19BTElHTk1FTlQsR0xfVkVSVEVYX0FSUkFZX0JVRkZFUl9CSU5ESU5HLEdMX1ZFUlRFWF9BUlJBWV9TSVpFLEdMX1ZFUlRFWF9BUlJBWV9TVFJJREUsR0xfVkVSVEVYX0FSUkFZX1RZUEUsR0xfV0VJR0hUX0FSUkFZX0JVRkZFUl9CSU5ESU5HX09FUyxHTF9XRUlHSFRfQVJSQVlfU0laRV9PRVMsR0xfV0VJR0hUX0FSUkFZX1NUUklERV9PRVMsR0xfV0VJR0hUX0FSUkFZX1RZUEVfT0VTIGlmY2hlY2sgcGFyYW1zIDIgcG5hbWUgR0xfQUxJQVNFRF9QT0lOVF9TSVpFX1JBTkdFLEdMX0FMSUFTRURfTElORV9XSURUSF9SQU5HRSxHTF9ERVBUSF9SQU5HRSxHTF9NQVhfVklFV1BPUlRfRElNUyxHTF9TTU9PVEhfTElORV9XSURUSF9SQU5HRSxHTF9TTU9PVEhfUE9JTlRfU0laRV9SQU5HRSBpZmNoZWNrIHBhcmFtcyA0IHBuYW1lIEdMX0NPTE9SX0NMRUFSX1ZBTFVFLEdMX0NPTE9SX1dSSVRFTUFTSyxHTF9TQ0lTU09SX0JPWCxHTF9WSUVXUE9SVCBpZmNoZWNrIHBhcmFtcyAxNiBwbmFtZSBHTF9NT0RFTFZJRVdfTUFUUklYLEdMX01PREVMVklFV19NQVRSSVhfRkxPQVRfQVNfSU5UX0JJVFNfT0VTLEdMX1BST0pFQ1RJT05fTUFUUklYLEdMX1BST0pFQ1RJT05fTUFUUklYX0ZMT0FUX0FTX0lOVF9CSVRTX09FUyxHTF9URVhUVVJFX01BVFJJWCxHTF9URVhUVVJFX01BVFJJWF9GTE9BVF9BU19JTlRfQklUU19PRVMgaWZjaGVjayBwYXJhbXMgX05VTV9DT01QUkVTU0VEX1RFWFRVUkVfRk9STUFUUyBwbmFtZSBHTF9DT01QUkVTU0VEX1RFWFRVUkVfRk9STUFUUyxHTF9GT0dfQ09MT1IsR0xfTElHSFRfTU9ERUxfQU1CSUVOVA0KK2dsR2V0TGlnaHQgaWZjaGVjayBwYXJhbXMgMSBwbmFtZSBHTF9TUE9UX0VYUE9ORU5ULEdMX1NQT1RfQ1VUT0ZGLEdMX0NPTlNUQU5UX0FUVEVOVUFUSU9OLEdMX0xJTkVBUl9BVFRFTlVBVElPTixHTF9RVUFEUkFUSUNfQVRURU5VQVRJT04gaWZjaGVjayBwYXJhbXMgMyBwbmFtZSBHTF9TUE9UX0RJUkVDVElPTiBpZmNoZWNrIHBhcmFtcyA0IHBuYW1lIEdMX0FNQklFTlQsR0xfRElGRlVTRSxHTF9TUEVDVUxBUixHTF9FTUlTU0lPTg0KK2dsR2V0TWF0ZXJpYWwgaWZjaGVjayBwYXJhbXMgMSBwbmFtZSBHTF9TSElOSU5FU1MgaWZjaGVjayBwYXJhbXMgNCBwbmFtZSBHTF9BTUJJRU5ULEdMX0RJRkZVU0UsR0xfU1BFQ1VMQVIsR0xfRU1JU1NJT04sR0xfQU1CSUVOVF9BTkRfRElGRlVTRQ0KK2dsR2V0VGV4RW52IGlmY2hlY2sgcGFyYW1zIDEgcG5hbWUgR0xfVEVYVFVSRV9FTlZfTU9ERSxHTF9DT01CSU5FX1JHQixHTF9DT01CSU5FX0FMUEhBIGlmY2hlY2sgcGFyYW1zIDQgcG5hbWUgR0xfVEVYVFVSRV9FTlZfQ09MT1INCitnbEdldFRleFBhcmFtZXRlciBjaGVjayBwYXJhbXMgMQ0KK2dsTGlnaHRNb2RlbCBpZmNoZWNrIHBhcmFtcyAxIHBuYW1lIEdMX0xJR0hUX01PREVMX1RXT19TSURFIGlmY2hlY2sgcGFyYW1zIDQgcG5hbWUgR0xfTElHSFRfTU9ERUxfQU1CSUVOVA0KK2dsTGlnaHQgaWZjaGVjayBwYXJhbXMgMSBwbmFtZSBHTF9TUE9UX0VYUE9ORU5ULEdMX1NQT1RfQ1VUT0ZGLEdMX0NPTlNUQU5UX0FUVEVOVUFUSU9OLEdMX0xJTkVBUl9BVFRFTlVBVElPTixHTF9RVUFEUkFUSUNfQVRURU5VQVRJT04gaWZjaGVjayBwYXJhbXMgMyBwbmFtZSBHTF9TUE9UX0RJUkVDVElPTiBpZmNoZWNrIHBhcmFtcyA0IHBuYW1lIEdMX0FNQklFTlQsR0xfRElGRlVTRSxHTF9TUEVDVUxBUixHTF9FTUlTU0lPTg0KK2dsTG9hZE1hdHJpeCBjaGVjayBtIDE2DQorZ2xNYXRlcmlhbCBpZmNoZWNrIHBhcmFtcyAxIHBuYW1lIEdMX1NISU5JTkVTUyBpZmNoZWNrIHBhcmFtcyA0IHBuYW1lIEdMX0FNQklFTlQsR0xfRElGRlVTRSxHTF9TUEVDVUxBUixHTF9FTUlTU0lPTixHTF9BTUJJRU5UX0FORF9ESUZGVVNFDQorZ2xNdWx0TWF0cml4IGNoZWNrIG0gMTYNCitnbFBvaW50UGFyYW1ldGVyIGNoZWNrIHBhcmFtcyAxDQorZ2xUZXhFbnYgaWZjaGVjayBwYXJhbXMgMSBwbmFtZSBHTF9URVhUVVJFX0VOVl9NT0RFLEdMX0NPTUJJTkVfUkdCLEdMX0NPTUJJTkVfQUxQSEEgaWZjaGVjayBwYXJhbXMgNCBwbmFtZSBHTF9URVhUVVJFX0VOVl9DT0xPUg0KK2dsVGV4SW1hZ2UyRCBudWxsQWxsb3dlZA0KK2dsVGV4U3ViSW1hZ2UyRCBudWxsQWxsb3dlZA0KK2dsQnVmZmVyRGF0YSBudWxsQWxsb3dlZA0KK2dsVGV4UGFyYW1ldGVyIGNoZWNrIHBhcmFtcyAxDQorZ2xRdWVyeU1hdHJpeHhPRVMgY2hlY2sgbWFudGlzc2EgMTYgY2hlY2sgZXhwb25lbnQgMTYgcmV0dXJuIC0xDQorZ2xEcmF3VGV4ZnZPRVMgY2hlY2sgY29vcmRzIDUNCitnbERyYXdUZXhpdk9FUyBjaGVjayBjb29yZHMgNQ0KK2dsRHJhd1RleHN2T0VTIGNoZWNrIGNvb3JkcyA1DQorZ2xEcmF3VGV4eHZPRVMgY2hlY2sgY29vcmRzIDUNCitnbEJpbmRGcmFtZWJ1ZmZlck9FUyB1bnN1cHBvcnRlZA0KK2dsQmluZFJlbmRlcmJ1ZmZlck9FUyB1bnN1cHBvcnRlZA0KK2dsQmxlbmRFcXVhdGlvbiB1bnN1cHBvcnRlZA0KK2dsQmxlbmRFcXVhdGlvblNlcGFyYXRlIHVuc3VwcG9ydGVkDQorZ2xCbGVuZEZ1bmNTZXBhcmF0ZSB1bnN1cHBvcnRlZA0KK2dsQ2hlY2tGcmFtZWJ1ZmZlclN0YXR1c09FUyB1bnN1cHBvcnRlZCByZXR1cm4gMA0KK2dsQ3VycmVudFBhbGV0dGVNYXRyaXhPRVMgdW5zdXBwb3J0ZWQNCitnbERlbGV0ZUZyYW1lYnVmZmVyc09FUyB1bnN1cHBvcnRlZA0KK2dsRGVsZXRlUmVuZGVyYnVmZmVyc09FUyB1bnN1cHBvcnRlZA0KK2dsRnJhbWVidWZmZXJSZW5kZXJidWZmZXJPRVMgdW5zdXBwb3J0ZWQNCitnbEZyYW1lYnVmZmVyU3RvcmFnZU9FUyB1bnN1cHBvcnRlZA0KK2dsRnJhbWVidWZmZXJUZXh0dXJlMkRPRVMgdW5zdXBwb3J0ZWQNCitnbEdlbkZyYW1lYnVmZmVyc09FUyB1bnN1cHBvcnRlZA0KK2dsR2VuUmVuZGVyYnVmZmVyc09FUyB1bnN1cHBvcnRlZA0KK2dsR2VuZXJhdGVNaXBtYXBPRVMgdW5zdXBwb3J0ZWQNCitnbEdldEJ1ZmZlclBhcmFtZXRlciB1bnN1cHBvcnRlZA0KK2dsR2V0RnJhbWVidWZmZXJBdHRhY2htZW50UGFyYW1ldGVyaXZPRVMgdW5zdXBwb3J0ZWQNCitnbEdldFJlbmRlcmJ1ZmZlclBhcmFtZXRlcml2T0VTIHVuc3VwcG9ydGVkDQorZ2xHZXRUZXhHZW4gdW5zdXBwb3J0ZWQNCitnbElzRnJhbWVidWZmZXJPRVMgdW5zdXBwb3J0ZWQgcmV0dXJuIEpOSV9GQUxTRQ0KK2dsSXNSZW5kZXJidWZmZXJPRVMgdW5zdXBwb3J0ZWQgcmV0dXJuIEpOSV9GQUxTRQ0KK2dsTG9hZFBhbGV0dGVGcm9tTW9kZWxWaWV3TWF0cml4T0VTIHVuc3VwcG9ydGVkDQorZ2xNYXRyaXhJbmRleFBvaW50ZXJPRVMgdW5zdXBwb3J0ZWQNCitnbFJlbmRlcmJ1ZmZlclN0b3JhZ2VPRVMgdW5zdXBwb3J0ZWQgcmV0dXJuIGZhbHNlDQorZ2xUZXhHZW4gdW5zdXBwb3J0ZWQNCitnbFRleEdlbmYgdW5zdXBwb3J0ZWQNCitnbFRleEdlbmkgdW5zdXBwb3J0ZWQNCitnbFRleEdlbnggdW5zdXBwb3J0ZWQNCitnbFdlaWdodFBvaW50ZXJPRVMgdW5zdXBwb3J0ZWQNCmRpZmYgLS1naXQgYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3JjL0NGdW5jLmphdmEgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3JjL0NGdW5jLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc5NGY0MQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90b29scy9nbGdlbi9zcmMvQ0Z1bmMuamF2YQpAQCAtMCwwICsxLDE1NSBAQAorDQoraW1wb3J0IGphdmEudXRpbC4qOw0KKw0KK3B1YmxpYyBjbGFzcyBDRnVuYyB7DQorDQorICAgIFN0cmluZyBvcmlnaW5hbDsNCisNCisgICAgQ1R5cGUgZnR5cGU7DQorICAgIFN0cmluZyBmbmFtZTsNCisNCisgICAgTGlzdDxTdHJpbmc+IGFyZ05hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7DQorICAgIExpc3Q8Q1R5cGU+IGFyZ1R5cGVzID0gbmV3IEFycmF5TGlzdDxDVHlwZT4oKTsNCisNCisgICAgYm9vbGVhbiBoYXNQb2ludGVyQXJnID0gZmFsc2U7DQorICAgIGJvb2xlYW4gaGFzVHlwZWRQb2ludGVyQXJnID0gZmFsc2U7DQorDQorICAgIHB1YmxpYyBDRnVuYyhTdHJpbmcgb3JpZ2luYWwpIHsNCisgICAgICAgIHRoaXMub3JpZ2luYWwgPSBvcmlnaW5hbDsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgU3RyaW5nIGdldE9yaWdpbmFsKCkgew0KKyAgICAgICAgcmV0dXJuIG9yaWdpbmFsOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIGZuYW1lKSB7DQorICAgICAgICB0aGlzLmZuYW1lID0gZm5hbWU7DQorICAgIH0NCisNCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgew0KKyAgICAgICAgcmV0dXJuIGZuYW1lOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIHNldFR5cGUoQ1R5cGUgZnR5cGUpIHsNCisgICAgICAgIHRoaXMuZnR5cGUgPSBmdHlwZTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgQ1R5cGUgZ2V0VHlwZSgpIHsNCisgICAgICAgIHJldHVybiBmdHlwZTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCBhZGRBcmd1bWVudChTdHJpbmcgYXJnTmFtZSwgQ1R5cGUgYXJnVHlwZSkgew0KKyAgICAgICAgYXJnTmFtZXMuYWRkKGFyZ05hbWUpOw0KKyAgICAgICAgYXJnVHlwZXMuYWRkKGFyZ1R5cGUpOw0KKw0KKyAgICAgICAgaWYgKGFyZ1R5cGUuaXNQb2ludGVyKCkpIHsNCisgICAgICAgICAgICBoYXNQb2ludGVyQXJnID0gdHJ1ZTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChhcmdUeXBlLmlzVHlwZWRQb2ludGVyKCkpIHsNCisgICAgICAgICAgICBoYXNUeXBlZFBvaW50ZXJBcmcgPSB0cnVlOw0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIHB1YmxpYyBpbnQgZ2V0TnVtQXJncygpIHsNCisgICAgICAgIHJldHVybiBhcmdOYW1lcy5zaXplKCk7DQorICAgIH0NCisNCisgICAgcHVibGljIGludCBnZXRBcmdJbmRleChTdHJpbmcgbmFtZSkgew0KKyAgICAgICAgaW50IGxlbiA9IGFyZ05hbWVzLnNpemUoKTsNCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsNCisgICAgICAgICAgICBpZiAobmFtZS5lcXVhbHMoYXJnTmFtZXMuZ2V0KGkpKSkgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gaTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gLTE7DQorICAgIH0NCisNCisgICAgcHVibGljIFN0cmluZyBnZXRBcmdOYW1lKGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIGFyZ05hbWVzLmdldChpbmRleCk7DQorICAgIH0NCisNCisgICAgcHVibGljIENUeXBlIGdldEFyZ1R5cGUoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gYXJnVHlwZXMuZ2V0KGluZGV4KTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNQb2ludGVyQXJnKCkgew0KKyAgICAgICAgcmV0dXJuIGhhc1BvaW50ZXJBcmc7DQorICAgIH0NCisNCisgICAgcHVibGljIGJvb2xlYW4gaGFzVHlwZWRQb2ludGVyQXJnKCkgew0KKyAgICAgICAgcmV0dXJuIGhhc1R5cGVkUG9pbnRlckFyZzsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgew0KKyAgICAgICAgU3RyaW5nIHMgPSAgIkZ1bmN0aW9uICIgKyBmbmFtZSArICIgcmV0dXJucyAiICsgZnR5cGUgKyAiOiAiOw0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdOYW1lcy5zaXplKCk7IGkrKykgew0KKyAgICAgICAgICAgIGlmIChpID4gMCkgew0KKyAgICAgICAgICAgICAgICBzICs9ICIsICI7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHMgKz0gYXJnVHlwZXMuZ2V0KGkpICsgIiAiICsgYXJnTmFtZXMuZ2V0KGkpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHM7DQorICAgIH0NCisNCisgICAgcHVibGljIHN0YXRpYyBDRnVuYyBwYXJzZUNGdW5jKFN0cmluZyBzKSB7DQorICAgICAgICBDRnVuYyBjZnVuYyA9IG5ldyBDRnVuYyhzKTsNCisgICAgICAgIFN0cmluZ1tdIHRva2VucyA9IHMuc3BsaXQoIlxccyIpOw0KKw0KKyAgICAgICAgaW50IGkgPSAwOw0KKyAgICAgICAgQ1R5cGUgZnR5cGUgPSBuZXcgQ1R5cGUoKTsNCisgICAgICAgIFN0cmluZyBmdHlwZU5hbWUgPSB0b2tlbnNbaSsrXTsNCisgICAgICAgIGlmIChmdHlwZU5hbWUuZXF1YWxzKCJjb25zdCIpKSB7DQorICAgICAgICAgICAgZnR5cGUuc2V0SXNDb25zdCh0cnVlKTsNCisgICAgICAgICAgICBmdHlwZU5hbWUgPSB0b2tlbnNbaSsrXTsNCisgICAgICAgIH0NCisgICAgICAgIGZ0eXBlLnNldEJhc2VUeXBlKGZ0eXBlTmFtZSk7DQorDQorICAgICAgICBTdHJpbmcgZm5hbWUgPSB0b2tlbnNbaSsrXTsNCisgICAgICAgIGlmIChmbmFtZS5lcXVhbHMoIioiKSkgew0KKyAgICAgICAgICAgIGZ0eXBlLnNldElzUG9pbnRlcih0cnVlKTsNCisgICAgICAgICAgICBmbmFtZSA9IHRva2Vuc1tpKytdOw0KKyAgICAgICAgfQ0KKwkNCisgICAgICAgIGNmdW5jLnNldE5hbWUoZm5hbWUpOw0KKyAgICAgICAgY2Z1bmMuc2V0VHlwZShmdHlwZSk7DQorCQ0KKyAgICAgICAgd2hpbGUgKGkgPCB0b2tlbnMubGVuZ3RoKSB7DQorICAgICAgICAgICAgU3RyaW5nIHRvayA9IHRva2Vuc1tpKytdOw0KKwkgICAgDQorICAgICAgICAgICAgaWYgKHRvay5lcXVhbHMoIigiKSkgew0KKyAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKHRvay5lcXVhbHMoIikiKSkgew0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgQ1R5cGUgYXJnVHlwZSA9IG5ldyBDVHlwZSgpOw0KKwkgICAgDQorICAgICAgICAgICAgU3RyaW5nIGFyZ1R5cGVOYW1lID0gdG9rOw0KKyAgICAgICAgICAgIFN0cmluZyBhcmdOYW1lID0gIiI7DQorCSAgICANCisgICAgICAgICAgICBpZiAoYXJnVHlwZU5hbWUuZXF1YWxzKCJjb25zdCIpKSB7DQorICAgICAgICAgICAgICAgIGFyZ1R5cGUuc2V0SXNDb25zdCh0cnVlKTsNCisgICAgICAgICAgICAgICAgYXJnVHlwZU5hbWUgPSB0b2tlbnNbaSsrXTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgYXJnVHlwZS5zZXRCYXNlVHlwZShhcmdUeXBlTmFtZSk7DQorDQorICAgICAgICAgICAgaWYgKGFyZ1R5cGVOYW1lLmVxdWFscygidm9pZCIpKSB7DQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIH0NCisJICAgIA0KKyAgICAgICAgICAgIGFyZ05hbWUgPSB0b2tlbnNbaSsrXTsNCisgICAgICAgICAgICBpZiAoYXJnTmFtZS5zdGFydHNXaXRoKCIqIikpIHsNCisgICAgICAgICAgICAgICAgYXJnVHlwZS5zZXRJc1BvaW50ZXIodHJ1ZSk7DQorICAgICAgICAgICAgICAgIGFyZ05hbWUgPSBhcmdOYW1lLnN1YnN0cmluZygxLCBhcmdOYW1lLmxlbmd0aCgpKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKGFyZ05hbWUuZW5kc1dpdGgoIiwiKSkgew0KKyAgICAgICAgICAgICAgICBhcmdOYW1lID0gYXJnTmFtZS5zdWJzdHJpbmcoMCwgYXJnTmFtZS5sZW5ndGgoKSAtIDEpOw0KKyAgICAgICAgICAgIH0NCisJICAgIA0KKyAgICAgICAgICAgIGNmdW5jLmFkZEFyZ3VtZW50KGFyZ05hbWUsIGFyZ1R5cGUpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcmV0dXJuIGNmdW5jOw0KKyAgICB9DQorfQ0KZGlmZiAtLWdpdCBhL29wZW5nbC90b29scy9nbGdlbi9zcmMvQ1R5cGUuamF2YSBiL29wZW5nbC90b29scy9nbGdlbi9zcmMvQ1R5cGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzFlYzYyCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3NyYy9DVHlwZS5qYXZhCkBAIC0wLDAgKzEsODUgQEAKKw0KK3B1YmxpYyBjbGFzcyBDVHlwZSB7DQorDQorICAgIFN0cmluZyBiYXNlVHlwZTsNCisgICAgYm9vbGVhbiBpc0NvbnN0Ow0KKyAgICBib29sZWFuIGlzUG9pbnRlcjsNCisNCisgICAgcHVibGljIENUeXBlKCkgew0KKyAgICB9DQorDQorICAgIHB1YmxpYyBDVHlwZShTdHJpbmcgYmFzZVR5cGUpIHsNCisJc2V0QmFzZVR5cGUoYmFzZVR5cGUpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBDVHlwZShTdHJpbmcgYmFzZVR5cGUsIGJvb2xlYW4gaXNDb25zdCwgYm9vbGVhbiBpc1BvaW50ZXIpIHsNCisJc2V0QmFzZVR5cGUoYmFzZVR5cGUpOw0KKwlzZXRJc0NvbnN0KGlzQ29uc3QpOw0KKwlzZXRJc1BvaW50ZXIoaXNQb2ludGVyKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgU3RyaW5nIGdldERlY2xhcmF0aW9uKCkgew0KKwlyZXR1cm4gYmFzZVR5cGUgKyAoaXNQb2ludGVyID8gIiAqIiA6ICIiKTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHZvaWQgc2V0SXNDb25zdChib29sZWFuIGlzQ29uc3QpIHsNCisJdGhpcy5pc0NvbnN0ID0gaXNDb25zdDsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0NvbnN0KCkgew0KKwlyZXR1cm4gaXNDb25zdDsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCBzZXRJc1BvaW50ZXIoYm9vbGVhbiBpc1BvaW50ZXIpIHsNCisJdGhpcy5pc1BvaW50ZXIgPSBpc1BvaW50ZXI7DQorICAgIH0NCisNCisgICAgcHVibGljIGJvb2xlYW4gaXNQb2ludGVyKCkgew0KKwlyZXR1cm4gaXNQb2ludGVyOw0KKyAgICB9DQorDQorICAgIGJvb2xlYW4gaXNWb2lkKCkgew0KKwlTdHJpbmcgYmFzZVR5cGUgPSBnZXRCYXNlVHlwZSgpOw0KKwlyZXR1cm4gYmFzZVR5cGUuZXF1YWxzKCJHTHZvaWQiKSB8fA0KKwkgICAgYmFzZVR5cGUuZXF1YWxzKCJ2b2lkIik7DQorICAgIH0NCisNCisgICAgcHVibGljIGJvb2xlYW4gaXNUeXBlZFBvaW50ZXIoKSB7DQorCXJldHVybiBpc1BvaW50ZXIoKSAmJiAhaXNWb2lkKCk7DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgc2V0QmFzZVR5cGUoU3RyaW5nIGJhc2VUeXBlKSB7DQorCXRoaXMuYmFzZVR5cGUgPSBiYXNlVHlwZTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgU3RyaW5nIGdldEJhc2VUeXBlKCkgew0KKwlyZXR1cm4gYmFzZVR5cGU7DQorICAgIH0NCisNCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCisJU3RyaW5nIHMgPSAiIjsNCisJaWYgKGlzQ29uc3QoKSkgew0KKwkgICAgcyArPSAiY29uc3QgIjsNCisJfQ0KKwlzICs9IGJhc2VUeXBlOw0KKwlpZiAoaXNQb2ludGVyKCkpIHsNCisJICAgIHMgKz0gIioiOw0KKwl9DQorDQorCXJldHVybiBzOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7DQorCXJldHVybiBiYXNlVHlwZS5oYXNoQ29kZSgpIF4gKGlzUG9pbnRlciA/IDIgOiAwKSBeIChpc0NvbnN0ID8gMSA6IDApOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgbykgew0KKwlpZiAobyAhPSBudWxsICYmIG8gaW5zdGFuY2VvZiBDVHlwZSkgew0KKwkgICAgQ1R5cGUgYyA9IChDVHlwZSlvOw0KKwkgICAgcmV0dXJuIGJhc2VUeXBlLmVxdWFscyhjLmJhc2VUeXBlKSAmJg0KKwkJaXNQb2ludGVyKCkgPT0gYy5pc1BvaW50ZXIoKSAmJg0KKwkJaXNDb25zdCgpID09IGMuaXNDb25zdCgpOw0KKwl9DQorCXJldHVybiBmYWxzZTsNCisgICAgfQ0KK30NCmRpZmYgLS1naXQgYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3JjL0NvZGVFbWl0dGVyLmphdmEgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3JjL0NvZGVFbWl0dGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U5YjkwYQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90b29scy9nbGdlbi9zcmMvQ29kZUVtaXR0ZXIuamF2YQpAQCAtMCwwICsxLDggQEAKKw0KK3B1YmxpYyBpbnRlcmZhY2UgQ29kZUVtaXR0ZXIgew0KKw0KKyAgICB2b2lkIHNldFZlcnNpb24oaW50IHZlcnNpb24sIGJvb2xlYW4gZXh0LCBib29sZWFuIHBhY2spOw0KKyAgICB2b2lkIGVtaXRDb2RlKENGdW5jIGNmdW5jLCBTdHJpbmcgb3JpZ2luYWwpOw0KKyAgICB2b2lkIGFkZE5hdGl2ZVJlZ2lzdHJhdGlvbihTdHJpbmcgZm5hbWUpOw0KKyAgICB2b2lkIGVtaXROYXRpdmVSZWdpc3RyYXRpb24oKTsNCit9DQpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3NyYy9HZW5lcmF0ZUdMLmphdmEgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3JjL0dlbmVyYXRlR0wuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTdlZTZlCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3NyYy9HZW5lcmF0ZUdMLmphdmEKQEAgLTAsMCArMSwxNjQgQEAKKw0KK2ltcG9ydCBqYXZhLmlvLio7DQoraW1wb3J0IGphdmEudXRpbC4qOw0KKw0KK3B1YmxpYyBjbGFzcyBHZW5lcmF0ZUdMIHsNCisNCisgICAgc3RhdGljIHZvaWQgY29weShTdHJpbmcgZmlsZW5hbWUsIFByaW50U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCisgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIGJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKGZpbGVuYW1lKSk7DQorICAgICAgICBTdHJpbmcgczsNCisgICAgICAgIHdoaWxlICgocyA9IGJyLnJlYWRMaW5lKCkpICE9IG51bGwpIHsNCisgICAgICAgICAgICBvdXQucHJpbnRsbihzKTsNCisgICAgICAgIH0NCisgICAgfQ0KKw0KKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGVtaXQoaW50IHZlcnNpb24sIGJvb2xlYW4gZXh0LCBib29sZWFuIHBhY2ssDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlRW1pdHRlciBlbWl0dGVyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVmZmVyZWRSZWFkZXIgc3BlY1JlYWRlciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50U3RyZWFtIGdsU3RyZWFtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRTdHJlYW0gZ2xJbXBsU3RyZWFtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRTdHJlYW0gY1N0cmVhbSkgdGhyb3dzIEV4Y2VwdGlvbiB7DQorICAgICAgICBTdHJpbmcgcyA9IG51bGw7DQorICAgICAgICBpbnQgY291bnRlciA9IDA7DQorICAgICAgICB3aGlsZSAoKHMgPSBzcGVjUmVhZGVyLnJlYWRMaW5lKCkpICE9IG51bGwpIHsNCisgICAgICAgICAgICBpZiAocy50cmltKCkuc3RhcnRzV2l0aCgiLy8iKSkgew0KKyAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgQ0Z1bmMgY2Z1bmMgPSBDRnVuYy5wYXJzZUNGdW5jKHMpOw0KKw0KKyAgICAgICAgICAgIFN0cmluZyBmbmFtZSA9IGNmdW5jLmdldE5hbWUoKTsNCisgICAgICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZSgic3R1YnMvIiArIGZuYW1lICsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLmphdmEtMSIgKyB2ZXJzaW9uICsgIi1pZiIpOw0KKyAgICAgICAgICAgIGlmIChmLmV4aXN0cygpKSB7DQorICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU3BlY2lhbC1jYXNpbmcgZnVuY3Rpb24gIiArIGZuYW1lKTsNCisgICAgICAgICAgICAgICAgY29weSgic3R1YnMvIiArIGZuYW1lICsNCisgICAgICAgICAgICAgICAgICAgICAiLmphdmEtMSIgKyB2ZXJzaW9uICsgIi1pZiIsIGdsU3RyZWFtKTsNCisgICAgICAgICAgICAgICAgY29weSgic3R1YnMvIiArIGZuYW1lICsgIi5qYXZhLWltcGwiLCBnbEltcGxTdHJlYW0pOw0KKyAgICAgICAgICAgICAgICBjb3B5KCJzdHVicy8iICsgZm5hbWUgKyAiLmNwcCIsIGNTdHJlYW0pOw0KKw0KKyAgICAgICAgICAgICAgICAvLyBSZWdpc3RlciBuYXRpdmUgZnVuY3Rpb24gbmFtZXMNCisgICAgICAgICAgICAgICAgLy8gVGhpcyBzaG91bGQgYmUgaW1wcm92ZWQgdG8gcmVxdWlyZSBmZXdlciBkaXNjcmV0ZSBmaWxlcw0KKyAgICAgICAgICAgICAgICBTdHJpbmcgZmlsZW5hbWUgPSAic3R1YnMvIiArIGZuYW1lICsgIi5uYXRpdmVSZWciOw0KKyAgICAgICAgICAgICAgICBCdWZmZXJlZFJlYWRlciBiciA9DQorICAgICAgICAgICAgICAgICAgICBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIoZmlsZW5hbWUpKTsNCisgICAgICAgICAgICAgICAgU3RyaW5nIG5mdW5jOw0KKyAgICAgICAgICAgICAgICB3aGlsZSAoKG5mdW5jID0gYnIucmVhZExpbmUoKSkgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgICAgZW1pdHRlci5hZGROYXRpdmVSZWdpc3RyYXRpb24obmZ1bmMpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgZW1pdHRlci5zZXRWZXJzaW9uKHZlcnNpb24sIGV4dCwgcGFjayk7DQorICAgICAgICAgICAgICAgIGVtaXR0ZXIuZW1pdENvZGUoY2Z1bmMsIHMpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsNCisgICAgICAgIFN0cmluZyBjbGFzc1BhdGhOYW1lID0gImNvbS9nb29nbGUvYW5kcm9pZC9nbGVzX2puaS9HTEltcGwiOw0KKyAgICAgICAgYm9vbGVhbiB1c2VDb250ZXh0UG9pbnRlciA9IHRydWU7DQorDQorICAgICAgICBpbnQgYWlkeCA9IDA7DQorICAgICAgICB3aGlsZSAoYXJnc1thaWR4XS5jaGFyQXQoMCkgPT0gJy0nKSB7DQorICAgICAgICAgICAgc3dpdGNoIChhcmdzW2FpZHhdLmNoYXJBdCgxKSkgew0KKyAgICAgICAgICAgIGNhc2UgJ2MnOg0KKyAgICAgICAgICAgICAgICB1c2VDb250ZXh0UG9pbnRlciA9IGZhbHNlOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisNCisgICAgICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIlVua25vd24gZmxhZzogIiArIGFyZ3NbYWlkeF0pOw0KKyAgICAgICAgICAgICAgICBTeXN0ZW0uZXhpdCgxKTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgYWlkeCsrOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJ1c2VDb250ZXh0UG9pbnRlciA9ICIgKyB1c2VDb250ZXh0UG9pbnRlcik7DQorDQorICAgICAgICBCdWZmZXJlZFJlYWRlciBzcGVjMTBSZWFkZXIgPQ0KKyAgICAgICAgICAgIG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcihhcmdzW2FpZHgrK10pKTsNCisgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIHNwZWMxMEV4dFJlYWRlciA9DQorICAgICAgICAgICAgbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKGFyZ3NbYWlkeCsrXSkpOw0KKyAgICAgICAgQnVmZmVyZWRSZWFkZXIgc3BlYzExUmVhZGVyID0NCisgICAgICAgICAgICBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIoYXJnc1thaWR4KytdKSk7DQorICAgICAgICBCdWZmZXJlZFJlYWRlciBzcGVjMTFFeHRSZWFkZXIgPQ0KKyAgICAgICAgICAgIG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcihhcmdzW2FpZHgrK10pKTsNCisgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIHNwZWMxMUV4dFBhY2tSZWFkZXIgPQ0KKyAgICAgICAgICAgIG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcihhcmdzW2FpZHgrK10pKTsNCisgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIGNoZWNrc1JlYWRlciA9DQorICAgICAgICAgICAgbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKGFyZ3NbYWlkeCsrXSkpOw0KKw0KKyAgICAgICAgU3RyaW5nIGdsMTBGaWxlbmFtZSA9ICJqYXZheC9taWNyb2VkaXRpb24va2hyb25vcy9vcGVuZ2xlcy9HTDEwLmphdmEiOw0KKyAgICAgICAgU3RyaW5nIGdsMTBFeHRGaWxlbmFtZSA9DQorICAgICAgICAgICAgImphdmF4L21pY3JvZWRpdGlvbi9raHJvbm9zL29wZW5nbGVzL0dMMTBFeHQuamF2YSI7DQorICAgICAgICBTdHJpbmcgZ2wxMUZpbGVuYW1lID0gImphdmF4L21pY3JvZWRpdGlvbi9raHJvbm9zL29wZW5nbGVzL0dMMTEuamF2YSI7DQorICAgICAgICBTdHJpbmcgZ2wxMUV4dEZpbGVuYW1lID0NCisgICAgICAgICAgICAiamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3Mvb3BlbmdsZXMvR0wxMUV4dC5qYXZhIjsNCisgICAgICAgIFN0cmluZyBnbDExRXh0UGFja0ZpbGVuYW1lID0NCisgICAgICAgICAgICAiamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3Mvb3BlbmdsZXMvR0wxMUV4dGVuc2lvblBhY2suamF2YSI7DQorICAgICAgICBTdHJpbmcgZ2xJbXBsRmlsZW5hbWUgPSAiY29tL2dvb2dsZS9hbmRyb2lkL2dsZXNfam5pL0dMSW1wbC5qYXZhIjsNCisgICAgICAgIFN0cmluZyBjRmlsZW5hbWUgPSAiY29tX2dvb2dsZV9hbmRyb2lkX2dsZXNfam5pX0dMSW1wbC5jcHAiOw0KKw0KKyAgICAgICAgUHJpbnRTdHJlYW0gZ2wxMFN0cmVhbSA9DQorICAgICAgICAgICAgbmV3IFByaW50U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKCJvdXQvIiArIGdsMTBGaWxlbmFtZSkpOw0KKyAgICAgICAgUHJpbnRTdHJlYW0gZ2wxMEV4dFN0cmVhbSA9DQorICAgICAgICAgICAgbmV3IFByaW50U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKCJvdXQvIiArIGdsMTBFeHRGaWxlbmFtZSkpOw0KKyAgICAgICAgUHJpbnRTdHJlYW0gZ2wxMVN0cmVhbSA9DQorICAgICAgICAgICAgbmV3IFByaW50U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKCJvdXQvIiArIGdsMTFGaWxlbmFtZSkpOw0KKyAgICAgICAgUHJpbnRTdHJlYW0gZ2wxMUV4dFN0cmVhbSA9DQorICAgICAgICAgICAgbmV3IFByaW50U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKCJvdXQvIiArIGdsMTFFeHRGaWxlbmFtZSkpOw0KKyAgICAgICAgUHJpbnRTdHJlYW0gZ2wxMUV4dFBhY2tTdHJlYW0gPQ0KKyAgICAgICAgICAgIG5ldyBQcmludFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbSgib3V0LyIgKyBnbDExRXh0UGFja0ZpbGVuYW1lKSk7DQorICAgICAgICBQcmludFN0cmVhbSBnbEltcGxTdHJlYW0gPQ0KKyAgICAgICAgICAgIG5ldyBQcmludFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbSgib3V0LyIgKyBnbEltcGxGaWxlbmFtZSkpOw0KKyAgICAgICAgUHJpbnRTdHJlYW0gY1N0cmVhbSA9DQorICAgICAgICAgICAgbmV3IFByaW50U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKCJvdXQvIiArIGNGaWxlbmFtZSkpOw0KKw0KKyAgICAgICAgUGFyYW1ldGVyQ2hlY2tlciBjaGVja2VyID0gbmV3IFBhcmFtZXRlckNoZWNrZXIoY2hlY2tzUmVhZGVyKTsNCisNCisgICAgICAgIENvZGVFbWl0dGVyIGVtaXR0ZXIgPQ0KKyAgICAgICAgICAgIG5ldyBKbmlDb2RlRW1pdHRlcihjbGFzc1BhdGhOYW1lLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja2VyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbDEwU3RyZWFtLCBnbDEwRXh0U3RyZWFtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbDExU3RyZWFtLCBnbDExRXh0U3RyZWFtLCBnbDExRXh0UGFja1N0cmVhbSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xJbXBsU3RyZWFtLCBjU3RyZWFtLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VDb250ZXh0UG9pbnRlcik7DQorDQorICAgICAgICBnbDEwU3RyZWFtLnByaW50bG4oIi8qIC8vZGV2aWNlL2phdmEvYW5kcm9pZC8iICsgZ2wxMEZpbGVuYW1lKTsNCisgICAgICAgIGdsMTBFeHRTdHJlYW0ucHJpbnRsbigiLyogLy9kZXZpY2UvamF2YS9hbmRyb2lkLyIgKyBnbDEwRXh0RmlsZW5hbWUpOw0KKyAgICAgICAgZ2wxMVN0cmVhbS5wcmludGxuKCIvKiAvL2RldmljZS9qYXZhL2FuZHJvaWQvIiArIGdsMTFGaWxlbmFtZSk7DQorICAgICAgICBnbDExRXh0U3RyZWFtLnByaW50bG4oIi8qIC8vZGV2aWNlL2phdmEvYW5kcm9pZC8iICsgZ2wxMUV4dEZpbGVuYW1lKTsNCisgICAgICAgIGdsMTFFeHRQYWNrU3RyZWFtLnByaW50bG4oIi8qIC8vZGV2aWNlL2phdmEvYW5kcm9pZC8iICsNCisgICAgICAgICAgICBnbDExRXh0UGFja0ZpbGVuYW1lKTsNCisgICAgICAgIGdsSW1wbFN0cmVhbS5wcmludGxuKCIvKiAvL2RldmljZS9qYXZhL2FuZHJvaWQvIiArIGdsSW1wbEZpbGVuYW1lKTsNCisgICAgICAgIGNTdHJlYW0ucHJpbnRsbigiLyogLy9kZXZpY2UvbGlicy9hbmRyb2lkX3J1bnRpbWUvIiArIGNGaWxlbmFtZSk7DQorDQorICAgICAgICBjb3B5KCJzdHVicy9HTDEwSGVhZGVyLmphdmEtaWYiLCBnbDEwU3RyZWFtKTsNCisgICAgICAgIGNvcHkoInN0dWJzL0dMMTBFeHRIZWFkZXIuamF2YS1pZiIsIGdsMTBFeHRTdHJlYW0pOw0KKyAgICAgICAgY29weSgic3R1YnMvR0wxMUhlYWRlci5qYXZhLWlmIiwgZ2wxMVN0cmVhbSk7DQorICAgICAgICBjb3B5KCJzdHVicy9HTDExRXh0SGVhZGVyLmphdmEtaWYiLCBnbDExRXh0U3RyZWFtKTsNCisgICAgICAgIGNvcHkoInN0dWJzL0dMMTFFeHRlbnNpb25QYWNrSGVhZGVyLmphdmEtaWYiLCBnbDExRXh0UGFja1N0cmVhbSk7DQorICAgICAgICBjb3B5KCJzdHVicy9HTEltcGxIZWFkZXIuamF2YS1pbXBsIiwgZ2xJbXBsU3RyZWFtKTsNCisgICAgICAgIGNvcHkoInN0dWJzL0dMQ0hlYWRlci5jcHAiLCBjU3RyZWFtKTsNCisNCisgICAgICAgIGVtaXQoMCwgZmFsc2UsIGZhbHNlLA0KKyAgICAgICAgICAgICBlbWl0dGVyLCBzcGVjMTBSZWFkZXIsIGdsMTBTdHJlYW0sIGdsSW1wbFN0cmVhbSwgY1N0cmVhbSk7DQorICAgICAgICBlbWl0KDAsIHRydWUsIGZhbHNlLA0KKyAgICAgICAgICAgICBlbWl0dGVyLCBzcGVjMTBFeHRSZWFkZXIsIGdsMTBFeHRTdHJlYW0sIGdsSW1wbFN0cmVhbSwgY1N0cmVhbSk7DQorICAgICAgICBlbWl0KDEsIGZhbHNlLCBmYWxzZSwNCisgICAgICAgICAgICAgZW1pdHRlciwgc3BlYzExUmVhZGVyLCBnbDExU3RyZWFtLCBnbEltcGxTdHJlYW0sIGNTdHJlYW0pOw0KKyAgICAgICAgZW1pdCgxLCB0cnVlLCBmYWxzZSwNCisgICAgICAgICAgICAgZW1pdHRlciwgc3BlYzExRXh0UmVhZGVyLCBnbDExRXh0U3RyZWFtLCBnbEltcGxTdHJlYW0sIGNTdHJlYW0pOw0KKyAgICAgICAgZW1pdCgxLCB0cnVlLCB0cnVlLA0KKyAgICAgICAgICAgICBlbWl0dGVyLCBzcGVjMTFFeHRQYWNrUmVhZGVyLCBnbDExRXh0UGFja1N0cmVhbSwgZ2xJbXBsU3RyZWFtLA0KKyAgICAgICAgICAgICBjU3RyZWFtKTsNCisNCisgICAgICAgIGVtaXR0ZXIuZW1pdE5hdGl2ZVJlZ2lzdHJhdGlvbigpOw0KKw0KKyAgICAgICAgZ2wxMFN0cmVhbS5wcmludGxuKCJ9Iik7DQorICAgICAgICBnbDEwRXh0U3RyZWFtLnByaW50bG4oIn0iKTsNCisgICAgICAgIGdsMTFTdHJlYW0ucHJpbnRsbigifSIpOw0KKyAgICAgICAgZ2wxMUV4dFN0cmVhbS5wcmludGxuKCJ9Iik7DQorICAgICAgICBnbDExRXh0UGFja1N0cmVhbS5wcmludGxuKCJ9Iik7DQorICAgICAgICBnbEltcGxTdHJlYW0ucHJpbnRsbigifSIpOw0KKyAgICB9DQorfQ0KZGlmZiAtLWdpdCBhL29wZW5nbC90b29scy9nbGdlbi9zcmMvSkZ1bmMuamF2YSBiL29wZW5nbC90b29scy9nbGdlbi9zcmMvSkZ1bmMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmQ0NjZjCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3NyYy9KRnVuYy5qYXZhCkBAIC0wLDAgKzEsMTQ4IEBACisNCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQorDQorcHVibGljIGNsYXNzIEpGdW5jIHsNCisNCisgICAgU3RyaW5nIGNsYXNzTmFtZSA9ICJjb20uZ29vZ2xlLmFuZHJvaWQuZ2xlc19qbmkuR0wxMUltcGwiOw0KKw0KKyAgICBDRnVuYyBjZnVuYzsNCisgICAgSlR5cGUgZnR5cGU7DQorICAgIFN0cmluZyBmbmFtZTsNCisNCisgICAgTGlzdDxTdHJpbmc+IGFyZ05hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7DQorICAgIExpc3Q8SlR5cGU+IGFyZ1R5cGVzID0gbmV3IEFycmF5TGlzdDxKVHlwZT4oKTsNCisgICAgTGlzdDxJbnRlZ2VyPiBhcmdDSW5kaWNlcyA9IG5ldyBBcnJheUxpc3Q8SW50ZWdlcj4oKTsNCisNCisgICAgYm9vbGVhbiBoYXNCdWZmZXJBcmcgPSBmYWxzZTsNCisgICAgYm9vbGVhbiBoYXNUeXBlZEJ1ZmZlckFyZyA9IGZhbHNlOw0KKyAgICBBcnJheUxpc3Q8U3RyaW5nPiBidWZmZXJBcmdOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KKw0KKyAgICBwdWJsaWMgSkZ1bmMoQ0Z1bmMgY2Z1bmMpIHsNCisgICAgICAgIHRoaXMuY2Z1bmMgPSBjZnVuYzsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgQ0Z1bmMgZ2V0Q0Z1bmMoKSB7DQorICAgICAgICByZXR1cm4gY2Z1bmM7DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgZm5hbWUpIHsNCisgICAgICAgIHRoaXMuZm5hbWUgPSBmbmFtZTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7DQorICAgICAgICByZXR1cm4gZm5hbWU7DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgc2V0VHlwZShKVHlwZSBmdHlwZSkgew0KKyAgICAgICAgdGhpcy5mdHlwZSA9IGZ0eXBlOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBKVHlwZSBnZXRUeXBlKCkgew0KKyAgICAgICAgcmV0dXJuIGZ0eXBlOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIHNldENsYXNzTmFtZShTdHJpbmcgY2xhc3NOYW1lKSB7DQorICAgICAgICB0aGlzLmNsYXNzTmFtZSA9IGNsYXNzTmFtZTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsNCisgICAgICAgIHJldHVybiBjbGFzc05hbWU7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBib29sZWFuIGhhc0J1ZmZlckFyZygpIHsNCisgICAgICAgIHJldHVybiBoYXNCdWZmZXJBcmc7DQorICAgIH0NCisNCisgICAgcHVibGljIGJvb2xlYW4gaGFzVHlwZWRCdWZmZXJBcmcoKSB7DQorICAgICAgICByZXR1cm4gaGFzVHlwZWRCdWZmZXJBcmc7DQorICAgIH0NCisNCisgICAgcHVibGljIFN0cmluZyBnZXRCdWZmZXJBcmdOYW1lKGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIGJ1ZmZlckFyZ05hbWVzLmdldChpbmRleCk7DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgYWRkQXJndW1lbnQoU3RyaW5nIGFyZ05hbWUsIEpUeXBlIGFyZ1R5cGUsIGludCBjaW5kZXgpIHsNCisgICAgICAgIGFyZ05hbWVzLmFkZChhcmdOYW1lKTsNCisgICAgICAgIGFyZ1R5cGVzLmFkZChhcmdUeXBlKTsNCisgICAgICAgIGFyZ0NJbmRpY2VzLmFkZChuZXcgSW50ZWdlcihjaW5kZXgpKTsNCisNCisgICAgICAgIGlmIChhcmdUeXBlLmlzQnVmZmVyKCkpIHsNCisgICAgICAgICAgICBoYXNCdWZmZXJBcmcgPSB0cnVlOw0KKyAgICAgICAgICAgIGJ1ZmZlckFyZ05hbWVzLmFkZChhcmdOYW1lKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChhcmdUeXBlLmlzVHlwZWRCdWZmZXIoKSkgew0KKyAgICAgICAgICAgIGhhc1R5cGVkQnVmZmVyQXJnID0gdHJ1ZTsNCisgICAgICAgICAgICBidWZmZXJBcmdOYW1lcy5hZGQoYXJnTmFtZSk7DQorICAgICAgICB9DQorICAgIH0NCisNCisgICAgcHVibGljIGludCBnZXROdW1BcmdzKCkgew0KKyAgICAgICAgcmV0dXJuIGFyZ05hbWVzLnNpemUoKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgaW50IGdldEFyZ0luZGV4KFN0cmluZyBuYW1lKSB7DQorICAgICAgICBpbnQgbGVuID0gYXJnTmFtZXMuc2l6ZSgpOw0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgew0KKyAgICAgICAgICAgIGlmIChuYW1lLmVxdWFscyhhcmdOYW1lcy5nZXQoaSkpKSB7DQorICAgICAgICAgICAgICAgIHJldHVybiBpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiAtMTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgU3RyaW5nIGdldEFyZ05hbWUoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gYXJnTmFtZXMuZ2V0KGluZGV4KTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgSlR5cGUgZ2V0QXJnVHlwZShpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiBhcmdUeXBlcy5nZXQoaW5kZXgpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBpbnQgZ2V0QXJnQ0luZGV4KGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIGFyZ0NJbmRpY2VzLmdldChpbmRleCkuaW50VmFsdWUoKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgc3RhdGljIEpGdW5jIGNvbnZlcnQoQ0Z1bmMgY2Z1bmMsIGJvb2xlYW4gdXNlQXJyYXkpIHsNCisgICAgICAgIEpGdW5jIGpmdW5jID0gbmV3IEpGdW5jKGNmdW5jKTsNCisgICAgICAgIGpmdW5jLnNldE5hbWUoY2Z1bmMuZ2V0TmFtZSgpKTsNCisgICAgICAgIGpmdW5jLnNldFR5cGUoSlR5cGUuY29udmVydChjZnVuYy5nZXRUeXBlKCksIGZhbHNlKSk7DQorCQ0KKyAgICAgICAgaW50IG51bUFyZ3MgPSBjZnVuYy5nZXROdW1BcmdzKCk7DQorICAgICAgICBpbnQgbnVtT2Zmc2V0cyA9IDA7DQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUFyZ3M7IGkrKykgew0KKyAgICAgICAgICAgIENUeXBlIGNBcmdUeXBlID0gY2Z1bmMuZ2V0QXJnVHlwZShpKTsNCisgICAgICAgICAgICBpZiAoY0FyZ1R5cGUuaXNUeXBlZFBvaW50ZXIoKSAmJiB1c2VBcnJheSkgew0KKyAgICAgICAgICAgICAgICArK251bU9mZnNldHM7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1BcmdzOyBpKyspIHsNCisgICAgICAgICAgICBTdHJpbmcgY0FyZ05hbWUgPSBjZnVuYy5nZXRBcmdOYW1lKGkpOw0KKyAgICAgICAgICAgIENUeXBlIGNBcmdUeXBlID0gY2Z1bmMuZ2V0QXJnVHlwZShpKTsNCisNCisgICAgICAgICAgICBqZnVuYy5hZGRBcmd1bWVudChjQXJnTmFtZSwgSlR5cGUuY29udmVydChjQXJnVHlwZSwgdXNlQXJyYXkpLCBpKTsNCisgICAgICAgICAgICBpZiAoY0FyZ1R5cGUuaXNUeXBlZFBvaW50ZXIoKSAmJiB1c2VBcnJheSkgew0KKyAgICAgICAgICAgICAgICBpZiAobnVtT2Zmc2V0cyA+IDEpIHsNCisgICAgICAgICAgICAgICAgICAgIGpmdW5jLmFkZEFyZ3VtZW50KGNBcmdOYW1lICsgIk9mZnNldCIsIG5ldyBKVHlwZSgiaW50IiksIGkpOw0KKyAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgamZ1bmMuYWRkQXJndW1lbnQoIm9mZnNldCIsIG5ldyBKVHlwZSgiaW50IiksIGkpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcmV0dXJuIGpmdW5jOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7DQorICAgICAgICBTdHJpbmcgcyA9ICAiRnVuY3Rpb24gIiArIGZuYW1lICsgIiByZXR1cm5zICIgKyBmdHlwZSArICI6ICI7DQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ05hbWVzLnNpemUoKTsgaSsrKSB7DQorICAgICAgICAgICAgaWYgKGkgPiAwKSB7DQorICAgICAgICAgICAgICAgIHMgKz0gIiwgIjsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcyArPSBhcmdUeXBlcy5nZXQoaSkgKyAiICIgKyBhcmdOYW1lcy5nZXQoaSk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gczsNCisgICAgfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3JjL0pUeXBlLmphdmEgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3JjL0pUeXBlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE2ZDQ0MAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90b29scy9nbGdlbi9zcmMvSlR5cGUuamF2YQpAQCAtMCwwICsxLDEzOSBAQAorDQoraW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KKw0KK3B1YmxpYyBjbGFzcyBKVHlwZSB7DQorICAgIA0KKyAgICBTdHJpbmcgYmFzZVR5cGU7DQorICAgIGJvb2xlYW4gaXNBcnJheTsNCisgICAgYm9vbGVhbiBpc0NsYXNzOw0KKw0KKyAgICBzdGF0aWMgSGFzaE1hcDxDVHlwZSxKVHlwZT4gdHlwZU1hcHBpbmcgPSBuZXcgSGFzaE1hcDxDVHlwZSxKVHlwZT4oKTsNCisgICAgc3RhdGljIEhhc2hNYXA8Q1R5cGUsSlR5cGU+IGFycmF5VHlwZU1hcHBpbmcgPSBuZXcgSGFzaE1hcDxDVHlwZSxKVHlwZT4oKTsNCisNCisgICAgc3RhdGljIHsNCisJLy8gUHJpbWl0aXZlIHR5cGVzDQorCXR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoIkdMYml0ZmllbGQiKSwgbmV3IEpUeXBlKCJpbnQiKSk7DQorCXR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoIkdMYm9vbGVhbiIpLCBuZXcgSlR5cGUoImJvb2xlYW4iKSk7DQorCXR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoIkdMY2xhbXBmIiksIG5ldyBKVHlwZSgiZmxvYXQiKSk7DQorCXR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoIkdMY2xhbXB4IiksIG5ldyBKVHlwZSgiaW50IikpOw0KKwl0eXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJHTGVudW0iKSwgbmV3IEpUeXBlKCJpbnQiKSk7DQorCXR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoIkdMZmxvYXQiKSwgbmV3IEpUeXBlKCJmbG9hdCIpKTsNCisJdHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiR0xmaXhlZCIpLCBuZXcgSlR5cGUoImludCIpKTsNCisJdHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiR0xpbnQiKSwgbmV3IEpUeXBlKCJpbnQiKSk7DQorCXR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoIkdMaW50cHRyIiksIG5ldyBKVHlwZSgiaW50IikpOw0KKwl0eXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJHTHNob3J0IiksIG5ldyBKVHlwZSgic2hvcnQiKSk7DQorCXR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoIkdMc2l6ZWkiKSwgbmV3IEpUeXBlKCJpbnQiKSk7DQorCXR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoIkdMc2l6ZWlwdHIiKSwgbmV3IEpUeXBlKCJpbnQiKSk7DQorCXR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoIkdMdWJ5dGUiKSwgbmV3IEpUeXBlKCJieXRlIikpOw0KKwl0eXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJHTHVpbnQiKSwgbmV3IEpUeXBlKCJpbnQiKSk7DQorCXR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoInZvaWQiKSwgbmV3IEpUeXBlKCJ2b2lkIikpOw0KKwl0eXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJHTHVieXRlIiwgdHJ1ZSwgdHJ1ZSksIG5ldyBKVHlwZSgiU3RyaW5nIikpOw0KKw0KKwkvLyBVbnR5cGVkIHBvaW50ZXJzIG1hcCB0byB1bnR5cGVkIEJ1ZmZlcnMNCisJdHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiR0x2b2lkIiwgdHJ1ZSwgdHJ1ZSksDQorCQkJbmV3IEpUeXBlKCJqYXZhLm5pby5CdWZmZXIiLCB0cnVlLCBmYWxzZSkpOw0KKwl0eXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJHTHZvaWQiLCBmYWxzZSwgdHJ1ZSksDQorCQkJbmV3IEpUeXBlKCJqYXZhLm5pby5CdWZmZXIiLCB0cnVlLCBmYWxzZSkpOw0KKwl0eXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJ2b2lkIiwgZmFsc2UsIHRydWUpLA0KKwkJCW5ldyBKVHlwZSgiamF2YS5uaW8uQnVmZmVyIiwgdHJ1ZSwgZmFsc2UpKTsNCisNCisJLy8gVHlwZWQgcG9pbnRlcnMgbWFwIHRvIHR5cGVkIEJ1ZmZlcnMNCisJdHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiR0xib29sZWFuIiwgZmFsc2UsIHRydWUpLA0KKwkJCW5ldyBKVHlwZSgiamF2YS5uaW8uSW50QnVmZmVyIiwgdHJ1ZSwgZmFsc2UpKTsNCisJdHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiR0xmaXhlZCIsIGZhbHNlLCB0cnVlKSwNCisJCQluZXcgSlR5cGUoImphdmEubmlvLkludEJ1ZmZlciIsIHRydWUsIGZhbHNlKSk7DQorCXR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoIkdMZml4ZWQiLCB0cnVlLCB0cnVlKSwNCisJCQluZXcgSlR5cGUoImphdmEubmlvLkludEJ1ZmZlciIsIHRydWUsIGZhbHNlKSk7DQorCXR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoIkdMZmxvYXQiLCBmYWxzZSwgdHJ1ZSksDQorCQkJbmV3IEpUeXBlKCJqYXZhLm5pby5GbG9hdEJ1ZmZlciIsIHRydWUsIGZhbHNlKSk7DQorCXR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoIkdMZmxvYXQiLCB0cnVlLCB0cnVlKSwNCisJCQluZXcgSlR5cGUoImphdmEubmlvLkZsb2F0QnVmZmVyIiwgdHJ1ZSwgZmFsc2UpKTsNCisJdHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiR0xpbnQiLCBmYWxzZSwgdHJ1ZSksDQorCQkJbmV3IEpUeXBlKCJqYXZhLm5pby5JbnRCdWZmZXIiLCB0cnVlLCBmYWxzZSkpOw0KKwl0eXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJHTGludCIsIHRydWUsIHRydWUpLA0KKwkJCW5ldyBKVHlwZSgiamF2YS5uaW8uSW50QnVmZmVyIiwgdHJ1ZSwgZmFsc2UpKTsNCisJdHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiR0x1aW50IiwgZmFsc2UsIHRydWUpLA0KKwkJCW5ldyBKVHlwZSgiamF2YS5uaW8uSW50QnVmZmVyIiwgdHJ1ZSwgZmFsc2UpKTsNCisJdHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiR0x1aW50IiwgdHJ1ZSwgdHJ1ZSksDQorCQkJbmV3IEpUeXBlKCJqYXZhLm5pby5JbnRCdWZmZXIiLCB0cnVlLCBmYWxzZSkpOw0KKwl0eXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJHTHNob3J0IiwgdHJ1ZSwgdHJ1ZSksDQorCQkJbmV3IEpUeXBlKCJqYXZhLm5pby5TaG9ydEJ1ZmZlciIsIHRydWUsIGZhbHNlKSk7DQorDQorCS8vIFR5cGVkIHBvaW50ZXJzIG1hcCB0byBhcnJheXMgKyBvZmZzZXRzDQorCWFycmF5VHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiR0xib29sZWFuIiwgZmFsc2UsIHRydWUpLA0KKwkJCSAgICAgbmV3IEpUeXBlKCJib29sZWFuIiwgZmFsc2UsIHRydWUpKTsNCisJYXJyYXlUeXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJHTGZpeGVkIiwgdHJ1ZSwgdHJ1ZSksIG5ldyBKVHlwZSgiaW50IiwgZmFsc2UsIHRydWUpKTsNCisJYXJyYXlUeXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJHTGZpeGVkIiwgZmFsc2UsIHRydWUpLCBuZXcgSlR5cGUoImludCIsIGZhbHNlLCB0cnVlKSk7DQorCWFycmF5VHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiR0xmbG9hdCIsIGZhbHNlLCB0cnVlKSwgbmV3IEpUeXBlKCJmbG9hdCIsIGZhbHNlLCB0cnVlKSk7DQorCWFycmF5VHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiR0xmbG9hdCIsIHRydWUsIHRydWUpLCBuZXcgSlR5cGUoImZsb2F0IiwgZmFsc2UsIHRydWUpKTsNCisJYXJyYXlUeXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJHTGludCIsIGZhbHNlLCB0cnVlKSwgbmV3IEpUeXBlKCJpbnQiLCBmYWxzZSwgdHJ1ZSkpOw0KKwlhcnJheVR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoIkdMaW50IiwgdHJ1ZSwgdHJ1ZSksIG5ldyBKVHlwZSgiaW50IiwgZmFsc2UsIHRydWUpKTsNCisJYXJyYXlUeXBlTWFwcGluZy5wdXQobmV3IENUeXBlKCJHTHNob3J0IiwgdHJ1ZSwgdHJ1ZSksIG5ldyBKVHlwZSgic2hvcnQiLCBmYWxzZSwgdHJ1ZSkpOw0KKwlhcnJheVR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoIkdMdWludCIsIGZhbHNlLCB0cnVlKSwgbmV3IEpUeXBlKCJpbnQiLCBmYWxzZSwgdHJ1ZSkpOw0KKwlhcnJheVR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoIkdMdWludCIsIHRydWUsIHRydWUpLCBuZXcgSlR5cGUoImludCIsIGZhbHNlLCB0cnVlKSk7DQorCWFycmF5VHlwZU1hcHBpbmcucHV0KG5ldyBDVHlwZSgiR0xpbnRwdHIiKSwgbmV3IEpUeXBlKCJpbnQiLCBmYWxzZSwgdHJ1ZSkpOw0KKwlhcnJheVR5cGVNYXBwaW5nLnB1dChuZXcgQ1R5cGUoIkdMc2l6ZWlwdHIiKSwgbmV3IEpUeXBlKCJpbnQiLCBmYWxzZSwgdHJ1ZSkpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBKVHlwZSgpIHsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgSlR5cGUoU3RyaW5nIHByaW1pdGl2ZVR5cGVOYW1lKSB7DQorCXRoaXMuYmFzZVR5cGUgPSBwcmltaXRpdmVUeXBlTmFtZTsNCisJdGhpcy5pc0NsYXNzID0gZmFsc2U7DQorCXRoaXMuaXNBcnJheSA9IGZhbHNlOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBKVHlwZShTdHJpbmcgcHJpbWl0aXZlVHlwZU5hbWUsIGJvb2xlYW4gaXNDbGFzcywgYm9vbGVhbiBpc0FycmF5KSB7DQorCXRoaXMuYmFzZVR5cGUgPSBwcmltaXRpdmVUeXBlTmFtZTsNCisJdGhpcy5pc0NsYXNzID0gaXNDbGFzczsNCisJdGhpcy5pc0FycmF5ID0gaXNBcnJheTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgU3RyaW5nIGdldEJhc2VUeXBlKCkgew0KKwlyZXR1cm4gYmFzZVR5cGU7DQorICAgIH0NCisNCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCisJcmV0dXJuIGJhc2VUeXBlICsgKGlzQXJyYXkgPyAiW10iIDogIiIpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBib29sZWFuIGlzQXJyYXkoKSB7DQorCXJldHVybiBpc0FycmF5Ow0KKyAgICB9DQorDQorICAgIHB1YmxpYyBib29sZWFuIGlzQ2xhc3MoKSB7DQorCXJldHVybiBpc0NsYXNzOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBib29sZWFuIGlzUHJpbWl0aXZlKCkgew0KKwlyZXR1cm4gIWlzQ2xhc3MoKSAmJiAhaXNBcnJheSgpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBib29sZWFuIGlzVm9pZCgpIHsNCisJcmV0dXJuIGJhc2VUeXBlLmVxdWFscygidm9pZCIpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBib29sZWFuIGlzQnVmZmVyKCkgew0KKwlyZXR1cm4gYmFzZVR5cGUuaW5kZXhPZigiQnVmZmVyIikgIT0gLTE7DQorICAgIH0NCisNCisgICAgcHVibGljIGJvb2xlYW4gaXNUeXBlZEJ1ZmZlcigpIHsNCisJcmV0dXJuICFiYXNlVHlwZS5lcXVhbHMoImphdmEubmlvLkJ1ZmZlciIpICYmDQorCSAgICAoYmFzZVR5cGUuaW5kZXhPZigiQnVmZmVyIikgIT0gLTEpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBzdGF0aWMgSlR5cGUgY29udmVydChDVHlwZSBjdHlwZSwgYm9vbGVhbiB1c2VBcnJheSkgew0KKyAJSlR5cGUgamF2YVR5cGUgPSBudWxsOw0KKyAJaWYgKHVzZUFycmF5KSB7DQorIAkgICAgamF2YVR5cGUgPSBhcnJheVR5cGVNYXBwaW5nLmdldChjdHlwZSk7DQorIAl9DQorIAlpZiAoamF2YVR5cGUgPT0gbnVsbCkgew0KKyAJICAgIGphdmFUeXBlID0gdHlwZU1hcHBpbmcuZ2V0KGN0eXBlKTsNCisgCX0NCisgCWlmIChqYXZhVHlwZSA9PSBudWxsKSB7DQorIAkgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlVuc3VwcG9ydGVkIEMgdHlwZTogIiArIGN0eXBlKTsNCisgCX0NCisgCXJldHVybiBqYXZhVHlwZTsNCisgICAgfQ0KK30NCmRpZmYgLS1naXQgYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3JjL0puaUNvZGVFbWl0dGVyLmphdmEgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3JjL0puaUNvZGVFbWl0dGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNiOWEzZQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90b29scy9nbGdlbi9zcmMvSm5pQ29kZUVtaXR0ZXIuamF2YQpAQCAtMCwwICsxLDEwODYgQEAKK2ltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBFbWl0cyBhIEphdmEgaW50ZXJmYWNlIGFuZCBKYXZhICYgQyBpbXBsZW1lbnRhdGlvbiBmb3IgYSBDIGZ1bmN0aW9uLgorICoKKyAqIDxwPiBUaGUgSmF2YSBpbnRlcmZhY2Ugd2lsbCBoYXZlIEJ1ZmZlciBhbmQgYXJyYXkgdmFyaWFudHMgZm9yIGZ1bmN0aW9ucyB0aGF0CisgKiBoYXZlIGEgdHlwZWQgcG9pbnRlciBhcmd1bWVudC4gIFRoZSBhcnJheSB2YXJpYW50IHdpbGwgY29udmVydCBhIHNpbmdsZSAiPHR5cGU+ICpkYXRhIgorICogYXJndW1lbnQgdG8gYSBwYWlyIG9mIGFyZ3VtZW50cyAiPHR5cGU+W10gZGF0YSwgaW50IG9mZnNldCIuCisgKi8KK3B1YmxpYyBjbGFzcyBKbmlDb2RlRW1pdHRlciBpbXBsZW1lbnRzIENvZGVFbWl0dGVyIHsKKworICAgIC8vIElmIHRydWUsIHVzZSBDKysgc3R5bGUgZm9yIGNhbGxpbmcgdGhyb3VnaCBhIEpOSUVudiAqOgorICAgIC8vIGVudi0+RnVuYyguLi4pCisgICAgLy8gSWYgZmFsc2UsIHVzZSBDIHN0eWxlOgorICAgIC8vICgqZW52KS0+RnVuYyhlbnYsIC4uLikKKyAgICBzdGF0aWMgZmluYWwgYm9vbGVhbiBtVXNlQ1BsdXNQbHVzID0gdHJ1ZTsKKworICAgIGJvb2xlYW4gbVVzZUNvbnRleHRQb2ludGVyID0gdHJ1ZTsKKworICAgIFN0cmluZyBtQ2xhc3NQYXRoTmFtZTsKKyAgICAKKyAgICBQYXJhbWV0ZXJDaGVja2VyIG1DaGVja2VyOworICAgIFByaW50U3RyZWFtIG1KYXZhMTBJbnRlcmZhY2VTdHJlYW07CisgICAgUHJpbnRTdHJlYW0gbUphdmExMEV4dEludGVyZmFjZVN0cmVhbTsKKyAgICBQcmludFN0cmVhbSBtSmF2YTExSW50ZXJmYWNlU3RyZWFtOworICAgIFByaW50U3RyZWFtIG1KYXZhMTFFeHRJbnRlcmZhY2VTdHJlYW07CisgICAgUHJpbnRTdHJlYW0gbUphdmExMUV4dFBhY2tJbnRlcmZhY2VTdHJlYW07CisgICAgUHJpbnRTdHJlYW0gbUphdmFJbXBsU3RyZWFtOworICAgIFByaW50U3RyZWFtIG1DU3RyZWFtOworCisgICAgUHJpbnRTdHJlYW0gbUphdmFJbnRlcmZhY2VTdHJlYW07CisKKyAgICBMaXN0PFN0cmluZz4gbmF0aXZlUmVnaXN0cmF0aW9ucyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworCisgICAgYm9vbGVhbiBuZWVkc0V4aXQ7CisKKyAgICBzdGF0aWMgU3RyaW5nIGluZGVudCA9ICIgICAgIjsKKworICAgIEhhc2hTZXQ8U3RyaW5nPiBtRnVuY3Rpb25zRW1pdHRlZCA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKKworICAgIC8qKgorICAgICAqIEBwYXJhbSBqYXZhMTBJbnRlcmZhY2VTdHJlYW0gdGhlIFByaW50U3RyZWFtIHRvIHdoaWNoIHRvIGVtaXQgdGhlIEphdmEgaW50ZXJmYWNlIGZvciBHTCAxLjAgZnVuY3Rpb25zCisgICAgICogQHBhcmFtIGphdmExMEV4dEludGVyZmFjZVN0cmVhbSB0aGUgUHJpbnRTdHJlYW0gdG8gd2hpY2ggdG8gZW1pdCB0aGUgSmF2YSBpbnRlcmZhY2UgZm9yIEdMIDEuMCBleHRlbnNpb24gZnVuY3Rpb25zCisgICAgICogQHBhcmFtIGphdmExMUludGVyZmFjZVN0cmVhbSB0aGUgUHJpbnRTdHJlYW0gdG8gd2hpY2ggdG8gZW1pdCB0aGUgSmF2YSBpbnRlcmZhY2UgZm9yIEdMIDEuMSBmdW5jdGlvbnMgCisgICAgICogQHBhcmFtIGphdmExMUV4dEludGVyZmFjZVN0cmVhbSB0aGUgUHJpbnRTdHJlYW0gdG8gd2hpY2ggdG8gZW1pdCB0aGUgSmF2YSBpbnRlcmZhY2UgZm9yIEdMIDEuMSBFeHRlbnNpb24gZnVuY3Rpb25zCisgICAgICogQHBhcmFtIGphdmExMUV4dFBhY2tJbnRlcmZhY2VTdHJlYW0gdGhlIFByaW50U3RyZWFtIHRvIHdoaWNoIHRvIGVtaXQgdGhlIEphdmEgaW50ZXJmYWNlIGZvciBHTCAxLjEgRXh0ZW5zaW9uIFBhY2sgZnVuY3Rpb25zCisgICAgICogQHBhcmFtIGphdmFJbXBsU3RyZWFtIHRoZSBQcmludFN0cmVhbSB0byB3aGljaCB0byBlbWl0IHRoZSBKYXZhIGltcGxlbWVudGF0aW9uCisgICAgICogQHBhcmFtIGNTdHJlYW0gdGhlIFByaW50U3RyZWFtIHRvIHdoaWNoIHRvIGVtaXQgdGhlIEMgaW1wbGVtZW50YXRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgSm5pQ29kZUVtaXR0ZXIoU3RyaW5nIGNsYXNzUGF0aE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtZXRlckNoZWNrZXIgY2hlY2tlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRTdHJlYW0gamF2YTEwSW50ZXJmYWNlU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQcmludFN0cmVhbSBqYXZhMTBFeHRJbnRlcmZhY2VTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50U3RyZWFtIGphdmExMUludGVyZmFjZVN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRTdHJlYW0gamF2YTExRXh0SW50ZXJmYWNlU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQcmludFN0cmVhbSBqYXZhMTFFeHRQYWNrSW50ZXJmYWNlU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQcmludFN0cmVhbSBqYXZhSW1wbFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRTdHJlYW0gY1N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiB1c2VDb250ZXh0UG9pbnRlcikgeworICAgICAgICBtQ2xhc3NQYXRoTmFtZSA9IGNsYXNzUGF0aE5hbWU7CisgICAgICAgIG1DaGVja2VyID0gY2hlY2tlcjsKKyAgICAgICAgbUphdmExMEludGVyZmFjZVN0cmVhbSA9IGphdmExMEludGVyZmFjZVN0cmVhbTsKKyAgICAgICAgbUphdmExMEV4dEludGVyZmFjZVN0cmVhbSA9IGphdmExMEV4dEludGVyZmFjZVN0cmVhbTsKKyAgICAgICAgbUphdmExMUludGVyZmFjZVN0cmVhbSA9IGphdmExMUludGVyZmFjZVN0cmVhbTsKKyAgICAgICAgbUphdmExMUV4dEludGVyZmFjZVN0cmVhbSA9IGphdmExMUV4dEludGVyZmFjZVN0cmVhbTsKKyAgICAgICAgbUphdmExMUV4dFBhY2tJbnRlcmZhY2VTdHJlYW0gPSBqYXZhMTFFeHRQYWNrSW50ZXJmYWNlU3RyZWFtOworICAgICAgICBtSmF2YUltcGxTdHJlYW0gPSBqYXZhSW1wbFN0cmVhbTsKKyAgICAgICAgbUNTdHJlYW0gPSBjU3RyZWFtOworICAgICAgICBtVXNlQ29udGV4dFBvaW50ZXIgPSB1c2VDb250ZXh0UG9pbnRlcjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRWZXJzaW9uKGludCB2ZXJzaW9uLCBib29sZWFuIGV4dCwgYm9vbGVhbiBwYWNrKSB7CisgICAgICAgIGlmICh2ZXJzaW9uID09IDApIHsKKyAgICAgICAgICAgIG1KYXZhSW50ZXJmYWNlU3RyZWFtID0gZXh0ID8gbUphdmExMEV4dEludGVyZmFjZVN0cmVhbSA6CisgICAgICAgICAgICAgICAgbUphdmExMEludGVyZmFjZVN0cmVhbTsKKyAgICAgICAgfSBlbHNlIGlmICh2ZXJzaW9uID09IDEpIHsKKyAgICAgICAgICAgIG1KYXZhSW50ZXJmYWNlU3RyZWFtID0gZXh0ID8KKyAgICAgICAgICAgICAgICAocGFjayA/IG1KYXZhMTFFeHRQYWNrSW50ZXJmYWNlU3RyZWFtIDoKKyAgICAgICAgICAgICAgICAgbUphdmExMUV4dEludGVyZmFjZVN0cmVhbSkgOgorICAgICAgICAgICAgICAgIG1KYXZhMTFJbnRlcmZhY2VTdHJlYW07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQmFkIHZlcnNpb246ICIgKyB2ZXJzaW9uKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGVtaXRDb2RlKENGdW5jIGNmdW5jLCBTdHJpbmcgb3JpZ2luYWwpIHsKKyAgICAgICAgSkZ1bmMgamZ1bmM7CisgICAgICAgIFN0cmluZyBzaWduYXR1cmU7CisgICAgICAgIGJvb2xlYW4gZHVwbGljYXRlOworICAgICAgICAKKyAgICAgICAgaWYgKGNmdW5jLmhhc1R5cGVkUG9pbnRlckFyZygpKSB7CisgICAgICAgICAgICBqZnVuYyA9IEpGdW5jLmNvbnZlcnQoY2Z1bmMsIHRydWUpOworCisgICAgICAgICAgICAvLyBEb24ndCBlbWl0IGR1cGxpY2F0ZSBmdW5jdGlvbnMKKyAgICAgICAgICAgIC8vIFRoZXNlIG1heSBhcHBlYXIgYmVjYXVzZSB0aGV5IGFyZSBkZWZpbmVkIGluIG11bHRpcGxlCisgICAgICAgICAgICAvLyBKYXZhIGludGVyZmFjZXMgKGUuZy4sIEdMMTEvR0wxMUV4dGVuc2lvblBhY2spCisgICAgICAgICAgICBzaWduYXR1cmUgPSBqZnVuYy50b1N0cmluZygpOworICAgICAgICAgICAgZHVwbGljYXRlID0gZmFsc2U7CisgICAgICAgICAgICBpZiAobUZ1bmN0aW9uc0VtaXR0ZWQuY29udGFpbnMoc2lnbmF0dXJlKSkgeworICAgICAgICAgICAgICAgIGR1cGxpY2F0ZSA9IHRydWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1GdW5jdGlvbnNFbWl0dGVkLmFkZChzaWduYXR1cmUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIWR1cGxpY2F0ZSkgeworICAgICAgICAgICAgICAgIGVtaXROYXRpdmVEZWNsYXJhdGlvbihqZnVuYywgbUphdmFJbXBsU3RyZWFtKTsKKyAgICAgICAgICAgICAgICBlbWl0SmF2YUNvZGUoamZ1bmMsIG1KYXZhSW1wbFN0cmVhbSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbWl0SmF2YUludGVyZmFjZUNvZGUoamZ1bmMsIG1KYXZhSW50ZXJmYWNlU3RyZWFtKTsKKyAgICAgICAgICAgIGlmICghZHVwbGljYXRlKSB7CisgICAgICAgICAgICAgICAgZW1pdEpuaUNvZGUoamZ1bmMsIG1DU3RyZWFtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGpmdW5jID0gSkZ1bmMuY29udmVydChjZnVuYywgZmFsc2UpOworCisgICAgICAgIHNpZ25hdHVyZSA9IGpmdW5jLnRvU3RyaW5nKCk7CisgICAgICAgIGR1cGxpY2F0ZSA9IGZhbHNlOworICAgICAgICBpZiAobUZ1bmN0aW9uc0VtaXR0ZWQuY29udGFpbnMoc2lnbmF0dXJlKSkgeworICAgICAgICAgICAgZHVwbGljYXRlID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1GdW5jdGlvbnNFbWl0dGVkLmFkZChzaWduYXR1cmUpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFkdXBsaWNhdGUpIHsKKyAgICAgICAgICAgIGVtaXROYXRpdmVEZWNsYXJhdGlvbihqZnVuYywgbUphdmFJbXBsU3RyZWFtKTsKKyAgICAgICAgfQorICAgICAgICBlbWl0SmF2YUludGVyZmFjZUNvZGUoamZ1bmMsIG1KYXZhSW50ZXJmYWNlU3RyZWFtKTsKKyAgICAgICAgaWYgKCFkdXBsaWNhdGUpIHsKKyAgICAgICAgICAgIGVtaXRKYXZhQ29kZShqZnVuYywgbUphdmFJbXBsU3RyZWFtKTsKKyAgICAgICAgICAgIGVtaXRKbmlDb2RlKGpmdW5jLCBtQ1N0cmVhbSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBlbWl0TmF0aXZlRGVjbGFyYXRpb24oSkZ1bmMgamZ1bmMsIFByaW50U3RyZWFtIG91dCkgeworICAgICAgICBvdXQucHJpbnRsbigiICAgIC8vIEMgZnVuY3Rpb24gIiArIGpmdW5jLmdldENGdW5jKCkuZ2V0T3JpZ2luYWwoKSk7CisgICAgICAgIG91dC5wcmludGxuKCk7CisKKyAgICAgICAgZW1pdEZ1bmN0aW9uKGpmdW5jLCBvdXQsIHRydWUsIGZhbHNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBlbWl0SmF2YUludGVyZmFjZUNvZGUoSkZ1bmMgamZ1bmMsIFByaW50U3RyZWFtIG91dCkgeworICAgICAgICBlbWl0RnVuY3Rpb24oamZ1bmMsIG91dCwgZmFsc2UsIHRydWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGVtaXRKYXZhQ29kZShKRnVuYyBqZnVuYywgUHJpbnRTdHJlYW0gb3V0KSB7CisgICAgICAgIGVtaXRGdW5jdGlvbihqZnVuYywgb3V0LCBmYWxzZSwgZmFsc2UpOworICAgIH0KKyAgICAKKyAgICB2b2lkIGVtaXRGdW5jdGlvbkNhbGwoSkZ1bmMgamZ1bmMsIFByaW50U3RyZWFtIG91dCwgU3RyaW5nIGlpaSwgYm9vbGVhbiBncmFiQXJyYXkgKSB7CisgICAgICAgIGJvb2xlYW4gaXNWb2lkID0gamZ1bmMuZ2V0VHlwZSgpLmlzVm9pZCgpOworICAgICAgICBib29sZWFuIGlzUG9pbnRlckZ1bmMgPSBqZnVuYy5nZXROYW1lKCkuZW5kc1dpdGgoIlBvaW50ZXIiKSAmJgorICAgICAgICAgICAgamZ1bmMuZ2V0Q0Z1bmMoKS5oYXNQb2ludGVyQXJnKCk7CisKKyAgICAgICAgaWYgKCFpc1ZvaWQpIHsKKyAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArCisgICAgICAgICAgICAgICAgICAgICAgICBqZnVuYy5nZXRUeXBlKCkgKyAiIF9yZXR1cm5WYWx1ZTsiKTsKKyAgICAgICAgfQorICAgICAgICBvdXQucHJpbnRsbihpaWkgKworICAgICAgICAgICAgICAgICAgICAoaXNWb2lkID8gIiIgOiAiX3JldHVyblZhbHVlID0gIikgKworICAgICAgICAgICAgICAgICAgICBqZnVuYy5nZXROYW1lKCkgKworICAgICAgICAgICAgICAgICAgICAoaXNQb2ludGVyRnVuYyA/ICJCb3VuZHMiIDogIiIgKSArCisgICAgICAgICAgICAgICAgICAgICIoIik7CisJCisgICAgICAgIGludCBudW1BcmdzID0gamZ1bmMuZ2V0TnVtQXJncygpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUFyZ3M7IGkrKykgeworICAgICAgICAgICAgU3RyaW5nIGFyZ05hbWUgPSBqZnVuYy5nZXRBcmdOYW1lKGkpOworICAgICAgICAgICAgSlR5cGUgYXJnVHlwZSA9IGpmdW5jLmdldEFyZ1R5cGUoaSk7CisKKyAgICAgICAgICAgIGlmIChncmFiQXJyYXkgJiYgYXJnVHlwZS5pc1R5cGVkQnVmZmVyKCkpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgdHlwZU5hbWUgPSBhcmdUeXBlLmdldEJhc2VUeXBlKCk7CisgICAgICAgICAgICAgICAgdHlwZU5hbWUgPSB0eXBlTmFtZS5zdWJzdHJpbmcoOSwgdHlwZU5hbWUubGVuZ3RoKCkgLSA2KTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyBpbmRlbnQgKyAiZ2V0IiArIHR5cGVOYW1lICsgIkFycmF5KCIgKyBhcmdOYW1lICsgIiksIik7CisgICAgICAgICAgICAgICAgb3V0LnByaW50KGlpaSArIGluZGVudCArICJnZXRPZmZzZXQoIiArIGFyZ05hbWUgKyAiKSIpOyAKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgb3V0LnByaW50KGlpaSArIGluZGVudCArIGFyZ05hbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGkgPT0gbnVtQXJncyAtIDEpIHsKKyAgICAgICAgICAgICAgICBpZiAoaXNQb2ludGVyRnVuYykgeworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiLCIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyBpbmRlbnQgKyBhcmdOYW1lICsgIi5yZW1haW5pbmcoKSIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiLCIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisJCisgICAgICAgIG91dC5wcmludGxuKGlpaSArICIpOyIpOworICAgIH0KKworICAgIHZvaWQgcHJpbnRJZmNoZWNrUG9zdGFtYmxlKFByaW50U3RyZWFtIG91dCwgYm9vbGVhbiBpc0J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGVtaXRFeGNlcHRpb25DaGVjaywgU3RyaW5nIGlpaSkgeworICAgICAgICBwcmludElmY2hlY2tQb3N0YW1ibGUob3V0LCBpc0J1ZmZlciwgZW1pdEV4Y2VwdGlvbkNoZWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9mZnNldCIsICJfcmVtYWluaW5nIiwgaWlpKTsKKyAgICB9CisKKyAgICB2b2lkIHByaW50SWZjaGVja1Bvc3RhbWJsZShQcmludFN0cmVhbSBvdXQsIGJvb2xlYW4gaXNCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBlbWl0RXhjZXB0aW9uQ2hlY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG9mZnNldCwgU3RyaW5nIHJlbWFpbmluZywgU3RyaW5nIGlpaSkgeworICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAiICAgIGRlZmF1bHQ6Iik7CisgICAgICAgIG91dC5wcmludGxuKGlpaSArICIgICAgICAgIF9uZWVkZWQgPSAwOyIpOworICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAiICAgICAgICBicmVhazsiKTsKKyAgICAgICAgb3V0LnByaW50bG4oaWlpICsgIn0iKTsKKworICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAiaWYgKCIgKyByZW1haW5pbmcgKyAiIDwgX25lZWRlZCkgeyIpOworICAgICAgICBpZiAoZW1pdEV4Y2VwdGlvbkNoZWNrKSB7CisgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyBpbmRlbnQgKyAiX2V4Y2VwdGlvbiA9IDE7Iik7CisgICAgICAgIH0KKyAgICAgICAgb3V0LnByaW50bG4oaWlpICsgaW5kZW50ICsKKyAgICAgICAgICAgICAgICAgICAgKG1Vc2VDUGx1c1BsdXMgPyAiX2VudiIgOiAiKCpfZW52KSIpICsKKyAgICAgICAgICAgICAgICAgICAgIi0+VGhyb3dOZXcoIiArCisgICAgICAgICAgICAgICAgICAgIChtVXNlQ1BsdXNQbHVzID8gIiIgOiAiX2VudiwgIikgKworICAgICAgICAgICAgICAgICAgICAiSUFFQ2xhc3MsICIgKworICAgICAgICAgICAgICAgICAgICAiXCIiICsKKyAgICAgICAgICAgICAgICAgICAgKGlzQnVmZmVyID8gCisgICAgICAgICAgICAgICAgICAgICAicmVtYWluaW5nKCkiIDogImxlbmd0aCAtICIgKyBvZmZzZXQpICsKKyAgICAgICAgICAgICAgICAgICAgIiA8IG5lZWRlZFwiKTsiKTsKKyAgICAgICAgb3V0LnByaW50bG4oaWlpICsgaW5kZW50ICsgImdvdG8gZXhpdDsiKTsKKyAgICAgICAgbmVlZHNFeGl0ID0gdHJ1ZTsKKyAgICAgICAgb3V0LnByaW50bG4oaWlpICsgIn0iKTsKKyAgICB9CisKKyAgICBib29sZWFuIGlzTnVsbEFsbG93ZWQoQ0Z1bmMgY2Z1bmMpIHsKKyAgICAgICAgU3RyaW5nW10gY2hlY2tzID0gbUNoZWNrZXIuZ2V0Q2hlY2tzKGNmdW5jLmdldE5hbWUoKSk7CisgICAgICAgIGludCBpbmRleCA9IDE7CisgICAgICAgIGlmIChjaGVja3MgIT0gbnVsbCkgeworICAgICAgICAgICAgd2hpbGUgKGluZGV4IDwgY2hlY2tzLmxlbmd0aCkgeworICAgICAgICAgICAgICAgIGlmIChjaGVja3NbaW5kZXhdLmVxdWFscygicmV0dXJuIikpIHsKKyAgICAgICAgICAgICAgICAgICAgaW5kZXggKz0gMjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoZWNrc1tpbmRleF0uc3RhcnRzV2l0aCgiY2hlY2siKSkgeworICAgICAgICAgICAgICAgICAgICBpbmRleCArPSAzOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hlY2tzW2luZGV4XS5lcXVhbHMoImlmY2hlY2siKSkgeworICAgICAgICAgICAgICAgICAgICBpbmRleCArPSA1OworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hlY2tzW2luZGV4XS5lcXVhbHMoInVuc3VwcG9ydGVkIikpIHsKKyAgICAgICAgICAgICAgICAgICAgaW5kZXggKz0gMTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoZWNrc1tpbmRleF0uZXF1YWxzKCJudWxsQWxsb3dlZCIpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3I6IHVua25vd24ga2V5d29yZCBcIiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tzW2luZGV4XSArICJcIiIpOworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXhpdCgwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIFN0cmluZyBnZXRFcnJvclJldHVyblZhbHVlKENGdW5jIGNmdW5jKSB7CisgICAgICAgIENUeXBlIHJldHVyblR5cGUgPSBjZnVuYy5nZXRUeXBlKCk7CisgICAgICAgIGJvb2xlYW4gaXNWb2lkID0gcmV0dXJuVHlwZS5pc1ZvaWQoKTsKKyAgICAgICAgaWYgKGlzVm9pZCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmdbXSBjaGVja3MgPSBtQ2hlY2tlci5nZXRDaGVja3MoY2Z1bmMuZ2V0TmFtZSgpKTsKKworICAgICAgICBpbnQgaW5kZXggPSAxOworICAgICAgICBpZiAoY2hlY2tzICE9IG51bGwpIHsKKyAgICAgICAgICAgIHdoaWxlIChpbmRleCA8IGNoZWNrcy5sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICBpZiAoY2hlY2tzW2luZGV4XS5lcXVhbHMoInJldHVybiIpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjaGVja3NbaW5kZXggKyAxXTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoZWNrc1tpbmRleF0uc3RhcnRzV2l0aCgiY2hlY2siKSkgeworICAgICAgICAgICAgICAgICAgICBpbmRleCArPSAzOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hlY2tzW2luZGV4XS5lcXVhbHMoImlmY2hlY2siKSkgeworICAgICAgICAgICAgICAgICAgICBpbmRleCArPSA1OworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hlY2tzW2luZGV4XS5lcXVhbHMoInVuc3VwcG9ydGVkIikpIHsKKyAgICAgICAgICAgICAgICAgICAgaW5kZXggKz0gMTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoZWNrc1tpbmRleF0uZXF1YWxzKCJudWxsQWxsb3dlZCIpKSB7CisgICAgICAgICAgICAgICAgICAgIGluZGV4ICs9IDE7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFcnJvcjogdW5rbm93biBrZXl3b3JkIFwiIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja3NbaW5kZXhdICsgIlwiIik7CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5leGl0KDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIGJvb2xlYW4gaXNVbnN1cHBvcnRlZEZ1bmMoQ0Z1bmMgY2Z1bmMpIHsKKyAgICAgICAgU3RyaW5nW10gY2hlY2tzID0gbUNoZWNrZXIuZ2V0Q2hlY2tzKGNmdW5jLmdldE5hbWUoKSk7CisgICAgICAgIGludCBpbmRleCA9IDE7CisgICAgICAgIGlmIChjaGVja3MgIT0gbnVsbCkgeworICAgICAgICAgICAgd2hpbGUgKGluZGV4IDwgY2hlY2tzLmxlbmd0aCkgeworICAgICAgICAgICAgICAgIGlmIChjaGVja3NbaW5kZXhdLmVxdWFscygidW5zdXBwb3J0ZWQiKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoZWNrc1tpbmRleF0uZXF1YWxzKCJyZXR1cm4iKSkgeworICAgICAgICAgICAgICAgICAgICBpbmRleCArPSAyOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hlY2tzW2luZGV4XS5zdGFydHNXaXRoKCJjaGVjayIpKSB7CisgICAgICAgICAgICAgICAgICAgIGluZGV4ICs9IDM7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGVja3NbaW5kZXhdLmVxdWFscygiaWZjaGVjayIpKSB7CisgICAgICAgICAgICAgICAgICAgIGluZGV4ICs9IDU7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGVja3NbaW5kZXhdLmVxdWFscygibnVsbEFsbG93ZWQiKSkgeworICAgICAgICAgICAgICAgICAgICBpbmRleCArPSAxOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3I6IHVua25vd24ga2V5d29yZCBcIiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tzW2luZGV4XSArICJcIiIpOworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXhpdCgwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHZvaWQgZW1pdE5hdGl2ZUJvdW5kc0NoZWNrcyhDRnVuYyBjZnVuYywgU3RyaW5nIGNuYW1lLCBQcmludFN0cmVhbSBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNCdWZmZXIsIGJvb2xlYW4gZW1pdEV4Y2VwdGlvbkNoZWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgb2Zmc2V0LCBTdHJpbmcgcmVtYWluaW5nLCBTdHJpbmcgaWlpKSB7CisgICAgICAgIENUeXBlIHJldHVyblR5cGUgPSBjZnVuYy5nZXRUeXBlKCk7CisgICAgICAgIGJvb2xlYW4gaXNWb2lkID0gcmV0dXJuVHlwZS5pc1ZvaWQoKTsKKworICAgICAgICBTdHJpbmdbXSBjaGVja3MgPSBtQ2hlY2tlci5nZXRDaGVja3MoY2Z1bmMuZ2V0TmFtZSgpKTsKKyAgICAgICAgU3RyaW5nIGNoZWNrVmFyOworICAgICAgICBTdHJpbmcgcmV0dmFsID0gZ2V0RXJyb3JSZXR1cm5WYWx1ZShjZnVuYyk7CisKKyAgICAgICAgYm9vbGVhbiBsYXN0V2FzSWZjaGVjayA9IGZhbHNlOworCisgICAgICAgIGludCBpbmRleCA9IDE7CisgICAgICAgIGlmIChjaGVja3MgIT0gbnVsbCkgeworICAgICAgICAgICAgYm9vbGVhbiByZW1haW5pbmdEZWNsYXJlZCA9IGZhbHNlOworICAgICAgICAgICAgYm9vbGVhbiBudWxsQ2hlY2tEZWNsYXJlZCA9IGZhbHNlOworICAgICAgICAgICAgYm9vbGVhbiBvZmZzZXRDaGVja2VkID0gZmFsc2U7CisgICAgICAgICAgICB3aGlsZSAoaW5kZXggPCBjaGVja3MubGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgaWYgKGNoZWNrc1tpbmRleF0uc3RhcnRzV2l0aCgiY2hlY2siKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAobGFzdFdhc0lmY2hlY2spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50SWZjaGVja1Bvc3RhbWJsZShvdXQsIGlzQnVmZmVyLCBlbWl0RXhjZXB0aW9uQ2hlY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LCByZW1haW5pbmcsIGlpaSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbGFzdFdhc0lmY2hlY2sgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNuYW1lICE9IG51bGwgJiYgIWNuYW1lLmVxdWFscyhjaGVja3NbaW5kZXggKyAxXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ICs9IDM7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAiaWYgKCIgKyByZW1haW5pbmcgKyAiIDwgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrc1tpbmRleCArIDJdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIikgeyIpOworICAgICAgICAgICAgICAgICAgICBpZiAoZW1pdEV4Y2VwdGlvbkNoZWNrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyBpbmRlbnQgKyAiX2V4Y2VwdGlvbiA9IDE7Iik7CisgICAgICAgICAgICAgICAgICAgIH0KKwkJICAgIFN0cmluZyBleGNlcHRpb25DbGFzc05hbWUgPSAiSUFFQ2xhc3MiOworCQkgICAgLy8gSWYgdGhlICJjaGVjayIga2V5d29yZCB3YXMgb2YgdGhlIGZvcm0KKwkJICAgIC8vICJjaGVja188Y2xhc3MgbmFtZT4iLCB1c2UgdGhlIGNsYXNzIG5hbWUgaW4gdGhlCisJCSAgICAvLyBleGNlcHRpb24gdG8gYmUgdGhyb3duCisJCSAgICBpbnQgdW5kZXJzY29yZSA9IGNoZWNrc1tpbmRleF0uaW5kZXhPZignXycpOworCQkgICAgaWYgKHVuZGVyc2NvcmUgPj0gMCkgeworCQkJZXhjZXB0aW9uQ2xhc3NOYW1lID0gY2hlY2tzW2luZGV4XS5zdWJzdHJpbmcodW5kZXJzY29yZSArIDEpICsgIkNsYXNzIjsKKwkJICAgIH0KKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgaW5kZW50ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1Vc2VDUGx1c1BsdXMgPyAiX2VudiIgOiAiKCpfZW52KSIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0+VGhyb3dOZXcoIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtVXNlQ1BsdXNQbHVzID8gIiIgOiAiX2VudiwgIikgKworCQkJCWV4Y2VwdGlvbkNsYXNzTmFtZSArICIsICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCIiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlzQnVmZmVyID8gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVtYWluaW5nKCkiIDogImxlbmd0aCAtICIgKyBvZmZzZXQpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiA8ICIgKyBjaGVja3NbaW5kZXggKyAyXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIik7Iik7CisKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgaW5kZW50ICsgImdvdG8gZXhpdDsiKTsKKyAgICAgICAgICAgICAgICAgICAgbmVlZHNFeGl0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgIn0iKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgaW5kZXggKz0gMzsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoZWNrc1tpbmRleF0uZXF1YWxzKCJpZmNoZWNrIikpIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gbWF0Y2hlcyA9IGNoZWNrc1tpbmRleCArIDRdLnNwbGl0KCIsIik7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFsYXN0V2FzSWZjaGVjaykgeworICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgImludCBfbmVlZGVkOyIpOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzd2l0Y2ggKCIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tzW2luZGV4ICsgM10gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIikgeyIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1hdGNoZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCIjaWYgZGVmaW5lZCgiICsgbWF0Y2hlc1tpXSArICIpIik7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICBjYXNlICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlc1tpXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiOiIpOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIiNlbmRpZiAvLyBkZWZpbmVkKCIgKyBtYXRjaGVzW2ldICsgIikiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICBfbmVlZGVkID0gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrc1tpbmRleCArIDJdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjsiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgYnJlYWs7Iik7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGxhc3RXYXNJZmNoZWNrID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgaW5kZXggKz0gNTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoZWNrc1tpbmRleF0uZXF1YWxzKCJyZXR1cm4iKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUKKyAgICAgICAgICAgICAgICAgICAgaW5kZXggKz0gMjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoZWNrc1tpbmRleF0uZXF1YWxzKCJ1bnN1cHBvcnRlZCIpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZQorICAgICAgICAgICAgICAgICAgICBpbmRleCArPSAxOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hlY2tzW2luZGV4XS5lcXVhbHMoIm51bGxBbGxvd2VkIikpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlCisgICAgICAgICAgICAgICAgICAgIGluZGV4ICs9IDE7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFcnJvcjogdW5rbm93biBrZXl3b3JkIFwiIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja3NbaW5kZXhdICsgIlwiIik7CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5leGl0KDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChsYXN0V2FzSWZjaGVjaykgeworICAgICAgICAgICAgcHJpbnRJZmNoZWNrUG9zdGFtYmxlKG91dCwgaXNCdWZmZXIsIGVtaXRFeGNlcHRpb25DaGVjaywgaWlpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGJvb2xlYW4gaGFzTm9uQ29uc3RBcmcoSkZ1bmMgamZ1bmMsIENGdW5jIGNmdW5jLAorICAgICAgICBMaXN0PEludGVnZXI+IG5vblByaW1pdGl2ZUFyZ3MpIHsKKyAgICAgICAgaWYgKG5vblByaW1pdGl2ZUFyZ3Muc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IG5vblByaW1pdGl2ZUFyZ3Muc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgICAgICAgICBpbnQgaWR4ID0gbm9uUHJpbWl0aXZlQXJncy5nZXQoaSkuaW50VmFsdWUoKTsKKyAgICAgICAgICAgICAgICBpbnQgY0luZGV4ID0gamZ1bmMuZ2V0QXJnQ0luZGV4KGlkeCk7CisgICAgICAgICAgICAgICAgaWYgKGpmdW5jLmdldEFyZ1R5cGUoaWR4KS5pc0FycmF5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFjZnVuYy5nZXRBcmdUeXBlKGNJbmRleCkuaXNDb25zdCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoamZ1bmMuZ2V0QXJnVHlwZShpZHgpLmlzQnVmZmVyKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFjZnVuYy5nZXRBcmdUeXBlKGNJbmRleCkuaXNDb25zdCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogRW1pdCBhIGZ1bmN0aW9uIGluIHNldmVyYWwgdmFyaWFudHM6CisgICAgICoKKyAgICAgKiBpZiBuYXRpdmVEZWNsOiBwdWJsaWMgbmF0aXZlIDxyZXR1cm50eXBlPiBmdW5jKGFyZ3MpOworICAgICAqCisgICAgICogaWYgIW5hdGl2ZURlY2w6CisgICAgICogICBpZiBpbnRlcmZhY2VEZWNsOiAgcHVibGljIDxyZXR1cm50eXBlPiBmdW5jKGFyZ3MpOworICAgICAqICAgaWYgIWludGVyZmFjZURlY2w6IHB1YmxpYyA8cmV0dXJudHlwZT4gZnVuYyhhcmdzKSB7IGJvZHkgfQorICAgICAqLworICAgIHZvaWQgZW1pdEZ1bmN0aW9uKEpGdW5jIGpmdW5jLAorICAgICAgICAgICAgICAgICAgICAgIFByaW50U3RyZWFtIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIG5hdGl2ZURlY2wsIGJvb2xlYW4gaW50ZXJmYWNlRGVjbCkgeworICAgICAgICBib29sZWFuIGlzUG9pbnRlckZ1bmMgPQorICAgICAgICAgICAgamZ1bmMuZ2V0TmFtZSgpLmVuZHNXaXRoKCJQb2ludGVyIikgJiYKKyAgICAgICAgICAgIGpmdW5jLmdldENGdW5jKCkuaGFzUG9pbnRlckFyZygpOworCisgICAgICAgIGlmICghbmF0aXZlRGVjbCAmJiAhaW50ZXJmYWNlRGVjbCAmJiAhaXNQb2ludGVyRnVuYykgeworICAgICAgICAgICAgLy8gSWYgaXQncyBub3QgYSBwb2ludGVyIGZ1bmN0aW9uLCB3ZSd2ZSBhbHJlYWR5IGVtaXR0ZWQgaXQKKyAgICAgICAgICAgIC8vIHdpdGggbmF0aXZlRGVjbCA9PSB0cnVlCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAoaXNQb2ludGVyRnVuYykgeworICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsKKyAgICAgICAgICAgICAgICAgICAgICAgIChuYXRpdmVEZWNsID8gInByaXZhdGUgbmF0aXZlICIgOgorICAgICAgICAgICAgICAgICAgICAgICAgIChpbnRlcmZhY2VEZWNsID8gIiIgOiAicHVibGljICIpKSArCisgICAgICAgICAgICAgICAgICAgICAgICBqZnVuYy5nZXRUeXBlKCkgKyAiICIgKworICAgICAgICAgICAgICAgICAgICAgICAgamZ1bmMuZ2V0TmFtZSgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgIChuYXRpdmVEZWNsID8gIkJvdW5kcyIgOiAiIikgKworICAgICAgICAgICAgICAgICAgICAgICAgIigiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArCisgICAgICAgICAgICAgICAgICAgICAgICAobmF0aXZlRGVjbCA/ICJwdWJsaWMgbmF0aXZlICIgOgorICAgICAgICAgICAgICAgICAgICAgICAgIChpbnRlcmZhY2VEZWNsID8gIiIgOiAicHVibGljICIpKSArCisgICAgICAgICAgICAgICAgICAgICAgICBqZnVuYy5nZXRUeXBlKCkgKyAiICIgKworICAgICAgICAgICAgICAgICAgICAgICAgamZ1bmMuZ2V0TmFtZSgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICIoIik7CisgICAgICAgIH0KKwkKKyAgICAgICAgaW50IG51bUFyZ3MgPSBqZnVuYy5nZXROdW1BcmdzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQXJnczsgaSsrKSB7CisgICAgICAgICAgICBTdHJpbmcgYXJnTmFtZSA9IGpmdW5jLmdldEFyZ05hbWUoaSk7CisgICAgICAgICAgICBKVHlwZSBhcmdUeXBlID0gamZ1bmMuZ2V0QXJnVHlwZShpKTsKKwkgICAgCisgICAgICAgICAgICBvdXQucHJpbnQoaW5kZW50ICsgaW5kZW50ICsgYXJnVHlwZSArICIgIiArIGFyZ05hbWUpOworICAgICAgICAgICAgaWYgKGkgPT0gbnVtQXJncyAtIDEpIHsKKyAgICAgICAgICAgICAgICBpZiAoaXNQb2ludGVyRnVuYyAmJiBuYXRpdmVEZWNsKSB7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCIsIik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArIGluZGVudCArICJpbnQgcmVtYWluaW5nIik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCIsIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAobmF0aXZlRGVjbCB8fCBpbnRlcmZhY2VEZWNsKSB7CisgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKyAiKTsiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArICIpIHsiKTsKKworICAgICAgICAgICAgU3RyaW5nIGlpaSA9IGluZGVudCArIGluZGVudDsKKworICAgICAgICAgICAgU3RyaW5nIGZuYW1lID0gamZ1bmMuZ2V0TmFtZSgpOworICAgICAgICAgICAgaWYgKGlzUG9pbnRlckZ1bmMpIHsKKyAgICAgICAgICAgICAgICAvLyBUT0RPIC0gZGVhbCB3aXRoIFZCTyB2YXJpYW50cworICAgICAgICAgICAgICAgIGlmIChmbmFtZS5lcXVhbHMoImdsQ29sb3JQb2ludGVyIikpIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgImlmICgoc2l6ZSA9PSA0KSAmJiIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAiICAgICgodHlwZSA9PSBHTF9GTE9BVCkgfHwiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgIiAgICAgKHR5cGUgPT0gR0xfVU5TSUdORURfQllURSkgfHwiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgIiAgICAgKHR5cGUgPT0gR0xfRklYRUQpKSAmJiIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAiICAgIChzdHJpZGUgPj0gMCkpIHsiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgaW5kZW50ICsgIl9jb2xvclBvaW50ZXIgPSBwb2ludGVyOyIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAifSIpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZm5hbWUuZXF1YWxzKCJnbE5vcm1hbFBvaW50ZXIiKSkgeworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAiaWYgKCgodHlwZSA9PSBHTF9GTE9BVCkgfHwiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgIiAgICAgKHR5cGUgPT0gR0xfQllURSkgfHwiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgIiAgICAgKHR5cGUgPT0gR0xfU0hPUlQpIHx8Iik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICIgICAgICh0eXBlID09IEdMX0ZJWEVEKSkgJiYiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgIiAgICAoc3RyaWRlID49IDApKSB7Iik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArIGluZGVudCArICJfbm9ybWFsUG9pbnRlciA9IHBvaW50ZXI7Iik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICJ9Iik7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmbmFtZS5lcXVhbHMoImdsVGV4Q29vcmRQb2ludGVyIikpIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgImlmICgoKHNpemUgPT0gMikgfHwiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgIiAgICAgKHNpemUgPT0gMykgfHwiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgIiAgICAgKHNpemUgPT0gNCkpICYmIik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICIgICAgKCh0eXBlID09IEdMX0ZMT0FUKSB8fCIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAiICAgICAodHlwZSA9PSBHTF9CWVRFKSB8fCIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAiICAgICAodHlwZSA9PSBHTF9TSE9SVCkgfHwiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgIiAgICAgKHR5cGUgPT0gR0xfRklYRUQpKSAmJiIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAiICAgIChzdHJpZGUgPj0gMCkpIHsiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgaW5kZW50ICsgIl90ZXhDb29yZFBvaW50ZXIgPSBwb2ludGVyOyIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAifSIpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZm5hbWUuZXF1YWxzKCJnbFZlcnRleFBvaW50ZXIiKSkgeworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAiaWYgKCgoc2l6ZSA9PSAyKSB8fCIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAiICAgICAoc2l6ZSA9PSAzKSB8fCIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAiICAgICAoc2l6ZSA9PSA0KSkgJiYiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaWlpICsgIiAgICAoKHR5cGUgPT0gR0xfRkxPQVQpIHx8Iik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICIgICAgICh0eXBlID09IEdMX0JZVEUpIHx8Iik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICIgICAgICh0eXBlID09IEdMX1NIT1JUKSB8fCIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAiICAgICAodHlwZSA9PSBHTF9GSVhFRCkpICYmIik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGlpaSArICIgICAgKHN0cmlkZSA+PSAwKSkgeyIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyBpbmRlbnQgKyAiX3ZlcnRleFBvaW50ZXIgPSBwb2ludGVyOyIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpaWkgKyAifSIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gZW1pdEJvdW5kc0NoZWNrcyhqZnVuYywgb3V0LCBpaWkpOworICAgICAgICAgICAgZW1pdEZ1bmN0aW9uQ2FsbChqZnVuYywgb3V0LCBpaWksIGZhbHNlKTsKKworICAgICAgICAgICAgYm9vbGVhbiBpc1ZvaWQgPSBqZnVuYy5nZXRUeXBlKCkuaXNWb2lkKCk7CisKKyAgICAgICAgICAgIGlmICghaXNWb2lkKSB7CisgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgaW5kZW50ICsgInJldHVybiBfcmV0dXJuVmFsdWU7Iik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKyAifSIpOworICAgICAgICB9CisgICAgICAgIG91dC5wcmludGxuKCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Sm5pTmFtZShKVHlwZSBqVHlwZSkgeworICAgICAgICBTdHJpbmcgam5pTmFtZSA9ICIiOworICAgICAgICBpZiAoalR5cGUuaXNDbGFzcygpKSB7CisgICAgICAgICAgICByZXR1cm4gIkwiICsgalR5cGUuZ2V0QmFzZVR5cGUoKSArICI7IjsKKyAgICAgICAgfSBlbHNlIGlmIChqVHlwZS5pc0FycmF5KCkpIHsKKyAgICAgICAgICAgIGpuaU5hbWUgPSAiWyI7CisgICAgICAgIH0KKwkKKyAgICAgICAgU3RyaW5nIGJhc2VUeXBlID0galR5cGUuZ2V0QmFzZVR5cGUoKTsKKyAgICAgICAgaWYgKGJhc2VUeXBlLmVxdWFscygiaW50IikpIHsKKyAgICAgICAgICAgIGpuaU5hbWUgKz0gIkkiOworICAgICAgICB9IGVsc2UgaWYgKGJhc2VUeXBlLmVxdWFscygiZmxvYXQiKSkgeworICAgICAgICAgICAgam5pTmFtZSArPSAiRiI7CisgICAgICAgIH0gZWxzZSBpZiAoYmFzZVR5cGUuZXF1YWxzKCJib29sZWFuIikpIHsKKyAgICAgICAgICAgIGpuaU5hbWUgKz0gIloiOworICAgICAgICB9IGVsc2UgaWYgKGJhc2VUeXBlLmVxdWFscygic2hvcnQiKSkgeworICAgICAgICAgICAgam5pTmFtZSArPSAiUyI7CisgICAgICAgIH0gZWxzZSBpZiAoYmFzZVR5cGUuZXF1YWxzKCJsb25nIikpIHsKKyAgICAgICAgICAgIGpuaU5hbWUgKz0gIkwiOworICAgICAgICB9IGVsc2UgaWYgKGJhc2VUeXBlLmVxdWFscygiYnl0ZSIpKSB7CisgICAgICAgICAgICBqbmlOYW1lICs9ICJCIjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gam5pTmFtZTsKKyAgICB9CisKKyAgICBTdHJpbmcgZ2V0Sm5pVHlwZShKVHlwZSBqVHlwZSkgeworICAgICAgICBpZiAoalR5cGUuaXNWb2lkKCkpIHsKKyAgICAgICAgICAgIHJldHVybiAidm9pZCI7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgYmFzZVR5cGUgPSBqVHlwZS5nZXRCYXNlVHlwZSgpOworICAgICAgICBpZiAoalR5cGUuaXNQcmltaXRpdmUoKSkgeworICAgICAgICAgICAgaWYgKGJhc2VUeXBlLmVxdWFscygiU3RyaW5nIikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gImpzdHJpbmciOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gImoiICsgYmFzZVR5cGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoalR5cGUuaXNBcnJheSgpKSB7CisgICAgICAgICAgICByZXR1cm4gImoiICsgYmFzZVR5cGUgKyAiQXJyYXkiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuICJqb2JqZWN0IjsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBTdHJpbmcgZ2V0Sm5pTWFuZ2xlZE5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgbmFtZSA9IG5hbWUucmVwbGFjZUFsbCgiXyIsICJfMSIpOworICAgICAgICBuYW1lID0gbmFtZS5yZXBsYWNlQWxsKCI7IiwgIl8yIik7CisgICAgICAgIG5hbWUgPSBuYW1lLnJlcGxhY2VBbGwoIlxcWyIsICJfMyIpOworICAgICAgICByZXR1cm4gbmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBlbWl0Sm5pQ29kZShKRnVuYyBqZnVuYywgUHJpbnRTdHJlYW0gb3V0KSB7CisgICAgICAgIENGdW5jIGNmdW5jID0gamZ1bmMuZ2V0Q0Z1bmMoKTsKKwkKKyAgICAgICAgLy8gRW1pdCBjb21tZW50IGlkZW50aWZ5aW5nIG9yaWdpbmFsIEMgZnVuY3Rpb24KKyAgICAgICAgLy8KKyAgICAgICAgLy8gRXhhbXBsZToKKyAgICAgICAgLy8KKyAgICAgICAgLy8gLyogdm9pZCBnbENsaXBQbGFuZWYgKCBHTGVudW0gcGxhbmUsIGNvbnN0IEdMZmxvYXQgKmVxdWF0aW9uICkgKi8KKyAgICAgICAgLy8KKyAgICAgICAgb3V0LnByaW50bG4oIi8qICIgKyBjZnVuYy5nZXRPcmlnaW5hbCgpICsgIiAqLyIpOworCisgICAgICAgIC8vIEVtaXQgSk5JIHNpZ25hdHVyZSAobmFtZSkKKyAgICAgICAgLy8KKyAgICAgICAgLy8gRXhhbXBsZToKKyAgICAgICAgLy8KKyAgICAgICAgLy8gdm9pZAorICAgICAgICAvLyBhbmRyb2lkX2dsQ2xpcFBsYW5lZl9fSV8zRkkKKyAgICAgICAgLy8KKworICAgICAgICBTdHJpbmcgb3V0TmFtZSA9ICJhbmRyb2lkXyIgKyBqZnVuYy5nZXROYW1lKCk7CisgICAgICAgIGJvb2xlYW4gaXNQb2ludGVyRnVuYyA9IG91dE5hbWUuZW5kc1dpdGgoIlBvaW50ZXIiKSAmJgorICAgICAgICAgICAgamZ1bmMuZ2V0Q0Z1bmMoKS5oYXNQb2ludGVyQXJnKCk7CisgICAgICAgIGJvb2xlYW4gaXNWQk9Qb2ludGVyRnVuYyA9IChvdXROYW1lLmVuZHNXaXRoKCJQb2ludGVyIikgfHwKKyAgICAgICAgICAgIG91dE5hbWUuZW5kc1dpdGgoIkRyYXdFbGVtZW50cyIpKSAmJgorICAgICAgICAgICAgIWpmdW5jLmdldENGdW5jKCkuaGFzUG9pbnRlckFyZygpOworICAgICAgICBpZiAoaXNQb2ludGVyRnVuYykgeworICAgICAgICAgICAgb3V0TmFtZSArPSAiQm91bmRzIjsKKyAgICAgICAgfQorCisgICAgICAgIG91dC5wcmludCgic3RhdGljICIpOworICAgICAgICBvdXQucHJpbnRsbihnZXRKbmlUeXBlKGpmdW5jLmdldFR5cGUoKSkpOworICAgICAgICBvdXQucHJpbnQob3V0TmFtZSk7CisKKyAgICAgICAgU3RyaW5nIHJzaWduYXR1cmUgPSBnZXRKbmlOYW1lKGpmdW5jLmdldFR5cGUoKSk7CisKKyAgICAgICAgU3RyaW5nIHNpZ25hdHVyZSA9ICIiOworICAgICAgICBpbnQgbnVtQXJncyA9IGpmdW5jLmdldE51bUFyZ3MoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1BcmdzOyBpKyspIHsKKyAgICAgICAgICAgIEpUeXBlIGFyZ1R5cGUgPSBqZnVuYy5nZXRBcmdUeXBlKGkpOworICAgICAgICAgICAgc2lnbmF0dXJlICs9IGdldEpuaU5hbWUoYXJnVHlwZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlzUG9pbnRlckZ1bmMpIHsKKyAgICAgICAgICAgIHNpZ25hdHVyZSArPSAiSSI7CisgICAgICAgIH0KKworICAgICAgICAvLyBBcHBlbmQgc2lnbmF0dXJlIHRvIGZ1bmN0aW9uIG5hbWUKKyAgICAgICAgU3RyaW5nIHNpZyA9IGdldEpuaU1hbmdsZWROYW1lKHNpZ25hdHVyZSkucmVwbGFjZSgnLicsICdfJyk7ICAgICAgICAKKyAgICAgICAgb3V0LnByaW50KCJfXyIgKyBzaWcpOworICAgICAgICBvdXROYW1lICs9ICJfXyIgKyBzaWc7CisJCisgICAgICAgIHNpZ25hdHVyZSA9IHNpZ25hdHVyZS5yZXBsYWNlKCcuJywgJy8nKTsKKyAgICAgICAgcnNpZ25hdHVyZSA9IHJzaWduYXR1cmUucmVwbGFjZSgnLicsICcvJyk7CisJCisgICAgICAgIG91dC5wcmludGxuKCk7CisgICAgICAgIGlmIChyc2lnbmF0dXJlLmxlbmd0aCgpID09IDApIHsKKyAgICAgICAgICAgIHJzaWduYXR1cmUgPSAiViI7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgcyA9ICJ7XCIiICsKKyAgICAgICAgICAgIGpmdW5jLmdldE5hbWUoKSArCisgICAgICAgICAgICAoaXNQb2ludGVyRnVuYyA/ICJCb3VuZHMiIDogIiIpICsKKyAgICAgICAgICAgICJcIiwgXCIoIiArIHNpZ25hdHVyZSArIikiICsKKyAgICAgICAgICAgIHJzaWduYXR1cmUgKworICAgICAgICAgICAgIlwiLCAodm9pZCAqKSAiICsKKyAgICAgICAgICAgIG91dE5hbWUgKworICAgICAgICAgICAgIiB9LCI7CisgICAgICAgIG5hdGl2ZVJlZ2lzdHJhdGlvbnMuYWRkKHMpOworCisgICAgICAgIExpc3Q8SW50ZWdlcj4gbm9uUHJpbWl0aXZlQXJncyA9IG5ldyBBcnJheUxpc3Q8SW50ZWdlcj4oKTsKKyAgICAgICAgaW50IG51bUJ1ZmZlckFyZ3MgPSAwOworICAgICAgICBMaXN0PFN0cmluZz4gYnVmZmVyQXJnTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKworICAgICAgICAvLyBFbWl0IEpOSSBzaWduYXR1cmUgKGFyZ3VtZW50cykKKyAgICAgICAgLy8KKyAgICAgICAgLy8gRXhhbXBsZToKKyAgICAgICAgLy8KKyAgICAgICAgLy8gKEpOSUVudiAqX2Vudiwgam9iamVjdCB0aGlzLCBqaW50IHBsYW5lLCBqZmxvYXRBcnJheSBlcXVhdGlvbl9yZWYsIGppbnQgb2Zmc2V0KSB7CisgICAgICAgIC8vCisgICAgICAgIG91dC5wcmludCgiICAoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzIik7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQXJnczsgaSsrKSB7CisgICAgICAgICAgICBvdXQucHJpbnQoIiwgIik7CisgICAgICAgICAgICBKVHlwZSBhcmdUeXBlID0gamZ1bmMuZ2V0QXJnVHlwZShpKTsKKyAgICAgICAgICAgIFN0cmluZyBzdWZmaXg7CisgICAgICAgICAgICBpZiAoIWFyZ1R5cGUuaXNQcmltaXRpdmUoKSkgeworICAgICAgICAgICAgICAgIGlmIChhcmdUeXBlLmlzQXJyYXkoKSkgeworICAgICAgICAgICAgICAgICAgICBzdWZmaXggPSAiX3JlZiI7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc3VmZml4ID0gIl9idWYiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBub25QcmltaXRpdmVBcmdzLmFkZChuZXcgSW50ZWdlcihpKSk7CisgICAgICAgICAgICAgICAgaWYgKGpmdW5jLmdldEFyZ1R5cGUoaSkuaXNCdWZmZXIoKSkgeworICAgICAgICAgICAgICAgICAgICBpbnQgY0luZGV4ID0gamZ1bmMuZ2V0QXJnQ0luZGV4KGkpOworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY25hbWUgPSBjZnVuYy5nZXRBcmdOYW1lKGNJbmRleCk7CisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlckFyZ05hbWVzLmFkZChjbmFtZSk7CisgICAgICAgICAgICAgICAgICAgIG51bUJ1ZmZlckFyZ3MrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN1ZmZpeCA9ICIiOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBvdXQucHJpbnQoZ2V0Sm5pVHlwZShhcmdUeXBlKSArICIgIiArIGpmdW5jLmdldEFyZ05hbWUoaSkgKyBzdWZmaXgpOworICAgICAgICB9CisgICAgICAgIGlmIChpc1BvaW50ZXJGdW5jKSB7CisgICAgICAgICAgICBvdXQucHJpbnQoIiwgamludCByZW1haW5pbmciKTsKKyAgICAgICAgfQorICAgICAgICBvdXQucHJpbnRsbigiKSB7Iik7CisJCisgICAgICAgIGludCBudW1BcnJheXMgPSAwOworICAgICAgICBpbnQgbnVtQnVmZmVycyA9IDA7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbm9uUHJpbWl0aXZlQXJncy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgaW50IGlkeCA9IG5vblByaW1pdGl2ZUFyZ3MuZ2V0KGkpLmludFZhbHVlKCk7CisgICAgICAgICAgICBpbnQgY0luZGV4ID0gamZ1bmMuZ2V0QXJnQ0luZGV4KGlkeCk7CisgICAgICAgICAgICBTdHJpbmcgY25hbWUgPSBjZnVuYy5nZXRBcmdOYW1lKGNJbmRleCk7CisgICAgICAgICAgICBpZiAoamZ1bmMuZ2V0QXJnVHlwZShpZHgpLmlzQXJyYXkoKSkgeworICAgICAgICAgICAgICAgICsrbnVtQXJyYXlzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGpmdW5jLmdldEFyZ1R5cGUoaWR4KS5pc0J1ZmZlcigpKSB7CisgICAgICAgICAgICAgICAgKytudW1CdWZmZXJzOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gRW1pdCBtZXRob2QgYm9keQorCisgICAgICAgIC8vIEVtaXQgbG9jYWwgdmFyaWFibGUgZGVjbGFyYXRpb25zIGZvciBfZXhjZXB0aW9uIGFuZCBfcmV0dXJuVmFsdWUKKyAgICAgICAgLy8KKyAgICAgICAgLy8gRXhhbXBsZToKKyAgICAgICAgLy8KKyAgICAgICAgLy8gYW5kcm9pZDo6Z2w6Om9nbGVzX2NvbnRleHRfdCAqY3R4OworICAgICAgICAvLyAKKyAgICAgICAgLy8gamludCBfZXhjZXB0aW9uOworICAgICAgICAvLyBHTGVudW0gX3JldHVyblZhbHVlOworICAgICAgICAvLworICAgICAgICBDVHlwZSByZXR1cm5UeXBlID0gY2Z1bmMuZ2V0VHlwZSgpOworICAgICAgICBib29sZWFuIGlzVm9pZCA9IHJldHVyblR5cGUuaXNWb2lkKCk7CisKKyAgICAgICAgYm9vbGVhbiBpc1Vuc3VwcG9ydGVkID0gaXNVbnN1cHBvcnRlZEZ1bmMoY2Z1bmMpOworICAgICAgICBpZiAoaXNVbnN1cHBvcnRlZCkgeworICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICJfZW52LT5UaHJvd05ldyhVT0VDbGFzcywiKTsKKyAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArCisgICAgICAgICAgICAgICAgICAgICAgICAiICAgIFwiIiArIGNmdW5jLmdldE5hbWUoKSArICJcIik7Iik7CisgICAgICAgICAgICBpZiAoIWlzVm9pZCkgeworICAgICAgICAgICAgICAgIFN0cmluZyByZXR2YWwgPSBnZXRFcnJvclJldHVyblZhbHVlKGNmdW5jKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKyAicmV0dXJuICIgKyByZXR2YWwgKyAiOyIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb3V0LnByaW50bG4oIn0iKTsKKyAgICAgICAgICAgIG91dC5wcmludGxuKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAobVVzZUNvbnRleHRQb2ludGVyKSB7CisgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKworICAgICAgICAgICAgICAgICJhbmRyb2lkOjpnbDo6b2dsZXNfY29udGV4dF90ICpjdHggPSBnZXRDb250ZXh0KF9lbnYsIF90aGlzKTsiKTsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2xlYW4gZW1pdEV4Y2VwdGlvbkNoZWNrID0gKG51bUFycmF5cyA+IDAgfHwgbnVtQnVmZmVycyA+IDApICYmCisgICAgICAgICAgICBoYXNOb25Db25zdEFyZyhqZnVuYywgY2Z1bmMsIG5vblByaW1pdGl2ZUFyZ3MpOworICAgICAgICAvLyBtQ2hlY2tlci5nZXRDaGVja3MoY2Z1bmMuZ2V0TmFtZSgpKSAhPSBudWxsCisKKyAgICAgICAgLy8gRW1pdCBhbiBfZXhlcHRpb24gdmFyaWFibGUgaWYgdGhlcmUgd2lsbCBiZSBlcnJvciBjaGVja3MKKyAgICAgICAgaWYgKGVtaXRFeGNlcHRpb25DaGVjaykgeworICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgImppbnQgX2V4Y2VwdGlvbiA9IDA7Iik7CisgICAgICAgIH0KKworICAgICAgICAvLyBFbWl0IGEgc2luZ2xlIF9hcnJheSBvciBtdWx0aXBsZSBfWFhYQXJyYXkgdmFyaWFibGVzCisgICAgICAgIGlmIChudW1CdWZmZXJBcmdzID09IDEpIHsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKyAiamFycmF5IF9hcnJheSA9IChqYXJyYXkpIDA7Iik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUJ1ZmZlckFyZ3M7IGkrKykgeworICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArICJqYXJyYXkgXyIgKyBidWZmZXJBcmdOYW1lcy5nZXQoaSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBcnJheSA9IChqYXJyYXkpIDA7Iik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFpc1ZvaWQpIHsKKyAgICAgICAgICAgIFN0cmluZyByZXR2YWwgPSBnZXRFcnJvclJldHVyblZhbHVlKGNmdW5jKTsKKyAgICAgICAgICAgIGlmIChyZXR2YWwgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArIHJldHVyblR5cGUuZ2V0RGVjbGFyYXRpb24oKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBfcmV0dXJuVmFsdWUgPSAiICsgcmV0dmFsICsgIjsiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgcmV0dXJuVHlwZS5nZXREZWNsYXJhdGlvbigpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIF9yZXR1cm5WYWx1ZTsiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIEVtaXQgbG9jYWwgdmFyaWFibGUgZGVjbGFyYXRpb25zIGZvciBwb2ludGVyIGFyZ3VtZW50cworICAgICAgICAvLworICAgICAgICAvLyBFeGFtcGxlOgorICAgICAgICAvLworICAgICAgICAvLyBHTGZpeGVkICplcW5fYmFzZTsKKyAgICAgICAgLy8gR0xmaXhlZCAqZXFuOworICAgICAgICAvLworICAgICAgICBTdHJpbmcgb2Zmc2V0ID0gIm9mZnNldCI7CisgICAgICAgIFN0cmluZyByZW1haW5pbmcgPSAiX3JlbWFpbmluZyI7CisgICAgICAgIGlmIChub25QcmltaXRpdmVBcmdzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbm9uUHJpbWl0aXZlQXJncy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIGludCBpZHggPSBub25QcmltaXRpdmVBcmdzLmdldChpKS5pbnRWYWx1ZSgpOworICAgICAgICAgICAgICAgIGludCBjSW5kZXggPSBqZnVuYy5nZXRBcmdDSW5kZXgoaWR4KTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgY25hbWUgPSBjZnVuYy5nZXRBcmdOYW1lKGNJbmRleCk7CisKKyAgICAgICAgICAgICAgICBDVHlwZSB0eXBlID0gY2Z1bmMuZ2V0QXJnVHlwZShqZnVuYy5nZXRBcmdDSW5kZXgoaWR4KSk7CisgICAgICAgICAgICAgICAgU3RyaW5nIGRlY2wgPSB0eXBlLmdldERlY2xhcmF0aW9uKCk7CisgICAgICAgICAgICAgICAgaWYgKGpmdW5jLmdldEFyZ1R5cGUoaWR4KS5pc0FycmF5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjbCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkZWNsLmVuZHNXaXRoKCIqIikgPyAiIiA6ICIgIikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqZnVuYy5nZXRBcmdOYW1lKGlkeCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX2Jhc2UgPSAoIiArIGRlY2wgKyAiKSAwOyIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZW1haW5pbmcgPSAobnVtQXJyYXlzIDw9IDEgJiYgbnVtQnVmZmVycyA8PSAxKSA/ICJfcmVtYWluaW5nIiA6CisgICAgICAgICAgICAgICAgICAgICJfIiArIGNuYW1lICsgIlJlbWFpbmluZyI7CisgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiamludCAiICsgcmVtYWluaW5nICsgIjsiKTsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2wgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkZWNsLmVuZHNXaXRoKCIqIikgPyAiIiA6ICIgIikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpmdW5jLmdldEFyZ05hbWUoaWR4KSArIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgPSAoIiArIGRlY2wgKyAiKSAwOyIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBvdXQucHJpbnRsbigpOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIHJldHZhbCA9IGlzVm9pZCA/ICIiIDogIiBfcmV0dXJuVmFsdWUiOworCisgICAgICAgIC8vIEVtaXQgJ0dldFByaW1pdGl2ZUFycmF5Q3JpdGljYWwnIGZvciBhcnJheXMKKyAgICAgICAgLy8gRW1pdCAnR2V0UG9pbnRlcicgY2FsbHMgZm9yIEJ1ZmZlciBwb2ludGVycworICAgICAgICBpbnQgYnVmQXJnSWR4ID0gMDsKKyAgICAgICAgaWYgKG5vblByaW1pdGl2ZUFyZ3Muc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBub25QcmltaXRpdmVBcmdzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgaW50IGlkeCA9IG5vblByaW1pdGl2ZUFyZ3MuZ2V0KGkpLmludFZhbHVlKCk7CisgICAgICAgICAgICAgICAgaW50IGNJbmRleCA9IGpmdW5jLmdldEFyZ0NJbmRleChpZHgpOworCQkKKyAgICAgICAgICAgICAgICBTdHJpbmcgY25hbWUgPSBjZnVuYy5nZXRBcmdOYW1lKGNJbmRleCk7CisgICAgICAgICAgICAgICAgb2Zmc2V0ID0gbnVtQXJyYXlzIDw9IDEgPyAib2Zmc2V0IiA6CisgICAgICAgICAgICAgICAgICAgIGNuYW1lICsgIk9mZnNldCI7CisgICAgICAgICAgICAgICAgcmVtYWluaW5nID0gKG51bUFycmF5cyA8PSAxICYmIG51bUJ1ZmZlcnMgPD0gMSkgPyAiX3JlbWFpbmluZyIgOgorICAgICAgICAgICAgICAgICAgICAiXyIgKyBjbmFtZSArICJSZW1haW5pbmciOworCisgICAgICAgICAgICAgICAgaWYgKGpmdW5jLmdldEFyZ1R5cGUoaWR4KS5pc0FycmF5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlmICghIiArIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbmFtZSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJfcmVmKSB7Iik7CisgICAgICAgICAgICAgICAgICAgIGlmIChlbWl0RXhjZXB0aW9uQ2hlY2spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArIGluZGVudCArICJfZXhjZXB0aW9uID0gMTsiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKyAiICAgICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobVVzZUNQbHVzUGx1cyA/ICJfZW52IiA6ICIoKl9lbnYpIikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLT5UaHJvd05ldygiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1Vc2VDUGx1c1BsdXMgPyAiIiA6ICJfZW52LCAiKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJQUVDbGFzcywgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIiIgKyBjbmFtZSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgPT0gbnVsbFwiKTsiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgIiAgICBnb3RvIGV4aXQ7Iik7CisgICAgICAgICAgICAgICAgICAgIG5lZWRzRXhpdCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArICJ9Iik7CisKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgImlmICgiICsgb2Zmc2V0ICsgIiA8IDApIHsiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVtaXRFeGNlcHRpb25DaGVjaykgeworICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgaW5kZW50ICsgIl9leGNlcHRpb24gPSAxOyIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArICIgICAgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtVXNlQ1BsdXNQbHVzID8gIl9lbnYiIDogIigqX2VudikiKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItPlRocm93TmV3KCIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobVVzZUNQbHVzUGx1cyA/ICIiIDogIl9lbnYsICIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklBRUNsYXNzLCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiIiArIG9mZnNldCArICIgPCAwXCIpOyIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKyAiICAgIGdvdG8gZXhpdDsiKTsKKyAgICAgICAgICAgICAgICAgICAgbmVlZHNFeGl0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgIn0iKTsKKworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKyByZW1haW5pbmcgKyAiID0gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobVVzZUNQbHVzUGx1cyA/ICJfZW52IiA6ICIoKl9lbnYpIikgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItPkdldEFycmF5TGVuZ3RoKCIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1Vc2VDUGx1c1BsdXMgPyAiIiA6ICJfZW52LCAiKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbmFtZSArICJfcmVmKSAtICIgKyBvZmZzZXQgKyAiOyIpOworCisgICAgICAgICAgICAgICAgICAgIGVtaXROYXRpdmVCb3VuZHNDaGVja3MoY2Z1bmMsIGNuYW1lLCBvdXQsIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRFeGNlcHRpb25DaGVjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsIHJlbWFpbmluZywgIiAgICAiKTsKKworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbmFtZSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJfYmFzZSA9ICgiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2Z1bmMuZ2V0QXJnVHlwZShjSW5kZXgpLmdldERlY2xhcmF0aW9uKCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKSIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKyAiICAgICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobVVzZUNQbHVzUGx1cyA/ICJfZW52IiA6ICIoKl9lbnYpIikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKCIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobVVzZUNQbHVzUGx1cyA/ICIiIDogIl9lbnYsICIpICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpmdW5jLmdldEFyZ05hbWUoaWR4KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJfcmVmLCAoamJvb2xlYW4gKikwKTsiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY25hbWUgKyAiID0gIiArIGNuYW1lICsgIl9iYXNlICsgIiArIG9mZnNldCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI7Iik7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGFycmF5ID0gbnVtQnVmZmVyQXJncyA8PSAxID8gIl9hcnJheSIgOgorICAgICAgICAgICAgICAgICAgICAgICAgIl8iICsgYnVmZmVyQXJnTmFtZXMuZ2V0KGJ1ZkFyZ0lkeCsrKSArICJBcnJheSI7CisKKyAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBudWxsQWxsb3dlZCA9IGlzTnVsbEFsbG93ZWQoY2Z1bmMpOworICAgICAgICAgICAgICAgICAgICBpZiAobnVsbEFsbG93ZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArICJpZiAoIiArIGNuYW1lICsgIl9idWYpIHsiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludChpbmRlbnQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbmFtZSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgPSAoIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmdW5jLmdldEFyZ1R5cGUoY0luZGV4KS5nZXREZWNsYXJhdGlvbigpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIilnZXRQb2ludGVyKF9lbnYsICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbmFtZSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJfYnVmLCAmIiArIGFycmF5ICsgIiwgJiIgKyByZW1haW5pbmcgKyAiKTsiKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAobnVsbEFsbG93ZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArICJ9Iik7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBlbWl0TmF0aXZlQm91bmRzQ2hlY2tzKGNmdW5jLCBjbmFtZSwgb3V0LCB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXRFeGNlcHRpb25DaGVjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsIHJlbWFpbmluZywgIiAgICAiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWlzVm9pZCkgeworICAgICAgICAgICAgb3V0LnByaW50KGluZGVudCArICJfcmV0dXJuVmFsdWUgPSAiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG91dC5wcmludChpbmRlbnQpOworICAgICAgICB9CisgICAgICAgIFN0cmluZyBuYW1lID0gY2Z1bmMuZ2V0TmFtZSgpOworCisgICAgICAgIGlmIChtVXNlQ29udGV4dFBvaW50ZXIpIHsKKyAgICAgICAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cmluZygyLCBuYW1lLmxlbmd0aCgpKTsgLy8gU3RyaXAgb2ZmICdnbCcgcHJlZml4CisgICAgICAgICAgICBuYW1lID0gbmFtZS5zdWJzdHJpbmcoMCwgMSkudG9Mb3dlckNhc2UoKSArCisgICAgICAgICAgICAgICAgbmFtZS5zdWJzdHJpbmcoMSwgbmFtZS5sZW5ndGgoKSk7CisgICAgICAgICAgICBvdXQucHJpbnQoImN0eC0+cHJvY3MuIik7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIG91dC5wcmludChuYW1lICsgKGlzUG9pbnRlckZ1bmMgPyAiQm91bmRzIiA6ICIiKSArICIoIik7CisKKyAgICAgICAgbnVtQXJncyA9IGNmdW5jLmdldE51bUFyZ3MoKTsgICAgCisgICAgICAgIGlmIChudW1BcmdzID09IDApIHsKKyAgICAgICAgICAgIGlmIChtVXNlQ29udGV4dFBvaW50ZXIpIHsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiY3R4KTsiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIik7Iik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAobVVzZUNvbnRleHRQb2ludGVyKSB7CisgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oImN0eCwiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQXJnczsgaSsrKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHR5cGVjYXN0OworICAgICAgICAgICAgICAgIGlmIChpID09IG51bUFyZ3MgLSAxICYmIGlzVkJPUG9pbnRlckZ1bmMpIHsKKyAgICAgICAgICAgICAgICAgICAgdHlwZWNhc3QgPSAiY29uc3QgR0x2b2lkICoiOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHR5cGVjYXN0ID0gY2Z1bmMuZ2V0QXJnVHlwZShpKS5nZXREZWNsYXJhdGlvbigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBvdXQucHJpbnQoaW5kZW50ICsgaW5kZW50ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIigiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZWNhc3QgKworICAgICAgICAgICAgICAgICAgICAgICAgICAiKSIgKworICAgICAgICAgICAgICAgICAgICAgICAgICBjZnVuYy5nZXRBcmdOYW1lKGkpKTsKKworICAgICAgICAgICAgICAgIGlmIChpID09IG51bUFyZ3MgLSAxKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChpc1BvaW50ZXJGdW5jKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiLCIpOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgaW5kZW50ICsgIihHTHNpemVpKXJlbWFpbmluZyIpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCIsIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgIik7Iik7CisgICAgICAgIH0KKworICAgICAgICBpZiAobmVlZHNFeGl0KSB7CisgICAgICAgICAgICBvdXQucHJpbnRsbigpOworICAgICAgICAgICAgb3V0LnByaW50bG4oImV4aXQ6Iik7CisgICAgICAgICAgICBuZWVkc0V4aXQgPSBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGJ1ZkFyZ0lkeCA9IDA7CisgICAgICAgIGlmIChub25QcmltaXRpdmVBcmdzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSBub25QcmltaXRpdmVBcmdzLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICAgICAgaW50IGlkeCA9IG5vblByaW1pdGl2ZUFyZ3MuZ2V0KGkpLmludFZhbHVlKCk7CisKKyAgICAgICAgICAgICAgICBpbnQgY0luZGV4ID0gamZ1bmMuZ2V0QXJnQ0luZGV4KGlkeCk7CisgICAgICAgICAgICAgICAgaWYgKGpmdW5jLmdldEFyZ1R5cGUoaWR4KS5pc0FycmF5KCkpIHsKKwkJICAgIAorICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgYXJndW1lbnQgaXMgJ2NvbnN0JywgR0wgd2lsbCBub3Qgd3JpdGUgdG8gaXQuCisgICAgICAgICAgICAgICAgICAgIC8vIEluIHRoaXMgY2FzZSwgd2UgY2FuIHVzZSB0aGUgJ0pOSV9BQk9SVCcgZmxhZyB0byBhdm9pZAorICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbmVlZCB0byB3cml0ZSBiYWNrIHRvIHRoZSBKYXZhIGFycmF5CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpZiAoIiArIGpmdW5jLmdldEFyZ05hbWUoaWR4KSArICJfYmFzZSkgeyIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKyBpbmRlbnQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobVVzZUNQbHVzUGx1cyA/ICJfZW52IiA6ICIoKl9lbnYpIikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLT5SZWxlYXNlUHJpbWl0aXZlQXJyYXlDcml0aWNhbCgiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1Vc2VDUGx1c1BsdXMgPyAiIiA6ICJfZW52LCAiKSArIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqZnVuYy5nZXRBcmdOYW1lKGlkeCkgKyAiX3JlZiwgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmdW5jLmdldEFyZ05hbWUoY0luZGV4KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJfYmFzZSwiKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgaW5kZW50ICsgaW5kZW50ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNmdW5jLmdldEFyZ1R5cGUoY0luZGV4KS5pc0NvbnN0KCkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkpOSV9BQk9SVCIgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl9leGNlcHRpb24gPyBKTklfQUJPUlQ6IDAiKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOyIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKyAifSIpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoamZ1bmMuZ2V0QXJnVHlwZShpZHgpLmlzQnVmZmVyKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGFycmF5ID0gbnVtQnVmZmVyQXJncyA8PSAxID8gIl9hcnJheSIgOgorICAgICAgICAgICAgICAgICAgICAgICAgIl8iICsgYnVmZmVyQXJnTmFtZXMuZ2V0KGJ1ZkFyZ0lkeCsrKSArICJBcnJheSI7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArICJpZiAoIiArIGFycmF5ICsgIikgeyIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKyBpbmRlbnQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVsZWFzZVBvaW50ZXIoX2VudiwgIiArIGFycmF5ICsgIiwgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmdW5jLmdldEFyZ05hbWUoY0luZGV4KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2Z1bmMuZ2V0QXJnVHlwZShjSW5kZXgpLmlzQ29uc3QoKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSk5JX0ZBTFNFIiA6ICJfZXhjZXB0aW9uID8gSk5JX0ZBTFNFIDogSk5JX1RSVUUiKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOyIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKyAifSIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICghaXNWb2lkKSB7CisgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKyAicmV0dXJuIF9yZXR1cm5WYWx1ZTsiKTsKKyAgICAgICAgfQorCisgICAgICAgIG91dC5wcmludGxuKCJ9Iik7CisgICAgICAgIG91dC5wcmludGxuKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkTmF0aXZlUmVnaXN0cmF0aW9uKFN0cmluZyBzKSB7CisgICAgICAgIG5hdGl2ZVJlZ2lzdHJhdGlvbnMuYWRkKHMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGVtaXROYXRpdmVSZWdpc3RyYXRpb24oKSB7CisgICAgICAgIG1DU3RyZWFtLnByaW50bG4oInN0YXRpYyBjb25zdCBjaGFyICpjbGFzc1BhdGhOYW1lID0gXCIiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1DbGFzc1BhdGhOYW1lICsKKyAgICAgICAgICAgICAgICAgICAgICAgICJcIjsiKTsKKyAgICAgICAgbUNTdHJlYW0ucHJpbnRsbigpOworCisgICAgICAgIG1DU3RyZWFtLnByaW50bG4oInN0YXRpYyBKTklOYXRpdmVNZXRob2QgbWV0aG9kc1tdID0geyIpOworCisgICAgICAgIG1DU3RyZWFtLnByaW50bG4oIntcIl9uYXRpdmVDbGFzc0luaXRcIiwgXCIoKVZcIiwgKHZvaWQqKW5hdGl2ZUNsYXNzSW5pdCB9LCIpOworCisgICAgICAgIEl0ZXJhdG9yPFN0cmluZz4gaSA9IG5hdGl2ZVJlZ2lzdHJhdGlvbnMuaXRlcmF0b3IoKTsKKyAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBtQ1N0cmVhbS5wcmludGxuKGkubmV4dCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIG1DU3RyZWFtLnByaW50bG4oIn07Iik7CisgICAgICAgIG1DU3RyZWFtLnByaW50bG4oKTsKKyAgICAKKworICAgICAgICBtQ1N0cmVhbS5wcmludGxuKCJpbnQgcmVnaXN0ZXJfY29tX2dvb2dsZV9hbmRyb2lkX2dsZXNfam5pX0dMSW1wbChKTklFbnYgKl9lbnYpIik7CisgICAgICAgIG1DU3RyZWFtLnByaW50bG4oInsiKTsKKyAgICAgICAgbUNTdHJlYW0ucHJpbnRsbihpbmRlbnQgKworICAgICAgICAgICAgICAgICAgICAgICAgImludCBlcnI7Iik7CisKKyAgICAgICAgbUNTdHJlYW0ucHJpbnRsbihpbmRlbnQgKworICAgICAgICAgICAgICAgICAgICAgICAgImVyciA9IGFuZHJvaWQ6OkFuZHJvaWRSdW50aW1lOjpyZWdpc3Rlck5hdGl2ZU1ldGhvZHMoX2VudiwgY2xhc3NQYXRoTmFtZSwgbWV0aG9kcywgTkVMRU0obWV0aG9kcykpOyIpOworCisgICAgICAgIG1DU3RyZWFtLnByaW50bG4oaW5kZW50ICsgInJldHVybiBlcnI7Iik7CisgICAgICAgIG1DU3RyZWFtLnByaW50bG4oIn0iKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3JjL1BhcmFtZXRlckNoZWNrZXIuamF2YSBiL29wZW5nbC90b29scy9nbGdlbi9zcmMvUGFyYW1ldGVyQ2hlY2tlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmMjZhY2QKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3JjL1BhcmFtZXRlckNoZWNrZXIuamF2YQpAQCAtMCwwICsxLDI4IEBACisKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworCitwdWJsaWMgY2xhc3MgUGFyYW1ldGVyQ2hlY2tlciB7CisKKyAgICBIYXNoTWFwPFN0cmluZyxTdHJpbmdbXT4gbWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLFN0cmluZ1tdPigpOworCisgICAgcHVibGljIFBhcmFtZXRlckNoZWNrZXIoQnVmZmVyZWRSZWFkZXIgcmVhZGVyKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIHM7CisgICAgICAgIHdoaWxlICgocyA9IHJlYWRlci5yZWFkTGluZSgpKSAhPSBudWxsKSB7CisgICAgICAgICAgICBTdHJpbmdbXSB0b2tlbnMgPSBzLnNwbGl0KCJcXHMiKTsKKyAgICAgICAgICAgIG1hcC5wdXQodG9rZW5zWzBdLCB0b2tlbnMpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIFN0cmluZ1tdIGdldENoZWNrcyhTdHJpbmcgZnVuY3Rpb25OYW1lKSB7CisgICAgICAgIFN0cmluZ1tdIGNoZWNrcyA9IG1hcC5nZXQoZnVuY3Rpb25OYW1lKTsKKyAgICAgICAgaWYgKGNoZWNrcyA9PSBudWxsICYmCisgICAgICAgICAgICAoZnVuY3Rpb25OYW1lLmVuZHNXaXRoKCJmdiIpIHx8CisgICAgICAgICAgICAgZnVuY3Rpb25OYW1lLmVuZHNXaXRoKCJ4diIpIHx8CisgICAgICAgICAgICAgZnVuY3Rpb25OYW1lLmVuZHNXaXRoKCJpdiIpKSkgeworICAgICAgICAgICAgZnVuY3Rpb25OYW1lID0gZnVuY3Rpb25OYW1lLnN1YnN0cmluZygwLCBmdW5jdGlvbk5hbWUubGVuZ3RoKCkgLSAyKTsKKyAgICAgICAgICAgIGNoZWNrcyA9IG1hcC5nZXQoZnVuY3Rpb25OYW1lKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY2hlY2tzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9HTDEwRXh0SGVhZGVyLmphdmEtaWYgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvR0wxMEV4dEhlYWRlci5qYXZhLWlmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwOTk5YzIKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvR0wxMEV4dEhlYWRlci5qYXZhLWlmCkBAIC0wLDAgKzEsMjIgQEAKKyoqCisqKiBDb3B5cmlnaHQgMjAwNywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisvLyBUaGlzIHNvdXJjZSBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkCisKK3BhY2thZ2UgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXM7CisKK3B1YmxpYyBpbnRlcmZhY2UgR0wxMEV4dCBleHRlbmRzIEdMIHsKKwpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL0dMMTBIZWFkZXIuamF2YS1pZiBiL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9HTDEwSGVhZGVyLmphdmEtaWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM5MjgyMQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9HTDEwSGVhZGVyLmphdmEtaWYKQEAgLTAsMCArMSwyNTkgQEAKKyoqCisqKiBDb3B5cmlnaHQgMjAwNiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisvLyBUaGlzIHNvdXJjZSBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkCisKK3BhY2thZ2UgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXM7CisKK3B1YmxpYyBpbnRlcmZhY2UgR0wxMCBleHRlbmRzIEdMIHsKKyAgICBpbnQgR0xfQUREICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDEwNDsKKyAgICBpbnQgR0xfQUxJQVNFRF9MSU5FX1dJRFRIX1JBTkdFICAgICAgICAgICAgICA9IDB4ODQ2RTsKKyAgICBpbnQgR0xfQUxJQVNFRF9QT0lOVF9TSVpFX1JBTkdFICAgICAgICAgICAgICA9IDB4ODQ2RDsKKyAgICBpbnQgR0xfQUxQSEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTkwNjsKKyAgICBpbnQgR0xfQUxQSEFfQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEQ1NTsKKyAgICBpbnQgR0xfQUxQSEFfVEVTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEJDMDsKKyAgICBpbnQgR0xfQUxXQVlTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDIwNzsKKyAgICBpbnQgR0xfQU1CSUVOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTIwMDsKKyAgICBpbnQgR0xfQU1CSUVOVF9BTkRfRElGRlVTRSAgICAgICAgICAgICAgICAgICA9IDB4MTYwMjsKKyAgICBpbnQgR0xfQU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTUwMTsKKyAgICBpbnQgR0xfQU5EX0lOVkVSVEVEICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTUwNDsKKyAgICBpbnQgR0xfQU5EX1JFVkVSU0UgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTUwMjsKKyAgICBpbnQgR0xfQkFDSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDQwNTsKKyAgICBpbnQgR0xfQkxFTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEJFMjsKKyAgICBpbnQgR0xfQkxVRV9CSVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEQ1NDsKKyAgICBpbnQgR0xfQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTQwMDsKKyAgICBpbnQgR0xfQ0NXICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDkwMTsKKyAgICBpbnQgR0xfQ0xBTVBfVE9fRURHRSAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODEyRjsKKyAgICBpbnQgR0xfQ0xFQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTUwMDsKKyAgICBpbnQgR0xfQ09MT1JfQVJSQVkgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODA3NjsKKyAgICBpbnQgR0xfQ09MT1JfQlVGRkVSX0JJVCAgICAgICAgICAgICAgICAgICAgICA9IDB4NDAwMDsKKyAgICBpbnQgR0xfQ09MT1JfTE9HSUNfT1AgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEJGMjsKKyAgICBpbnQgR0xfQ09MT1JfTUFURVJJQUwgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEI1NzsKKyAgICBpbnQgR0xfQ09NUFJFU1NFRF9URVhUVVJFX0ZPUk1BVFMgICAgICAgICAgICA9IDB4ODZBMzsKKyAgICBpbnQgR0xfQ09OU1RBTlRfQVRURU5VQVRJT04gICAgICAgICAgICAgICAgICA9IDB4MTIwNzsKKyAgICBpbnQgR0xfQ09QWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTUwMzsKKyAgICBpbnQgR0xfQ09QWV9JTlZFUlRFRCAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTUwQzsKKyAgICBpbnQgR0xfQ1VMTF9GQUNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEI0NDsKKyAgICBpbnQgR0xfQ1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDkwMDsKKyAgICBpbnQgR0xfREVDQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MjEwMTsKKyAgICBpbnQgR0xfREVDUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MUUwMzsKKyAgICBpbnQgR0xfREVQVEhfQklUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEQ1NjsKKyAgICBpbnQgR0xfREVQVEhfQlVGRkVSX0JJVCAgICAgICAgICAgICAgICAgICAgICA9IDB4MDEwMDsKKyAgICBpbnQgR0xfREVQVEhfVEVTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEI3MTsKKyAgICBpbnQgR0xfRElGRlVTRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTIwMTsKKyAgICBpbnQgR0xfRElUSEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEJEMDsKKyAgICBpbnQgR0xfRE9OVF9DQVJFICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTEwMDsKKyAgICBpbnQgR0xfRFNUX0FMUEhBICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDMwNDsKKyAgICBpbnQgR0xfRFNUX0NPTE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDMwNjsKKyAgICBpbnQgR0xfRU1JU1NJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTYwMDsKKyAgICBpbnQgR0xfRVFVQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDIwMjsKKyAgICBpbnQgR0xfRVFVSVYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTUwOTsKKyAgICBpbnQgR0xfRVhQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDgwMDsKKyAgICBpbnQgR0xfRVhQMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDgwMTsKKyAgICBpbnQgR0xfRVhURU5TSU9OUyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MUYwMzsKKyAgICBpbnQgR0xfRkFMU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDA7CisgICAgaW50IEdMX0ZBU1RFU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDExMDE7CisgICAgaW50IEdMX0ZJWEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE0MEM7CisgICAgaW50IEdMX0ZMQVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDFEMDA7CisgICAgaW50IEdMX0ZMT0FUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE0MDY7CisgICAgaW50IEdMX0ZPRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCNjA7CisgICAgaW50IEdMX0ZPR19DT0xPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCNjY7CisgICAgaW50IEdMX0ZPR19ERU5TSVRZICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCNjI7CisgICAgaW50IEdMX0ZPR19FTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCNjQ7CisgICAgaW50IEdMX0ZPR19ISU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBDNTQ7CisgICAgaW50IEdMX0ZPR19NT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCNjU7CisgICAgaW50IEdMX0ZPR19TVEFSVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCNjM7CisgICAgaW50IEdMX0ZST05UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDA0MDQ7CisgICAgaW50IEdMX0ZST05UX0FORF9CQUNLICAgICAgICAgICAgICAgICAgICAgICAgPSAweDA0MDg7CisgICAgaW50IEdMX0dFUVVBTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAyMDY7CisgICAgaW50IEdMX0dSRUFURVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAyMDQ7CisgICAgaW50IEdMX0dSRUVOX0JJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBENTM7CisgICAgaW50IEdMX0lNUExFTUVOVEFUSU9OX0NPTE9SX1JFQURfRk9STUFUX09FUyAgPSAweDhCOUI7CisgICAgaW50IEdMX0lNUExFTUVOVEFUSU9OX0NPTE9SX1JFQURfVFlQRV9PRVMgICAgPSAweDhCOUE7CisgICAgaW50IEdMX0lOQ1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDFFMDI7CisgICAgaW50IEdMX0lOVkFMSURfRU5VTSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDA1MDA7CisgICAgaW50IEdMX0lOVkFMSURfT1BFUkFUSU9OICAgICAgICAgICAgICAgICAgICAgPSAweDA1MDI7CisgICAgaW50IEdMX0lOVkFMSURfVkFMVUUgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDA1MDE7CisgICAgaW50IEdMX0lOVkVSVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE1MEE7CisgICAgaW50IEdMX0tFRVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDFFMDA7CisgICAgaW50IEdMX0xFUVVBTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAyMDM7CisgICAgaW50IEdMX0xFU1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAyMDE7CisgICAgaW50IEdMX0xJR0hUX01PREVMX0FNQklFTlQgICAgICAgICAgICAgICAgICAgPSAweDBCNTM7CisgICAgaW50IEdMX0xJR0hUX01PREVMX1RXT19TSURFICAgICAgICAgICAgICAgICAgPSAweDBCNTI7CisgICAgaW50IEdMX0xJR0hUMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDQwMDA7CisgICAgaW50IEdMX0xJR0hUMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDQwMDE7CisgICAgaW50IEdMX0xJR0hUMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDQwMDI7CisgICAgaW50IEdMX0xJR0hUMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDQwMDM7CisgICAgaW50IEdMX0xJR0hUNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDQwMDQ7CisgICAgaW50IEdMX0xJR0hUNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDQwMDU7CisgICAgaW50IEdMX0xJR0hUNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDQwMDY7CisgICAgaW50IEdMX0xJR0hUNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDQwMDc7CisgICAgaW50IEdMX0xJR0hUSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCNTA7CisgICAgaW50IEdMX0xJTkVfTE9PUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDI7CisgICAgaW50IEdMX0xJTkVfU01PT1RIICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCMjA7CisgICAgaW50IEdMX0xJTkVfU01PT1RIX0hJTlQgICAgICAgICAgICAgICAgICAgICAgPSAweDBDNTI7CisgICAgaW50IEdMX0xJTkVfU1RSSVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDM7CisgICAgaW50IEdMX0xJTkVBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDI2MDE7CisgICAgaW50IEdMX0xJTkVBUl9BVFRFTlVBVElPTiAgICAgICAgICAgICAgICAgICAgPSAweDEyMDg7CisgICAgaW50IEdMX0xJTkVBUl9NSVBNQVBfTElORUFSICAgICAgICAgICAgICAgICAgPSAweDI3MDM7CisgICAgaW50IEdMX0xJTkVBUl9NSVBNQVBfTkVBUkVTVCAgICAgICAgICAgICAgICAgPSAweDI3MDE7CisgICAgaW50IEdMX0xJTkVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDE7CisgICAgaW50IEdMX0xVTUlOQU5DRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE5MDk7CisgICAgaW50IEdMX0xVTUlOQU5DRV9BTFBIQSAgICAgICAgICAgICAgICAgICAgICAgPSAweDE5MEE7CisgICAgaW50IEdMX01BWF9FTEVNRU5UU19JTkRJQ0VTICAgICAgICAgICAgICAgICAgPSAweDgwRTk7CisgICAgaW50IEdMX01BWF9FTEVNRU5UU19WRVJUSUNFUyAgICAgICAgICAgICAgICAgPSAweDgwRTg7CisgICAgaW50IEdMX01BWF9MSUdIVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBEMzE7CisgICAgaW50IEdMX01BWF9NT0RFTFZJRVdfU1RBQ0tfREVQVEggICAgICAgICAgICAgPSAweDBEMzY7CisgICAgaW50IEdMX01BWF9QUk9KRUNUSU9OX1NUQUNLX0RFUFRIICAgICAgICAgICAgPSAweDBEMzg7CisgICAgaW50IEdMX01BWF9URVhUVVJFX1NJWkUgICAgICAgICAgICAgICAgICAgICAgPSAweDBEMzM7CisgICAgaW50IEdMX01BWF9URVhUVVJFX1NUQUNLX0RFUFRIICAgICAgICAgICAgICAgPSAweDBEMzk7CisgICAgaW50IEdMX01BWF9URVhUVVJFX1VOSVRTICAgICAgICAgICAgICAgICAgICAgPSAweDg0RTI7CisgICAgaW50IEdMX01BWF9WSUVXUE9SVF9ESU1TICAgICAgICAgICAgICAgICAgICAgPSAweDBEM0E7CisgICAgaW50IEdMX01PREVMVklFVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE3MDA7CisgICAgaW50IEdMX01PRFVMQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDIxMDA7CisgICAgaW50IEdMX01VTFRJU0FNUExFICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwOUQ7CisgICAgaW50IEdMX05BTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE1MEU7CisgICAgaW50IEdMX05FQVJFU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDI2MDA7CisgICAgaW50IEdMX05FQVJFU1RfTUlQTUFQX0xJTkVBUiAgICAgICAgICAgICAgICAgPSAweDI3MDI7CisgICAgaW50IEdMX05FQVJFU1RfTUlQTUFQX05FQVJFU1QgICAgICAgICAgICAgICAgPSAweDI3MDA7CisgICAgaW50IEdMX05FVkVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAyMDA7CisgICAgaW50IEdMX05JQ0VTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDExMDI7CisgICAgaW50IEdMX05PX0VSUk9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwOworICAgIGludCBHTF9OT09QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNTA1OworICAgIGludCBHTF9OT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNTA4OworICAgIGludCBHTF9OT1JNQUxfQVJSQVkgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MDc1OworICAgIGludCBHTF9OT1JNQUxJWkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQkExOworICAgIGludCBHTF9OT1RFUVVBTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMjA1OworICAgIGludCBHTF9OVU1fQ09NUFJFU1NFRF9URVhUVVJFX0ZPUk1BVFMgICAgICAgID0gMHg4NkEyOworICAgIGludCBHTF9PTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMTsKKyAgICBpbnQgR0xfT05FX01JTlVTX0RTVF9BTFBIQSAgICAgICAgICAgICAgICAgICA9IDB4MDMwNTsKKyAgICBpbnQgR0xfT05FX01JTlVTX0RTVF9DT0xPUiAgICAgICAgICAgICAgICAgICA9IDB4MDMwNzsKKyAgICBpbnQgR0xfT05FX01JTlVTX1NSQ19BTFBIQSAgICAgICAgICAgICAgICAgICA9IDB4MDMwMzsKKyAgICBpbnQgR0xfT05FX01JTlVTX1NSQ19DT0xPUiAgICAgICAgICAgICAgICAgICA9IDB4MDMwMTsKKyAgICBpbnQgR0xfT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTUwNzsKKyAgICBpbnQgR0xfT1JfSU5WRVJURUQgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTUwRDsKKyAgICBpbnQgR0xfT1JfUkVWRVJTRSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTUwQjsKKyAgICBpbnQgR0xfT1VUX09GX01FTU9SWSAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDUwNTsKKyAgICBpbnQgR0xfUEFDS19BTElHTk1FTlQgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEQwNTsKKyAgICBpbnQgR0xfUEFMRVRURTRfUjVfRzZfQjVfT0VTICAgICAgICAgICAgICAgICA9IDB4OEI5MjsKKyAgICBpbnQgR0xfUEFMRVRURTRfUkdCNV9BMV9PRVMgICAgICAgICAgICAgICAgICA9IDB4OEI5NDsKKyAgICBpbnQgR0xfUEFMRVRURTRfUkdCOF9PRVMgICAgICAgICAgICAgICAgICAgICA9IDB4OEI5MDsKKyAgICBpbnQgR0xfUEFMRVRURTRfUkdCQTRfT0VTICAgICAgICAgICAgICAgICAgICA9IDB4OEI5MzsKKyAgICBpbnQgR0xfUEFMRVRURTRfUkdCQThfT0VTICAgICAgICAgICAgICAgICAgICA9IDB4OEI5MTsKKyAgICBpbnQgR0xfUEFMRVRURThfUjVfRzZfQjVfT0VTICAgICAgICAgICAgICAgICA9IDB4OEI5NzsKKyAgICBpbnQgR0xfUEFMRVRURThfUkdCNV9BMV9PRVMgICAgICAgICAgICAgICAgICA9IDB4OEI5OTsKKyAgICBpbnQgR0xfUEFMRVRURThfUkdCOF9PRVMgICAgICAgICAgICAgICAgICAgICA9IDB4OEI5NTsKKyAgICBpbnQgR0xfUEFMRVRURThfUkdCQTRfT0VTICAgICAgICAgICAgICAgICAgICA9IDB4OEI5ODsKKyAgICBpbnQgR0xfUEFMRVRURThfUkdCQThfT0VTICAgICAgICAgICAgICAgICAgICA9IDB4OEI5NjsKKyAgICBpbnQgR0xfUEVSU1BFQ1RJVkVfQ09SUkVDVElPTl9ISU5UICAgICAgICAgICA9IDB4MEM1MDsKKyAgICBpbnQgR0xfUE9JTlRfU01PT1RIICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEIxMDsKKyAgICBpbnQgR0xfUE9JTlRfU01PT1RIX0hJTlQgICAgICAgICAgICAgICAgICAgICA9IDB4MEM1MTsKKyAgICBpbnQgR0xfUE9JTlRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDsKKyAgICBpbnQgR0xfUE9JTlRfRkFERV9USFJFU0hPTERfU0laRSAgICAgICAgICAgICA9IDB4ODEyODsKKyAgICBpbnQgR0xfUE9JTlRfU0laRSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEIxMTsKKyAgICBpbnQgR0xfUE9MWUdPTl9PRkZTRVRfRklMTCAgICAgICAgICAgICAgICAgICA9IDB4ODAzNzsKKyAgICBpbnQgR0xfUE9MWUdPTl9TTU9PVEhfSElOVCAgICAgICAgICAgICAgICAgICA9IDB4MEM1MzsKKyAgICBpbnQgR0xfUE9TSVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTIwMzsKKyAgICBpbnQgR0xfUFJPSkVDVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTcwMTsKKyAgICBpbnQgR0xfUVVBRFJBVElDX0FUVEVOVUFUSU9OICAgICAgICAgICAgICAgICA9IDB4MTIwOTsKKyAgICBpbnQgR0xfUkVEX0JJVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEQ1MjsKKyAgICBpbnQgR0xfUkVOREVSRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MUYwMTsKKyAgICBpbnQgR0xfUkVQRUFUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MjkwMTsKKyAgICBpbnQgR0xfUkVQTEFDRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MUUwMTsKKyAgICBpbnQgR0xfUkVTQ0FMRV9OT1JNQUwgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODAzQTsKKyAgICBpbnQgR0xfUkdCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTkwNzsKKyAgICBpbnQgR0xfUkdCQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTkwODsKKyAgICBpbnQgR0xfU0FNUExFX0FMUEhBX1RPX0NPVkVSQUdFICAgICAgICAgICAgICA9IDB4ODA5RTsKKyAgICBpbnQgR0xfU0FNUExFX0FMUEhBX1RPX09ORSAgICAgICAgICAgICAgICAgICA9IDB4ODA5RjsKKyAgICBpbnQgR0xfU0FNUExFX0NPVkVSQUdFICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODBBMDsKKyAgICBpbnQgR0xfU0NJU1NPUl9URVNUICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEMxMTsKKyAgICBpbnQgR0xfU0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTUwRjsKKyAgICBpbnQgR0xfU0hJTklORVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTYwMTsKKyAgICBpbnQgR0xfU0hPUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTQwMjsKKyAgICBpbnQgR0xfU01PT1RIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MUQwMTsKKyAgICBpbnQgR0xfU01PT1RIX0xJTkVfV0lEVEhfUkFOR0UgICAgICAgICAgICAgICA9IDB4MEIyMjsKKyAgICBpbnQgR0xfU01PT1RIX1BPSU5UX1NJWkVfUkFOR0UgICAgICAgICAgICAgICA9IDB4MEIxMjsKKyAgICBpbnQgR0xfU1BFQ1VMQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTIwMjsKKyAgICBpbnQgR0xfU1BPVF9DVVRPRkYgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTIwNjsKKyAgICBpbnQgR0xfU1BPVF9ESVJFQ1RJT04gICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTIwNDsKKyAgICBpbnQgR0xfU1BPVF9FWFBPTkVOVCAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTIwNTsKKyAgICBpbnQgR0xfU1JDX0FMUEhBICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDMwMjsKKyAgICBpbnQgR0xfU1JDX0FMUEhBX1NBVFVSQVRFICAgICAgICAgICAgICAgICAgICA9IDB4MDMwODsKKyAgICBpbnQgR0xfU1JDX0NPTE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDMwMDsKKyAgICBpbnQgR0xfU1RBQ0tfT1ZFUkZMT1cgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDUwMzsKKyAgICBpbnQgR0xfU1RBQ0tfVU5ERVJGTE9XICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDUwNDsKKyAgICBpbnQgR0xfU1RFTkNJTF9CSVRTICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEQ1NzsKKyAgICBpbnQgR0xfU1RFTkNJTF9CVUZGRVJfQklUICAgICAgICAgICAgICAgICAgICA9IDB4MDQwMDsKKyAgICBpbnQgR0xfU1RFTkNJTF9URVNUICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEI5MDsKKyAgICBpbnQgR0xfU1VCUElYRUxfQklUUyAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEQ1MDsKKyAgICBpbnQgR0xfVEVYVFVSRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTcwMjsKKyAgICBpbnQgR0xfVEVYVFVSRV8yRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MERFMTsKKyAgICBpbnQgR0xfVEVYVFVSRV9DT09SRF9BUlJBWSAgICAgICAgICAgICAgICAgICA9IDB4ODA3ODsKKyAgICBpbnQgR0xfVEVYVFVSRV9FTlYgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MjMwMDsKKyAgICBpbnQgR0xfVEVYVFVSRV9FTlZfQ09MT1IgICAgICAgICAgICAgICAgICAgICA9IDB4MjIwMTsKKyAgICBpbnQgR0xfVEVYVFVSRV9FTlZfTU9ERSAgICAgICAgICAgICAgICAgICAgICA9IDB4MjIwMDsKKyAgICBpbnQgR0xfVEVYVFVSRV9NQUdfRklMVEVSICAgICAgICAgICAgICAgICAgICA9IDB4MjgwMDsKKyAgICBpbnQgR0xfVEVYVFVSRV9NSU5fRklMVEVSICAgICAgICAgICAgICAgICAgICA9IDB4MjgwMTsKKyAgICBpbnQgR0xfVEVYVFVSRV9XUkFQX1MgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MjgwMjsKKyAgICBpbnQgR0xfVEVYVFVSRV9XUkFQX1QgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MjgwMzsKKyAgICBpbnQgR0xfVEVYVFVSRTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODRDMDsKKyAgICBpbnQgR0xfVEVYVFVSRTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODRDMTsKKyAgICBpbnQgR0xfVEVYVFVSRTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODRDMjsKKyAgICBpbnQgR0xfVEVYVFVSRTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODRDMzsKKyAgICBpbnQgR0xfVEVYVFVSRTQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODRDNDsKKyAgICBpbnQgR0xfVEVYVFVSRTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODRDNTsKKyAgICBpbnQgR0xfVEVYVFVSRTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODRDNjsKKyAgICBpbnQgR0xfVEVYVFVSRTcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODRDNzsKKyAgICBpbnQgR0xfVEVYVFVSRTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODRDODsKKyAgICBpbnQgR0xfVEVYVFVSRTkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODRDOTsKKyAgICBpbnQgR0xfVEVYVFVSRTEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODRDQTsKKyAgICBpbnQgR0xfVEVYVFVSRTExICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODRDQjsKKyAgICBpbnQgR0xfVEVYVFVSRTEyICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODRDQzsKKyAgICBpbnQgR0xfVEVYVFVSRTEzICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODRDRDsKKyAgICBpbnQgR0xfVEVYVFVSRTE0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODRDRTsKKyAgICBpbnQgR0xfVEVYVFVSRTE1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODRDRjsKKyAgICBpbnQgR0xfVEVYVFVSRTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODREMDsKKyAgICBpbnQgR0xfVEVYVFVSRTE3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODREMTsKKyAgICBpbnQgR0xfVEVYVFVSRTE4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODREMjsKKyAgICBpbnQgR0xfVEVYVFVSRTE5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODREMzsKKyAgICBpbnQgR0xfVEVYVFVSRTIwICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODRENDsKKyAgICBpbnQgR0xfVEVYVFVSRTIxICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODRENTsKKyAgICBpbnQgR0xfVEVYVFVSRTIyICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODRENjsKKyAgICBpbnQgR0xfVEVYVFVSRTIzICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODRENzsKKyAgICBpbnQgR0xfVEVYVFVSRTI0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODREODsKKyAgICBpbnQgR0xfVEVYVFVSRTI1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODREOTsKKyAgICBpbnQgR0xfVEVYVFVSRTI2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODREQTsKKyAgICBpbnQgR0xfVEVYVFVSRTI3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODREQjsKKyAgICBpbnQgR0xfVEVYVFVSRTI4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODREQzsKKyAgICBpbnQgR0xfVEVYVFVSRTI5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODRERDsKKyAgICBpbnQgR0xfVEVYVFVSRTMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODRERTsKKyAgICBpbnQgR0xfVEVYVFVSRTMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODRERjsKKyAgICBpbnQgR0xfVFJJQU5HTEVfRkFOICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwNjsKKyAgICBpbnQgR0xfVFJJQU5HTEVfU1RSSVAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwNTsKKyAgICBpbnQgR0xfVFJJQU5HTEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDAwNDsKKyAgICBpbnQgR0xfVFJVRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDE7CisgICAgaW50IEdMX1VOUEFDS19BTElHTk1FTlQgICAgICAgICAgICAgICAgICAgICAgPSAweDBDRjU7CisgICAgaW50IEdMX1VOU0lHTkVEX0JZVEUgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE0MDE7CisgICAgaW50IEdMX1VOU0lHTkVEX1NIT1JUICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE0MDM7CisgICAgaW50IEdMX1VOU0lHTkVEX1NIT1JUXzRfNF80XzQgICAgICAgICAgICAgICAgPSAweDgwMzM7CisgICAgaW50IEdMX1VOU0lHTkVEX1NIT1JUXzVfNV81XzEgICAgICAgICAgICAgICAgPSAweDgwMzQ7CisgICAgaW50IEdMX1VOU0lHTkVEX1NIT1JUXzVfNl81ICAgICAgICAgICAgICAgICAgPSAweDgzNjM7CisgICAgaW50IEdMX1ZFTkRPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDFGMDA7CisgICAgaW50IEdMX1ZFUlNJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDFGMDI7CisgICAgaW50IEdMX1ZFUlRFWF9BUlJBWSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwNzQ7CisgICAgaW50IEdMX1hPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE1MDY7CisgICAgaW50IEdMX1pFUk8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwOworCmRpZmYgLS1naXQgYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvR0wxMUV4dEhlYWRlci5qYXZhLWlmIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL0dMMTFFeHRIZWFkZXIuamF2YS1pZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmUyMTY0Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL0dMMTFFeHRIZWFkZXIuamF2YS1pZgpAQCAtMCwwICsxLDQwIEBACisqKgorKiogQ29weXJpZ2h0IDIwMDcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworLy8gVGhpcyBzb3VyY2UgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZAorCitwYWNrYWdlIGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzOworCitwdWJsaWMgaW50ZXJmYWNlIEdMMTFFeHQgZXh0ZW5kcyBHTCB7CisgICAgaW50IEdMX01BVFJJWF9JTkRFWF9BUlJBWV9CVUZGRVJfQklORElOR19PRVMgPSAweDhCOUU7CisgICAgaW50IEdMX01BVFJJWF9JTkRFWF9BUlJBWV9PRVMgICAgICAgICAgICAgICAgPSAweDg4NDQ7CisgICAgaW50IEdMX01BVFJJWF9JTkRFWF9BUlJBWV9QT0lOVEVSX09FUyAgICAgICAgPSAweDg4NDk7CisgICAgaW50IEdMX01BVFJJWF9JTkRFWF9BUlJBWV9TSVpFX09FUyAgICAgICAgICAgPSAweDg4NDY7CisgICAgaW50IEdMX01BVFJJWF9JTkRFWF9BUlJBWV9TVFJJREVfT0VTICAgICAgICAgPSAweDg4NDg7CisgICAgaW50IEdMX01BVFJJWF9JTkRFWF9BUlJBWV9UWVBFX09FUyAgICAgICAgICAgPSAweDg4NDc7CisgICAgaW50IEdMX01BVFJJWF9QQUxFVFRFX09FUyAgICAgICAgICAgICAgICAgICAgPSAweDg4NDA7CisgICAgaW50IEdMX01BWF9QQUxFVFRFX01BVFJJQ0VTX09FUyAgICAgICAgICAgICAgPSAweDg4NDI7CisgICAgaW50IEdMX01BWF9WRVJURVhfVU5JVFNfT0VTICAgICAgICAgICAgICAgICAgPSAweDg2QTQ7CisgICAgaW50IEdMX1RFWFRVUkVfQ1JPUF9SRUNUX09FUyAgICAgICAgICAgICAgICAgPSAweDhCOUQ7CisgICAgaW50IEdMX1dFSUdIVF9BUlJBWV9CVUZGRVJfQklORElOR19PRVMgICAgICAgPSAweDg4OUU7CisgICAgaW50IEdMX1dFSUdIVF9BUlJBWV9PRVMgICAgICAgICAgICAgICAgICAgICAgPSAweDg2QUQ7CisgICAgaW50IEdMX1dFSUdIVF9BUlJBWV9QT0lOVEVSX09FUyAgICAgICAgICAgICAgPSAweDg2QUM7CisgICAgaW50IEdMX1dFSUdIVF9BUlJBWV9TSVpFX09FUyAgICAgICAgICAgICAgICAgPSAweDg2QUI7CisgICAgaW50IEdMX1dFSUdIVF9BUlJBWV9TVFJJREVfT0VTICAgICAgICAgICAgICAgPSAweDg2QUE7CisgICAgaW50IEdMX1dFSUdIVF9BUlJBWV9UWVBFX09FUyAgICAgICAgICAgICAgICAgPSAweDg2QTk7CisKKyAgICB2b2lkIGdsVGV4UGFyYW1ldGVyZnYoaW50IHRhcmdldCwgaW50IHBuYW1lLCBmbG9hdFtdIHBhcmFtLCBpbnQgb2Zmc2V0KTsKKwpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL0dMMTFFeHRlbnNpb25QYWNrSGVhZGVyLmphdmEtaWYgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvR0wxMUV4dGVuc2lvblBhY2tIZWFkZXIuamF2YS1pZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODAwMTkxCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL0dMMTFFeHRlbnNpb25QYWNrSGVhZGVyLmphdmEtaWYKQEAgLTAsMCArMSwxMDggQEAKKyoqCisqKiBDb3B5cmlnaHQgMjAwNywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIAorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisvLyBUaGlzIHNvdXJjZSBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkCisKK3BhY2thZ2UgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXM7CisKK3B1YmxpYyBpbnRlcmZhY2UgR0wxMUV4dGVuc2lvblBhY2sgZXh0ZW5kcyBHTCB7CisgICAgaW50IEdMX0JMRU5EX0RTVF9BTFBIQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODBDQTsKKyAgICBpbnQgR0xfQkxFTkRfRFNUX1JHQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MEM4OworICAgIGludCBHTF9CTEVORF9FUVVBVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwMDk7CisgICAgaW50IEdMX0JMRU5EX0VRVUFUSU9OX0FMUEhBICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODgzRDsKKyAgICBpbnQgR0xfQkxFTkRfRVFVQVRJT05fUkdCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MDA5OworICAgIGludCBHTF9CTEVORF9TUkNfQUxQSEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwQ0I7CisgICAgaW50IEdMX0JMRU5EX1NSQ19SR0IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODBDOTsKKyAgICBpbnQgR0xfQ09MT1JfQVRUQUNITUVOVDBfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4Q0UwOworICAgIGludCBHTF9DT0xPUl9BVFRBQ0hNRU5UMV9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhDRTE7CisgICAgaW50IEdMX0NPTE9SX0FUVEFDSE1FTlQyX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OENFMjsKKyAgICBpbnQgR0xfQ09MT1JfQVRUQUNITUVOVDNfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4Q0UzOworICAgIGludCBHTF9DT0xPUl9BVFRBQ0hNRU5UNF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhDRTQ7CisgICAgaW50IEdMX0NPTE9SX0FUVEFDSE1FTlQ1X09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OENFNTsKKyAgICBpbnQgR0xfQ09MT1JfQVRUQUNITUVOVDZfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4Q0U2OworICAgIGludCBHTF9DT0xPUl9BVFRBQ0hNRU5UN19PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhDRTc7CisgICAgaW50IEdMX0NPTE9SX0FUVEFDSE1FTlQ4X09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OENFODsKKyAgICBpbnQgR0xfQ09MT1JfQVRUQUNITUVOVDlfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4Q0U5OworICAgIGludCBHTF9DT0xPUl9BVFRBQ0hNRU5UMTBfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhDRUE7CisgICAgaW50IEdMX0NPTE9SX0FUVEFDSE1FTlQxMV9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OENFQjsKKyAgICBpbnQgR0xfQ09MT1JfQVRUQUNITUVOVDEyX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4Q0VDOworICAgIGludCBHTF9DT0xPUl9BVFRBQ0hNRU5UMTNfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhDRUQ7CisgICAgaW50IEdMX0NPTE9SX0FUVEFDSE1FTlQxNF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OENFRTsKKyAgICBpbnQgR0xfQ09MT1JfQVRUQUNITUVOVDE1X09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4Q0VGOworICAgIGludCBHTF9ERUNSX1dSQVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg1MDg7CisgICAgaW50IEdMX0RFUFRIX0FUVEFDSE1FTlRfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OEQwMDsKKyAgICBpbnQgR0xfREVQVEhfQ09NUE9ORU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxOTAyOworICAgIGludCBHTF9ERVBUSF9DT01QT05FTlQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgxQTU7CisgICAgaW50IEdMX0RFUFRIX0NPTVBPTkVOVDI0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODFBNjsKKyAgICBpbnQgR0xfREVQVEhfQ09NUE9ORU5UMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MUE3OworICAgIGludCBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX09CSkVDVF9OQU1FX09FUyAgICAgICAgICAgPSAweDhDRDE7CisgICAgaW50IEdMX0ZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfT0JKRUNUX1RZUEVfT0VTICAgICAgICAgICA9IDB4OENEMDsKKyAgICBpbnQgR0xfRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9URVhUVVJFX0NVQkVfTUFQX0ZBQ0VfT0VTID0gMHg4Q0QzOworICAgIGludCBHTF9GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX1RFWFRVUkVfTEVWRUxfT0VTICAgICAgICAgPSAweDhDRDI7CisgICAgaW50IEdMX0ZSQU1FQlVGRkVSX0JJTkRJTkdfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OENBNjsKKyAgICBpbnQgR0xfRlJBTUVCVUZGRVJfQ09NUExFVEVfT0VTICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4Q0Q1OworICAgIGludCBHTF9GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0FUVEFDSE1FTlRfT0VTICAgICAgICAgICAgPSAweDhDRDY7CisgICAgaW50IEdMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfRElNRU5TSU9OU19PRVMgICAgICAgICAgICA9IDB4OENEOTsKKyAgICBpbnQgR0xfRlJBTUVCVUZGRVJfSU5DT01QTEVURV9EUkFXX0JVRkZFUl9PRVMgICAgICAgICAgID0gMHg4Q0RCOworICAgIGludCBHTF9GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0ZPUk1BVFNfT0VTICAgICAgICAgICAgICAgPSAweDhDREE7CisgICAgaW50IEdMX0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfTUlTU0lOR19BVFRBQ0hNRU5UX09FUyAgICA9IDB4OENENzsKKyAgICBpbnQgR0xfRlJBTUVCVUZGRVJfSU5DT01QTEVURV9SRUFEX0JVRkZFUl9PRVMgICAgICAgICAgID0gMHg4Q0RDOworICAgIGludCBHTF9GUkFNRUJVRkZFUl9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhENDA7CisgICAgaW50IEdMX0ZSQU1FQlVGRkVSX1VOU1VQUE9SVEVEX09FUyAgICAgICAgICAgICAgICAgICAgICA9IDB4OENERDsKKyAgICBpbnQgR0xfRlVOQ19BREQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MDA2OworICAgIGludCBHTF9GVU5DX1JFVkVSU0VfU1VCVFJBQ1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwMEI7CisgICAgaW50IEdMX0ZVTkNfU1VCVFJBQ1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODAwQTsKKyAgICBpbnQgR0xfSU5DUl9XUkFQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTA3OworICAgIGludCBHTF9JTlZBTElEX0ZSQU1FQlVGRkVSX09QRVJBVElPTl9PRVMgICAgICAgICAgICAgICAgPSAweDA1MDY7CisgICAgaW50IEdMX01BWF9DT0xPUl9BVFRBQ0hNRU5UU19PRVMgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OENERjsKKyAgICBpbnQgR0xfTUFYX0NVQkVfTUFQX1RFWFRVUkVfU0laRSAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTFDOworICAgIGludCBHTF9NQVhfUkVOREVSQlVGRkVSX1NJWkVfT0VTICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg0RTg7CisgICAgaW50IEdMX01JUlJPUkVEX1JFUEVBVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODM3MDsKKyAgICBpbnQgR0xfTk9STUFMX01BUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTExOworICAgIGludCBHTF9SRUZMRUNUSU9OX01BUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg1MTI7CisgICAgaW50IEdMX1JFTkRFUkJVRkZFUl9BTFBIQV9TSVpFX09FUyAgICAgICAgICAgICAgICAgICAgICA9IDB4OEQ1MzsKKyAgICBpbnQgR0xfUkVOREVSQlVGRkVSX0JJTkRJTkdfT0VTICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4Q0E3OworICAgIGludCBHTF9SRU5ERVJCVUZGRVJfQkxVRV9TSVpFX09FUyAgICAgICAgICAgICAgICAgICAgICAgPSAweDhENTI7CisgICAgaW50IEdMX1JFTkRFUkJVRkZFUl9ERVBUSF9TSVpFX09FUyAgICAgICAgICAgICAgICAgICAgICA9IDB4OEQ1NDsKKyAgICBpbnQgR0xfUkVOREVSQlVGRkVSX0dSRUVOX1NJWkVfT0VTICAgICAgICAgICAgICAgICAgICAgID0gMHg4RDUxOworICAgIGludCBHTF9SRU5ERVJCVUZGRVJfSEVJR0hUX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhENDM7CisgICAgaW50IEdMX1JFTkRFUkJVRkZFUl9JTlRFUk5BTF9GT1JNQVRfT0VTICAgICAgICAgICAgICAgICA9IDB4OEQ0NDsKKyAgICBpbnQgR0xfUkVOREVSQlVGRkVSX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4RDQxOworICAgIGludCBHTF9SRU5ERVJCVUZGRVJfUkVEX1NJWkVfT0VTICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhENTA7CisgICAgaW50IEdMX1JFTkRFUkJVRkZFUl9TVEVOQ0lMX1NJWkVfT0VTICAgICAgICAgICAgICAgICAgICA9IDB4OEQ1NTsKKyAgICBpbnQgR0xfUkVOREVSQlVGRkVSX1dJRFRIX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4RDQyOworICAgIGludCBHTF9SR0I1X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwNTc7CisgICAgaW50IEdMX1JHQjU2NV9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OEQ2MjsKKyAgICBpbnQgR0xfUkdCOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MDUxOworICAgIGludCBHTF9SR0JBNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwNTY7CisgICAgaW50IEdMX1JHQkE4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODA1ODsKKyAgICBpbnQgR0xfU1RFTkNJTF9BVFRBQ0hNRU5UX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4RDIwOworICAgIGludCBHTF9TVEVOQ0lMX0lOREVYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDE5MDE7CisgICAgaW50IEdMX1NURU5DSUxfSU5ERVgxX09FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4OEQ0NjsKKyAgICBpbnQgR0xfU1RFTkNJTF9JTkRFWDRfT0VTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4RDQ3OworICAgIGludCBHTF9TVEVOQ0lMX0lOREVYOF9PRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhENDg7CisgICAgaW50IEdMX1NUUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IC0xOworICAgIGludCBHTF9URVhUVVJFX0JJTkRJTkdfQ1VCRV9NQVAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg1MTQ7CisgICAgaW50IEdMX1RFWFRVUkVfQ1VCRV9NQVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODUxMzsKKyAgICBpbnQgR0xfVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9YICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTE2OworICAgIGludCBHTF9URVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1kgICAgICAgICAgICAgICAgICAgICAgPSAweDg1MTg7CisgICAgaW50IEdMX1RFWFRVUkVfQ1VCRV9NQVBfTkVHQVRJVkVfWiAgICAgICAgICAgICAgICAgICAgICA9IDB4ODUxQTsKKyAgICBpbnQgR0xfVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTE1OworICAgIGludCBHTF9URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1kgICAgICAgICAgICAgICAgICAgICAgPSAweDg1MTc7CisgICAgaW50IEdMX1RFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWiAgICAgICAgICAgICAgICAgICAgICA9IDB4ODUxOTsKKyAgICBpbnQgR0xfVEVYVFVSRV9HRU5fTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgyNTAwOworICAgIGludCBHTF9URVhUVVJFX0dFTl9TVFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDhENjA7CisKZGlmZiAtLWdpdCBhL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9HTDExSGVhZGVyLmphdmEtaWYgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvR0wxMUhlYWRlci5qYXZhLWlmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwZTVhNmIKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvR0wxMUhlYWRlci5qYXZhLWlmCkBAIC0wLDAgKzEsMTQ1IEBACisqKgorKiogQ29weXJpZ2h0IDIwMDYsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworLy8gVGhpcyBzb3VyY2UgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZAorCitwYWNrYWdlIGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzOworCitwdWJsaWMgaW50ZXJmYWNlIEdMMTEgZXh0ZW5kcyBHTDEwIHsKKyAgICBpbnQgR0xfQUNUSVZFX1RFWFRVUkUgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEUwOworICAgIGludCBHTF9BRERfU0lHTkVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg1NzQ7CisgICAgaW50IEdMX0FMUEhBX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEQxQzsKKyAgICBpbnQgR0xfQUxQSEFfVEVTVF9GVU5DICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQkMxOworICAgIGludCBHTF9BTFBIQV9URVNUX1JFRiAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCQzI7CisgICAgaW50IEdMX0FSUkFZX0JVRkZFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODg5MjsKKyAgICBpbnQgR0xfQVJSQVlfQlVGRkVSX0JJTkRJTkcgICAgICAgICAgICAgICAgICAgID0gMHg4ODk0OworICAgIGludCBHTF9CTEVORF9EU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCRTA7CisgICAgaW50IEdMX0JMRU5EX1NSQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEJFMTsKKyAgICBpbnQgR0xfQlVGRkVSX0FDQ0VTUyAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4OEJCOworICAgIGludCBHTF9CVUZGRVJfU0laRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg3NjQ7CisgICAgaW50IEdMX0JVRkZFUl9VU0FHRSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODc2NTsKKyAgICBpbnQgR0xfQ0xJRU5UX0FDVElWRV9URVhUVVJFICAgICAgICAgICAgICAgICAgID0gMHg4NEUxOworICAgIGludCBHTF9DTElQX1BMQU5FMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDMwMDA7CisgICAgaW50IEdMX0NMSVBfUExBTkUxICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MzAwMTsKKyAgICBpbnQgR0xfQ0xJUF9QTEFORTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgzMDAyOworICAgIGludCBHTF9DTElQX1BMQU5FMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDMwMDM7CisgICAgaW50IEdMX0NMSVBfUExBTkU0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MzAwNDsKKyAgICBpbnQgR0xfQ0xJUF9QTEFORTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgzMDA1OworICAgIGludCBHTF9DT0xPUl9BUlJBWV9CVUZGRVJfQklORElORyAgICAgICAgICAgICAgPSAweDg4OTg7CisgICAgaW50IEdMX0NPTE9SX0FSUkFZX1BPSU5URVIgICAgICAgICAgICAgICAgICAgICA9IDB4ODA5MDsKKyAgICBpbnQgR0xfQ09MT1JfQVJSQVlfU0laRSAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MDgxOworICAgIGludCBHTF9DT0xPUl9BUlJBWV9TVFJJREUgICAgICAgICAgICAgICAgICAgICAgPSAweDgwODM7CisgICAgaW50IEdMX0NPTE9SX0FSUkFZX1RZUEUgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODA4MjsKKyAgICBpbnQgR0xfQ09MT1JfQ0xFQVJfVkFMVUUgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQzIyOworICAgIGludCBHTF9DT0xPUl9XUklURU1BU0sgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBDMjM7CisgICAgaW50IEdMX0NPTUJJTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODU3MDsKKyAgICBpbnQgR0xfQ09NQklORV9BTFBIQSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTcyOworICAgIGludCBHTF9DT01CSU5FX1JHQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg1NzE7CisgICAgaW50IEdMX0NPTlNUQU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODU3NjsKKyAgICBpbnQgR0xfQ09PUkRfUkVQTEFDRV9PRVMgICAgICAgICAgICAgICAgICAgICAgID0gMHg4ODYyOworICAgIGludCBHTF9DVUxMX0ZBQ0VfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCNDU7CisgICAgaW50IEdMX0NVUlJFTlRfQ09MT1IgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEIwMDsKKyAgICBpbnQgR0xfQ1VSUkVOVF9OT1JNQUwgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjAyOworICAgIGludCBHTF9DVVJSRU5UX1RFWFRVUkVfQ09PUkRTICAgICAgICAgICAgICAgICAgPSAweDBCMDM7CisgICAgaW50IEdMX0RFUFRIX0NMRUFSX1ZBTFVFICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEI3MzsKKyAgICBpbnQgR0xfREVQVEhfRlVOQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjc0OworICAgIGludCBHTF9ERVBUSF9SQU5HRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCNzA7CisgICAgaW50IEdMX0RFUFRIX1dSSVRFTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEI3MjsKKyAgICBpbnQgR0xfRE9UM19SR0IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NkFFOworICAgIGludCBHTF9ET1QzX1JHQkEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg2QUY7CisgICAgaW50IEdMX0RZTkFNSUNfRFJBVyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODhFODsKKyAgICBpbnQgR0xfRUxFTUVOVF9BUlJBWV9CVUZGRVIgICAgICAgICAgICAgICAgICAgID0gMHg4ODkzOworICAgIGludCBHTF9FTEVNRU5UX0FSUkFZX0JVRkZFUl9CSU5ESU5HICAgICAgICAgICAgPSAweDg4OTU7CisgICAgaW50IEdMX0ZST05UX0ZBQ0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEI0NjsKKyAgICBpbnQgR0xfR0VORVJBVEVfTUlQTUFQICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MTkxOworICAgIGludCBHTF9HRU5FUkFURV9NSVBNQVBfSElOVCAgICAgICAgICAgICAgICAgICAgPSAweDgxOTI7CisgICAgaW50IEdMX0lOVEVSUE9MQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODU3NTsKKyAgICBpbnQgR0xfTElORV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjIxOworICAgIGludCBHTF9MT0dJQ19PUF9NT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCRjA7CisgICAgaW50IEdMX01BVFJJWF9NT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEJBMDsKKyAgICBpbnQgR0xfTUFYX0NMSVBfUExBTkVTICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwRDMyOworICAgIGludCBHTF9NT0RFTFZJRVdfTUFUUklYICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCQTY7CisgICAgaW50IEdMX01PREVMVklFV19NQVRSSVhfRkxPQVRfQVNfSU5UX0JJVFNfT0VTICA9IDB4ODk4RDsKKyAgICBpbnQgR0xfTU9ERUxWSUVXX1NUQUNLX0RFUFRIICAgICAgICAgICAgICAgICAgID0gMHgwQkEzOworICAgIGludCBHTF9OT1JNQUxfQVJSQVlfQlVGRkVSX0JJTkRJTkcgICAgICAgICAgICAgPSAweDg4OTc7CisgICAgaW50IEdMX05PUk1BTF9BUlJBWV9QT0lOVEVSICAgICAgICAgICAgICAgICAgICA9IDB4ODA4RjsKKyAgICBpbnQgR0xfTk9STUFMX0FSUkFZX1NUUklERSAgICAgICAgICAgICAgICAgICAgID0gMHg4MDdGOworICAgIGludCBHTF9OT1JNQUxfQVJSQVlfVFlQRSAgICAgICAgICAgICAgICAgICAgICAgPSAweDgwN0U7CisgICAgaW50IEdMX09QRVJBTkQwX0FMUEhBICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODU5ODsKKyAgICBpbnQgR0xfT1BFUkFORDBfUkdCICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTkwOworICAgIGludCBHTF9PUEVSQU5EMV9BTFBIQSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg1OTk7CisgICAgaW50IEdMX09QRVJBTkQxX1JHQiAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODU5MTsKKyAgICBpbnQgR0xfT1BFUkFORDJfQUxQSEEgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTlBOworICAgIGludCBHTF9PUEVSQU5EMl9SR0IgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg1OTI7CisgICAgaW50IEdMX1BPSU5UX0RJU1RBTkNFX0FUVEVOVUFUSU9OICAgICAgICAgICAgICA9IDB4ODEyOTsKKyAgICBpbnQgR0xfUE9JTlRfRkFERV9USFJFU0hPTERfU0laRSAgICAgICAgICAgICAgID0gMHg4MTI4OworICAgIGludCBHTF9QT0lOVF9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCMTE7CisgICAgaW50IEdMX1BPSU5UX1NJWkVfQVJSQVlfQlVGRkVSX0JJTkRJTkdfT0VTICAgICA9IDB4OEI5RjsKKyAgICBpbnQgR0xfUE9JTlRfU0laRV9BUlJBWV9PRVMgICAgICAgICAgICAgICAgICAgID0gMHg4QjlDOworICAgIGludCBHTF9QT0lOVF9TSVpFX0FSUkFZX1BPSU5URVJfT0VTICAgICAgICAgICAgPSAweDg5OEM7CisgICAgaW50IEdMX1BPSU5UX1NJWkVfQVJSQVlfU1RSSURFX09FUyAgICAgICAgICAgICA9IDB4ODk4QjsKKyAgICBpbnQgR0xfUE9JTlRfU0laRV9BUlJBWV9UWVBFX09FUyAgICAgICAgICAgICAgID0gMHg4OThBOworICAgIGludCBHTF9QT0lOVF9TSVpFX01BWCAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDgxMjc7CisgICAgaW50IEdMX1BPSU5UX1NJWkVfTUlOICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODEyNjsKKyAgICBpbnQgR0xfUE9JTlRfU1BSSVRFX09FUyAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4ODYxOworICAgIGludCBHTF9QT0xZR09OX09GRlNFVF9GQUNUT1IgICAgICAgICAgICAgICAgICAgPSAweDgwMzg7CisgICAgaW50IEdMX1BPTFlHT05fT0ZGU0VUX1VOSVRTICAgICAgICAgICAgICAgICAgICA9IDB4MkEwMDsKKyAgICBpbnQgR0xfUFJFVklPVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTc4OworICAgIGludCBHTF9QUklNQVJZX0NPTE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg1Nzc7CisgICAgaW50IEdMX1BST0pFQ1RJT05fTUFUUklYICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEJBNzsKKyAgICBpbnQgR0xfUFJPSkVDVElPTl9NQVRSSVhfRkxPQVRfQVNfSU5UX0JJVFNfT0VTID0gMHg4OThFOworICAgIGludCBHTF9QUk9KRUNUSU9OX1NUQUNLX0RFUFRIICAgICAgICAgICAgICAgICAgPSAweDBCQTQ7CisgICAgaW50IEdMX1JHQl9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODU3MzsKKyAgICBpbnQgR0xfU0FNUExFX0JVRkZFUlMgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MEE4OworICAgIGludCBHTF9TQU1QTEVfQ09WRVJBR0VfSU5WRVJUICAgICAgICAgICAgICAgICAgPSAweDgwQUI7CisgICAgaW50IEdMX1NBTVBMRV9DT1ZFUkFHRV9WQUxVRSAgICAgICAgICAgICAgICAgICA9IDB4ODBBQTsKKyAgICBpbnQgR0xfU0FNUExFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MEE5OworICAgIGludCBHTF9TQ0lTU09SX0JPWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBDMTA7CisgICAgaW50IEdMX1NIQURFX01PREVMICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEI1NDsKKyAgICBpbnQgR0xfU1JDMF9BTFBIQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTg4OworICAgIGludCBHTF9TUkMwX1JHQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg1ODA7CisgICAgaW50IEdMX1NSQzFfQUxQSEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODU4OTsKKyAgICBpbnQgR0xfU1JDMV9SR0IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NTgxOworICAgIGludCBHTF9TUkMyX0FMUEhBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg1OEE7CisgICAgaW50IEdMX1NSQzJfUkdCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODU4MjsKKyAgICBpbnQgR0xfU1RBVElDX0RSQVcgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4OEU0OworICAgIGludCBHTF9TVEVOQ0lMX0NMRUFSX1ZBTFVFICAgICAgICAgICAgICAgICAgICAgPSAweDBCOTE7CisgICAgaW50IEdMX1NURU5DSUxfRkFJTCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEI5NDsKKyAgICBpbnQgR0xfU1RFTkNJTF9GVU5DICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjkyOworICAgIGludCBHTF9TVEVOQ0lMX1BBU1NfREVQVEhfRkFJTCAgICAgICAgICAgICAgICAgPSAweDBCOTU7CisgICAgaW50IEdMX1NURU5DSUxfUEFTU19ERVBUSF9QQVNTICAgICAgICAgICAgICAgICA9IDB4MEI5NjsKKyAgICBpbnQgR0xfU1RFTkNJTF9SRUYgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQjk3OworICAgIGludCBHTF9TVEVOQ0lMX1ZBTFVFX01BU0sgICAgICAgICAgICAgICAgICAgICAgPSAweDBCOTM7CisgICAgaW50IEdMX1NURU5DSUxfV1JJVEVNQVNLICAgICAgICAgICAgICAgICAgICAgICA9IDB4MEI5ODsKKyAgICBpbnQgR0xfU1VCVFJBQ1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg4NEU3OworICAgIGludCBHTF9URVhUVVJFX0JJTkRJTkdfMkQgICAgICAgICAgICAgICAgICAgICAgPSAweDgwNjk7CisgICAgaW50IEdMX1RFWFRVUkVfQ09PUkRfQVJSQVlfQlVGRkVSX0JJTkRJTkcgICAgICA9IDB4ODg5QTsKKyAgICBpbnQgR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9QT0lOVEVSICAgICAgICAgICAgID0gMHg4MDkyOworICAgIGludCBHTF9URVhUVVJFX0NPT1JEX0FSUkFZX1NJWkUgICAgICAgICAgICAgICAgPSAweDgwODg7CisgICAgaW50IEdMX1RFWFRVUkVfQ09PUkRfQVJSQVlfU1RSSURFICAgICAgICAgICAgICA9IDB4ODA4QTsKKyAgICBpbnQgR0xfVEVYVFVSRV9DT09SRF9BUlJBWV9UWVBFICAgICAgICAgICAgICAgID0gMHg4MDg5OworICAgIGludCBHTF9URVhUVVJFX01BVFJJWCAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDBCQTg7CisgICAgaW50IEdMX1RFWFRVUkVfTUFUUklYX0ZMT0FUX0FTX0lOVF9CSVRTX09FUyAgICA9IDB4ODk4RjsKKyAgICBpbnQgR0xfVEVYVFVSRV9TVEFDS19ERVBUSCAgICAgICAgICAgICAgICAgICAgID0gMHgwQkE1OworICAgIGludCBHTF9WRVJURVhfQVJSQVlfQlVGRkVSX0JJTkRJTkcgICAgICAgICAgICAgPSAweDg4OTY7CisgICAgaW50IEdMX1ZFUlRFWF9BUlJBWV9QT0lOVEVSICAgICAgICAgICAgICAgICAgICA9IDB4ODA4RTsKKyAgICBpbnQgR0xfVkVSVEVYX0FSUkFZX1NJWkUgICAgICAgICAgICAgICAgICAgICAgID0gMHg4MDdBOworICAgIGludCBHTF9WRVJURVhfQVJSQVlfU1RSSURFICAgICAgICAgICAgICAgICAgICAgPSAweDgwN0M7CisgICAgaW50IEdMX1ZFUlRFWF9BUlJBWV9UWVBFICAgICAgICAgICAgICAgICAgICAgICA9IDB4ODA3QjsKKyAgICBpbnQgR0xfVklFV1BPUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwQkEyOworICAgIGludCBHTF9XUklURV9PTkxZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDg4Qjk7CisKKyAgICB2b2lkIGdsR2V0UG9pbnRlcnYoaW50IHBuYW1lLCBqYXZhLm5pby5CdWZmZXJbXSBwYXJhbXMpOwpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL0dMMTFJbXBsSGVhZGVyLmphdmEtaW1wbCBiL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9HTDExSW1wbEhlYWRlci5qYXZhLWltcGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTAxYmU2NQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9HTDExSW1wbEhlYWRlci5qYXZhLWltcGwKQEAgLTAsMCArMSwzMCBAQAorLy8gQ29weXJpZ2h0IDIwMDYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisvLyBBbGwgUmlnaHRzIFJlc2VydmVkLgorCisvLyBUaGlzIHNvdXJjZSBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkCisKK3BhY2thZ2UgY29tLmdvb2dsZS5hbmRyb2lkLmdsZXNfam5pOworCitpbXBvcnQgamF2YS5uaW8uQnVmZmVyOworaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzLkdMMTE7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CisKK3B1YmxpYyBjbGFzcyBHTDExSW1wbCBpbXBsZW1lbnRzIEdMMTEgeworCisgICAgLy8gUHJpdmF0ZSBhY2Nlc3NvcnMgZm9yIG5hdGl2ZSBjb2RlCisKKyAgICBuYXRpdmUgcHJpdmF0ZSBzdGF0aWMgdm9pZCBfbmF0aXZlQ2xhc3NJbml0KCk7CisgICAgc3RhdGljIHsKKwlfbmF0aXZlQ2xhc3NJbml0KCk7CisgICAgfQorCisgICAgQnVmZmVyIF9jb2xvclBvaW50ZXIgPSBudWxsOworICAgIEJ1ZmZlciBfbm9ybWFsUG9pbnRlciA9IG51bGw7CisgICAgQnVmZmVyIF90ZXhDb29yZFBvaW50ZXIgPSBudWxsOworICAgIEJ1ZmZlciBfdmVydGV4UG9pbnRlciA9IG51bGw7CisKKyAgICBwdWJsaWMgR0wxMUltcGwoKSB7CisgICAgfQorCisKZGlmZiAtLWdpdCBhL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9HTENIZWFkZXIuY3BwIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL0dMQ0hlYWRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQ5NTY4NgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9HTENIZWFkZXIuY3BwCkBAIC0wLDAgKzEsMTI5IEBACisqKgorKiogQ29weXJpZ2h0IDIwMDYsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworLy8gVGhpcyBzb3VyY2UgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZAorCisjaW5jbHVkZSA8YW5kcm9pZF9ydW50aW1lL0FuZHJvaWRSdW50aW1lLmg+CisjaW5jbHVkZSA8dXRpbHMvbWlzYy5oPgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8R0xFUy9nbC5oPgorCisjaW5jbHVkZSA8cHJpdmF0ZS9vcGVuZ2xlcy9nbF9jb250ZXh0Lmg+CisKKyNkZWZpbmUgX05VTV9DT01QUkVTU0VEX1RFWFRVUkVfRk9STUFUUyBcCisgICAgICAgICg6OmFuZHJvaWQ6Ok9HTEVTX05VTV9DT01QUkVTU0VEX1RFWFRVUkVfRk9STUFUUykKKworc3RhdGljIGludCBpbml0aWFsaXplZCA9IDA7CisKK3N0YXRpYyBqY2xhc3MgbmlvQWNjZXNzQ2xhc3M7CitzdGF0aWMgamNsYXNzIGJ1ZmZlckNsYXNzOworc3RhdGljIGpjbGFzcyBPT01FQ2xhc3M7CitzdGF0aWMgamNsYXNzIFVPRUNsYXNzOworc3RhdGljIGpjbGFzcyBJQUVDbGFzczsKK3N0YXRpYyBqY2xhc3MgQUlPT0JFQ2xhc3M7CitzdGF0aWMgam1ldGhvZElEIGdldEJhc2VQb2ludGVySUQ7CitzdGF0aWMgam1ldGhvZElEIGdldEJhc2VBcnJheUlEOworc3RhdGljIGptZXRob2RJRCBnZXRCYXNlQXJyYXlPZmZzZXRJRDsKK3N0YXRpYyBqZmllbGRJRCBwb3NpdGlvbklEOworc3RhdGljIGpmaWVsZElEIGxpbWl0SUQ7CitzdGF0aWMgamZpZWxkSUQgZWxlbWVudFNpemVTaGlmdElEOworCisvKiBDYWNoZSBtZXRob2QgSURzIGVhY2ggdGltZSB0aGUgY2xhc3MgaXMgbG9hZGVkLiAqLworCit2b2lkCituYXRpdmVDbGFzc0luaXRCdWZmZXIoSk5JRW52ICpfZW52KQoreworICAgIGpjbGFzcyBuaW9BY2Nlc3NDbGFzc0xvY2FsID0gX2Vudi0+RmluZENsYXNzKCJqYXZhL25pby9OSU9BY2Nlc3MiKTsKKyAgICBuaW9BY2Nlc3NDbGFzcyA9IChqY2xhc3MpIF9lbnYtPk5ld0dsb2JhbFJlZihuaW9BY2Nlc3NDbGFzc0xvY2FsKTsKKworICAgIGpjbGFzcyBidWZmZXJDbGFzc0xvY2FsID0gX2Vudi0+RmluZENsYXNzKCJqYXZhL25pby9CdWZmZXIiKTsKKyAgICBidWZmZXJDbGFzcyA9IChqY2xhc3MpIF9lbnYtPk5ld0dsb2JhbFJlZihidWZmZXJDbGFzc0xvY2FsKTsKKworICAgIGdldEJhc2VQb2ludGVySUQgPSBfZW52LT5HZXRTdGF0aWNNZXRob2RJRChuaW9BY2Nlc3NDbGFzcywKKyAgICAgICAgICAgICJnZXRCYXNlUG9pbnRlciIsICIoTGphdmEvbmlvL0J1ZmZlcjspSiIpOworICAgIGdldEJhc2VBcnJheUlEID0gX2Vudi0+R2V0U3RhdGljTWV0aG9kSUQobmlvQWNjZXNzQ2xhc3MsCisgICAgICAgICAgICAiZ2V0QmFzZUFycmF5IiwgIihMamF2YS9uaW8vQnVmZmVyOylMamF2YS9sYW5nL09iamVjdDsiKTsKKyAgICBnZXRCYXNlQXJyYXlPZmZzZXRJRCA9IF9lbnYtPkdldFN0YXRpY01ldGhvZElEKG5pb0FjY2Vzc0NsYXNzLAorICAgICAgICAgICAgImdldEJhc2VBcnJheU9mZnNldCIsICIoTGphdmEvbmlvL0J1ZmZlcjspSSIpOworCisgICAgcG9zaXRpb25JRCA9IF9lbnYtPkdldEZpZWxkSUQoYnVmZmVyQ2xhc3MsICJwb3NpdGlvbiIsICJJIik7CisgICAgbGltaXRJRCA9IF9lbnYtPkdldEZpZWxkSUQoYnVmZmVyQ2xhc3MsICJsaW1pdCIsICJJIik7CisgICAgZWxlbWVudFNpemVTaGlmdElEID0KKyAgICAgICAgX2Vudi0+R2V0RmllbGRJRChidWZmZXJDbGFzcywgIl9lbGVtZW50U2l6ZVNoaWZ0IiwgIkkiKTsKK30KKworCitzdGF0aWMgdm9pZAorbmF0aXZlQ2xhc3NJbml0KEpOSUVudiAqX2VudiwgamNsYXNzIGdsSW1wbENsYXNzKQoreworICAgIG5hdGl2ZUNsYXNzSW5pdEJ1ZmZlcihfZW52KTsKKworICAgIGpjbGFzcyBJQUVDbGFzc0xvY2FsID0KKyAgICAgICAgX2Vudi0+RmluZENsYXNzKCJqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIik7CisgICAgamNsYXNzIE9PTUVDbGFzc0xvY2FsID0KKyAgICAgICAgIF9lbnYtPkZpbmRDbGFzcygiamF2YS9sYW5nL091dE9mTWVtb3J5RXJyb3IiKTsKKyAgICBqY2xhc3MgVU9FQ2xhc3NMb2NhbCA9CisgICAgICAgICBfZW52LT5GaW5kQ2xhc3MoImphdmEvbGFuZy9VbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiIpOworICAgIGpjbGFzcyBBSU9PQkVDbGFzc0xvY2FsID0KKyAgICAgICAgIF9lbnYtPkZpbmRDbGFzcygiamF2YS9sYW5nL0FycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiIpOworCisgICAgSUFFQ2xhc3MgPSAoamNsYXNzKSBfZW52LT5OZXdHbG9iYWxSZWYoSUFFQ2xhc3NMb2NhbCk7CisgICAgT09NRUNsYXNzID0gKGpjbGFzcykgX2Vudi0+TmV3R2xvYmFsUmVmKE9PTUVDbGFzc0xvY2FsKTsKKyAgICBVT0VDbGFzcyA9IChqY2xhc3MpIF9lbnYtPk5ld0dsb2JhbFJlZihVT0VDbGFzc0xvY2FsKTsKKyAgICBBSU9PQkVDbGFzcyA9IChqY2xhc3MpIF9lbnYtPk5ld0dsb2JhbFJlZihBSU9PQkVDbGFzc0xvY2FsKTsKK30KKworc3RhdGljIHZvaWQgKgorZ2V0UG9pbnRlcihKTklFbnYgKl9lbnYsIGpvYmplY3QgYnVmZmVyLCBqYXJyYXkgKmFycmF5LCBqaW50ICpyZW1haW5pbmcpCit7CisgICAgamludCBwb3NpdGlvbjsKKyAgICBqaW50IGxpbWl0OworICAgIGppbnQgZWxlbWVudFNpemVTaGlmdDsKKyAgICBqbG9uZyBwb2ludGVyOworICAgIGppbnQgb2Zmc2V0OworICAgIHZvaWQgKmRhdGE7CisKKyAgICBwb3NpdGlvbiA9IF9lbnYtPkdldEludEZpZWxkKGJ1ZmZlciwgcG9zaXRpb25JRCk7CisgICAgbGltaXQgPSBfZW52LT5HZXRJbnRGaWVsZChidWZmZXIsIGxpbWl0SUQpOworICAgIGVsZW1lbnRTaXplU2hpZnQgPSBfZW52LT5HZXRJbnRGaWVsZChidWZmZXIsIGVsZW1lbnRTaXplU2hpZnRJRCk7CisgICAgKnJlbWFpbmluZyA9IChsaW1pdCAtIHBvc2l0aW9uKSA8PCBlbGVtZW50U2l6ZVNoaWZ0OworICAgIHBvaW50ZXIgPSBfZW52LT5DYWxsU3RhdGljTG9uZ01ldGhvZChuaW9BY2Nlc3NDbGFzcywKKyAgICAgICAgICAgIGdldEJhc2VQb2ludGVySUQsIGJ1ZmZlcik7CisgICAgaWYgKHBvaW50ZXIgIT0gMEwpIHsKKyAgICAgICAgKmFycmF5ID0gTlVMTDsKKyAgICAgICAgcmV0dXJuICh2b2lkICopIChqaW50KSBwb2ludGVyOworICAgIH0KKyAgICAKKyAgICAqYXJyYXkgPSAoamFycmF5KSBfZW52LT5DYWxsU3RhdGljT2JqZWN0TWV0aG9kKG5pb0FjY2Vzc0NsYXNzLAorICAgICAgICAgICAgZ2V0QmFzZUFycmF5SUQsIGJ1ZmZlcik7CisgICAgb2Zmc2V0ID0gX2Vudi0+Q2FsbFN0YXRpY0ludE1ldGhvZChuaW9BY2Nlc3NDbGFzcywKKyAgICAgICAgICAgIGdldEJhc2VBcnJheU9mZnNldElELCBidWZmZXIpOworICAgIGRhdGEgPSBfZW52LT5HZXRQcmltaXRpdmVBcnJheUNyaXRpY2FsKCphcnJheSwgKGpib29sZWFuICopIDApOworICAgIAorICAgIHJldHVybiAodm9pZCAqKSAoKGNoYXIgKikgZGF0YSArIG9mZnNldCk7Cit9CisKKworc3RhdGljIHZvaWQKK3JlbGVhc2VQb2ludGVyKEpOSUVudiAqX2VudiwgamFycmF5IGFycmF5LCB2b2lkICpkYXRhLCBqYm9vbGVhbiBjb21taXQpCit7CisgICAgX2Vudi0+UmVsZWFzZVByaW1pdGl2ZUFycmF5Q3JpdGljYWwoYXJyYXksIGRhdGEsCisJCQkJCSAgIGNvbW1pdCA/IDAgOiBKTklfQUJPUlQpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCmRpZmYgLS1naXQgYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvR0xIZWFkZXIuamF2YS1pZiBiL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9HTEhlYWRlci5qYXZhLWlmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiNzhmM2QKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvR0xIZWFkZXIuamF2YS1pZgpAQCAtMCwwICsxLDIyIEBACisvKiAvL2RldmljZS9qYXZhL2FuZHJvaWQvamF2YXgvbWljcm9lZGl0aW9uL2tocm9ub3Mvb3BlbmdsZXMvR0wuamF2YQorKioKKyoqIENvcHlyaWdodCAyMDA2LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IAorKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiAKKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCAKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKK3BhY2thZ2UgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXM7CisKK3B1YmxpYyBpbnRlcmZhY2UgR0wgeworfQorCmRpZmYgLS1naXQgYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvR0xJbXBsSGVhZGVyLmphdmEtaW1wbCBiL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9HTEltcGxIZWFkZXIuamF2YS1pbXBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiM2E0MWMKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvR0xJbXBsSGVhZGVyLmphdmEtaW1wbApAQCAtMCwwICsxLDQ4IEBACisqKgorKiogQ29weXJpZ2h0IDIwMDYsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIAorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworLy8gVGhpcyBzb3VyY2UgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZAorCitwYWNrYWdlIGNvbS5nb29nbGUuYW5kcm9pZC5nbGVzX2puaTsKKworaW1wb3J0IGphdmEubmlvLkJ1ZmZlcjsKK2ltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5vcGVuZ2xlcy5HTDEwOworaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzLkdMMTBFeHQ7CitpbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmtocm9ub3Mub3BlbmdsZXMuR0wxMTsKK2ltcG9ydCBqYXZheC5taWNyb2VkaXRpb24ua2hyb25vcy5vcGVuZ2xlcy5HTDExRXh0OworaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5raHJvbm9zLm9wZW5nbGVzLkdMMTFFeHRlbnNpb25QYWNrOworCitwdWJsaWMgY2xhc3MgR0xJbXBsIGltcGxlbWVudHMgR0wxMCwgR0wxMEV4dCwgR0wxMSwgR0wxMUV4dCwgR0wxMUV4dGVuc2lvblBhY2sgeworCisgICAgLy8gUHJpdmF0ZSBhY2Nlc3NvcnMgZm9yIG5hdGl2ZSBjb2RlCisKKyAgICBuYXRpdmUgcHJpdmF0ZSBzdGF0aWMgdm9pZCBfbmF0aXZlQ2xhc3NJbml0KCk7CisgICAgc3RhdGljIHsKKwlfbmF0aXZlQ2xhc3NJbml0KCk7CisgICAgfQorCisgICAgQnVmZmVyIF9jb2xvclBvaW50ZXIgPSBudWxsOworICAgIEJ1ZmZlciBfbm9ybWFsUG9pbnRlciA9IG51bGw7CisgICAgQnVmZmVyIF90ZXhDb29yZFBvaW50ZXIgPSBudWxsOworICAgIEJ1ZmZlciBfdmVydGV4UG9pbnRlciA9IG51bGw7CisKKyAgICBwdWJsaWMgR0xJbXBsKCkgeworICAgIH0KKworICAgICBwdWJsaWMgdm9pZCBnbEdldFBvaW50ZXJ2KGludCBwbmFtZSwgamF2YS5uaW8uQnVmZmVyW10gcGFyYW1zKSB7CisgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImdsR2V0UG9pbnRlcnYiKTsKKyAgICAgfQorCmRpZmYgLS1naXQgYS9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvZ2xHZXRTdHJpbmcuY3BwIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2dsR2V0U3RyaW5nLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmUxMjk3Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2dsR2V0U3RyaW5nLmNwcApAQCAtMCwwICsxLDEwIEBACisjaW5jbHVkZSA8c3RyaW5nLmg+DQorDQorLyogY29uc3QgR0x1Ynl0ZSAqIGdsR2V0U3RyaW5nICggR0xlbnVtIG5hbWUgKSAqLw0KK2pzdHJpbmcNCithbmRyb2lkX2dsR2V0U3RyaW5nDQorICAoSk5JRW52ICpfZW52LCBqb2JqZWN0IF90aGlzLCBqaW50IG5hbWUpIHsNCisgICAgY29uc3QgY2hhciAqIGNoYXJzID0gKGNvbnN0IGNoYXIgKilnbEdldFN0cmluZygoR0xlbnVtKW5hbWUpOw0KKyAgICBqc3RyaW5nIG91dHB1dCA9IF9lbnYtPk5ld1N0cmluZ1VURihjaGFycyk7DQorICAgIHJldHVybiBvdXRwdXQ7DQorfQ0KZGlmZiAtLWdpdCBhL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9nbEdldFN0cmluZy5qYXZhLTEwLWlmIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2dsR2V0U3RyaW5nLmphdmEtMTAtaWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk4ZmFiYwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9nbEdldFN0cmluZy5qYXZhLTEwLWlmCkBAIC0wLDAgKzEsNCBAQAorICAgIHB1YmxpYyBTdHJpbmcgZ2xHZXRTdHJpbmcoDQorICAgICAgICBpbnQgbmFtZQ0KKyAgICApOw0KKw0KZGlmZiAtLWdpdCBhL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9nbEdldFN0cmluZy5qYXZhLWlmIGIvb3BlbmdsL3Rvb2xzL2dsZ2VuL3N0dWJzL2dsR2V0U3RyaW5nLmphdmEtaWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk4ZmFiYwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9nbEdldFN0cmluZy5qYXZhLWlmCkBAIC0wLDAgKzEsNCBAQAorICAgIHB1YmxpYyBTdHJpbmcgZ2xHZXRTdHJpbmcoDQorICAgICAgICBpbnQgbmFtZQ0KKyAgICApOw0KKw0KZGlmZiAtLWdpdCBhL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9nbEdldFN0cmluZy5qYXZhLWltcGwgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvZ2xHZXRTdHJpbmcuamF2YS1pbXBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjNzg4MWMKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvZ2xHZXRTdHJpbmcuamF2YS1pbXBsCkBAIC0wLDAgKzEsMTYgQEAKKyAgICAvLyBDIGZ1bmN0aW9uIGNvbnN0IEdMdWJ5dGUgKiBnbEdldFN0cmluZyAoIEdMZW51bSBuYW1lICkNCisNCisgICAgcHVibGljIG5hdGl2ZSBTdHJpbmcgX2dsR2V0U3RyaW5nKA0KKyAgICAgICAgaW50IG5hbWUNCisgICAgKTsNCisNCisgICAgcHVibGljIFN0cmluZyBnbEdldFN0cmluZygNCisgICAgICAgIGludCBuYW1lDQorICAgICkgew0KKyAgICAgICAgU3RyaW5nIHJldHVyblZhbHVlOw0KKyAgICAgICAgcmV0dXJuVmFsdWUgPSBfZ2xHZXRTdHJpbmcoDQorICAgICAgICAgICAgbmFtZQ0KKyAgICAgICAgKTsNCisgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsNCisgICAgfQ0KKw0KZGlmZiAtLWdpdCBhL29wZW5nbC90b29scy9nbGdlbi9zdHVicy9nbEdldFN0cmluZy5uYXRpdmVSZWcgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvZ2xHZXRTdHJpbmcubmF0aXZlUmVnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2NDE4N2MKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuZ2wvdG9vbHMvZ2xnZW4vc3R1YnMvZ2xHZXRTdHJpbmcubmF0aXZlUmVnCkBAIC0wLDAgKzEgQEAKK3siX2dsR2V0U3RyaW5nIiwgIihJKUxqYXZhL2xhbmcvU3RyaW5nOyIsICh2b2lkICopIGFuZHJvaWRfZ2xHZXRTdHJpbmcgfSwNCg==